diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..914841f --- /dev/null +++ b/.gitignore @@ -0,0 +1,34 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ +/weight-loss-camp-service-api/target/ diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..b3df4a2 --- /dev/null +++ b/readme.md @@ -0,0 +1,10 @@ +## weight-loss-camp-api-base +基础功能服务 +## weight-loss-camp-api-data +数据库连接服务 + +## weight-loss-camp-service-api +基础服务接口 + +## weight-loss-camp-work-api +工作端api \ No newline at end of file diff --git a/weight-loss-camp-service-api/src/test/java/Gen.java b/weight-loss-camp-service-api/src/test/java/Gen.java new file mode 100644 index 0000000..2dd768a --- /dev/null +++ b/weight-loss-camp-service-api/src/test/java/Gen.java @@ -0,0 +1,79 @@ +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.generator.FastAutoGenerator; +import com.baomidou.mybatisplus.generator.config.rules.DateType; +import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine; +import com.wjbl.weightlosscamp.api.base.entity.BaseEntity; + +import java.io.File; +import java.util.Arrays; +import java.util.List; + +public class Gen { + + public static void main(String[] args) { + List tableNameList = Arrays.asList( + "qywx_approve_template_config" + ); + + gen("jfxly", "root", "123456", tableNameList, "com.wjbl.weightlosscamp.service.api.module.sys"); + + + } + + public static void gen(String dbName, String userName, String pwd, List tableNameList, String basePackage) { + + String path = System.getProperty("user.dir"); + + System.out.println(path); + //E:\project\data_process\zhudehao\src\main\java + + String url = "jdbc:mysql://localhost:3307/" + dbName + "?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai"; + String username = userName; + String password = pwd; + FastAutoGenerator.create(url, username, password) + .globalConfig(builder -> { + builder.author("kevin") // 设置作者 + .commentDate("yyyy-MM-dd") + .outputDir(path + File.separator + "weight-loss-camp-service-api" + "\\src\\main\\java") + .disableOpenDir() + .enableSpringdoc() + .dateType(DateType.ONLY_DATE) + + //.enableSpringdoc() + ; // 指定输出目录 + }).packageConfig(builder -> { + builder.parent(basePackage); + }).strategyConfig(builder -> { + builder + .addTablePrefix("tb_") + .addInclude(tableNameList) + .entityBuilder() + .enableFileOverride() + .enableLombok() + //enableTableFieldAnnotation() + .versionColumnName("revision") + .logicDeleteColumnName("deleted") + .superClass(BaseEntity.class) + .addSuperEntityColumns("id", "tenant_id", "created_by_id", "created_by", "created_time", "updated_by", "updated_by_id", "updated_time", "deleted", "revision") + .addIgnoreColumns("dev_remark") + //.enableActiveRecord() + .idType(IdType.ASSIGN_ID) + .controllerBuilder() + //.enableFileOverride() + .enableRestStyle() + .serviceBuilder() + .enableFileOverride() + .formatServiceFileName("%sService") + .formatServiceImplFileName("%sServiceImp") + .mapperBuilder() + .enableMapperAnnotation() + .enableBaseResultMap() + .enableBaseColumnList() + .enableFileOverride() + ; + }) + .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 + .execute(); + + } +} diff --git a/weight-loss-camp-work-api/pom.xml b/weight-loss-camp-work-api/pom.xml new file mode 100644 index 0000000..88af3cf --- /dev/null +++ b/weight-loss-camp-work-api/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + + com.wjbl + weight-loss-camp + 1.0.0-SNAPSHOT + + + weight-loss-camp-work-api + jar + 营地服务应用API + + + + + com.wjbl + weight-loss-camp-api-base + ${project.version} + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.github.xiaoymin + knife4j-openapi3-jakarta-spring-boot-starter + + + + + cn.dev33 + sa-token-spring-boot3-starter + 1.37.0 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + \ No newline at end of file diff --git a/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/WorkApiApplication.java b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/WorkApiApplication.java new file mode 100644 index 0000000..7ca4afb --- /dev/null +++ b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/WorkApiApplication.java @@ -0,0 +1,21 @@ +package com.wjbl.weightlosscamp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.openfeign.EnableFeignClients; + +/** + * 营地工作服务API启动类 + * + * @author generated + */ +@SpringBootApplication +@EnableDiscoveryClient +@EnableFeignClients +public class WorkApiApplication { + + public static void main(String[] args) { + SpringApplication.run(WorkApiApplication.class, args); + } +} \ No newline at end of file diff --git a/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/client/ServiceFeignClient.java b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/client/ServiceFeignClient.java new file mode 100644 index 0000000..8d1c27e --- /dev/null +++ b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/client/ServiceFeignClient.java @@ -0,0 +1,25 @@ +package com.wjbl.weightlosscamp.service.api.client; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; + +/** + * 服务Feign客户端 + * 使用OpenFeign调用service-api服务 + * + * @author generated + */ +@FeignClient(name = "weight-loss-camp-service-api", path = "/service-api") +public interface ServiceFeignClient { + + /** + * 示例方法:根据ID获取数据 + * + * @param id 数据ID + * @return 返回数据字符串 + */ + @GetMapping("/example/{id}") + String getExampleDataById(@PathVariable("id") Long id); + +} \ No newline at end of file diff --git a/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/config/FeignConfig.java b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/config/FeignConfig.java new file mode 100644 index 0000000..a5ba55e --- /dev/null +++ b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/config/FeignConfig.java @@ -0,0 +1,149 @@ +package com.wjbl.weightlosscamp.service.api.config; + +import com.wjbl.weightlosscamp.api.base.constant.WebParamConstant; +import feign.Logger; +import feign.RequestInterceptor; +import feign.Response; +import feign.codec.Decoder; +import feign.codec.Encoder; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Collection; +import java.util.Map; +import java.util.UUID; + +/** + * Feign配置类 + * + * @author generated + */ +@Slf4j +@Configuration +public class FeignConfig { + + /** + * 配置Feign日志级别 + */ + @Bean + public Logger.Level feignLoggerLevel() { + return Logger.Level.FULL; + } + + /** + * 请求拦截器,添加traceId用于链路追踪 + */ + @Bean + public RequestInterceptor requestInterceptor() { + return requestTemplate -> { + // 添加请求唯一标识 + // 设置序列号 + + String seq = MDC.get(WebParamConstant.SEQ); + + if (seq == null || seq.isEmpty()) { + seq = UUID.randomUUID().toString(); + } + + // 记录请求信息 + String method = requestTemplate.method(); + String url = requestTemplate.url(); + Map> headers = requestTemplate.headers(); + + StringBuilder requestLog = new StringBuilder(); + requestLog.append("\n================================ Feign请求开始 ================================\n"); + requestLog.append("请求方式: ").append(method).append("\n"); + requestLog.append("请求地址: ").append(url).append("\n"); + requestLog.append("请求头: ").append(headers).append("\n"); + + // 获取请求体 + if (requestTemplate.body() != null) { + String bodyStr = new String(requestTemplate.body(), StandardCharsets.UTF_8); + requestLog.append("请求参数: ").append(bodyStr).append("\n"); + } + + log.info(requestLog.toString()); + }; + } + + /** + * 自定义Feign编码器,记录请求参数 + */ + @Bean + public Encoder loggingEncoder(Encoder defaultEncoder) { + return (object, bodyType, template) -> { + defaultEncoder.encode(object, bodyType, template); + if (object != null) { + log.info("请求参数对象: {}", object); + } + }; + } + + /** + * 自定义Feign解码器,记录响应结果 + */ + @Bean + public Decoder loggingDecoder(Decoder defaultDecoder) { + return (response, type) -> { + long startTime = System.currentTimeMillis(); + + // 克隆响应,因为响应体只能读取一次 + Response clonedResponse = cloneResponse(response); + + try { + // 记录响应信息 + String responseBody = getResponseBody(clonedResponse); + + StringBuilder responseLog = new StringBuilder(); + responseLog.append("\n================================ Feign响应结果 ================================\n"); + responseLog.append("响应状态: ").append(clonedResponse.status()).append("\n"); + responseLog.append("响应头: ").append(clonedResponse.headers()).append("\n"); + responseLog.append("响应体: ").append(responseBody).append("\n"); + responseLog.append("处理时间: ").append(System.currentTimeMillis() - startTime).append("ms\n"); + responseLog.append("================================ Feign请求结束 ================================\n"); + + log.info(responseLog.toString()); + + // 使用原始响应解码 + return defaultDecoder.decode(response, type); + } catch (Exception e) { + log.error("记录Feign响应日志失败", e); + return defaultDecoder.decode(response, type); + } + }; + } + + /** + * 克隆响应对象 + */ + private Response cloneResponse(Response response) { + return Response.builder() + .status(response.status()) + .reason(response.reason()) + .headers(response.headers()) + .body(response.body()) + .request(response.request()) + .build(); + } + + /** + * 获取响应体内容 + */ + private String getResponseBody(Response response) { + if (response.body() == null) { + return "(空响应体)"; + } + + try { + byte[] bodyData = feign.Util.toByteArray(response.body().asInputStream()); + return new String(bodyData, StandardCharsets.UTF_8); + } catch (IOException e) { + log.error("读取响应体失败", e); + return "(响应体读取失败)"; + } + } +} \ No newline at end of file diff --git a/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/config/WebConfig.java b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/config/WebConfig.java new file mode 100644 index 0000000..245f6ac --- /dev/null +++ b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/config/WebConfig.java @@ -0,0 +1,16 @@ +package com.wjbl.weightlosscamp.service.api.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * Web配置类 + * + * @author generated + */ +@Configuration +public class WebConfig implements WebMvcConfigurer { + + // Web相关配置,如拦截器、资源处理器等 + +} \ No newline at end of file diff --git a/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/controller/ExampleController.java b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/controller/ExampleController.java new file mode 100644 index 0000000..eb33637 --- /dev/null +++ b/weight-loss-camp-work-api/src/main/java/com/wjbl/weightlosscamp/service/api/controller/ExampleController.java @@ -0,0 +1,47 @@ +package com.wjbl.weightlosscamp.service.api.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.wjbl.weightlosscamp.service.api.client.ServiceFeignClient; + +import lombok.extern.slf4j.Slf4j; + +/** + * 示例控制器 + * + * @author generated + */ +@Slf4j +@RestController +@RequestMapping("/example") +public class ExampleController { + + @Autowired + private ServiceFeignClient serviceFeignClient; + + /** + * 示例方法:通过Feign调用服务API + * + * @param id 数据ID + * @return 返回数据字符串 + */ + @GetMapping("/{id}") + public String getExample(@PathVariable Long id) { + log.info("接收到获取示例数据请求, id={}", id); + return serviceFeignClient.getExampleDataById(id); + } + + /** + * 健康检查接口 + * + * @return 返回健康状态 + */ + @GetMapping("/health") + public String health() { + return "work-api服务运行正常!"; + } +} \ No newline at end of file diff --git a/weight-loss-camp-work-api/src/main/resources/application.yml b/weight-loss-camp-work-api/src/main/resources/application.yml new file mode 100644 index 0000000..0e83d59 --- /dev/null +++ b/weight-loss-camp-work-api/src/main/resources/application.yml @@ -0,0 +1,48 @@ +server: + port: 9001 + servlet: + context-path: /work-api + +spring: + application: + name: weight-loss-camp-work-api + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3307/kevin?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: root + password: 123456 + cloud: + nacos: + discovery: + server-addr: 60.205.225.2:8848 + group: weight-loss-camp + # OpenFeign配置 + openfeign: + client: + config: + default: + connectTimeout: 5000 + readTimeout: 5000 + loggerLevel: FULL + +# 日志配置 +logging: + level: + com.wjbl.weight.loss.camp.service.api.apiservice: DEBUG + +# Knife4j配置 +knife4j: + enable: true + setting: + language: zh-CN + +# Sa-Token配置 +sa-token: + token-name: Authorization + token-prefix: Bearer + timeout: 2592000 + active-timeout: -1 + is-concurrent: true + is-share: false + token-style: uuid + is-log: true diff --git a/weight-loss-camp-work-api/src/main/resources/log4j2.xml b/weight-loss-camp-work-api/src/main/resources/log4j2.xml new file mode 100644 index 0000000..1365781 --- /dev/null +++ b/weight-loss-camp-work-api/src/main/resources/log4j2.xml @@ -0,0 +1,48 @@ + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%X{TraceId}] %-5level %logger{36} - %msg%n + logs/weight-loss-camp-work-api + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file