From a2a7853dbfafea4800a465c5327b879f7c1a53e7 Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Fri, 3 Mar 2023 00:48:40 +0800 Subject: [PATCH 1/7] =?UTF-8?q?chore:=20=E6=B7=BB=E5=8A=A0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=96=87=E6=A1=A3=E5=BC=80=E5=85=B3=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-dev.yml | 8 ++++++++ src/main/resources/application-prod.yml | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 945358ae..edfd6936 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -53,3 +53,11 @@ minio: # 自定义域名(非必须),Nginx配置反向代理转发文件路径 custom-domain: + +# 接口文档 +springdoc: + swagger-ui: + enabled: true + api-docs: + enabled: true + diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index f9645975..4e6c1997 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -46,11 +46,18 @@ auth: # MinIO 分布式文件系统 minio: - endpoint: http://localhost:9000 + endpoint: http://www.youlai.tech:9000 access-key: minioadmin - secret-key: minioadmin - # 存储桶名称 - bucket-name: default + secret-key: youlaitech + bucket-name: youlai-boot # 自定义域名(非必须),Nginx配置反向代理转发文件路径 - custom-domain: + custom-domain: https://oss.youlai.tech + + +# 接口文档 +springdoc: + swagger-ui: + enabled: true + api-docs: + enabled: true From 09417168c7833032545a073e5a7519966cdd4df0 Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Fri, 3 Mar 2023 00:49:38 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix:=20=E5=85=B3=E9=97=ADwithJansi=E8=A7=A3?= =?UTF-8?q?=E5=86=B3=E6=8E=A7=E5=88=B6=E5=8F=B0=E5=90=AF=E5=8A=A8=E6=8A=A5?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/logback-spring.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml index a7dae9aa..bb4b5a08 100644 --- a/src/main/resources/logback-spring.xml +++ b/src/main/resources/logback-spring.xml @@ -10,7 +10,7 @@ - true + DEBUG From 00d10b364c4c904d898179b9018c5b22213e40f9 Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Fri, 3 Mar 2023 00:50:16 +0800 Subject: [PATCH 3/7] =?UTF-8?q?refactor:=20=E7=94=A8=E6=88=B7=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../youlai/system/common/util/ExcelUtils.java | 9 +- .../system/controller/SysUserController.java | 5 +- .../system/converter/UserConverter.java | 12 +- .../framework/easyexcel/ExcelResult.java | 17 --- .../easyexcel/MyAnalysisEventListener.java | 4 +- .../system/listener/UserImportListener.java | 105 +++++++++++++++--- .../youlai/system/service/SysUserService.java | 7 -- .../excel-templates/用户导入模板.xlsx | Bin 12310 -> 12414 bytes 8 files changed, 103 insertions(+), 56 deletions(-) delete mode 100644 src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java diff --git a/src/main/java/com/youlai/system/common/util/ExcelUtils.java b/src/main/java/com/youlai/system/common/util/ExcelUtils.java index f107230b..d9ba301c 100644 --- a/src/main/java/com/youlai/system/common/util/ExcelUtils.java +++ b/src/main/java/com/youlai/system/common/util/ExcelUtils.java @@ -1,7 +1,6 @@ package com.youlai.system.common.util; import com.alibaba.excel.EasyExcel; -import com.youlai.system.framework.easyexcel.ExcelResult; import com.youlai.system.framework.easyexcel.MyAnalysisEventListener; import java.io.InputStream; @@ -14,11 +13,9 @@ import java.io.InputStream; */ public class ExcelUtils { - public static ExcelResult importExcel(InputStream is, Class clazz, MyAnalysisEventListener listener) { + public static String importExcel(InputStream is, Class clazz, MyAnalysisEventListener listener) { EasyExcel.read(is, clazz, listener).sheet().doRead(); - ExcelResult excelResult = listener.getResult(); - return excelResult; + String msg = listener.getMsg(); + return msg; } - - } diff --git a/src/main/java/com/youlai/system/controller/SysUserController.java b/src/main/java/com/youlai/system/controller/SysUserController.java index 6586e07b..d8abb02d 100644 --- a/src/main/java/com/youlai/system/controller/SysUserController.java +++ b/src/main/java/com/youlai/system/controller/SysUserController.java @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.youlai.system.common.result.PageResult; import com.youlai.system.common.result.Result; import com.youlai.system.common.util.ExcelUtils; -import com.youlai.system.framework.easyexcel.ExcelResult; import com.youlai.system.listener.UserImportListener; import com.youlai.system.pojo.vo.UserImportVO; import com.youlai.system.pojo.form.UserForm; @@ -149,8 +148,8 @@ public class SysUserController { @PostMapping("/_import") public Result importUsers(@Parameter(name = "部门ID") Long deptId, MultipartFile file) throws IOException { UserImportListener listener = new UserImportListener(deptId); - ExcelResult excelResult = ExcelUtils.importExcel(file.getInputStream(), UserImportVO.class, listener); - return Result.success(excelResult.getMsg()); + String msg = ExcelUtils.importExcel(file.getInputStream(), UserImportVO.class, listener); + return Result.success(msg); } @Operation(summary = "导出用户") diff --git a/src/main/java/com/youlai/system/converter/UserConverter.java b/src/main/java/com/youlai/system/converter/UserConverter.java index 7bdd02ec..7dbb7bcb 100644 --- a/src/main/java/com/youlai/system/converter/UserConverter.java +++ b/src/main/java/com/youlai/system/converter/UserConverter.java @@ -5,6 +5,7 @@ import com.youlai.system.pojo.bo.UserBO; import com.youlai.system.pojo.entity.SysUser; import com.youlai.system.pojo.form.UserForm; import com.youlai.system.pojo.bo.UserFormBO; +import com.youlai.system.pojo.vo.UserImportVO; import com.youlai.system.pojo.vo.UserInfoVO; import com.youlai.system.pojo.vo.UserPageVO; import org.mapstruct.InheritInverseConfiguration; @@ -22,13 +23,13 @@ import org.mapstruct.Mappings; public interface UserConverter { @Mappings({ - @Mapping(target = "genderLabel", expression = "java(com.youlai.system.common.base.IBaseEnum.getLabelByValue(po.getGender(), com.youlai.system.common.enums.GenderEnum.class))") + @Mapping(target = "genderLabel", expression = "java(com.youlai.system.common.base.IBaseEnum.getLabelByValue(bo.getGender(), com.youlai.system.common.enums.GenderEnum.class))") }) - UserPageVO po2Vo(UserBO po); + UserPageVO bo2Vo(UserBO bo); - Page po2Vo(Page po); + Page bo2Vo(Page bo); - UserForm po2Form(UserFormBO po); + UserForm bo2Form(UserFormBO bo); UserForm entity2Form(SysUser entity); @@ -38,7 +39,8 @@ public interface UserConverter { @Mappings({ @Mapping(target = "userId", source = "id") }) - UserInfoVO entity2LoginUser(SysUser entity); + UserInfoVO entity2UserInfoVo(SysUser entity); + SysUser importVo2Entity(UserImportVO vo); } diff --git a/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java b/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java deleted file mode 100644 index d1a37136..00000000 --- a/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.youlai.system.framework.easyexcel; - -import java.util.List; - -/** - * Excel 读取结果 - * - * @author: haoxr - * @date: 2023/03/01 - */ -public interface ExcelResult { - - List getList(); - - String getMsg(); - -} diff --git a/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java b/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java index 00259e60..6dec9710 100644 --- a/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java +++ b/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java @@ -9,5 +9,7 @@ import com.alibaba.excel.event.AnalysisEventListener; * @date: 2023/03/01 */ public abstract class MyAnalysisEventListener extends AnalysisEventListener { - public abstract ExcelResult getResult(); + + private String msg; + public abstract String getMsg(); } diff --git a/src/main/java/com/youlai/system/listener/UserImportListener.java b/src/main/java/com/youlai/system/listener/UserImportListener.java index b8f14af3..c17d382a 100644 --- a/src/main/java/com/youlai/system/listener/UserImportListener.java +++ b/src/main/java/com/youlai/system/listener/UserImportListener.java @@ -1,21 +1,29 @@ package com.youlai.system.listener; +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.util.ListUtils; -import com.youlai.system.framework.easyexcel.ExcelResult; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.youlai.system.common.base.IBaseEnum; +import com.youlai.system.common.constant.SystemConstants; +import com.youlai.system.common.enums.GenderEnum; +import com.youlai.system.converter.UserConverter; import com.youlai.system.framework.easyexcel.MyAnalysisEventListener; +import com.youlai.system.pojo.entity.SysUser; import com.youlai.system.pojo.vo.UserImportVO; import com.youlai.system.service.SysUserService; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.crypto.password.PasswordEncoder; import java.util.List; /** * 用户导入监听器 *

- * https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read + * 最简单的读监听器:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read * * @author haoxr * @date 2022/4/10 20:49 @@ -28,11 +36,19 @@ public class UserImportListener extends MyAnalysisEventListener { */ private static final int BATCH_COUNT = 100; + private int validCount; + + private int invalidCount; + + private int currentIndex; + + StringBuilder msg = new StringBuilder(); + + /** * 缓存的数据 */ - private List cachedUserList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); - + private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); /** * 部门ID @@ -41,12 +57,17 @@ public class UserImportListener extends MyAnalysisEventListener { private final SysUserService userService; + private final PasswordEncoder passwordEncoder; + + private final UserConverter userConverter; + public UserImportListener(Long deptId) { this.deptId = deptId; this.userService = SpringUtil.getBean(SysUserService.class); + this.passwordEncoder = SpringUtil.getBean(PasswordEncoder.class); + this.userConverter = SpringUtil.getBean(UserConverter.class); } - /** * 每一条数据解析都会来调用 * @@ -56,10 +77,61 @@ public class UserImportListener extends MyAnalysisEventListener { @Override public void invoke(UserImportVO userImportVO, AnalysisContext analysisContext) { log.info("解析到一条用户数据:{}", JSONUtil.toJsonStr(userImportVO)); + currentIndex++; + StringBuilder rowMsg = new StringBuilder(); + boolean rowFlag = true; + // 校验数据 + + String username = userImportVO.getUsername(); + if (StrUtil.isBlank(username)) { + rowFlag = false; + rowMsg.append("用户名为空;"); + } else { + long count = userService.count(new LambdaQueryWrapper().eq(SysUser::getUsername, username)); + if (count > 0) { + rowFlag = false; + rowMsg.append("用户名已存在;"); + } + } + + String nickname = userImportVO.getNickname(); + if (StrUtil.isBlank(nickname)) { + rowFlag = false; + rowMsg.append("用户昵称为空;"); + } + String mobile = userImportVO.getMobile(); + if (StrUtil.isBlank(mobile)) { + rowFlag = false; + rowMsg.append("手机号码为空;"); + } else { + if (!Validator.isMobile(mobile)) { + rowFlag = false; + rowMsg.append("手机号码不正确;"); + } + } + if (rowFlag) { + validCount++; + SysUser entity = userConverter.importVo2Entity(userImportVO); + // 默认密码 + entity.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); + // 性别转换 + Integer gender = (Integer) IBaseEnum.getValueByLabel(userImportVO.getGender(), GenderEnum.class); + entity.setGender(gender); + entity.setDeptId(deptId); + cachedDataList.add(entity); + } else { + invalidCount++; + msg.append("第" + currentIndex + "行数据校验失败:").append(rowMsg + "
"); + } + + if (cachedDataList.size() > BATCH_COUNT) { + saveData(); + cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + } } @@ -70,21 +142,20 @@ public class UserImportListener extends MyAnalysisEventListener { */ @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 这里也要保存数据,确保最后遗留的数据也存储到数据库 + saveData(); + msg = new StringBuilder("导入用户结束:成功" + validCount + "条;失败" + invalidCount + "条
").append(msg); + } + /** + * 存储数据库 + */ + private void saveData() { + userService.saveBatch(cachedDataList); } @Override - public ExcelResult getResult() { - return new ExcelResult() { - @Override - public List getList() { - return null; - } - - @Override - public String getMsg() { - return null; - } - }; + public String getMsg() { + return this.msg.toString(); } } diff --git a/src/main/java/com/youlai/system/service/SysUserService.java b/src/main/java/com/youlai/system/service/SysUserService.java index 5b766736..93b379de 100644 --- a/src/main/java/com/youlai/system/service/SysUserService.java +++ b/src/main/java/com/youlai/system/service/SysUserService.java @@ -85,13 +85,6 @@ public interface SysUserService extends IService { UserAuthInfo getUserAuthInfo(String username); - /** - * 导入用户 - * - * @param userImportVO - * @return - */ - String importUsers(UserImportVO userImportVO) throws IOException; /** * 获取导出用户列表 diff --git a/src/main/resources/excel-templates/用户导入模板.xlsx b/src/main/resources/excel-templates/用户导入模板.xlsx index 601662142d07847810b9a04ec6c9c642a467aa70..36a208cc11024cb47601bf33be5568c0f80b30fe 100644 GIT binary patch delta 4950 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 From b593c47ae852186d68f358083ab02882355de57e Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Fri, 3 Mar 2023 00:50:35 +0800 Subject: [PATCH 4/7] =?UTF-8?q?refactor:=20=E7=94=A8=E6=88=B7=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysUserServiceImpl.java | 123 ++---------------- 1 file changed, 10 insertions(+), 113 deletions(-) diff --git a/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java b/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java index 01805889..0e99a9fc 100644 --- a/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java +++ b/src/main/java/com/youlai/system/service/impl/SysUserServiceImpl.java @@ -1,31 +1,23 @@ package com.youlai.system.service.impl; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.convert.Convert; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.read.builder.ExcelReaderBuilder; -import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.google.common.collect.Lists; -import com.youlai.system.common.base.IBaseEnum; import com.youlai.system.common.constant.SystemConstants; import com.youlai.system.converter.UserConverter; -import com.youlai.system.common.enums.GenderEnum; +import com.youlai.system.framework.security.util.SecurityUtils; import com.youlai.system.listener.UserImportListener; import com.youlai.system.mapper.SysUserMapper; -import com.youlai.system.pojo.bo.UserBO; -import com.youlai.system.pojo.vo.UserImportVO; -import com.youlai.system.pojo.entity.SysUser; -import com.youlai.system.pojo.entity.SysUserRole; -import com.youlai.system.pojo.form.UserForm; import com.youlai.system.pojo.bo.UserAuthInfo; +import com.youlai.system.pojo.bo.UserBO; import com.youlai.system.pojo.bo.UserFormBO; +import com.youlai.system.pojo.entity.SysUser; +import com.youlai.system.pojo.form.UserForm; import com.youlai.system.pojo.query.UserPageQuery; import com.youlai.system.pojo.vo.UserExportVO; import com.youlai.system.pojo.vo.UserInfoVO; @@ -34,16 +26,12 @@ import com.youlai.system.service.SysMenuService; import com.youlai.system.service.SysRoleService; import com.youlai.system.service.SysUserRoleService; import com.youlai.system.service.SysUserService; -import com.youlai.system.framework.security.util.SecurityUtils; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; @@ -60,8 +48,8 @@ import java.util.stream.Collectors; public class SysUserServiceImpl extends ServiceImpl implements SysUserService { private final PasswordEncoder passwordEncoder; + private final SysUserRoleService userRoleService; - private final UserImportListener userImportListener; private final UserConverter userConverter; @@ -86,10 +74,10 @@ public class SysUserServiceImpl extends ServiceImpl impl Page page = new Page<>(pageNum, pageSize); // 查询数据 - Page userPoPage = this.baseMapper.listUserPages(page, queryParams); + Page userBoPage = this.baseMapper.listUserPages(page, queryParams); // 实体转换 - Page userVoPage = userConverter.po2Vo(userPoPage); + Page userVoPage = userConverter.bo2Vo(userBoPage); return userVoPage; } @@ -104,7 +92,7 @@ public class SysUserServiceImpl extends ServiceImpl impl public UserForm getUserFormData(Long userId) { UserFormBO userFormBO = this.baseMapper.getUserDetail(userId); // 实体转换po->form - UserForm userForm = userConverter.po2Form(userFormBO); + UserForm userForm = userConverter.bo2Form(userFormBO); return userForm; } @@ -229,97 +217,6 @@ public class SysUserServiceImpl extends ServiceImpl impl return userAuthInfo; } - /** - * 导入用户 - * - * @param userImportVO - * @return - */ - @Transactional - @Override - public String importUsers(UserImportVO userImportVO) throws IOException { - - Long deptId = userImportVO.getDeptId(); - List roleIds = Arrays.stream(userImportVO.getRoleIds().split(",")) - .map(roleId -> Convert.toLong(roleId)) - .collect(Collectors.toList()); - InputStream inputStream = userImportVO.getFile().getInputStream(); - - ExcelReaderBuilder excelReaderBuilder = EasyExcel.read(inputStream, UserImportVO.UserItem.class, userImportListener); - ExcelReaderSheetBuilder sheet = excelReaderBuilder.sheet(); - List list = sheet.doReadSync(); - - Assert.isTrue(CollectionUtil.isNotEmpty(list), "未检测到任何数据"); - - // 有效数据集合 - List validDataList = list.stream() - .filter(item -> StrUtil.isNotBlank(item.getUsername())) - .collect(Collectors.toList()); - - Assert.isTrue(CollectionUtil.isNotEmpty(validDataList), "未检测到有效数据"); - - long distinctCount = validDataList.stream() - .map(UserImportVO.UserItem::getUsername) - .distinct() - .count(); - Assert.isTrue(validDataList.size() == distinctCount, "导入数据中有重复的用户名,请检查!"); - - List saveUserList = Lists.newArrayList(); - - StringBuilder errMsg = new StringBuilder(); - for (int i = 0; i < validDataList.size(); i++) { - UserImportVO.UserItem userItem = validDataList.get(i); - - String username = userItem.getUsername(); - if (StrUtil.isBlank(username)) { - errMsg.append(StrUtil.format("第{}条数据导入失败,原因:用户名为空", i + 1)); - continue; - } - - String nickname = userItem.getNickname(); - if (StrUtil.isBlank(nickname)) { - errMsg.append(StrUtil.format("第{}条数据导入失败,原因:用户昵称为空", i + 1)); - continue; - } - - SysUser user = new SysUser(); - user.setUsername(username); - user.setNickname(nickname); - user.setMobile(userItem.getMobile()); - user.setEmail(userItem.getEmail()); - user.setDeptId(deptId); - // 默认密码 - user.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); - // 性别转换 - Integer gender = (Integer) IBaseEnum.getValueByLabel(userItem.getGender(), GenderEnum.class); - user.setGender(gender); - - saveUserList.add(user); - } - - if (CollectionUtil.isNotEmpty(saveUserList)) { - boolean result = this.saveBatch(saveUserList); - Assert.isTrue(result, "导入数据失败,原因:保存用户出错"); - - List userRoleList = new ArrayList<>(); - - if (CollectionUtil.isNotEmpty(roleIds)) { - - roleIds.forEach(roleId -> { - userRoleList.addAll( - saveUserList.stream() - .map(user -> new SysUserRole(user.getId(), roleId)). - collect(Collectors.toList())); - }); - } - - userRoleService.saveBatch(userRoleList); - } - - errMsg.append(StrUtil.format("一共{}条数据,成功导入{}条数据,导入失败数据{}条", list.size(), saveUserList.size(), list.size() - saveUserList.size())); - return errMsg.toString(); - - } /** * 获取导出用户列表 @@ -350,14 +247,14 @@ public class SysUserServiceImpl extends ServiceImpl impl ) ); // entity->VO - UserInfoVO userInfoVO = userConverter.entity2LoginUser(user); + UserInfoVO userInfoVO = userConverter.entity2UserInfoVo(user); // 用户角色集合 Set roles = SecurityUtils.getRoles(); userInfoVO.setRoles(roles); // 用户权限集合 - Set perms = (Set)redisTemplate.opsForValue().get("USER_PERMS:" + user.getId()); + Set perms = (Set) redisTemplate.opsForValue().get("USER_PERMS:" + user.getId()); userInfoVO.setPerms(perms); return userInfoVO; From bc2896ad02f73a6cbf7c8ae0351b833d920c05bd Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Fri, 3 Mar 2023 00:50:54 +0800 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20SQL=E5=85=B3=E9=94=AE=E5=AD=97?= =?UTF-8?q?=E5=A4=A7=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/framework/mybatisplus/MyDataPermissionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/youlai/system/framework/mybatisplus/MyDataPermissionHandler.java b/src/main/java/com/youlai/system/framework/mybatisplus/MyDataPermissionHandler.java index efe7c894..49d6161b 100644 --- a/src/main/java/com/youlai/system/framework/mybatisplus/MyDataPermissionHandler.java +++ b/src/main/java/com/youlai/system/framework/mybatisplus/MyDataPermissionHandler.java @@ -79,7 +79,7 @@ public class MyDataPermissionHandler implements DataPermissionHandler { // 默认部门及子部门数据权限 default: deptId = SecurityUtils.getDeptId(); - appendSqlStr = deptColumnName + " IN ( SELECT id FROM sys_dept WHERE id = " + deptId + " or find_in_set( " + deptId + " , tree_path ) )"; + appendSqlStr = deptColumnName + " IN ( SELECT id FROM sys_dept WHERE id = " + deptId + " OR FIND_IN_SET( " + deptId + " , tree_path ) )"; break; } From dcd8ad02f89ffbf75a10973e6e4c9224dc28dce4 Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Fri, 3 Mar 2023 00:51:20 +0800 Subject: [PATCH 6/7] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E6=96=87=E6=A1=A3=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eaf21f20..cf51c5d5 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,14 @@ | 后端工程 | https://gitee.com/youlaiorg/youlai-boot | | 前端工程 | https://gitee.com/youlaiorg/vue3-element-admin | + + +## 接口文档 + +- `knife4j` 接口文档:[http://localhost:8989/doc.html](http://localhost:8989/doc.html) + +- `swagger` 接口文档:[http://localhost:8989/swagger-ui/index.html](http://localhost:8989/swagger-ui/index.html) + ## 项目运行 ### 1. 数据库创建 @@ -38,7 +46,7 @@ ### 4. 前端启动 -参考前端工程说明文档:[README.md](https://gitee.com/youlaiorg/vue3-element-admin#%E9%A1%B9%E7%9B%AE%E5%90%AF%E5%8A%A8) +文档:[README.md](https://gitee.com/youlaiorg/vue3-element-admin#%E9%A1%B9%E7%9B%AE%E5%90%AF%E5%8A%A8) ## 开发规范 From 5a9788fedc0c7c7c96a080485347807b22ac8c43 Mon Sep 17 00:00:00 2001 From: haoxr <1490493387@qq.com> Date: Fri, 3 Mar 2023 00:52:24 +0800 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20api-docs=E6=8E=A5=E5=8F=A3=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=8F=8F=E8=BF=B0=E8=BF=94=E5=9B=9E=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/youlai/system/config/WebMvcConfig.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/youlai/system/config/WebMvcConfig.java b/src/main/java/com/youlai/system/config/WebMvcConfig.java index 92911c96..6030f0cb 100644 --- a/src/main/java/com/youlai/system/config/WebMvcConfig.java +++ b/src/main/java/com/youlai/system/config/WebMvcConfig.java @@ -11,6 +11,7 @@ import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -29,6 +30,8 @@ public class WebMvcConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List> converters) { + converters.add(new StringHttpMessageConverter()); + MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper(); objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); @@ -42,7 +45,7 @@ public class WebMvcConfig implements WebMvcConfigurer { objectMapper.registerModule(simpleModule); jackson2HttpMessageConverter.setObjectMapper(objectMapper); - converters.add(0, jackson2HttpMessageConverter); + converters.add(jackson2HttpMessageConverter); } @Bean