社区项目-项目介绍环境搭建

2024-06-21 23:44

本文主要是介绍社区项目-项目介绍环境搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1.技术选型
    • 2.原型设计
        • 1.安装AxureRP
        • 2.进行汉化
        • 3.载入元件库
        • 4.基本设计
    • 3.元数建模
        • 1.安装元数建模软件
        • 2.新建项目
        • 3.新增一个刷题模块主题域
        • 4.新增数据表 subject_category
        • 5.新增关系图,将表拖过来
        • 6.新增题目标签表
        • 7.新增题目信息表
        • 8.新增单选表、多选表、判断题、简答题
        • 9.新增分类、标签、题目关联表
        • 10.关系图预览
    • 4.项目架构分析
        • 1.现有的架构
        • 2.ddd架构
    • 5.mysql采用docker版的主从复制(之前配置过)
        • 1.docker的启动命令
        • 2.IDEA测试连接
        • 3.主MySQL的连接信息
        • 4.创建数据库sun_club,然后创建表
    • 6.集成Gitee
        • 1.新建仓库
        • 2.克隆到IDEA
    • 7.新建一个sun-club-subject作为父模块
        • 1.新建父模块
        • 2.删除src目录
        • 3.设置整个项目的编码为utf-8
        • 4.在maven的配置部分指定编译版本为java8
        • 5.在maven的插件配置中指定maven打包的配置
    • 8.新建子模块
        • 1.新建api子模块
        • 2.为子模块的parent部分加上relativePath标签(不要加,只有在需要双继承的时候才需要)
        • 3.在maven的配置部分指定编译版本为java8以及maven的打包插件(每个子模块都要加的)
        • 2.新建application子模块
        • 3.跟上面两个一样的常规配置
        • 4.分别新建common、domain、infra、starter模块并进行常规配置
        • 5.各层次目录结构
          • 1.api层
          • 2.starter层
          • 3.infra层
          • 4.domain层![image-20240523154525211](https://img-blog.csdnimg.cn/img_convert/3f12fa1b06453bc80ee1dd82ada22d9b.png)
          • 5.common层
          • 6.application层
            • 新建三个子模块并加上常规配置
          • 7.整体结构一览
        • 6.目录结构调整
          • 1.sun-club-subject-api
          • 2.sun-club-starter
          • 3.sun-club-infra
          • 4.sun-club-domain
          • 5.sun-club-common
          • 6.sun-club-application
    • 9.集成SpringBoot
        • 1.编辑sun-club-subject的pom.xml引入SpringBoot2并配置maven仓库
        • 2.编辑sun-club-starter的pom.xml引入SpringBoot的starter-web
        • 3.sun-club-starter模块编写启动类SubjectApplication.java
        • 4.启动测试
        • 5.sun-club-starter模块创建application.yml对项目进行调整
          • 1.文件内容
          • 2.重启测试
    • 10.集成SpringMVC
        • 1.sun-club-application-controller 引入SpringBoot的starter-web
        • 2.编写SubjectController.java
        • 3.sun-club-starter引入sun-club-application-controller模块,使其启动时可以找到
        • 4.测试访问
    • 11.集成MySQL,Druid,MyBatis
        • 1.sun-club-infra模块添加依赖
        • 2.EasyCode插件,生成CRUD
          • 1.安装插件
          • 2.选择表,右键选择EasyCode
          • 3.选择代码生成的位置,和需要的文件
          • 4.查看生成的代码
          • 5.删除与Pageable有关的代码
            • 1.SubjectCategoryDao.java
            • 2.SubjectCategoryService.java
            • 3.SubjectCategoryServiceImpl.java
        • 3.sun-club-starter引入sun-club-infra
        • 4.sun-club-starter启动类配置MapperScan,扫描基础设施层的包
        • 5.sun-club-starter配置数据源和监控
        • 6.测试
          • 1.sun-club-application-controller 引入sun-club-infra
          • 2.sun-club-application-controller编写SubjectController.java测试
          • 3.启动测试,成功!
        • 7.使用druid对application.yml中的密码进行加密
          • 1.sun-club-infra编写DruidEncryptUtil.java进行加解密
          • 2.sun-club-starter修改application.yml
        • 8.准备apipost测试工具
          • 1.新建目录
          • 2.刷题模块目录
          • 3.再添加一个题目分类的目录
          • 4.添加一个接口
    • 12.分层架构的业务开发演示
        • 1.引入依赖
          • 1.sun-club-common引入lombok和mapstruct,注意lombok必须放到mapstruct前面
          • 2.sun-club-infra引入sun-club-common
        • 2.sun-club-domain层
          • 1.引入sun-club-infra的依赖
          • 2.创建SubjectCategoryBO.java(只关注业务)
          • 3.service层
            • 1.SubjectCategoryDomainService.java
            • 2.由于需要将BO转换为eneity,所以需要转换器SubjectCategoryConverter.java
            • 3.SubjectCategoryDomainServiceImpl.java
        • 3.sun-club-application-controller层
          • 1.引入sun-club-domain的依赖
          • 2.转换器将DTO转换为BO SubjectCategoryDTOConverter.java
          • 3.sun-club-common包中封装统一响应
            • 1.ResultCodeEnum.java
            • 2.Result.java
          • 4.SubjectCategoryController.java
          • 5.测试
        • 4.打印日志
          • 1.sun-club-common引入log4j2和fastjson
          • 2.SubjectCategoryController.java打印日志
          • 3.SubjectCategoryDomainServiceImpl.java
          • 4.SubjectCategoryServiceImpl.java
          • 5.sun-club-starter 引入log4j2-spring.xml
          • 6.sun-club-starter的application.yml配置日志
          • 7.启动会报错
            • 1.报错信息
            • 2.使用Maven Helper查看依赖
            • 3.排除掉springboot-starter-web的log
            • 4.再次测试
        • 5.参数校验
          • 1.使用guava
            • 1.sun-club-common引入依赖
            • 2.sun-club-application-controller引入公共包
            • 3.Preconditions.checkNotNull没有生效,说明guava依赖有问题,clean一下maven,发现报错
            • 4.把所有relativePath全删除,因为并没有双继承,用不上,再次clean,成功!
            • 5.sun-club-application-controller编写SubjectCategoryController.java
            • 6.端口换成3010
          • 2.测试

1.技术选型

image-20240523103709944

2.原型设计

1.安装AxureRP

image-20240523105343084

2.进行汉化

image-20240523105703905

3.载入元件库

image-20240523105759647

image-20240523105923775

4.基本设计

image-20240523110733594

3.元数建模

1.安装元数建模软件

image-20240523111228529

2.新建项目

image-20240523111627437

3.新增一个刷题模块主题域

image-20240523111754467

4.新增数据表 subject_category

image-20240523111946145

image-20240523112335889

5.新增关系图,将表拖过来

image-20240523112425927

image-20240523112456605

6.新增题目标签表

image-20240523112643132

image-20240523113215837

7.新增题目信息表

image-20240523113428035

image-20240523114411374

8.新增单选表、多选表、判断题、简答题

image-20240523115006075

image-20240523115408987

image-20240523115650835

image-20240523120015541

9.新增分类、标签、题目关联表
10.关系图预览

image-20240523131742982

4.项目架构分析

1.现有的架构

image-20240523132552332

2.ddd架构

image-20240523132620853

5.mysql采用docker版的主从复制(之前配置过)

1.docker的启动命令
docker run -p 3307:3306 --name mysql-master \
-v /mysql5.7/mysql-master/log:/var/log/mysql \
-v /mysql5.7/mysql-master/data:/var/lib/mysql \
-v /mysql5.7/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=******** \
-d mysql:5.7
2.IDEA测试连接
3.主MySQL的连接信息
4.创建数据库sun_club,然后创建表

6.集成Gitee

1.新建仓库

image-20240523145508623

2.克隆到IDEA

image-20240523145552481

7.新建一个sun-club-subject作为父模块

1.新建父模块

image-20240523150655253

2.删除src目录

image-20240523150851198

3.设置整个项目的编码为utf-8

4.在maven的配置部分指定编译版本为java8
    <!-- maven的配置 --><!-- 解决java: -source 1.5 中不支持 diamond 运算符 问题 --><properties><java.version>1.8</java.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties>
5.在maven的插件配置中指定maven打包的配置
    <!-- maven打包常规配置 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

image-20240523152517520

8.新建子模块

1.新建api子模块

image-20240523151042356

2.为子模块的parent部分加上relativePath标签(不要加,只有在需要双继承的时候才需要)

image-20240523151631395

3.在maven的配置部分指定编译版本为java8以及maven的打包插件(每个子模块都要加的)
  <!-- maven的配置 --><!-- 解决java: -source 1.5 中不支持 diamond 运算符 问题 --><properties><java.version>1.8</java.version><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><!-- maven打包常规配置 --><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

image-20240523152618538

2.新建application子模块

3.跟上面两个一样的常规配置

image-20240523152926046

4.分别新建common、domain、infra、starter模块并进行常规配置

image-20240523153517433

image-20240523153529088

5.各层次目录结构
1.api层

image-20240523154009996

2.starter层

image-20240523154114961

3.infra层

image-20240523154337689

4.domain层image-20240523154525211
5.common层

image-20240523154631912

6.application层
新建三个子模块并加上常规配置

image-20240523155100663

image-20240523155416269

7.整体结构一览

image-20240523155532124

6.目录结构调整
1.sun-club-subject-api

image-20240523160121211

2.sun-club-starter

image-20240523160137202

3.sun-club-infra

image-20240523160342709

4.sun-club-domain

image-20240523160504939

5.sun-club-common

image-20240523160820466

6.sun-club-application

image-20240523161236957

9.集成SpringBoot

1.编辑sun-club-subject的pom.xml引入SpringBoot2并配置maven仓库
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.4.2</version><type>pom</type><scope>import</scope></dependency></dependencies><repositories><repository><id>central</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><layout>default</layout><releases><enabled>true</enabled></releases><snapshots><enabled>true</enabled></snapshots></repository></repositories>

image-20240523162246282

2.编辑sun-club-starter的pom.xml引入SpringBoot的starter-web
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.4.2</version></dependency></dependencies>

image-20240523163020302

3.sun-club-starter模块编写启动类SubjectApplication.java
package com.sunxiansheng.subject;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;/*** Description: 刷题微服务启动类* @Author sun* @Create 2024/5/23 16:30* @Version 1.0*/
@SpringBootApplication
@ComponentScan("com.sunxiansheng") // 扫描当前模块下的所有包
public class SubjectApplication {public static void main(String[] args) {SpringApplication.run(SubjectApplication.class, args);}
}

image-20240523163512007

4.启动测试

image-20240523163533835

5.sun-club-starter模块创建application.yml对项目进行调整
1.文件内容

2.重启测试

image-20240523163739595

10.集成SpringMVC

1.sun-club-application-controller 引入SpringBoot的starter-web
    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.4.2</version></dependency></dependencies>

image-20240523164014670

2.编写SubjectController.java
package com.sunxiansheng.subject.application.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** Description: 刷题微服务控制器* @Author sun* @Create 2024/5/23 16:42* @Version 1.0*/
@RestController
public class SubjectController {@GetMapping("/test")public String test() {return "Hello, World!";}
}

image-20240523165332899

3.sun-club-starter引入sun-club-application-controller模块,使其启动时可以找到
        <!-- 引入sun-club-application-controller的依赖,则启动这个模块,就能找到 --><dependency><groupId>com.sun.club</groupId><artifactId>sun-club-application-controller</artifactId><version>1.0-SNAPSHOT</version></dependency>

image-20240523165449763

4.测试访问

image-20240523165506077

11.集成MySQL,Druid,MyBatis

1.sun-club-infra模块添加依赖
    <dependencies><!-- jdbcStarter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>2.4.2</version></dependency><!-- druid连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.21</version></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.22</version></dependency><!-- mybatisplus --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency></dependencies>

image-20240523170254690

2.EasyCode插件,生成CRUD
1.安装插件

image-20240523185842998

2.选择表,右键选择EasyCode

image-20240523190445627

3.选择代码生成的位置,和需要的文件

image-20240523190627854

4.查看生成的代码

image-20240523192932850

5.删除与Pageable有关的代码
1.SubjectCategoryDao.java

image-20240523191827530

2.SubjectCategoryService.java

image-20240523191858191

3.SubjectCategoryServiceImpl.java

image-20240523191929408

3.sun-club-starter引入sun-club-infra
        <!-- 引入sun-club-infra --><dependency><groupId>com.sun.club</groupId><artifactId>sun-club-infra</artifactId><version>1.0-SNAPSHOT</version></dependency>

image-20240523192617622

4.sun-club-starter启动类配置MapperScan,扫描基础设施层的包

image-20240523193811911

5.sun-club-starter配置数据源和监控
  • 这里没有配置扫描Mapper.xml的原因是:Mapper和Mapper.xml的名字相同并且位于常规位置,MyBatis会自动扫描
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: username: password: type: com.alibaba.druid.pool.DruidDataSource # druid连接池druid:initial-size: 20 # 初始化连接数min-idle: 20 # 最小连接数max-active: 100 # 最大连接数max-wait: 60000 # 最大等待时间,单位毫秒stat-view-servlet:enabled: true # 是否开启监控url-pattern: /druid/* # 监控路径login-username: # 登录用户名login-password: # 登录密码filter:stat:enabled: true # 是否开启慢sql监控slow-sql-millis: 2000 # 慢sql阈值,单位毫秒log-slow-sql: true # 是否打印慢sqlwall:enabled: true # 是否开启防火墙
6.测试
1.sun-club-application-controller 引入sun-club-infra
        <!-- 引入sun-club-infra --><dependency><groupId>com.sun.club</groupId><artifactId>sun-club-infra</artifactId><version>1.0-SNAPSHOT</version></dependency>

image-20240523195248619

2.sun-club-application-controller编写SubjectController.java测试

image-20240523195659126

3.启动测试,成功!

image-20240523200243396

7.使用druid对application.yml中的密码进行加密
1.sun-club-infra编写DruidEncryptUtil.java进行加解密
package com.sunxiansheng.subject.infra.basic.utils;import com.alibaba.druid.filter.config.ConfigTools;import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;/*** Description: 使用druid对配置文件中的密码进行加密* @Author sun* @Create 2024/5/23 20:22* @Version 1.0*/
public class DruidEncryptUtil {private static String publicKey;private static String privateKey;static {try {String[] keyPair = ConfigTools.genKeyPair(512);privateKey = keyPair[0];System.out.println("privateKey:" + privateKey);publicKey = keyPair[1];System.out.println("publicKey:" + publicKey);} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();}}public static String encrypt(String plainText) throws Exception {String encrypt = ConfigTools.encrypt(privateKey, plainText);System.out.println("encrypt:" + encrypt);return encrypt;}public static String decrypt(String encryptText) throws Exception {String decrypt = ConfigTools.decrypt(publicKey, encryptText);System.out.println("decrypt:" + decrypt);return decrypt;}public static void main(String[] args) throws Exception {String encrypt = encrypt("");System.out.println("encrypt:" + encrypt);}}
2.sun-club-starter修改application.yml
8.准备apipost测试工具
1.新建目录

image-20240523210503359

2.刷题模块目录

image-20240523210528522

3.再添加一个题目分类的目录

image-20240523210638230

4.添加一个接口

image-20240523212045274

12.分层架构的业务开发演示

1.引入依赖
1.sun-club-common引入lombok和mapstruct,注意lombok必须放到mapstruct前面
        <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.16</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifactId><version>1.4.2.Final</version></dependency><dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct-processor</artifactId><version>1.4.2.Final</version></dependency>

image-20240524085305340

2.sun-club-infra引入sun-club-common
        <dependency><groupId>com.sun.club</groupId><artifactId>sun-club-common</artifactId><version>1.0-SNAPSHOT</version></dependency>

image-20240524085626235

2.sun-club-domain层
1.引入sun-club-infra的依赖
        <!-- 引入sun-club-infra --><dependency><groupId>com.sun.club</groupId><artifactId>sun-club-infra</artifactId><version>1.0-SNAPSHOT</version></dependency>

image-20240524090625626

2.创建SubjectCategoryBO.java(只关注业务)
package com.sunxiansheng.subject.domain.entity;import lombok.Data;/*** Description:* @Author sun* @Create 2024/5/24 9:09* @Version 1.0*/
@Data
public class SubjectCategoryBO {private static final long serialVersionUID = -66163713173399755L;/*** 主键*/private Long id;/*** 分类名称*/private String categoryName;/*** 分类类型*/private Integer categoryType;/*** 图标连接*/private String imageUrl;/*** 父级id*/private Long parentId;}

image-20240524091100109

3.service层
1.SubjectCategoryDomainService.java
package com.sunxiansheng.subject.domain.service;import com.sunxiansheng.subject.domain.entity.SubjectCategoryBO;/*** Description:* @Author sun* @Create 2024/5/24 9:03* @Version 1.0*/
public interface SubjectCategoryDomainService {void add(SubjectCategoryBO subjectCategoryBO);
}
2.由于需要将BO转换为eneity,所以需要转换器SubjectCategoryConverter.java
package com.sunxiansheng.subject.domain.convert;import com.sunxiansheng.subject.domain.entity.SubjectCategoryBO;
import com.sunxiansheng.subject.infra.basic.entity.SubjectCategory;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;/*** Description:* @Author sun* @Create 2024/5/24 9:18* @Version 1.0*/
@Mapper // mapstruct的注解
public interface SubjectCategoryConverter {// INSTANCE是一个SubjectCategoryConverter的静态实例,可以直接通过SubjectCategoryConverter.INSTANCE调用内部的方法SubjectCategoryConverter INSTANCE= Mappers.getMapper(SubjectCategoryConverter.class);// 将SubjectCategoryBO转换为SubjectCategorySubjectCategory convertBoToSubjectCategory(SubjectCategoryBO subjectCategoryBO);
}

image-20240524092625918

3.SubjectCategoryDomainServiceImpl.java
package com.sunxiansheng.subject.domain.service.impl;import com.sunxiansheng.subject.domain.convert.SubjectCategoryConverter;
import com.sunxiansheng.subject.domain.entity.SubjectCategoryBO;
import com.sunxiansheng.subject.domain.service.SubjectCategoryDomainService;
import com.sunxiansheng.subject.infra.basic.entity.SubjectCategory;
import com.sunxiansheng.subject.infra.basic.service.SubjectCategoryService;import javax.annotation.Resource;/*** Description:* @Author sun* @Create 2024/5/24 9:03* @Version 1.0*/
@Service
public class SubjectCategoryDomainServiceImpl implements SubjectCategoryDomainService {@Resourceprivate SubjectCategoryService subjectCategoryService;@Overridepublic void add(SubjectCategoryBO subjectCategoryBO) {SubjectCategory subjectCategory = SubjectCategoryConverter.INSTANCE.convertBoToSubjectCategory(subjectCategoryBO);subjectCategoryService.insert(subjectCategory);}
}
3.sun-club-application-controller层
1.引入sun-club-domain的依赖
        <!-- 引入sun-club-domain --><dependency><groupId>com.sun.club</groupId><artifactId>sun-club-domain</artifactId><version>1.0-SNAPSHOT</version></dependency>

image-20240524093157459

2.转换器将DTO转换为BO SubjectCategoryDTOConverter.java
package com.sunxiansheng.subject.application.convert;import com.sunxiansheng.subject.application.dto.SubjectCategoryDTO;
import com.sunxiansheng.subject.domain.entity.SubjectCategoryBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;/*** Description:* @Author sun* @Create 2024/5/24 9:40* @Version 1.0*/
@Mapper
public interface SubjectCategoryDTOConverter {SubjectCategoryDTOConverter INSTANCE= Mappers.getMapper(SubjectCategoryDTOConverter.class);SubjectCategoryBO convertDTOToSubjectCategory(SubjectCategoryDTO subjectCategoryDTO);
}

image-20240524094752234

3.sun-club-common包中封装统一响应
1.ResultCodeEnum.java
package com.sunxiansheng.subject.common.enums;import lombok.Getter;/*** Description: 返回结果枚举* @Author sun* @Create 2024/5/24 9:53* @Version 1.0*/
@Getter
public enum ResultCodeEnum {SUCCESS(200, "成功"),FAIL(500, "失败");public int code;public String desc;ResultCodeEnum(int code, String desc) {this.code = code;this.desc = desc;}/*** 根据code获取枚举* @param code* @return*/public static ResultCodeEnum getByCode(int code) {for (ResultCodeEnum value : values()) {if (value.code == code) {return value;}}return null;}
}
2.Result.java
package com.sunxiansheng.subject.common.eneity;import com.sunxiansheng.subject.common.enums.ResultCodeEnum;
import lombok.Data;/*** Description:* @Author sun* @Create 2024/5/24 9:48* @Version 1.0*/
@Data
public class Result<T> {private Boolean success;private Integer code;private String message;private T data;/*** 成功返回结果* @return*/public static Result ok() {Result result = new Result();result.setSuccess(true);result.setCode(ResultCodeEnum.SUCCESS.getCode());result.setMessage(ResultCodeEnum.SUCCESS.getDesc());return result;}/*** 成功返回结果,携带数据* @param data* @return* @param <T>*/public static <T> Result ok(T data) {Result result = new Result();result.setSuccess(true);result.setCode(ResultCodeEnum.SUCCESS.getCode());result.setMessage(ResultCodeEnum.SUCCESS.getDesc());result.setData(data);return result;}/*** 失败返回结果* @return*/public static Result fail() {Result result = new Result();result.setSuccess(false);result.setCode(ResultCodeEnum.FAIL.getCode());result.setMessage(ResultCodeEnum.FAIL.getDesc());return result;}/*** 失败,携带数据* @param data* @return* @param <T>*/public static <T> Result fail(T data) {Result result = new Result();result.setSuccess(false);result.setCode(ResultCodeEnum.FAIL.getCode());result.setMessage(ResultCodeEnum.FAIL.getDesc());result.setData(data);return result;}}
4.SubjectCategoryController.java
package com.sunxiansheng.subject.application.controller;import com.alibaba.fastjson.JSON;
import com.sunxiansheng.subject.application.convert.SubjectCategoryDTOConverter;
import com.sunxiansheng.subject.application.dto.SubjectCategoryDTO;
import com.sunxiansheng.subject.common.eneity.Result;
import com.sunxiansheng.subject.domain.entity.SubjectCategoryBO;
import com.sunxiansheng.subject.domain.service.SubjectCategoryDomainService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** Description: 题目分类控制器* @Author sun* @Create 2024/5/24 9:33* @Version 1.0*/
@RestController
@RequestMapping("/subject/category")
public class SubjectCategoryController {@Resourceprivate SubjectCategoryDomainService subjectCategoryDomainService;@PostMapping("/add")public Result<Boolean> add(@RequestBody SubjectCategoryDTO subjectCategoryDTO) {try {SubjectCategoryBO subjectCategoryBO = SubjectCategoryDTOConverter.INSTANCE.convertDTOToSubjectCategory(subjectCategoryDTO);subjectCategoryDomainService.add(subjectCategoryBO);return Result.ok(true);} catch (Exception e) {return Result.fail();}}
}

image-20240524105641724

5.测试

image-20240524101631593

4.打印日志
1.sun-club-common引入log4j2和fastjson
        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId><version>2.4.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.24</version></dependency>

image-20240524102109158

2.SubjectCategoryController.java打印日志
  • 这里判断是否开启日志的原因是:如果不判断,则即使没开启日志,JSON还是会序列化,影响性能
            if (log.isInfoEnabled()) {log.info("SubjectCategoryController add SubjectCategoryDTO, subjectCategoryDTO:{}", JSON.toJSONString(subjectCategoryDTO));}

image-20240524102957593

3.SubjectCategoryDomainServiceImpl.java

image-20240524103208321

4.SubjectCategoryServiceImpl.java

image-20240524103344499

5.sun-club-starter 引入log4j2-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="INFO" monitorInterval="5"><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--变量配置--><Properties><!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符--><!-- %logger{36} 表示 Logger 名字最长36个字符 --><property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} %X{PFTID} [%thread] %-5level %logger{36} - %msg%n" /><!-- 定义日志存储的路径 --><property name="FILE_PATH" value="../log" /><property name="FILE_NAME" value="jcClub.log" /></Properties><!--https://logging.apache.org/log4j/2.x/manual/appenders.html--><appenders><console name="Console" target="SYSTEM_OUT"><!--输出日志的格式--><PatternLayout pattern="${LOG_PATTERN}"/><!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/></console><!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用--><File name="fileLog" fileName="${FILE_PATH}/temp.log" append="false"><PatternLayout pattern="${LOG_PATTERN}"/></File><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile><!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile><!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour--><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。--><!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效--><loggers><root level="info"><appender-ref ref="Console"/><appender-ref ref="RollingFileInfo"/><appender-ref ref="RollingFileWarn"/><appender-ref ref="RollingFileError"/><appender-ref ref="fileLog"/></root></loggers></configuration>
6.sun-club-starter的application.yml配置日志

image-20240524103748300

7.启动会报错
1.报错信息

image-20240524103854701

2.使用Maven Helper查看依赖

image-20240524104809749

3.排除掉springboot-starter-web的log

image-20240524104842840

4.再次测试

image-20240524105731421

5.参数校验
1.使用guava
1.sun-club-common引入依赖
        <!-- guava进行参数校验 --><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>19.0</version></dependency>

image-20240524110320126

2.sun-club-application-controller引入公共包
        <!-- 引入sun-club-common --><dependency><groupId>com.sun.club</groupId><artifactId>sun-club-common</artifactId><version>1.0-SNAPSHOT</version></dependency>

image-20240524110819200

3.Preconditions.checkNotNull没有生效,说明guava依赖有问题,clean一下maven,发现报错

image-20240524112009829

4.把所有relativePath全删除,因为并没有双继承,用不上,再次clean,成功!

image-20240524112139199

5.sun-club-application-controller编写SubjectCategoryController.java
// 参数校验
Preconditions.checkNotNull(subjectCategoryDTO.getCategoryType(), "分类类型不能为空");Preconditions.checkArgument(!StringUtils.isBlank(subjectCategoryDTO.getCategoryName()), "分类名称不能为空");
Preconditions.checkNotNull(subjectCategoryDTO.getParentId(), "分类父级id不能为空");

image-20240524113226527

6.端口换成3010

image-20240524113342129

2.测试

image-20240524113432866

image-20240524113501078

这篇关于社区项目-项目介绍环境搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082678

相关文章

ESP32 esp-idf esp-adf环境安装及.a库创建与编译

简介 ESP32 功能丰富的 Wi-Fi & 蓝牙 MCU, 适用于多样的物联网应用。使用freertos操作系统。 ESP-IDF 官方物联网开发框架。 ESP-ADF 官方音频开发框架。 文档参照 https://espressif-docs.readthedocs-hosted.com/projects/esp-adf/zh-cn/latest/get-started/index

揭秘未来艺术:AI绘画工具全面介绍

📑前言 随着科技的飞速发展,人工智能(AI)已经逐渐渗透到我们生活的方方面面。在艺术创作领域,AI技术同样展现出了其独特的魅力。今天,我们就来一起探索这个神秘而引人入胜的领域,深入了解AI绘画工具的奥秘及其为艺术创作带来的革命性变革。 一、AI绘画工具的崛起 1.1 颠覆传统绘画模式 在过去,绘画是艺术家们通过手中的画笔,蘸取颜料,在画布上自由挥洒的创造性过程。然而,随着AI绘画工

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

UnrealScriptIDE调试环境部署

先安装vs2010   再安装VSIsoShell.exe, 下载地址 https://pan.baidu.com/s/10kPNUuDGTbWXbz7Nos-1WA       fd3t   最后安装unside,下载地址 https://archive.codeplex.com/?p=uside  安装中间有一步选择Binary文件夹要选对路径。   安装好以后,启动 UDKDe

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

eclipse运行springboot项目,找不到主类

解决办法尝试了很多种,下载sts压缩包行不通。最后解决办法如图: help--->Eclipse Marketplace--->Popular--->找到Spring Tools 3---->Installed。

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。