Commit 1df2d3de authored by 蒋赟昊's avatar 蒋赟昊 👮

系统管理相关表初始化、登录、登出接口开发

parent 6c8b9d48
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
<swagger.ui.version>1.9.5</swagger.ui.version> <swagger.ui.version>1.9.5</swagger.ui.version>
<hutool.version>5.7.9</hutool.version> <hutool.version>5.7.9</hutool.version>
<shiro.version>1.7.1</shiro.version> <shiro.version>1.7.1</shiro.version>
<lang3.version>3.9</lang3.version> <lang3.version>3.12.0</lang3.version>
<fastjson.version>1.2.20</fastjson.version> <fastjson.version>1.2.20</fastjson.version>
<orai18n.version>12.1.0.2.0</orai18n.version> <orai18n.version>12.1.0.2.0</orai18n.version>
<oracle.jdbc.version>11.2.0.3</oracle.jdbc.version> <oracle.jdbc.version>11.2.0.3</oracle.jdbc.version>
......
...@@ -19,7 +19,7 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { ...@@ -19,7 +19,7 @@ public class CustomMetaObjectHandler implements MetaObjectHandler {
this.strictInsertFill(metaObject, "createTime", Date.class, new Date()); this.strictInsertFill(metaObject, "createTime", Date.class, new Date());
UserInfoVO userInfo = RequestUtil.getUserInfo(); UserInfoVO userInfo = RequestUtil.getUserInfo();
if (userInfo != null) { if (userInfo != null) {
this.strictInsertFill(metaObject, "createUser", String.class, userInfo.getUserName()); this.strictInsertFill(metaObject, "createUser", String.class, userInfo.getUsername());
} else { } else {
this.strictInsertFill(metaObject, "createUser", String.class, "auto"); this.strictInsertFill(metaObject, "createUser", String.class, "auto");
} }
...@@ -30,7 +30,7 @@ public class CustomMetaObjectHandler implements MetaObjectHandler { ...@@ -30,7 +30,7 @@ public class CustomMetaObjectHandler implements MetaObjectHandler {
this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date());
UserInfoVO userInfo = RequestUtil.getUserInfo(); UserInfoVO userInfo = RequestUtil.getUserInfo();
if (userInfo != null) { if (userInfo != null) {
this.strictUpdateFill(metaObject, "updateUser", String.class, userInfo.getUserName()); this.strictUpdateFill(metaObject, "updateUser", String.class, userInfo.getUsername());
} else { } else {
this.strictUpdateFill(metaObject, "updateUser", String.class, "auto"); this.strictUpdateFill(metaObject, "updateUser", String.class, "auto");
} }
......
package com.fxkc.care.controller;
import com.fxkc.care.common.AjaxResult;
import com.fxkc.care.service.IUserInfoService;
import com.fxkc.care.vo.UserInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
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.servlet.http.HttpServletResponse;
/**
* @author JYH
* @date 2024/12/14 16:31
* @describe
*/
@Api(value = "登录管理", tags = {"登录管理"})
@RestController
@RequestMapping("/login")
public class LoginController {
@Autowired
private IUserInfoService userInfoService;
@ApiOperation("登录")
@PostMapping("/doLogin")
public AjaxResult localLogin(@RequestBody UserInfoVO userInfoVO, HttpServletResponse response) {
return userInfoService.doLogin(userInfoVO, response);
}
@ApiOperation("退出登录")
@PostMapping("/logout")
public AjaxResult logout() {
return userInfoService.logout();
}
}
package com.fxkc.care.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 菜单表 前端控制器
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@RestController
@RequestMapping("//menu-info")
public class MenuInfoController {
}
package com.fxkc.care.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 角色表 前端控制器
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@RestController
@RequestMapping("//role-info")
public class RoleInfoController {
}
package com.fxkc.care.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 角色菜单表 前端控制器
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@RestController
@RequestMapping("//role-menu")
public class RoleMenuController {
}
package com.fxkc.care.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 字典子项表 前端控制器
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@RestController
@RequestMapping("//sys-dict-item")
public class SysDictItemController {
}
package com.fxkc.care.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 系统字典类型表 前端控制器
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@RestController
@RequestMapping("//sys-dict-type")
public class SysDictTypeController {
}
package com.fxkc.care.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fxkc.care.common.AjaxResult;
import com.fxkc.care.config.RepeatSubmitValidation;
import com.fxkc.care.domain.UserInfo;
import com.fxkc.care.domain.UserRole;
import com.fxkc.care.dto.UserInfoAddDTO;
import com.fxkc.care.dto.UserInfoEditDTO;
import com.fxkc.care.service.IUserInfoService;
import com.fxkc.care.utils.RequestUtil;
import com.fxkc.care.vo.UserInfoVO;
import io.jsonwebtoken.lang.Assert;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 用户表 前端控制器
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@RestController
@RequestMapping("/userInfo")
public class UserInfoController {
@Autowired
private IUserInfoService userInfoService;
@ApiOperation("获取当前用户信息详情")
@GetMapping("/currentUserInfo")
public AjaxResult getCurrentUserInfo() {
UserInfoVO userInfoVO = RequestUtil.getUserInfo();
return AjaxResult.success(userInfoVO);
}
// @PostMapping("/editPwd")
// @ApiOperation("修改密码")
// public AjaxResult<Boolean> editPassword(@RequestBody UserInfo userInfo) {
// Assert.notNull(userInfo.getPassword(), "密码不得为空!");
// return AjaxResult.success(userInfoService.editPassword(userInfo));
// }
// @PostMapping("/page")
// public AjaxResult page(@RequestBody UserInfo userInfo) {
// return userInfoService.getPage(userInfo);
// }
@PostMapping("/add")
@ApiOperation("新增用户")
@RepeatSubmitValidation
public AjaxResult add(@RequestBody @Validated UserInfoAddDTO dto) {
return userInfoService.add(dto);
}
@PostMapping("/edit")
@ApiOperation("编辑用户")
@RepeatSubmitValidation
public AjaxResult edit(@RequestBody UserInfoEditDTO dto) {
return userInfoService.edit(dto);
}
@DeleteMapping("/delete/{id}")
public AjaxResult delete(@PathVariable("id") String id) {
return userInfoService.delete(id);
}
}
package com.fxkc.care.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 用户角色表 前端控制器
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@RestController
@RequestMapping("//user-role")
public class UserRoleController {
}
package com.fxkc.care.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 菜单表
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("MENU_INFO")
@ApiModel(value="MenuInfo对象", description="菜单表")
public class MenuInfo extends Model<MenuInfo> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId("ID")
private String id;
@ApiModelProperty(value = "父级菜单ID")
@TableField("PARENT_ID")
private String parentId;
@ApiModelProperty(value = "菜单名称")
@TableField("MENU_NAME")
private String menuName;
@ApiModelProperty(value = "菜单类型(1-目录 2-菜单 3-按钮 4-路由)")
@TableField("MENU_TYPE")
private Integer menuType;
@ApiModelProperty(value = "菜单备注")
@TableField("MENU_DESC")
private String menuDesc;
@ApiModelProperty(value = "路由路径")
@TableField("MENU_ROUTE_PATH")
private String menuRoutePath;
@ApiModelProperty(value = "菜单图标")
@TableField("MENU_ICON")
private String menuIcon;
@ApiModelProperty(value = "组件")
@TableField("MENU_COMPONENT")
private String menuComponent;
@ApiModelProperty(value = "排序值")
@TableField("SORT_NO")
private Integer sortNo;
@ApiModelProperty(value = "启用状态 0-启用 1-禁用")
@TableField("ENABLE_FLAG")
private Integer enableFlag;
@ApiModelProperty(value = "删除状态 0-未删除 1-已删除")
@TableField("DELETE_FLAG")
private Integer deleteFlag;
@ApiModelProperty(value = "创建时间")
@TableField("CREATE_TIME")
private Date createTime;
@ApiModelProperty(value = "修改时间")
@TableField("UPDATE_TIME")
private Date updateTime;
@ApiModelProperty(value = "创建人")
@TableField("CREATE_USER")
private String createUser;
@ApiModelProperty(value = "修改人")
@TableField("UPDATE_USER")
private String updateUser;
}
package com.fxkc.care.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 角色表
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("ROLE_INFO")
@ApiModel(value="RoleInfo对象", description="角色表")
public class RoleInfo extends Model<RoleInfo> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId("ID")
private String id;
@ApiModelProperty(value = "角色代码")
@TableField("ROLE_CODE")
private String roleCode;
@ApiModelProperty(value = "角色名称")
@TableField("ROLE_NAME")
private String roleName;
@ApiModelProperty(value = "角色描述")
@TableField("ROLE_DESC")
private String roleDesc;
@ApiModelProperty(value = "角色状态 0-启用 1-禁用")
@TableField("ENABLE_FLAG")
private Integer enableFlag;
@ApiModelProperty(value = "删除状态 0-未删除 1-已删除")
@TableField("DELETE_FLAG")
private Integer deleteFlag;
@ApiModelProperty(value = "创建时间")
@TableField("CREATE_TIME")
private Date createTime;
@ApiModelProperty(value = "修改时间")
@TableField("UPDATE_TIME")
private Date updateTime;
@ApiModelProperty(value = "创建人")
@TableField("CREATE_USER")
private String createUser;
@ApiModelProperty(value = "修改人")
@TableField("UPDATE_USER")
private String updateUser;
}
package com.fxkc.care.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 角色菜单表
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("ROLE_MENU")
@ApiModel(value="RoleMenu对象", description="角色菜单表")
public class RoleMenu extends Model<RoleMenu> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "角色ID")
@TableId("ROLE_ID")
private String roleId;
@ApiModelProperty(value = "菜单ID")
@TableField("MENU_ID")
private String menuId;
}
package com.fxkc.care.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 字典子项表
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("SYS_DICT_ITEM")
@ApiModel(value="SysDictItem对象", description="字典子项表")
public class SysDictItem extends Model<SysDictItem> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId("ID")
private String id;
@ApiModelProperty(value = "字典类型编码")
@TableField("DICT_TYPE_CODE")
private String dictTypeCode;
@ApiModelProperty(value = "字典项代码")
@TableField("DICT_ITEM_CODE")
private String dictItemCode;
@ApiModelProperty(value = "字典项名称")
@TableField("DICT_ITEM_NAME")
private String dictItemName;
@ApiModelProperty(value = "排序值")
@TableField("SORT_NO")
private Integer sortNo;
@ApiModelProperty(value = "删除状态 0-未删除 1-已删除")
@TableField("DELETE_FLAG")
private Integer deleteFlag;
@ApiModelProperty(value = "创建时间")
@TableField("CREATE_TIME")
private Date createTime;
@ApiModelProperty(value = "修改时间")
@TableField("UPDATE_TIME")
private Date updateTime;
@ApiModelProperty(value = "创建人")
@TableField("CREATE_USER")
private String createUser;
@ApiModelProperty(value = "修改人")
@TableField("UPDATE_USER")
private String updateUser;
}
package com.fxkc.care.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 系统字典类型表
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("SYS_DICT_TYPE")
@ApiModel(value="SysDictType对象", description="系统字典类型表")
public class SysDictType extends Model<SysDictType> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId("ID")
private String id;
@ApiModelProperty(value = "字典类型代码")
@TableField("DICT_TYPE_CODE")
private String dictTypeCode;
@ApiModelProperty(value = "字典类型名称")
@TableField("DICT_TYPE_NAME")
private String dictTypeName;
@ApiModelProperty(value = "排序值")
@TableField("SORT_NO")
private Integer sortNo;
@ApiModelProperty(value = "备注")
@TableField("REMARK")
private String remark;
@ApiModelProperty(value = "删除状态 0-未删除 1-已删除")
@TableField("DELETE_FLAG")
private Integer deleteFlag;
@ApiModelProperty(value = "创建时间")
@TableField("CREATE_TIME")
private Date createTime;
@ApiModelProperty(value = "修改时间")
@TableField("UPDATE_TIME")
private Date updateTime;
@ApiModelProperty(value = "创建人")
@TableField("CREATE_USER")
private String createUser;
@ApiModelProperty(value = "修改人")
@TableField("UPDATE_USER")
private String updateUser;
}
package com.fxkc.care.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 用户表
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("USER_INFO")
@ApiModel(value="UserInfo对象", description="用户表")
public class UserInfo extends Model<UserInfo> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
@TableId("ID")
private String id;
@ApiModelProperty(value = "登录名")
@TableField("LOGIN_NAME")
private String loginName;
@ApiModelProperty(value = "密码")
@TableField("PASSWORD")
private String password;
@ApiModelProperty(value = "加盐")
@TableField("SALT")
private String salt;
@ApiModelProperty(value = "用户姓名")
@TableField("USERNAME")
private String username;
@ApiModelProperty(value = "用户头像")
@TableField("USER_IMG")
private String userImg;
@ApiModelProperty(value = "手机号")
@TableField("PHONE")
private String phone;
@ApiModelProperty(value = "身份证号")
@TableField("ID_CARD_NO")
private String idCardNo;
@ApiModelProperty(value = "删除状态 0-未删除 1-已删除")
@TableLogic("DELETE_FLAG")
private Integer deleteFlag;
@ApiModelProperty(value = "创建时间")
@TableField("CREATE_TIME")
private Date createTime;
@ApiModelProperty(value = "修改时间")
@TableField("UPDATE_TIME")
private Date updateTime;
@ApiModelProperty(value = "创建人")
@TableField("CREATE_USER")
private String createUser;
@ApiModelProperty(value = "修改人")
@TableField("UPDATE_USER")
private String updateUser;
}
package com.fxkc.care.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 用户角色表
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("USER_ROLE")
@ApiModel(value="UserRole对象", description="用户角色表")
public class UserRole extends Model<UserRole> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户ID")
@TableId("USER_ID")
private String userId;
@ApiModelProperty(value = "角色ID")
@TableField("ROLE_ID")
private String roleId;
}
package com.fxkc.care.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* @author JYH
* @date 2024/12/13 17:36
* @describe
*/
@Data
@ApiModel(value = "用户信息dto")
public class UserInfoAddDTO implements Serializable {
@NotBlank(message = "登录名不能为空")
@ApiModelProperty(value = "登录名")
private String loginName;
@NotBlank(message = "密码不能为空")
@ApiModelProperty(value = "密码")
private String password;
@NotBlank(message = "用户名不能为空")
@ApiModelProperty(value = "用户名")
private String username;
@ApiModelProperty(value = "用户头像")
private String userImg;
@ApiModelProperty(value = "手机号")
private String phone;
@ApiModelProperty(value = "身份证号")
private String idCardNo;
}
package com.fxkc.care.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* @author JYH
* @date 2024/12/13 17:36
* @describe
*/
@Data
@ApiModel(value = "用户信息dto")
public class UserInfoEditDTO implements Serializable {
@ApiModelProperty(value = "用户id")
private String id;
@NotBlank(message = "用户名不能为空")
@ApiModelProperty(value = "用户名")
private String username;
@ApiModelProperty(value = "用户头像")
private String userImg;
@ApiModelProperty(value = "手机号")
private String phone;
@ApiModelProperty(value = "身份证号")
private String idCardNo;
}
package com.fxkc.care.enums;
public enum DeleteFlagEnum implements IEnumNameValue<Integer> {
NOT_DELETE(0, "未删除"),
DELETE(1, "删除");
private Integer value;
private String name;
DeleteFlagEnum(Integer value, String name){
this.value = value;
this.name = name;
}
@Override
public Integer getValue() {
return value;
}
@Override
public String getName() {
return name;
}
}
package com.fxkc.care.enums;
public interface IEnumNameValue<T> {
String getName();
T getValue();
}
package com.fxkc.care.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fxkc.care.domain.MenuInfo;
/**
* <p>
* 菜单表 Mapper 接口
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface MenuInfoMapper extends BaseMapper<MenuInfo> {
}
package com.fxkc.care.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fxkc.care.domain.RoleInfo;
/**
* <p>
* 角色表 Mapper 接口
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface RoleInfoMapper extends BaseMapper<RoleInfo> {
}
package com.fxkc.care.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fxkc.care.domain.RoleMenu;
/**
* <p>
* 角色菜单表 Mapper 接口
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface RoleMenuMapper extends BaseMapper<RoleMenu> {
}
package com.fxkc.care.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fxkc.care.domain.SysDictItem;
/**
* <p>
* 字典子项表 Mapper 接口
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface SysDictItemMapper extends BaseMapper<SysDictItem> {
}
package com.fxkc.care.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fxkc.care.domain.SysDictType;
/**
* <p>
* 系统字典类型表 Mapper 接口
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface SysDictTypeMapper extends BaseMapper<SysDictType> {
}
package com.fxkc.care.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fxkc.care.domain.UserInfo;
/**
* <p>
* 用户表 Mapper 接口
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}
package com.fxkc.care.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fxkc.care.domain.UserRole;
import org.springframework.stereotype.Repository;
/**
* <p>
* 用户角色表 Mapper 接口
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Repository
public interface UserRoleMapper extends BaseMapper<UserRole> {
}
package com.fxkc.care.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fxkc.care.domain.MenuInfo;
/**
* <p>
* 菜单表 服务类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface IMenuInfoService extends IService<MenuInfo> {
}
package com.fxkc.care.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fxkc.care.domain.RoleInfo;
/**
* <p>
* 角色表 服务类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface IRoleInfoService extends IService<RoleInfo> {
}
package com.fxkc.care.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fxkc.care.domain.RoleMenu;
/**
* <p>
* 角色菜单表 服务类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface IRoleMenuService extends IService<RoleMenu> {
}
package com.fxkc.care.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fxkc.care.domain.SysDictItem;
/**
* <p>
* 字典子项表 服务类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface ISysDictItemService extends IService<SysDictItem> {
}
package com.fxkc.care.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fxkc.care.domain.SysDictType;
/**
* <p>
* 系统字典类型表 服务类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface ISysDictTypeService extends IService<SysDictType> {
}
package com.fxkc.care.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fxkc.care.common.AjaxResult;
import com.fxkc.care.domain.UserInfo;
import com.fxkc.care.dto.UserInfoAddDTO;
import com.fxkc.care.dto.UserInfoEditDTO;
import com.fxkc.care.vo.UserInfoVO;
import javax.servlet.http.HttpServletResponse;
/**
* <p>
* 用户表 服务类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface IUserInfoService extends IService<UserInfo> {
AjaxResult doLogin(UserInfoVO userInfoVO, HttpServletResponse response);
AjaxResult logout();
AjaxResult add(UserInfoAddDTO dto);
AjaxResult edit(UserInfoEditDTO dto);
AjaxResult delete(String id);
}
package com.fxkc.care.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fxkc.care.domain.UserRole;
/**
* <p>
* 用户角色表 服务类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
public interface IUserRoleService extends IService<UserRole> {
}
package com.fxkc.care.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fxkc.care.domain.MenuInfo;
import com.fxkc.care.mapper.MenuInfoMapper;
import com.fxkc.care.service.IMenuInfoService;
import org.springframework.stereotype.Service;
/**
* <p>
* 菜单表 服务实现类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Service
public class MenuInfoServiceImpl extends ServiceImpl<MenuInfoMapper, MenuInfo> implements IMenuInfoService {
}
package com.fxkc.care.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fxkc.care.domain.RoleInfo;
import com.fxkc.care.mapper.RoleInfoMapper;
import com.fxkc.care.service.IRoleInfoService;
import org.springframework.stereotype.Service;
/**
* <p>
* 角色表 服务实现类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Service
public class RoleInfoServiceImpl extends ServiceImpl<RoleInfoMapper, RoleInfo> implements IRoleInfoService {
}
package com.fxkc.care.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fxkc.care.domain.RoleMenu;
import com.fxkc.care.mapper.RoleMenuMapper;
import com.fxkc.care.service.IRoleMenuService;
import org.springframework.stereotype.Service;
/**
* <p>
* 角色菜单表 服务实现类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Service
public class RoleMenuServiceImpl extends ServiceImpl<RoleMenuMapper, RoleMenu> implements IRoleMenuService {
}
package com.fxkc.care.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fxkc.care.domain.SysDictItem;
import com.fxkc.care.mapper.SysDictItemMapper;
import com.fxkc.care.service.ISysDictItemService;
import org.springframework.stereotype.Service;
/**
* <p>
* 字典子项表 服务实现类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Service
public class SysDictItemServiceImpl extends ServiceImpl<SysDictItemMapper, SysDictItem> implements ISysDictItemService {
}
package com.fxkc.care.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fxkc.care.domain.SysDictType;
import com.fxkc.care.mapper.SysDictTypeMapper;
import com.fxkc.care.service.ISysDictTypeService;
import org.springframework.stereotype.Service;
/**
* <p>
* 系统字典类型表 服务实现类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Service
public class SysDictTypeServiceImpl extends ServiceImpl<SysDictTypeMapper, SysDictType> implements ISysDictTypeService {
}
package com.fxkc.care.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fxkc.care.common.AjaxResult;
import com.fxkc.care.domain.UserInfo;
import com.fxkc.care.domain.UserRole;
import com.fxkc.care.dto.UserInfoAddDTO;
import com.fxkc.care.dto.UserInfoEditDTO;
import com.fxkc.care.enums.CommonEnum;
import com.fxkc.care.enums.DeleteFlagEnum;
import com.fxkc.care.mapper.UserInfoMapper;
import com.fxkc.care.mapper.UserRoleMapper;
import com.fxkc.care.service.IUserInfoService;
import com.fxkc.care.utils.*;
import com.fxkc.care.vo.UserInfoVO;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* <p>
* 用户表 服务实现类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Slf4j
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {
@Autowired
private UserRoleMapper userRoleMapper;
//密码加密公钥
@Value("${rsa.publicKey}")
private String rsaPublicKey;
//密码加密私钥
@Value("${rsa.privateKey}")
private String rsaPrivateKey;
//账号默认密码
@Value("${user.defaultPassword}")
private String defaultPassword;
@Resource
private RedisTemplate redisTemplate;
/**
* 用户登录
*
* @param userInfoVO
* @param response
* @return
*/
@Override
public AjaxResult doLogin(UserInfoVO userInfoVO, HttpServletResponse response) {
//1.非空校验
Assert.notNull(userInfoVO.getLoginName(), "用户名不得为空");
Assert.notNull(userInfoVO.getPassword(), "密码不得为空");
UserInfo userInfoDB = this.baseMapper.selectOne(Wrappers.<UserInfo>lambdaQuery()
.eq(UserInfo::getLoginName, userInfoVO.getLoginName())
.eq(UserInfo::getDeleteFlag, DeleteFlagEnum.NOT_DELETE.getValue())
);
//2.判断用户是否存在
if (ObjectUtils.isEmpty(userInfoDB)) {
return AjaxResult.error401("用户名错误!");
}
//3.数据库密码解密、前端密码解密
String password = RSAUtils.decrypt(userInfoDB.getPassword(), this.rsaPrivateKey);
String inputPassword = RSAUtils.decrypt(userInfoVO.getPassword(), this.rsaPrivateKey);
if (!StringUtils.equals(password, inputPassword)) {
return AjaxResult.error401("输入密码错误!");
}
//4.生成JWT
String salt = userInfoDB.getSalt();
Map<String, Object> jwtPayloadUserInfo = new HashMap<>();
jwtPayloadUserInfo.put("loginName", userInfoDB.getLoginName());
jwtPayloadUserInfo.put("loginTime", MultiThreadDateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
long nowMilliSeconds = System.currentTimeMillis();
jwtPayloadUserInfo.put("timestamp", nowMilliSeconds);//该字段用来验证jwt的有效性,和redis的jwtsalt[1]比较
String jwt = JwtUtil.createJwt(jwtPayloadUserInfo, salt);
//5.保存(覆盖)用户信息、salt_timestamp到redis中
redisTemplate.opsForValue().set("jwtsalt:" + userInfoVO.getLoginName(), salt + "." + nowMilliSeconds);
redisTemplate.opsForValue().getOperations().expire("jwtsalt:" + userInfoVO.getLoginName(), 24, TimeUnit.HOURS);
BeanUtils.copyProperties(userInfoDB, userInfoVO);
userInfoVO.setPassword("");
redisTemplate.opsForHash().put(CommonEnum.USER_INFO.getCode(), userInfoDB.getLoginName(), userInfoVO);
//6.response.cookie加入JWT,重定向到首页
Cookie cookie = new Cookie(CommonEnum.USER_TOKEN.getCode(), jwt);
cookie.setPath("/");//这里需要设置,否则跳转页面时浏览器不能写入cookie到域名下
response.addCookie(cookie);
//7.记录该用户的登录时间到redis中
redisTemplate.opsForValue().set(userInfoDB.getUsername() + "_loginTime", String.valueOf(nowMilliSeconds));
redisTemplate.opsForValue().getOperations().expire(userInfoDB.getUsername() + "_loginTime", 24, TimeUnit.HOURS);
log.info("用户{}登录成功!", userInfoVO.getLoginName());
return AjaxResult.success("登录成功!");
}
/**
* 退出登录
*
* @return
*/
@Override
public AjaxResult logout() {
// 从Request中获取UserInfo,根据loginName从redis中删除该用户的jwtsalt
UserInfoVO userInfo = RequestUtil.getUserInfo();
redisTemplate.opsForValue().getOperations().delete("jwtsalt:" + userInfo.getLoginName());
log.info("用户{}登出成功!", userInfo.getLoginName());
return AjaxResult.success("登出成功!");
}
/**
* 新增用户
*
* @param dto
* @return
*/
@SneakyThrows
@Override
public AjaxResult add(UserInfoAddDTO dto) {
List<UserInfo> userList = new ArrayList<>();
// 校验手机号
if (StringUtils.isNotBlank(dto.getPhone())) {
if (!ValidatorUtil.isMobile(dto.getPhone())) {
return AjaxResult.error("手机号码格式错误!");
}
userList = this.baseMapper.selectList(new LambdaQueryWrapper<UserInfo>()
.eq(UserInfo::getDeleteFlag, DeleteFlagEnum.NOT_DELETE.getValue())
.eq(UserInfo::getPhone, dto.getPhone()));
if (CollectionUtils.isNotEmpty(userList)) {
return AjaxResult.error("手机号码已存在,请更换其他手机号码!");
}
}
// 校验身份证号
if (StringUtils.isNotBlank(dto.getIdCardNo())) {
if (!ValidatorUtil.isIdCard(dto.getIdCardNo())) {
return AjaxResult.error("身份证格式错误!");
}
userList = this.baseMapper.selectList(new LambdaQueryWrapper<UserInfo>()
.eq(UserInfo::getDeleteFlag, DeleteFlagEnum.NOT_DELETE.getValue())
.eq(UserInfo::getIdCardNo, dto.getIdCardNo()));
if (CollectionUtils.isNotEmpty(userList)) {
return AjaxResult.error("身份证号码已存在,请更换其他身份证号码!");
}
}
// 判断登录用户名是否存在
userList = this.baseMapper.selectList(new LambdaQueryWrapper<UserInfo>()
.eq(UserInfo::getDeleteFlag, DeleteFlagEnum.NOT_DELETE.getValue())
.eq(UserInfo::getLoginName, dto.getLoginName()));
if (CollectionUtils.isNotEmpty(userList)) {
return AjaxResult.error("登录名已存在,请更换其他登录名!");
}
UserInfo userInfo = new UserInfo();
BeanUtils.copyProperties(dto, userInfo);
// 获取初始密码
String password = RSAUtils.encrypt(this.defaultPassword, this.rsaPublicKey);
// 获取盐
String salt = UuidUtil.getUUID();
userInfo.setPassword(password);
userInfo.setSalt(salt);
this.save(userInfo);
return AjaxResult.success("新增成功!");
}
/**
* 编辑
*
* @param dto
* @return
*/
@Override
public AjaxResult edit(UserInfoEditDTO dto) {
UserInfo userInfo = new UserInfo();
BeanUtils.copyProperties(dto, userInfo);
this.updateById(userInfo);
return AjaxResult.success("编辑成功!");
}
/**
* 删除
*
* @param id
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Override
public AjaxResult delete(String id) {
// 删除用户信息
this.delete(id);
// 删除用户角色中间表信息
userRoleMapper.delete(Wrappers.<UserRole>lambdaQuery().eq(UserRole::getUserId, id));
return AjaxResult.success("删除成功!");
}
}
package com.fxkc.care.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fxkc.care.domain.UserRole;
import com.fxkc.care.mapper.UserRoleMapper;
import com.fxkc.care.service.IUserRoleService;
import org.springframework.stereotype.Service;
/**
* <p>
* 用户角色表 服务实现类
* </p>
*
* @author JYH
* @since 2024-12-14
*/
@Service
public class UserRoleServiceImpl extends ServiceImpl<UserRoleMapper, UserRole> implements IUserRoleService {
}
package com.fxkc.care.utils;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
import java.security.MessageDigest;
public class MD5Util {
/**
* 密码加密
*
* @param password
* @return
*/
public static String encode(String password) {
return processEncode(password);
}
public static String encodeBySalt(String password, String salt) {
return new SimpleHash("md5", password, ByteSource.Util.bytes(salt), 2).toHex();
}
private static String processEncode(String password) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
throw new RuntimeException(e);
}
char[] charArray = password.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++) {
byteArray[i] = (byte) charArray[i];
}
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
// public static void main(String[] args) {
// System.out.println("MD5Util.encodeBySalt(\"123456\",\"1\") = " + MD5Util.encodeBySalt("123456","1"));
// }
}
package com.fxkc.care.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class MultiThreadDateUtil {
/**
* 存放不同的日期模板格式的sdf的Map
*/
private static ThreadLocal<Map<String, SimpleDateFormat>> sdfMap =
new ThreadLocal<Map<String, SimpleDateFormat>>() {
protected Map<String, SimpleDateFormat> initialValue() {
return new HashMap<String, SimpleDateFormat>();
}
};
/**
* 返回一个SimpleDateFormat,每个线程只会new一次pattern对应的sdf
*/
private static SimpleDateFormat getSdf(String pattern) {
Map<String, SimpleDateFormat> t = sdfMap.get();
SimpleDateFormat sdf = t.get(pattern);
if (sdf == null) {
sdf = new SimpleDateFormat(pattern);
t.put(pattern, sdf);
}
return sdf;
}
public static String format(Date date, String pattern) {
return getSdf(pattern).format(date);
}
public static Date parse(String dateStr, String pattern) throws Exception {
return getSdf(pattern).parse(dateStr);
}
public static String getPeriodStrBy2Date(Date date1, Date date2) {
long between = date1.getTime() - date2.getTime();
long day = between / (24 * 60 * 60 * 1000);
long hour = between / (60 * 60 * 1000) - day * 24;
long min = between / (60 * 1000) - day * 24 * 60 - hour * 60;
long s = between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60;
StringBuilder sb = new StringBuilder();
sb.append(day != 0L ? day + "天" : "")
.append(hour != 0L ? hour + "小时" : "")
.append(min != 0L ? min + "分钟" : "")
.append(s != 0L ? s + "秒" : "");
return sb.toString();
}
public static void main(String[] args) throws Exception {
String date1str = "2024-07-01 14:25:55";
String date2str = "2024-07-01 16:15:60";
Date date1 = parse(date1str, "yyyy-MM-dd HH:mm:ss");
Date date2 = parse(date2str, "yyyy-MM-dd HH:mm:ss");
String periodStrBy2Date = getPeriodStrBy2Date(date2, date1);
System.out.println("periodStrBy2Date = " + periodStrBy2Date);
}
}
package com.fxkc.care.utils;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.codec.binary.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class RSAUtils {
private static String encoding = "utf-8";
// RSA最大加密明文大小
private static final int MAX_ENCRYPT_BLOCK = 117;
// RSA最大解密密文大小
private static final int MAX_DECRYPT_BLOCK = 128;
private static final String KEY_ALGORITHM = "RSA";
private static final String ENDE_ALGORITHMS = "RSA/ECB/PKCS1Padding";
/**
* 生成RSA 公私钥,可选长度为1025,2048位.
*/
public static Map<String,String> generateRsaKey(int keySize) {
Map<String,String> result = new HashMap<>(2);
try {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
// 初始化密钥对生成器,密钥大小为1024 2048位
keyPairGen.initialize(keySize, new SecureRandom());
// 生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
// 得到公钥字符串
result.put("publicKey", new String(Base64.encodeBase64(keyPair.getPublic().getEncoded())));
// 得到私钥字符串
result.put("privateKey", new String(Base64.encodeBase64(keyPair.getPrivate().getEncoded())));
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
return result;
}
/**
* RSA私钥解密
* @param str 解密字符串
* @param privateKey 私钥
* @return 明文
*/
public static String decrypt(String str, String privateKey) {
//64位解码加密后的字符串
byte[] inputByte;
String outStr = "";
try {
inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
//base64编码的私钥
byte[] decoded = Base64.decodeBase64(privateKey);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
//RSA解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, priKey);
outStr = new String(cipher.doFinal(inputByte));
} catch (UnsupportedEncodingException | NoSuchPaddingException | InvalidKeyException |
IllegalBlockSizeException | BadPaddingException | InvalidKeySpecException | NoSuchAlgorithmException e) {
e.printStackTrace();
}
return outStr;
}
/**
* RSA公钥加密
* @param str 需要加密的字符串
* @param publicKey 公钥
* @return 密文
* @throws Exception 加密过程中的异常信息
*/
public static String encrypt(String str, String publicKey) throws Exception {
//base64编码的公钥
byte[] decoded = Base64.decodeBase64(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
//RSA加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
return outStr;
}
public static void main(String[] args) throws Exception {
System.out.println(encrypt("123456", "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN2uC2W2wzQ7yZpdpBZvw+w/QeEJGL8r457W21ndnXLX2kFUJWOt+iTqP7B94RPQzRzPBspVtqD2bO7B3HEYAhm40WB8eId2oM1vlwTXs6jxQ936s7/LYzQ4ux9LqHEhCwhoyYW0FZUS6chbH0pSb49Al3CxcL0Yz5yr4Z7maVSwIDAQAB"));
}
}
package com.fxkc.care.utils;
import java.util.UUID;
/**
* UUID工具类
*/
public class UuidUtil {
public UuidUtil(){
}
/**
* 获得一个UUID
*
* @return String UUID
*/
public static String getUUID() {
return UUID.randomUUID().toString().replace("-", "").toLowerCase();
}
/**
* 获得指定数目的UUID
*
* @param number int 需要获得的UUID数量
* @return String[] UUID数组
*/
public static String[] getUUID(int number) {
if (number < 1) {
return null;
}
String[] ss = new String[number];
for (int i = 0; i < number; i++) {
ss[i] = getUUID();
}
return ss;
}
}
package com.fxkc.care.utils;
import java.util.regex.Pattern;
/**
* 校验器工具类
*
* @author shexuegang
* @since 2023-11-30
*/
public class ValidatorUtil {
/**
* 正则表达式:验证用户名
*/
private static final String REGEX_USERNAME = "^[a-zA-Z]\\w{5,17}$";
/**
* 正则表达式:验证密码
*/
private static final String REGEX_PASSWORD = "^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])|(?=.*[A-Z])(?=.*[a-z])(?=.*[\\W_])|(?=.*[A-Z])(?=.*[0-9])(?=.*[\\W_])|(?=.*[a-z])(?=.*[0-9])(?=.*[\\W_])).+$";
/**
* 正则表达式:验证手机号
*/
private static final String REGEX_MOBILE = "^((13[0-9])|(14[5,7,9])|(15[0-3,5-9])|(166)|(17[3,5,6,7,8])|(18[0-9])|(19[8,9]))\\d{8}$";
/**
* 正则表达式:验证邮箱
*/
private static final String REGEX_EMAIL = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
/**
* 正则表达式:验证汉字
*/
private static final String REGEX_CHINESE = "^[\u4e00-\u9fa5],{0,}$";
/**
* 正则表达式:验证身份证
*/
private static final String REGEX_ID_CARD = "(^\\d{15}$)|(^\\d{17}([0-9]|X)$)";
/**
* 正则表达式:验证网络地址
*/
private static final String REGEX_URL = "http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w- ./?%&=]*)?";
/**
* 正则表达式:验证接口地址
*/
private static final String REGEX_INTERFACE_URL = "http(s)?://(([a-zA-Z0-9\\-\\.]+\\.[a-zA-Z0-9]{2,})|((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4})(:[0-9]{1,5})?([\\S]*)?";
/**
* 正则表达式:验证IP地址
*/
private static final String REGEX_IP_ADDR = "(25[0-5]|2[0-4]\\d|[0-1]\\d{2}|[1-9]?\\d)";
/**
* 正则表达式:验证是否包含大写字母
*/
private static final String REGEX_CONTAINS_UPPERCASE_LETTERS = "^(?=.*[A-Z]).+$";
/**
* 正则表达式:验证是否包含小写字母
*/
private static final String REGEX_CONTAINS_LOWERCASE_LETTERS = "^(?=.*[a-z]).+$";
/**
* 正则表达式:验证是否包含数字
*/
private static final String REGEX_CONTAINS_NUMBERS = "^(?=.*[0-9]).+$";
/**
* 正则表达式:验证是否包含特殊字符
*/
private static final String REGEX_CONTAINS_SPECIAL_CHARACTERS = "^.*[!@#$%^&*()_+=\\-].*$";
/**
* 校验用户名
*
* @param username 用户名
* @return 校验通过返回true,否则返回false
*/
public static boolean isUsername(String username) {
return Pattern.matches(REGEX_USERNAME, username);
}
/**
* 校验密码
*
* @param password 密码
* @return 校验通过返回true,否则返回false
*/
public static boolean isPassword(String password) {
return Pattern.matches(REGEX_PASSWORD, password);
}
/**
* 校验手机号
*
* @param mobile 手机号
* @return 校验通过返回true,否则返回false
*/
public static boolean isMobile(String mobile) {
return Pattern.matches(REGEX_MOBILE, mobile);
}
/**
* 校验邮箱
*
* @param email 邮箱
* @return 校验通过返回true,否则返回false
*/
public static boolean isEmail(String email) {
return Pattern.matches(REGEX_EMAIL, email);
}
/**
* 校验汉字
*
* @param chinese 汉字
* @return 校验通过返回true,否则返回false
*/
public static boolean isChinese(String chinese) {
return Pattern.matches(REGEX_CHINESE, chinese);
}
/**
* 校验身份证号
*
* @param idCard 身份证号
* @return 校验通过返回true,否则返回false
*/
public static boolean isIdCard(String idCard) {
return Pattern.matches(REGEX_ID_CARD, idCard);
}
/**
* 校验网络地址
*
* @param url 网络地址
* @return 校验通过返回true,否则返回false
*/
public static boolean isUrl(String url) {
return Pattern.matches(REGEX_URL, url);
}
/**
* 校验接口地址
*
* @param interfaceUrl 接口地址
* @return 校验通过返回true,否则返回false
*/
public static boolean isInterfaceUrl(String interfaceUrl) {
return Pattern.matches(REGEX_INTERFACE_URL, interfaceUrl);
}
/**
* 校验IP地址
*
* @param ipAddr IP地址
* @return 校验通过返回true,否则返回false
*/
public static boolean isIPAddr(String ipAddr) {
return Pattern.matches(REGEX_IP_ADDR, ipAddr);
}
/**
* 校验是否包含大写字母
*
* @param text 待校验文本
* @return 校验通过返回true,否则返回false
*/
public static boolean containsUpperCaseLetters(String text) {
return Pattern.matches(REGEX_CONTAINS_UPPERCASE_LETTERS, text);
}
/**
* 校验是否包含小写字母
*
* @param text 待校验文本
* @return 校验通过返回true,否则返回false
*/
public static boolean containsLowerCaseLetters(String text) {
return Pattern.matches(REGEX_CONTAINS_LOWERCASE_LETTERS, text);
}
/**
* 校验是否包含数字
*
* @param text 待校验文本
* @return 校验通过返回true,否则返回false
*/
public static boolean containsNumbers(String text) {
return Pattern.matches(REGEX_CONTAINS_NUMBERS, text);
}
/**
* 校验是否包含特殊字符
*
* @param text 待校验文本
* @return 校验通过返回true,否则返回false
*/
public static boolean containsSpecialCharacters(String text) {
return Pattern.matches(REGEX_CONTAINS_SPECIAL_CHARACTERS, text);
}
}
...@@ -18,7 +18,19 @@ public class UserInfoVO implements Serializable { ...@@ -18,7 +18,19 @@ public class UserInfoVO implements Serializable {
@ApiModelProperty(value = "登录名") @ApiModelProperty(value = "登录名")
private String loginName; private String loginName;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "用户名") @ApiModelProperty(value = "用户名")
private String userName; private String username;
@ApiModelProperty(value = "用户头像")
private String userImg;
@ApiModelProperty(value = "手机号")
private String phone;
@ApiModelProperty(value = "身份证号")
private String idCardNo;
} }
...@@ -9,9 +9,16 @@ spring.datasource.password=123456 ...@@ -9,9 +9,16 @@ spring.datasource.password=123456
#Redis\u914D\u7F6E #Redis\u914D\u7F6E
spring.redis.database=9 spring.redis.database=9
spring.redis.host=localhost spring.redis.host=10.10.31.140
spring.redis.port=6379 spring.redis.port=6379
spring.redis.password= spring.redis.password=
#\u63A7\u5236logback level #\u63A7\u5236logback level
logback.logging.customLevel=debug logback.logging.customLevel=debug
\ No newline at end of file
# \u5BC6\u7801\u52A0\u5BC6\u516C\u94A5\u3001\u79C1\u94A5
rsa.publicKey=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN2uC2W2wzQ7yZpdpBZvw+w/QeEJGL8r457W21ndnXLX2kFUJWOt+iTqP7B94RPQzRzPBspVtqD2bO7B3HEYAhm40WB8eId2oM1vlwTXs6jxQ936s7/LYzQ4ux9LqHEhCwhoyYW0FZUS6chbH0pSb49Al3CxcL0Yz5yr4Z7maVSwIDAQAB
rsa.privateKey=MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM3a4LZbbDNDvJml2kFm/D7D9B4QkYvyvjntbbWd2dctfaQVQlY636JOo/sH3hE9DNHM8GylW2oPZs7sHccRgCGbjRYHx4h3agzW+XBNezqPFD3fqzv8tjNDi7H0uocSELCGjJhbQVlRLpyFsfSlJvj0CXcLFwvRjPnKvhnuZpVLAgMBAAECgYAW5SYjAg4JsZnzWM/qgELD1FV9VohpkUj49mBCV9kXppaXvkmPf6LJ0YdJbzmSn0CiwPFolAeTxzy+/OHe9yJR53gq4vS8kPjknAgnMCuEJLCD8y1zvCD6Xow5qb3eEvz7/HLAeFVvNv0j2tamJ7V5DLl49FO+A01Myxmdpmy5QQJBAO9X9wsXnth6AP9BlI359vgb1Pl/+miKIEm+7Xt9/tTHAFqPh+djZZGeo7J9BZjBaLeQeOCVjiHl4o1+6QE2HyECQQDcLkuEROEYuP2WA62EVfLEo+KbB7dkB+GulYObAS73QPGfehlw0JY0gRYC/UQ9i27LMA6TJKcytv9XtsnPAcLrAkEA411r+GSS6FBV/CYfahQIMb+2vOF/TqnQbF3smcCiQR1eT6lD0GLTDNdn6Fnt5CPvR1n+ClLoN3l7kzD5RcZVIQJBAL2Cu0zlXDlDQEDWeYrlz0ahKHH3ekmG3yC9X8ESi7IVG+L/3NXVMvOOB7wa8ZlnYb1RZ7oOWjq0d6KvmZOrGHECQBTQpXuFyqQIuR61WJzGFTBpmoas13J3PxiOEfeVIeAP8Pd7Q451321S7KACmRTaSdV7o5w2ZfrK7CaDjV1JvXE=
# \u7528\u6237\u9ED8\u8BA4\u5BC6\u7801
user.defaultPassword=123456
\ No newline at end of file
...@@ -50,7 +50,7 @@ spring.redis.timeout=60000 ...@@ -50,7 +50,7 @@ spring.redis.timeout=60000
spring.servlet.multipart.max-file-size=100MB spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=1000MB spring.servlet.multipart.max-request-size=1000MB
#URL\u767D\u540D\u5355\uFF1A\u4E0D\u9700\u8981\u6821\u9A8Ctoken, /favicon.ico #URL\u767D\u540D\u5355\uFF1A\u4E0D\u9700\u8981\u6821\u9A8Ctoken, /favicon.ico
whiteUrlList=/base/login,/base/localLogin,/**/*swagger*/**,/v2/**,/csrf,/swagger-resources/**,/webjars/**,/doc.html/** whiteUrlList=/login/doLogin,/**/*swagger*/**,/v2/**,/csrf,/swagger-resources/**,/webjars/**,/doc.html/**
#\u91CD\u590D\u63D0\u4EA4\u89C4\u5219\u6BEB\u79D2\u503C\uFF1A\u8BE5\u65F6\u95F4\u8303\u56F4\u5185\u7684\u63D0\u4EA4\u90FD\u89C6\u4E3A\u91CD\u590D\u63D0\u4EA4\u3002\u5355\u4F4D\u6BEB\u79D2\uFF0C\u89C6\u7F51\u7EDC\u5EF6\u8FDF\u73AF\u5883\u8C03\u6574\u3002 #\u91CD\u590D\u63D0\u4EA4\u89C4\u5219\u6BEB\u79D2\u503C\uFF1A\u8BE5\u65F6\u95F4\u8303\u56F4\u5185\u7684\u63D0\u4EA4\u90FD\u89C6\u4E3A\u91CD\u590D\u63D0\u4EA4\u3002\u5355\u4F4D\u6BEB\u79D2\uFF0C\u89C6\u7F51\u7EDC\u5EF6\u8FDF\u73AF\u5883\u8C03\u6574\u3002
repeat.submit.period=3000 repeat.submit.period=3000
#swagger2\u7684\u914D\u7F6E #swagger2\u7684\u914D\u7F6E
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fxkc.care.mapper.MenuInfoMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.fxkc.care.domain.MenuInfo">
<id column="ID" property="id" />
<result column="PARENT_ID" property="parentId" />
<result column="MENU_NAME" property="menuName" />
<result column="MENU_TYPE" property="menuType" />
<result column="MENU_DESC" property="menuDesc" />
<result column="MENU_ROUTE_PATH" property="menuRoutePath" />
<result column="MENU_ICON" property="menuIcon" />
<result column="MENU_COMPONENT" property="menuComponent" />
<result column="SORT_NO" property="sortNo" />
<result column="ENABLE_FLAG" property="enableFlag" />
<result column="DELETE_FLAG" property="deleteFlag" />
<result column="CREATE_TIME" property="createTime" />
<result column="UPDATE_TIME" property="updateTime" />
<result column="CREATE_USER" property="createUser" />
<result column="UPDATE_USER" property="updateUser" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
ID, PARENT_ID, MENU_NAME, MENU_TYPE, MENU_DESC, MENU_ROUTE_PATH, MENU_ICON, MENU_COMPONENT, SORT_NO, ENABLE_FLAG, DELETE_FLAG, CREATE_TIME, UPDATE_TIME, CREATE_USER, UPDATE_USER
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fxkc.care.mapper.RoleInfoMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.fxkc.care.domain.RoleInfo">
<id column="ID" property="id" />
<result column="ROLE_CODE" property="roleCode" />
<result column="ROLE_NAME" property="roleName" />
<result column="ROLE_DESC" property="roleDesc" />
<result column="ENABLE_FLAG" property="enableFlag" />
<result column="DELETE_FLAG" property="deleteFlag" />
<result column="CREATE_TIME" property="createTime" />
<result column="UPDATE_TIME" property="updateTime" />
<result column="CREATE_USER" property="createUser" />
<result column="UPDATE_USER" property="updateUser" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
ID, ROLE_CODE, ROLE_NAME, ROLE_DESC, ENABLE_FLAG, DELETE_FLAG, CREATE_TIME, UPDATE_TIME, CREATE_USER, UPDATE_USER
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fxkc.care.mapper.RoleMenuMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.fxkc.care.domain.RoleMenu">
<id column="ROLE_ID" property="roleId" />
<result column="MENU_ID" property="menuId" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
ROLE_ID, MENU_ID
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fxkc.care.mapper.SysDictItemMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.fxkc.care.domain.SysDictItem">
<id column="ID" property="id" />
<result column="DICT_TYPE_CODE" property="dictTypeCode" />
<result column="DICT_ITEM_CODE" property="dictItemCode" />
<result column="DICT_ITEM_NAME" property="dictItemName" />
<result column="SORT_NO" property="sortNo" />
<result column="DELETE_FLAG" property="deleteFlag" />
<result column="CREATE_TIME" property="createTime" />
<result column="UPDATE_TIME" property="updateTime" />
<result column="CREATE_USER" property="createUser" />
<result column="UPDATE_USER" property="updateUser" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
ID, DICT_TYPE_CODE, DICT_ITEM_CODE, DICT_ITEM_NAME, SORT_NO, DELETE_FLAG, CREATE_TIME, UPDATE_TIME, CREATE_USER, UPDATE_USER
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fxkc.care.mapper.SysDictTypeMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.fxkc.care.domain.SysDictType">
<id column="ID" property="id" />
<result column="DICT_TYPE_CODE" property="dictTypeCode" />
<result column="DICT_TYPE_NAME" property="dictTypeName" />
<result column="SORT_NO" property="sortNo" />
<result column="REMARK" property="remark" />
<result column="DELETE_FLAG" property="deleteFlag" />
<result column="CREATE_TIME" property="createTime" />
<result column="UPDATE_TIME" property="updateTime" />
<result column="CREATE_USER" property="createUser" />
<result column="UPDATE_USER" property="updateUser" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
ID, DICT_TYPE_CODE, DICT_TYPE_NAME, SORT_NO, REMARK, DELETE_FLAG, CREATE_TIME, UPDATE_TIME, CREATE_USER, UPDATE_USER
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fxkc.care.mapper.UserInfoMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.fxkc.care.domain.UserInfo">
<id column="ID" property="id" />
<result column="LOGIN_NAME" property="loginName" />
<result column="PASSWORD" property="password" />
<result column="USERNAME" property="username" />
<result column="USER_IMG" property="userImg" />
<result column="PHONE" property="phone" />
<result column="ID_CARD_NO" property="idCardNo" />
<result column="DELETE_FLAG" property="deleteFlag" />
<result column="CREATE_TIME" property="createTime" />
<result column="UPDATE_TIME" property="updateTime" />
<result column="CREATE_USER" property="createUser" />
<result column="UPDATE_USER" property="updateUser" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
ID, LOGIN_NAME, PASSWORD, USERNAME, USER_IMG, PHONE, ID_CARD_NO, DELETE_FLAG, CREATE_TIME, UPDATE_TIME, CREATE_USER, UPDATE_USER
</sql>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fxkc.care.mapper.UserRoleMapper">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.fxkc.care.domain.UserRole">
<id column="USER_ID" property="userId" />
<result column="ROLE_ID" property="roleId" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
USER_ID, ROLE_ID
</sql>
</mapper>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment