Browse Source

1、完成了日志框架的配置

2、以 jar 的方式部署到 Linux 上,并启动
3、完善了部分接口:同一父节点下名称不能重复
chubin
郑楚滨 3 months ago
parent
commit
1708d420d6
  1. 4
      .idea/excise-demo.iml
  2. 15
      demo/demo/README.md
  3. 51
      demo/demo/pom.xml
  4. 1
      demo/demo/src/main/java/demo/Controller/CaseInfoController.java
  5. 20
      demo/demo/src/main/java/demo/Controller/CaseTreeController.java
  6. 21
      demo/demo/src/main/java/demo/Controller/LogController.java
  7. 8
      demo/demo/src/main/java/demo/Controller/RoleController.java
  8. 5
      demo/demo/src/main/java/demo/Controller/UserController.java
  9. 13
      demo/demo/src/main/java/demo/Controller/UserRoleController.java
  10. 8
      demo/demo/src/main/java/demo/Mapper/CaseTreeMapper.java
  11. 2
      demo/demo/src/main/java/demo/Mapper/RoleMapper.java
  12. 17
      demo/demo/src/main/java/demo/Service/CaseTreeService.java
  13. 8
      demo/demo/src/main/resources/application.yml
  14. 209
      demo/demo/src/main/resources/logback.xml
  15. 78
      sql/db.sql

4
.idea/excise-demo.iml

@ -2,7 +2,9 @@
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>

15
demo/demo/README.md

@ -52,4 +52,17 @@
若无指定,则统计到当天日期
4、统计角色关联的用户数
4、统计角色关联的用户数
修改 MySQL 密码:123456->Mm,123456
修改 Redis 密码为:123456->
完成了日志框架的配置
以 jar 的方式部署到 Linux 上,并启动
完善了部分接口:同一父节点下名称不能重复

51
demo/demo/pom.xml

@ -5,11 +5,14 @@
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>demo</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- <logback.version>1.1.7</logback.version>-->
<!-- <slf4j.version>1.7.21</slf4j.version>-->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.13</spring-boot.version>
</properties>
@ -79,6 +82,23 @@
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
<!-- 日志 -->
<!-- <dependency>-->
<!-- <groupId>org.slf4j</groupId>-->
<!-- <artifactId>slf4j-api</artifactId>-->
<!-- <version>${slf4j.version}</version>-->
<!-- <scope>compile</scope>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>ch.qos.logback</groupId>-->
<!-- <artifactId>logback-core</artifactId>-->
<!-- <version>${logback.version}</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>ch.qos.logback</groupId>-->
<!-- <artifactId>logback-classic</artifactId>-->
<!-- <version>${logback.version}</version>-->
<!-- </dependency>-->
</dependencies>
<dependencyManagement>
<dependencies>
@ -110,7 +130,7 @@
<version>${spring-boot.version}</version>
<configuration>
<mainClass>demo.DemoApplication</mainClass>
<skip>true</skip>
<skip>false</skip>
</configuration>
<executions>
<execution>
@ -123,5 +143,34 @@
</plugin>
</plugins>
</build>
<!-- <build>-->
<!-- <plugins>-->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<!-- <artifactId>maven-assembly-plugin</artifactId>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <phase>package</phase>-->
<!-- <goals>-->
<!-- <goal>single</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <archive>-->
<!-- <manifest>-->
<!-- &lt;!&ndash; 填写你的main方法所在的主类&ndash;&gt;-->
<!-- <mainClass>-->
<!-- src/main/java/demo/DemoApplication.java-->
<!-- </mainClass>-->
<!-- </manifest>-->
<!-- </archive>-->
<!-- <descriptorRefs>-->
<!-- <descriptorRef>jar-with-dependencies</descriptorRef>-->
<!-- </descriptorRefs>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- </plugin>-->
<!-- </plugins>-->
<!-- </build>-->
</project>

1
demo/demo/src/main/java/demo/Controller/CaseInfoController.java

@ -103,7 +103,6 @@ public class CaseInfoController {
}
caseInfo.setNodeId(caseInfoVO.getNodeId() != null ? caseInfoVO.getNodeId() : caseInfo.getNodeId());
caseInfo.setEditor(caseInfoVO.getEditor() != null ? caseInfoVO.getEditor() : caseInfo.getEditor());
log.info(caseInfo.getEditor());
caseInfoService.update(caseInfo);
return Result.success("更新用例成功");
}

20
demo/demo/src/main/java/demo/Controller/CaseTreeController.java

@ -20,15 +20,19 @@ public class CaseTreeController {
@PostMapping("/insert")
public Result<String> insertNode(@Valid CaseTreeVO caseTreeVO) {
//确认新建节点名称未被占用
CaseTree caseTree = caseTreeService.findByNodeName(caseTreeVO.getNodeName());
if(caseTree == null) {
caseTreeService.addNode(caseTreeVO.getNodeName(), caseTreeVO.getParentNodeId(), caseTreeVO.getCreator());
return Result.success("新建节点成功");
}
else{
return Result.error(401,"节点已存在");
if(caseTreeVO.getParentNodeId() != null) {
//同一父节点下名称不能重复
List<CaseTree> caseTreeList = caseTreeService.findByNodeNameAll(caseTreeVO.getNodeName());
for(CaseTree caseTree : caseTreeList) {
if(caseTree.getIsLeaf() == 0)continue;
Integer parentNodeId = caseTree.getParentNodeId();
if(parentNodeId == caseTreeVO.getParentNodeId()) {
return Result.error(401,"同一父节点下名称不能重复");
}
}
}
caseTreeService.addNode(caseTreeVO.getNodeName(), caseTreeVO.getParentNodeId(), caseTreeVO.getCreator());
return Result.success("新建节点成功");
}
@DeleteMapping("/delete")

21
demo/demo/src/main/java/demo/Controller/LogController.java

@ -0,0 +1,21 @@
package demo.Controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class LogController {
private Logger log = LoggerFactory.getLogger(LogController.class);
@RequestMapping("/testLog")
public String testLog(String msg) {
log.info("这是info信息:{}", msg);
log.debug("这是debug信息:{}", msg);
log.warn("这是warn信息:{}", msg);
log.error("这是error信息:{}", msg);
return "success";
}
}

8
demo/demo/src/main/java/demo/Controller/RoleController.java

@ -3,19 +3,12 @@ package demo.Controller;
import demo.Entity.*;
import demo.Service.RoleService;
import demo.Service.UserRoleService;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.List;
@Slf4j
@ -85,7 +78,6 @@ public class RoleController {
@GetMapping("/query")
public Result<List<Role>> queryRole() {
List<Role> roleList = roleService.findAll();
log.info("Retrieved roles: {}", roleList);
return Result.success(roleList);
}

5
demo/demo/src/main/java/demo/Controller/UserController.java

@ -1,7 +1,6 @@
package demo.Controller;
import demo.Entity.*;
import demo.Service.RoleService;
import demo.Service.UserRoleService;
import demo.Service.UserService;
import lombok.extern.slf4j.Slf4j;
@ -14,10 +13,6 @@ import javax.transaction.Transactional;
import javax.validation.Valid;
import javax.validation.constraints.Pattern;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.List;
@Slf4j

13
demo/demo/src/main/java/demo/Controller/UserRoleController.java

@ -1,22 +1,9 @@
package demo.Controller;
import demo.Entity.*;
import demo.Service.RoleService;
import lombok.Value;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/role")

8
demo/demo/src/main/java/demo/Mapper/CaseTreeMapper.java

@ -16,8 +16,9 @@ public interface CaseTreeMapper {
@Select("SELECT * FROM case_tree WHERE NODE_NAME = #{nodeName}")
CaseTree findByNodeName(@Param("nodeName") String nodeName);
@Insert("INSERT INTO case_tree (NODE_NAME, ID_PATH, CREATOR, CREATE_TIME, EDITOR, UPDATE_TIME) VALUES (#{nodeName}, NULL, #{creator}, NOW(), #{creator}, NOW())")
void addNode(@Param("nodeName") String nodeName, @Param("creator") String creator);
@Insert("INSERT INTO case_tree (NODE_NAME, CREATOR, CREATE_TIME, UPDATE_TIME) VALUES (#{nodeName}, #{creator}, NOW(), NOW())")
@Options(useGeneratedKeys = true, keyProperty = "id")
void addNode(CaseTree caseTree);
@Update("UPDATE case_tree SET PARENT_NODE_ID = #{parentNodeId}, IS_LEAF = #{isLeaf} WHERE ID = #{id}")
void set(@Param("id") Integer id, @Param("parentNodeId") Integer parentNodeId, @Param("isLeaf") Integer isLeaf);
@ -36,4 +37,7 @@ public interface CaseTreeMapper {
@Select("SELECT * FROM case_tree")
List<CaseTree> findAll();
@Select("SELECT * FROM case_tree WHERE NODE_NAME = #{nodeName}")
List<CaseTree> findByNodeNameAll(@Param("nodeName") String nodeName);
}

2
demo/demo/src/main/java/demo/Mapper/RoleMapper.java

@ -11,7 +11,7 @@ import java.util.List;
@Mapper
public interface RoleMapper {
@Insert("insert into role(ROLE_NAME, ROLE_CODE, CREATE_TIME, UPDATE_TIME) values(#{roleName}, #{roleCode}, NOW(), NOW()")
@Insert("insert into role(ROLE_NAME, ROLE_CODE, CREATE_TIME, UPDATE_TIME) values(#{roleName}, #{roleCode}, NOW(), NOW())")
void insert(@Param("roleName") String roleName, @Param("roleCode") String roleCode);
@Select("select * from role where ROLE_NAME = #{roleName}")

17
demo/demo/src/main/java/demo/Service/CaseTreeService.java

@ -15,17 +15,26 @@ public class CaseTreeService {
@Autowired
private CaseTreeMapper caseTreeMapper;
public List<CaseTree> findByNodeNameAll(String nodeName) {
return caseTreeMapper.findByNodeNameAll(nodeName);
}
@Transactional(rollbackOn = Exception.class)
public void addNode(String nodeName, Integer parentNodeId, String creator) {
if(parentNodeId == null) {
caseTreeMapper.addNode(nodeName, creator);
CaseTree caseTree = caseTreeMapper.findByNodeName(nodeName);
CaseTree caseTree = new CaseTree();
caseTree.setNodeName(nodeName);
caseTree.setCreator(creator);
caseTreeMapper.addNode(caseTree);
caseTreeMapper.set(caseTree.getId(), caseTree.getId(), 0);
caseTreeMapper.setPath(caseTree.getId(), caseTree.getId() + "");
}
else {
caseTreeMapper.addNode(nodeName, creator);
CaseTree caseTree = caseTreeMapper.findByNodeName(nodeName);
CaseTree caseTree = new CaseTree();
caseTree.setNodeName(nodeName);
caseTree.setParentNodeId(parentNodeId);
caseTree.setCreator(creator);
caseTreeMapper.addNode(caseTree);
caseTreeMapper.set(caseTree.getId(), parentNodeId, 0);
CaseTree parentNode = caseTreeMapper.findByNodeId(parentNodeId);
caseTreeMapper.setIsLeaf(parentNodeId, parentNode.getIsLeaf() + 1);

8
demo/demo/src/main/resources/application.yml

@ -3,13 +3,15 @@ server:
spring:
datasource:
username: root
password: 123456
password: Mm,123456
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test_repo
# url: jdbc:mysql://192.168.137.128:3306/test_repo
redis:
host: localhost
host: localhsot
# host: 192.168.137.128
port: 6379
password: 123456 # 如果没有密码,可以省略
password: # 如果没有密码,可以省略
database: 0 # 默认数据库索引
timeout: 5000ms # 连接超时时间

209
demo/demo/src/main/resources/logback.xml

@ -0,0 +1,209 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 定义变量值 -->
<property name="LOG_HOME" value="./logs" />
<!-- 日志输入到命令行的appender定义 -->
<appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
</appender>
<!-- 获取比info级别高(包括info级别)但除error级别的日志 -->
<appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>DENY</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/.%d{yyyy-MM-dd}-info.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 输出error级别的日志 -->
<appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<encoder>
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/.%d{yyyy-MM-dd}-error.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
</appender>
<!-- 异步输出 -->
<appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>256</queueSize>
<appender-ref ref="INFO-LOG"/>
</appender>
<appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">
<discardingThreshold>0</discardingThreshold>
<queueSize>256</queueSize>
<appender-ref ref="ERROR-LOG"/>
</appender>
<!-- Root Logger 配置 -->
<root level="info">
<appender-ref ref="CONSOLE-LOG"/>
<appender-ref ref="ASYNC-INFO"/>
<appender-ref ref="ASYNC-ERROR"/>
</root>
</configuration>
<!--<?xml version="1.0" encoding="utf-8"?>-->
<!--&lt;!&ndash;-->
<!--根节点<configuration>,包含下面三个属性:-->
<!--scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。-->
<!--scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。-->
<!--debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。-->
<!--&ndash;&gt;-->
<!--<configuration>-->
<!-- &lt;!&ndash;-->
<!-- 子节点<property> :用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。-->
<!-- &ndash;&gt;-->
<!-- <property name="APP_NAME" value="demo"/>-->
<!-- <property name="LOG_HOME" value="logs"/>-->
<!-- &lt;!&ndash;-->
<!-- 子节点<timestamp>:获取时间戳字符串,他有两个属性key和datePattern-->
<!--   key: 标识此<timestamp> 的名字;-->
<!--   datePattern: 设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。-->
<!-- &ndash;&gt;-->
<!-- <timestamp key="TIMESTAMP" datePattern="yyyyMMddHHmmss"/>-->
<!-- &lt;!&ndash;-->
<!-- 子节点<contextName>:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。-->
<!-- 但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。-->
<!-- &ndash;&gt;-->
<!-- <contextName>${APP_NAME}-${TIMESTAMP}</contextName>-->
<!-- &lt;!&ndash; 日志输入到命令行的appender定义-->
<!-- 子节点<appender>:负责写日志的组件,它有两个必要属性name和class; name指定appender名称,class指定appender的全限定名-->
<!-- ConsoleAppender 把日志输出到控制台,有以下子节点:-->
<!--    <encoder>:对日志进行格式化。-->
<!--    <target>:字符串System.out(默认)或者System.err-->
<!-- &ndash;&gt;-->
<!-- <appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">-->
<!-- <layout class="ch.qos.logback.classic.PatternLayout">-->
<!-- <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>-->
<!-- </layout>-->
<!-- </appender>-->
<!-- &lt;!&ndash;获取比info级别高(包括info级别)但除error级别的日志-->
<!-- RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:-->
<!-- <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。-->
<!-- <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。-->
<!-- <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类-->
<!-- class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:-->
<!-- <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,-->
<!-- 如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,-->
<!-- 通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的-->
<!-- 名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”-->
<!-- 会被当做目录分隔符。-->
<!-- <maxHistory>: 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,-->
<!-- 且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。-->
<!-- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 查看当前活动文件的大小,-->
<!-- 如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:-->
<!--     <maxFileSize>:这是活动文件的大小,默认值是10MB。-->
<!--     <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,-->
<!-- 1不支持也不允许文件压缩,2不能设置file属性,必须留空。-->
<!-- <triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。-->
<!--     class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根据固定窗口算法重命名文件的滚动策略。有以下子节点:-->
<!--      <minIndex>:窗口索引最小值-->
<!--      <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。-->
<!--      <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生-->
<!-- 归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip-->
<!-- &ndash;&gt;-->
<!-- <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- &lt;!&ndash; 过滤掉error级别日志,其他级别的日志策略为ACCEPT &ndash;&gt;-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>ERROR</level>-->
<!-- <onMatch>DENY</onMatch>-->
<!-- <onMismatch>ACCEPT</onMismatch>-->
<!-- </filter>-->
<!-- <encoder>-->
<!-- <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>-->
<!-- </encoder>-->
<!-- &lt;!&ndash;滚动策略&ndash;&gt;-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${LOG_HOME}//%d-info.log</fileNamePattern>-->
<!-- <maxHistory>30</maxHistory>-->
<!-- </rollingPolicy>-->
<!-- </appender>-->
<!-- &lt;!&ndash; 输出error级别的日志 &ndash;&gt;-->
<!-- <appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- &lt;!&ndash; 只接受error级别日志 &ndash;&gt;-->
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!-- <level>ERROR</level>-->
<!-- </filter>-->
<!-- <encoder>-->
<!-- <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>-->
<!-- </encoder>-->
<!-- &lt;!&ndash;滚动策略&ndash;&gt;-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${LOG_HOME}//%d-error.log</fileNamePattern>-->
<!-- <maxHistory>30</maxHistory>-->
<!-- </rollingPolicy>-->
<!-- </appender>-->
<!-- &lt;!&ndash;-->
<!-- FileAppender:把日志添加到文件,有以下子节点:-->
<!--   <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。-->
<!--   <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。-->
<!--   <encoder>:对记录事件进行格式化。(具体参数稍后讲解 )-->
<!--   <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。-->
<!-- &ndash;&gt;-->
<!-- <appender name="File" class="ch.qos.logback.core.FileAppender">-->
<!--&lt;!&ndash; <file>/usr/local/app/${LOG_HOME}/${appName}.file.log</file>&ndash;&gt;-->
<!-- <file>E:/demo/logs/usr/local/app/${LOG_HOME}/${appName}.file.log</file>-->
<!-- <append>true</append> -->
<!-- <encoder>-->
<!-- <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>-->
<!-- </encoder>-->
<!-- </appender>-->
<!-- &lt;!&ndash; 异步输出 &ndash;&gt;-->
<!-- <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">-->
<!-- &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
<!-- <discardingThreshold>0</discardingThreshold>-->
<!-- &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
<!-- <queueSize>256</queueSize>-->
<!-- &lt;!&ndash; 添加附加的appender,最多只能添加一个 &ndash;&gt;-->
<!-- <appender-ref ref="INFO-LOG"/>-->
<!-- </appender>-->
<!-- <appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">-->
<!-- &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
<!-- <discardingThreshold>0</discardingThreshold>-->
<!-- &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
<!-- <queueSize>256</queueSize>-->
<!-- &lt;!&ndash; 添加附加的appender,最多只能添加一个 &ndash;&gt;-->
<!-- <appender-ref ref="ERROR-LOG"/>-->
<!-- </appender>-->
<!-- &lt;!&ndash;-->
<!-- 子节点<loger>:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger-->
<!-- name: 用来指定受此loger约束的某一个包或者具体的某一个类。-->
<!-- level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。-->
<!-- addtivity: 是否向上级loger传递打印信息。默认是true。同<loger>一样,可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。-->
<!-- &ndash;&gt;-->
<!-- &lt;!&ndash;<logger name="com.zjw" level="INFO" addtivity="false"/>&ndash;&gt;-->
<!-- &lt;!&ndash;-->
<!-- 子节点<root>:它也是<loger>元素,但是它是根loger,是所有<loger>的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。-->
<!--     level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能设置为INHERITED或者同义词NULL。 默认是DEBUG。-->
<!-- &ndash;&gt;-->
<!-- <root level="info">-->
<!-- <appender-ref ref="CONSOLE-LOG"/>-->
<!-- <appender-ref ref="ASYNC-INFO"/>-->
<!-- <appender-ref ref="ASYNC-ERROR"/>-->
<!-- </root>-->
<!--</configuration>-->

78
sql/db.sql

@ -0,0 +1,78 @@
drop database if exists test_repo;
create database test_repo;
use test_repo;
drop table if exists case_info;
create table case_info
(
ID tinyint auto_increment comment '主键'
primary key,
CASE_NAME varchar(100) charset utf8mb3 null comment '用例名称',
NODE_ID tinyint not null comment '用例树节点',
CREATOR varchar(32) charset utf8mb3 null comment '创建人',
CREATE_TIME datetime null comment '创建时间',
EDITOR varchar(32) charset utf8mb3 null comment '修改人',
UPDATE_TIME datetime null comment '修改时间'
)
comment '用例信息表';
drop table if exists case_tree;
create table case_tree
(
ID tinyint auto_increment comment '主键'
primary key,
NODE_NAME varchar(50) charset utf8mb3 null comment '树节点名称',
PARENT_NODE_ID tinyint null comment '父节点ID',
IS_LEAF tinyint default 0 not null comment '是否叶子节点(0-是)',
ID_PATH varchar(350) charset utf8mb3 null comment 'ID全路径',
CREATOR varchar(32) charset utf8mb3 null comment '创建人',
CREATE_TIME datetime null comment '创建时间',
EDITOR varchar(32) charset utf8mb3 null comment '修改人',
UPDATE_TIME datetime null comment '修改时间'
)
comment '用例树表';
drop table if exists role;
create table role
(
ID tinyint auto_increment comment '主键'
primary key,
ROLE_NAME varchar(50) charset utf8mb3 null comment '角色名称',
ROLE_CODE varchar(50) charset utf8mb3 null comment '角色代号(英文代号)',
CREATE_TIME datetime null comment '创建时间',
UPDATE_TIME datetime null comment '更新时间',
constraint ROLE_CODE
unique (ROLE_CODE)
)
comment '角色表';
drop table if exists user;
create table user
(
ID tinyint auto_increment comment '主键'
primary key,
LOGIN_NAME varchar(50) charset utf8mb3 null comment '用户登录名',
USER_CHN_NAME varchar(50) charset utf8mb3 null comment '用户中文名称',
CREATE_TIME datetime null comment '创建时间',
UPDATE_TIME datetime null comment '更新时间',
PASSWORD varchar(16) default '123456' not null comment '密码'
)
comment '用户信息表';
drop table if exists user_role_relation;
create table user_role_relation
(
ID tinyint auto_increment comment '主键'
primary key,
USER_ID tinyint null comment '用户ID',
ROLE_ID tinyint null comment '角色ID',
CREATE_TIME datetime null comment '创建时间'
)
comment '用户-角色关系表';
Loading…
Cancel
Save