parent
69344986ec
commit
d8fba50336
52 changed files with 3515 additions and 215 deletions
@ -1,9 +0,0 @@ |
|||||||
package com.teaching.backend.annotation; |
|
||||||
|
|
||||||
/** |
|
||||||
* @Author:youhang |
|
||||||
* @Date:2024-05-30-18:20 |
|
||||||
* @Description: |
|
||||||
*/ |
|
||||||
public class test1 { |
|
||||||
} |
|
@ -1,9 +0,0 @@ |
|||||||
package com.teaching.backend.aop; |
|
||||||
|
|
||||||
/** |
|
||||||
* @Author:youhang |
|
||||||
* @Date:2024-05-30-18:20 |
|
||||||
* @Description: |
|
||||||
*/ |
|
||||||
public class test1 { |
|
||||||
} |
|
@ -0,0 +1,377 @@ |
|||||||
|
package com.teaching.backend.api; |
||||||
|
|
||||||
|
public interface CommonConstant { |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 未查询到信息 |
||||||
|
*/ |
||||||
|
public String delete_batch_success = "批量删除成功!"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 未查询到信息 |
||||||
|
*/ |
||||||
|
public String detail_failed = "未查询到信息"; |
||||||
|
/** |
||||||
|
* 修改失败标志 |
||||||
|
*/ |
||||||
|
public String update_failed = "修改失败"; |
||||||
|
/** |
||||||
|
* 修改失败标志 |
||||||
|
*/ |
||||||
|
public String update_success = "修改成功"; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* message: 添加成功 |
||||||
|
*/ |
||||||
|
public static final String MESSAGE_add_SUCCESS = "添加成功"; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* message: 添加成功 |
||||||
|
*/ |
||||||
|
public static final String MESSAGE_add__FAILED = "添加失败"; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
* message: 添加成功 |
||||||
|
*/ |
||||||
|
public static final String MESSAGE_QUERY_SUCCESS = "查询成功"; |
||||||
|
/** |
||||||
|
* |
||||||
|
* message:删除成功 |
||||||
|
*/ |
||||||
|
public static final String MESSAGE_DELETE_SUCCESS = "删除成功"; |
||||||
|
/** |
||||||
|
* |
||||||
|
* message:删除失败 |
||||||
|
*/ |
||||||
|
public static final String MESSAGE_DELETE_FAILED = "删除失败"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 正常状态 |
||||||
|
*/ |
||||||
|
public static final Integer STATUS_NORMAL = 0; |
||||||
|
|
||||||
|
/** |
||||||
|
* 禁用状态 |
||||||
|
*/ |
||||||
|
public static final Integer STATUS_DISABLE = -1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除标志 |
||||||
|
*/ |
||||||
|
public static final Integer DEL_FLAG_1 = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 未删除 |
||||||
|
*/ |
||||||
|
public static final Integer DEL_FLAG_0 = 0; |
||||||
|
|
||||||
|
/** |
||||||
|
* 系统日志类型: 登录 |
||||||
|
*/ |
||||||
|
public static final int LOG_TYPE_1 = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 系统日志类型: 操作 |
||||||
|
*/ |
||||||
|
public static final int LOG_TYPE_2 = 2; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作日志类型: 查询 |
||||||
|
*/ |
||||||
|
public static final int OPERATE_TYPE_1 = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作日志类型: 添加 |
||||||
|
*/ |
||||||
|
public static final int OPERATE_TYPE_2 = 2; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作日志类型: 更新 |
||||||
|
*/ |
||||||
|
public static final int OPERATE_TYPE_3 = 3; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作日志类型: 删除 |
||||||
|
*/ |
||||||
|
public static final int OPERATE_TYPE_4 = 4; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作日志类型: 倒入 |
||||||
|
*/ |
||||||
|
public static final int OPERATE_TYPE_5 = 5; |
||||||
|
|
||||||
|
/** |
||||||
|
* 操作日志类型: 导出 |
||||||
|
*/ |
||||||
|
public static final int OPERATE_TYPE_6 = 6; |
||||||
|
|
||||||
|
|
||||||
|
/** {@code 500 Server Error} (HTTP/1.0 - RFC 1945) */ |
||||||
|
public static final Integer SC_INTERNAL_SERVER_ERROR_500 = 500; |
||||||
|
/** {@code 200 OK} (HTTP/1.0 - RFC 1945) */ |
||||||
|
public static final Integer SC_OK_200 = 200; |
||||||
|
|
||||||
|
/**访问权限认证未通过 510*/ |
||||||
|
public static final Integer SC_JEECG_NO_AUTHZ=510; |
||||||
|
|
||||||
|
/** 登录用户Shiro权限缓存KEY前缀 */ |
||||||
|
public static String PREFIX_USER_SHIRO_CACHE = "shiro:cache:org.jeecg.config.shiro.ShiroRealm.authorizationCache:"; |
||||||
|
/** 登录用户Token令牌缓存KEY前缀 */ |
||||||
|
public static final String PREFIX_USER_TOKEN = "prefix_user_token_"; |
||||||
|
/** Token缓存时间:3600秒即一小时 */ |
||||||
|
public static final int TOKEN_EXPIRE_TIME = 3600; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 0:一级菜单 |
||||||
|
*/ |
||||||
|
public static final Integer MENU_TYPE_0 = 0; |
||||||
|
/** |
||||||
|
* 1:子菜单 |
||||||
|
*/ |
||||||
|
public static final Integer MENU_TYPE_1 = 1; |
||||||
|
/** |
||||||
|
* 2:按钮权限 |
||||||
|
*/ |
||||||
|
public static final Integer MENU_TYPE_2 = 2; |
||||||
|
|
||||||
|
/**通告对象类型(USER:指定用户,ALL:全体用户)*/ |
||||||
|
public static final String MSG_TYPE_UESR = "USER"; |
||||||
|
public static final String MSG_TYPE_ALL = "ALL"; |
||||||
|
|
||||||
|
/**发布状态(0未发布,1已发布,2已撤销)*/ |
||||||
|
public static final String NO_SEND = "0"; |
||||||
|
public static final String HAS_SEND = "1"; |
||||||
|
public static final String HAS_CANCLE = "2"; |
||||||
|
|
||||||
|
/**阅读状态(0未读,1已读)*/ |
||||||
|
public static final String HAS_READ_FLAG = "1"; |
||||||
|
public static final String NO_READ_FLAG = "0"; |
||||||
|
|
||||||
|
/**优先级(L低,M中,H高)*/ |
||||||
|
public static final String PRIORITY_L = "L"; |
||||||
|
public static final String PRIORITY_M = "M"; |
||||||
|
public static final String PRIORITY_H = "H"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 短信模板方式 0 .登录模板、1.注册模板、2.忘记密码模板 |
||||||
|
*/ |
||||||
|
public static final String SMS_TPL_TYPE_0 = "0"; |
||||||
|
public static final String SMS_TPL_TYPE_1 = "1"; |
||||||
|
public static final String SMS_TPL_TYPE_2 = "2"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 状态(0无效1有效) |
||||||
|
*/ |
||||||
|
public static final String STATUS_0 = "0"; |
||||||
|
public static final String STATUS_1 = "1"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 同步工作流引擎1同步0不同步 |
||||||
|
*/ |
||||||
|
public static final Integer ACT_SYNC_1 = 1; |
||||||
|
public static final Integer ACT_SYNC_0 = 0; |
||||||
|
|
||||||
|
/** |
||||||
|
* 消息类型1:通知公告2:系统消息 |
||||||
|
*/ |
||||||
|
public static final String MSG_CATEGORY_1 = "1"; |
||||||
|
public static final String MSG_CATEGORY_2 = "2"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否配置菜单的数据权限 1是0否 |
||||||
|
*/ |
||||||
|
public static final Integer RULE_FLAG_0 = 0; |
||||||
|
public static final Integer RULE_FLAG_1 = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否用户已被冻结 1正常(解冻) 2冻结 |
||||||
|
*/ |
||||||
|
public static final Integer USER_UNFREEZE = 1; |
||||||
|
public static final Integer USER_FREEZE = 2; |
||||||
|
|
||||||
|
/**字典翻译文本后缀*/ |
||||||
|
public static final String DICT_TEXT_SUFFIX = "_dictText"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 表单设计器主表类型 |
||||||
|
*/ |
||||||
|
public static final Integer DESIGN_FORM_TYPE_MAIN = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 表单设计器子表表类型 |
||||||
|
*/ |
||||||
|
public static final Integer DESIGN_FORM_TYPE_SUB = 2; |
||||||
|
|
||||||
|
/** |
||||||
|
* 表单设计器URL授权通过 |
||||||
|
*/ |
||||||
|
public static final Integer DESIGN_FORM_URL_STATUS_PASSED = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 表单设计器URL授权未通过 |
||||||
|
*/ |
||||||
|
public static final Integer DESIGN_FORM_URL_STATUS_NOT_PASSED = 2; |
||||||
|
|
||||||
|
/** |
||||||
|
* 表单设计器新增 Flag |
||||||
|
*/ |
||||||
|
public static final String DESIGN_FORM_URL_TYPE_ADD = "add"; |
||||||
|
/** |
||||||
|
* 表单设计器修改 Flag |
||||||
|
*/ |
||||||
|
public static final String DESIGN_FORM_URL_TYPE_EDIT = "edit"; |
||||||
|
/** |
||||||
|
* 表单设计器详情 Flag |
||||||
|
*/ |
||||||
|
public static final String DESIGN_FORM_URL_TYPE_DETAIL = "detail"; |
||||||
|
/** |
||||||
|
* 表单设计器复用数据 Flag |
||||||
|
*/ |
||||||
|
public static final String DESIGN_FORM_URL_TYPE_REUSE = "reuse"; |
||||||
|
/** |
||||||
|
* 表单设计器编辑 Flag (已弃用) |
||||||
|
*/ |
||||||
|
public static final String DESIGN_FORM_URL_TYPE_VIEW = "view"; |
||||||
|
|
||||||
|
/** |
||||||
|
* online参数值设置(是:Y, 否:N) |
||||||
|
*/ |
||||||
|
public static final String ONLINE_PARAM_VAL_IS_TURE = "Y"; |
||||||
|
public static final String ONLINE_PARAM_VAL_IS_FALSE = "N"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 文件上传类型(本地:local,Minio:minio,阿里云:alioss) |
||||||
|
*/ |
||||||
|
public static final String UPLOAD_TYPE_LOCAL = "local"; |
||||||
|
public static final String UPLOAD_TYPE_MINIO = "minio"; |
||||||
|
public static final String UPLOAD_TYPE_OSS = "alioss"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 文档上传自定义桶名称 |
||||||
|
*/ |
||||||
|
public static final String UPLOAD_CUSTOM_BUCKET = "eoafile"; |
||||||
|
/** |
||||||
|
* 文档上传自定义路径 |
||||||
|
*/ |
||||||
|
public static final String UPLOAD_CUSTOM_PATH = "eoafile"; |
||||||
|
/** |
||||||
|
* 文件外链接有效天数 |
||||||
|
*/ |
||||||
|
public static final Integer UPLOAD_EFFECTIVE_DAYS = 1; |
||||||
|
|
||||||
|
/** |
||||||
|
* 员工身份 (1:普通员工 2:上级) |
||||||
|
*/ |
||||||
|
public static final Integer USER_IDENTITY_1 = 1; |
||||||
|
public static final Integer USER_IDENTITY_2 = 2; |
||||||
|
|
||||||
|
/** sys_user 表 username 唯一键索引 */ |
||||||
|
public static final String SQL_INDEX_UNIQ_SYS_USER_USERNAME = "uniq_sys_user_username"; |
||||||
|
/** sys_user 表 work_no 唯一键索引 */ |
||||||
|
public static final String SQL_INDEX_UNIQ_SYS_USER_WORK_NO = "uniq_sys_user_work_no"; |
||||||
|
/** sys_user 表 phone 唯一键索引 */ |
||||||
|
public static final String SQL_INDEX_UNIQ_SYS_USER_PHONE = "uniq_sys_user_phone"; |
||||||
|
/** sys_user 表 email 唯一键索引 */ |
||||||
|
public static final String SQL_INDEX_UNIQ_SYS_USER_EMAIL = "uniq_sys_user_email"; |
||||||
|
/** sys_quartz_job 表 job_class_name 唯一键索引 */ |
||||||
|
public static final String SQL_INDEX_UNIQ_JOB_CLASS_NAME = "uniq_job_class_name"; |
||||||
|
/** sys_position 表 code 唯一键索引 */ |
||||||
|
public static final String SQL_INDEX_UNIQ_CODE = "uniq_code"; |
||||||
|
/** sys_role 表 code 唯一键索引 */ |
||||||
|
public static final String SQL_INDEX_UNIQ_SYS_ROLE_CODE = "uniq_sys_role_role_code"; |
||||||
|
/** sys_depart 表 code 唯一键索引 */ |
||||||
|
public static final String SQL_INDEX_UNIQ_DEPART_ORG_CODE = "uniq_depart_org_code"; |
||||||
|
/** |
||||||
|
* 在线聊天 是否为默认分组 |
||||||
|
*/ |
||||||
|
public static final String IM_DEFAULT_GROUP = "1"; |
||||||
|
/** |
||||||
|
* 在线聊天 图片文件保存路径 |
||||||
|
*/ |
||||||
|
public static final String IM_UPLOAD_CUSTOM_PATH = "imfile"; |
||||||
|
/** |
||||||
|
* 在线聊天 用户状态 |
||||||
|
*/ |
||||||
|
public static final String IM_STATUS_ONLINE = "online"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 在线聊天 SOCKET消息类型 |
||||||
|
*/ |
||||||
|
public static final String IM_SOCKET_TYPE = "chatMessage"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 在线聊天 是否开启默认添加好友 1是 0否 |
||||||
|
*/ |
||||||
|
public static final String IM_DEFAULT_ADD_FRIEND = "1"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 在线聊天 用户好友缓存前缀 |
||||||
|
*/ |
||||||
|
public static final String IM_PREFIX_USER_FRIEND_CACHE = "sys:cache:im:im_prefix_user_friend_"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 考勤补卡业务状态 (1:同意 2:不同意) |
||||||
|
*/ |
||||||
|
public static final String SIGN_PATCH_BIZ_STATUS_1 = "1"; |
||||||
|
public static final String SIGN_PATCH_BIZ_STATUS_2 = "2"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 公文文档上传自定义路径 |
||||||
|
*/ |
||||||
|
public static final String UPLOAD_CUSTOM_PATH_OFFICIAL = "officialdoc"; |
||||||
|
/** |
||||||
|
* 公文文档下载自定义路径 |
||||||
|
*/ |
||||||
|
public static final String DOWNLOAD_CUSTOM_PATH_OFFICIAL = "officaldown"; |
||||||
|
|
||||||
|
/** |
||||||
|
* WPS存储值类别(1 code文号 2 text(WPS模板还是公文发文模板)) |
||||||
|
*/ |
||||||
|
public static final String WPS_TYPE_1="1"; |
||||||
|
public static final String WPS_TYPE_2="2"; |
||||||
|
|
||||||
|
|
||||||
|
public final static String X_ACCESS_TOKEN = "X-Access-Token"; |
||||||
|
public final static String X_SIGN = "X-Sign"; |
||||||
|
public final static String X_TIMESTAMP = "X-TIMESTAMP"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 多租户 请求头 |
||||||
|
*/ |
||||||
|
public final static String TENANT_ID = "tenant-id"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 微服务读取配置文件属性 服务地址 |
||||||
|
*/ |
||||||
|
public final static String CLOUD_SERVER_KEY = "spring.cloud.nacos.discovery.server-addr"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 第三方登录 验证密码/创建用户 都需要设置一个操作码 防止被恶意调用 |
||||||
|
*/ |
||||||
|
public final static String THIRD_LOGIN_CODE = "third_login_code"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 第三方APP同步方向:本地 --> 第三方APP |
||||||
|
*/ |
||||||
|
String THIRD_SYNC_TO_APP = "SYNC_TO_APP"; |
||||||
|
/** |
||||||
|
* 第三方APP同步方向:第三方APP --> 本地 |
||||||
|
*/ |
||||||
|
String THIRD_SYNC_TO_LOCAL = "SYNC_TO_LOCAL"; |
||||||
|
|
||||||
|
/** 系统通告消息状态:0=未发布 */ |
||||||
|
String ANNOUNCEMENT_SEND_STATUS_0 = "0"; |
||||||
|
/** 系统通告消息状态:1=已发布 */ |
||||||
|
String ANNOUNCEMENT_SEND_STATUS_1 = "1"; |
||||||
|
/** 系统通告消息状态:2=已撤销 */ |
||||||
|
String ANNOUNCEMENT_SEND_STATUS_2 = "2"; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,117 @@ |
|||||||
|
package com.teaching.backend.api; |
||||||
|
|
||||||
|
/** |
||||||
|
* @auther macrozheng |
||||||
|
* @description 通用返回对象 |
||||||
|
* @date 2019/4/19 |
||||||
|
* @github https://github.com/macrozheng
|
||||||
|
*/ |
||||||
|
public class CommonResult<T> { |
||||||
|
private long code; |
||||||
|
private String message; |
||||||
|
private T data; |
||||||
|
|
||||||
|
protected CommonResult() { |
||||||
|
} |
||||||
|
|
||||||
|
protected CommonResult(long code, String message, T data) { |
||||||
|
this.code = code; |
||||||
|
this.message = message; |
||||||
|
this.data = data; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 成功返回结果 |
||||||
|
* |
||||||
|
* @param data 获取的数据 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> success(T data) { |
||||||
|
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 成功返回结果 |
||||||
|
* |
||||||
|
* @param data 获取的数据 |
||||||
|
* @param message 提示信息 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> success(T data, String message) { |
||||||
|
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 失败返回结果 |
||||||
|
* @param errorCode 错误码 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> failed(IErrorCode errorCode) { |
||||||
|
return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 失败返回结果 |
||||||
|
* @param message 提示信息 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> failed(String message) { |
||||||
|
return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 失败返回结果 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> failed() { |
||||||
|
return failed(ResultCode.FAILED); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 参数验证失败返回结果 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> validateFailed() { |
||||||
|
return failed(ResultCode.VALIDATE_FAILED); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 参数验证失败返回结果 |
||||||
|
* @param message 提示信息 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> validateFailed(String message) { |
||||||
|
return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 未登录返回结果 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> unauthorized(T data) { |
||||||
|
return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 未授权返回结果 |
||||||
|
*/ |
||||||
|
public static <T> CommonResult<T> forbidden(T data) { |
||||||
|
return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data); |
||||||
|
} |
||||||
|
|
||||||
|
public long getCode() { |
||||||
|
return code; |
||||||
|
} |
||||||
|
|
||||||
|
public void setCode(long code) { |
||||||
|
this.code = code; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMessage() { |
||||||
|
return message; |
||||||
|
} |
||||||
|
|
||||||
|
public void setMessage(String message) { |
||||||
|
this.message = message; |
||||||
|
} |
||||||
|
|
||||||
|
public T getData() { |
||||||
|
return data; |
||||||
|
} |
||||||
|
|
||||||
|
public void setData(T data) { |
||||||
|
this.data = data; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package com.teaching.backend.api; |
||||||
|
|
||||||
|
/** |
||||||
|
* @auther macrozheng |
||||||
|
* @description 封装API的错误码 |
||||||
|
* @date 2019/4/19 |
||||||
|
* @github https://github.com/macrozheng
|
||||||
|
*/ |
||||||
|
public interface IErrorCode { |
||||||
|
long getCode(); |
||||||
|
|
||||||
|
String getMessage(); |
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package com.teaching.backend.api; |
||||||
|
|
||||||
|
/** |
||||||
|
* @auther macrozheng |
||||||
|
* @description 枚举了一些常用API操作码 |
||||||
|
* @date 2019/4/19 |
||||||
|
* @github https://github.com/macrozheng
|
||||||
|
*/ |
||||||
|
public enum ResultCode implements IErrorCode { |
||||||
|
SUCCESS(200, "操作成功"), |
||||||
|
FAILED(500, "操作失败"), |
||||||
|
VALIDATE_FAILED(404, "参数检验失败"), |
||||||
|
UNAUTHORIZED(401, "暂未登录或token已经过期"), |
||||||
|
FORBIDDEN(403, "没有相关权限"); |
||||||
|
private long code; |
||||||
|
private String message; |
||||||
|
|
||||||
|
private ResultCode(long code, String message) { |
||||||
|
this.code = code; |
||||||
|
this.message = message; |
||||||
|
} |
||||||
|
|
||||||
|
public long getCode() { |
||||||
|
return code; |
||||||
|
} |
||||||
|
|
||||||
|
public String getMessage() { |
||||||
|
return message; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
package com.teaching.backend.component; |
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil; |
||||||
|
import org.springframework.security.access.AccessDecisionManager; |
||||||
|
import org.springframework.security.access.AccessDeniedException; |
||||||
|
import org.springframework.security.access.ConfigAttribute; |
||||||
|
import org.springframework.security.authentication.InsufficientAuthenticationException; |
||||||
|
import org.springframework.security.core.Authentication; |
||||||
|
import org.springframework.security.core.GrantedAuthority; |
||||||
|
|
||||||
|
import java.util.Collection; |
||||||
|
import java.util.Iterator; |
||||||
|
|
||||||
|
/** |
||||||
|
* 动态权限决策管理器,用于判断用户是否有访问权限 |
||||||
|
* Created by macro on 2020/2/7. |
||||||
|
*/ |
||||||
|
public class DynamicAccessDecisionManager implements AccessDecisionManager { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void decide(Authentication authentication, Object object, |
||||||
|
Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException { |
||||||
|
// 当接口未被配置资源时直接放行
|
||||||
|
if (CollUtil.isEmpty(configAttributes)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
Iterator<ConfigAttribute> iterator = configAttributes.iterator(); |
||||||
|
while (iterator.hasNext()) { |
||||||
|
ConfigAttribute configAttribute = iterator.next(); |
||||||
|
//将访问所需资源或用户拥有资源进行比对
|
||||||
|
String needAuthority = configAttribute.getAttribute(); |
||||||
|
for (GrantedAuthority grantedAuthority : authentication.getAuthorities()) { |
||||||
|
if (needAuthority.trim().equals(grantedAuthority.getAuthority())) { |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
throw new AccessDeniedException("抱歉,您没有访问权限"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean supports(ConfigAttribute configAttribute) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean supports(Class<?> aClass) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,77 @@ |
|||||||
|
package com.teaching.backend.component; |
||||||
|
|
||||||
|
import com.teaching.backend.config.IgnoreUrlsConfig; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.security.access.SecurityMetadataSource; |
||||||
|
import org.springframework.security.access.intercept.AbstractSecurityInterceptor; |
||||||
|
import org.springframework.security.access.intercept.InterceptorStatusToken; |
||||||
|
import org.springframework.security.web.FilterInvocation; |
||||||
|
import org.springframework.util.AntPathMatcher; |
||||||
|
import org.springframework.util.PathMatcher; |
||||||
|
|
||||||
|
import javax.servlet.*; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* 动态权限过滤器,用于实现基于路径的动态权限过滤 |
||||||
|
* Created by macro on 2020/2/7. |
||||||
|
*/ |
||||||
|
public class DynamicSecurityFilter extends AbstractSecurityInterceptor implements Filter { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private DynamicSecurityMetadataSource dynamicSecurityMetadataSource; |
||||||
|
@Autowired |
||||||
|
private IgnoreUrlsConfig ignoreUrlsConfig; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
public void setMyAccessDecisionManager(DynamicAccessDecisionManager dynamicAccessDecisionManager) { |
||||||
|
super.setAccessDecisionManager(dynamicAccessDecisionManager); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void init(FilterConfig filterConfig) throws ServletException { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { |
||||||
|
HttpServletRequest request = (HttpServletRequest) servletRequest; |
||||||
|
FilterInvocation fi = new FilterInvocation(servletRequest, servletResponse, filterChain); |
||||||
|
//OPTIONS请求直接放行
|
||||||
|
if(request.getMethod().equals(HttpMethod.OPTIONS.toString())){ |
||||||
|
fi.getChain().doFilter(fi.getRequest(), fi.getResponse()); |
||||||
|
return; |
||||||
|
} |
||||||
|
//白名单请求直接放行
|
||||||
|
PathMatcher pathMatcher = new AntPathMatcher(); |
||||||
|
for (String path : ignoreUrlsConfig.getUrls()) { |
||||||
|
if(pathMatcher.match(path,request.getRequestURI())){ |
||||||
|
fi.getChain().doFilter(fi.getRequest(), fi.getResponse()); |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
//此处会调用AccessDecisionManager中的decide方法进行鉴权操作
|
||||||
|
InterceptorStatusToken token = super.beforeInvocation(fi); |
||||||
|
try { |
||||||
|
fi.getChain().doFilter(fi.getRequest(), fi.getResponse()); |
||||||
|
} finally { |
||||||
|
super.afterInvocation(token, null); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void destroy() { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Class<?> getSecureObjectClass() { |
||||||
|
return FilterInvocation.class; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public SecurityMetadataSource obtainSecurityMetadataSource() { |
||||||
|
return dynamicSecurityMetadataSource; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,64 @@ |
|||||||
|
package com.teaching.backend.component; |
||||||
|
|
||||||
|
import cn.hutool.core.util.URLUtil; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.security.access.ConfigAttribute; |
||||||
|
import org.springframework.security.web.FilterInvocation; |
||||||
|
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource; |
||||||
|
import org.springframework.util.AntPathMatcher; |
||||||
|
import org.springframework.util.PathMatcher; |
||||||
|
|
||||||
|
import javax.annotation.PostConstruct; |
||||||
|
import java.util.*; |
||||||
|
|
||||||
|
/** |
||||||
|
* 动态权限数据源,用于获取动态权限规则 |
||||||
|
* Created by macro on 2020/2/7. |
||||||
|
*/ |
||||||
|
public class DynamicSecurityMetadataSource implements FilterInvocationSecurityMetadataSource { |
||||||
|
|
||||||
|
private static Map<String, ConfigAttribute> configAttributeMap = null; |
||||||
|
@Autowired |
||||||
|
private DynamicSecurityService dynamicSecurityService; |
||||||
|
|
||||||
|
@PostConstruct |
||||||
|
public void loadDataSource() { |
||||||
|
configAttributeMap = dynamicSecurityService.loadDataSource(); |
||||||
|
} |
||||||
|
|
||||||
|
public void clearDataSource() { |
||||||
|
configAttributeMap.clear(); |
||||||
|
configAttributeMap = null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Collection<ConfigAttribute> getAttributes(Object o) throws IllegalArgumentException { |
||||||
|
if (configAttributeMap == null) this.loadDataSource(); |
||||||
|
List<ConfigAttribute> configAttributes = new ArrayList<>(); |
||||||
|
//获取当前访问的路径
|
||||||
|
String url = ((FilterInvocation) o).getRequestUrl(); |
||||||
|
String path = URLUtil.getPath(url); |
||||||
|
PathMatcher pathMatcher = new AntPathMatcher(); |
||||||
|
Iterator<String> iterator = configAttributeMap.keySet().iterator(); |
||||||
|
//获取访问该路径所需资源
|
||||||
|
while (iterator.hasNext()) { |
||||||
|
String pattern = iterator.next(); |
||||||
|
if (pathMatcher.match(pattern, path)) { |
||||||
|
configAttributes.add(configAttributeMap.get(pattern)); |
||||||
|
} |
||||||
|
} |
||||||
|
// 未设置操作请求权限,返回空集合
|
||||||
|
return configAttributes; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Collection<ConfigAttribute> getAllConfigAttributes() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean supports(Class<?> aClass) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.teaching.backend.component; |
||||||
|
|
||||||
|
import org.springframework.security.access.ConfigAttribute; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* 动态权限相关业务接口 |
||||||
|
* Created by macro on 2020/2/7. |
||||||
|
*/ |
||||||
|
public interface DynamicSecurityService { |
||||||
|
/** |
||||||
|
* 加载资源ANT通配符和资源对应MAP |
||||||
|
*/ |
||||||
|
Map<String, ConfigAttribute> loadDataSource(); |
||||||
|
} |
@ -0,0 +1,58 @@ |
|||||||
|
package com.teaching.backend.component; |
||||||
|
|
||||||
|
|
||||||
|
import com.teaching.backend.utils.JwtTokenUtil; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
||||||
|
import org.springframework.security.core.context.SecurityContextHolder; |
||||||
|
import org.springframework.security.core.userdetails.UserDetails; |
||||||
|
import org.springframework.security.core.userdetails.UserDetailsService; |
||||||
|
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; |
||||||
|
import org.springframework.web.filter.OncePerRequestFilter; |
||||||
|
|
||||||
|
import javax.servlet.FilterChain; |
||||||
|
import javax.servlet.ServletException; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* JWT登录授权过滤器 |
||||||
|
* Created by macro on 2018/4/26. |
||||||
|
*/ |
||||||
|
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter { |
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(JwtAuthenticationTokenFilter.class); |
||||||
|
@Autowired |
||||||
|
private UserDetailsService userDetailsService; |
||||||
|
@Autowired |
||||||
|
private JwtTokenUtil jwtTokenUtil; |
||||||
|
@Value("${jwt.tokenHeader}") |
||||||
|
private String tokenHeader; |
||||||
|
@Value("${jwt.tokenHead}") |
||||||
|
private String tokenHead; |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void doFilterInternal(HttpServletRequest request, |
||||||
|
HttpServletResponse response, |
||||||
|
FilterChain chain) throws ServletException, IOException { |
||||||
|
String authHeader = request.getHeader(this.tokenHeader); |
||||||
|
if (authHeader != null && authHeader.startsWith(this.tokenHead)) { |
||||||
|
String authToken = authHeader.substring(this.tokenHead.length());// The part after "Bearer "
|
||||||
|
String username = jwtTokenUtil.getUserNameFromToken(authToken); |
||||||
|
LOGGER.info("checking username:{}", username); |
||||||
|
if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) { |
||||||
|
UserDetails userDetails = this.userDetailsService.loadUserByUsername(username); |
||||||
|
if (jwtTokenUtil.validateToken(authToken, userDetails)) { |
||||||
|
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); |
||||||
|
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); |
||||||
|
LOGGER.info("authenticated user:{}", username); |
||||||
|
SecurityContextHolder.getContext().setAuthentication(authentication); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
chain.doFilter(request, response); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package com.teaching.backend.component; |
||||||
|
|
||||||
|
import cn.hutool.json.JSONUtil; |
||||||
|
import com.teaching.backend.api.CommonResult; |
||||||
|
import org.springframework.security.core.AuthenticationException; |
||||||
|
import org.springframework.security.web.AuthenticationEntryPoint; |
||||||
|
|
||||||
|
import javax.servlet.ServletException; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* 自定义未登录或者token失效时的返回结果 |
||||||
|
* Created by macro on 2018/5/14. |
||||||
|
*/ |
||||||
|
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { |
||||||
|
@Override |
||||||
|
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { |
||||||
|
response.setHeader("Access-Control-Allow-Origin", "*"); |
||||||
|
response.setHeader("Cache-Control","no-cache"); |
||||||
|
response.setCharacterEncoding("UTF-8"); |
||||||
|
response.setContentType("application/json"); |
||||||
|
response.getWriter().println(JSONUtil.parse(CommonResult.unauthorized(authException.getMessage()))); |
||||||
|
response.getWriter().flush(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,29 @@ |
|||||||
|
package com.teaching.backend.component; |
||||||
|
|
||||||
|
import cn.hutool.json.JSONUtil; |
||||||
|
import com.teaching.backend.api.CommonResult; |
||||||
|
import org.springframework.security.access.AccessDeniedException; |
||||||
|
import org.springframework.security.web.access.AccessDeniedHandler; |
||||||
|
|
||||||
|
import javax.servlet.ServletException; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
|
||||||
|
/** |
||||||
|
* 自定义无权限访问的返回结果 |
||||||
|
* Created by macro on 2018/4/26. |
||||||
|
*/ |
||||||
|
public class RestfulAccessDeniedHandler implements AccessDeniedHandler{ |
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest request, |
||||||
|
HttpServletResponse response, |
||||||
|
AccessDeniedException e) throws IOException, ServletException { |
||||||
|
response.setHeader("Access-Control-Allow-Origin", "*"); |
||||||
|
response.setHeader("Cache-Control","no-cache"); |
||||||
|
response.setCharacterEncoding("UTF-8"); |
||||||
|
response.setContentType("application/json"); |
||||||
|
response.getWriter().println(JSONUtil.parse(CommonResult.forbidden(e.getMessage()))); |
||||||
|
response.getWriter().flush(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,67 @@ |
|||||||
|
package com.teaching.backend.config; |
||||||
|
|
||||||
|
|
||||||
|
import com.teaching.backend.component.*; |
||||||
|
import com.teaching.backend.utils.JwtTokenUtil; |
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; |
||||||
|
import org.springframework.context.annotation.Bean; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; |
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder; |
||||||
|
|
||||||
|
/** |
||||||
|
* SpringSecurity通用配置 |
||||||
|
* 包括通用Bean、Security通用Bean及动态权限通用Bean |
||||||
|
* Created by macro on 2022/5/20. |
||||||
|
*/ |
||||||
|
@Configuration |
||||||
|
public class CommonSecurityConfig { |
||||||
|
|
||||||
|
@Bean |
||||||
|
public PasswordEncoder passwordEncoder() { |
||||||
|
return new BCryptPasswordEncoder(); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public IgnoreUrlsConfig ignoreUrlsConfig() { |
||||||
|
return new IgnoreUrlsConfig(); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public JwtTokenUtil jwtTokenUtil() { |
||||||
|
return new JwtTokenUtil(); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public RestfulAccessDeniedHandler restfulAccessDeniedHandler() { |
||||||
|
return new RestfulAccessDeniedHandler(); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public RestAuthenticationEntryPoint restAuthenticationEntryPoint() { |
||||||
|
return new RestAuthenticationEntryPoint(); |
||||||
|
} |
||||||
|
|
||||||
|
@Bean |
||||||
|
public JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter(){ |
||||||
|
return new JwtAuthenticationTokenFilter(); |
||||||
|
} |
||||||
|
|
||||||
|
@ConditionalOnBean(name = "dynamicSecurityService") |
||||||
|
@Bean |
||||||
|
public DynamicAccessDecisionManager dynamicAccessDecisionManager() { |
||||||
|
return new DynamicAccessDecisionManager(); |
||||||
|
} |
||||||
|
|
||||||
|
@ConditionalOnBean(name = "dynamicSecurityService") |
||||||
|
@Bean |
||||||
|
public DynamicSecurityMetadataSource dynamicSecurityMetadataSource() { |
||||||
|
return new DynamicSecurityMetadataSource(); |
||||||
|
} |
||||||
|
|
||||||
|
@ConditionalOnBean(name = "dynamicSecurityService") |
||||||
|
@Bean |
||||||
|
public DynamicSecurityFilter dynamicSecurityFilter(){ |
||||||
|
return new DynamicSecurityFilter(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.teaching.backend.config; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* SpringSecurity白名单资源路径配置 |
||||||
|
* Created by macro on 2018/11/5. |
||||||
|
*/ |
||||||
|
@Getter |
||||||
|
@Setter |
||||||
|
@ConfigurationProperties(prefix = "secure.ignored") |
||||||
|
public class IgnoreUrlsConfig { |
||||||
|
|
||||||
|
private List<String> urls = new ArrayList<>(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,47 @@ |
|||||||
|
package com.teaching.backend.config; |
||||||
|
|
||||||
|
|
||||||
|
import com.teaching.backend.service.umsAdmin.UmsAdminService; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.context.annotation.Bean; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.security.access.ConfigAttribute; |
||||||
|
import org.springframework.security.core.userdetails.UserDetailsService; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||||
|
|
||||||
|
/** |
||||||
|
* mall-security模块相关配置 |
||||||
|
* Created by macro on 2019/11/9. |
||||||
|
*/ |
||||||
|
@Configuration |
||||||
|
public class MallSecurityConfig { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private UmsAdminService umsadminService; |
||||||
|
// @Autowired
|
||||||
|
// private UmsResourceService resourceService;
|
||||||
|
|
||||||
|
@Bean |
||||||
|
public UserDetailsService userDetailsService() { |
||||||
|
//获取登录用户信息
|
||||||
|
return username -> umsadminService.loadUserByUsername(username); |
||||||
|
} |
||||||
|
|
||||||
|
// @Bean
|
||||||
|
// public DynamicSecurityService dynamicSecurityService() {
|
||||||
|
// return new DynamicSecurityService() {
|
||||||
|
// @Override
|
||||||
|
// public Map<String, ConfigAttribute> loadDataSource() {
|
||||||
|
// Map<String, ConfigAttribute> map = new ConcurrentHashMap<>();
|
||||||
|
// List<UmsResource> resourceList = resourceService.listAll();
|
||||||
|
// for (UmsResource resource : resourceList) {
|
||||||
|
// map.put(resource.getUrl(), new org.springframework.security.access.SecurityConfig(resource.getId() + ":" + resource.getName()));
|
||||||
|
// }
|
||||||
|
// return map;
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
// }
|
||||||
|
} |
@ -0,0 +1,75 @@ |
|||||||
|
package com.teaching.backend.config; |
||||||
|
|
||||||
|
import com.teaching.backend.component.*; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.context.annotation.Bean; |
||||||
|
import org.springframework.context.annotation.Configuration; |
||||||
|
import org.springframework.http.HttpMethod; |
||||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity; |
||||||
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; |
||||||
|
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; |
||||||
|
import org.springframework.security.config.http.SessionCreationPolicy; |
||||||
|
import org.springframework.security.web.SecurityFilterChain; |
||||||
|
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor; |
||||||
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* SpringSecurity相关配置,仅用于配置SecurityFilterChain |
||||||
|
* Created by macro on 2019/11/5. |
||||||
|
*/ |
||||||
|
@Configuration |
||||||
|
@EnableWebSecurity |
||||||
|
public class SecurityConfig { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private IgnoreUrlsConfig ignoreUrlsConfig; |
||||||
|
@Autowired |
||||||
|
private RestfulAccessDeniedHandler restfulAccessDeniedHandler; |
||||||
|
@Autowired |
||||||
|
private RestAuthenticationEntryPoint restAuthenticationEntryPoint; |
||||||
|
@Autowired |
||||||
|
private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter; |
||||||
|
@Autowired(required = false) |
||||||
|
private DynamicSecurityService dynamicSecurityService; |
||||||
|
@Autowired(required = false) |
||||||
|
private DynamicSecurityFilter dynamicSecurityFilter; |
||||||
|
|
||||||
|
@Bean |
||||||
|
SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { |
||||||
|
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity |
||||||
|
.authorizeRequests(); |
||||||
|
//不需要保护的资源路径允许访问
|
||||||
|
for (String url : ignoreUrlsConfig.getUrls()) { |
||||||
|
registry.antMatchers(url).permitAll(); |
||||||
|
} |
||||||
|
//允许跨域请求的OPTIONS请求
|
||||||
|
registry.antMatchers(HttpMethod.OPTIONS) |
||||||
|
.permitAll(); |
||||||
|
// 任何请求需要身份认证
|
||||||
|
registry.and() |
||||||
|
.authorizeRequests() |
||||||
|
.anyRequest() |
||||||
|
.authenticated() |
||||||
|
// 关闭跨站请求防护及不使用session
|
||||||
|
.and() |
||||||
|
.csrf() |
||||||
|
.disable() |
||||||
|
.sessionManagement() |
||||||
|
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) |
||||||
|
// 自定义权限拒绝处理类
|
||||||
|
.and() |
||||||
|
.exceptionHandling() |
||||||
|
.accessDeniedHandler(restfulAccessDeniedHandler) |
||||||
|
.authenticationEntryPoint(restAuthenticationEntryPoint) |
||||||
|
// 自定义权限拦截器JWT过滤器
|
||||||
|
.and() |
||||||
|
.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); |
||||||
|
//有动态权限配置时添加动态权限校验过滤器
|
||||||
|
if(dynamicSecurityService!=null){ |
||||||
|
registry.and().addFilterBefore(dynamicSecurityFilter, FilterSecurityInterceptor.class); |
||||||
|
} |
||||||
|
return httpSecurity.build(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package com.teaching.backend.constant; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class RegexPatterns { |
||||||
|
/** |
||||||
|
* 手机号正则 |
||||||
|
*/ |
||||||
|
public static final String PHONE_REGEX = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$"; |
||||||
|
/** |
||||||
|
* 密码正则。4~32位的字母、数字、下划线 |
||||||
|
*/ |
||||||
|
public static final String PASSWORD_REGEX = "^\\w{4,32}$"; |
||||||
|
/** |
||||||
|
* 验证码正则, 6位数字或字母 |
||||||
|
*/ |
||||||
|
public static final String VERIFY_CODE_REGEX = "^[a-zA-Z\\d]{6}$"; |
||||||
|
} |
@ -1,9 +0,0 @@ |
|||||||
package com.teaching.backend.constant; |
|
||||||
|
|
||||||
/** |
|
||||||
* @Author:youhang |
|
||||||
* @Date:2024-05-30-18:20 |
|
||||||
* @Description: |
|
||||||
*/ |
|
||||||
public class test1 { |
|
||||||
} |
|
@ -0,0 +1,155 @@ |
|||||||
|
package com.teaching.backend.controller.umsAdmin; |
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil; |
||||||
|
import com.teaching.backend.api.CommonResult; |
||||||
|
import com.teaching.backend.model.dto.UmsAdminParam; |
||||||
|
import com.teaching.backend.model.dto.UpdateAdminPasswordParam; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsAdmin; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsRole; |
||||||
|
import com.teaching.backend.service.umsAdmin.UmsAdminService; |
||||||
|
import com.teaching.backend.service.umsAdmin.UmsRoleService; |
||||||
|
import io.swagger.annotations.Api; |
||||||
|
import io.swagger.annotations.ApiOperation; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.http.ResponseEntity; |
||||||
|
import org.springframework.validation.annotation.Validated; |
||||||
|
import org.springframework.web.bind.annotation.*; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import java.security.Principal; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @Author:xhn |
||||||
|
* @Date:2024-05-30-18:15 |
||||||
|
* @Description:login |
||||||
|
*/ |
||||||
|
@RestController |
||||||
|
@Api(tags = "UmsAdminController") |
||||||
|
@RequestMapping("/user") |
||||||
|
@Slf4j |
||||||
|
public class UmsAdminController { |
||||||
|
@Value("${jwt.tokenHeader}") |
||||||
|
private String tokenHeader; |
||||||
|
@Value("${jwt.tokenHead}") |
||||||
|
private String tokenHead; |
||||||
|
@Autowired |
||||||
|
private UmsAdminService umsAdminService; |
||||||
|
@Autowired |
||||||
|
private UmsRoleService umsRoleService; |
||||||
|
|
||||||
|
|
||||||
|
@ApiOperation(value = "用户注册") |
||||||
|
@PostMapping("/register") |
||||||
|
public CommonResult<UmsAdmin> register(@Validated @RequestBody UmsAdminParam umsAdminParam) { |
||||||
|
if (umsAdminParam == null) { |
||||||
|
return CommonResult.failed(); |
||||||
|
} |
||||||
|
UmsAdmin umsAdmin = umsAdminService.register(umsAdminParam); |
||||||
|
return CommonResult.success(umsAdmin); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation(value = "登录以后返回token") |
||||||
|
@PostMapping("/login") |
||||||
|
public CommonResult login(@Validated @RequestBody UmsAdmin umsAdmin) { |
||||||
|
String token = umsAdminService.login(umsAdmin.getUsername(), umsAdmin.getPassword()); |
||||||
|
if (token == null) { |
||||||
|
return CommonResult.validateFailed("用户名或密码错误"); |
||||||
|
} |
||||||
|
Map<String, String> tokenMap = new HashMap<>(); |
||||||
|
tokenMap.put("token", token); |
||||||
|
tokenMap.put("tokenHead", tokenHead); |
||||||
|
return CommonResult.success(tokenMap); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送短信 |
||||||
|
* @param phone |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
@ApiOperation(value = "发送短信返回验证码") |
||||||
|
@PostMapping("/code") |
||||||
|
public CommonResult<String> sendVerifyCode(@RequestParam("phone")String phone){ |
||||||
|
return CommonResult.success(umsAdminService.sendVerifyCode(phone)); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation(value = "手机号注册") |
||||||
|
@PostMapping("/phone/register") |
||||||
|
public CommonResult<UmsAdmin> phoneRegister(@Validated @RequestBody UmsAdminParam umsAdminParam) { |
||||||
|
if (umsAdminParam == null) { |
||||||
|
return CommonResult.failed(); |
||||||
|
} |
||||||
|
UmsAdmin umsAdmin = umsAdminService.phoneRegister(umsAdminParam); |
||||||
|
return CommonResult.success(umsAdmin); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation(value = "刷新token") |
||||||
|
@GetMapping("/refreshToken") |
||||||
|
public CommonResult refreshToken(HttpServletRequest request) { |
||||||
|
String token = request.getHeader(tokenHeader); |
||||||
|
String refreshToken = umsAdminService.refreshToken(token); |
||||||
|
if (refreshToken == null) { |
||||||
|
return CommonResult.failed("token已经过期!"); |
||||||
|
} |
||||||
|
Map<String, String> tokenMap = new HashMap<>(); |
||||||
|
tokenMap.put("token", refreshToken); |
||||||
|
tokenMap.put("tokenHead", tokenHead); |
||||||
|
return CommonResult.success(tokenMap); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation(value = "获取当前登录用户信息") |
||||||
|
@GetMapping ("/info") |
||||||
|
public CommonResult getAdminInfo(Principal principal) { |
||||||
|
if(principal == null){ |
||||||
|
return CommonResult.unauthorized(null); |
||||||
|
} |
||||||
|
String username = principal.getName(); |
||||||
|
UmsAdmin umsAdmin = umsAdminService.getAdminByUsername(username); |
||||||
|
Map<String, Object> data = new HashMap<>(); |
||||||
|
data.put("id",umsAdmin.getId()); |
||||||
|
data.put("username", umsAdmin.getUsername()); |
||||||
|
data.put("menus", umsRoleService.getMenuList(umsAdmin.getId())); |
||||||
|
data.put("phone", umsAdmin.getPhone()); |
||||||
|
data.put("nickName", umsAdmin.getNickName()); |
||||||
|
data.put("icon", umsAdmin.getIcon()); |
||||||
|
List<UmsRole> roleList = umsAdminService.getRoleList(umsAdmin.getId()); |
||||||
|
if(CollUtil.isNotEmpty(roleList)){ |
||||||
|
List<String> roles = roleList.stream().map(UmsRole::getName).collect(Collectors.toList()); |
||||||
|
data.put("roles",roles); |
||||||
|
} |
||||||
|
return CommonResult.success(data); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation("修改指定用户信息") |
||||||
|
@PostMapping("/update") |
||||||
|
public CommonResult updateUms(@RequestBody UmsAdmin umsadmin) { |
||||||
|
boolean count = umsAdminService.updateUms(umsadmin); |
||||||
|
if (count == true) { |
||||||
|
return CommonResult.success(count); |
||||||
|
} |
||||||
|
return CommonResult.failed(); |
||||||
|
} |
||||||
|
|
||||||
|
@ApiOperation("修改指定用户密码") |
||||||
|
@PostMapping("/updatePassword") |
||||||
|
public CommonResult updatePassword(@Validated @RequestBody UpdateAdminPasswordParam updatePasswordParam) { |
||||||
|
int status = umsAdminService.updatePassword(updatePasswordParam); |
||||||
|
if (status > 0) { |
||||||
|
return CommonResult.success(status); |
||||||
|
} else if (status == -1) { |
||||||
|
return CommonResult.failed("提交参数不合法"); |
||||||
|
} else if (status == -2) { |
||||||
|
return CommonResult.failed("找不到该用户"); |
||||||
|
} else if (status == -3) { |
||||||
|
return CommonResult.failed("旧密码错误"); |
||||||
|
} else { |
||||||
|
return CommonResult.failed(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.teaching.backend.exception; |
||||||
|
|
||||||
|
|
||||||
|
import com.teaching.backend.api.IErrorCode; |
||||||
|
|
||||||
|
/** |
||||||
|
* 自定义API异常 |
||||||
|
* Created by macro on 2020/2/27. |
||||||
|
*/ |
||||||
|
public class ApiException extends RuntimeException { |
||||||
|
private IErrorCode errorCode; |
||||||
|
|
||||||
|
public ApiException(IErrorCode errorCode) { |
||||||
|
super(errorCode.getMessage()); |
||||||
|
this.errorCode = errorCode; |
||||||
|
} |
||||||
|
|
||||||
|
public ApiException(String message) { |
||||||
|
super(message); |
||||||
|
} |
||||||
|
|
||||||
|
public ApiException(Throwable cause) { |
||||||
|
super(cause); |
||||||
|
} |
||||||
|
|
||||||
|
public ApiException(String message, Throwable cause) { |
||||||
|
super(message, cause); |
||||||
|
} |
||||||
|
|
||||||
|
public IErrorCode getErrorCode() { |
||||||
|
return errorCode; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.teaching.backend.exception; |
||||||
|
|
||||||
|
|
||||||
|
import com.teaching.backend.api.IErrorCode; |
||||||
|
|
||||||
|
/** |
||||||
|
* 断言处理类,用于抛出各种API异常 |
||||||
|
* Created by macro on 2020/2/27. |
||||||
|
*/ |
||||||
|
public class Asserts { |
||||||
|
public static void fail(String message) { |
||||||
|
throw new ApiException(message); |
||||||
|
} |
||||||
|
|
||||||
|
public static void fail(IErrorCode errorCode) { |
||||||
|
throw new ApiException(errorCode); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.teaching.backend.exception; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
|
||||||
|
|
||||||
|
@Getter |
||||||
|
public class LyException extends RuntimeException { |
||||||
|
/** |
||||||
|
* 异常状态码信息 |
||||||
|
*/ |
||||||
|
private int status; |
||||||
|
|
||||||
|
public LyException(int status) { |
||||||
|
this.status = status; |
||||||
|
} |
||||||
|
|
||||||
|
public LyException(int status, String message) { |
||||||
|
super(message); |
||||||
|
this.status = status; |
||||||
|
} |
||||||
|
|
||||||
|
public LyException(int status, String message, Throwable cause) { |
||||||
|
super(message, cause); |
||||||
|
this.status = status; |
||||||
|
} |
||||||
|
|
||||||
|
public LyException(int status, Throwable cause) { |
||||||
|
super(cause); |
||||||
|
this.status = status; |
||||||
|
} |
||||||
|
} |
@ -1,9 +0,0 @@ |
|||||||
package com.teaching.backend.manager; |
|
||||||
|
|
||||||
/** |
|
||||||
* @Author:youhang |
|
||||||
* @Date:2024-05-30-18:20 |
|
||||||
* @Description: |
|
||||||
*/ |
|
||||||
public class test1 { |
|
||||||
} |
|
@ -0,0 +1,9 @@ |
|||||||
|
package com.teaching.backend.mapper.umsAdmin; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsAdmin; |
||||||
|
import org.apache.ibatis.annotations.Mapper; |
||||||
|
|
||||||
|
@Mapper |
||||||
|
public interface UmsAdminMapper extends BaseMapper<UmsAdmin> { |
||||||
|
} |
@ -0,0 +1,38 @@ |
|||||||
|
package com.teaching.backend.mapper.umsAdmin; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsAdminRoleRelation; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsResource; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsRole; |
||||||
|
import org.apache.ibatis.annotations.Mapper; |
||||||
|
import org.apache.ibatis.annotations.Param; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 后台用户与角色关系管理自定义Dao |
||||||
|
* Created by macro on 2018/10/8. |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface UmsAdminRoleRelationMapper extends BaseMapper<UmsAdminRoleRelation> { |
||||||
|
// /**
|
||||||
|
// * 批量插入用户角色关系
|
||||||
|
// */
|
||||||
|
// int insertList(@Param("list") List<UmsAdminRoleRelation> adminRoleRelationList);
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取用于所有角色 |
||||||
|
*/ |
||||||
|
List<UmsRole> getRoleList(@Param("adminId") Long adminId); |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取用户所有可访问资源 |
||||||
|
*/ |
||||||
|
List<UmsResource> getResourceList(@Param("adminId") Long adminId); |
||||||
|
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * 获取资源相关用户ID列表
|
||||||
|
// */
|
||||||
|
// List<Long> getAdminIdList(@Param("resourceId") Long resourceId);
|
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
package com.teaching.backend.mapper.umsAdmin; |
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsAdminRoleRelation; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsMenu; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsRole; |
||||||
|
import org.apache.ibatis.annotations.Mapper; |
||||||
|
import org.apache.ibatis.annotations.Param; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 后台角色管理自定义Dao |
||||||
|
* Created by macro on 2020/2/2. |
||||||
|
*/ |
||||||
|
@Mapper |
||||||
|
public interface UmsRoleMapper extends BaseMapper<UmsRole> { |
||||||
|
/** |
||||||
|
* 根据后台用户ID获取菜单 |
||||||
|
*/ |
||||||
|
List<UmsMenu> getMenuList(@Param("adminId") Long adminId); |
||||||
|
// /**
|
||||||
|
// * 根据角色ID获取菜单
|
||||||
|
// */
|
||||||
|
// List<UmsMenu> getMenuListByRoleId(@Param("roleId") Long roleId);
|
||||||
|
// /**
|
||||||
|
// * 根据角色ID获取资源
|
||||||
|
// */
|
||||||
|
// List<UmsResource> getResourceListByRoleId(@Param("roleId") Long roleId);
|
||||||
|
} |
@ -0,0 +1,30 @@ |
|||||||
|
package com.teaching.backend.model.dto; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.time.LocalDateTime; |
||||||
|
|
||||||
|
@Data |
||||||
|
@TableName("ums_admin") |
||||||
|
public class UmsAdminParam implements Serializable { |
||||||
|
|
||||||
|
//用户名
|
||||||
|
private String username; |
||||||
|
|
||||||
|
//密码
|
||||||
|
private String password; |
||||||
|
|
||||||
|
//手机号
|
||||||
|
private String phone; |
||||||
|
|
||||||
|
//昵称
|
||||||
|
private String nickName; |
||||||
|
|
||||||
|
//头像
|
||||||
|
private String icon; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.teaching.backend.model.dto; |
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 修改用户名密码参数 |
||||||
|
* Created by macro on 2019/10/9. |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
public class UpdateAdminPasswordParam { |
||||||
|
// @NotEmpty
|
||||||
|
@ApiModelProperty(value = "用户名", required = true) |
||||||
|
private String username; |
||||||
|
// @NotEmpty
|
||||||
|
@ApiModelProperty(value = "旧密码", required = true) |
||||||
|
private String oldPassword; |
||||||
|
// @NotEmpty
|
||||||
|
@ApiModelProperty(value = "新密码", required = true) |
||||||
|
private String newPassword; |
||||||
|
} |
@ -1,96 +1,96 @@ |
|||||||
package com.teaching.backend.model.entity.records; |
//package com.teaching.backend.model.entity.records;
|
||||||
|
//
|
||||||
|
//
|
||||||
import com.baomidou.mybatisplus.annotation.IdType; |
//import com.baomidou.mybatisplus.annotation.IdType;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId; |
//import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import com.baomidou.mybatisplus.annotation.TableName; |
//import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data; |
//import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode; |
//import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors; |
//import lombok.experimental.Accessors;
|
||||||
|
//
|
||||||
import java.time.LocalDateTime; |
//import java.time.LocalDateTime;
|
||||||
|
//
|
||||||
|
//
|
||||||
@Data |
//@Data
|
||||||
@EqualsAndHashCode(callSuper = false) |
//@EqualsAndHashCode(callSuper = false)
|
||||||
@Accessors(chain = true) |
//@Accessors(chain = true)
|
||||||
@TableName("learning_records") |
//@TableName("learning_records")
|
||||||
public class LearningRecords { |
//public class LearningRecords {
|
||||||
private static final long serialVersionUID = 1L; |
// private static final long serialVersionUID = 1L;
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 内部编号 |
// * 内部编号
|
||||||
*/ |
// */
|
||||||
@TableId(value = "id", type = IdType.ASSIGN_ID) |
// @TableId(value = "id", type = IdType.ASSIGN_ID)
|
||||||
private String id; |
// private String id;
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 用户id |
// * 用户id
|
||||||
*/ |
// */
|
||||||
private String userId; |
// private String userId;
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 课程id |
// * 课程id
|
||||||
*/ |
// */
|
||||||
private String coursesId; |
// private String coursesId;
|
||||||
/** |
// /**
|
||||||
* 章节id |
// * 章节id
|
||||||
*/ |
// */
|
||||||
private String chapterId; |
// private String chapterId;
|
||||||
/** |
// /**
|
||||||
* 知识点id |
// * 知识点id
|
||||||
*/ |
// */
|
||||||
private String knowledgePointId; |
// private String knowledgePointId;
|
||||||
/** |
// /**
|
||||||
* 资源id |
// * 资源id
|
||||||
*/ |
// */
|
||||||
private String resourceId; |
// private String resourceId;
|
||||||
/** |
// /**
|
||||||
* 访问时间 |
// * 访问时间
|
||||||
*/ |
// */
|
||||||
private LocalDateTime accessTime; |
// private LocalDateTime accessTime;
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 学习方式:打开; 1,打开过,2未打开 |
// * 学习方式:打开; 1,打开过,2未打开
|
||||||
*/ |
// */
|
||||||
private String learningMethod1; |
// private String learningMethod1;
|
||||||
/** |
// /**
|
||||||
* 学习方式:下载; 1下载过, 2未下载 |
// * 学习方式:下载; 1下载过, 2未下载
|
||||||
*/ |
// */
|
||||||
private String learningMethod2; |
// private String learningMethod2;
|
||||||
/** |
// /**
|
||||||
*视频学习时长 |
// *视频学习时长
|
||||||
*/ |
// */
|
||||||
private String videoDuration; |
// private String videoDuration;
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
*是否完成观看:1,已完成,0未完成 |
// *是否完成观看:1,已完成,0未完成
|
||||||
*/ |
// */
|
||||||
private String isCompleted; |
// private String isCompleted;
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 记录封面图片 |
// * 记录封面图片
|
||||||
*/ |
// */
|
||||||
private String content; |
// private String content;
|
||||||
/** |
// /**
|
||||||
* 资源地址 |
// * 资源地址
|
||||||
*/ |
// */
|
||||||
private String address; |
// private String address;
|
||||||
|
//
|
||||||
/** |
// /**
|
||||||
* 是否存在: 1存在;0不存在; |
// * 是否存在: 1存在;0不存在;
|
||||||
*/ |
// */
|
||||||
private String status; |
// private String status;
|
||||||
/** |
// /**
|
||||||
* 类型, 如:1,课程; 2,章节; 3,知识点; 4,学习资源 |
// * 类型, 如:1,课程; 2,章节; 3,知识点; 4,学习资源
|
||||||
*/ |
// */
|
||||||
private String type; |
// private String type;
|
||||||
/** |
// /**
|
||||||
* 父节点 |
// * 父节点
|
||||||
*/ |
// */
|
||||||
private String parentNode; |
// private String parentNode;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
} |
//}
|
||||||
|
@ -0,0 +1,64 @@ |
|||||||
|
package com.teaching.backend.model.entity.umsAdmin; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
import org.springframework.security.core.GrantedAuthority; |
||||||
|
import org.springframework.security.core.authority.SimpleGrantedAuthority; |
||||||
|
import org.springframework.security.core.userdetails.UserDetails; |
||||||
|
|
||||||
|
import java.util.Collection; |
||||||
|
import java.util.List; |
||||||
|
import java.util.stream.Collectors; |
||||||
|
|
||||||
|
/** |
||||||
|
* SpringSecurity需要的用户信息封装类 |
||||||
|
* Created by macro on 2018/4/26. |
||||||
|
*/ |
||||||
|
public class AdminUserDetails implements UserDetails { |
||||||
|
//后台用户
|
||||||
|
private final UmsAdmin umsAdmin; |
||||||
|
//拥有资源列表
|
||||||
|
private final List<UmsResource> resourceList; |
||||||
|
|
||||||
|
public AdminUserDetails(UmsAdmin umsAdmin, List<UmsResource> resourceList) { |
||||||
|
this.umsAdmin = umsAdmin; |
||||||
|
this.resourceList = resourceList; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Collection<? extends GrantedAuthority> getAuthorities() { |
||||||
|
//返回当前用户所拥有的资源
|
||||||
|
return resourceList.stream() |
||||||
|
.map(resource ->new SimpleGrantedAuthority(resource.getId()+":"+resource.getName())) |
||||||
|
.collect(Collectors.toList()); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPassword() { |
||||||
|
return umsAdmin.getPassword(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getUsername() { |
||||||
|
return umsAdmin.getUsername(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isAccountNonExpired() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isAccountNonLocked() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isCredentialsNonExpired() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isEnabled() { |
||||||
|
return umsAdmin.getStatus().equals(1); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
package com.teaching.backend.model.entity.umsAdmin; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.IdType; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableId; |
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.time.LocalDateTime; |
||||||
|
|
||||||
|
@Data |
||||||
|
@TableName("ums_admin") |
||||||
|
public class UmsAdmin implements Serializable { |
||||||
|
|
||||||
|
//主键
|
||||||
|
@TableId(type = IdType.AUTO) |
||||||
|
private Long id; |
||||||
|
|
||||||
|
//用户名
|
||||||
|
private String username; |
||||||
|
|
||||||
|
//密码
|
||||||
|
private String password; |
||||||
|
|
||||||
|
//手机号
|
||||||
|
private String phone; |
||||||
|
|
||||||
|
//昵称
|
||||||
|
private String nickName; |
||||||
|
|
||||||
|
//头像
|
||||||
|
private String icon; |
||||||
|
|
||||||
|
//注册时间
|
||||||
|
private LocalDateTime createTime; |
||||||
|
|
||||||
|
//账号状态
|
||||||
|
private Integer status; |
||||||
|
} |
@ -0,0 +1,860 @@ |
|||||||
|
package com.teaching.backend.model.entity.umsAdmin; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class UmsAdminExample { |
||||||
|
protected String orderByClause; |
||||||
|
|
||||||
|
protected boolean distinct; |
||||||
|
|
||||||
|
protected List<Criteria> oredCriteria; |
||||||
|
|
||||||
|
public UmsAdminExample() { |
||||||
|
oredCriteria = new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setOrderByClause(String orderByClause) { |
||||||
|
this.orderByClause = orderByClause; |
||||||
|
} |
||||||
|
|
||||||
|
public String getOrderByClause() { |
||||||
|
return orderByClause; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDistinct(boolean distinct) { |
||||||
|
this.distinct = distinct; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isDistinct() { |
||||||
|
return distinct; |
||||||
|
} |
||||||
|
|
||||||
|
public List<Criteria> getOredCriteria() { |
||||||
|
return oredCriteria; |
||||||
|
} |
||||||
|
|
||||||
|
public void or(Criteria criteria) { |
||||||
|
oredCriteria.add(criteria); |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria or() { |
||||||
|
Criteria criteria = createCriteriaInternal(); |
||||||
|
oredCriteria.add(criteria); |
||||||
|
return criteria; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria createCriteria() { |
||||||
|
Criteria criteria = createCriteriaInternal(); |
||||||
|
if (oredCriteria.size() == 0) { |
||||||
|
oredCriteria.add(criteria); |
||||||
|
} |
||||||
|
return criteria; |
||||||
|
} |
||||||
|
|
||||||
|
protected Criteria createCriteriaInternal() { |
||||||
|
Criteria criteria = new Criteria(); |
||||||
|
return criteria; |
||||||
|
} |
||||||
|
|
||||||
|
public void clear() { |
||||||
|
oredCriteria.clear(); |
||||||
|
orderByClause = null; |
||||||
|
distinct = false; |
||||||
|
} |
||||||
|
|
||||||
|
protected abstract static class GeneratedCriteria { |
||||||
|
protected List<Criterion> criteria; |
||||||
|
|
||||||
|
protected GeneratedCriteria() { |
||||||
|
super(); |
||||||
|
criteria = new ArrayList<>(); |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isValid() { |
||||||
|
return criteria.size() > 0; |
||||||
|
} |
||||||
|
|
||||||
|
public List<Criterion> getAllCriteria() { |
||||||
|
return criteria; |
||||||
|
} |
||||||
|
|
||||||
|
public List<Criterion> getCriteria() { |
||||||
|
return criteria; |
||||||
|
} |
||||||
|
|
||||||
|
protected void addCriterion(String condition) { |
||||||
|
if (condition == null) { |
||||||
|
throw new RuntimeException("Value for condition cannot be null"); |
||||||
|
} |
||||||
|
criteria.add(new Criterion(condition)); |
||||||
|
} |
||||||
|
|
||||||
|
protected void addCriterion(String condition, Object value, String property) { |
||||||
|
if (value == null) { |
||||||
|
throw new RuntimeException("Value for " + property + " cannot be null"); |
||||||
|
} |
||||||
|
criteria.add(new Criterion(condition, value)); |
||||||
|
} |
||||||
|
|
||||||
|
protected void addCriterion(String condition, Object value1, Object value2, String property) { |
||||||
|
if (value1 == null || value2 == null) { |
||||||
|
throw new RuntimeException("Between values for " + property + " cannot be null"); |
||||||
|
} |
||||||
|
criteria.add(new Criterion(condition, value1, value2)); |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdIsNull() { |
||||||
|
addCriterion("id is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdIsNotNull() { |
||||||
|
addCriterion("id is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdEqualTo(Long value) { |
||||||
|
addCriterion("id =", value, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdNotEqualTo(Long value) { |
||||||
|
addCriterion("id <>", value, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdGreaterThan(Long value) { |
||||||
|
addCriterion("id >", value, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdGreaterThanOrEqualTo(Long value) { |
||||||
|
addCriterion("id >=", value, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdLessThan(Long value) { |
||||||
|
addCriterion("id <", value, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdLessThanOrEqualTo(Long value) { |
||||||
|
addCriterion("id <=", value, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdIn(List<Long> values) { |
||||||
|
addCriterion("id in", values, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdNotIn(List<Long> values) { |
||||||
|
addCriterion("id not in", values, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdBetween(Long value1, Long value2) { |
||||||
|
addCriterion("id between", value1, value2, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIdNotBetween(Long value1, Long value2) { |
||||||
|
addCriterion("id not between", value1, value2, "id"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameIsNull() { |
||||||
|
addCriterion("username is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameIsNotNull() { |
||||||
|
addCriterion("username is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameEqualTo(String value) { |
||||||
|
addCriterion("username =", value, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameNotEqualTo(String value) { |
||||||
|
addCriterion("username <>", value, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameGreaterThan(String value) { |
||||||
|
addCriterion("username >", value, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameGreaterThanOrEqualTo(String value) { |
||||||
|
addCriterion("username >=", value, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameLessThan(String value) { |
||||||
|
addCriterion("username <", value, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameLessThanOrEqualTo(String value) { |
||||||
|
addCriterion("username <=", value, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameLike(String value) { |
||||||
|
addCriterion("username like", value, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameNotLike(String value) { |
||||||
|
addCriterion("username not like", value, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameIn(List<String> values) { |
||||||
|
addCriterion("username in", values, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameNotIn(List<String> values) { |
||||||
|
addCriterion("username not in", values, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameBetween(String value1, String value2) { |
||||||
|
addCriterion("username between", value1, value2, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andUsernameNotBetween(String value1, String value2) { |
||||||
|
addCriterion("username not between", value1, value2, "username"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordIsNull() { |
||||||
|
addCriterion("password is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordIsNotNull() { |
||||||
|
addCriterion("password is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordEqualTo(String value) { |
||||||
|
addCriterion("password =", value, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordNotEqualTo(String value) { |
||||||
|
addCriterion("password <>", value, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordGreaterThan(String value) { |
||||||
|
addCriterion("password >", value, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordGreaterThanOrEqualTo(String value) { |
||||||
|
addCriterion("password >=", value, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordLessThan(String value) { |
||||||
|
addCriterion("password <", value, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordLessThanOrEqualTo(String value) { |
||||||
|
addCriterion("password <=", value, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordLike(String value) { |
||||||
|
addCriterion("password like", value, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordNotLike(String value) { |
||||||
|
addCriterion("password not like", value, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordIn(List<String> values) { |
||||||
|
addCriterion("password in", values, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordNotIn(List<String> values) { |
||||||
|
addCriterion("password not in", values, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordBetween(String value1, String value2) { |
||||||
|
addCriterion("password between", value1, value2, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andPasswordNotBetween(String value1, String value2) { |
||||||
|
addCriterion("password not between", value1, value2, "password"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconIsNull() { |
||||||
|
addCriterion("icon is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconIsNotNull() { |
||||||
|
addCriterion("icon is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconEqualTo(String value) { |
||||||
|
addCriterion("icon =", value, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconNotEqualTo(String value) { |
||||||
|
addCriterion("icon <>", value, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconGreaterThan(String value) { |
||||||
|
addCriterion("icon >", value, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconGreaterThanOrEqualTo(String value) { |
||||||
|
addCriterion("icon >=", value, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconLessThan(String value) { |
||||||
|
addCriterion("icon <", value, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconLessThanOrEqualTo(String value) { |
||||||
|
addCriterion("icon <=", value, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconLike(String value) { |
||||||
|
addCriterion("icon like", value, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconNotLike(String value) { |
||||||
|
addCriterion("icon not like", value, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconIn(List<String> values) { |
||||||
|
addCriterion("icon in", values, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconNotIn(List<String> values) { |
||||||
|
addCriterion("icon not in", values, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconBetween(String value1, String value2) { |
||||||
|
addCriterion("icon between", value1, value2, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andIconNotBetween(String value1, String value2) { |
||||||
|
addCriterion("icon not between", value1, value2, "icon"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailIsNull() { |
||||||
|
addCriterion("email is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailIsNotNull() { |
||||||
|
addCriterion("email is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailEqualTo(String value) { |
||||||
|
addCriterion("email =", value, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailNotEqualTo(String value) { |
||||||
|
addCriterion("email <>", value, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailGreaterThan(String value) { |
||||||
|
addCriterion("email >", value, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailGreaterThanOrEqualTo(String value) { |
||||||
|
addCriterion("email >=", value, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailLessThan(String value) { |
||||||
|
addCriterion("email <", value, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailLessThanOrEqualTo(String value) { |
||||||
|
addCriterion("email <=", value, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailLike(String value) { |
||||||
|
addCriterion("email like", value, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailNotLike(String value) { |
||||||
|
addCriterion("email not like", value, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailIn(List<String> values) { |
||||||
|
addCriterion("email in", values, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailNotIn(List<String> values) { |
||||||
|
addCriterion("email not in", values, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailBetween(String value1, String value2) { |
||||||
|
addCriterion("email between", value1, value2, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andEmailNotBetween(String value1, String value2) { |
||||||
|
addCriterion("email not between", value1, value2, "email"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameIsNull() { |
||||||
|
addCriterion("nick_name is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameIsNotNull() { |
||||||
|
addCriterion("nick_name is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameEqualTo(String value) { |
||||||
|
addCriterion("nick_name =", value, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameNotEqualTo(String value) { |
||||||
|
addCriterion("nick_name <>", value, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameGreaterThan(String value) { |
||||||
|
addCriterion("nick_name >", value, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameGreaterThanOrEqualTo(String value) { |
||||||
|
addCriterion("nick_name >=", value, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameLessThan(String value) { |
||||||
|
addCriterion("nick_name <", value, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameLessThanOrEqualTo(String value) { |
||||||
|
addCriterion("nick_name <=", value, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameLike(String value) { |
||||||
|
addCriterion("nick_name like", value, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameNotLike(String value) { |
||||||
|
addCriterion("nick_name not like", value, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameIn(List<String> values) { |
||||||
|
addCriterion("nick_name in", values, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameNotIn(List<String> values) { |
||||||
|
addCriterion("nick_name not in", values, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameBetween(String value1, String value2) { |
||||||
|
addCriterion("nick_name between", value1, value2, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNickNameNotBetween(String value1, String value2) { |
||||||
|
addCriterion("nick_name not between", value1, value2, "nickName"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteIsNull() { |
||||||
|
addCriterion("note is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteIsNotNull() { |
||||||
|
addCriterion("note is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteEqualTo(String value) { |
||||||
|
addCriterion("note =", value, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteNotEqualTo(String value) { |
||||||
|
addCriterion("note <>", value, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteGreaterThan(String value) { |
||||||
|
addCriterion("note >", value, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteGreaterThanOrEqualTo(String value) { |
||||||
|
addCriterion("note >=", value, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteLessThan(String value) { |
||||||
|
addCriterion("note <", value, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteLessThanOrEqualTo(String value) { |
||||||
|
addCriterion("note <=", value, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteLike(String value) { |
||||||
|
addCriterion("note like", value, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteNotLike(String value) { |
||||||
|
addCriterion("note not like", value, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteIn(List<String> values) { |
||||||
|
addCriterion("note in", values, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteNotIn(List<String> values) { |
||||||
|
addCriterion("note not in", values, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteBetween(String value1, String value2) { |
||||||
|
addCriterion("note between", value1, value2, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andNoteNotBetween(String value1, String value2) { |
||||||
|
addCriterion("note not between", value1, value2, "note"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeIsNull() { |
||||||
|
addCriterion("create_time is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeIsNotNull() { |
||||||
|
addCriterion("create_time is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeEqualTo(Date value) { |
||||||
|
addCriterion("create_time =", value, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeNotEqualTo(Date value) { |
||||||
|
addCriterion("create_time <>", value, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeGreaterThan(Date value) { |
||||||
|
addCriterion("create_time >", value, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeGreaterThanOrEqualTo(Date value) { |
||||||
|
addCriterion("create_time >=", value, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeLessThan(Date value) { |
||||||
|
addCriterion("create_time <", value, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeLessThanOrEqualTo(Date value) { |
||||||
|
addCriterion("create_time <=", value, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeIn(List<Date> values) { |
||||||
|
addCriterion("create_time in", values, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeNotIn(List<Date> values) { |
||||||
|
addCriterion("create_time not in", values, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeBetween(Date value1, Date value2) { |
||||||
|
addCriterion("create_time between", value1, value2, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andCreateTimeNotBetween(Date value1, Date value2) { |
||||||
|
addCriterion("create_time not between", value1, value2, "createTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeIsNull() { |
||||||
|
addCriterion("login_time is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeIsNotNull() { |
||||||
|
addCriterion("login_time is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeEqualTo(Date value) { |
||||||
|
addCriterion("login_time =", value, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeNotEqualTo(Date value) { |
||||||
|
addCriterion("login_time <>", value, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeGreaterThan(Date value) { |
||||||
|
addCriterion("login_time >", value, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeGreaterThanOrEqualTo(Date value) { |
||||||
|
addCriterion("login_time >=", value, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeLessThan(Date value) { |
||||||
|
addCriterion("login_time <", value, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeLessThanOrEqualTo(Date value) { |
||||||
|
addCriterion("login_time <=", value, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeIn(List<Date> values) { |
||||||
|
addCriterion("login_time in", values, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeNotIn(List<Date> values) { |
||||||
|
addCriterion("login_time not in", values, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeBetween(Date value1, Date value2) { |
||||||
|
addCriterion("login_time between", value1, value2, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andLoginTimeNotBetween(Date value1, Date value2) { |
||||||
|
addCriterion("login_time not between", value1, value2, "loginTime"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusIsNull() { |
||||||
|
addCriterion("status is null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusIsNotNull() { |
||||||
|
addCriterion("status is not null"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusEqualTo(Integer value) { |
||||||
|
addCriterion("status =", value, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusNotEqualTo(Integer value) { |
||||||
|
addCriterion("status <>", value, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusGreaterThan(Integer value) { |
||||||
|
addCriterion("status >", value, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusGreaterThanOrEqualTo(Integer value) { |
||||||
|
addCriterion("status >=", value, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusLessThan(Integer value) { |
||||||
|
addCriterion("status <", value, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusLessThanOrEqualTo(Integer value) { |
||||||
|
addCriterion("status <=", value, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusIn(List<Integer> values) { |
||||||
|
addCriterion("status in", values, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusNotIn(List<Integer> values) { |
||||||
|
addCriterion("status not in", values, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusBetween(Integer value1, Integer value2) { |
||||||
|
addCriterion("status between", value1, value2, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
|
||||||
|
public Criteria andStatusNotBetween(Integer value1, Integer value2) { |
||||||
|
addCriterion("status not between", value1, value2, "status"); |
||||||
|
return (Criteria) this; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Criteria extends GeneratedCriteria { |
||||||
|
protected Criteria() { |
||||||
|
super(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public static class Criterion { |
||||||
|
private String condition; |
||||||
|
|
||||||
|
private Object value; |
||||||
|
|
||||||
|
private Object secondValue; |
||||||
|
|
||||||
|
private boolean noValue; |
||||||
|
|
||||||
|
private boolean singleValue; |
||||||
|
|
||||||
|
private boolean betweenValue; |
||||||
|
|
||||||
|
private boolean listValue; |
||||||
|
|
||||||
|
private String typeHandler; |
||||||
|
|
||||||
|
public String getCondition() { |
||||||
|
return condition; |
||||||
|
} |
||||||
|
|
||||||
|
public Object getValue() { |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
public Object getSecondValue() { |
||||||
|
return secondValue; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isNoValue() { |
||||||
|
return noValue; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isSingleValue() { |
||||||
|
return singleValue; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isBetweenValue() { |
||||||
|
return betweenValue; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isListValue() { |
||||||
|
return listValue; |
||||||
|
} |
||||||
|
|
||||||
|
public String getTypeHandler() { |
||||||
|
return typeHandler; |
||||||
|
} |
||||||
|
|
||||||
|
protected Criterion(String condition) { |
||||||
|
super(); |
||||||
|
this.condition = condition; |
||||||
|
this.typeHandler = null; |
||||||
|
this.noValue = true; |
||||||
|
} |
||||||
|
|
||||||
|
protected Criterion(String condition, Object value, String typeHandler) { |
||||||
|
super(); |
||||||
|
this.condition = condition; |
||||||
|
this.value = value; |
||||||
|
this.typeHandler = typeHandler; |
||||||
|
if (value instanceof List<?>) { |
||||||
|
this.listValue = true; |
||||||
|
} else { |
||||||
|
this.singleValue = true; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
protected Criterion(String condition, Object value) { |
||||||
|
this(condition, value, null); |
||||||
|
} |
||||||
|
|
||||||
|
protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { |
||||||
|
super(); |
||||||
|
this.condition = condition; |
||||||
|
this.value = value; |
||||||
|
this.secondValue = secondValue; |
||||||
|
this.typeHandler = typeHandler; |
||||||
|
this.betweenValue = true; |
||||||
|
} |
||||||
|
|
||||||
|
protected Criterion(String condition, Object value, Object secondValue) { |
||||||
|
this(condition, value, secondValue, null); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.teaching.backend.model.entity.umsAdmin; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
|
||||||
|
@Data |
||||||
|
@TableName("ums_admin_role_relation") |
||||||
|
public class UmsAdminRoleRelation implements Serializable { |
||||||
|
private Long id; |
||||||
|
|
||||||
|
private Long adminId; |
||||||
|
|
||||||
|
private Long roleId; |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
package com.teaching.backend.model.entity.umsAdmin; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
@Data |
||||||
|
@TableName("ums_menu") |
||||||
|
public class UmsMenu implements Serializable { |
||||||
|
private Long id; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "父级ID") |
||||||
|
private Long parentId; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间") |
||||||
|
private Date createTime; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "菜单名称") |
||||||
|
private String title; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "菜单级数") |
||||||
|
private Integer level; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "菜单排序") |
||||||
|
private Integer sort; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "前端名称") |
||||||
|
private String name; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "前端图标") |
||||||
|
private String icon; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "前端隐藏") |
||||||
|
private Integer hidden; |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.teaching.backend.model.entity.umsAdmin; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
@Data |
||||||
|
@TableName("ums_resource") |
||||||
|
public class UmsResource implements Serializable { |
||||||
|
private Long id; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间") |
||||||
|
private Date createTime; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "资源名称") |
||||||
|
private String name; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "资源URL") |
||||||
|
private String url; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "描述") |
||||||
|
private String description; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "资源分类ID") |
||||||
|
private Long categoryId; |
||||||
|
|
||||||
|
// private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package com.teaching.backend.model.entity.umsAdmin; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName; |
||||||
|
import io.swagger.annotations.ApiModelProperty; |
||||||
|
import lombok.Data; |
||||||
|
import java.io.Serializable; |
||||||
|
import java.util.Date; |
||||||
|
|
||||||
|
@Data |
||||||
|
@TableName("ums_role") |
||||||
|
public class UmsRole implements Serializable { |
||||||
|
private Long id; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "名称") |
||||||
|
private String name; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "描述") |
||||||
|
private String description; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "后台用户数量") |
||||||
|
private Integer adminCount; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "创建时间") |
||||||
|
private Date createTime; |
||||||
|
|
||||||
|
@ApiModelProperty(value = "启用状态:0->禁用;1->启用") |
||||||
|
private Integer status; |
||||||
|
|
||||||
|
private Integer sort; |
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
} |
@ -1,9 +0,0 @@ |
|||||||
package com.teaching.backend.model.enums; |
|
||||||
|
|
||||||
/** |
|
||||||
* @Author:youhang |
|
||||||
* @Date:2024-05-30-18:20 |
|
||||||
* @Description: |
|
||||||
*/ |
|
||||||
public class test1 { |
|
||||||
} |
|
@ -1,59 +1,59 @@ |
|||||||
package com.teaching.backend.model.vo.records; |
//package com.teaching.backend.model.vo.records;
|
||||||
|
//
|
||||||
import lombok.Data; |
//import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode; |
//import lombok.EqualsAndHashCode;
|
||||||
import lombok.experimental.Accessors; |
//import lombok.experimental.Accessors;
|
||||||
|
//
|
||||||
@Data |
//@Data
|
||||||
@EqualsAndHashCode(callSuper = false) |
//@EqualsAndHashCode(callSuper = false)
|
||||||
@Accessors(chain = true) |
//@Accessors(chain = true)
|
||||||
public class LearningRecordsVo { |
//public class LearningRecordsVo {
|
||||||
// private static final long serialVersionUID = 1L;
|
//// private static final long serialVersionUID = 1L;
|
||||||
|
//
|
||||||
/** |
|
||||||
* 内部编号 |
|
||||||
*/ |
|
||||||
private String id; |
|
||||||
|
|
||||||
/** |
|
||||||
* 课程名称 |
|
||||||
*/ |
|
||||||
private String coursesName; |
|
||||||
|
|
||||||
// /**
|
// /**
|
||||||
// * 资源类型
|
// * 内部编号
|
||||||
// */
|
// */
|
||||||
// private String type;
|
// private String id;
|
||||||
|
//
|
||||||
/** |
|
||||||
* 封面 |
|
||||||
*/ |
|
||||||
private String content; |
|
||||||
|
|
||||||
/** |
|
||||||
* 资源观看人数 |
|
||||||
*/ |
|
||||||
private Long number; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* 上次观看时间 |
|
||||||
*/ |
|
||||||
private String time; |
|
||||||
/** |
|
||||||
* 地址 |
|
||||||
*/ |
|
||||||
private String address; |
|
||||||
// /**
|
// /**
|
||||||
// * 创建日期
|
// * 课程名称
|
||||||
// */
|
// */
|
||||||
// private LocalDateTime createTime;
|
// private String coursesName;
|
||||||
|
//
|
||||||
|
//// /**
|
||||||
|
//// * 资源类型
|
||||||
|
//// */
|
||||||
|
//// private String type;
|
||||||
//
|
//
|
||||||
// /**
|
// /**
|
||||||
// * 更新日期
|
// * 封面
|
||||||
// */
|
// */
|
||||||
// private LocalDateTime updateTime;
|
// private String content;
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 资源观看人数
|
||||||
} |
// */
|
||||||
|
// private Long number;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * 上次观看时间
|
||||||
|
// */
|
||||||
|
// private String time;
|
||||||
|
// /**
|
||||||
|
// * 地址
|
||||||
|
// */
|
||||||
|
// private String address;
|
||||||
|
//// /**
|
||||||
|
//// * 创建日期
|
||||||
|
//// */
|
||||||
|
//// private LocalDateTime createTime;
|
||||||
|
////
|
||||||
|
//// /**
|
||||||
|
//// * 更新日期
|
||||||
|
//// */
|
||||||
|
//// private LocalDateTime updateTime;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
@ -1,9 +0,0 @@ |
|||||||
package com.teaching.backend.model.vo; |
|
||||||
|
|
||||||
/** |
|
||||||
* @Author:youhang |
|
||||||
* @Date:2024-05-30-18:20 |
|
||||||
* @Description: |
|
||||||
*/ |
|
||||||
public class test1 { |
|
||||||
} |
|
@ -0,0 +1,74 @@ |
|||||||
|
package com.teaching.backend.service.umsAdmin; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService; |
||||||
|
import com.teaching.backend.model.dto.UmsAdminParam; |
||||||
|
import com.teaching.backend.model.dto.UpdateAdminPasswordParam; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsAdmin; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsResource; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsRole; |
||||||
|
import org.springframework.security.core.userdetails.UserDetails; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public interface UmsAdminService extends IService<UmsAdmin> { |
||||||
|
|
||||||
|
/** |
||||||
|
* 注册功能 |
||||||
|
*/ |
||||||
|
UmsAdmin register(UmsAdminParam umsAdminParam); |
||||||
|
|
||||||
|
/** |
||||||
|
* 登录功能 |
||||||
|
* @param username 用户名 |
||||||
|
* @param password 密码 |
||||||
|
* @return 生成的JWT的token |
||||||
|
*/ |
||||||
|
String login(String username, String password); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 根据用户名获取后台管理员 |
||||||
|
*/ |
||||||
|
UmsAdmin getAdminByUsername(String username); |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取指定用户的可访问的资源 |
||||||
|
*/ |
||||||
|
List<UmsResource> getResourceList(Long adminId); |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取用户信息 |
||||||
|
*/ |
||||||
|
UserDetails loadUserByUsername(String username); |
||||||
|
|
||||||
|
/** |
||||||
|
* 刷新token的功能 |
||||||
|
* @param oldToken 旧的token |
||||||
|
*/ |
||||||
|
String refreshToken(String oldToken); |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取用户对应角色 |
||||||
|
*/ |
||||||
|
List<UmsRole> getRoleList(Long adminId); |
||||||
|
|
||||||
|
/** |
||||||
|
* 修改指定用户信息 |
||||||
|
*/ |
||||||
|
boolean updateUms(UmsAdmin umsadmin); |
||||||
|
|
||||||
|
/** |
||||||
|
* 修改密码 |
||||||
|
*/ |
||||||
|
int updatePassword(UpdateAdminPasswordParam updatePasswordParam); |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送短信 |
||||||
|
*/ |
||||||
|
String sendVerifyCode(String phone); |
||||||
|
|
||||||
|
/** |
||||||
|
* 手机号注册 |
||||||
|
*/ |
||||||
|
UmsAdmin phoneRegister(UmsAdminParam umsAdminParam); |
||||||
|
} |
@ -0,0 +1,21 @@ |
|||||||
|
package com.teaching.backend.service.umsAdmin; |
||||||
|
|
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsMenu; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsResource; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsRole; |
||||||
|
import org.springframework.transaction.annotation.Transactional; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 后台角色管理Service |
||||||
|
* Created by macro on 2018/9/30. |
||||||
|
*/ |
||||||
|
public interface UmsRoleService { |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据管理员ID获取对应菜单 |
||||||
|
*/ |
||||||
|
List<UmsMenu> getMenuList(Long adminId); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,271 @@ |
|||||||
|
package com.teaching.backend.service.umsAdmin.impl; |
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil; |
||||||
|
import cn.hutool.core.util.StrUtil; |
||||||
|
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; |
||||||
|
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; |
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
||||||
|
import com.google.gson.Gson; |
||||||
|
import com.teaching.backend.exception.Asserts; |
||||||
|
import com.teaching.backend.exception.LyException; |
||||||
|
import com.teaching.backend.mapper.umsAdmin.UmsAdminMapper; |
||||||
|
import com.teaching.backend.mapper.umsAdmin.UmsAdminRoleRelationMapper; |
||||||
|
import com.teaching.backend.model.dto.UmsAdminParam; |
||||||
|
import com.teaching.backend.model.dto.UpdateAdminPasswordParam; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.AdminUserDetails; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsAdmin; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsResource; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsRole; |
||||||
|
import com.teaching.backend.service.umsAdmin.UmsAdminService; |
||||||
|
import com.teaching.backend.utils.JwtTokenUtil; |
||||||
|
import com.teaching.backend.utils.RegexUtils; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.apache.commons.lang3.RandomStringUtils; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.amqp.core.AmqpTemplate; |
||||||
|
import org.springframework.beans.BeanUtils; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.data.redis.core.StringRedisTemplate; |
||||||
|
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
||||||
|
import org.springframework.security.core.AuthenticationException; |
||||||
|
import org.springframework.security.core.context.SecurityContextHolder; |
||||||
|
import org.springframework.security.core.userdetails.UserDetails; |
||||||
|
import org.springframework.security.core.userdetails.UsernameNotFoundException; |
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import com.aliyuncs.DefaultAcsClient; |
||||||
|
import com.aliyuncs.IAcsClient; |
||||||
|
import com.aliyuncs.exceptions.ClientException; |
||||||
|
import com.aliyuncs.exceptions.ServerException; |
||||||
|
import com.aliyuncs.profile.DefaultProfile; |
||||||
|
|
||||||
|
|
||||||
|
import java.time.LocalDateTime; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Random; |
||||||
|
import java.util.UUID; |
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
public class UmsAdminServiceImpl extends ServiceImpl<UmsAdminMapper, UmsAdmin> implements UmsAdminService { |
||||||
|
|
||||||
|
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; |
||||||
|
private static final int USERNAME_LENGTH = 10; // 用户名长度
|
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(UmsAdminServiceImpl.class); |
||||||
|
@Autowired |
||||||
|
private JwtTokenUtil jwtTokenUtil; |
||||||
|
@Autowired |
||||||
|
private PasswordEncoder passwordEncoder; |
||||||
|
@Autowired |
||||||
|
private UmsAdminRoleRelationMapper adminRoleRelation; |
||||||
|
@Autowired |
||||||
|
private AmqpTemplate amqpTemplate; |
||||||
|
@Autowired |
||||||
|
private StringRedisTemplate redisTemplate; |
||||||
|
|
||||||
|
private final String KEY_PREFIX = "ly:sms:phone:"; |
||||||
|
|
||||||
|
@Override |
||||||
|
public UmsAdmin register(UmsAdminParam umsAdminParam) { |
||||||
|
UmsAdmin umsAdmin = new UmsAdmin(); |
||||||
|
BeanUtils.copyProperties(umsAdminParam, umsAdmin); |
||||||
|
umsAdmin.setCreateTime(LocalDateTime.now()); |
||||||
|
umsAdmin.setStatus(1); |
||||||
|
//查询是否有相同用户名的用户
|
||||||
|
List<UmsAdmin> umsAdminList = lambdaQuery() |
||||||
|
.eq(UmsAdmin::getUsername, umsAdmin.getUsername()) |
||||||
|
.list(); |
||||||
|
if (umsAdminList.size() > 0) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
//将密码进行加密操作
|
||||||
|
String encodePassword = passwordEncoder.encode(umsAdmin.getPassword()); |
||||||
|
umsAdmin.setPassword(encodePassword); |
||||||
|
save(umsAdmin); |
||||||
|
return umsAdmin; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String login(String username, String password) { |
||||||
|
String token = null; |
||||||
|
//密码需要客户端加密后传递
|
||||||
|
try { |
||||||
|
UserDetails userDetails = loadUserByUsername(username); |
||||||
|
if(!passwordEncoder.matches(password,userDetails.getPassword())){ |
||||||
|
Asserts.fail("密码不正确"); |
||||||
|
} |
||||||
|
if(!userDetails.isEnabled()){ |
||||||
|
Asserts.fail("帐号已被禁用"); |
||||||
|
} |
||||||
|
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); |
||||||
|
SecurityContextHolder.getContext().setAuthentication(authentication); |
||||||
|
token = jwtTokenUtil.generateToken(userDetails); |
||||||
|
} catch (AuthenticationException e) { |
||||||
|
LOGGER.warn("登录异常:{}", e.getMessage()); |
||||||
|
} |
||||||
|
return token; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean updateUms(UmsAdmin umsadmin) { |
||||||
|
if (umsadmin.getPassword().length() > 0){ |
||||||
|
Asserts.fail("修改操作错误1"); |
||||||
|
} |
||||||
|
if (umsadmin.getCreateTime() != null){ |
||||||
|
Asserts.fail("修改操作错误2"); |
||||||
|
} |
||||||
|
return updateById(umsadmin); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public int updatePassword(UpdateAdminPasswordParam param) { |
||||||
|
if(StrUtil.isEmpty(param.getUsername()) |
||||||
|
||StrUtil.isEmpty(param.getOldPassword()) |
||||||
|
||StrUtil.isEmpty(param.getNewPassword())){ |
||||||
|
return -1; |
||||||
|
} |
||||||
|
List<UmsAdmin> adminList = lambdaQuery() |
||||||
|
.eq(UmsAdmin::getUsername, param.getUsername()) |
||||||
|
.list(); |
||||||
|
if(CollUtil.isEmpty(adminList)){ |
||||||
|
return -2; |
||||||
|
} |
||||||
|
UmsAdmin umsAdmin = adminList.get(0); |
||||||
|
if(!passwordEncoder.matches(param.getOldPassword(),umsAdmin.getPassword())){ |
||||||
|
return -3; |
||||||
|
} |
||||||
|
umsAdmin.setPassword(passwordEncoder.encode(param.getNewPassword())); |
||||||
|
updateById(umsAdmin); |
||||||
|
return 1; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String sendVerifyCode(String phone) { |
||||||
|
if (!RegexUtils.isPhone(phone)) { |
||||||
|
throw new LyException(400, "手机号格式错误"); |
||||||
|
} |
||||||
|
|
||||||
|
UmsAdmin admin = lambdaQuery() |
||||||
|
.eq(UmsAdmin::getPhone, phone) |
||||||
|
.one(); |
||||||
|
if (admin != null){ |
||||||
|
// throw new ;
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
String code = RandomStringUtils.randomNumeric(5); |
||||||
|
|
||||||
|
String ALIBABA_CLOUD_ACCESS_KEY_ID = "LTAI5tF7fcDC5VTj1cVWKDU6"; |
||||||
|
String ALIBABA_CLOUD_ACCESS_KEY_SECRET = "T7kQwaOxqWgmKzTZkzpCaPVhJuaw4T"; |
||||||
|
|
||||||
|
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET); |
||||||
|
IAcsClient client = new DefaultAcsClient(profile); |
||||||
|
|
||||||
|
SendSmsRequest request = new SendSmsRequest(); |
||||||
|
request.setPhoneNumbers(phone); |
||||||
|
request.setSignName("智慧系统"); |
||||||
|
request.setTemplateCode("SMS_468225027"); |
||||||
|
request.setTemplateParam("{\"code\":\""+code+"\"}"); |
||||||
|
|
||||||
|
try { |
||||||
|
SendSmsResponse response = client.getAcsResponse(request); |
||||||
|
System.out.println("11112"+new Gson().toJson(response)); |
||||||
|
} catch (ServerException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (ClientException e) { |
||||||
|
System.out.println("ErrCode:" + e.getErrCode()); |
||||||
|
System.out.println("ErrMsg:" + e.getErrMsg()); |
||||||
|
System.out.println("RequestId:" + e.getRequestId()); |
||||||
|
} |
||||||
|
|
||||||
|
//存入,redis,存5min
|
||||||
|
this.redisTemplate.opsForValue().set(KEY_PREFIX + phone, code, 5, TimeUnit.MINUTES); |
||||||
|
|
||||||
|
return code; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public UmsAdmin phoneRegister(UmsAdminParam umsAdminParam) { |
||||||
|
UmsAdmin umsAdmin = new UmsAdmin(); |
||||||
|
BeanUtils.copyProperties(umsAdminParam, umsAdmin); |
||||||
|
umsAdmin.setCreateTime(LocalDateTime.now()); |
||||||
|
umsAdmin.setStatus(1); |
||||||
|
//查询是否有相同手机号的用户
|
||||||
|
List<UmsAdmin> umsAdminList = lambdaQuery() |
||||||
|
.eq(UmsAdmin::getPhone,umsAdminParam.getPhone()) |
||||||
|
.list(); |
||||||
|
if (umsAdminList.size() > 0 ) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
//将密码进行加密操作
|
||||||
|
String encodePassword = passwordEncoder.encode(umsAdmin.getPassword()); |
||||||
|
umsAdmin.setUsername(randomUsername()); |
||||||
|
umsAdmin.setPassword(encodePassword); |
||||||
|
save(umsAdmin); |
||||||
|
return umsAdmin; |
||||||
|
} |
||||||
|
|
||||||
|
/* |
||||||
|
随机生成用户名 |
||||||
|
*/ |
||||||
|
private String randomUsername(){ |
||||||
|
String username; |
||||||
|
UmsAdmin newUsername = new UmsAdmin(); |
||||||
|
do { |
||||||
|
UUID uuid = UUID.randomUUID(); |
||||||
|
// 这里只是简单地截取UUID的一部分作为用户名,但你可以根据需要进行更复杂的处理
|
||||||
|
username = uuid.toString().substring(0, 10); // 截取前10个字符作
|
||||||
|
newUsername = lambdaQuery().eq(UmsAdmin::getUsername, username) |
||||||
|
.one(); |
||||||
|
} while ( newUsername != null); // 如果用户名已存在,则重新生成
|
||||||
|
|
||||||
|
return username; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String refreshToken(String oldToken) { |
||||||
|
return jwtTokenUtil.refreshHeadToken(oldToken); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<UmsRole> getRoleList(Long adminId) { |
||||||
|
return adminRoleRelation.getRoleList(adminId); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public UmsAdmin getAdminByUsername(String username) { |
||||||
|
//从数据库中获取
|
||||||
|
UmsAdmin admin = lambdaQuery().eq(UmsAdmin::getUsername, username) |
||||||
|
.one(); |
||||||
|
if (admin != null) { |
||||||
|
return admin; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public List<UmsResource> getResourceList(Long adminId) { |
||||||
|
//从数据库中获取
|
||||||
|
List<UmsResource> resourceList = adminRoleRelation.getResourceList(adminId); |
||||||
|
return resourceList; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public UserDetails loadUserByUsername(String username){ |
||||||
|
//获取用户信息
|
||||||
|
UmsAdmin admin = getAdminByUsername(username); |
||||||
|
if (admin != null) { |
||||||
|
List<UmsResource> resourceList = getResourceList(admin.getId()); |
||||||
|
return new AdminUserDetails(admin,resourceList); |
||||||
|
} |
||||||
|
throw new UsernameNotFoundException("用户名或密码错误"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.teaching.backend.service.umsAdmin.impl; |
||||||
|
|
||||||
|
import com.teaching.backend.mapper.umsAdmin.UmsRoleMapper; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsMenu; |
||||||
|
import com.teaching.backend.model.entity.umsAdmin.UmsRole; |
||||||
|
import com.teaching.backend.service.umsAdmin.UmsRoleService; |
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* 后台角色管理Service实现类 |
||||||
|
* Created by macro on 2018/9/30. |
||||||
|
*/ |
||||||
|
@Service |
||||||
|
public class UmsRoleServiceImpl implements UmsRoleService { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private UmsRoleMapper umsRoleMapper; |
||||||
|
|
||||||
|
@Override |
||||||
|
public List<UmsMenu> getMenuList(Long adminId) { |
||||||
|
return umsRoleMapper.getMenuList(adminId); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,169 @@ |
|||||||
|
package com.teaching.backend.utils; |
||||||
|
|
||||||
|
import cn.hutool.core.date.DateUtil; |
||||||
|
import cn.hutool.core.util.StrUtil; |
||||||
|
import io.jsonwebtoken.Claims; |
||||||
|
import io.jsonwebtoken.Jwts; |
||||||
|
import io.jsonwebtoken.SignatureAlgorithm; |
||||||
|
import org.slf4j.Logger; |
||||||
|
import org.slf4j.LoggerFactory; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.security.core.userdetails.UserDetails; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* JwtToken生成的工具类 |
||||||
|
* JWT token的格式:header.payload.signature |
||||||
|
* header的格式(算法、token的类型): |
||||||
|
* {"alg": "HS512","typ": "JWT"} |
||||||
|
* payload的格式(用户名、创建时间、生成时间): |
||||||
|
* {"sub":"wang","created":1489079981393,"exp":1489684781} |
||||||
|
* signature的生成算法: |
||||||
|
* HMACSHA512(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret) |
||||||
|
* Created by macro on 2018/4/26. |
||||||
|
*/ |
||||||
|
public class JwtTokenUtil { |
||||||
|
private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenUtil.class); |
||||||
|
private static final String CLAIM_KEY_USERNAME = "sub"; |
||||||
|
private static final String CLAIM_KEY_CREATED = "created"; |
||||||
|
@Value("${jwt.secret}") |
||||||
|
private String secret; |
||||||
|
@Value("${jwt.expiration}") |
||||||
|
private Long expiration; |
||||||
|
@Value("${jwt.tokenHead}") |
||||||
|
private String tokenHead; |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据负责生成JWT的token |
||||||
|
*/ |
||||||
|
private String generateToken(Map<String, Object> claims) { |
||||||
|
return Jwts.builder() |
||||||
|
.setClaims(claims) |
||||||
|
.setExpiration(generateExpirationDate()) |
||||||
|
.signWith(SignatureAlgorithm.HS512, secret) |
||||||
|
.compact(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 从token中获取JWT中的负载 |
||||||
|
*/ |
||||||
|
private Claims getClaimsFromToken(String token) { |
||||||
|
Claims claims = null; |
||||||
|
try { |
||||||
|
claims = Jwts.parser() |
||||||
|
.setSigningKey(secret) |
||||||
|
.parseClaimsJws(token) |
||||||
|
.getBody(); |
||||||
|
} catch (Exception e) { |
||||||
|
LOGGER.info("JWT格式验证失败:{}", token); |
||||||
|
} |
||||||
|
return claims; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 生成token的过期时间 |
||||||
|
*/ |
||||||
|
private Date generateExpirationDate() { |
||||||
|
return new Date(System.currentTimeMillis() + expiration * 1000); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 从token中获取登录用户名 |
||||||
|
*/ |
||||||
|
public String getUserNameFromToken(String token) { |
||||||
|
String username; |
||||||
|
try { |
||||||
|
Claims claims = getClaimsFromToken(token); |
||||||
|
username = claims.getSubject(); |
||||||
|
} catch (Exception e) { |
||||||
|
username = null; |
||||||
|
} |
||||||
|
return username; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 验证token是否还有效 |
||||||
|
* |
||||||
|
* @param token 客户端传入的token |
||||||
|
* @param userDetails 从数据库中查询出来的用户信息 |
||||||
|
*/ |
||||||
|
public boolean validateToken(String token, UserDetails userDetails) { |
||||||
|
String username = getUserNameFromToken(token); |
||||||
|
return username.equals(userDetails.getUsername()) && !isTokenExpired(token); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断token是否已经失效 |
||||||
|
*/ |
||||||
|
private boolean isTokenExpired(String token) { |
||||||
|
Date expiredDate = getExpiredDateFromToken(token); |
||||||
|
return expiredDate.before(new Date()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 从token中获取过期时间 |
||||||
|
*/ |
||||||
|
private Date getExpiredDateFromToken(String token) { |
||||||
|
Claims claims = getClaimsFromToken(token); |
||||||
|
return claims.getExpiration(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据用户信息生成token |
||||||
|
*/ |
||||||
|
public String generateToken(UserDetails userDetails) { |
||||||
|
Map<String, Object> claims = new HashMap<>(); |
||||||
|
claims.put(CLAIM_KEY_USERNAME, userDetails.getUsername()); |
||||||
|
claims.put(CLAIM_KEY_CREATED, new Date()); |
||||||
|
return generateToken(claims); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 当原来的token没过期时是可以刷新的 |
||||||
|
* |
||||||
|
* @param oldToken 带tokenHead的token |
||||||
|
*/ |
||||||
|
public String refreshHeadToken(String oldToken) { |
||||||
|
if(StrUtil.isEmpty(oldToken)){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
String token = oldToken.substring(tokenHead.length()); |
||||||
|
if(StrUtil.isEmpty(token)){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
//token校验不通过
|
||||||
|
Claims claims = getClaimsFromToken(token); |
||||||
|
if(claims==null){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
//如果token已经过期,不支持刷新
|
||||||
|
if(isTokenExpired(token)){ |
||||||
|
return null; |
||||||
|
} |
||||||
|
//如果token在30分钟之内刚刷新过,返回原token
|
||||||
|
if(tokenRefreshJustBefore(token,30*60)){ |
||||||
|
return token; |
||||||
|
}else{ |
||||||
|
claims.put(CLAIM_KEY_CREATED, new Date()); |
||||||
|
return generateToken(claims); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 判断token在指定时间内是否刚刚刷新过 |
||||||
|
* @param token 原token |
||||||
|
* @param time 指定时间(秒) |
||||||
|
*/ |
||||||
|
private boolean tokenRefreshJustBefore(String token, int time) { |
||||||
|
Claims claims = getClaimsFromToken(token); |
||||||
|
Date created = claims.get(CLAIM_KEY_CREATED, Date.class); |
||||||
|
Date refreshDate = new Date(); |
||||||
|
//刷新时间在创建时间的指定时间内
|
||||||
|
if(refreshDate.after(created)&&refreshDate.before(DateUtil.offsetSecond(created,time))){ |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
package com.teaching.backend.utils; |
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.toolkit.StringUtils; |
||||||
|
import com.teaching.backend.constant.RegexPatterns; |
||||||
|
|
||||||
|
public class RegexUtils { |
||||||
|
/** |
||||||
|
* 是否符合手机格式 |
||||||
|
* @param phone 要校验的手机号 |
||||||
|
* @return true:符合,false:不符合 |
||||||
|
*/ |
||||||
|
public static boolean isPhone(String phone){ |
||||||
|
return matches(phone, RegexPatterns.PHONE_REGEX); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否符合验证码格式 |
||||||
|
* @param code 要校验的验证码 |
||||||
|
* @return true:符合,false:不符合 |
||||||
|
*/ |
||||||
|
public static boolean isCodeValid(String code){ |
||||||
|
return matches(code, RegexPatterns.VERIFY_CODE_REGEX); |
||||||
|
} |
||||||
|
|
||||||
|
private static boolean matches(String str, String regex){ |
||||||
|
if (StringUtils.isBlank(str)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
return str.matches(regex); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.teaching.backend.utils; |
||||||
|
|
||||||
|
/** |
||||||
|
* ThreadLocal 工具类 |
||||||
|
*/ |
||||||
|
@SuppressWarnings("all") |
||||||
|
public class ThreadLocalUtil { |
||||||
|
//提供ThreadLocal对象,
|
||||||
|
private static final ThreadLocal THREAD_LOCAL = new ThreadLocal(); |
||||||
|
|
||||||
|
//根据键获取值
|
||||||
|
public static <T> T get(){ |
||||||
|
return (T) THREAD_LOCAL.get(); |
||||||
|
} |
||||||
|
|
||||||
|
//存储键值对
|
||||||
|
public static void set(Object value){ |
||||||
|
THREAD_LOCAL.set(value); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
//清除ThreadLocal 防止内存泄漏
|
||||||
|
public static void remove(){ |
||||||
|
THREAD_LOCAL.remove(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,44 @@ |
|||||||
|
<?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.teaching.backend.mapper.umsAdmin.UmsAdminRoleRelationMapper"> |
||||||
|
<!-- <!–批量新增回写主键支持–>--> |
||||||
|
<!-- <insert id="insertList">--> |
||||||
|
<!-- INSERT INTO ums_admin_role_relation (admin_id, role_id) VALUES--> |
||||||
|
<!-- <foreach collection="list" separator="," item="item" index="index">--> |
||||||
|
<!-- (#{item.adminId,jdbcType=BIGINT},--> |
||||||
|
<!-- #{item.roleId,jdbcType=BIGINT})--> |
||||||
|
<!-- </foreach>--> |
||||||
|
<!-- </insert>--> |
||||||
|
<select id="getRoleList" resultType="com.teaching.backend.model.entity.umsAdmin.UmsRole"> |
||||||
|
select r.* |
||||||
|
from ums_admin_role_relation ar left join ums_role r on ar.role_id = r.id |
||||||
|
where ar.admin_id = #{adminId} |
||||||
|
</select> |
||||||
|
<select id="getResourceList" resultType="com.teaching.backend.model.entity.umsAdmin.UmsResource"> |
||||||
|
SELECT |
||||||
|
ur.id id, |
||||||
|
ur.create_time createTime, |
||||||
|
ur.`name` `name`, |
||||||
|
ur.url url, |
||||||
|
ur.description description, |
||||||
|
ur.category_id categoryId |
||||||
|
FROM |
||||||
|
ums_admin_role_relation ar |
||||||
|
LEFT JOIN ums_role r ON ar.role_id = r.id |
||||||
|
LEFT JOIN ums_role_resource_relation rrr ON r.id = rrr.role_id |
||||||
|
LEFT JOIN ums_resource ur ON ur.id = rrr.resource_id |
||||||
|
WHERE |
||||||
|
ar.admin_id = #{adminId} |
||||||
|
AND ur.id IS NOT NULL |
||||||
|
GROUP BY |
||||||
|
ur.id |
||||||
|
</select> |
||||||
|
<!-- <select id="getAdminIdList" resultType="java.lang.Long">--> |
||||||
|
<!-- SELECT--> |
||||||
|
<!-- DISTINCT ar.admin_id--> |
||||||
|
<!-- FROM--> |
||||||
|
<!-- ums_role_resource_relation rr--> |
||||||
|
<!-- LEFT JOIN ums_admin_role_relation ar ON rr.role_id = ar.role_id--> |
||||||
|
<!-- WHERE rr.resource_id=#{resourceId}--> |
||||||
|
<!-- </select>--> |
||||||
|
</mapper> |
@ -0,0 +1,64 @@ |
|||||||
|
<?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.teaching.backend.mapper.umsAdmin.UmsRoleMapper"> |
||||||
|
|
||||||
|
<select id="getMenuList" resultType="com.teaching.backend.model.entity.umsAdmin.UmsMenu"> |
||||||
|
SELECT |
||||||
|
m.id id, |
||||||
|
m.parent_id parentId, |
||||||
|
m.create_time createTime, |
||||||
|
m.title title, |
||||||
|
m.level level, |
||||||
|
m.sort sort, |
||||||
|
m.name name, |
||||||
|
m.icon icon, |
||||||
|
m.hidden hidden |
||||||
|
FROM |
||||||
|
ums_admin_role_relation arr |
||||||
|
LEFT JOIN ums_role r ON arr.role_id = r.id |
||||||
|
LEFT JOIN ums_role_menu_relation rmr ON r.id = rmr.role_id |
||||||
|
LEFT JOIN ums_menu m ON rmr.menu_id = m.id |
||||||
|
WHERE |
||||||
|
arr.admin_id = #{adminId} |
||||||
|
AND m.id IS NOT NULL |
||||||
|
GROUP BY |
||||||
|
m.id |
||||||
|
</select> |
||||||
|
<!-- <select id="getMenuListByRoleId" resultType="com.teaching.backend.model.entity.umsAdmin.UmsMenu">--> |
||||||
|
<!-- SELECT--> |
||||||
|
<!-- m.id id,--> |
||||||
|
<!-- m.parent_id parentId,--> |
||||||
|
<!-- m.create_time createTime,--> |
||||||
|
<!-- m.title title,--> |
||||||
|
<!-- m.level level,--> |
||||||
|
<!-- m.sort sort,--> |
||||||
|
<!-- m.name name,--> |
||||||
|
<!-- m.icon icon,--> |
||||||
|
<!-- m.hidden hidden--> |
||||||
|
<!-- FROM--> |
||||||
|
<!-- ums_role_menu_relation rmr--> |
||||||
|
<!-- LEFT JOIN ums_menu m ON rmr.menu_id = m.id--> |
||||||
|
<!-- WHERE--> |
||||||
|
<!-- rmr.role_id = #{roleId}--> |
||||||
|
<!-- AND m.id IS NOT NULL--> |
||||||
|
<!-- GROUP BY--> |
||||||
|
<!-- m.id--> |
||||||
|
<!-- </select>--> |
||||||
|
<!-- <select id="getResourceListByRoleId" resultType="com.teaching.backend.model.entity.umsAdmin.UmsMenu">--> |
||||||
|
<!-- SELECT--> |
||||||
|
<!-- r.id id,--> |
||||||
|
<!-- r.create_time createTime,--> |
||||||
|
<!-- r.`name` `name`,--> |
||||||
|
<!-- r.url url,--> |
||||||
|
<!-- r.description description,--> |
||||||
|
<!-- r.category_id categoryId--> |
||||||
|
<!-- FROM--> |
||||||
|
<!-- ums_role_resource_relation rrr--> |
||||||
|
<!-- LEFT JOIN ums_resource r ON rrr.resource_id = r.id--> |
||||||
|
<!-- WHERE--> |
||||||
|
<!-- rrr.role_id = #{roleId}--> |
||||||
|
<!-- AND r.id IS NOT NULL--> |
||||||
|
<!-- GROUP BY--> |
||||||
|
<!-- r.id--> |
||||||
|
<!-- </select>--> |
||||||
|
</mapper> |
Loading…
Reference in new issue