Commit 8933be26 authored by 33's avatar 33

后台角色管理,版权申请审核人员记录

parent 66ec46e0
package com.fzm.admin.controller;
import cn.hutool.core.lang.Assert;
import com.fzm.admin.params.LoginParam;
import com.fzm.common.annotation.Authentication;
import com.fzm.common.constant.RedisConstant;
import com.fzm.common.constant.TokenConstant;
import com.fzm.common.entity.Admin;
import com.fzm.common.enums.ResultCode;
import com.fzm.common.exception.GlobalException;
import com.fzm.common.interceptor.LoginUserInfo;
import com.fzm.common.model.ResponseModel;
import com.fzm.common.service.AdminService;
import com.fzm.common.utils.JwtUtil;
import com.fzm.common.utils.RedisUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
......@@ -28,23 +35,51 @@ import java.util.concurrent.TimeUnit;
@RestController
@RequestMapping("/admin")
@Api(tags = "后台用户管理")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class AdminController {
@Resource
private AdminService adminService;
@Resource
private RedisUtil redisUtil;
private final AdminService adminService;
private final RedisUtil redisUtil;
private final PasswordEncoder passwordEncoder;
@PostMapping("/login")
@ApiOperation(value = "登录")
public ResponseModel<Map<String, Object>> login(@Validated @RequestBody LoginParam loginParam) {
Admin admin = adminService.login(loginParam.getUsername(), loginParam.getPassword());
Integer freezeState = admin.getFreezeState();
if (freezeState != null && freezeState == 1) {
throw GlobalException.newException(ResultCode.FREEZE);
}
String token = JwtUtil.generateToken(admin);
redisUtil.setEx(RedisConstant.ADMIN_USER_TOKEN_PREFIX + admin.getId(), token, 2L, TimeUnit.HOURS);
HashMap<String, Object> result = new HashMap<>();
result.put("user", admin);
result.put(TokenConstant.TOKEN_HEADER, token);
Integer needResetPassword = admin.getNeedResetPassword();
if (needResetPassword != null && needResetPassword == 1) {
return ResponseModel.fail(ResultCode.RESET_PASSWORD, result);
}
return ResponseModel.success(result);
}
@Authentication
@PostMapping("/password")
@ApiOperation(value = "修改密码")
public ResponseModel<Object> password(@RequestBody LoginParam loginParam) {
String password = loginParam.getPassword();
Assert.notBlank(password, "密码不能为空");
String username = LoginUserInfo.getLoginUser().getUsername();
Admin admin = new Admin();
admin.setUsername(username);
admin.setPassword(passwordEncoder.encode(password));
admin.setNeedResetPassword(0);
adminService.updateByUserNameIf(admin);
return ResponseModel.success();
}
}
......@@ -8,11 +8,14 @@ import com.fzm.common.entity.Admin;
import com.fzm.common.entity.AdminRole;
import com.fzm.common.enums.ResultCode;
import com.fzm.common.exception.GlobalException;
import com.fzm.common.interceptor.LoginUserInfo;
import com.fzm.common.model.ResponseModel;
import com.fzm.common.service.AdminRoleService;
import com.fzm.common.service.AdminService;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -35,6 +38,20 @@ public class AdminRoleController {
private final AdminRoleService adminRoleService;
private final PasswordEncoder passwordEncoder;
@GetMapping("/pages")
@ApiOperation(value = "分页查询")
public ResponseModel<PageInfo<Admin>> pages(@ApiParam(value = "页码", required = true) @RequestParam Integer pageNum,
@ApiParam(value = "每页记录数", required = true) @RequestParam Integer pageSize,
@ApiParam(value = "用户名") @RequestParam(required = false) String username,
@ApiParam(value = "昵称") @RequestParam(required = false) String nickname,
@ApiParam(value = "角色类型") @RequestParam(required = false) Integer roleId) {
if (roleId != null) {
List<AdminRole> adminRoles = adminRoleService.listAll();
Assert.isTrue(adminRoles.stream().map(AdminRole::getRoleId).anyMatch(id -> id.equals(roleId)), "请选择正确的权限ID");
}
PageInfo<Admin> pageInfo = adminService.pages(pageNum, pageSize, username, nickname, roleId);
return ResponseModel.success(pageInfo);
}
@GetMapping("/list")
@ApiOperation(value = "查询所有权限")
......@@ -45,11 +62,19 @@ public class AdminRoleController {
@PostMapping("/add")
@ApiOperation("新增权限")
public ResponseModel<Object> add(@RequestBody AdminRoleParam adminRoleParam) {
// 只有超级管理员能编辑权限
Integer loginRoleId = LoginUserInfo.getLoginUser().getRoleId();
if (loginRoleId != 1) {
throw GlobalException.newException(ResultCode.FORBIDDEN);
}
String nickname = adminRoleParam.getNickname();
Assert.notBlank(nickname, "昵称不能为空");
String username = adminRoleParam.getUsername();
Assert.notBlank(username, "用户名不能为空");
Admin addUser = adminService.selectByUsername(username);
Assert.isNull(addUser, "用户名已存在");
String password = adminRoleParam.getPassword();
Assert.notBlank(password, "密码不能为空");
......@@ -57,10 +82,11 @@ public class AdminRoleController {
Integer roleId = adminRoleParam.getRoleId();
Assert.notNull(roleId, "权限ID不能为空");
List<AdminRole> adminRoles = adminRoleService.listAll();
Assert.isTrue(adminRoles.stream().map(AdminRole::getRoleId).anyMatch(id -> id.equals(roleId)), "请选择正确的权限");
Assert.isTrue(adminRoles.stream().map(AdminRole::getRoleId).anyMatch(id -> id.equals(roleId)), "请选择正确的权限ID");
Admin admin = BeanUtil.copyProperties(adminRoleParam, Admin.class);
admin.setPassword(passwordEncoder.encode(password));
admin.setNeedResetPassword(1);
adminService.save(admin);
......@@ -70,25 +96,40 @@ public class AdminRoleController {
@PostMapping("/update")
@ApiOperation("编辑权限")
public ResponseModel<Object> update(@RequestBody AdminRoleParam adminRoleParam) {
Integer loginRoleId = LoginUserInfo.getLoginUser().getRoleId();
if (loginRoleId != 1) {
throw GlobalException.newException(ResultCode.FORBIDDEN);
}
String username = adminRoleParam.getUsername();
Assert.notBlank(username, "用户名不能为空");
Admin updateUser = adminService.selectByUsername(username);
Assert.notNull(updateUser, "用户名不存在");
int needResetPassword = 0;
String password = adminRoleParam.getPassword();
if (StringUtils.isNotBlank(password)) {
adminRoleParam.setPassword(passwordEncoder.encode(password));
needResetPassword = 1;
}
Integer roleId = adminRoleParam.getRoleId();
if (roleId != null) {
List<AdminRole> adminRoles = adminRoleService.listAll();
Assert.isTrue(adminRoles.stream().map(AdminRole::getRoleId).anyMatch(id -> id.equals(roleId)), "请选择正确的权限");
Assert.isTrue(adminRoles.stream().map(AdminRole::getRoleId).anyMatch(id -> id.equals(roleId)), "请选择正确的权限ID");
}
Integer freezeState = adminRoleParam.getFreezeState();
if (freezeState != null) {
Assert.isTrue(freezeState == 0 || freezeState == 1, "冻结状态码错误");
}
if (StringUtils.isAnyBlank(adminRoleParam.getNickname(), password) && roleId == null) {
if (StringUtils.isAllBlank(adminRoleParam.getNickname(), password) && roleId == null && freezeState == null) {
throw GlobalException.newException(ResultCode.VALIDATE_FAILED);
}
Admin admin = BeanUtil.copyProperties(adminRoleParam, Admin.class);
admin.setNeedResetPassword(needResetPassword);
adminService.updateByUserNameIf(admin);
......
......@@ -20,4 +20,7 @@ public class AdminRoleParam {
@ApiModelProperty("角色编号")
private Integer roleId;
@ApiModelProperty("是否已被冻结,0未冻结,1已冻结")
private Integer freezeState;
}
......@@ -34,6 +34,15 @@ public class Admin extends AbstractUser {
@ApiModelProperty("角色id")
private Integer roleId;
@ApiModelProperty("是否需要更新密码")
private Integer needResetPassword;
@ApiModelProperty("是否已被冻结,0未冻结,1已冻结")
private Integer freezeState;
@ApiModelProperty("最后登录时间")
private Date lastLoginTime;
@ApiModelProperty("创建时间")
private Date createDate;
......
......@@ -98,6 +98,9 @@ public class CopyrightApply {
@ApiModelProperty(value = "版权申请后台核验通过时间")
private Date passTime;
@ApiModelProperty(value = "审核人员")
private String checkUsername;
// 参考枚举类-com.fzm.common.enums.CopyrightApplyState
@ApiModelProperty(value = "登记状态 -2:待支付 -1:已撤回 0:待核验 2:提交审核 3:已驳回 4:审核成功 5:驳回 6:待审核 7:待终审")
private Integer registerState;
......
......@@ -42,5 +42,6 @@ public class CopyrightApplyVo {
@ApiModelProperty(value = "申请时间")
private Date applyTime;
@ApiModelProperty(value = "审核人员")
private String checkUsername;
}
......@@ -3,8 +3,10 @@ package com.fzm.common.enums;
public enum ResultCode implements IErrorCode {
SUCCESS(200, "success"),
FAILED(500, "failed"),
RESET_PASSWORD(303, "请重置密码"),
VALIDATE_FAILED(405, "参数检验失败"),
UNAUTHORIZED(401, "认证失败"),
FREEZE(402, "用户账号被冻结"),
FORBIDDEN(403, "没有相关权限"),
DATA_ERROR(601, "没找到相关数据"),
REGISTER_ERROR(410, "注册失败"),
......@@ -25,8 +27,8 @@ public enum ResultCode implements IErrorCode {
;
private Integer code;
private String message;
private final Integer code;
private final String message;
ResultCode(Integer code, String message) {
this.code = code;
......
......@@ -4,7 +4,8 @@ import cn.hutool.core.date.DateUtil;
import com.fzm.common.annotation.Authentication;
import com.fzm.common.constant.RedisConstant;
import com.fzm.common.constant.TokenConstant;
import com.fzm.common.entity.AbstractUser;
import com.fzm.common.entity.Admin;
import com.fzm.common.entity.User;
import com.fzm.common.enums.ResultCode;
import com.fzm.common.exception.GlobalException;
import com.fzm.common.service.AdminService;
......@@ -64,20 +65,43 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
}
String appId = JwtUtil.getAppIdFromToken(token);
Integer userId = JwtUtil.getUserIdFromToken(token);
AbstractUser user;
String redisToken;
String username;
Integer roleId;
if (TokenConstant.TOKEN_APP_ID_PORTAL.equals(appId)) {
// h5用户
user = userService.getById(userId);
User user = userService.getById(userId);
if (user == null) {
throw GlobalException.newException(ResultCode.UNAUTHORIZED, "非法用户请求");
}
redisToken = redisUtil.get(RedisConstant.PORTAL_USER_TOKEN_PREFIX + userId);
roleId = null;
username = null;
} else {
// 后台管理用户
user = adminService.getById(userId);
redisToken = redisUtil.get(RedisConstant.ADMIN_USER_TOKEN_PREFIX + userId);
}
if (user == null) {
Admin admin = adminService.getById(userId);
if (admin == null) {
throw GlobalException.newException(ResultCode.UNAUTHORIZED, "非法用户请求");
}
// 判断冻结和更改密码
Integer freezeState = admin.getFreezeState();
if (freezeState != null && freezeState == 1) {
throw GlobalException.newException(ResultCode.FREEZE);
}
Integer needResetPassword = admin.getNeedResetPassword();
String requestURI = request.getRequestURI();
if (needResetPassword != null && needResetPassword == 1 && requestURI != null && !requestURI.contains("/admin/password")) {
throw GlobalException.newException(ResultCode.RESET_PASSWORD);
}
redisToken = redisUtil.get(RedisConstant.ADMIN_USER_TOKEN_PREFIX + userId);
roleId = admin.getRoleId();
username = admin.getUsername();
}
if (StringUtils.isBlank(redisToken)) {
throw GlobalException.newException(ResultCode.UNAUTHORIZED, "登录已过期");
}
......@@ -96,6 +120,12 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
}
}*/
LoginUser loginUser = new LoginUser();
loginUser.setUserId(userId);
loginUser.setUsername(username);
loginUser.setAppId(appId);
loginUser.setRoleId(roleId);
LoginUserInfo.setUserInfo(loginUser);
}
return true;
}
......@@ -107,7 +137,7 @@ public class AuthenticationInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
LoginUserInfo.delUserInfo();
}
public static void main(String[] args) {
......
package com.fzm.common.interceptor;
import lombok.Data;
/**
* @author wt
* @date 2022/3/14
*/
@Data
public class LoginUser {
private String appId;
private String username;
private Integer userId;
private Integer roleId;
}
package com.fzm.common.interceptor;
/**
* @author wt
* @date 2022/3/14
*/
public class LoginUserInfo {
private static final ThreadLocal<LoginUser> localUser = new ThreadLocal<>();
public static void setUserInfo(LoginUser loginUser) {
localUser.set(loginUser);
}
public static LoginUser getLoginUser() {
return localUser.get();
}
public static void delUserInfo() {
localUser.remove();
}
}
......@@ -3,6 +3,9 @@ package com.fzm.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.fzm.common.entity.Admin;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author tangtuo
......@@ -12,4 +15,6 @@ import org.apache.ibatis.annotations.Mapper;
public interface AdminMapper extends BaseMapper<Admin> {
void updateByUserNameIf(Admin admin);
List<Admin> listAdmin(@Param("username") String username, @Param("nickname") String nickname, @Param("roleId") Integer roleId);
}
......@@ -45,6 +45,10 @@ public class ResponseModel<T> {
return new ResponseModel<>(errorCode, null);
}
public static <T> ResponseModel<T> fail(IErrorCode errorCode, T data) {
return new ResponseModel<>(errorCode, data);
}
public static ResponseModel<String> fail(IErrorCode errorCode, String errorMsg) {
return new ResponseModel<>(errorCode, errorMsg);
}
......
......@@ -2,6 +2,7 @@ package com.fzm.common.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fzm.common.entity.Admin;
import com.github.pagehelper.PageInfo;
/**
* @author tangtuo
......@@ -10,5 +11,9 @@ import com.fzm.common.entity.Admin;
public interface AdminService extends IService<Admin> {
Admin login(String username, String password);
PageInfo<Admin> pages(Integer pageNum, Integer pageSize, String username, String nickname, Integer roleId);
void updateByUserNameIf(Admin admin);
Admin selectByUsername(String username);
}
......@@ -7,11 +7,16 @@ import com.fzm.common.enums.ResultCode;
import com.fzm.common.exception.GlobalException;
import com.fzm.common.mapper.AdminMapper;
import com.fzm.common.service.AdminService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @author tangtuo
* @date 2021/7/5 15:09
......@@ -34,11 +39,31 @@ public class AdminServiceImpl extends ServiceImpl<AdminMapper, Admin> implements
if (!passwordEncoder.matches(password, admin.getPassword())) {
throw GlobalException.newException(ResultCode.UNAUTHORIZED, "密码有误");
}
Admin updateAdmin = new Admin();
updateAdmin.setUsername(username);
updateAdmin.setLastLoginTime(new Date());
AdminMapper.updateByUserNameIf(updateAdmin);
return admin;
}
@Override
public PageInfo<Admin> pages(Integer pageNum, Integer pageSize, String username, String nickname, Integer roleId) {
PageHelper.startPage(pageNum, pageSize);
List<Admin> list = AdminMapper.listAdmin(username, nickname, roleId);
return new PageInfo<>(list);
}
@Override
public void updateByUserNameIf(Admin admin) {
AdminMapper.updateByUserNameIf(admin);
}
@Override
public Admin selectByUsername(String username) {
QueryWrapper<Admin> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username);
return getOne(queryWrapper);
}
}
......@@ -19,6 +19,7 @@ import com.fzm.common.entity.vo.CopyrightCertificateVo;
import com.fzm.common.entity.vo.CopyrightVo;
import com.fzm.common.enums.*;
import com.fzm.common.exception.GlobalException;
import com.fzm.common.interceptor.LoginUserInfo;
import com.fzm.common.mapper.CopyrightApplyMapper;
import com.fzm.common.mq.NotifyPublisher;
import com.fzm.common.properties.CopyrightProperties;
......@@ -360,6 +361,7 @@ public class CopyrightApplyServiceImpl extends ServiceImpl<CopyrightApplyMapper,
}
copyright.setRegisterState(CopyrightApplyState.REJECTED.getCode());
copyright.setRejectReason(rejectReason);
copyright.setCheckUsername(LoginUserInfo.getLoginUser().getUsername());
updateById(copyright);
// 管理员驳回后,需要自动发起退款
Order order = orderService.getByPaySceneAndProductId(PayScene.COPYRIGHT.getCode(), id, OrderStatus.PAYED.getStatus());
......@@ -415,6 +417,7 @@ public class CopyrightApplyServiceImpl extends ServiceImpl<CopyrightApplyMapper,
copyright.setRegisterState(CopyrightApplyState.SUBMITTED.getCode());
copyright.setRejectReason("");
copyright.setPassTime(new Date());
copyright.setCheckUsername(LoginUserInfo.getLoginUser().getUsername());
boolean updateResult = updateById(copyright);
// 发送系统消息
......
......@@ -14,8 +14,32 @@
<if test="roleId != null">
role_id = #{roleId},
</if>
<if test="needResetPassword != null">
need_reset_password = #{needResetPassword},
</if>
<if test="freezeState != null">
freeze_state = #{freezeState},
</if>
<if test="lastLoginTime != null">
last_login_time = #{lastLoginTime},
</if>
update_date = now()
</set>
where username = #{username}
</update>
<select id="listAdmin" resultType="com.fzm.common.entity.Admin">
select id, username, nickname, role_id, freeze_state, create_date, last_login_time
from tb_admin where true
<if test="username != null and username != ''">
and username = #{username}
</if>
<if test="roleId != null">
and role_id = #{roleId}
</if>
<if test="nickname != null and nickname != ''">
and nickname like CONCAT('%', #{nickname}, '%')
</if>
order by id desc
</select>
</mapper>
\ No newline at end of file
......@@ -23,6 +23,7 @@
c.opus_name,
c.nft_hash,
c.apply_time,
c.check_username,
u.nickname,
u.telephone
FROM tb_copyright_apply c
......
......@@ -6,9 +6,9 @@ import com.fzm.common.entity.NotifyState;
import com.fzm.common.entity.vo.NotifyVO;
import com.fzm.common.enums.ResultCode;
import com.fzm.common.exception.GlobalException;
import com.fzm.common.interceptor.LoginUserInfo;
import com.fzm.common.model.ResponseModel;
import com.fzm.common.service.NotifyService;
import com.fzm.common.utils.JwtUtil;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -17,7 +17,10 @@ import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* @author wt
......@@ -34,24 +37,23 @@ public class NotifyController {
@GetMapping("/pages")
@ApiOperation(value = "分页查询")
public ResponseModel<PageInfo<NotifyVO>> pages(@ApiParam(value = "页码", required = true) @RequestParam Integer pageNum,
@ApiParam(value = "每页记录数", required = true) @RequestParam Integer pageSize,
@RequestHeader String Authorization) {
Integer userId = JwtUtil.getUserIdFromToken(Authorization);
@ApiParam(value = "每页记录数", required = true) @RequestParam Integer pageSize) {
Integer userId = LoginUserInfo.getLoginUser().getUserId();
PageInfo<NotifyVO> pageInfo = notifyService.pages(userId, pageNum, pageSize);
return ResponseModel.success(pageInfo);
}
@ApiOperation("未读消息数量")
@GetMapping("/count")
public ResponseModel<NotifyState> messageCount(@RequestHeader String Authorization) {
Integer userId = JwtUtil.getUserIdFromToken(Authorization);
public ResponseModel<NotifyState> messageCount() {
Integer userId = LoginUserInfo.getLoginUser().getUserId();
NotifyState notifyState = notifyService.selectByUid(userId);
return ResponseModel.success(notifyState);
}
@ApiOperation("查询详细")
@GetMapping("/detail")
public ResponseModel<NotifyVO> getById(@RequestParam Integer id, @RequestHeader String Authorization) {
public ResponseModel<NotifyVO> getById(@RequestParam Integer id) {
if (id == null || id <= 0) {
throw GlobalException.newException(ResultCode.VALIDATE_FAILED);
}
......@@ -59,7 +61,7 @@ public class NotifyController {
NotifyVO vo = notifyService.selectById(id);
if (vo != null) {
Integer userId = JwtUtil.getUserIdFromToken(Authorization);
Integer userId = LoginUserInfo.getLoginUser().getUserId();
NotifyState notifyState = notifyService.selectByUid(userId);
if (notifyState != null) {
val nids = notifyState.getNids();
......@@ -78,8 +80,8 @@ public class NotifyController {
@ApiOperation("全部已读")
@GetMapping("/all-read")
public ResponseModel<Boolean> allRead(@RequestHeader String Authorization) {
Integer userId = JwtUtil.getUserIdFromToken(Authorization);
public ResponseModel<Boolean> allRead() {
Integer userId = LoginUserInfo.getLoginUser().getUserId();
NotifyState notifyState = notifyService.selectByUid(userId);
if (notifyState != null) {
notifyState.setNumber(0);
......
......@@ -56,7 +56,7 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.21</version>
<version>1.1.20</version>
</dependency>
<dependency>
<groupId>com.spring4all</groupId>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment