Commit 9b54b58ec378054df16031c9508b82549147e5b1

Authored by wangkai
1 parent 95857ace

system模块 logger 单元测试

src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysLoginLogServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.logger;
  2 +
  3 +import cn.hutool.core.util.ArrayUtil;
  4 +import cn.hutool.core.util.RandomUtil;
  5 +import cn.hutool.core.util.ReflectUtil;
  6 +import cn.iocoder.dashboard.BaseSpringBootUnitTest;
  7 +import cn.iocoder.dashboard.common.pojo.PageResult;
  8 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
  9 +import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils;
  10 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogCreateReqVO;
  11 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
  12 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
  13 +import cn.iocoder.dashboard.modules.system.convert.logger.SysLoginLogConvert;
  14 +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO;
  15 +import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysLoginLogMapper;
  16 +import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginLogTypeEnum;
  17 +import cn.iocoder.dashboard.modules.system.enums.logger.SysLoginResultEnum;
  18 +import cn.iocoder.dashboard.modules.system.service.logger.impl.SysLoginLogServiceImpl;
  19 +import cn.iocoder.dashboard.util.RandomUtils;
  20 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  21 +import org.junit.jupiter.api.Test;
  22 +
  23 +import javax.annotation.Resource;
  24 +import java.lang.reflect.Field;
  25 +import java.util.Arrays;
  26 +import java.util.List;
  27 +import java.util.stream.Collectors;
  28 +
  29 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  30 +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
  31 +import static org.junit.jupiter.api.Assertions.assertEquals;
  32 +
  33 +public class SysLoginLogServiceImplTest extends BaseSpringBootUnitTest {
  34 +
  35 + @Resource
  36 + private SysLoginLogServiceImpl sysLoginLogService;
  37 +
  38 + @Resource
  39 + private SysLoginLogMapper loginLogMapper;
  40 +
  41 + @Test
  42 + public void testCreateLoginLog() {
  43 +
  44 + String traceId = TracerUtils.getTraceId();
  45 + SysLoginLogCreateReqVO reqVO = RandomUtils.randomPojo(SysLoginLogCreateReqVO.class, vo -> {
  46 + // 指定随机的范围,避免超出范围入库失败
  47 + vo.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
  48 + vo.setResult(RandomUtil.randomEle(SysLoginResultEnum.values()).getResult());
  49 + // 使用TracerUtils生成的TraceId
  50 + vo.setTraceId(traceId);
  51 + });
  52 +
  53 +
  54 + // 执行service方法
  55 + sysLoginLogService.createLoginLog(reqVO);
  56 +
  57 + // 查询插入的数据
  58 + SysLoginLogDO sysLoginLogDO = loginLogMapper.selectOne("trace_id", traceId);
  59 +
  60 + // 断言,忽略基本字段
  61 + assertPojoEquals(
  62 + SysLoginLogConvert.INSTANCE.convert(reqVO),
  63 + sysLoginLogDO,
  64 + getBaseDOFields()
  65 + );
  66 + }
  67 +
  68 +
  69 + @Test
  70 + public void testGetLoginLogPage() {
  71 +
  72 + // 构造测试数据
  73 +
  74 + // 登录成功的
  75 + SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> {
  76 + logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
  77 + logDO.setTraceId(TracerUtils.getTraceId());
  78 +
  79 + logDO.setUserIp("192.168.199.16");
  80 + logDO.setUsername("wangkai");
  81 + logDO.setCreateTime(buildTime(2021, 3, 6));
  82 + logDO.setResult(SysLoginResultEnum.SUCCESS.getResult());
  83 + });
  84 + loginLogMapper.insert(loginLogDO);
  85 +
  86 + // 下面几个都是不匹配的数据
  87 + // 登录失败的
  88 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult())));
  89 + // 不同ip段的
  90 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18")));
  91 + // 不同username
  92 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUsername("yunai")));
  93 + // 构造一个早期时间 2021-02-06 00:00:00
  94 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6))));
  95 +
  96 +
  97 + // 构造调用参数
  98 + SysLoginLogPageReqVO reqVO = new SysLoginLogPageReqVO();
  99 + reqVO.setUsername("wangkai");
  100 + reqVO.setUserIp("192.168.199");
  101 + reqVO.setStatus(true);
  102 + reqVO.setBeginTime(buildTime(2021, 3, 5));
  103 + reqVO.setEndTime(buildTime(2021, 3, 7));
  104 +
  105 + // 调用service方法
  106 + PageResult<SysLoginLogDO> pageResult = sysLoginLogService.getLoginLogPage(reqVO);
  107 +
  108 + // 断言,只查到了一条符合条件的
  109 + assertEquals(1, pageResult.getTotal());
  110 + assertEquals(1, pageResult.getList().size());
  111 + assertPojoEquals(loginLogDO, pageResult.getList().get(0));
  112 + }
  113 +
  114 + @Test
  115 + public void testGetLoginLogList() {
  116 +
  117 + // 构造测试数据
  118 +
  119 + // 登录成功的
  120 + SysLoginLogDO loginLogDO = RandomUtils.randomPojo(SysLoginLogDO.class, logDO -> {
  121 + logDO.setLogType(RandomUtil.randomEle(SysLoginLogTypeEnum.values()).getType());
  122 + logDO.setTraceId(TracerUtils.getTraceId());
  123 +
  124 + logDO.setUserIp("192.168.111.16");
  125 + logDO.setUsername("wangxiaokai");
  126 + logDO.setCreateTime(buildTime(2021, 3, 6));
  127 + logDO.setResult(SysLoginResultEnum.SUCCESS.getResult());
  128 + });
  129 + loginLogMapper.insert(loginLogDO);
  130 +
  131 + // 下面几个都是不匹配的数据
  132 + // 登录失败的
  133 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setResult(SysLoginResultEnum.CAPTCHA_CODE_ERROR.getResult())));
  134 + // 不同ip段的
  135 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUserIp("192.168.128.18")));
  136 + // 不同username
  137 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setUsername("yunai")));
  138 + // 构造一个早期时间 2021-02-06 00:00:00
  139 + loginLogMapper.insert(ObjectUtils.clone(loginLogDO, logDO -> logDO.setCreateTime(buildTime(2021, 2, 6))));
  140 +
  141 +
  142 + // 构造调用参数
  143 + SysLoginLogExportReqVO reqVO = new SysLoginLogExportReqVO();
  144 + reqVO.setUsername("wangxiaokai");
  145 + reqVO.setUserIp("192.168.111");
  146 + reqVO.setStatus(true);
  147 + reqVO.setBeginTime(buildTime(2021, 3, 5));
  148 + reqVO.setEndTime(buildTime(2021, 3, 7));
  149 +
  150 +
  151 + // 调用service方法
  152 + List<SysLoginLogDO> loginLogList = sysLoginLogService.getLoginLogList(reqVO);
  153 +
  154 + // 断言
  155 + assertEquals(1, loginLogList.size());
  156 + assertPojoEquals(loginLogDO, loginLogList.get(0));
  157 + }
  158 +
  159 +
  160 + private static String[] getBaseDOFields() {
  161 + Field[] fields = ReflectUtil.getFields(BaseDO.class);
  162 +
  163 + List<String> collect = Arrays.stream(fields)
  164 + .map(Field::getName)
  165 + .collect(Collectors.toList());
  166 + collect.add("id");
  167 +
  168 + return ArrayUtil.toArray(collect, String.class);
  169 + }
  170 +
  171 +}
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.logger;
  2 +
  3 +import cn.hutool.core.util.ArrayUtil;
  4 +import cn.hutool.core.util.RandomUtil;
  5 +import cn.hutool.core.util.ReflectUtil;
  6 +import cn.iocoder.dashboard.BaseSpringBootUnitTest;
  7 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  8 +import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants;
  9 +import cn.iocoder.dashboard.common.pojo.PageResult;
  10 +import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum;
  11 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
  12 +import cn.iocoder.dashboard.framework.tracer.core.util.TracerUtils;
  13 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogCreateReqVO;
  14 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
  15 +import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO;
  16 +import cn.iocoder.dashboard.modules.system.convert.logger.SysOperateLogConvert;
  17 +import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysOperateLogDO;
  18 +import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
  19 +import cn.iocoder.dashboard.modules.system.dal.mysql.logger.SysOperateLogMapper;
  20 +import cn.iocoder.dashboard.modules.system.dal.mysql.user.SysUserMapper;
  21 +import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum;
  22 +import cn.iocoder.dashboard.util.RandomUtils;
  23 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  24 +import org.junit.jupiter.api.Test;
  25 +
  26 +import javax.annotation.Resource;
  27 +import java.lang.reflect.Field;
  28 +import java.util.Arrays;
  29 +import java.util.HashMap;
  30 +import java.util.List;
  31 +import java.util.Map;
  32 +import java.util.stream.Collectors;
  33 +
  34 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  35 +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
  36 +import static org.junit.jupiter.api.Assertions.assertEquals;
  37 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  38 +
  39 +public class SysOperateLogServiceImplTest extends BaseSpringBootUnitTest {
  40 +
  41 + @Resource
  42 + private SysOperateLogService sysOperateLogServiceImpl;
  43 +
  44 + @Resource
  45 + private SysOperateLogMapper sysOperateLogMapper;
  46 +
  47 + @Resource
  48 + private SysUserMapper sysUserMapper;
  49 +
  50 + @Test
  51 + public void testCreateOperateLogAsync() throws InterruptedException {
  52 +
  53 + String traceId = TracerUtils.getTraceId();
  54 + SysOperateLogCreateReqVO reqVO = RandomUtils.randomPojo(SysOperateLogCreateReqVO.class, vo -> {
  55 + vo.setTraceId(traceId);
  56 + vo.setUserId(RandomUtil.randomLong(1, Long.MAX_VALUE));
  57 +
  58 + Map<String, Object> map = new HashMap<>();
  59 + map.put("orderId", 1);
  60 + vo.setExts(map);
  61 + });
  62 +
  63 + // 执行service方法
  64 + sysOperateLogServiceImpl.createOperateLogAsync(reqVO);
  65 +
  66 + // 等异步执行完
  67 + Thread.sleep(2000);
  68 +
  69 + // 查询插入的数据
  70 + SysOperateLogDO sysOperateLogDO = sysOperateLogMapper.selectOne("trace_id", traceId);
  71 +
  72 + // 断言
  73 + assertNotNull(sysOperateLogDO);
  74 + // 断言,忽略基本字段
  75 + assertPojoEquals(
  76 + SysOperateLogConvert.INSTANCE.convert(reqVO),
  77 + sysOperateLogDO,
  78 + getBaseDOFields()
  79 + );
  80 + }
  81 +
  82 +
  83 + @Test
  84 + public void testPageOperateLog() {
  85 +
  86 + // 构造测试数据
  87 +
  88 + // 先构造用户
  89 + SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, sysUserDO -> {
  90 + sysUserDO.setNickname("wangkai");
  91 + sysUserDO.setSex(SysSexEnum.MALE.getSEX());
  92 + sysUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  93 + });
  94 + sysUserMapper.insert(user);
  95 + Long userId = user.getId();
  96 +
  97 +
  98 + // 构造操作日志
  99 + SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, entity -> {
  100 + entity.setTraceId(TracerUtils.getTraceId());
  101 + entity.setUserId(userId);
  102 + entity.setModule("order");
  103 + entity.setType(OperateTypeEnum.CREATE.getType());
  104 + entity.setStartTime(buildTime(2021, 3, 6));
  105 + entity.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode());
  106 +
  107 + Map<String, Object> map = new HashMap<>();
  108 + map.put("orderId", 1);
  109 + entity.setExts(map);
  110 + });
  111 +
  112 + sysOperateLogMapper.insert(sysOperateLogDO);
  113 +
  114 + // 下面几个是不匹配的数据
  115 + // 随机userId
  116 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1)));
  117 + // module不同
  118 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user")));
  119 + // type不同
  120 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType())));
  121 + // createTime不同
  122 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6))));
  123 + // resultCode不同
  124 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode())));
  125 +
  126 + // 构造调用参数
  127 + SysOperateLogPageReqVO reqVO = new SysOperateLogPageReqVO();
  128 + reqVO.setUserNickname("wangkai");
  129 + reqVO.setModule("order");
  130 + reqVO.setType(OperateTypeEnum.CREATE.getType());
  131 + reqVO.setBeginTime(buildTime(2021, 3, 5));
  132 + reqVO.setEndTime(buildTime(2021, 3, 7));
  133 + reqVO.setSuccess(true);
  134 +
  135 + // 调用service方法
  136 + PageResult<SysOperateLogDO> pageResult = sysOperateLogServiceImpl.pageOperateLog(reqVO);
  137 +
  138 + // 断言,只查到了一条符合条件的
  139 + assertEquals(1, pageResult.getTotal());
  140 + assertEquals(1, pageResult.getList().size());
  141 + assertPojoEquals(sysOperateLogDO, pageResult.getList().get(0));
  142 + }
  143 +
  144 + @Test
  145 + public void testListOperateLogs() {
  146 +
  147 + // 构造测试数据
  148 +
  149 + // 先构造用户
  150 + SysUserDO user = RandomUtils.randomPojo(SysUserDO.class, sysUserDO -> {
  151 + sysUserDO.setNickname("wangkai");
  152 + sysUserDO.setSex(SysSexEnum.MALE.getSEX());
  153 + sysUserDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
  154 + });
  155 + sysUserMapper.insert(user);
  156 + Long userId = user.getId();
  157 +
  158 +
  159 + // 构造操作日志
  160 + SysOperateLogDO sysOperateLogDO = RandomUtils.randomPojo(SysOperateLogDO.class, entity -> {
  161 + entity.setTraceId(TracerUtils.getTraceId());
  162 + entity.setUserId(userId);
  163 + entity.setModule("order");
  164 + entity.setType(OperateTypeEnum.CREATE.getType());
  165 + entity.setStartTime(buildTime(2021, 3, 6));
  166 + entity.setResultCode(GlobalErrorCodeConstants.SUCCESS.getCode());
  167 +
  168 + Map<String, Object> map = new HashMap<>();
  169 + map.put("orderId", 1);
  170 + entity.setExts(map);
  171 + });
  172 +
  173 + sysOperateLogMapper.insert(sysOperateLogDO);
  174 +
  175 + // 下面几个是不匹配的数据
  176 + // 随机userId
  177 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setUserId(userId + 1)));
  178 + // module不同
  179 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setModule("user")));
  180 + // type不同
  181 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setType(OperateTypeEnum.IMPORT.getType())));
  182 + // createTime不同
  183 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setStartTime(buildTime(2021, 2, 6))));
  184 + // resultCode不同
  185 + sysOperateLogMapper.insert(ObjectUtils.clone(sysOperateLogDO, logDO -> logDO.setResultCode(GlobalErrorCodeConstants.BAD_REQUEST.getCode())));
  186 +
  187 + // 构造调用参数
  188 + SysOperateLogExportReqVO reqVO = new SysOperateLogExportReqVO();
  189 + reqVO.setUserNickname("wangkai");
  190 + reqVO.setModule("order");
  191 + reqVO.setType(OperateTypeEnum.CREATE.getType());
  192 + reqVO.setBeginTime(buildTime(2021, 3, 5));
  193 + reqVO.setEndTime(buildTime(2021, 3, 7));
  194 + reqVO.setSuccess(true);
  195 +
  196 + // 调用service方法
  197 + List<SysOperateLogDO> list = sysOperateLogServiceImpl.listOperateLogs(reqVO);
  198 +
  199 + // 断言,只查到了一条符合条件的
  200 + assertEquals(1, list.size());
  201 + assertPojoEquals(sysOperateLogDO, list.get(0));
  202 + }
  203 +
  204 +
  205 + private static String[] getBaseDOFields() {
  206 + Field[] fields = ReflectUtil.getFields(BaseDO.class);
  207 +
  208 + List<String> collect = Arrays.stream(fields)
  209 + .map(Field::getName)
  210 + .collect(Collectors.toList());
  211 + collect.add("id");
  212 +
  213 + return ArrayUtil.toArray(collect, String.class);
  214 + }
  215 +
  216 +}
... ...
src/test/resources/sql/clean.sql
... ... @@ -7,3 +7,6 @@ DELETE FROM &quot;sys_dict_data&quot;;
7 7 DELETE FROM "sys_role";
8 8 DELETE FROM "sys_role_menu";
9 9 DELETE FROM "sys_menu";
  10 +DELETE FROM "sys_login_log";
  11 +DELETE FROM "sys_operate_log";
  12 +DELETE FROM "sys_user";
... ...
src/test/resources/sql/create_tables.sql
... ... @@ -100,3 +100,71 @@ CREATE TABLE IF NOT EXISTS &quot;sys_menu&quot; (
100 100 "deleted" bit NOT NULL DEFAULT FALSE,
101 101 PRIMARY KEY ("id")
102 102 ) COMMENT '菜单权限表';
  103 +
  104 +CREATE TABLE IF NOT EXISTS `sys_login_log` (
  105 + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  106 + `log_type` bigint(4) NOT NULL,
  107 + `trace_id` varchar(64) NOT NULL DEFAULT '',
  108 + `username` varchar(50) NOT NULL DEFAULT '',
  109 + `result` tinyint(4) NOT NULL,
  110 + `user_ip` varchar(50) NOT NULL,
  111 + `user_agent` varchar(512) NOT NULL,
  112 + `create_by` varchar(64) DEFAULT '',
  113 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  114 + `update_by` varchar(64) DEFAULT '',
  115 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  116 + `deleted` bit(1) NOT NULL DEFAULT '0',
  117 + PRIMARY KEY (`id`)
  118 +) COMMENT ='系统访问记录';
  119 +
  120 +
  121 +CREATE TABLE `sys_operate_log` (
  122 + `id` bigint(20) NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  123 + `trace_id` varchar(64) NOT NULL DEFAULT '',
  124 + `user_id` bigint(20) NOT NULL,
  125 + `module` varchar(50) NOT NULL,
  126 + `name` varchar(50) NOT NULL,
  127 + `operate_type` bigint(4) NOT NULL DEFAULT '0',
  128 + `content` varchar(2000) NOT NULL DEFAULT '',
  129 + `exts` varchar(512) NOT NULL DEFAULT '',
  130 + `request_method` varchar(16) DEFAULT '',
  131 + `request_url` varchar(255) DEFAULT '',
  132 + `user_ip` varchar(50) DEFAULT NULL,
  133 + `user_agent` varchar(200) DEFAULT NULL,
  134 + `java_method` varchar(512) NOT NULL DEFAULT '',
  135 + `java_method_args` varchar(8000) DEFAULT '',
  136 + `start_time` datetime NOT NULL,
  137 + `duration` int(11) NOT NULL,
  138 + `result_code` int(11) NOT NULL DEFAULT '0',
  139 + `result_msg` varchar(512) DEFAULT '',
  140 + `result_data` varchar(4000) DEFAULT '',
  141 + `create_by` varchar(64) DEFAULT '',
  142 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  143 + `update_by` varchar(64) DEFAULT '',
  144 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  145 + `deleted` bit(1) NOT NULL DEFAULT '0',
  146 + PRIMARY KEY (`id`)
  147 +) COMMENT ='操作日志记录';
  148 +
  149 +create table "sys_user" (
  150 + "id" bigint not null GENERATED BY DEFAULT AS IDENTITY,
  151 + "username" varchar(30) not null,
  152 + "password" varchar(100) not null default '',
  153 + "nickname" varchar(30) not null,
  154 + "remark" varchar(500) default null,
  155 + "dept_id" bigint default null,
  156 + "post_ids" varchar(255) default null,
  157 + "email" varchar(50) default '',
  158 + "mobile" varchar(11) default '',
  159 + "sex" tinyint default '0',
  160 + "avatar" varchar(100) default '',
  161 + "status" tinyint not null default '0',
  162 + "login_ip" varchar(50) default '',
  163 + "login_date" timestamp default null,
  164 + "create_by" varchar(64) default '',
  165 + "create_time" timestamp not null default current_timestamp,
  166 + "update_by" varchar(64) default '',
  167 + "update_time" timestamp not null default current_timestamp,
  168 + "deleted" bit not null default false,
  169 + primary key ("id")
  170 +) comment '用户信息表';
103 171 \ No newline at end of file
... ...