pom.xml
@@ -107,6 +107,11 @@ <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.google.code.kaptcha</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> </dependencies> screen-common/src/main/java/com/moral/config/KaptchaConfig.java
New file @@ -0,0 +1,47 @@ package com.moral.config; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; /** * @ClassName KaptchaConfig * @Description TODO * @Author 陈凯裕 * @Date 2021/3/16 14:04 * @Version TODO **/ @Configuration public class KaptchaConfig { @Bean(name = "kaptchaProducer") public DefaultKaptcha getDefaultKaptcha(){ DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); //设置边框 properties.put("kaptcha.border", "no"); //字体颜色 properties.put("kaptcha.textproducer.font.color", "blue"); //文字间隔 properties.put("kaptcha.textproducer.char.space", "15"); //验证码长度 properties.put("kaptcha.textproducer.char.length","4"); //图片高度 properties.put("kaptcha.image.height","34"); //文字尺寸 properties.put("kaptcha.textproducer.font.size","25"); //干扰实现类 /*不使用干扰*/ //properties.put("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise"); /*使用默认干扰实现类*/ properties.put("kaptcha.noise.impl","com.google.code.kaptcha.impl.DefaultNoise"); //字体 //properties.setProperty("kaptcha.textproducer.font.names", "宋体"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } } screen-common/src/main/java/com/moral/pojo/VerificationCode.java
New file @@ -0,0 +1,18 @@ package com.moral.pojo; import lombok.Data; /** * @ClassName VerificationCode * @Description 验证码类 * @Author 陈凯裕 * @Date 2021/3/17 8:51 * @Version TODO **/ @Data public class VerificationCode { private String key; private String value; } screen-common/src/main/java/com/moral/util/AESUtils.java
@@ -70,7 +70,7 @@ } public static void main(String[] args) { System.out.println(encrypt("4048974139","AD42F7787B035B7580000EF93BE20BAD")); System.out.println(encrypt("404897439","AD42F7787B035B7580000EF93BE20BAD")); System.out.println(encrypt("chenkaiyu111","AD42F7787B035B7580000EF93BE20BAD")); } screen-common/src/main/java/com/moral/util/KaptchaUtils.java
New file @@ -0,0 +1,80 @@ package com.moral.util; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.moral.pojo.VerificationCode; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import sun.misc.BASE64Encoder; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.UUID; /** * @ClassName KaptchaUtils * @Description 验证码工具类 * @Author 陈凯裕 * @Date 2021/3/16 15:36 * @Version TODO **/ @Component @Slf4j public class KaptchaUtils { private static DefaultKaptcha defaultKaptcha; private static RedisTemplate redisTemplate; @Autowired public void setRedisTemplate(RedisTemplate redisTemplate) { KaptchaUtils.redisTemplate = redisTemplate; } @Autowired @Qualifier(value = "kaptchaProducer") public void setDefaultKaptcha(DefaultKaptcha defaultKaptcha) { KaptchaUtils.defaultKaptcha = defaultKaptcha; } /** * @Description: 生成验证码 * @Param: [] * @return: java.lang.String * @Author: 陈凯裕 * @Date: 2021/3/16 */ public static VerificationCode createVerificationCode() throws IOException { //生成验证码内容 String text = defaultKaptcha.createText(); //生成图片 BufferedImage image = defaultKaptcha.createImage(text); //获取图片的字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ImageIO.write(image,"jpg",outputStream); byte[] bytes = outputStream.toByteArray(); //将字节数组进行编码 BASE64Encoder encoder = new BASE64Encoder(); String encode = encoder.encode(bytes); //将验证码存入redis String key = UUID.randomUUID().toString(); //redisTemplate.opsForValsue().set(key,encode); //redisTemplate.expire(); return null; } public boolean verify(String verificationCode) { return false; } } screen-manage/src/main/java/com/moral/api/controller/AccountController.java
@@ -1,10 +1,13 @@ package com.moral.api.controller; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.moral.api.pojo.dto.account.AccountDeleteDTO; import com.moral.api.pojo.dto.account.AccountInsertDTO; import com.moral.api.pojo.dto.account.AccountQueryDTO; import com.moral.api.pojo.dto.account.AccountUpdateDTO; import com.moral.api.pojo.dto.login.LoginDTO; import com.moral.api.pojo.request.*; import com.moral.api.pojo.vo.account.AccountDeleteVO; import com.moral.api.pojo.vo.account.AccountInsertVO; import com.moral.api.pojo.vo.account.AccountQueryVO; import com.moral.api.pojo.vo.account.AccountUpdateVO; @@ -12,6 +15,8 @@ import com.moral.api.service.ManageAccountService; import com.moral.constant.Constants; import com.moral.constant.ResultMessage; import com.moral.util.KaptchaUtils; import com.moral.util.TokenUtils; import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -21,6 +26,8 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Slf4j @Api(tags = {"后台账户管理"}) @@ -32,7 +39,6 @@ @Autowired @Qualifier("tokenRedisTemplate") RedisTemplate redisTemplate; @PostMapping("login") public ResultMessage login(@RequestBody LoginRequest loginRequest) { @@ -88,6 +94,7 @@ return ResultMessage.ok(accountQueryVO); } @PostMapping("update") public ResultMessage update(@RequestBody AccountUpdateRequest accountQeuryRequest){ if(!accountQeuryRequest.valid()) @@ -102,6 +109,27 @@ return ResultMessage.fail(accountUpdateVO); } @PostMapping("delete") public ResultMessage delete(@RequestBody AccountDeleteRequest accountDeleteRequest){ if(!accountDeleteRequest.valid()) return ResultMessage.fail(Constants.CODE_PARAMETER_IS_MISSING,Constants.MSG_PARAMETER_IS_MISSING); AccountDeleteDTO accountDeleteDTO = accountService.deleteAccount(accountDeleteRequest); AccountDeleteVO accountDeleteVO = AccountDeleteVO.convert(accountDeleteDTO); if(accountDeleteVO.getCode().equals(accountDeleteVO.SUCCESS)) return ResultMessage.ok(accountDeleteVO); return ResultMessage.fail(accountDeleteVO); } @PostMapping("yanzhengma") public String yanzhengma(HttpServletResponse response) throws IOException { KaptchaUtils.createVerificationCode(); TokenUtils.getToken("1",1); return null; } } screen-manage/src/main/java/com/moral/api/pojo/dto/account/AccountDTO.java
@@ -19,4 +19,6 @@ private ManageAccount account; private List<ManageRole> roles; private String code; } screen-manage/src/main/java/com/moral/api/pojo/dto/account/AccountDeleteDTO.java
New file @@ -0,0 +1,26 @@ package com.moral.api.pojo.dto.account; import lombok.Data; /** * @ClassName AccountDeleteDTO * @Description TODO * @Author 陈凯裕 * @Date 2021/3/16 8:59 * @Version TODO **/ @Data public class AccountDeleteDTO extends AccountDTO { /* * 删除成功 * */ public final static String SUCCESS = "0"; /* * 用户不存在 * */ public final static String ACCOUNT_NOT_EXIST = "-1"; } screen-manage/src/main/java/com/moral/api/pojo/dto/account/AccountInsertDTO.java
@@ -56,7 +56,6 @@ * */ public static final String PASSWORD_EXIST_SPECIAL_CHAR = "-7"; private String code; } screen-manage/src/main/java/com/moral/api/pojo/dto/account/AccountUpdateDTO.java
@@ -31,5 +31,4 @@ * */ public static final String EMAIL_INVALID = "-3"; private String code; } screen-manage/src/main/java/com/moral/api/pojo/request/AccountDeleteRequest.java
New file @@ -0,0 +1,23 @@ package com.moral.api.pojo.request; import lombok.Data; /** * @ClassName AccountDeleteRequest * @Description TODO * @Author 陈凯裕 * @Date 2021/3/16 8:54 * @Version TODO **/ @Data public class AccountDeleteRequest { private Integer accountId; public boolean valid(){ if(accountId==null||accountId==0){ return false; } return true; } } screen-manage/src/main/java/com/moral/api/pojo/request/AccountInsertRequest.java
@@ -42,8 +42,6 @@ private String updateTime; private String isDelete; private List<String> roleIds; public boolean valid() { @@ -53,7 +51,6 @@ ObjectUtils.isEmpty(email) || ObjectUtils.isEmpty(mobile) || ObjectUtils.isEmpty(userName) || ObjectUtils.isEmpty(isDelete) || ObjectUtils.isEmpty(roleIds) ) return false; screen-manage/src/main/java/com/moral/api/pojo/request/AccountUpdateRequest.java
@@ -25,8 +25,6 @@ private String wechat; private String isDelete; private List<Integer> roleIds; public boolean valid(){ @@ -35,7 +33,6 @@ ObjectUtils.isEmpty(userName) || ObjectUtils.isEmpty(email) || ObjectUtils.isEmpty(mobile) || ObjectUtils.isEmpty(isDelete) || ObjectUtils.isEmpty(roleIds) ) return false; screen-manage/src/main/java/com/moral/api/pojo/vo/account/AccountDeleteVO.java
New file @@ -0,0 +1,41 @@ package com.moral.api.pojo.vo.account; import com.fasterxml.jackson.annotation.JsonInclude; import com.moral.api.entity.ManageAccount; import com.moral.api.pojo.dto.account.AccountDeleteDTO; import lombok.Data; import org.springframework.util.ObjectUtils; /** * @ClassName AccountDeleteVO * @Description TODO * @Author 陈凯裕 * @Date 2021/3/16 11:40 * @Version TODO **/ @Data @JsonInclude(JsonInclude.Include.NON_EMPTY) public class AccountDeleteVO extends AccountVO { /* * 删除成功 * */ public final static String SUCCESS = "0"; /* * 用户不存在 * */ public final static String ACCOUNT_NOT_EXIST = "-1"; public static AccountDeleteVO convert(AccountDeleteDTO dto) { AccountDeleteVO vo = new AccountDeleteVO(); vo.setCode(dto.getCode()); if (!ObjectUtils.isEmpty(dto.getAccount())) { ManageAccount account = dto.getAccount(); vo.setId(account.getId()); vo.setUserName(account.getUserName()); } return vo; } } screen-manage/src/main/java/com/moral/api/pojo/vo/account/AccountInsertVO.java
@@ -58,7 +58,6 @@ * */ public static final String PASSWORD_EXIST_SPECIAL_CHAR = "-7"; private String code; /** @@ -76,7 +75,6 @@ String email = dto.getAccount().getEmail(); String mobile = dto.getAccount().getMobile(); String wechat = dto.getAccount().getWechat(); String isDelete = dto.getAccount().getIsDelete(); //转换成角色名集合 List<ManageRole> roles = dto.getRoles(); @@ -88,7 +86,6 @@ vo.setEmail(email); vo.setMobile(mobile); vo.setWechat(wechat); vo.setIsDelete(isDelete); vo.setRoleNames(roleNames); } screen-manage/src/main/java/com/moral/api/pojo/vo/account/AccountUpdateVO.java
@@ -40,9 +40,6 @@ * */ public static final String EMAIL_INVALID = "-3"; private String code; public static AccountUpdateVO convert(AccountUpdateDTO dto){ AccountUpdateVO vo = new AccountUpdateVO(); if(dto.getCode()== AccountUpdateDTO.SUCCESS){ @@ -51,7 +48,6 @@ String email = dto.getAccount().getEmail(); String mobile = dto.getAccount().getMobile(); String wechat = dto.getAccount().getWechat(); String isDelete = dto.getAccount().getIsDelete(); //转换成角色名集合 List<ManageRole> roles = dto.getRoles(); @@ -63,7 +59,6 @@ vo.setEmail(email); vo.setMobile(mobile); vo.setWechat(wechat); vo.setIsDelete(isDelete); vo.setRoleNames(roleNames); } screen-manage/src/main/java/com/moral/api/pojo/vo/account/AccountVO.java
@@ -18,8 +18,10 @@ **/ @Data @JsonInclude(JsonInclude.Include.NON_EMPTY) public class AccountVO { private String code; private Integer id; private String userName; @@ -29,8 +31,6 @@ private String mobile; private String wechat; private String isDelete; private List<String> roleNames; @@ -47,7 +47,6 @@ vo.setEmail(account.getEmail()); vo.setMobile(account.getMobile()); vo.setWechat(account.getWechat()); vo.setIsDelete(account.getIsDelete()); vo.setRoleNames(roleNames); return vo; } screen-manage/src/main/java/com/moral/api/service/ManageAccountService.java
@@ -2,10 +2,7 @@ import com.moral.api.entity.ManageAccount; import com.baomidou.mybatisplus.extension.service.IService; import com.moral.api.pojo.dto.account.AccountDTO; import com.moral.api.pojo.dto.account.AccountInsertDTO; import com.moral.api.pojo.dto.account.AccountQueryDTO; import com.moral.api.pojo.dto.account.AccountUpdateDTO; import com.moral.api.pojo.dto.account.*; import com.moral.api.pojo.dto.login.LoginDTO; import com.moral.api.pojo.request.*; @@ -62,4 +59,13 @@ * @Date: 2021/3/15 */ AccountUpdateDTO updateAccount(AccountUpdateRequest accountUpdateRequest); /** * @Description: 删除账号 * @Param: [accountDeleteRequest] * @return: com.moral.api.pojo.dto.account.AccountDeleteDTO * @Author: 陈凯裕 * @Date: 2021/3/16 */ AccountDeleteDTO deleteAccount(AccountDeleteRequest accountDeleteRequest); } screen-manage/src/main/java/com/moral/api/service/impl/ManageAccountServiceImpl.java
@@ -1,6 +1,7 @@ package com.moral.api.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.moral.api.entity.ManageAccount; import com.moral.api.entity.ManageAccountRole; @@ -10,10 +11,7 @@ import com.moral.api.mapper.ManageAccountRoleMapper; import com.moral.api.mapper.ManageMenuMapper; import com.moral.api.mapper.ManageRoleMapper; import com.moral.api.pojo.dto.account.AccountDTO; import com.moral.api.pojo.dto.account.AccountInsertDTO; import com.moral.api.pojo.dto.account.AccountQueryDTO; import com.moral.api.pojo.dto.account.AccountUpdateDTO; import com.moral.api.pojo.dto.account.*; import com.moral.api.pojo.dto.login.AccountInfoDTO; import com.moral.api.pojo.dto.login.LoginDTO; import com.moral.api.pojo.request.*; @@ -79,13 +77,19 @@ //查询是否存在 QueryWrapper<ManageAccount> wrapper = new QueryWrapper<>(); wrapper.eq("account", account); ManageAccount manageAccount = manageAccountMapper.selectOne(wrapper); if (ObjectUtils.isEmpty(manageAccount)) { List<ManageAccount> manageAccounts = manageAccountMapper.selectList(wrapper); if (ObjectUtils.isEmpty(manageAccounts)) { loginDTO.setCode(LoginDTO.NOT_EXIST); return loginDTO; } //查询是否逻辑删除 if (manageAccount.getIsDelete().equals("1")) { ManageAccount manageAccount = null; for (ManageAccount value : manageAccounts) { if("0".equals(value.getIsDelete())) manageAccount = value; } if (ObjectUtils.isEmpty(manageAccount)) { loginDTO.setCode(LoginDTO.IS_DELETE); return loginDTO; } @@ -160,7 +164,6 @@ String email = accountInsertRequest.getEmail(); String mobile = accountInsertRequest.getMobile(); String wechat = accountInsertRequest.getWechat(); String isDelete = accountInsertRequest.getIsDelete(); List<String> roleIdsStr = accountInsertRequest.getRoleIds(); //校验参数是否符合业务逻辑 /*判断用户名是否包含特殊字符*/ @@ -193,7 +196,7 @@ accountInsertDTO.setCode(AccountInsertDTO.EMAIL_INVALID); return accountInsertDTO; } /*判断用户名是否存在*/ /*判断账号是否存在*/ ManageAccount exitAccount = new ManageAccount(); exitAccount.setAccount(account); exitAccount.setIsDelete("0"); @@ -217,7 +220,6 @@ manageAccount.setEmail(email); manageAccount.setMobile(mobile); manageAccount.setWechat(wechat); manageAccount.setIsDelete(isDelete); manageAccountMapper.insert(manageAccount); //封装account_role Integer accountId = manageAccount.getId(); @@ -265,7 +267,11 @@ queryParams.put("email", email); queryParams.put("mobile", mobile); queryParams.put("wechat", wechat); queryParams.put("is_delete", isDelete); if(!ObjectUtils.isEmpty(isDelete)) queryParams.put("is_delete", isDelete); else queryParams.put("is_delete","0"); //过滤为null的参数 queryParams.values().removeIf(value -> ObjectUtils.isEmpty(value)); //查询用户 Page<ManageAccount> page = new Page<>(pageCount, size); @@ -292,6 +298,13 @@ return accountQueryDTO; } /** * @Description: 更新后台账号 * @Param: [accountUpdateRequest] * @return: com.moral.api.pojo.dto.account.AccountUpdateDTO * @Author: 陈凯裕 * @Date: 2021/3/16 */ @Override @Transactional public AccountUpdateDTO updateAccount(AccountUpdateRequest accountUpdateRequest) { @@ -301,7 +314,6 @@ String email = accountUpdateRequest.getEmail(); String mobile = accountUpdateRequest.getMobile(); String wechat = accountUpdateRequest.getWechat(); String isDelete = accountUpdateRequest.getIsDelete(); String userName = accountUpdateRequest.getUserName(); List<Integer> roleIds = accountUpdateRequest.getRoleIds(); //校验参数是否符合逻辑 @@ -331,7 +343,6 @@ manageAccount.setEmail(email); manageAccount.setMobile(mobile); manageAccount.setWechat(wechat); manageAccount.setIsDelete(isDelete); manageAccount.setUserName(userName); QueryWrapper<ManageAccount> wrapper = new QueryWrapper<>(); wrapper.eq("id",accountId); @@ -358,7 +369,44 @@ } /** * @Description: 删除后台账号 * @Param: [accountDeleteRequest] * @return: com.moral.api.pojo.dto.account.AccountDeleteDTO * @Author: 陈凯裕 * @Date: 2021/3/16 */ @Override @Transactional public AccountDeleteDTO deleteAccount(AccountDeleteRequest accountDeleteRequest) { AccountDeleteDTO accountDeleteDTO = new AccountDeleteDTO(); //取参 Integer accountId = accountDeleteRequest.getAccountId(); //查询是否存在 ManageAccount manageAccount = new ManageAccount(); manageAccount.setIsDelete("0"); manageAccount.setId(accountId); QueryWrapper<ManageAccount> queryWrapper = new QueryWrapper<>(); queryWrapper.setEntity(manageAccount); ManageAccount existManageAccount = manageAccount.selectOne(queryWrapper); if(ObjectUtils.isEmpty(existManageAccount)){ accountDeleteDTO.setCode(AccountDeleteDTO.ACCOUNT_NOT_EXIST); return accountDeleteDTO; } //逻辑删除账号 existManageAccount.setIsDelete("1"); UpdateWrapper<ManageAccount> deleteAccountWrapper = new UpdateWrapper<>(); deleteAccountWrapper.set("is_delete","1").eq("id",manageAccount.getId()); manageAccountMapper.update(null,deleteAccountWrapper); //逻辑删除账号相关角色 UpdateWrapper<ManageAccountRole> deleteManageAccountRoleWrapper = new UpdateWrapper<>(); deleteManageAccountRoleWrapper.set("is_delete","1").eq("account_id",manageAccount.getId()); manageAccountRoleMapper.update(null,deleteManageAccountRoleWrapper); //封装返回结果 accountDeleteDTO.setCode(AccountDeleteDTO.SUCCESS); accountDeleteDTO.setAccount(existManageAccount); return accountDeleteDTO; } private static boolean isSpecialChar(String str) { screen-manage/src/main/resources/application-dev.yml
@@ -121,6 +121,8 @@ - /account/insert - /account/query - /account/update - /account/delete - /account/yanzhengma AES: KEY: AD42F7787B035B7580000EF93BE20BAD