From 216d1d154d608177a842c42b288bc3953a283d2f Mon Sep 17 00:00:00 2001 From: zhangzhiqiang Date: Thu, 15 Dec 2022 10:13:19 +0800 Subject: [PATCH] user --- .../java/org/nl/common/domain/PageQuery.java | 112 +++++++++++ .../controller/user/SysUserController.java | 26 --- .../controller/user/UserController.java | 190 ++++++++++++++++++ 3 files changed, 302 insertions(+), 26 deletions(-) create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/common/domain/PageQuery.java delete mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/SysUserController.java create mode 100644 nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/common/domain/PageQuery.java b/nladmin-system/nlsso-server/src/main/java/org/nl/common/domain/PageQuery.java new file mode 100644 index 0000000..b3d84ce --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/common/domain/PageQuery.java @@ -0,0 +1,112 @@ +package org.nl.common.domain; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sql.SqlUtil; +import lombok.Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * 分页查询实体类 + * + * @author Lion Li + */ + +@Data +public class PageQuery implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 分页大小 + */ + private Integer pageSize; + + /** + * 当前页数 + */ + private Integer pageNum; + + /** + * 排序列 + */ + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + private String isAsc; + + /** + * 当前记录起始索引 默认值 + */ + public static final int DEFAULT_PAGE_NUM = 1; + + /** + * 每页显示记录数 默认值 默认查全部 + */ + public static final int DEFAULT_PAGE_SIZE = Integer.MAX_VALUE; + + public Page build() { + Integer pageNum = ObjectUtil.defaultIfNull(getPageNum(), DEFAULT_PAGE_NUM); + Integer pageSize = ObjectUtil.defaultIfNull(getPageSize(), DEFAULT_PAGE_SIZE); + if (pageNum <= 0) { + pageNum = DEFAULT_PAGE_NUM; + } + Page page = new Page<>(pageNum, pageSize); + List orderItems = buildOrderItem(); + if (CollUtil.isNotEmpty(orderItems)) { + page.addOrder(orderItems); + } + return page; + } + + /** + * 构建排序 + * + * 支持的用法如下: + * {isAsc:"asc",orderByColumn:"id"} order by id asc + * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc + * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc + * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc + */ + private List buildOrderItem() { + if (StringUtils.isBlank(orderByColumn) || StringUtils.isBlank(isAsc)) { + return null; + } + String orderBy = SqlUtil.escapeOrderBySql(orderByColumn); + orderBy = StringUtils.toUnderScoreCase(orderBy); + + // 兼容前端排序类型 + isAsc = StringUtils.replaceEach(isAsc, new String[]{"ascending", "descending"}, new String[]{"asc", "desc"}); + + String[] orderByArr = orderBy.split(","); + String[] isAscArr = isAsc.split(","); + if (isAscArr.length != 1 && isAscArr.length != orderByArr.length) { + throw new ServiceException("排序参数有误"); + } + + List list = new ArrayList<>(); + // 每个字段各自排序 + for (int i = 0; i < orderByArr.length; i++) { + String orderByStr = orderByArr[i]; + String isAscStr = isAscArr.length == 1 ? isAscArr[0] : isAscArr[i]; + if ("asc".equals(isAscStr)) { + list.add(OrderItem.asc(orderByStr)); + } else if ("desc".equals(isAscStr)) { + list.add(OrderItem.desc(orderByStr)); + } else { + throw new ServiceException("排序参数有误"); + } + } + return list; + } + +} diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/SysUserController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/SysUserController.java deleted file mode 100644 index 43c3dfc..0000000 --- a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/SysUserController.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.nl.system.controller.user; - - -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import org.apache.catalina.User; -import org.nl.system.service.user.dto.UserQuery; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - *

- * 用户表 前端控制器 - *

- * - * @author generator - * @since 2022-12-15 - */ -@RestController -@RequestMapping("/sysUser") -public class SysUserController { - public static void main(String[] args) { - UserQuery userQuery = new UserQuery(); - QueryWrapper wrapper = userQuery.convertQ(); - } -} - diff --git a/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java new file mode 100644 index 0000000..9a561a2 --- /dev/null +++ b/nladmin-system/nlsso-server/src/main/java/org/nl/system/controller/user/UserController.java @@ -0,0 +1,190 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.nl.system.controller.user; + +import cn.dev33.satoken.secure.SaSecureUtil; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.nl.modules.common.config.RsaProperties; +import org.nl.modules.common.exception.BadRequestException; +import org.nl.modules.common.utils.RedisUtils; +import org.nl.modules.common.utils.RsaUtils; +import org.nl.modules.common.utils.SecurityUtils; +import org.nl.modules.logging.annotation.Log; +import org.nl.modules.system.service.dto.UserQueryCriteria; +import org.nl.system.service.user.ISysUserService; +import org.nl.system.service.user.UserService; +import org.nl.system.service.user.dao.SysUser; +import org.nl.system.service.user.dao.User; +import org.nl.system.service.user.dto.UserQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.HashMap; +import java.util.Set; +import java.util.function.BiPredicate; + +/** + * @author Zheng Jie + * @date 2018-11-23 + */ +@Api(tags = "系统:用户管理") +@RestController +@RequestMapping("/api/users") +@RequiredArgsConstructor +public class UserController { + + @Autowired + ISysUserService userService; + + + @ApiOperation("查询用户") + @GetMapping +// @SaCheckPermission("user:list") + public ResponseEntity query(UserQuery query,){ + QueryWrapper query1 = new QueryWrapper(); + UpdateWrapper wrapper = new UpdateWrapper<>(); + +// query1.allEq(new BiPredicate() { +// @Override +// public boolean test(String s, Object o) { +// return false; +// } +// }, +// Page page = userService.page(new Page<>(query.getPage(),query.getSize()),) + return new ResponseEntity<>(null,HttpStatus.OK); + } + + @Log("新增用户") + @ApiOperation("新增用户") + @PostMapping +// @SaCheckPermission("user:add") + public ResponseEntity create(@Validated @RequestBody User resources){ + checkLevel(resources); + // 默认密码 123456 + if (ObjectUtil.isEmpty(resources.getPassword())) { + resources.setPassword(SaSecureUtil.md5BySalt("123456", "salt")); + } else { + resources.setPassword(SaSecureUtil.md5BySalt(resources.getPassword(), "salt")); + } + userService.save(resources); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @Log("修改用户") + @ApiOperation("修改用户") + @PutMapping +// @SaCheckPermission("user:edit") + public ResponseEntity update( @RequestBody User resources) throws Exception { + checkLevel(resources); + userService.saveOrUpdate(resources); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("修改用户:个人中心") + @ApiOperation("修改用户:个人中心") +// @PutMapping(value = "center") + public ResponseEntity center(@RequestBody User resources){ + if(!resources.getUserId().equals(StpUtil.getLoginIdAsLong())){ + throw new BadRequestException("不能修改他人资料"); + } + userService.saveOrUpdate(resources); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @Log("删除用户") + @ApiOperation("删除用户") + @DeleteMapping +// @SaCheckPermission("user:del") + public ResponseEntity delete(@RequestBody Set ids) { + for (Long id : ids) { + /* Integer currentLevel = Collections.min(roleService.findByUsersId(StpUtil.getLoginIdAsLong()).stream().map(Role::getLevel).collect(Collectors.toList())); + Integer optLevel = Collections.min(roleService.findByUsersId(id).stream().map(Role::getLevel).collect(Collectors.toList())); + if (currentLevel > optLevel) { + throw new BadRequestException("角色权限不足,不能删除:" + userService.findById(id).getUsername()); + }*/ + // 删除缓存信息 +// User userDto = userService.findById(id); +// redisUtils.del("data::user:" + userDto.getUser_id()); +// redisUtils.del("menu::user:" + userDto.getUser_id()); +// redisUtils.del("role::auth:" + userDto.getUser_id()); +// redisUtils.del("user::username:" + userDto.getUsername()); + } + userService.removeByIds(ids); + return new ResponseEntity<>(HttpStatus.OK); + } + + /* @ApiOperation("修改密码") + @PostMapping(value = "/updatePass") + public ResponseEntity updatePass(@RequestBody UserPassVo passVo) throws Exception { + // 解密,得到字符密码 + String oldPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,passVo.getOldPass()); + String newPass = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,passVo.getNewPass()); + User user = userService.findByName(SecurityUtils.getCurrentUsername()); + if (!SaSecureUtil.md5BySalt(user.getPassword(), "salt").equals(SaSecureUtil.md5BySalt(oldPass, "salt"))) { + throw new BadRequestException("修改失败,旧密码错误"); + } + if (!SaSecureUtil.md5BySalt(user.getPassword(), "salt").equals(SaSecureUtil.md5BySalt(newPass, "salt"))) { + throw new BadRequestException("新密码不能与旧密码相同"); + } + userService.updatePass(user.getUsername(),SaSecureUtil.md5BySalt(newPass, "salt")); + return new ResponseEntity<>(HttpStatus.OK); + }*/ + + @ApiOperation("修改头像") + @PostMapping(value = "/updateAvatar") + public ResponseEntity updateAvatar(@RequestParam MultipartFile avatar){ + return new ResponseEntity<>(userService.updateAvatar(avatar), HttpStatus.OK); + } + + @Log("修改邮箱") + @ApiOperation("修改邮箱") + @PostMapping(value = "/updateEmail/{code}") + public ResponseEntity updateEmail(@PathVariable String code,@RequestBody User user) throws Exception { + String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,user.getPassword()); + User userInfo = userService.getOne(new QueryWrapper().eq("username",SecurityUtils.getCurrentUsername())); + if(!SaSecureUtil.md5BySalt(userInfo.getPassword(), "salt").equals(SaSecureUtil.md5BySalt(password, "salt"))){ + throw new BadRequestException("密码错误"); + } + userService.update(new UpdateWrapper().set(userInfo.getUsername(),user.getEmail())); + return new ResponseEntity<>(HttpStatus.OK); + } + + /** + * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误 + * @param resources / + */ + private void checkLevel(User resources) { +// Integer currentLevel = Collections.min(roleService.findByUsersId(StpUtil.getLoginIdAsLong()).stream().map(RoleSmallDto::getLevel).collect(Collectors.toList())); +// Integer optLevel = roleService.findByRoles(resources.getRoles()); +// if (currentLevel > optLevel) { +// throw new BadRequestException("角色权限不足"); +// } + } +}