third 2021年11月1日14:44:40

master
zhangmeng 2021-11-01 14:44:56 +08:00
parent 26cdee56a5
commit 5e1a9141ff
37 changed files with 2273 additions and 1 deletions

View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mystyle-cloud-parent</artifactId>
<groupId>com.zhangmeng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mystyle-cloud-admin-manager</artifactId>
<dependencies>
<dependency>
<groupId>com.zhangmeng</groupId>
<artifactId>mystyle-cloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.zhangmeng</groupId>
<artifactId>mystyle-cloud-model</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,17 @@
package com.zhangmeng.admin.manager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@ComponentScan(basePackages = {"com.zhangmeng.model","com.zhangmeng.admin.manager","com.zhangmeng.api"})
public class AdminManagerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminManagerApplication.class,args);
}
}

View File

@ -0,0 +1,65 @@
package com.zhangmeng.admin.manager.config.verificationCode;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author zhangmeng
* @version 1.0
* @date 2020111616:34:08
*/
@Configuration
@ConfigurationProperties(prefix = "verification-code")
public class VerificationCodeConfig {
private String redisKey;
private Long expirationTime;
private Type type;
public enum Type {
RAM("内存"),
MYSQL("mysql"),
REDIS("redis");
private String description;
Type(String description) {
this.description = description;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
public Type getType() {
return type;
}
public void setType(Type type) {
this.type = type;
}
public Long getExpirationTime() {
return expirationTime;
}
public void setExpirationTime(Long expirationTime) {
this.expirationTime = expirationTime;
}
public String getRedisKey() {
return redisKey;
}
public void setRedisKey(String redisKey) {
this.redisKey = redisKey;
}
}

View File

@ -0,0 +1,160 @@
package com.zhangmeng.admin.manager.controller;
import com.zhangmeng.admin.manager.service.PermissionService;
import com.zhangmeng.api.service.admin_manager.PermissionControllerApi;
import com.zhangmeng.model.base.baseController.BaseController;
import com.zhangmeng.model.base.baseUtil.CommonUtil;
import com.zhangmeng.model.entity.Permission;
import com.zhangmeng.model.vo.Result;
import com.zhangmeng.model.vo.ResultTree;
import com.zhangmeng.model.vo.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
import java.util.Map;
@RestController
@RequestMapping("/permission")
public class PermissionController extends BaseController implements PermissionControllerApi {
@Autowired
private PermissionService permissionService;
@Override
@GetMapping("/list")
public Result list(Integer pageNum, Integer pageSize, String title) {
Condition condition = new Condition(Permission.class);
Example.Criteria criteria = condition.createCriteria();
if (CommonUtil.isNotNull(title)){
criteria.andLike("title","%" + title + "%");
}
List<Permission> permissionList = this.permissionService.findByCondition(condition);
return new Result(true, 0, "查询成功", permissionList);
}
@Override
@GetMapping("/selectParent")
public ResultTree selectParent(String parentId) {
Condition condition = new Condition(Permission.class);
Example.Criteria criteria = condition.createCriteria();
if (parentId != null && !parentId.equals("")) {
criteria.andEqualTo("parent_id", Long.parseLong(parentId));
}
List<Permission> list = this.permissionService.findByCondition(condition);
Permission basePower = new Permission();
basePower.setTitle("顶级权限");
basePower.setId(0L);
basePower.setParent_id(-1L);
list.add(basePower);
return dataTree(list);
}
@Override
@PostMapping("/save")
public Result save(@RequestParam @RequestBody Map<String, Object> map) {
Permission permission = null;
boolean flag = false;
String message = null;
String id = CommonUtil.map_get_value(map, "id");
if (id == null || id.equals("")) {
permission = new Permission();
flag = true;
} else {
permission = this.permissionService.findById(Long.parseLong(id));
}
String parentId = CommonUtil.map_get_value(map, "parentId");
if (CommonUtil.isNotNull(parentId)) {
permission.setParent_id(Long.parseLong(parentId));
}
String title = CommonUtil.map_get_value(map, "title");
if (CommonUtil.isNotNull(title)) {
permission.setTitle(title);
}
String code = CommonUtil.map_get_value(map, "code");
if (CommonUtil.isNotNull(code)) {
permission.setCode(code);
}
String type = CommonUtil.map_get_value(map, "type");
if (CommonUtil.isNotNull(type)) {
Permission.Type permission_type = null;
if (type.equals("CATALOG")) {
permission_type = Permission.Type.CATALOG;
}
if (type.equals("MENU")) {
permission_type = Permission.Type.MENU;
}
if (type.equals("BUTTON")) {
permission_type = Permission.Type.BUTTON;
}
permission.setType(permission_type);
}
String href = CommonUtil.map_get_value(map, "href");
if (CommonUtil.isNotNull(href)) {
permission.setHref(href);
}
String openType = CommonUtil.map_get_value(map, "openType");
if (CommonUtil.isNotNull(openType)) {
permission.setOpenType(openType);
}
String icon = CommonUtil.map_get_value(map, "icon");
if (CommonUtil.isNotNull(icon)) {
permission.setIcon(icon);
}
String sort = CommonUtil.map_get_value(map, "sort");
if (CommonUtil.isNotNull(sort)) {
//判断是否为数字
if (CommonUtil.isNumeric_ASCII(sort)) {
permission.setSort(Integer.parseInt(sort));
}
}
if (flag) {
message = "保存成功";
this.permissionService.save(permission);
} else {
message = "修改成功";
this.permissionService.update(permission);
}
return new Result(true, StatusCode.OK, message);
}
;
@Override
@PostMapping("/delete")
public Result delete(String permissionId) {
if (CommonUtil.isNotNull(permissionId)) {
this.permissionService.deleteById(Long.parseLong(permissionId));
}
return new Result(true, StatusCode.OK, "删除成功");
}
@Override
@PostMapping("/batchRemove")
public Result batchRemove(String ids) {
String id_s = CommonUtil.firstLastComma(ids);
String[] strings = id_s.split(",");
if (strings.length > 0) {
for (String id : strings) {
this.permissionService.deleteById(Long.parseLong(id));
}
}
return new Result(true, 0, "删除成功");
}
@Override
@GetMapping("/findByUserId")
public List<Permission> findByUserId(Long id) {
return this.permissionService.findByUserId(id);
}
}

View File

@ -0,0 +1,154 @@
package com.zhangmeng.admin.manager.controller;
import com.github.pagehelper.PageInfo;
import com.zhangmeng.api.service.admin_manager.UserControllerApi;
import com.zhangmeng.model.base.baseController.BaseController;
import com.zhangmeng.model.base.baseUtil.CommonUtil;
import com.zhangmeng.model.dto.QueryParams;
import com.zhangmeng.model.entity.Role;
import com.zhangmeng.model.entity.User;
import com.zhangmeng.model.vo.Result;
import com.zhangmeng.model.vo.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example;
import com.zhangmeng.admin.manager.service.UserService;
import java.util.Map;
/**
* @author zhangmeng
* @version 1.0
* @date 202171009:15:06
*/
@RestController
@RequestMapping("/user")
public class UserController extends BaseController implements UserControllerApi {
@Autowired
private UserService userService;
@Override
@PostMapping("/save")
public Result save(@RequestParam @RequestBody Map<String, Object> parms) {
return this.userService.save_user(parms);
}
@Override
@PostMapping("/delete")
public Result delete(String userId) {
if (userId != null && !userId.equals("")) {
this.userService.deleteById(Long.parseLong(userId));
}
return new Result(true, StatusCode.OK, "删除成功");
}
@Override
@GetMapping("/list")
public Result list(Integer pageNum, Integer pageSize, String username, String telephone) {
Condition condition = new Condition(User.class);
Example.Criteria criteria = condition.createCriteria();
if (username != null && !username.equals("")) {
criteria.andLike("username", "%" + username + "%");
}
if (telephone != null && !telephone.equals("")) {
criteria.andLike("telephone", "%" + telephone + "%");
}
PageInfo<User> pageInfo = this.userService.findByCondition(new QueryParams(pageNum, pageSize, condition,"addTime desc"),true);
return new Result(true, StatusCode.OK, "查询成功",pageInfo.getTotal(), pageInfo.getList());
}
@Override
@PostMapping("/batchRemove")
public Result batchRemove(String ids){
if (CommonUtil.isNotNull(ids)){
this.userService.deleteByIds(CommonUtil.firstLastComma(ids));
}
return new Result(true,StatusCode.OK,"批量删除成功");
}
@Override
@PostMapping("/reg_save")
public Result reg_save(@RequestParam @RequestBody Map<String, Object> parms) {
return this.userService.reg_save(parms);
}
@Override
@GetMapping("/current")
public Result current(){
return null;
}
@Override
@PostMapping("/personUpdate")
public Result personUpdate(@RequestParam @RequestBody Map<String,Object> map){
User user = null;
boolean flag = false;
String userId = CommonUtil.map_get_value(map, "userId");
if (userId != null && !userId.equals("")){
user = this.userService.findById(Long.parseLong(userId));
flag = true;
}else {
user = new User();
}
String username = CommonUtil.map_get_value(map, "username");
if (CommonUtil.isNotNull(username)){
user.setUsername(username);
}
String sex = CommonUtil.map_get_value(map, "sex");
if (CommonUtil.isNotNull(sex)){
user.setGender(CommonUtil.getEnum(sex,User.Gender.class));
}
String status = CommonUtil.map_get_value(map, "status");
if (CommonUtil.isNotNull(status)){
user.setStatus(CommonUtil.getEnum(status,User.Status.class));
}
String role_type = CommonUtil.map_get_value(map, "role_name");
if (CommonUtil.isNotNull(role_type)){
user.setRoleType(CommonUtil.getEnum(role_type, Role.Type.class));
}
String email = CommonUtil.map_get_value(map, "email");
if (CommonUtil.isNotNull(email)){
user.setEmail(email);
}
String telephone = CommonUtil.map_get_value(map, "telephone");
if (CommonUtil.isNotNull(telephone)){
user.setTelephone(telephone);
}
String profession = CommonUtil.map_get_value(map, "profession");
if (CommonUtil.isNotNull(profession)){
user.setProfession(profession);
}
String sign = CommonUtil.map_get_value(map, "sign");
if (CommonUtil.isNotNull(sign)){
user.setSign(sign);
}
String file_id = CommonUtil.map_get_value(map, "file_id");
if (CommonUtil.isNotNull(file_id)){
user.setPhoto_id(Long.parseLong(file_id));
}
String upload_image = CommonUtil.map_get_value(map, "upload_image");
if (CommonUtil.isNotNull(upload_image)){
user.setAvatar(upload_image);
}
if (flag){
this.userService.update(user);
}else {
this.userService.save(user);
}
return new Result(true,StatusCode.OK,"修改成功");
}
@Override
@GetMapping("/findByUserName")
public User findByUserName(String username) {
return this.userService.loadUserByUsername(username);
}
}

View File

@ -0,0 +1,153 @@
package com.zhangmeng.admin.manager.controller;
import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.ShearCaptcha;
import com.wf.captcha.SpecCaptcha;
import com.zhangmeng.admin.manager.config.verificationCode.VerificationCodeConfig;
import com.zhangmeng.admin.manager.service.VerificationCodeService;
import com.zhangmeng.admin.manager.utils.VerificationCodeUtil;
import com.zhangmeng.api.service.admin_manager.VerificationCodeControllerApi;
import com.zhangmeng.model.base.baseController.BaseController;
import com.zhangmeng.model.base.baseUtil.CommonUtil;
import com.zhangmeng.model.entity.VerificationCode;
import com.zhangmeng.model.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
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;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
/**
* @author zhangmeng
* @version 1.0
* @date 2021/1/21 21:41
* <p>
*
*/
@RestController
@RequestMapping("/verificationCode")
public class VerificationCodeController extends BaseController implements VerificationCodeControllerApi {
/**
*
*/
private static final String SESSION_KEY = "captcha";
private static final int DEFAULT_LEN = 4; // 默认长度
private static final int DEFAULT_WIDTH = 130; // 默认宽度
private static final int DEFAULT_HEIGHT = 48; // 默认高度
@Autowired
private VerificationCodeConfig verificationCodeConfig;
@Autowired
private VerificationCodeService verificationCodeService;
/**
*
*
* @param request
* @param response
*/
@Override
@RequestMapping("/generate")
public String generate(HttpServletRequest request, HttpServletResponse response) {
SpecCaptcha specCaptcha = new SpecCaptcha(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_LEN);
VerificationCodeConfig.Type type = this.verificationCodeConfig.getType();
switch (type) {
case MYSQL:
this.verificationCodeService.mysql_save(specCaptcha);
break;
case REDIS:
this.verificationCodeService.redis_save(specCaptcha);
break;
}
//输出验证码到页面
//specCaptcha.out(response.getOutputStream());
return specCaptcha.text();
}
/**
*
*
* @param request
* @param captcha
* @return
*/
@Override
@RequestMapping("/verify")
public Result verify(HttpServletRequest request, String captcha) {
if (com.wf.captcha.utils.CaptchaUtil.ver(captcha, request)) {
return success("验证成功");
}
return failure("验证失败");
}
/**
*
*
* @param httpServletRequest imageIo
* @param httpServletResponse imageIo
*/
@Override
@GetMapping("/generateVerificationCode/v1")
public void generateVerificationCodeV1(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
@RequestParam(name = "vl", defaultValue = "4") Integer vcodeLength,//vcodeLength,验证码长度
@RequestParam(name = "fs", defaultValue = "21") Integer fontSize,//fontSize,验证码字体大小
@RequestParam(name = "w", defaultValue = "98") Integer width,//width,图片宽度
@RequestParam(name = "h", defaultValue = "33") Integer height//height,图片高度
) {
VerificationCodeUtil verificationCodeUtil = new VerificationCodeUtil(vcodeLength, fontSize, width, height);
String generatorVerificationCode = verificationCodeUtil.generatorVCode();
this.verificationCodeService.cacheVerificationCode(generatorVerificationCode);
try {
ImageIO.write(verificationCodeUtil.generatorVCodeImage(generatorVerificationCode, true), "gif", httpServletResponse.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
*/
@Override
@GetMapping("/generateVerificationCode/v2")
public String generateVerificationCodeV2() {
ShearCaptcha captcha = CaptchaUtil.createShearCaptcha(111, 36, 6, 6);
// 验证码对应的字符串
String code = captcha.getCode();
this.verificationCodeService.cacheVerificationCode(code);
return captcha.getImageBase64();
}
/**
*
*/
@Override
@GetMapping("/generateVerificationCode/v3")
public Result generateVerificationCodeV3(String telephone) {
String verifierCode = CommonUtil.mobileVerifierCode(6);
//保存至数据库
VerificationCode verificationCode = new VerificationCode();
verificationCode.setAddTime(new Date());
verificationCode.setDeleteStatus(false);
verificationCode.setType(VerificationCode.Type.pc);
verificationCode.setStatus(VerificationCode.Status.register);
verificationCode.setTelephone(telephone);
verificationCode.setCode(verifierCode);
this.verificationCodeService.save(verificationCode);
return new Result(true, 0, "发送成功", verifierCode);
}
}

View File

@ -0,0 +1,41 @@
package com.zhangmeng.admin.manager.dao;
import com.zhangmeng.model.base.baseDao.AbstractBaseMapper;
import com.zhangmeng.model.entity.Permission;
import org.apache.ibatis.annotations.*;
import java.util.List;
/**
* @author zhengmeng
* @version 1.0
* @date 20211717:44:40
*/
@Mapper
public interface PermissionDao extends AbstractBaseMapper<Permission> {
@Results(value = {
@Result(id = true,column = "id",property = "id"),
@Result(column = "addTime",property = "addTime"),
@Result(column = "updateTime",property = "updateTime"),
@Result(column = "name",property = "name"),
@Result(column = "type",property = "type"),
@Result(column = "permissionCode",property = "permissionCode"),
@Result(column = "url",property = "url"),
@Result(column = "openType",property = "openType"),
@Result(column = "parent_id",property = "parent_id"),
@Result(column = "long_text_id",property = "long_text_id"),
@Result(column = "parent_long_text_id",property = "parent_long_text_id"),
@Result(column = "icon",property = "icon"),
@Result(column = "sort",property = "sort"),
})
@Select("select DISTINCT p.* from permission p left join role_permission rp on p.id = rp.permission_id left join user_role ur on ur.role_id = rp.role_id where ur.user_id = #{userId}")
List<Permission> findByUserId(@Param("userId") Long userId);
@Select("select * from permission p where p.parentId is null")
List<Permission> findByParentIdIsNull();
@Select("select * from permission p where p.parentId = #{parentId}")
List<Permission> findByParentId(Long parentId);
}

View File

@ -0,0 +1,14 @@
package com.zhangmeng.admin.manager.dao;
import com.zhangmeng.model.base.baseDao.AbstractBaseMapper;
import com.zhangmeng.model.entity.Role;
import org.apache.ibatis.annotations.Mapper;
/**
* @author zhengmeng
* @version 1.0
* @date 20211717:44:40
*/
@Mapper
public interface RoleDao extends AbstractBaseMapper<Role> {
}

View File

@ -0,0 +1,15 @@
package com.zhangmeng.admin.manager.dao;
import com.zhangmeng.model.base.baseDao.AbstractBaseMapper;
import com.zhangmeng.model.entity.RolePermission;
import org.apache.ibatis.annotations.Mapper;
/**
* @author zhengmeng
* @version 1.0
* @date 20211717:44:40
*/
@Mapper
public interface RolePermissionDao extends AbstractBaseMapper<RolePermission> {
}

View File

@ -0,0 +1,15 @@
package com.zhangmeng.admin.manager.dao;
import com.zhangmeng.model.base.baseDao.AbstractBaseMapper;
import com.zhangmeng.model.entity.User;
import org.apache.ibatis.annotations.Mapper;
/**
* @author zhengmeng
* @version 1.0
* @date 20211717:44:40
*/
@Mapper
public interface UserDao extends AbstractBaseMapper<User> {
}

View File

@ -0,0 +1,15 @@
package com.zhangmeng.admin.manager.dao;
import com.zhangmeng.model.base.baseDao.AbstractBaseMapper;
import com.zhangmeng.model.entity.UserRole;
import org.apache.ibatis.annotations.Mapper;
/**
* @author zhengmeng
* @version 1.0
* @date 20211717:44:40
*/
@Mapper
public interface UserRoleDao extends AbstractBaseMapper<UserRole> {
}

View File

@ -0,0 +1,14 @@
package com.zhangmeng.admin.manager.dao;
import com.zhangmeng.model.base.baseDao.AbstractBaseMapper;
import com.zhangmeng.model.entity.VerificationCode;
import org.apache.ibatis.annotations.Mapper;
/**
* @author zhangmeng
* @version 1.0
* @date 2021/4/1 21:34
*/
@Mapper
public interface VerificationCodeDao extends AbstractBaseMapper<VerificationCode> {
}

View File

@ -0,0 +1,19 @@
package com.zhangmeng.admin.manager.service;
import com.zhangmeng.model.base.baseService.BaseService;
import com.zhangmeng.model.dto.Menu;
import com.zhangmeng.model.entity.Permission;
import java.util.List;
/**
* @author zhangmeng
* @version 1.0
* @date 20211722:32:54
*/
public interface PermissionService extends BaseService<Permission> {
List<Permission> findByUserId(Long userId);
List<Menu> toUserMenus(List<Permission> permissions, Long parentId);
}

View File

@ -0,0 +1,11 @@
package com.zhangmeng.admin.manager.service;
import com.zhangmeng.model.base.baseService.BaseService;
import com.zhangmeng.model.entity.RolePermission;
import java.util.List;
public interface RolePermissionService extends BaseService<RolePermission> {
List<RolePermission> findByRoleId(Long roleId);
}

View File

@ -0,0 +1,19 @@
package com.zhangmeng.admin.manager.service;
import com.zhangmeng.model.base.baseService.BaseService;
import com.zhangmeng.model.entity.Permission;
import com.zhangmeng.model.entity.Role;
import java.util.List;
/**
* @author zhangmeng
* @version 1.0
* @date 20211722:32:54
*/
public interface RoleService extends BaseService<Role> {
List<Permission> getRolePermission(String roleId);
}

View File

@ -0,0 +1,21 @@
package com.zhangmeng.admin.manager.service;
import com.zhangmeng.model.base.baseService.BaseService;
import com.zhangmeng.model.entity.User;
import com.zhangmeng.model.vo.Result;
import java.util.Map;
/**
* @author zhangmeng
* @version 1.0
* @date 20211722:32:54
*/
public interface UserService extends BaseService<User> {
User loadUserByUsername(String username);
Result save_user(Map<String, Object> parms);
Result reg_save(Map<String, Object> parms);
}

View File

@ -0,0 +1,22 @@
package com.zhangmeng.admin.manager.service;
import com.wf.captcha.SpecCaptcha;
import com.zhangmeng.model.base.baseService.BaseService;
import com.zhangmeng.model.entity.VerificationCode;
/**
* @author zhangmeng
* @version 1.0
* @date 2021/4/1 21:32
*/
public interface VerificationCodeService extends BaseService<VerificationCode> {
public void mysql_save(SpecCaptcha specCaptcha);
public boolean mysql_verify(String code);
public void redis_save(SpecCaptcha specCaptcha);
public void cacheVerificationCode(String generatorVerificationCode);
}

View File

@ -0,0 +1,80 @@
package com.zhangmeng.admin.manager.service.impl;
import com.zhangmeng.admin.manager.dao.PermissionDao;
import com.zhangmeng.admin.manager.service.PermissionService;
import com.zhangmeng.model.base.baseService.impl.AbstractBaseServiceImpl;
import com.zhangmeng.model.dto.Menu;
import com.zhangmeng.model.entity.Permission;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhangmeng
* @version 1.0
* @date 20211722:32:54
*/
@Service
public class PermissionServiceImpl extends AbstractBaseServiceImpl<Permission> implements PermissionService {
@Autowired
private PermissionDao permissionDao;
@Override
public List<Permission> findByUserId(Long userId) {
return this.permissionDao.findByUserId(userId);
}
/**
* tree
*
* @param permissions
* @return list
*/
@Override
public List<Menu> toUserMenus(List<Permission> permissions, Long parentId) {
List<Menu> menuList = menuList(permissions);
return toUserMenu(menuList, 0L);
}
private List<Menu> toUserMenu(List<Menu> menuList, Long parentId) {
List<Menu> list = new ArrayList<>();
if (menuList.size() > 0) {
for (Menu menu : menuList) {
if (parentId.equals(menu.getParent_id())) {
menu.setChildren(toUserMenu(menuList, menu.getId()));
list.add(menu);
}
}
}
return list;
}
private List<Menu> menuList(List<Permission> permissions) {
List<Menu> menus = new ArrayList<>();
if (permissions.size() > 0) {
for (Permission permission : permissions) {
Menu menu = new Menu();
switch (permission.getType()){
case CATALOG:
menu.setType(0);
break;
case MENU:
menu.setType(1);
break;
case BUTTON:
menu.setType(2);
break;
}
BeanUtils.copyProperties(permission, menu);
menus.add(menu);
}
}
return menus;
}
}

View File

@ -0,0 +1,23 @@
package com.zhangmeng.admin.manager.service.impl;
import com.zhangmeng.admin.manager.service.RolePermissionService;
import com.zhangmeng.model.base.baseService.impl.AbstractBaseServiceImpl;
import com.zhangmeng.model.entity.RolePermission;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example;
import java.util.List;
@Service
public class RolePermissionServiceImpl extends AbstractBaseServiceImpl<RolePermission> implements RolePermissionService {
@Override
public List<RolePermission> findByRoleId(Long roleId) {
Condition condition = new Condition(RolePermission.class);
Example.Criteria criteria = condition.createCriteria();
criteria.andEqualTo("role_id",roleId);
return this.findByCondition(condition);
}
}

View File

@ -0,0 +1,58 @@
package com.zhangmeng.admin.manager.service.impl;
import com.zhangmeng.admin.service.PermissionService;
import com.zhangmeng.admin.service.RolePermissionService;
import com.zhangmeng.admin.service.RoleService;
import com.zhangmeng.common.base.baseService.impl.AbstractBaseServiceImpl;
import com.zhangmeng.common.utils.CommonUtil;
import com.zhangmeng.domain.admin.Permission;
import com.zhangmeng.domain.admin.Role;
import com.zhangmeng.domain.admin.RolePermission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhangmeng
* @version 1.0
* @date 20211722:32:54
*/
@Service
public class RoleServiceImpl extends AbstractBaseServiceImpl<Role> implements RoleService {
@Autowired
private RolePermissionService rolePermissionService;
@Autowired
private PermissionService permissionService;
@Override
public List<Permission> getRolePermission(String roleId) {
if (CommonUtil.isNotNull(roleId)) {
List<RolePermission> rolePermissionList = this.rolePermissionService.findByRoleId(Long.parseLong(roleId));
List<Long> pIds = p_ids(rolePermissionList);
List<Permission> permissionList = this.permissionService.findAll();
if (permissionList.size() > 0){
for (Permission permission : permissionList) {
if (pIds.contains(permission.getId())){
permission.setCheckArr("1");
}
}
}
return permissionList;
}
return null;
}
private List<Long> p_ids(List<RolePermission> rolePermissionList){
List<Long> list = new ArrayList<>();
if (rolePermissionList.size() > 0){
for (RolePermission rolePermission : rolePermissionList) {
list.add(rolePermission.getPermission_id());
}
}
return list;
}
}

View File

@ -0,0 +1,167 @@
package com.zhangmeng.admin.manager.service.impl;
import com.zhangmeng.admin.manager.service.RoleService;
import com.zhangmeng.admin.manager.service.UserService;
import com.zhangmeng.model.base.baseService.impl.AbstractBaseServiceImpl;
import com.zhangmeng.model.base.baseUtil.CommonUtil;
import com.zhangmeng.model.dto.QuerySingleParams;
import com.zhangmeng.model.entity.Role;
import com.zhangmeng.model.entity.User;
import com.zhangmeng.model.entity.UserRole;
import com.zhangmeng.model.vo.Result;
import com.zhangmeng.model.vo.StatusCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example;
import com.zhangmeng.admin.manager.dao.UserRoleDao;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author zhangmeng
* @version 1.0
* @date 20211722:32:54
*/
@Service
public class UserServiceImpl extends AbstractBaseServiceImpl<User> implements UserService {
@Autowired
private RoleService roleService;
@Autowired
private UserRoleDao userRoleDao;
@Override
public User loadUserByUsername(String username) {
Condition condition = new Condition(User.class);
Example.Criteria criteria = condition.createCriteria();
criteria.andEqualTo("username",username);
User user = null;
List<User> userList = this.findByCondition(condition);
if (userList.size() > 0){
user = userList.get(0);
}
return user;
}
@Override
public Result save_user(Map<String, Object> parms) {
boolean flag = false;
User user = null;
String userId = CommonUtil.map_get_value(parms, "userId");
if (userId == null || userId.equals("")) {
user = new User();
user.setAddTime(new Date());
user.setUpdateTime(new Date());
user.setDeleteStatus(false);
flag = true;
} else {
user = this.findById(Long.parseLong(userId));
}
String username = CommonUtil.map_get_value(parms, "username");
if (CommonUtil.isNotNull(username)) {
user.setUsername(username);
}
String name = CommonUtil.map_get_value(parms, "name");
if (CommonUtil.isNotNull(name)) {
user.setName(name);
}
String email = CommonUtil.map_get_value(parms, "email");
if (CommonUtil.isNotNull(email)) {
user.setEmail(email);
}
String password = CommonUtil.map_get_value(parms, "password");
if (CommonUtil.isNotNull(password)) {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
user.setPassword(bCryptPasswordEncoder.encode(password));
}
String phone = CommonUtil.map_get_value(parms, "phone");
if (CommonUtil.isNotNull(phone)) {
user.setTelephone(phone);
}
String sex = CommonUtil.map_get_value(parms, "sex");
User.Gender gender = null;
if (CommonUtil.isNotNull(sex)) {
if (sex.equals("0")) {
gender = User.Gender.male;
}
if (sex.equals("1")) {
gender = User.Gender.female;
}
}
user.setGender(gender);
String status = CommonUtil.map_get_value(parms, "status");
User.Status status1 = null;
if (CommonUtil.isNotNull(status)) {
switch (status) {
case "0":
status1 = User.Status.DISABLED;
break;
case "1":
status1 = User.Status.VALID;
break;
case "2":
status1 = User.Status.LOCKED;
break;
}
}
String message = null;
if (flag){
this.save(user);
String role_name = CommonUtil.map_get_value(parms, "role_name");
if (CommonUtil.isNotNull(role_name)) {
Role.Type type = CommonUtil.getEnum(role_name, Role.Type.class);
Role role = this.roleService.findBySingleParams(new QuerySingleParams("type",type, QuerySingleParams.Type.equal)).get(0);
UserRole userRole = new UserRole();
userRole.setAddTime(new Date());
userRole.setUpdateTime(new Date());
userRole.setDeleteStatus(false);
userRole.setRole_id(role.getId());
userRole.setUser_id(user.getId());
this.userRoleDao.insert(userRole);
}
user.setStatus(status1);
this.update(user);
message = "添加成功";
}else {
message = "修改成功";
this.update(user);
}
return new Result(true, StatusCode.OK,message);
}
@Override
public Result reg_save(Map<String, Object> parms) {
String username = CommonUtil.map_get_value(parms, "username");
String telephone = CommonUtil.map_get_value(parms, "telephone");
String password = CommonUtil.map_get_value(parms, "password");
Condition condition = new Condition(User.class);
Example.Criteria criteria = condition.createCriteria();
criteria.andLike("username", "%" + username + "%");
criteria.andEqualTo("telephone", telephone);
List<User> users = this.findByCondition(condition);
if (users.size() > 0) {
return new Result(false, StatusCode.ERROR, "该手机号已经注册");
} else {
User user = new User();
user.setAddTime(new Date());
user.setUpdateTime(new Date());
user.setDeleteStatus(false);
user.setStatus(User.Status.VALID);
user.setUsername(username);
user.setTelephone(telephone);
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
user.setPassword(bCryptPasswordEncoder.encode(password));
return new Result(true,StatusCode.OK,"注册成功");
}
}
}

View File

@ -0,0 +1,113 @@
package com.zhangmeng.admin.manager.service.impl;
import com.wf.captcha.SpecCaptcha;
import com.zhangmeng.admin.manager.config.verificationCode.VerificationCodeConfig;
import com.zhangmeng.admin.manager.service.VerificationCodeService;
import com.zhangmeng.admin.manager.utils.RedisTemplateUtil;
import com.zhangmeng.model.base.baseService.impl.AbstractBaseServiceImpl;
import com.zhangmeng.model.base.baseUtil.CommonUtil;
import com.zhangmeng.model.entity.VerificationCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Condition;
import tk.mybatis.mapper.entity.Example;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* @author zhangmeng
* @version 1.0
* @date 2021/4/1 21:33
*/
@Service
public class VerificationCodeServiceImpl extends AbstractBaseServiceImpl<VerificationCode> implements VerificationCodeService {
private final static String VERIFICATION_CODE_KEY = "VerificationCodeKey";
@Autowired
private VerificationCodeConfig verificationCodeConfig;
@Autowired
private RedisTemplate<String, List<String>> redisTemplate;
@Autowired
private RedisTemplateUtil redisTemplateUtil;
@Override
public void mysql_save(SpecCaptcha specCaptcha) {
String text = specCaptcha.text();
VerificationCode verificationCode = new VerificationCode();
verificationCode.setDeleteStatus(false);
verificationCode.setAddTime(new Date());
verificationCode.setUpdateTime(new Date());
verificationCode.setCode(text.toLowerCase());
verificationCode.setStatus(VerificationCode.Status.login);
verificationCode.setType(VerificationCode.Type.pc);
this.save(verificationCode);
}
/**
* mysql
*
* @param code
* @return boolean
*/
@Override
public boolean mysql_verify(String code) {
boolean flag = false;
long expirationTime = new Date().getTime() + this.verificationCodeConfig.getExpirationTime() * 1000; //毫秒
Date date = new Date(expirationTime);
Condition condition = new Condition(VerificationCode.class);
Example.Criteria criteria = condition.createCriteria();
criteria.andEqualTo("code", code);
criteria.andLessThan("addTime", CommonUtil.data_format(date, CommonUtil.Format.YYYY_MM_DD_HH_MM_SS));
List<VerificationCode> verificationCodes = this.findByCondition(condition);
if (verificationCodes.size() > 0) {
flag = true;
}
return flag;
}
@Override
public void redis_save(SpecCaptcha specCaptcha) {
String code = specCaptcha.text();
Map<String, Object> map = new HashMap<>();
map.put(String.valueOf(new Date().getTime()), code);
this.redisTemplateUtil.set_verification_code_map(map);
}
/**
*
*
* @param generatorVerificationCode
*/
public void cacheVerificationCode(String generatorVerificationCode) {
//转小写
generatorVerificationCode = generatorVerificationCode.toLowerCase();
VerificationCodeConfig.Type type = this.verificationCodeConfig.getType();
cacheVerificationCode2Redis(generatorVerificationCode);
}
/**
*
*
* @param generatorVerificationCode
*/
private void cacheVerificationCode2Redis(String generatorVerificationCode) {
//判断Redis 里面是否存在
List<String> verificationCodeList = this.redisTemplate.opsForValue().get("VERIFICATION_CODE_KEY");
if (verificationCodeList != null && verificationCodeList.size() > 0) {
if (!verificationCodeList.contains(generatorVerificationCode)) {
verificationCodeList.add(generatorVerificationCode);
}
} else {
verificationCodeList = new ArrayList<>();
verificationCodeList.add(generatorVerificationCode);
}
this.redisTemplate.boundValueOps(VERIFICATION_CODE_KEY).set(verificationCodeList, verificationCodeConfig.getExpirationTime(), TimeUnit.SECONDS);
}
}

View File

@ -0,0 +1,49 @@
package com.zhangmeng.admin.manager.utils;
import com.zhangmeng.admin.manager.config.verificationCode.VerificationCodeConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class RedisTemplateUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private VerificationCodeConfig verificationCodeConfig;
/**
*
* @param map
*/
public void set_verification_code_map(Map<String, Object> map) {
this.redisTemplate.opsForHash().putAll(this.verificationCodeConfig.getRedisKey(), map);
}
/**
*
* @return map
*/
public Map<String, Object> get_verification_code_map() {
HashOperations<String, String, Object> hashOperations = this.redisTemplate.opsForHash();
return hashOperations.entries(this.verificationCodeConfig.getRedisKey());
}
public boolean verification_code_isTrue(String code){
boolean flag = false;
Map<String, Object> verification_code_map = get_verification_code_map();
for (Map.Entry<String, Object> entry : verification_code_map.entrySet()) {
String value = String.valueOf(entry.getValue());
if (value.equalsIgnoreCase(code)){
flag = true;
break;
}
}
return flag;
}
}

View File

@ -0,0 +1,307 @@
package com.zhangmeng.admin.manager.utils;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
* @author zhangmeng
* @version 1.0
* @date 2021/1/21 21:31
*
*/
public class VerificationCodeUtil {
/**
*
*/
final private char[] code = {
'2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R',
'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
};
/**
*
*/
final private String[] fontNames = new String[]{
"黑体", "宋体", "Courier", "Arial",
"Verdana", "Times", "Tahoma", "Georgia"};
/**
*
*/
final private int[] fontStyles = new int[]{
Font.BOLD, Font.ITALIC | Font.BOLD
};
/**
*
* 4
*/
private int vcodeLen = 4;
/**
*
* 17
*/
private int fontsize = 21;
/**
*
*/
private int width = (fontsize + 1) * vcodeLen + 10;
/**
*
*/
private int height = fontsize + 12;
/**
* 线
* 3
*/
private int disturbline = 3;
public VerificationCodeUtil() {
}
/**
*
*
* @param vcodeLen
*/
public VerificationCodeUtil(int vcodeLen) {
this.vcodeLen = vcodeLen;
this.width = (fontsize + 1) * vcodeLen + 10;
}
public VerificationCodeUtil(int vcodeLen, int fontSize) {
this.vcodeLen = vcodeLen;
this.fontsize = fontSize;
this.width = (fontsize + 1) * vcodeLen + 10;
height = fontsize + 12;
}
public VerificationCodeUtil(Integer vcodeLen, Integer fontSize, Integer width, Integer height) {
this.vcodeLen = vcodeLen;
this.fontsize = fontSize;
this.width = width;
this.height = height;
}
/**
*
*
* @param vcode
* @param drawline 线
* @return
*/
public BufferedImage generatorVCodeImage(String vcode, boolean drawline) {
//创建验证码图片
BufferedImage vcodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = vcodeImage.getGraphics();
//填充背景色
g.setColor(new Color(246, 240, 250));
g.fillRect(0, 0, width, height);
if (drawline) {
drawDisturbLine(g);
}
//用于生成伪随机数
Random ran = new Random();
//在图片上画验证码
for (int i = 0; i < vcode.length(); i++) {
//设置字体
g.setFont(new Font(fontNames[ran.nextInt(fontNames.length)], fontStyles[ran.nextInt(fontStyles.length)], fontsize));
//随机生成颜色
g.setColor(getRandomColor());
//画验证码
g.drawString(vcode.charAt(i) + "", i * fontsize + 10, fontsize + 5);
}
//释放此图形的上下文以及它使用的所有系统资源
g.dispose();
return vcodeImage;
}
/**
*
*
* @param vcode String
* @param drawline 线
* @return BufferedImage
*/
public BufferedImage generatorRotateVCodeImage(String vcode, boolean drawline) {
//创建验证码图片
BufferedImage rotateVcodeImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = rotateVcodeImage.createGraphics();
//填充背景色
g2d.setColor(new Color(246, 240, 250));
g2d.fillRect(0, 0, width, height);
if (drawline) {
drawDisturbLine(g2d);
}
//在图片上画验证码
for (int i = 0; i < vcode.length(); i++) {
BufferedImage rotateImage = getRotateImage(vcode.charAt(i));
g2d.drawImage(rotateImage, null, (int) (this.height * 0.7) * i, 0);
}
g2d.dispose();
return rotateVcodeImage;
}
/**
*
*
* @return
*/
public String generatorVCode() {
int len = code.length;
Random ran = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < vcodeLen; i++) {
int index = ran.nextInt(len);
sb.append(code[index]);
}
return sb.toString();
}
/**
* 线
*
* @param g Graphics
*/
private void drawDisturbLine(Graphics g) {
Random ran = new Random();
for (int i = 0; i < disturbline; i++) {
int x1 = ran.nextInt(width);
int y1 = ran.nextInt(height);
int x2 = ran.nextInt(width);
int y2 = ran.nextInt(height);
g.setColor(getRandomColor());
//画干扰线
g.drawLine(x1, y1, x2, y2);
}
}
/**
*
*
* @param c
* @return BufferedImage
*/
private BufferedImage getRotateImage(char c) {
BufferedImage rotateImage = new BufferedImage(height, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = rotateImage.createGraphics();
//设置透明度为0
g2d.setColor(new Color(255, 255, 255, 0));
g2d.fillRect(0, 0, height, height);
Random ran = new Random();
g2d.setFont(new Font(fontNames[ran.nextInt(fontNames.length)], fontStyles[ran.nextInt(fontStyles.length)], fontsize));
g2d.setColor(getRandomColor());
double theta = getTheta();
//旋转图片
g2d.rotate(theta, height / 2, height / 2);
g2d.drawString(Character.toString(c), (height - fontsize) / 2, fontsize + 5);
g2d.dispose();
return rotateImage;
}
/**
* @return
*/
private Color getRandomColor() {
Random ran = new Random();
return new Color(ran.nextInt(220), ran.nextInt(220), ran.nextInt(220));
}
/**
* @return
*/
private double getTheta() {
return ((int) (Math.random() * 1000) % 2 == 0 ? -1 : 1) * Math.random();
}
/**
* @return
*/
public int getVcodeLen() {
return vcodeLen;
}
/**
*
*
* @param vcodeLen
*/
public void setVcodeLen(int vcodeLen) {
this.width = (fontsize + 3) * vcodeLen + 10;
this.vcodeLen = vcodeLen;
}
/**
* @return
*/
public int getFontsize() {
return fontsize;
}
/**
*
*
* @param fontsize
*/
public void setFontsize(int fontsize) {
this.width = (fontsize + 3) * vcodeLen + 10;
this.height = fontsize + 15;
this.fontsize = fontsize;
}
/**
* @return
*/
public int getWidth() {
return width;
}
/**
*
*
* @param width
*/
public void setWidth(int width) {
this.width = width;
}
/**
* @return
*/
public int getHeight() {
return height;
}
/**
*
*
* @param height
*/
public void setHeight(int height) {
this.height = height;
}
/**
* @return 线
*/
public int getDisturbline() {
return disturbline;
}
/**
* 线
*
* @param disturbline 线
*/
public void setDisturbline(Integer disturbline) {
this.disturbline = disturbline;
}
}

View File

@ -0,0 +1,43 @@
server:
port: 8763
spring:
application:
name: mystyle-cloud-admin-manager
datasource:
username: root
password: root
url: jdbc:mysql://127.0.0.1:3306/mystyle-blog?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
database: mysql
hibernate:
ddl-auto: update
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
show-sql: true
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5Dialect
zipkin:
sender:
type: web
base-url: http://localhost:9411/
service:
name: mystyle-cloud-file
sleuth:
sampler:
probability: 1
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
mybatis:
type-aliases-package: com.zhangmeng.model.entity
configuration:
mapUnderscoreToCamelCase: true
default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler
mapper:
style: normal
enum-as-simple-type: true
identity: MYSQL
check-example-entity-class: true

35
mystyle-cloud-api/pom.xml Normal file
View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>mystyle-cloud-parent</artifactId>
<groupId>com.zhangmeng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mystyle-cloud-api</artifactId>
<dependencies>
<dependency>
<groupId>com.zhangmeng</groupId>
<artifactId>mystyle-cloud-model</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,62 @@
package com.zhangmeng.api.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
/**
* @author zhangmeng
* @version 1.0
* @date 20217809:12:01
*/
@EnableSwagger2
@Configuration
public class SwaggerConfig {
@Bean
public Docket docket() {
return new Docket(DocumentationType.SWAGGER_2).groupName("swagger接口文档")
.apiInfo(new ApiInfoBuilder().title("swagger接口文档")
.contact(new Contact("转身的背影在心底里沉沦", "", "1334717033.com")).version("1.0").build())
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.select()
.apis(RequestHandlerSelectors.basePackage("com.zhangmeng"))
.paths(PathSelectors.any()).build();
}
private List<ApiKey> securitySchemes() {
List<ApiKey> apiKeyList= new ArrayList<>();
apiKeyList.add(new ApiKey("token", "token", "header"));
return apiKeyList;
}
private List<SecurityContext> securityContexts() {
List<SecurityContext> securityContexts=new ArrayList<>();
securityContexts.add(
SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("^(?!auth).*$"))
.build());
return securityContexts;
}
private List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences=new ArrayList<>();
securityReferences.add(new SecurityReference("token", authorizationScopes));
return securityReferences;
}
}

View File

@ -0,0 +1,35 @@
package com.zhangmeng.api.service.admin_manager;
import com.zhangmeng.model.entity.Permission;
import com.zhangmeng.model.vo.Result;
import com.zhangmeng.model.vo.ResultTree;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
import java.util.Map;
@Api(tags = "权限列表")
public interface PermissionControllerApi {
@ApiOperation("权限列表")
public Result list(Integer pageNum, Integer pageSize, String title);
@ApiOperation("查询上级")
public ResultTree selectParent(String parentId);
@ApiOperation("保存权限")
public Result save(@RequestParam @RequestBody Map<String, Object> map);
@ApiOperation("删除权限")
public Result delete(String permissionId);
@ApiOperation("批量删除权限")
public Result batchRemove(String ids);
@ApiOperation("根据userId查询权限")
List<Permission> findByUserId(Long id);
}

View File

@ -0,0 +1,38 @@
package com.zhangmeng.api.service.admin_manager;
import com.zhangmeng.model.entity.User;
import com.zhangmeng.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
@Api(tags = "用户管理")
public interface UserControllerApi {
@ApiOperation("用户保存")
public Result save(@RequestParam @RequestBody Map<String, Object> parms);
@ApiOperation("用户删除")
public Result delete(String userId);
@ApiOperation("用户列表")
public Result list(Integer pageNum, Integer pageSize, String username, String telephone);
@ApiOperation("用户批量删除")
public Result batchRemove(String ids);
@ApiOperation("注册保存")
public Result reg_save(@RequestParam @RequestBody Map<String, Object> parms);
@ApiOperation("获取当前用户")
public Result current();
@ApiOperation("个人资料修改")
public Result personUpdate(@RequestParam @RequestBody Map<String, Object> map);
@ApiOperation("根据用户名称查询用户")
public User findByUserName(String username);
}

View File

@ -0,0 +1,62 @@
package com.zhangmeng.api.service.admin_manager;
import com.zhangmeng.model.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Api(tags = "验证码管理")
public interface VerificationCodeControllerApi {
/**
*
*
* @param request
* @param response
*/
@ApiOperation("验证码生成")
public String generate(HttpServletRequest request, HttpServletResponse response);
/**
*
*
* @param request
* @param captcha
* @return
*/
@ApiOperation("异步验证")
public Result verify(HttpServletRequest request, String captcha);
/**
*
*
* @param httpServletRequest imageIo
* @param httpServletResponse imageIo
*/
@ApiOperation("生成验证码V1")
public void generateVerificationCodeV1(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
@RequestParam(name = "vl", defaultValue = "4") Integer vcodeLength,//vcodeLength,验证码长度
@RequestParam(name = "fs", defaultValue = "21") Integer fontSize,//fontSize,验证码字体大小
@RequestParam(name = "w", defaultValue = "98") Integer width,//width,图片宽度
@RequestParam(name = "h", defaultValue = "33") Integer height//height,图片高度
);
/**
*
*/
@ApiOperation("生成验证码V2")
public String generateVerificationCodeV2();
/**
*
*/
@ApiOperation("生成验证码V2")
public Result generateVerificationCodeV3(String telephone);
}

View File

@ -32,7 +32,7 @@ spring:
discovery:
server-addr: 127.0.0.1:8848
mybatis:
type-aliases-package: com.zhangmeng.domain.blog
type-aliases-package: com.zhangmeng.model.entity
configuration:
mapUnderscoreToCamelCase: true
default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler

View File

@ -68,5 +68,16 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--验证码-->
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,193 @@
package com.zhangmeng.model.base.baseUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
public class CommonUtil {
public static boolean isNotNull(Object object) {
return object != null && !"".equals(object);
}
@SuppressWarnings("unchecked")
public static <T, K, V> T map_get_value(Map<K, V> map, T t) {
return (T) map.get(t);
}
public static boolean isNumeric_JDK(String str) {
for (int i = 0; i < str.length(); i++) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
public static boolean isNumeric_ASCII(String str) {
for (int i = str.length(); --i >= 0; ) {
int chr = str.charAt(i);
if (chr < 48 || chr > 57)
return false;
}
return true;
}
public static boolean isNumeric_exception(String str) {
try {
Integer.parseInt(str);
return true;
} catch (NumberFormatException e) {
return false;
}
}
public static Long parseLong(String number) {
if (isNumeric_ASCII(number)) {
return Long.parseLong(number);
}
return null;
}
/**
*
*/
public static String firstLastComma(String string) {
StringBuilder stringBuilder = new StringBuilder();
String[] split = string.trim().split(",");
if (split.length > 0) {
for (int i = 0; i < split.length; i++) {
if (i == split.length - 1) {
stringBuilder.append(split[i]);
} else {
if (!split[i].equals("")) {
stringBuilder.append(split[i]).append(",");
}
}
}
}
return stringBuilder.toString();
}
private static final String TOKEN_KEY = "token";
private static String YYYY = "yyyy";
private static String YYYY_MM = "yyyy-MM";
private static String YYYY_MM_DD = "yyyy-MM-dd";
private static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
private static Integer pageNum = 1;
private static Integer pageSize = 10;
private static String[] parsePatterns = {
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
public enum Format {
YYYY("yyyy"),
YYYY_MM("yyyy-MM"),
YYYY_MM_DD("yyyy-MM-dd"),
YYYY_MM_DD_HH_MM_SS("yyyy-MM-dd HH:mm:ss");
Format(String desc) {
this.desc = desc;
}
private String desc;
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
/**
*
*
* @param date
* @return String
*/
public static String data_format(Date date, Format format) {
String format_string = null;
switch (format) {
case YYYY:
format_string = YYYY;
break;
case YYYY_MM:
format_string = YYYY_MM;
break;
case YYYY_MM_DD:
format_string = YYYY_MM_DD;
break;
case YYYY_MM_DD_HH_MM_SS:
format_string = YYYY_MM_DD_HH_MM_SS;
break;
}
return new SimpleDateFormat(format_string).format(date);
}
/**
*
*
* @param date
* @return String
*/
public static Date data_format(String date, Format format) {
String format_string = null;
switch (format) {
case YYYY:
format_string = YYYY;
break;
case YYYY_MM:
format_string = YYYY_MM;
break;
case YYYY_MM_DD:
format_string = YYYY_MM_DD;
break;
case YYYY_MM_DD_HH_MM_SS:
format_string = YYYY_MM_DD_HH_MM_SS;
break;
}
SimpleDateFormat sdf = new SimpleDateFormat(format_string);
try {
return sdf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
public static <T extends Enum<T>> T getEnum(String str, Class<T> enumClass) {
if (isNotNull(str)) {
return Enum.valueOf(enumClass, str);
}
return null;
}
/**
*
*
* @param size
* @return String
*/
public static String mobileVerifierCode(int size) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 1; i <= size; i++) {
//产生0~9的随机数
int d = (int) (Math.random() * 9 + 1);
stringBuilder.append(d);
}
return stringBuilder.toString();
}
}

View File

@ -0,0 +1,32 @@
package com.zhangmeng.model.bean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
/**
* @author zhangmeng
* @version 1.0
* @date 2020111614:33:38
*/
@Configuration
public class RedisConfig {
@SuppressWarnings({"unchecked", "rawtypes"})
@Bean("redisTemplate")
public RedisTemplate redisTemplate(@Lazy RedisConnectionFactory connectionFactory) {
RedisTemplate redis = new RedisTemplate();
GenericToStringSerializer<String> keySerializer = new GenericToStringSerializer<String>(String.class);
redis.setKeySerializer(keySerializer);
redis.setHashKeySerializer(keySerializer);
GenericJackson2JsonRedisSerializer valueSerializer = new GenericJackson2JsonRedisSerializer();
redis.setValueSerializer(valueSerializer);
redis.setHashValueSerializer(valueSerializer);
redis.setConnectionFactory(connectionFactory);
return redis;
}
}

View File

@ -0,0 +1,31 @@
package com.zhangmeng.model.dto;
import com.zhangmeng.model.base.baseEntity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class Menu extends BaseEntity<Long> implements Serializable {
private String title;
private Integer type;
private String href;
private String openType;
private Long parent_id;
private String icon;
private List<Menu> children = new ArrayList<>();
}

View File

@ -0,0 +1,74 @@
package com.zhangmeng.model.dto;
import com.wf.captcha.SpecCaptcha;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
@EqualsAndHashCode(callSuper = true)
@Data
public class MySpecCaptcha extends SpecCaptcha {
private String code;
public MySpecCaptcha(String code) {
this.code = code;
}
@Override
public boolean out(OutputStream out) {
return graphicsImage(code.toCharArray(), out);
}
/**
*
*
* @param strs
* @param out
* @return boolean
*/
private boolean graphicsImage(char[] strs, OutputStream out) {
try {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = (Graphics2D) bi.getGraphics();
// 填充背景
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, width, height);
// 抗锯齿
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 画干扰圆
drawOval(2, g2d);
// 画干扰线
g2d.setStroke(new BasicStroke(2f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
drawBesselLine(1, g2d);
// 画字符串
g2d.setFont(getFont());
FontMetrics fontMetrics = g2d.getFontMetrics();
int fW = width / strs.length; // 每一个字符所占的宽度
int fSp = (fW - (int) fontMetrics.getStringBounds("W", g2d).getWidth()) / 2; // 字符的左右边距
for (int i = 0; i < strs.length; i++) {
g2d.setColor(color());
int fY = height - ((height - (int) fontMetrics.getStringBounds(String.valueOf(strs[i]), g2d).getHeight()) >> 1); // 文字的纵坐标
g2d.drawString(String.valueOf(strs[i]), i * fW + fSp + 3, fY - 3);
}
g2d.dispose();
ImageIO.write(bi, "png", out);
out.flush();
return true;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
}

34
pom.xml
View File

@ -25,6 +25,9 @@
<module>mystyle-cloud-file</module>
<module>mystyle-cloud-gateway</module>
<module>mystyle-cloud-model</module>
<module>mystyle-cloud-admin-manager</module>
<module>mystyle-cloud-api</module>
</modules>
<properties>
@ -36,6 +39,9 @@
<pagehelper.version>1.3.0</pagehelper.version>
<fastdfs-client-java.version>1.27.0.0</fastdfs-client-java.version>
<jackson.version>2.9.7</jackson.version>
<hutool.version>5.5.7</hutool.version>
<captcha.version>1.6.2</captcha.version>
<swagger.version>2.8.0</swagger.version>
</properties>
<dependencyManagement>
@ -87,6 +93,34 @@
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!--验证码-->
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>${captcha.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>