伪代码
This commit is contained in:
@@ -5,8 +5,5 @@ spring:
|
|||||||
name: entrance
|
name: entrance
|
||||||
|
|
||||||
log:
|
log:
|
||||||
home: D:\logs
|
homeDir: D:\logs
|
||||||
|
commonLevel: info
|
||||||
logging:
|
|
||||||
level:
|
|
||||||
root: info
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
<configuration scan="true" scanPeriod="20 seconds" debug="false">
|
<configuration scan="true" scanPeriod="20 seconds" debug="false">
|
||||||
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
|
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
|
||||||
|
|
||||||
<springProperty scope="context" name="log.projectName" source="spring.application.name"/>
|
<springProperty scope="context" name="log.projectName" source="spring.application.name" defaultValue="entrance"/>
|
||||||
<springProperty scope="context" name="log.commonLevel" source="log.commonLevel"/>
|
<springProperty scope="context" name="logCommonLevel" source="log.commonLevel" defaultValue="info"/>
|
||||||
<springProperty scope="context" name="log.homeDir" source="log.home"/>
|
<springProperty scope="context" name="logHomeDir" source="log.homeDir" defaultValue="D:\logs"/>
|
||||||
|
|
||||||
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
|
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
|
||||||
<conversionRule conversionWord="wex"
|
<conversionRule conversionWord="wex"
|
||||||
@@ -21,10 +21,7 @@
|
|||||||
<!--客户端输出日志-->
|
<!--客户端输出日志-->
|
||||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||||
<encoder>
|
<encoder>
|
||||||
<pattern>
|
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||||
<!-- 设置日志输出格式 -->
|
|
||||||
${log.pattern}
|
|
||||||
</pattern>
|
|
||||||
<charset>UTF-8</charset>
|
<charset>UTF-8</charset>
|
||||||
</encoder>
|
</encoder>
|
||||||
</appender>
|
</appender>
|
||||||
@@ -33,7 +30,7 @@
|
|||||||
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
|
<!-- 滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件 RollingFileAppender -->
|
||||||
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
<file>
|
<file>
|
||||||
${log.homeDir}/${log.projectName}/debug/debug.log
|
${logHomeDir}/${log.projectName}/debug/debug.log
|
||||||
</file>
|
</file>
|
||||||
<!-- 如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
|
<!-- 如果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
|
||||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
@@ -48,7 +45,7 @@
|
|||||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
<!--日志输出位置 可相对、和绝对路径 -->
|
<!--日志输出位置 可相对、和绝对路径 -->
|
||||||
<fileNamePattern>
|
<fileNamePattern>
|
||||||
${log.homeDir}/${log.projectName}/debug/debug.log.%d{yyyy-MM-dd}.%i.log
|
${logHomeDir}/${log.projectName}/debug/debug.log.%d{yyyy-MM-dd}.%i.log
|
||||||
</fileNamePattern>
|
</fileNamePattern>
|
||||||
<maxFileSize>10MB</maxFileSize>
|
<maxFileSize>10MB</maxFileSize>
|
||||||
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,且<maxHistory>是6,
|
<!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,假设设置每个月滚动,且<maxHistory>是6,
|
||||||
@@ -77,11 +74,11 @@
|
|||||||
<onMismatch>DENY</onMismatch>
|
<onMismatch>DENY</onMismatch>
|
||||||
</filter>
|
</filter>
|
||||||
<file>
|
<file>
|
||||||
${log.homeDir}/${log.projectName}/info/info.log
|
${logHomeDir}/${log.projectName}/info/info.log
|
||||||
</file>
|
</file>
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
<fileNamePattern>
|
<fileNamePattern>
|
||||||
${log.homeDir}/${log.projectName}/info/info.log.%d{yyyy-MM-dd}.%i.log
|
${logHomeDir}/${log.projectName}/info/info.log.%d{yyyy-MM-dd}.%i.log
|
||||||
</fileNamePattern>
|
</fileNamePattern>
|
||||||
<maxFileSize>10MB</maxFileSize>
|
<maxFileSize>10MB</maxFileSize>
|
||||||
<maxHistory>${log.maxHistory:-30}</maxHistory>
|
<maxHistory>${log.maxHistory:-30}</maxHistory>
|
||||||
@@ -98,7 +95,7 @@
|
|||||||
<!--系统中常规的error日志-->
|
<!--系统中常规的error日志-->
|
||||||
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
|
||||||
<file>
|
<file>
|
||||||
${log.homeDir}/${log.projectName}/error/error.log
|
${logHomeDir}/${log.projectName}/error/error.log
|
||||||
</file>
|
</file>
|
||||||
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
<filter class="ch.qos.logback.classic.filter.LevelFilter">
|
||||||
<level>ERROR</level>
|
<level>ERROR</level>
|
||||||
@@ -107,7 +104,7 @@
|
|||||||
</filter>
|
</filter>
|
||||||
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
|
||||||
<fileNamePattern>
|
<fileNamePattern>
|
||||||
${log.homeDir}/${log.projectName}/error/error.log.%d{yyyy-MM-dd}.%i.log
|
${logHomeDir}/${log.projectName}/error/error.log.%d{yyyy-MM-dd}.%i.log
|
||||||
</fileNamePattern>
|
</fileNamePattern>
|
||||||
<maxFileSize>10MB</maxFileSize>
|
<maxFileSize>10MB</maxFileSize>
|
||||||
<maxHistory>${log.maxHistory:-30}</maxHistory>
|
<maxHistory>${log.maxHistory:-30}</maxHistory>
|
||||||
@@ -133,7 +130,7 @@
|
|||||||
<appender-ref ref="ERROR"/>
|
<appender-ref ref="ERROR"/>
|
||||||
</logger>
|
</logger>
|
||||||
|
|
||||||
<root level="${log.commonLevel}">
|
<root level="${logCommonLevel}">
|
||||||
<appender-ref ref="CONSOLE"/>
|
<appender-ref ref="CONSOLE"/>
|
||||||
<appender-ref ref="DEBUG"/>
|
<appender-ref ref="DEBUG"/>
|
||||||
<appender-ref ref="INFO"/>
|
<appender-ref ref="INFO"/>
|
||||||
|
|||||||
8
system/Readme.md
Normal file
8
system/Readme.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#### 简介
|
||||||
|
系统模块主要包含以下功能:
|
||||||
|
* 审计日志管理
|
||||||
|
* 字典、树形字典管理
|
||||||
|
* 主题管理
|
||||||
|
* 系统文件资源管理
|
||||||
|
* 定时任务管理
|
||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package com.njcn.gather.system.auth.controller;
|
||||||
|
|
||||||
|
import com.njcn.common.pojo.response.HttpResult;
|
||||||
|
import com.njcn.gather.system.auth.pojo.Token;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("admin")
|
||||||
|
public class AuthController {
|
||||||
|
|
||||||
|
@RequestMapping("/login")
|
||||||
|
public HttpResult<Token> login() {
|
||||||
|
Token token = new Token();
|
||||||
|
token.setAccessToken("bqddxxwqmfncffacvbpkuxvwvqrhln");
|
||||||
|
HttpResult<Token> result = new HttpResult<>();
|
||||||
|
result.setMessage("成功");
|
||||||
|
result.setCode("200");
|
||||||
|
result.setData(token);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RequestMapping("/logout")
|
||||||
|
public HttpResult<String> logout() {
|
||||||
|
HttpResult<String> result = new HttpResult<>();
|
||||||
|
result.setMessage("成功");
|
||||||
|
result.setCode("200");
|
||||||
|
result.setData("退出成功");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package com.njcn.gather.system.auth.pojo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class Token {
|
||||||
|
|
||||||
|
private String accessToken;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
package com.njcn.gather.system.controller;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
@Slf4j
|
|
||||||
@RestController
|
|
||||||
public class Hello {
|
|
||||||
|
|
||||||
@RequestMapping("/hello")
|
|
||||||
public String hello(){
|
|
||||||
log.info("hello");
|
|
||||||
return "hello";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.njcn.gather.system.menu.controller;
|
||||||
|
|
||||||
|
import com.njcn.common.pojo.response.HttpResult;
|
||||||
|
import com.njcn.gather.system.menu.pojo.ButtonVO;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("admin")
|
||||||
|
public class ButtonController {
|
||||||
|
|
||||||
|
@RequestMapping("/auth/buttons")
|
||||||
|
public HttpResult<ButtonVO> buttons() {
|
||||||
|
ButtonVO buttonVO = new ButtonVO();
|
||||||
|
HttpResult<ButtonVO> result = new HttpResult<>();
|
||||||
|
result.setMessage("成功");
|
||||||
|
result.setCode("200");
|
||||||
|
result.setData(buttonVO);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
package com.njcn.gather.system.menu.controller;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import com.njcn.common.pojo.response.HttpResult;
|
||||||
|
import com.njcn.gather.system.menu.pojo.MenuVO;
|
||||||
|
import com.njcn.gather.system.menu.pojo.MetaVO;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("admin")
|
||||||
|
public class MenuController {
|
||||||
|
|
||||||
|
@RequestMapping("/menu/list")
|
||||||
|
public HttpResult<List<MenuVO>> menuList() {
|
||||||
|
|
||||||
|
List<MenuVO> menuVOList = new ArrayList<>();
|
||||||
|
|
||||||
|
MenuVO menuVO = new MenuVO();
|
||||||
|
menuVO.setPath("/home/index");
|
||||||
|
menuVO.setName("home");
|
||||||
|
menuVO.setComponent("/home/index");
|
||||||
|
|
||||||
|
MetaVO metaVO = new MetaVO();
|
||||||
|
metaVO.setIcon("HomeFilled");
|
||||||
|
metaVO.setTitle("检测计划");
|
||||||
|
metaVO.setIsLink("");
|
||||||
|
metaVO.setHide(false);
|
||||||
|
metaVO.setFull(false);
|
||||||
|
metaVO.setAffix(true);
|
||||||
|
metaVO.setKeepAlive(true);
|
||||||
|
|
||||||
|
menuVO.setMeta(metaVO);
|
||||||
|
menuVOList.add(menuVO);
|
||||||
|
|
||||||
|
MenuVO menuVO1 = getMenuVORedirect("/machine","machine","/machine/testScript","Operation","台账管理");
|
||||||
|
MenuVO menuVO11 = getMenuVO("/machine/testScript","testScript","/machine/testScript/index","Document","检测脚本");
|
||||||
|
MenuVO menuVO12 = getMenuVO("/machine/device","device","/machine/device/index","Cpu","被检设备");
|
||||||
|
MenuVO menuVO13 = getMenuVO("/machine/errorSystem","errorSystem","/machine/errorSystem/index","Tickets","误差体系");
|
||||||
|
MenuVO menuVO14 = getMenuVO("/machine/testSource","testSource","/machine/testSource/index","Help","检测源");
|
||||||
|
menuVO1.setChildren(CollectionUtil.toList(menuVO11,menuVO12,menuVO13,menuVO14));
|
||||||
|
menuVOList.add(menuVO1);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MenuVO menuVO2 = getMenuVORedirect("/authority","authority","/authority/user","Menu","权限管理");
|
||||||
|
MenuVO menuVO21 = getMenuVO("/authority/user","user","/authority/user/index","UserFilled","用户管理");
|
||||||
|
MenuVO menuVO22 = getMenuVO("/authority/role","role","/authority/role/index","Avatar","角色管理");
|
||||||
|
MenuVO menuVO23 = getMenuVO("/authority/resource","resource","/authority/resource/index","Connection","菜单管理");
|
||||||
|
menuVO2.setChildren(CollectionUtil.toList(menuVO21,menuVO22,menuVO23));
|
||||||
|
menuVOList.add(menuVO2);
|
||||||
|
|
||||||
|
|
||||||
|
MenuVO menuVO3 = getMenuVORedirect("/system","system","/system/base","Tools","系统配置");
|
||||||
|
MenuVO menuVO31 = getMenuVO("/system/base","base","/system/base/index","UserFilled","通用配置");
|
||||||
|
MenuVO menuVO32 = getMenuVO("/system/dict","dict","/system/dict/index","DataAnalysis","数据字典");
|
||||||
|
MenuVO menuVO33 = getMenuVO("/system/template","template","/system/template/index","Memo","报告模板");
|
||||||
|
MenuVO menuVO34 = getMenuVO("/system/versionRegister","versionRegister","/system/versionRegister/index","SetUp","版本注册");
|
||||||
|
menuVO3.setChildren(CollectionUtil.toList(menuVO31,menuVO32,menuVO33,menuVO34));
|
||||||
|
menuVOList.add(menuVO3);
|
||||||
|
|
||||||
|
MenuVO menuVO4 = getMenuVO("/log","log","/log/index","TrendCharts","日志管理");
|
||||||
|
menuVOList.add(menuVO4);
|
||||||
|
|
||||||
|
|
||||||
|
MenuVO menuVO5 = getMenuVO("/analyse","analyse","/analyse/index","Monitor","统计分析");
|
||||||
|
menuVOList.add(menuVO5);
|
||||||
|
|
||||||
|
|
||||||
|
MenuVO menuVO6 = getMenuVORedirect("/demo","demo","/system/demo","Tools","示例");
|
||||||
|
MenuVO menuVO61 = getMenuVO("/system/proTable","table","/demo/proTable/index","UserFilled","普通表格");
|
||||||
|
MenuVO menuVO62 = getMenuVO("/system/proTableTree","tableTree","/demo/proTableTree/index","DataAnalysis","表格树");
|
||||||
|
menuVO6.setChildren(CollectionUtil.toList(menuVO61,menuVO62));
|
||||||
|
menuVOList.add(menuVO6);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
HttpResult<List<MenuVO>> result = new HttpResult<>();
|
||||||
|
result.setData(menuVOList);
|
||||||
|
result.setCode("200");
|
||||||
|
result.setMessage("成功");
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MenuVO getMenuVO(String path, String name, String component,String icon,String title) {
|
||||||
|
MenuVO menu = new MenuVO();
|
||||||
|
menu.setPath(path);
|
||||||
|
menu.setName(name);
|
||||||
|
menu.setComponent(component);
|
||||||
|
|
||||||
|
MetaVO meta = new MetaVO();
|
||||||
|
meta.setIcon(icon);
|
||||||
|
meta.setTitle(title);
|
||||||
|
meta.setIsLink("");
|
||||||
|
meta.setHide(false);
|
||||||
|
meta.setFull(false);
|
||||||
|
meta.setAffix(false);
|
||||||
|
meta.setKeepAlive(true);
|
||||||
|
|
||||||
|
menu.setMeta(meta);
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MenuVO getMenuVORedirect(String path, String name, String component,String icon,String title) {
|
||||||
|
MenuVO menu = new MenuVO();
|
||||||
|
menu.setPath(path);
|
||||||
|
menu.setName(name);
|
||||||
|
menu.setRedirect(component);
|
||||||
|
|
||||||
|
MetaVO meta = new MetaVO();
|
||||||
|
meta.setIcon(icon);
|
||||||
|
meta.setTitle(title);
|
||||||
|
meta.setIsLink("");
|
||||||
|
meta.setHide(false);
|
||||||
|
meta.setFull(false);
|
||||||
|
meta.setAffix(false);
|
||||||
|
meta.setKeepAlive(true);
|
||||||
|
|
||||||
|
menu.setMeta(meta);
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package com.njcn.gather.system.menu.pojo;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ButtonVO {
|
||||||
|
|
||||||
|
private List<String> useProTable = CollectionUtil.toList("add",
|
||||||
|
"batchAdd",
|
||||||
|
"export",
|
||||||
|
"batchDelete",
|
||||||
|
"status");
|
||||||
|
private List<String> authButton = CollectionUtil.toList( "add",
|
||||||
|
"edit",
|
||||||
|
"delete",
|
||||||
|
"import",
|
||||||
|
"export");
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.njcn.gather.system.menu.pojo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class MenuVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路由菜单访问路径
|
||||||
|
*/
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路由 name (对应页面组件 name, 可用作 KeepAlive 缓存标识 && 按钮权限筛选)
|
||||||
|
*/
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 视图文件路径
|
||||||
|
*/
|
||||||
|
private String component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路由重定向地址
|
||||||
|
*/
|
||||||
|
private String redirect;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路由菜单元信息
|
||||||
|
*/
|
||||||
|
private MetaVO meta;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 子集路由菜单信息
|
||||||
|
*/
|
||||||
|
private List<MenuVO> children;
|
||||||
|
}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package com.njcn.gather.system.menu.pojo;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class MetaVO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 菜单和面包屑对应的图标
|
||||||
|
*/
|
||||||
|
private String icon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路由标题 (用作 document.title || 菜单的名称)
|
||||||
|
*/
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路由外链时填写的访问地址
|
||||||
|
*/
|
||||||
|
@JsonProperty("isLink")
|
||||||
|
private String isLink;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否在菜单中隐藏 (通常列表详情页需要隐藏)
|
||||||
|
*/
|
||||||
|
@JsonProperty("isHide")
|
||||||
|
private boolean isHide;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 菜单是否全屏 (示例:数据大屏页面)
|
||||||
|
*/
|
||||||
|
@JsonProperty("isFull")
|
||||||
|
private boolean isFull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 菜单是否固定在标签页中 (首页通常是固定项)
|
||||||
|
*/
|
||||||
|
@JsonProperty("isAffix")
|
||||||
|
private boolean isAffix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前路由是否缓存
|
||||||
|
*/
|
||||||
|
@JsonProperty("isKeepAlive")
|
||||||
|
private boolean isKeepAlive;
|
||||||
|
|
||||||
|
}
|
||||||
8
user/Readme.md
Normal file
8
user/Readme.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#### 简介
|
||||||
|
用户模块主要包含以下功能:
|
||||||
|
* 用户管理
|
||||||
|
* 部门管理
|
||||||
|
* 职位管理(非必须)
|
||||||
|
* 菜单资源管理
|
||||||
|
* 认证管理
|
||||||
|
|
||||||
Reference in New Issue
Block a user