medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysIndexController.java
@@ -1,28 +1,43 @@ package com.sinata.web.controller.backend.system; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.sinata.common.config.RuoYiConfig; import com.sinata.common.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * 首页 * * @author ruoyi */ @RestController @Controller public class SysIndexController { /** 系统基础配置 */ @Autowired private RuoYiConfig ruoyiConfig; @Value("${spring.profiles.active}") private String env; @RequestMapping("/") public String index() { if (!env.equals("dev")) { return "redirect:/msg"; } else { return "redirect:/doc.html"; } } /** * 访问首页,提示语 */ @RequestMapping("/") public String index() @RequestMapping("/msg") @ResponseBody public String msg() { return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion()); } medicalWaste-admin/src/main/java/com/sinata/web/controller/backend/system/SysUserController.java
@@ -3,20 +3,27 @@ import com.sinata.common.annotation.Log; import com.sinata.common.core.controller.BaseController; import com.sinata.common.core.domain.AjaxResult; import com.sinata.common.core.domain.R; import com.sinata.common.core.domain.entity.SysDept; import com.sinata.common.core.domain.entity.SysRole; import com.sinata.common.core.domain.entity.SysUser; import com.sinata.common.core.page.TableDataInfo; import com.sinata.common.entity.PageDTO; import com.sinata.common.enums.BusinessType; import com.sinata.common.utils.SecurityUtils; import com.sinata.common.utils.StringUtils; import com.sinata.common.utils.poi.ExcelUtil; import com.sinata.system.domain.dto.SysUserDTO; import com.sinata.system.domain.dto.SysUserStatusDTO; import com.sinata.system.domain.query.SysUserQuery; import com.sinata.system.domain.vo.SysUserVO; import com.sinata.system.service.ISysDeptService; import com.sinata.system.service.ISysPostService; import com.sinata.system.service.ISysRoleService; import com.sinata.system.service.ISysUserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; @@ -31,6 +38,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.List; import java.util.stream.Collectors; @@ -40,6 +48,7 @@ * @author ruoyi */ @Api(tags = {"管理后台-用户管理"}) @Validated @RestController @RequestMapping("/backend/system/user") public class SysUserController extends BaseController @@ -56,6 +65,82 @@ @Autowired private ISysPostService postService; /** * 用户分页列表 * * @param query * @return */ @ApiOperation("用户分页列表") @PostMapping("/page") public R<PageDTO<SysUserVO>> pageList(@RequestBody SysUserQuery query) { return R.ok(userService.pageList(query)); } /** * 新增用户 * * @param dto * @return */ @ApiOperation("新增用户") @PostMapping("/add") public R<?> add(@Valid @RequestBody SysUserDTO dto) { userService.add(dto); return R.ok(); } /** * 编辑用户 * * @param dto * @return */ @ApiOperation("编辑用户") @PostMapping("/edit") public R<?> edit(@Valid @RequestBody SysUserDTO dto) { userService.edit(dto); return R.ok(); } /** * 查询用户详情 * * @param userId * @return */ @ApiOperation("用户详情") @GetMapping("/detail/{userId}") public R<SysUserVO> getDetailInfo(@ApiParam(name = "userId", value = "用户id", required = true) @PathVariable("userId") Long userId) { return R.ok(userService.getDetailInfo(userId)); } /** * 批量修改账号状态 * * @param userIds * @param status * @return */ @ApiOperation("批量修改账号状态") @PostMapping("/updStatusBatch") public R<?> updStatusBatch(@Valid @RequestBody SysUserStatusDTO dto) { userService.updStatusBatch(dto); return R.ok(); } /** * 批量删除 * * @param userIds * @return */ @ApiOperation("批量删除") @PostMapping("/delBatch") public R<?> delBatch(@RequestBody List<Long> userIds) { userService.delBatch(userIds); return R.ok(); } /** * 获取用户列表 */ @@ -124,7 +209,6 @@ */ //@PreAuthorize("@ss.hasPermi('system:user:add')") @Log(title = "用户管理", businessType = BusinessType.INSERT) @ApiOperation(value = "新增用户") @PostMapping public AjaxResult add(@Validated @RequestBody SysUser user) { medicalWaste-admin/src/main/resources/application-dev.yml
New file @@ -0,0 +1,214 @@ # 项目相关配置 ruoyi: # 名称 name: RuoYi # 版本 version: 3.8.8 # 版权年份 copyrightYear: 2024 # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数字计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.sinata: debug org.springframework: warn # 用户配置 user: password: # 密码最大错误次数 maxRetryCount: 5 # 密码锁定时间(默认10分钟) lockTime: 10 # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: localhost # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 password: 123456 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # 数据源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: dm.jdbc.driver.DmDriver # driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: # url: jdbc:mysql://localhost:3306/medical_waste?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:dm://127.0.0.1:5236/MEDICAL_WASTE?schema=MEDICAL_WASTE username: SYSDBA password: SYSDBA # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false url: username: password: # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置连接超时时间 connectTimeout: 30000 # 配置网络超时时间 socketTimeout: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true jackson: # 全局设置@JsonFormat的格式pattern date-format: yyyy-MM-dd HH:mm:ss # 设置全局时区 time-zone: GMT+8 # 当地时区 locale: zh_CN # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 720 # MyBatis配置 mybatis-plus: # 搜索指定包别名 typeAliasesPackage: com.sinata.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 # configLocation: classpath:mybatis/mybatis-config.xml configuration: # 自动驼峰命名规则(camel case)映射 mapUnderscoreToCamelCase: true # MyBatis 自动映射策略 # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 autoMappingBehavior: PARTIAL # MyBatis 自动映射时未知列或未知属性处理策 # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 autoMappingUnknownColumnBehavior: NONE # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl global-config: db-config: logic-delete-field: del_flag logic-delete-value: 1 logic-not-delete-value: 0 banner: true # PageHelper分页插件 pagehelper: helperDialect: oracle supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: / # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* medicalWaste-admin/src/main/resources/application-druid.yml
medicalWaste-admin/src/main/resources/application-prod.yml
New file @@ -0,0 +1,214 @@ # 项目相关配置 ruoyi: # 名称 name: RuoYi # 版本 version: 3.8.8 # 版权年份 copyrightYear: 2024 # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数字计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.sinata: debug org.springframework: warn # 用户配置 user: password: # 密码最大错误次数 maxRetryCount: 5 # 密码锁定时间(默认10分钟) lockTime: 10 # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: localhost # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 password: 123456 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # 数据源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: dm.jdbc.driver.DmDriver # driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: # url: jdbc:mysql://localhost:3306/medical_waste?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:dm://127.0.0.1:5236/MEDICAL_WASTE?schema=MEDICAL_WASTE username: SYSDBA password: SYSDBA # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false url: username: password: # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置连接超时时间 connectTimeout: 30000 # 配置网络超时时间 socketTimeout: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true jackson: # 全局设置@JsonFormat的格式pattern date-format: yyyy-MM-dd HH:mm:ss # 设置全局时区 time-zone: GMT+8 # 当地时区 locale: zh_CN # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 720 # MyBatis配置 mybatis-plus: # 搜索指定包别名 typeAliasesPackage: com.sinata.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 # configLocation: classpath:mybatis/mybatis-config.xml configuration: # 自动驼峰命名规则(camel case)映射 mapUnderscoreToCamelCase: true # MyBatis 自动映射策略 # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 autoMappingBehavior: PARTIAL # MyBatis 自动映射时未知列或未知属性处理策 # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 autoMappingUnknownColumnBehavior: NONE # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl global-config: db-config: logic-delete-field: del_flag logic-delete-value: 1 logic-not-delete-value: 0 banner: true # PageHelper分页插件 pagehelper: helperDialect: oracle supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: / # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* medicalWaste-admin/src/main/resources/application.yml
@@ -1,214 +1,3 @@ # 项目相关配置 ruoyi: # 名称 name: RuoYi # 版本 version: 3.8.8 # 版权年份 copyrightYear: 2024 # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数字计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.sinata: debug org.springframework: warn # 用户配置 user: password: # 密码最大错误次数 maxRetryCount: 5 # 密码锁定时间(默认10分钟) lockTime: 10 # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: localhost # 端口,默认为6379 port: 6379 # 数据库索引 database: 0 # 密码 password: 123456 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # 数据源配置 datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: dm.jdbc.driver.DmDriver # driverClassName: com.mysql.cj.jdbc.Driver druid: # 主库数据源 master: # url: jdbc:mysql://localhost:3306/medical_waste?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:dm://127.0.0.1:5236/MEDICAL_WASTE?schema=MEDICAL_WASTE username: SYSDBA password: SYSDBA # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false url: username: password: # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置连接超时时间 connectTimeout: 30000 # 配置网络超时时间 socketTimeout: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true jackson: # 全局设置@JsonFormat的格式pattern date-format: yyyy-MM-dd HH:mm:ss # 设置全局时区 time-zone: GMT+8 # 当地时区 locale: zh_CN # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 720 # MyBatis配置 mybatis-plus: # 搜索指定包别名 typeAliasesPackage: com.sinata.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 # configLocation: classpath:mybatis/mybatis-config.xml configuration: # 自动驼峰命名规则(camel case)映射 mapUnderscoreToCamelCase: true # MyBatis 自动映射策略 # NONE:不启用 PARTIAL:只对非嵌套 resultMap 自动映射 FULL:对所有 resultMap 自动映射 autoMappingBehavior: PARTIAL # MyBatis 自动映射时未知列或未知属性处理策 # NONE:不做处理 WARNING:打印相关警告 FAILING:抛出异常和详细信息 autoMappingUnknownColumnBehavior: NONE # 更详细的日志输出 会有性能损耗 org.apache.ibatis.logging.stdout.StdOutImpl # 关闭日志记录 (可单纯使用 p6spy 分析) org.apache.ibatis.logging.nologging.NoLoggingImpl # 默认日志输出 org.apache.ibatis.logging.slf4j.Slf4jImpl logImpl: org.apache.ibatis.logging.slf4j.Slf4jImpl global-config: db-config: logic-delete-field: del_flag logic-delete-value: 1 logic-not-delete-value: 0 banner: true # PageHelper分页插件 pagehelper: helperDialect: oracle supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: / # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* profiles: active: prod medicalWaste-common/src/main/java/com/sinata/common/core/domain/BaseEntity.java
@@ -1,6 +1,5 @@ package com.sinata.common.core.domain; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -26,21 +25,21 @@ private String searchValue; /** 创建者 */ @TableField(value = "create_by", fill = FieldFill.INSERT) @TableField(value = "create_by") private String createBy; /** 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "create_time", fill = FieldFill.INSERT) @TableField(value = "create_time") private Date createTime; /** 更新者 */ @TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE) @TableField(value = "update_by") private String updateBy; /** 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE) @TableField(value = "update_time") private Date updateTime; /** 备注 */ medicalWaste-common/src/main/java/com/sinata/common/core/domain/entity/SysUser.java
@@ -1,16 +1,23 @@ package com.sinata.common.core.domain.entity; import java.util.Date; import java.util.List; import javax.validation.constraints.*; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.sinata.common.annotation.Excel; import com.sinata.common.annotation.Excel.ColumnType; import com.sinata.common.annotation.Excel.Type; import com.sinata.common.annotation.Excels; import com.sinata.common.core.domain.BaseEntity; import com.sinata.common.xss.Xss; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.util.Date; import java.util.List; /** * 用户对象 sys_user @@ -23,6 +30,7 @@ /** 用户ID */ @Excel(name = "用户序号", type = Type.EXPORT, cellType = ColumnType.NUMERIC, prompt = "用户编号") @TableId(type = IdType.AUTO) private Long userId; /** 部门ID */ @@ -60,6 +68,7 @@ private String status; /** 删除标志(0代表存在 2代表删除) */ @TableLogic private String delFlag; /** 最后登录IP */ @@ -75,25 +84,72 @@ @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT), @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT) }) @TableField(exist = false) private SysDept dept; /** 角色对象 */ @TableField(exist = false) private List<SysRole> roles; /** 角色组 */ @TableField(exist = false) private Long[] roleIds; /** 岗位组 */ @TableField(exist = false) private Long[] postIds; /** 角色ID */ @TableField(exist = false) private Long roleId; /** * 微信openId */ @TableField("OPEN_ID") private String openId; /** * 绑定车辆id */ @TableField("CAR_ID") private Long carId; /** * 区域id/机构id/单位id */ @TableField("DEPARTMENT_ID") private Long departmentId; public SysUser() { } public String getOpenId() { return openId; } public void setOpenId(String openId) { this.openId = openId; } public Long getCarId() { return carId; } public void setCarId(Long carId) { this.carId = carId; } public Long getDepartmentId() { return departmentId; } public void setDepartmentId(Long departmentId) { this.departmentId = departmentId; } public SysUser(Long userId) { this.userId = userId; medicalWaste-framework/src/main/java/com/sinata/framework/config/SecurityConfig.java
@@ -113,7 +113,7 @@ // 对于登录login 注册register 验证码captchaImage 允许匿名访问 requests.antMatchers("/backend/login", "/register", "/captchaImage").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers(HttpMethod.GET, "/", "/msg", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated(); medicalWaste-system/src/main/java/com/sinata/system/domain/SysDepartmentInfo.java
@@ -38,11 +38,11 @@ @ApiModelProperty("机构级别(数据字典id)") @TableField("INSTITUTION_LEVEL") private Integer institutionLevel; private Long institutionLevel; @ApiModelProperty("机构性质(数据字典id)") @TableField("INSTITUTION_TYPE") private Integer institutionType; private Long institutionType; @ApiModelProperty("每日产废范围起") @TableField("DAILY_MIN_WASTE_QUANTITY") medicalWaste-system/src/main/java/com/sinata/system/domain/dto/SysUserDTO.java
New file @@ -0,0 +1,39 @@ package com.sinata.system.domain.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * @author mitao * @date 2024/12/6 */ @Data @ApiModel("用户数据传输对象") public class SysUserDTO { @ApiModelProperty(value = "用户id", notes = "新增不传,编辑必传") private Long userId; @ApiModelProperty(value = "机构id") @NotNull(message = "机构id不能为空") private Long departmentId; @ApiModelProperty(value = "姓名") @NotBlank(message = "姓名不能为空") private String nickName; @ApiModelProperty(value = "用户名(手机号)") @NotBlank(message = "用户名不能为空") private String userName; @ApiModelProperty(value = "登录密码") private String password; @ApiModelProperty("角色id") @NotNull(message = "角色id不能为空") private Long roleId; } medicalWaste-system/src/main/java/com/sinata/system/domain/dto/SysUserStatusDTO.java
New file @@ -0,0 +1,26 @@ package com.sinata.system.domain.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import java.util.List; /** * @author mitao * @date 2024/12/6 */ @Data @ApiModel("用户状态数据传输对象") public class SysUserStatusDTO { @ApiModelProperty("用户id列表") @NotEmpty(message = "用户id列表不能为空") private List<Long> userIds; @ApiModelProperty("账号状态 0:启用 1:禁用") @NotBlank(message = "账号状态不能为空") private String status; } medicalWaste-system/src/main/java/com/sinata/system/domain/query/SysUserQuery.java
New file @@ -0,0 +1,27 @@ package com.sinata.system.domain.query; import com.sinata.common.entity.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * @author mitao * @date 2024/12/5 */ @Data @EqualsAndHashCode(callSuper = true) @ApiModel("用户查询对象") public class SysUserQuery extends BasePage { private static final long serialVersionUID = 685950217989591434L; @ApiModelProperty("机构id") private Long departmentId; @ApiModelProperty("姓名") private String nickName; @ApiModelProperty("角色id") private Long roleId; } medicalWaste-system/src/main/java/com/sinata/system/domain/vo/SysUserVO.java
New file @@ -0,0 +1,37 @@ package com.sinata.system.domain.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author mitao * @date 2024/12/5 */ @Data @ApiModel("用户视图对象") public class SysUserVO { @ApiModelProperty("用户id") private Long userId; @ApiModelProperty("用户名") private String nickName; @ApiModelProperty("用户名") private String userName; @ApiModelProperty("角色") private String roleName; @ApiModelProperty("账号状态 0:正常 1:停用") private String status; @ApiModelProperty(value = "机构id") private Long departmentId; @ApiModelProperty(value = "登录密码") private String password; @ApiModelProperty("角色id") private Long roleId; } medicalWaste-system/src/main/java/com/sinata/system/mapper/SysUserMapper.java
@@ -1,15 +1,19 @@ package com.sinata.system.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.sinata.common.core.domain.entity.SysUser; import com.sinata.system.domain.vo.SysUserVO; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 用户表 数据层 * * @author ruoyi */ public interface SysUserMapper public interface SysUserMapper extends BaseMapper<SysUser> { /** * 根据条件分页查询用户列表 @@ -124,4 +128,15 @@ * @return 结果 */ public SysUser checkEmailUnique(String email); /** * 分页查询用户 * * @param sysUserVOPage * @param departmentId * @param nickName * @param roleId * @return */ Page<SysUserVO> pageList(Page<SysUserVO> sysUserVOPage, @Param("departmentId") Long departmentId, @Param("nickName") String nickName, @Param("roleId") Long roleId, @Param("treeCode") String treeCode); } medicalWaste-system/src/main/java/com/sinata/system/mapper/SysUserRoleMapper.java
@@ -1,15 +1,17 @@ package com.sinata.system.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.sinata.system.domain.SysUserRole; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 用户与角色关联表 数据层 * * @author ruoyi */ public interface SysUserRoleMapper public interface SysUserRoleMapper extends BaseMapper<SysUserRole> { /** * 通过用户ID删除用户和角色关联 medicalWaste-system/src/main/java/com/sinata/system/service/ISysUserService.java
@@ -1,14 +1,21 @@ package com.sinata.system.service; import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; import com.sinata.common.core.domain.entity.SysUser; import com.sinata.common.entity.PageDTO; import com.sinata.system.domain.dto.SysUserDTO; import com.sinata.system.domain.dto.SysUserStatusDTO; import com.sinata.system.domain.query.SysUserQuery; import com.sinata.system.domain.vo.SysUserVO; import java.util.List; /** * 用户 业务层 * * @author ruoyi */ public interface ISysUserService public interface ISysUserService extends IService<SysUser> { /** * 根据条件分页查询用户列表 @@ -203,4 +210,43 @@ * @return 结果 */ public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName); PageDTO<SysUserVO> pageList(SysUserQuery query); /** * 新增用户 * * @param dto */ void add(SysUserDTO dto); /** * 编辑用户 * * @param dto */ void edit(SysUserDTO dto); /** * 查询用户详情 * * @param userId * @return */ SysUserVO getDetailInfo(Long userId); /** * 批量修改账号状态 * * @param dto@return */ void updStatusBatch(SysUserStatusDTO dto); /** * 批量删除 * * @param userIds * @return */ void delBatch(List<Long> userIds); } medicalWaste-system/src/main/java/com/sinata/system/service/SysDepartmentService.java
@@ -39,6 +39,13 @@ List<SysDepartmentVO> getRegionTree(String keyword); /** * 当前登录用户所在区域 * * @return */ SysDepartment getMyDepartment(); /** * 新增区域 * * @param dto @@ -72,5 +79,10 @@ */ String getOrgCode(Long parentId, Integer orgType); /** * 删除区域 * * @param id */ void deleteRegion(Long id); } medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysDepartmentServiceImpl.java
@@ -130,7 +130,8 @@ * * @return */ private SysDepartment getMyDepartment() { @Override public SysDepartment getMyDepartment() { Long userId = SecurityUtils.getUserId(); return baseMapper.getDepartmentByUserId(userId); } medicalWaste-system/src/main/java/com/sinata/system/service/impl/SysUserServiceImpl.java
@@ -1,27 +1,28 @@ package com.sinata.system.service.impl; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import javax.validation.Validator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.sinata.common.annotation.DataScope; import com.sinata.common.constant.UserConstants; import com.sinata.common.core.domain.entity.SysRole; import com.sinata.common.core.domain.entity.SysUser; import com.sinata.common.entity.PageDTO; import com.sinata.common.exception.ServiceException; import com.sinata.common.utils.BeanUtils; import com.sinata.common.utils.DateUtils; import com.sinata.common.utils.SecurityUtils; import com.sinata.common.utils.StringUtils; import com.sinata.common.utils.bean.BeanValidators; import com.sinata.common.utils.spring.SpringUtils; import com.sinata.system.domain.SysDepartment; import com.sinata.system.domain.SysPost; import com.sinata.system.domain.SysUserPost; import com.sinata.system.domain.SysUserRole; import com.sinata.system.domain.dto.SysUserDTO; import com.sinata.system.domain.dto.SysUserStatusDTO; import com.sinata.system.domain.query.SysUserQuery; import com.sinata.system.domain.vo.SysUserVO; import com.sinata.system.mapper.SysPostMapper; import com.sinata.system.mapper.SysRoleMapper; import com.sinata.system.mapper.SysUserMapper; @@ -30,6 +31,20 @@ import com.sinata.system.service.ISysConfigService; import com.sinata.system.service.ISysDeptService; import com.sinata.system.service.ISysUserService; import com.sinata.system.service.SysDepartmentService; import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.validation.Validator; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -37,7 +52,7 @@ * @author ruoyi */ @Service public class SysUserServiceImpl implements ISysUserService public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService { private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); @@ -64,6 +79,8 @@ @Autowired protected Validator validator; @Autowired private SysDepartmentService sysDepartmentService; /** * 根据条件分页查询用户列表 @@ -547,4 +564,129 @@ } return successMsg.toString(); } /** * 分页查询 * * @param query * @return */ @Override public PageDTO<SysUserVO> pageList(SysUserQuery query) { String treeCode = ""; if (Objects.isNull(query.getDepartmentId())) { SysDepartment myDepartment = sysDepartmentService.getMyDepartment(); if (Objects.nonNull(myDepartment)) { treeCode = myDepartment.getTreeCode(); } } Page<SysUserVO> page = baseMapper.pageList(new Page<>(query.getPageCurr(), query.getPageSize()), query.getDepartmentId(), query.getNickName(), query.getRoleId(), treeCode); return PageDTO.of(page); } /** * 新增用户 * * @param dto */ @Override @Transactional(rollbackFor = Exception.class) public void add(SysUserDTO dto) { SysUser sysUser = BeanUtils.copyBean(dto, SysUser.class); if (StringUtils.isBlank(dto.getPassword())) { throw new ServiceException("登录密码不能为空"); } if (!checkUserNameUnique(sysUser)) { throw new ServiceException("新增用户" + dto.getUserName() + "失败,登录账号已存在"); } sysUser.setPassword(SecurityUtils.encryptPassword(dto.getPassword())); sysUser.setCreateBy(SecurityUtils.getUserId().toString()); sysUser.setCreateTime(DateUtils.getNowDate()); save(sysUser); //添加用户角色关系 SysUserRole sysUserRole = new SysUserRole(); sysUserRole.setUserId(sysUser.getUserId()); sysUserRole.setRoleId(dto.getRoleId()); userRoleMapper.insert(sysUserRole); } /** * 编辑用户 * * @param dto */ @Override @Transactional(rollbackFor = Exception.class) public void edit(SysUserDTO dto) { SysUser sysUser = BeanUtils.copyBean(dto, SysUser.class); if (!checkUserNameUnique(sysUser)) { throw new ServiceException("编辑用户" + dto.getUserName() + "失败,登录账号已存在"); } if (StringUtils.isNotBlank(dto.getPassword())) { sysUser.setPassword(SecurityUtils.encryptPassword(dto.getPassword())); } sysUser.setUpdateBy(SecurityUtils.getUserId().toString()); sysUser.setUpdateTime(DateUtils.getNowDate()); updateById(sysUser); // 删除用户与角色关联 userRoleMapper.deleteUserRoleByUserId(sysUser.getUserId()); // 新增用户与角色管理 SysUserRole sysUserRole = new SysUserRole(); sysUserRole.setUserId(sysUser.getUserId()); sysUserRole.setRoleId(dto.getRoleId()); userRoleMapper.insert(sysUserRole); } /** * 查询用户详情 * * @param userId * @return */ @Override public SysUserVO getDetailInfo(Long userId) { SysUser sysUser = this.getById(userId); SysUserVO sysUserVO = null; if (Objects.nonNull(sysUser)) { sysUserVO = BeanUtils.copyBean(sysUser, SysUserVO.class); sysUserVO.setPassword(""); //查询用户角色 SysUserRole sysUserRole = userRoleMapper.selectOne(Wrappers.lambdaQuery(SysUserRole.class).eq(SysUserRole::getUserId, sysUserVO.getUserId())); if (Objects.nonNull(sysUserRole)) { sysUserVO.setRoleId(sysUserRole.getRoleId()); } } return sysUserVO; } /** * 批量修改账号状态 * * @param dto@return */ @Override @Transactional(rollbackFor = Exception.class) public void updStatusBatch(SysUserStatusDTO dto) { List<SysUser> sysUsers = this.listByIds(dto.getUserIds()); sysUsers.forEach(user -> user.setStatus(dto.getStatus())); updateBatchById(sysUsers); } /** * 批量删除 * * @param userIds * @return */ @Override @Transactional(rollbackFor = Exception.class) public void delBatch(List<Long> userIds) { Long[] userIdList = userIds.toArray(new Long[0]); if (ArrayUtils.contains(userIdList, SecurityUtils.getUserId())) { throw new ServiceException("当前账号不能删除"); } // 删除用户与角色关联 userRoleMapper.deleteUserRole(userIdList); this.removeBatchByIds(userIds); } } medicalWaste-system/src/main/resources/mapper/system/SysDepartmentMapper.xml
@@ -35,7 +35,7 @@ ID, DEPARTMENT_NAME, PARENT_ID, TREE_CODE, ORG_TYPE, ORG_CODE, ADDRESS, LONGITUDE, LATITUDE, CONTACT_PERSON, CONTACT_PHONE, REMARK, LEGAL_PERSON, UNIFIED_SOCIAL_CREDIT_CODE </sql> <select id="getDepartmentByUserId" resultType="com.sinata.system.domain.SysDepartment"> SELECT t2.* FROM SYS_USER_DEPARTMENT t1 LEFT JOIN SYS_DEPARTMENT t2 ON t1.DEPARTMENT_ID = t2.ID SELECT t2.* FROM SYS_USER t1 LEFT JOIN SYS_DEPARTMENT t2 ON t1.DEPARTMENT_ID = t2.ID <where> t1.USER_ID = #{userId} </where> medicalWaste-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -141,6 +141,34 @@ <select id="checkEmailUnique" parameterType="String" resultMap="SysUserResult"> select user_id, email from sys_user where email = #{email} and del_flag = '0' limit 1 </select> <select id="pageList" resultType="com.sinata.system.domain.vo.SysUserVO"> SELECT su.USER_ID,su.NICK_NAME, su.USER_NAME, su.STATUS, sd.DEPARTMENT_NAME, sr.ROLE_NAME FROM SYS_USER su LEFT JOIN SYS_DEPARTMENT sd ON su.DEPARTMENT_ID = sd.ID LEFT JOIN SYS_USER_ROLE sur ON sur.USER_ID = su.USER_ID LEFT JOIN SYS_ROLE sr ON sr.ROLE_ID = sur.ROLE_ID <where> <if test="departmentId != null and departmentId != ''">] sud.DEPARTMENT_ID = #{departmentId} </if> <if test="nickName != null and nickName != ''">] su.NICK_NAME LIKE CONCAT('%',#{nickName},'%') </if> <if test="roleId != null and roleId != ''">] sur.ROLE_ID = #{roleId} </if> <if test="treeCode != null and treeCode != ''"> sd.TREE_CODE LIKE CONCAT(#{treeCode},'%') </if> </where> </select> <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId"> insert into sys_user(