[feat]开发文章分类和文章

This commit is contained in:
wangqx 2025-08-14 15:54:17 +08:00
parent cc68b15b40
commit 7429692522
21 changed files with 938 additions and 86 deletions

View File

@ -185,6 +185,10 @@ tenant:
- sys_commission_rate_range
- oms_red_packet
- oms_red_packet_receive
- commission_template
- commission_rate_range
- cont_article
- cont_article_category

View File

@ -0,0 +1,79 @@
package com.wzj.soopin.content.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.content.convert.ArticleCategoryConvert;
import com.wzj.soopin.content.convert.ArticleConvert;
import com.wzj.soopin.content.domain.bo.ArticleBO;
import com.wzj.soopin.content.domain.bo.ArticleCategoryBO;
import com.wzj.soopin.content.domain.po.Article;
import com.wzj.soopin.content.domain.po.ArticleCategory;
import com.wzj.soopin.content.domain.vo.ArticleCategoryVO;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import com.wzj.soopin.content.service.IArticleCategoryService;
import com.wzj.soopin.content.service.IArticleService;
import com.wzj.soopin.member.domain.bo.TenantForbiddenBO;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 用户封禁
*/
@Tag(name = "文章分类管理")
@RestController
@RequestMapping("/content/article/category")
@RequiredArgsConstructor
public class ArticleCategoryController {
private final IArticleCategoryService service;
private final ArticleCategoryConvert convert;
@Tag(name = "查询列表")
@PostMapping("/page")
public R<IPage<ArticleCategoryVO>> page(@RequestBody ArticleCategoryBO bo, @RequestBody Page page) {
Page<ArticleCategory> pages = service.page(page, bo.toWrapper());
return R.ok(convert.toVO(pages));
}
@Tag(name = "查询列表")
@PostMapping("/list")
public R< List<ArticleCategoryVO>> list(@RequestBody ArticleCategoryBO bo, @RequestBody Page page) {
List<ArticleCategory> articleList = service.list( bo.toWrapper());
return R.ok(convert.toVO(articleList));
}
@Tag(name = "新增")
@Log(title = "新增 ", businessType = BusinessType.INSERT)
@PostMapping("/add")
public R add(@RequestBody ArticleCategoryBO bo) {
return R.ok(service.save(convert.toPo(bo)));
}
@Tag(name = "详情")
@GetMapping(value = "/{id}")
public R<ArticleCategoryVO> getInfo(@PathVariable("id") Long id) {
return R.ok(convert.toVO(service.getById(id)));
}
@Tag(name = ("处理"))
@Log(title = "修改", businessType = BusinessType.UPDATE)
@PostMapping("/update")
public R update(@RequestBody ArticleCategoryBO bo) {
service.save(convert.toPo(bo));
return R.ok();
}
@Tag(name = "删除")
@Log(title = "删除", businessType = BusinessType.DELETE)
@DeleteMapping("/{id}")
public R<Object> remove(@PathVariable Long id) {
return R.ok(service.removeById(id));
}
}

View File

@ -0,0 +1,89 @@
package com.wzj.soopin.content.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.content.convert.ArticleConvert;
import com.wzj.soopin.content.domain.bo.ArticleBO;
import com.wzj.soopin.content.domain.po.Article;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import com.wzj.soopin.content.service.IArticleCategoryService;
import com.wzj.soopin.content.service.IArticleService;
import com.wzj.soopin.member.convert.TenantForbiddenConvert;
import com.wzj.soopin.member.domain.bo.TenantForbiddenBO;
import com.wzj.soopin.member.domain.po.TenantForbidden;
import com.wzj.soopin.member.domain.vo.TenantForbiddenVO;
import com.wzj.soopin.member.service.ITenantForbiddenService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 用户封禁
*/
@Tag(name = "内容管理")
@RestController
@RequestMapping("/content/article")
@RequiredArgsConstructor
public class ArticleController {
private final IArticleService service;
private final ArticleConvert convert;
@Tag(name = "查询列表")
@PostMapping("/page")
public R<IPage<ArticleVO>> page(@RequestBody ArticleBO bo, @RequestBody Page page) {
Page<Article> pages = service.page(page, bo.toWrapper());
return R.ok(convert.toVO(pages));
}
@Tag(name = "查询列表")
@PostMapping("/list")
public R< List<ArticleVO>> list(@RequestBody ArticleBO bo, @RequestBody Page page) {
List<ArticleVO> articleList = service.selectVoList( bo.toWrapper());
return R.ok(articleList);
}
@Tag(name = "新增")
@Log(title = "新增 ", businessType = BusinessType.INSERT)
@PostMapping("/add")
public R add(@RequestBody ArticleBO bo) {
return R.ok(service.save(convert.toPo(bo)));
}
@Tag(name = "详情")
@GetMapping(value = "/{id}")
public R<ArticleVO> getInfo(@PathVariable("id") Long id) {
return R.ok(convert.toVO(service.getById(id)));
}
@Tag(name = ("处理"))
@Log(title = "修改", businessType = BusinessType.UPDATE)
@PostMapping("/update")
public R update(@RequestBody ArticleBO bo) {
service.save(convert.toPo(bo));
return R.ok();
}
@Tag(name = "删除")
@Log(title = "删除", businessType = BusinessType.DELETE)
@DeleteMapping("/{id}")
public R<Object> remove(@PathVariable Long id) {
return R.ok(service.removeById(id));
}
@Tag(name = "轮播列表")
@PostMapping("/carousel")
public R< List<ArticleVO>> carousel(@RequestBody ArticleBO bo, @RequestBody Page page) {
bo.setType(1);//轮播图
List<ArticleVO> articleList = service.selectVoList( bo.toWrapper());
return R.ok(articleList);
}
}

View File

@ -0,0 +1,19 @@
package com.wzj.soopin.content.convert;
import com.wzj.soopin.content.domain.bo.ArticleCategoryBO;
import com.wzj.soopin.content.domain.po.ArticleCategory;
import com.wzj.soopin.content.domain.vo.ArticleCategoryVO;
import com.wzj.soopin.member.domain.bo.FansBO;
import com.wzj.soopin.member.domain.po.Fans;
import com.wzj.soopin.member.domain.vo.FansVO;
import org.dromara.common.web.core.BaseConverter;
import org.mapstruct.Mapper;
/**
* 粉丝与关注 DO <=> VO / BO
*
* @author zcc
*/
@Mapper(componentModel = "spring",uses = BaseConverter.class)
public interface ArticleCategoryConvert extends BaseConverter<ArticleCategoryVO, ArticleCategoryBO, ArticleCategory> {
}

View File

@ -0,0 +1,19 @@
package com.wzj.soopin.content.convert;
import com.wzj.soopin.content.domain.bo.ArticleBO;
import com.wzj.soopin.content.domain.po.Article;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import com.wzj.soopin.member.domain.bo.FansBO;
import com.wzj.soopin.member.domain.po.Fans;
import com.wzj.soopin.member.domain.vo.FansVO;
import org.dromara.common.web.core.BaseConverter;
import org.mapstruct.Mapper;
/**
* 粉丝与关注 DO <=> VO / BO
*
* @author zcc
*/
@Mapper(componentModel = "spring",uses = BaseConverter.class)
public interface ArticleConvert extends BaseConverter<ArticleVO, ArticleBO, Article> {
}

View File

@ -0,0 +1,90 @@
package com.wzj.soopin.content.domain.bo;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wzj.soopin.content.domain.po.Article;
import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.dromara.common.core.domain.BaseBO;
import org.dromara.common.core.domain.model.BaseAudit;
/**
* 文章DO
*
* @author Bulbasaur
* @since 2020/12/10 17:42
*/
@Data
@TableName("cont_article")
@ApiModel(value = "文章")
public class ArticleBO extends BaseBO<Article> {
/**
* id
*/
@Schema(description = "id")
private Long id;
/**
* 标题
*/
@Schema(description = "标题")
private String title;
/**
* 分类id
*/
@Schema(description = "分类id")
private Long categoryId;
/**
* 排序
*/
@Schema(description = "排序")
private Integer sort;
/**
* 内容
*/
@Schema(description = "内容")
private String content;
/**
* 状态
*/
@Schema(description = "状态")
private Integer status;
/**
* 类型
*/
@Schema(description = "类型")
private Integer type;
/**
* 图片
*/
@Schema(description = "图片")
private String images;
/**
* 链接
*/
@Schema(description = "链接")
private String url;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
@Override
public LambdaQueryWrapper<Article> toWrapper() {
return super.toWrapper().eq(id!=null, Article::getId, id)
.eq(title!=null, Article::getTitle, title)
.eq(categoryId!=null, Article::getCategoryId, categoryId)
.eq(sort!=null, Article::getSort, sort)
.eq(content!=null, Article::getContent, content)
.eq(status!=null, Article::getStatus, status)
.eq(type!=null, Article::getType, type)
.eq(images!=null, Article::getImages, images)
.eq(url!=null, Article::getUrl, url);
}
}

View File

@ -0,0 +1,43 @@
package com.wzj.soopin.content.domain.bo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wzj.soopin.content.domain.po.ArticleCategory;
import lombok.Data;
import org.dromara.common.core.domain.BaseBO;
import org.dromara.common.core.domain.model.BaseAudit;
/**
* 文章分类
*
* @author pikachu
* @author Bulbasaur
* @since 2020/12/10 17:42
*/
@Data
@TableName("cont_article_category")
public class ArticleCategoryBO extends BaseBO<ArticleCategory> {
@TableId
private Long id;
private String name;
private String parentId;
private Integer sort;
private Integer level;
private String type;
@Override
public LambdaQueryWrapper<ArticleCategory> toWrapper() {
return super.toWrapper().eq(id!=null, ArticleCategory::getId, id)
.eq(name!=null, ArticleCategory::getName, name)
.eq(parentId!=null, ArticleCategory::getParentId, parentId)
.eq(sort!=null, ArticleCategory::getSort, sort)
.eq(level!=null, ArticleCategory::getLevel, level)
.eq(type!=null, ArticleCategory::getType, type);
}
}

View File

@ -0,0 +1,56 @@
package com.wzj.soopin.content.domain.po;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.dromara.common.core.domain.model.BaseAudit;
/**
* 文章DO
*
* @author Bulbasaur
* @since 2020/12/10 17:42
*/
@Data
@TableName("cont_article")
@Schema(description="文章")
public class Article extends BaseAudit {
@TableId
private Long id;
/**
* 标题
*/
private String title;
/**
* 分类ID
*/
private Long categoryId;
/**
* 排序
*/
private Integer sort;
/**
* 内容
*/
private String content;
/**
* 状态
*/
private Integer status;
/**
* 类型
*/
private Integer type;
/**
* 图片
*/
private String images;
/**
* 链接
*/
private String url;
}

View File

@ -0,0 +1,43 @@
package com.wzj.soopin.content.domain.po;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.models.security.SecurityScheme;
import lombok.Data;
import org.dromara.common.core.domain.model.BaseAudit;
/**
* 文章分类
*
* @author pikachu
* @author Bulbasaur
* @since 2020/12/10 17:42
*/
@Data
@TableName("cont_article_category")
public class ArticleCategory extends BaseAudit {
@TableId
private Long id;
/**
* 名称
*/
private String name;
/**
* 父id
*/
private Long parentId;
/**
* 排序
*/
private Integer sort;
/**
* 层级
*/
private Integer level;
/**
* 类型
*/
private Integer type;
}

View File

@ -0,0 +1,49 @@
package com.wzj.soopin.content.domain.vo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.dromara.common.core.domain.model.BaseAudit;
/**
* 文章分类
*
* @author pikachu
* @author Bulbasaur
* @since 2020/12/10 17:42
*/
@Data
@TableName("cont_article_category")
@Schema(description="文章分类")
public class ArticleCategoryVO extends BaseAudit {
@TableId
private Long id;
/**
* 名称
*/
@Schema(description = "名称")
private String name;
/**
* 父id
*/
@Schema(description = "父id")
private Long parentId;
/**
* 排序
*/
@Schema(description = "排序")
private Integer sort;
/**
* 层级
*/
@Schema(description = "层级")
private Integer level;
/**
* 类型
*/
@Schema(description = "类型")
private Integer type;
}

View File

@ -0,0 +1,77 @@
package com.wzj.soopin.content.domain.vo;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.dromara.common.core.domain.model.BaseAudit;
/**
* 文章DO
*
* @author Bulbasaur
* @since 2020/12/10 17:42
*/
@Data
@TableName("cont_article")
@ApiModel(value = "文章")
public class ArticleVO extends BaseAudit {
/**
* 标题
*/
@Schema(description = "id")
private Long id;
@Schema(description = "标题")
private String title;
/**
* 摘要
*/
@Schema(description = "摘要")
private String summary;
/**
* 分类
*/
@Schema(description = "分类")
private Long categoryId;
/**
* 分类名称
*/
@Schema(description = "分类名称")
private String categoryName;
/**
* 标签
*/
@Schema(description = "标签")
private String tags;
/**
* 排序
*/
@Schema(description = "排序")
private Integer sort;
/**
* 内容
*/
@Schema(description = "内容")
private String content;
/**
* 状态
*/
@Schema(description = "状态")
private Integer status;
/**
* 类型
*/
@Schema(description = "类型")
private Integer type;
/**
* 图片
*/
@Schema(description = "图片")
private String images;
/**
* 链接
*/
@Schema(description = "链接")
private String url;
}

View File

@ -0,0 +1,11 @@
package com.wzj.soopin.content.mapper;
import com.wzj.soopin.content.domain.bo.ArticleCategoryBO;
import com.wzj.soopin.content.domain.po.ArticleCategory;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
public interface ArticleCategoryMapper extends BaseMapperPlus<ArticleCategory, ArticleCategoryBO> {
}

View File

@ -0,0 +1,21 @@
package com.wzj.soopin.content.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.content.domain.po.Article;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import org.apache.ibatis.annotations.Param;
import java.io.Serializable;
import java.util.List;
public interface ArticleMapper extends BaseMapper<Article> {
ArticleVO selectVoById(Serializable id);
List<ArticleVO> selectVoList(@Param("ew") Wrapper<Article> queryWrapper);
Page<ArticleVO> selectVoList(IPage<ArticleVO> page, @Param("ew") Wrapper<Article> queryWrapper);
}

View File

@ -0,0 +1,11 @@
package com.wzj.soopin.content.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wzj.soopin.content.domain.po.ArticleCategory;
import com.wzj.soopin.member.domain.po.MemberForbidden;
public interface IArticleCategoryService extends IService<ArticleCategory> {
}

View File

@ -0,0 +1,20 @@
package com.wzj.soopin.content.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.wzj.soopin.content.domain.bo.ArticleBO;
import com.wzj.soopin.content.domain.po.Article;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import com.wzj.soopin.member.domain.po.MemberForbidden;
import java.util.List;
public interface IArticleService extends IService<Article> {
List<ArticleVO> selectVoList(Wrapper<Article> queryWrapper);
Page<ArticleVO> selectVoPage(Page<ArticleVO> page,Wrapper<Article>queryWrapper);
}

View File

@ -0,0 +1,21 @@
package com.wzj.soopin.content.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wzj.soopin.content.domain.po.ArticleCategory;
import com.wzj.soopin.content.mapper.ArticleCategoryMapper;
import com.wzj.soopin.content.service.IArticleCategoryService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 店铺封禁
*
* @author zcc
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class ArticleCategoryServiceImpl extends ServiceImpl<ArticleCategoryMapper, ArticleCategory> implements IArticleCategoryService {
}

View File

@ -0,0 +1,36 @@
package com.wzj.soopin.content.service.impl;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wzj.soopin.content.domain.bo.ArticleBO;
import com.wzj.soopin.content.domain.po.Article;
import com.wzj.soopin.content.domain.vo.ArticleVO;
import com.wzj.soopin.content.mapper.ArticleMapper;
import com.wzj.soopin.content.service.IArticleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 店铺封禁
*
* @author zcc
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, Article> implements IArticleService {
@Override
public List<ArticleVO> selectVoList(Wrapper<Article> queryWrapper) {
return baseMapper.selectVoList(queryWrapper);
}
@Override
public Page<ArticleVO> selectVoPage(Page<ArticleVO> page, Wrapper<Article> queryWrapper) {
return baseMapper.selectVoList(page,queryWrapper);
}
}

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.wzj.soopin.content.mapper.ArticleMapper">
<select id="selectVoById" resultType="com.wzj.soopin.content.domain.vo.ArticleVO">
select a.* ,b.name as category_name from cont_article a left join cont_article_category b on a.category_id=b.id
WHERE id = #{id}
ORDER BY create_time DESC
</select>
<select id="selectVoList" resultType="com.wzj.soopin.content.domain.vo.ArticleVO">
select a.*,b.name as category_name from (select * from cont_article
${ew.customSqlSegment} ) a
left join cont_article_category b on a.category_id=b.id
order by a.create_time desc
</select>
</mapper>

View File

@ -108,7 +108,7 @@ services:
# 配置文件
- /docker/server1/logs/:/ruoyi/server/logs/
# skywalking 探针
# - /docker/skywalking/agent/:/ruoyi/skywalking/agent
# - /docker/skywalking/agent/:/ruoyi/skywalking/agent
privileged: true
network_mode: "host"
@ -123,7 +123,7 @@ services:
# 配置文件
- /docker/server2/logs/:/ruoyi/server/logs/
# skywalking 探针
# - /docker/skywalking/agent/:/ruoyi/skywalking/agent
# - /docker/skywalking/agent/:/ruoyi/skywalking/agent
privileged: true
network_mode: "host"
@ -152,3 +152,45 @@ services:
- /docker/snailjob/logs/:/ruoyi/snailjob/logs
privileged: true
network_mode: "host"
elasticsearch:
image: elasticsearch:7.14.0
container_name: elasticsearch
environment:
- discovery.type=single-node
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
volumes:
- esdata:/usr/share/elasticsearch/data
networks:
- efk-network
fluentd:
image: fluent/fluentd:v1.12-debian-1
container_name: fluentd
volumes:
- ./fluentd/conf:/fluentd/etc
- ./fluentd/log:/fluentd/log
ports:
- "24224:24224"
- "24224:24224/udp"
depends_on:
- elasticsearch
networks:
- efk-network
kibana:
image: kibana:7.14.0
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
networks:
- efk-network

79
script/docker/docker.txt Normal file
View File

@ -0,0 +1,79 @@
docker run -d --name gitlab-runner --restart always \
-v /var/local/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/local/docker/cicd:/home/docker/cicd \
-v /var/local/maven/repository:/home/maven/repository \
gitlab/gitlab-runner:latest
//创建mysql
docker run -d \
--name mysql \
--restart always \
-p 13306:3306 \
-e MYSQL_ROOT_PASSWORD=K9p@rS32qL7z \
-e TZ=Asia/Shanghai \
-v /var/local/docker/mysql/data:/var/lib/mysql \
-v /var/local/docker/mysql/conf:/etc/mysql/conf.d \
mysql:8.0 \
--lower_case_table_names=1
//创建redis
docker run -d \
--name redis \
--restart always \
-p 16379:6379 \
-v /var/local/docker/redis/data:/data \
-v /var/local/docker/redis/conf:/usr/local/etc/redis \
redis:latest \
redis-server /usr/local/etc/redis/redis.conf --requirepass "e4ea0caebfd2"
//创建nginx
docker run -d \
--name nginx \
--env TZ=Asia/Shanghai \
-p 8000:80 \
-p 7443:443 \
-v /var/local/docker/nginx/cert:/etc/nginx/cert \
-v /var/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /var/local/docker/nginx/html:/etc/nginx/html \
-v /var/local/docker/nginx/log:/var/log/nginx \
-v /var/local/docker/nginx/upload:/var/upload/files \
--privileged \
--network host \
nginx
//创建java
docker run -d \
--name java \
--restart always \
-p 8880:8080 \
-v /var/local/docker/java/data:/java \
-v /var/local/docker/java/logs:/logs \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-e TZ=Asia/Shanghai \
-e JAVA_OPTS="-Xms512m -Xmx800m \
-XX:+UseContainerSupport \
-XX:MaxMetaspaceSize=256m \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/var/log/java-app/heapdump.hprof \
-Dlogging.file.path=/var/log/java-app \
-Dfile.encoding=UTF-8" \
--health-interval=30s \
--health-timeout=5s \
--health-retries=3 \
bellsoft/liberica-openjdk-debian:17.0.11-cds \
java $JAVA_OPTS -Djdk.internal.platform.CgroupMetrics.enabled=false -jar /java/ruoyi-admin.jar
//es
docker run -d \
--name es \
--restart always \
-p 19200:9200 \
-p 19300:9300 \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
-v /var/local/docker/elasticsearch/data:/usr/share/elasticsearch/data \
elasticsearch:7.17.0

View File

@ -1,117 +1,137 @@
#user nobody;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
# 限制body大小
client_max_body_size 100m;
# 开启静态资源压缩
gzip_static on;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
upstream server {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
}
upstream monitor-admin {
server 127.0.0.1:9090;
}
upstream snailjob-server {
server 127.0.0.1:8800;
}
#gzip on;
server {
listen 80;
listen 8000;
server_name localhost;
# https配置参考 start
#listen 443 ssl;
#charset koi8-r;
# 证书直接存放 /docker/nginx/cert/ 目录下即可 更改证书名称即可 无需更改证书路径
#ssl on;
#ssl_certificate /etc/nginx/cert/xxx.local.crt; # /etc/nginx/cert/ 为docker映射路径 不允许更改
#ssl_certificate_key /etc/nginx/cert/xxx.local.key; # /etc/nginx/cert/ 为docker映射路径 不允许更改
#ssl_session_timeout 5m;
#ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#ssl_prefer_server_ciphers on;
# https配置参考 end
# 演示环境配置 拦截除 GET POST 之外的所有请求
# if ($request_method !~* GET|POST) {
# rewrite ^/(.*)$ /403;
# }
# location = /403 {
# default_type application/json;
# return 200 '{"msg":"演示模式,不允许操作","code":500}';
# }
# 限制外网访问内网 actuator 相关路径
location ~ ^(/[^/]*)?/actuator.*(/.*)?$ {
return 403;
}
#access_log logs/host.access.log main;
location / {
root /usr/share/nginx/html; # docker映射路径 不允许更改
try_files $uri $uri/ /index.html;
root html ;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /prod-api/ {
proxy_set_header Host $http_host;
location /dev {
root dist ;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /dev-api/ {
proxy_pass http://192.168.1.65:8880/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400s;
# sse websocket参数
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffering off;
proxy_cache off;
proxy_pass http://server/;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /upload/file/ {
alias /var/local/upload/file/;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST'; # 允许的HTTP方法
add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header Access-Control-Expose-Headers 'Content-Length,Content-Range';
}
# https 会拦截内链所有的 http 请求 造成功能无法使用
# 解决方案1 admin 服务 也配置成 https
# 解决方案2 将菜单配置为外链访问 走独立页面 http 访问
location /admin/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://monitor-admin/admin/;
}
location /snail-job/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://snailjob-server/snail-job/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}