From 448611c4a544f7888532c6889d965736509216fb Mon Sep 17 00:00:00 2001 From: TinyAnts Date: Fri, 25 Mar 2022 14:33:56 +0800 Subject: [PATCH] init --- like-admin/pom.xml | 55 +++ .../com/hxkj/admin/LikeAdminApplication.java | 20 + .../hxkj/admin/config/MybatisPlusConfig.java | 21 + .../com/hxkj/admin/config/RealmConfig.java | 51 +++ .../com/hxkj/admin/config/ShiroConfig.java | 59 +++ .../admin/controller/IndexController.java | 52 +++ .../controller/system/SysAdminController.java | 85 ++++ .../controller/system/SysMenuController.java | 81 ++++ .../controller/system/SysRoleController.java | 51 +++ .../hxkj/admin/service/ISysAdminService.java | 54 +++ .../hxkj/admin/service/ISysMenuService.java | 20 + .../hxkj/admin/service/ISysRoleService.java | 62 +++ .../service/impl/ISysAdminServiceImpl.java | 195 +++++++++ .../service/impl/ISysMenuServiceImpl.java | 139 ++++++ .../service/impl/ISysRoleServiceImpl.java | 179 ++++++++ .../com/hxkj/admin/validate/PageParam.java | 23 + .../hxkj/admin/validate/SysAdminParam.java | 47 ++ .../com/hxkj/admin/validate/SysMenuParam.java | 50 +++ .../com/hxkj/admin/validate/SysRoleParam.java | 37 ++ .../hxkj/admin/vo/system/SysAdminListVo.java | 24 + .../hxkj/admin/vo/system/SysMenuListVo.java | 19 + .../hxkj/admin/vo/system/SysRoleListVo.java | 22 + like-admin/src/main/resources/application.yml | 41 ++ like-common/pom.xml | 72 +++ .../java/com/hxkj/common/core/AjaxResult.java | 165 +++++++ .../java/com/hxkj/common/core/PageResult.java | 69 +++ .../hxkj/common/entity/system/SysAdmin.java | 34 ++ .../hxkj/common/entity/system/SysMenu.java | 31 ++ .../hxkj/common/entity/system/SysRole.java | 29 ++ .../common/entity/system/SysRoleMenu.java | 22 + .../java/com/hxkj/common/enums/HttpEnum.java | 48 ++ .../common/exception/GlobalException.java | 125 ++++++ .../common/mapper/system/SysAdminMapper.java | 14 + .../common/mapper/system/SysMenuMapper.java | 12 + .../common/mapper/system/SysRoleMapper.java | 12 + .../java/com/hxkj/common/utils/ArrayUtil.java | 54 +++ .../com/hxkj/common/utils/ConfigUtil.java | 4 + .../java/com/hxkj/common/utils/HttpUtil.java | 115 +++++ .../java/com/hxkj/common/utils/RedisUtil.java | 4 + .../com/hxkj/common/utils/SpringUtil.java | 4 + .../com/hxkj/common/utils/ThrowableUtil.java | 26 ++ .../java/com/hxkj/common/utils/TimeUtil.java | 412 ++++++++++++++++++ .../java/com/hxkj/common/utils/ToolsUtil.java | 79 ++++ .../java/com/hxkj/common/utils/UrlUtil.java | 39 ++ .../common/validator/IDMustValidator.java | 23 + .../validator/IntegerContainsValidator.java | 35 ++ .../validator/StringContainsValidator.java | 32 ++ .../common/validator/annotation/IDMust.java | 21 + .../validator/annotation/IntegerContains.java | 23 + .../validator/annotation/StringContains.java | 23 + like-front/pom.xml | 19 + pom.xml | 111 +++++ 52 files changed, 3044 insertions(+) create mode 100644 like-admin/pom.xml create mode 100644 like-admin/src/main/java/com/hxkj/admin/LikeAdminApplication.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/config/MybatisPlusConfig.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/config/RealmConfig.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/config/ShiroConfig.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/controller/IndexController.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/controller/system/SysAdminController.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/controller/system/SysMenuController.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/controller/system/SysRoleController.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/service/ISysAdminService.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/service/ISysMenuService.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/service/ISysRoleService.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/service/impl/ISysAdminServiceImpl.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/service/impl/ISysMenuServiceImpl.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/service/impl/ISysRoleServiceImpl.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/validate/PageParam.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/validate/SysAdminParam.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/validate/SysMenuParam.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/validate/SysRoleParam.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/vo/system/SysAdminListVo.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/vo/system/SysMenuListVo.java create mode 100644 like-admin/src/main/java/com/hxkj/admin/vo/system/SysRoleListVo.java create mode 100644 like-admin/src/main/resources/application.yml create mode 100644 like-common/pom.xml create mode 100644 like-common/src/main/java/com/hxkj/common/core/AjaxResult.java create mode 100644 like-common/src/main/java/com/hxkj/common/core/PageResult.java create mode 100644 like-common/src/main/java/com/hxkj/common/entity/system/SysAdmin.java create mode 100644 like-common/src/main/java/com/hxkj/common/entity/system/SysMenu.java create mode 100644 like-common/src/main/java/com/hxkj/common/entity/system/SysRole.java create mode 100644 like-common/src/main/java/com/hxkj/common/entity/system/SysRoleMenu.java create mode 100644 like-common/src/main/java/com/hxkj/common/enums/HttpEnum.java create mode 100644 like-common/src/main/java/com/hxkj/common/exception/GlobalException.java create mode 100644 like-common/src/main/java/com/hxkj/common/mapper/system/SysAdminMapper.java create mode 100644 like-common/src/main/java/com/hxkj/common/mapper/system/SysMenuMapper.java create mode 100644 like-common/src/main/java/com/hxkj/common/mapper/system/SysRoleMapper.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/ArrayUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/ConfigUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/HttpUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/RedisUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/SpringUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/ThrowableUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/TimeUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/ToolsUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/utils/UrlUtil.java create mode 100644 like-common/src/main/java/com/hxkj/common/validator/IDMustValidator.java create mode 100644 like-common/src/main/java/com/hxkj/common/validator/IntegerContainsValidator.java create mode 100644 like-common/src/main/java/com/hxkj/common/validator/StringContainsValidator.java create mode 100644 like-common/src/main/java/com/hxkj/common/validator/annotation/IDMust.java create mode 100644 like-common/src/main/java/com/hxkj/common/validator/annotation/IntegerContains.java create mode 100644 like-common/src/main/java/com/hxkj/common/validator/annotation/StringContains.java create mode 100644 like-front/pom.xml create mode 100644 pom.xml diff --git a/like-admin/pom.xml b/like-admin/pom.xml new file mode 100644 index 00000000..5c1eb930 --- /dev/null +++ b/like-admin/pom.xml @@ -0,0 +1,55 @@ + + + + + + like-framework + org.hxkj + 1.0-SNAPSHOT + + + + 4.0.0 + like-admin + jar + + + + 1.0-SNAPSHOT + + + + + + + org.hxkj + like-common + ${like-common} + + + + org.apache.shiro + shiro-spring + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + \ No newline at end of file diff --git a/like-admin/src/main/java/com/hxkj/admin/LikeAdminApplication.java b/like-admin/src/main/java/com/hxkj/admin/LikeAdminApplication.java new file mode 100644 index 00000000..406dc09a --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/LikeAdminApplication.java @@ -0,0 +1,20 @@ +package com.hxkj.admin; + +import com.github.yulichang.injector.MPJSqlInjector; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackages = {"com.hxkj"}) +@MapperScan(basePackages = {"com.hxkj.*.mapper"}) +@SpringBootApplication(exclude = {MPJSqlInjector.class}) +public class LikeAdminApplication { + + public static void main(String[] args) { + SpringApplication.run(LikeAdminApplication.class, args); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/config/MybatisPlusConfig.java b/like-admin/src/main/java/com/hxkj/admin/config/MybatisPlusConfig.java new file mode 100644 index 00000000..0728140f --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/config/MybatisPlusConfig.java @@ -0,0 +1,21 @@ +package com.hxkj.admin.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class MybatisPlusConfig { + + /** + * 分页插件集成 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return interceptor; + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/config/RealmConfig.java b/like-admin/src/main/java/com/hxkj/admin/config/RealmConfig.java new file mode 100644 index 00000000..b9921c11 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/config/RealmConfig.java @@ -0,0 +1,51 @@ +package com.hxkj.admin.config; + +import org.apache.catalina.User; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.Subject; + +public class RealmConfig extends AuthorizingRealm { + + /** + * 授权 + * @param principals 主要 + * @return AuthorizationInfo + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + info.addStringPermission("user:add"); + + // 拿到当前登录对象 + Subject subject = SecurityUtils.getSubject(); + User currentUser = (User) subject.getPrincipal(); + //info.addStringPermission(currentUser.getPerms()); + + return info; + } + + /** + * 认证 + * @param token 令牌 + * @return AuthenticationInfo + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { + String name = "root"; + String password = "123456"; + + UsernamePasswordToken userToken = (UsernamePasswordToken) token; + if (!userToken.getUsername().equals(name)) { + return null; + } + + // 密码认证 + return new SimpleAuthenticationInfo("", password, ""); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/config/ShiroConfig.java b/like-admin/src/main/java/com/hxkj/admin/config/ShiroConfig.java new file mode 100644 index 00000000..701514ce --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/config/ShiroConfig.java @@ -0,0 +1,59 @@ +package com.hxkj.admin.config; + +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.LinkedHashMap; +import java.util.Map; + +//@Configuration +public class ShiroConfig { + + /** + * 拦截过滤器配置 + * @return ShiroFilterFactoryBean + */ + @Bean + public ShiroFilterFactoryBean getShiroFactoryFilterBean(DefaultWebSecurityManager defaultWebSecurityManager) { + // 设置安全管理器 + ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean(); + bean.setSecurityManager(defaultWebSecurityManager); + + /* + * 设置内置过滤器 + * anon: 无需认证就可以访问 + * authc: 必须认证了才能访问 + * perms: 拥有某个资源权限才能访问 + * role: 拥有某个角色权限才能访问 + */ +// Map filterMap = new LinkedHashMap<>(); +// filterMap.put("/user/add", "authc"); +// filterMap.put("/user/update", "authc"); +// bean.setFilterChainDefinitionMap(filterMap); + + // 未登录 +// bean.setLoginUrl("/toLogin"); + + // 未授权 + // bean.setUnauthorizedUrl("/auth"); + + return bean; + } + + // 安全管理器 + @Bean + public DefaultWebSecurityManager getDefaultWebSecurityManager(RealmConfig realmConfig) { + DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(); + defaultWebSecurityManager.setRealm(realmConfig); + return defaultWebSecurityManager; + } + + // 自定realm + @Bean + public RealmConfig userRealm() { + return new RealmConfig(); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/controller/IndexController.java b/like-admin/src/main/java/com/hxkj/admin/controller/IndexController.java new file mode 100644 index 00000000..21bb201d --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/controller/IndexController.java @@ -0,0 +1,52 @@ +package com.hxkj.admin.controller; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import com.hxkj.common.entity.system.SysAdmin; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.subject.Subject; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class IndexController { + + + @GetMapping("/user/add") + public void index() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.apply("id = 1"); + + + } + + @GetMapping("/user/update") + public void ee() { + System.out.println("小红"); + } + + @RequestMapping("/login") + public String login(String username, String password) { + System.out.println(username); + // 获取当前用户 + Subject subject = SecurityUtils.getSubject(); + + // 用户登录数据 + UsernamePasswordToken token = new UsernamePasswordToken(username, password); + + // 执行登录方法 + try { + subject.login(token); + return "登录成功"; + } catch (UnknownAccountException e) { + return "用户名错误"; + } catch (IncorrectCredentialsException e) { + return "密码错误"; + } + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/controller/system/SysAdminController.java b/like-admin/src/main/java/com/hxkj/admin/controller/system/SysAdminController.java new file mode 100644 index 00000000..1695c128 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/controller/system/SysAdminController.java @@ -0,0 +1,85 @@ +package com.hxkj.admin.controller.system; + +import com.hxkj.admin.service.ISysAdminService; +import com.hxkj.admin.validate.PageParam; +import com.hxkj.admin.validate.SysAdminParam; +import com.hxkj.admin.vo.system.SysAdminListVo; +import com.hxkj.common.core.AjaxResult; +import com.hxkj.common.core.PageResult; +import com.hxkj.common.entity.system.SysAdmin; +import com.hxkj.common.validator.annotation.IDMust; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/api/system/admin") +public class SysAdminController { + + @Resource + ISysAdminService iSysAdminService; + + /** + * 管理员列表 + * + * @author fzr + * @return Object + */ + @GetMapping("/lists") + public Object lists(@Validated PageParam pageParam) { + PageResult list = iSysAdminService.lists(pageParam); + return AjaxResult.success(list); + } + + /** + * 管理员详情 + * + * @param id 主键ID + * @return Object + */ + @GetMapping("/detail") + public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) { + SysAdmin sysAdmin = iSysAdminService.detail(id); + return AjaxResult.success(sysAdmin); + } + + /** + * 新增管理员 + * + * @author fzr + * @param sysAdminParam 参数 + * @return Object + */ + @PostMapping("/add") + public Object add(@Validated(value = SysAdminParam.create.class) @RequestBody SysAdminParam sysAdminParam) { + iSysAdminService.add(sysAdminParam); + return AjaxResult.success(); + } + + /** + * 编辑管理员 + * + * @author fzr + * @param sysAdminParam 参数 + * @return Object + */ + @PostMapping("/edit") + public Object edit(@Validated(value = SysAdminParam.update.class) @RequestBody SysAdminParam sysAdminParam) { + iSysAdminService.edit(sysAdminParam); + return AjaxResult.success(); + } + + /** + * 删除管理员 + * + * @author fzr + * @return Object + */ + @PostMapping("/del") + public Object del(@Validated(value = SysAdminParam.delete.class) @RequestBody SysAdminParam sysAdminParam) { + iSysAdminService.del(sysAdminParam.getId()); + return AjaxResult.success(); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/controller/system/SysMenuController.java b/like-admin/src/main/java/com/hxkj/admin/controller/system/SysMenuController.java new file mode 100644 index 00000000..075c255d --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/controller/system/SysMenuController.java @@ -0,0 +1,81 @@ +package com.hxkj.admin.controller.system; + +import com.alibaba.fastjson.JSONArray; +import com.hxkj.admin.service.ISysMenuService; +import com.hxkj.admin.validate.SysMenuParam; +import com.hxkj.common.core.AjaxResult; +import com.hxkj.common.entity.system.SysMenu; +import com.hxkj.common.validator.annotation.IDMust; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/api/system/menu") +public class SysMenuController { + + @Resource + ISysMenuService iSysMenuService; + + /** + * 获取菜单列表 + * + * @author fzr + * @return Object + */ + @GetMapping("/lists") + public Object lists() { + JSONArray lists = iSysMenuService.lists(); + return AjaxResult.success(lists); + } + + /** + * 获取菜单详情 + * + * @author fzr + * @return Object + */ + @GetMapping("/detail") + public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) { + SysMenu sysMenu = iSysMenuService.detail(id); + return AjaxResult.success(sysMenu); + } + + /** + * 新增菜单 + * + * @author fzr + * @return Object + */ + @PostMapping("/add") + public Object add(@Validated(value = SysMenuParam.create.class) @RequestBody SysMenuParam sysMenuParam) { + iSysMenuService.add(sysMenuParam); + return AjaxResult.success(); + } + + /** + * 更新菜单 + * + * @author fzr + * @return Object + */ + @PostMapping("/edit") + public Object edit(@Validated(value = SysMenuParam.update.class) @RequestBody SysMenuParam sysMenuParam) { + iSysMenuService.edit(sysMenuParam); + return AjaxResult.success(); + } + + /** + * 删除菜单 + * + * @author fzr + * @return Object + */ + @PostMapping("/del") + public Object del(@Validated(value = SysMenuParam.delete.class) @RequestBody SysMenuParam sysMenuParam) { + iSysMenuService.del(sysMenuParam.getId()); + return AjaxResult.success(); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/controller/system/SysRoleController.java b/like-admin/src/main/java/com/hxkj/admin/controller/system/SysRoleController.java new file mode 100644 index 00000000..a50f46d9 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/controller/system/SysRoleController.java @@ -0,0 +1,51 @@ +package com.hxkj.admin.controller.system; + +import com.hxkj.admin.service.ISysRoleService; +import com.hxkj.admin.validate.PageParam; +import com.hxkj.admin.validate.SysAdminParam; +import com.hxkj.admin.validate.SysRoleParam; +import com.hxkj.admin.vo.system.SysRoleListVo; +import com.hxkj.common.core.AjaxResult; +import com.hxkj.common.core.PageResult; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/api/system/role") +public class SysRoleController { + + @Resource + ISysRoleService iSysRoleService; + + @GetMapping("/lists") + public Object lists(@Validated PageParam pageParam) { + PageResult lists = iSysRoleService.lists(pageParam); + return AjaxResult.success(lists); + } + + @GetMapping("/detail") + public Object detail() { + return null; + } + + @PostMapping("/add") + public Object add(@Validated(value = SysRoleParam.create.class) @RequestBody SysRoleParam sysRoleParam) { + iSysRoleService.add(sysRoleParam); + return AjaxResult.success(); + } + + @PostMapping("/edit") + public Object edit(@Validated(value = SysRoleParam.create.class) @RequestBody SysRoleParam sysRoleParam) { + iSysRoleService.edit(sysRoleParam); + return AjaxResult.success(); + } + + @PostMapping("/del") + public Object del(@Validated(value = SysRoleParam.create.class) @RequestBody SysRoleParam sysRoleParam) { + iSysRoleService.del(sysRoleParam.getId()); + return AjaxResult.success(); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/service/ISysAdminService.java b/like-admin/src/main/java/com/hxkj/admin/service/ISysAdminService.java new file mode 100644 index 00000000..3bbfcc16 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/service/ISysAdminService.java @@ -0,0 +1,54 @@ +package com.hxkj.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.hxkj.admin.validate.PageParam; +import com.hxkj.admin.validate.SysAdminParam; +import com.hxkj.admin.vo.system.SysAdminListVo; +import com.hxkj.common.core.PageResult; +import com.hxkj.common.entity.system.SysAdmin; + +public interface ISysAdminService extends IService { + + /** + * 获取管理员列表 + * + * @author fzr + * @param pageParam 分页参数 + * @return PageResult + */ + PageResult lists(PageParam pageParam); + + /** + * 获取管理员详情 + * + * @author fzr + * @param id 主键参数 + * @return SysAdmin + */ + SysAdmin detail(Integer id); + + /** + * 新增管理员 + * + * @author fzr + * @param sysAdminParam 参数 + */ + void add(SysAdminParam sysAdminParam); + + /** + * 编辑管理员 + * + * @author fzr + * @param sysAdminParam 参数 + */ + void edit(SysAdminParam sysAdminParam); + + /** + * 删除管理员 + * + * @author fzr + * @param id 主键参数 + */ + void del(Integer id); + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/service/ISysMenuService.java b/like-admin/src/main/java/com/hxkj/admin/service/ISysMenuService.java new file mode 100644 index 00000000..a5a1541c --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/service/ISysMenuService.java @@ -0,0 +1,20 @@ +package com.hxkj.admin.service; + +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.extension.service.IService; +import com.hxkj.admin.validate.SysMenuParam; +import com.hxkj.common.entity.system.SysMenu; + +public interface ISysMenuService extends IService { + + JSONArray lists(); + + SysMenu detail(Integer id); + + void add(SysMenuParam sysMenuParam); + + void edit(SysMenuParam sysMenuParam); + + void del(Integer id); + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleService.java b/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleService.java new file mode 100644 index 00000000..6b29148d --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/service/ISysRoleService.java @@ -0,0 +1,62 @@ +package com.hxkj.admin.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.hxkj.admin.validate.PageParam; +import com.hxkj.admin.validate.SysRoleParam; +import com.hxkj.admin.vo.system.SysRoleListVo; +import com.hxkj.common.core.PageResult; +import com.hxkj.common.entity.system.SysRole; +import org.springframework.validation.annotation.Validated; + +public interface ISysRoleService extends IService { + + /** + * 根据id获取角色名称 + * @param id 角色ID + * @return String + */ + String getRoleNameById(Integer id); + + /** + * 角色列表 + * + * @author fzr + * @param pageParam 参数 + * @return PageResult + */ + PageResult lists(@Validated PageParam pageParam); + + /** + * 角色详情 + * + * @author fzr + * @param id 主键参数 + * @return SysRole + */ + SysRole detail(Integer id); + + /** + * 新增角色 + * + * @author fzr + * @param sysRoleParam 参数 + */ + void add(SysRoleParam sysRoleParam); + + /** + * 更新角色 + * + * @author fzr + * @param sysRoleParam 参数 + */ + void edit(SysRoleParam sysRoleParam); + + /** + * 删除角色 + * + * @author fzr + * @param id 主键参数 + */ + void del(Integer id); + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysAdminServiceImpl.java b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysAdminServiceImpl.java new file mode 100644 index 00000000..2a90b80c --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysAdminServiceImpl.java @@ -0,0 +1,195 @@ +package com.hxkj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.hxkj.admin.service.ISysAdminService; +import com.hxkj.admin.service.ISysRoleService; +import com.hxkj.admin.validate.PageParam; +import com.hxkj.admin.validate.SysAdminParam; +import com.hxkj.admin.vo.system.SysAdminListVo; +import com.hxkj.common.core.PageResult; +import com.hxkj.common.entity.system.SysAdmin; +import com.hxkj.common.mapper.system.SysAdminMapper; +import com.hxkj.common.utils.TimeUtil; +import com.hxkj.common.utils.ToolsUtil; +import com.hxkj.common.utils.UrlUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +@Service +public class ISysAdminServiceImpl extends MPJBaseServiceImpl implements ISysAdminService { + + @Resource + ISysRoleService iSysRoleService; + + /** + * 获取管理员列表 + * + * @author fzr + * @param pageParam 分页参数 + * @return PageResult + */ + @Override + public PageResult lists(PageParam pageParam) { + Integer page = pageParam.getPageNo(); + Integer limit = pageParam.getPageSize(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(SysAdmin.class, info-> + !info.getColumn().equals("salt") && + !info.getColumn().equals("password") && + !info.getColumn().equals("is_delete") && + !info.getColumn().equals("delete_time")) + .eq("is_delete", 0) + .orderByDesc("sort"); + + IPage iPage = this.page(new Page<>(page, limit), queryWrapper); + + List adminVoArrayList = new ArrayList<>(); + for (SysAdmin sysAdmin : iPage.getRecords()) { + SysAdminListVo vo = new SysAdminListVo(); + BeanUtils.copyProperties(sysAdmin, vo); + + vo.setRole(iSysRoleService.getRoleNameById(sysAdmin.getRole())); + vo.setCreateTime(TimeUtil.timeToDate(sysAdmin.getCreateTime())); + vo.setUpdateTime(TimeUtil.timeToDate(sysAdmin.getUpdateTime())); + vo.setLastLoginTime(TimeUtil.timeToDate(sysAdmin.getLastLoginTime())); + adminVoArrayList.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), adminVoArrayList); + } + + /** + * 获取管理员详细 + * + * @author fzr + * @param id 主键 + * @return SysAdmin + */ + @Override + public SysAdmin detail(Integer id) { + SysAdmin sysAdmin = this.getOne(new QueryWrapper() + .select(SysAdmin.class, info-> + !info.getColumn().equals("salt") && + !info.getColumn().equals("password") && + !info.getColumn().equals("is_delete") && + !info.getColumn().equals("delete_time")) + .eq("id", id) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(sysAdmin, "账号已不存在!"); + + return sysAdmin; + } + + /** + * 新增管理员 + * + * @author fzr + * @param sysAdminParam 参数 + */ + @Override + public void add(SysAdminParam sysAdminParam) { + String[] field = {"id", "username", "nickname"}; + Assert.isNull(this.getOne(new QueryWrapper() + .select(field) + .eq("is_delete", 0) + .eq("username", sysAdminParam.getUsername()) + .last("limit 1")), "账号已存在换一个吧!"); + + Assert.isNull(this.getOne(new QueryWrapper() + .select(field) + .eq("is_delete", 0) + .eq("nickname", sysAdminParam.getNickname()) + .last("limit 1")), "昵称已存在换一个吧!"); + + String salt = ToolsUtil.randomString(5); + String pwd = ToolsUtil.makeMd5(sysAdminParam.getPassword().trim() + salt); + String avatar = UrlUtil.toRelativeUrl(sysAdminParam.getAvatar()); + + SysAdmin model = new SysAdmin(); + model.setUsername(sysAdminParam.getUsername()); + model.setNickname(sysAdminParam.getNickname()); + model.setRole(sysAdminParam.getRole()); + model.setAvatar(avatar); + model.setPassword(pwd); + model.setSalt(salt); + model.setSort(sysAdminParam.getSort()); + model.setIsDisable(sysAdminParam.getIsDisable()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + this.save(model); + } + + /** + * 更新管理员 + * + * @author fzr + * @param sysAdminParam 参数 + */ + @Override + public void edit(SysAdminParam sysAdminParam) { + String[] field = {"id", "username", "nickname"}; + Assert.isNull(this.getOne(new QueryWrapper() + .select(field) + .eq("is_delete", 0) + .eq("username", sysAdminParam.getUsername()) + .ne("id", sysAdminParam.getId()) + .last("limit 1")), "账号已存在换一个吧!"); + + Assert.isNull(this.getOne(new QueryWrapper() + .select(field) + .eq("is_delete", 0) + .eq("nickname", sysAdminParam.getNickname()) + .ne("id", sysAdminParam.getId()) + .last("limit 1")), "昵称已存在换一个吧!"); + + String avatar = UrlUtil.toRelativeUrl(sysAdminParam.getAvatar()); + String salt = ToolsUtil.randomString(5); + String pwd = ToolsUtil.makeMd5(sysAdminParam.getPassword().trim() + salt); + + SysAdmin model = new SysAdmin(); + model.setId(sysAdminParam.getId()); + model.setNickname(sysAdminParam.getNickname()); + model.setUsername(sysAdminParam.getUsername()); + model.setRole(sysAdminParam.getRole()); + model.setAvatar(avatar); + model.setPassword(pwd); + model.setSalt(salt); + model.setSort(sysAdminParam.getSort()); + model.setIsDisable(sysAdminParam.getIsDisable()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + this.updateById(model); + } + + /** + * 删除管理员 + * + * @author fzr + * @param id 主键 + */ + @Override + public void del(Integer id) { + String[] field = {"id", "username", "nickname"}; + Assert.notNull(this.getOne(new QueryWrapper() + .select(field) + .eq("id", id) + .eq("is_delete", 0) + .last("limit 1")), "账号已不存在!"); + + SysAdmin model = new SysAdmin(); + model.setId(id); + model.setIsDelete(true); + model.setDeleteTime(System.currentTimeMillis() / 1000); + this.updateById(model); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysMenuServiceImpl.java b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysMenuServiceImpl.java new file mode 100644 index 00000000..789d3f99 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysMenuServiceImpl.java @@ -0,0 +1,139 @@ +package com.hxkj.admin.service.impl; + +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.hxkj.admin.service.ISysMenuService; +import com.hxkj.admin.validate.SysMenuParam; +import com.hxkj.admin.vo.system.SysMenuListVo; +import com.hxkj.common.entity.system.SysMenu; +import com.hxkj.common.mapper.system.SysMenuMapper; +import com.hxkj.common.utils.ArrayUtil; +import com.hxkj.common.utils.TimeUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Service +public class ISysMenuServiceImpl extends MPJBaseServiceImpl implements ISysMenuService { + + /** + * 菜单列表 + * + * @author fzr + * @return JSONArray + */ + @Override + public JSONArray lists() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(SysMenu.class, info-> + !info.getColumn().equals("salt") && + !info.getColumn().equals("is_delete") && + !info.getColumn().equals("delete_time")) + .eq("is_delete", 0) + .orderByDesc(Arrays.asList("menu_sort", "id")); + + List sysMenus = this.list( queryWrapper); + + List lists = new ArrayList<>(); + for (SysMenu sysMenu : sysMenus) { + SysMenuListVo vo = new SysMenuListVo(); + BeanUtils.copyProperties(sysMenu, vo); + + vo.setCreateTime(TimeUtil.timeToDate(sysMenu.getCreateTime())); + vo.setUpdateTime(TimeUtil.timeToDate(sysMenu.getUpdateTime())); + lists.add(vo); + } + + JSONArray jsonArray = JSONArray.parseArray(JSONArray.toJSONString(lists)); + return ArrayUtil.listToTree(jsonArray, "id", "pid", "children"); + } + + /** + * 菜单详情 + * + * @param id 主键参数 + * @return SysMenu + */ + @Override + public SysMenu detail(Integer id) { + SysMenu model = this.getOne(new QueryWrapper() + .eq("id", id) + .eq("is_delete", 0)); + + Assert.notNull(model, "菜单已不存在!"); + + return model; + } + + /** + * 新增菜单 + * + * @author fzr + * @param sysMenuParam 参数 + */ + @Override + public void add(SysMenuParam sysMenuParam) { + SysMenu model = new SysMenu(); + model.setPid(sysMenuParam.getPid()); + model.setMenuType(sysMenuParam.getMenuType()); + model.setMenuName(sysMenuParam.getMenuName()); + model.setMenuIcon(sysMenuParam.getMenuIcon()); + model.setMenuSort(sysMenuParam.getMenuSort()); + model.setPerms(sysMenuParam.getPerms()); + model.setIsDisable(sysMenuParam.getIsDisable()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + this.save(model); + } + + /** + * 编辑菜单 + * + * @author fzr + * @param sysMenuParam 菜单 + */ + @Override + public void edit(SysMenuParam sysMenuParam) { + SysMenu model = this.getOne(new QueryWrapper() + .eq("id", sysMenuParam.getId()) + .eq("is_delete", 0)); + + Assert.notNull(model, "菜单已不存在!"); + + model.setMenuType(sysMenuParam.getMenuType()); + model.setMenuName(sysMenuParam.getMenuName()); + model.setMenuIcon(sysMenuParam.getMenuIcon()); + model.setMenuSort(sysMenuParam.getMenuSort()); + model.setPerms(sysMenuParam.getPerms()); + model.setPid(sysMenuParam.getPid()); + model.setIsDisable(sysMenuParam.getIsDisable()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + this.updateById(model); + } + + /** + * 删除菜单 + * + * @author fzr + * @param id 主键参数 + */ + @Override + public void del(Integer id) { + SysMenu model = this.getOne(new QueryWrapper() + .eq("id", id) + .eq("is_delete", 0)); + + Assert.notNull(model, "菜单已不存在!"); + + model.setId(id); + model.setIsDelete(true); + model.setDeleteTime(System.currentTimeMillis() / 1000); + this.updateById(model); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysRoleServiceImpl.java b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysRoleServiceImpl.java new file mode 100644 index 00000000..c22f7cb9 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/service/impl/ISysRoleServiceImpl.java @@ -0,0 +1,179 @@ +package com.hxkj.admin.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.github.yulichang.base.MPJBaseServiceImpl; +import com.hxkj.admin.service.ISysRoleService; +import com.hxkj.admin.validate.PageParam; +import com.hxkj.admin.validate.SysRoleParam; +import com.hxkj.admin.vo.system.SysRoleListVo; +import com.hxkj.common.core.PageResult; +import com.hxkj.common.entity.system.SysRole; +import com.hxkj.common.mapper.system.SysRoleMapper; +import com.hxkj.common.utils.TimeUtil; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Service +public class ISysRoleServiceImpl extends MPJBaseServiceImpl implements ISysRoleService { + + /** + * 根据ID获取角色名称 + * + * @author fzr + * @param id 角色ID + * @return String + */ + @Override + public String getRoleNameById(Integer id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("id", "name"); + queryWrapper.eq("id", id); + queryWrapper.eq("is_delete", 0); + queryWrapper.last("limit 1"); + + SysRole sysRole = this.getOne(queryWrapper, false); + if (sysRole == null) { + return ""; + } + return sysRole.getName(); + } + + /** + * 角色列表 + * + * @author fzr + * @param pageParam 参数 + * @return PageResult + */ + @Override + public PageResult lists(@Validated PageParam pageParam) { + Integer page = pageParam.getPageNo(); + Integer limit = pageParam.getPageSize(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select(SysRole.class, info-> + !info.getColumn().equals("is_delete") && + !info.getColumn().equals("delete_time")) + .eq("is_delete", 0) + .orderByDesc(Arrays.asList("sort", "id")); + + IPage iPage = this.page(new Page<>(page, limit), queryWrapper); + + List roleVoArrayList = new ArrayList<>(); + for (SysRole sysRole : iPage.getRecords()) { + SysRoleListVo vo = new SysRoleListVo(); + BeanUtils.copyProperties(sysRole, vo); + + vo.setCreateTime(TimeUtil.timeToDate(sysRole.getCreateTime())); + vo.setUpdateTime(TimeUtil.timeToDate(sysRole.getUpdateTime())); + roleVoArrayList.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), roleVoArrayList); + } + + /** + * 角色详情 + * + * @author fzr + * @param id 主键参数 + * @return SysRole + */ + @Override + public SysRole detail(Integer id) { + SysRole sysRole = this.getOne(new QueryWrapper() + .eq("id", id) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(sysRole, "角色已不存在!"); + + return sysRole; + } + + /** + * 新增角色 + * + * @author fzr + * @param sysRoleParam 参数 + */ + @Override + public void add(SysRoleParam sysRoleParam) { + Assert.isNull(this.getOne(new QueryWrapper() + .select("id,name") + .eq("name", sysRoleParam.getName().trim()) + .eq("is_delete", 0) + .last("limit 1")), "角色名称已存在!"); + + SysRole model = new SysRole(); + model.setName(sysRoleParam.getName().trim()); + model.setRemark(sysRoleParam.getRemark()); + model.setMenuIds(sysRoleParam.getMenuIds()); + model.setIsDisable(sysRoleParam.getIsDisable()); + model.setCreateTime(System.currentTimeMillis() / 1000); + model.setUpdateTime(System.currentTimeMillis() / 1000); + this.save(model); + } + + /** + * 编辑角色 + * + * @author fzr + * @param sysRoleParam 参数 + */ + @Override + public void edit(SysRoleParam sysRoleParam) { + Assert.notNull(this.getOne(new QueryWrapper() + .select("id,name") + .eq("id", sysRoleParam.getId()) + .eq("is_delete", 0) + .last("limit 1")), "角色已不存在!"); + + Assert.isNull(this.getOne(new QueryWrapper() + .select("id,name") + .ne("id", sysRoleParam.getId()) + .eq("name", sysRoleParam.getName().trim()) + .eq("is_delete", 0) + .last("limit 1")), "角色名称已存在!"); + + SysRole model = new SysRole(); + model.setId(sysRoleParam.getId()); + model.setName(sysRoleParam.getName().trim()); + model.setRemark(sysRoleParam.getRemark()); + model.setMenuIds(sysRoleParam.getMenuIds()); + model.setIsDisable(sysRoleParam.getIsDisable()); + model.setUpdateTime(System.currentTimeMillis() / 1000); + this.updateById(model); + } + + /** + * 删除角色 + * + * @author fzr + * @param id 主键参数 + */ + @Override + public void del(Integer id) { + SysRole sysRole = this.getOne(new QueryWrapper() + .select("id,name") + .eq("id", id) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(sysRole, "角色已不存在!"); + + sysRole.setId(id); + sysRole.setIsDelete(true); + sysRole.setDeleteTime(System.currentTimeMillis() / 1000); + this.updateById(sysRole); + } + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/validate/PageParam.java b/like-admin/src/main/java/com/hxkj/admin/validate/PageParam.java new file mode 100644 index 00000000..f2e9588b --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/validate/PageParam.java @@ -0,0 +1,23 @@ +package com.hxkj.admin.validate; + +import lombok.Data; + +import javax.validation.constraints.DecimalMax; +import javax.validation.constraints.DecimalMin; + +/** + * 分页参数 + */ +@Data +public class PageParam { + + // 当前分页 + @DecimalMin(value = "1", message = "pageNo参数必须大于0的数字") + public Integer pageNo = 1; + + // 每页条数 + @DecimalMin(value = "1", message = "pageSize参数必须是大于0的数字") + @DecimalMax(value = "60", message = "pageSize参数必须是小于60的数字") + private Integer pageSize = 20; + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/validate/SysAdminParam.java b/like-admin/src/main/java/com/hxkj/admin/validate/SysAdminParam.java new file mode 100644 index 00000000..7e9fb2b5 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/validate/SysAdminParam.java @@ -0,0 +1,47 @@ +package com.hxkj.admin.validate; + +import com.hxkj.common.validator.annotation.IDMust; +import org.hibernate.validator.constraints.Length; + +import lombok.Data; +import javax.validation.constraints.*; + +/** + * 系统管理员参数 + */ +@Data +public class SysAdminParam { + + public interface create{} + public interface update{} + public interface delete{} + + @IDMust(message = "id参数必传且需大于0", groups = {update.class, delete.class}) + private Integer id; + + @NotNull(message = "请选择角色", groups = {create.class, update.class}) + @Min(value = 1, message = "role参数异常", groups = {create.class, update.class}) + private Integer role; + + @NotEmpty(message = "账号不能为空", groups = {create.class, update.class}) + @Length(min = 2, max = 20, message = "账号必须在2~20个字符内", groups = {create.class, update.class}) + private String username; + + @NotEmpty(message = "昵称不能为空", groups = {create.class, update.class}) + @Length(min = 2, max = 30, message = "昵称必须在2~30个字符内", groups = {create.class, update.class}) + private String nickname; + + @NotEmpty(message = "密码不能为空", groups = {create.class, update.class}) + @Length(min = 6, max = 18, message = "密码必须在6~18个字符内", groups = {create.class, update.class}) + private String password; + + @NotNull(message = "请选择状态", groups = {create.class, update.class}) + private Boolean isDisable; + + @NotNull(message = "排序号不能为空", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "排序号值不能少于0", groups = {create.class, update.class}) + private Integer sort; + + private String avatar = ""; + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/validate/SysMenuParam.java b/like-admin/src/main/java/com/hxkj/admin/validate/SysMenuParam.java new file mode 100644 index 00000000..061124c2 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/validate/SysMenuParam.java @@ -0,0 +1,50 @@ +package com.hxkj.admin.validate; + +import com.hxkj.common.validator.annotation.IDMust; +import com.hxkj.common.validator.annotation.StringContains; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Max; +import javax.validation.constraints.NotNull; + +/** + * 系统菜单参数 + */ +@Data +public class SysMenuParam { + + public interface create{} + public interface update{} + public interface delete{} + + @IDMust(message = "id参数必传且需大于0", groups = {update.class, delete.class}) + private Integer id; + + @NotNull(message = "上级菜单不能为空", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "上级菜单值不能少于0", groups = {create.class, update.class}) + private Integer pid; + + @NotNull(message = "缺少参数menuType", groups = {create.class, update.class}) + @StringContains(values = {"M", "C", "A"}, message = "菜单类型不是合法值(M,C,A)", groups = {create.class, update.class}) + private String menuType; + + @NotNull(message = "缺少参数menuName", groups = {create.class, update.class}) + @Length(min = 1, max = 30, message = "菜单名称必须在1~30个字符内", groups = {create.class, update.class}) + private String menuName; + + @Length(max = 100, message = "图标名称不能超过100个字符", groups = {create.class, update.class}) + private String menuIcon; + + @NotNull(message = "排序号不能为空", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "排序号值不能少于0", groups = {create.class, update.class}) + private Integer menuSort; + + @Length(max = 100, message = "权限字符不能超过100个字符", groups = {create.class, update.class}) + private String perms; + + @NotNull(message = "请选择状态", groups = {create.class, update.class}) + private Boolean isDisable; + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/validate/SysRoleParam.java b/like-admin/src/main/java/com/hxkj/admin/validate/SysRoleParam.java new file mode 100644 index 00000000..37d98885 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/validate/SysRoleParam.java @@ -0,0 +1,37 @@ +package com.hxkj.admin.validate; + +import com.hxkj.common.validator.annotation.IDMust; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.Max; +import javax.validation.constraints.NotNull; + +@Data +public class SysRoleParam { + + public interface create{} + public interface update{} + public interface delete{} + + @IDMust(message = "id参数必传且需大于0", groups = {update.class, delete.class}) + private Integer id; + + @NotNull(message = "缺少参数name", groups = {create.class, update.class}) + @Length(min = 1, max = 30, message = "角色名称必须在1~30个字符内", groups = {create.class, update.class}) + private String name; + + @Max(value = 200, message = "备注信息不能超过200个字符") + private String remark = ""; + + @NotNull(message = "排序号不能为空", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "排序号值不能少于0", groups = {create.class, update.class}) + private Integer sort; + + @NotNull(message = "请选择状态", groups = {create.class, update.class}) + private Boolean isDisable; + + private String menuIds = ""; + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/vo/system/SysAdminListVo.java b/like-admin/src/main/java/com/hxkj/admin/vo/system/SysAdminListVo.java new file mode 100644 index 00000000..e4532e81 --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/vo/system/SysAdminListVo.java @@ -0,0 +1,24 @@ +package com.hxkj.admin.vo.system; + +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class SysAdminListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Integer id; + private String username; + private String nickname; + private String avatar; + private String role; + private Boolean isDisable; + private String lastLoginIp; + private String lastLoginTime; + private String createTime; + private String updateTime; + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/vo/system/SysMenuListVo.java b/like-admin/src/main/java/com/hxkj/admin/vo/system/SysMenuListVo.java new file mode 100644 index 00000000..dd51464a --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/vo/system/SysMenuListVo.java @@ -0,0 +1,19 @@ +package com.hxkj.admin.vo.system; + +import lombok.Data; + +@Data +public class SysMenuListVo { + + private Integer id; + private Integer pid; + private String menuType; + private String menuName; + private String menuIcon; + private Integer menuSort; + private String perms; + private Boolean isDisable; + private String createTime; + private String updateTime; + +} diff --git a/like-admin/src/main/java/com/hxkj/admin/vo/system/SysRoleListVo.java b/like-admin/src/main/java/com/hxkj/admin/vo/system/SysRoleListVo.java new file mode 100644 index 00000000..89b58b2c --- /dev/null +++ b/like-admin/src/main/java/com/hxkj/admin/vo/system/SysRoleListVo.java @@ -0,0 +1,22 @@ +package com.hxkj.admin.vo.system; + +import lombok.Data; + +@Data +public class SysRoleListVo { + + private Integer id; + + private String name; + + private String remark; + + private Integer sort; + + private Boolean isDisable; + + private String createTime; + + private String updateTime; + +} diff --git a/like-admin/src/main/resources/application.yml b/like-admin/src/main/resources/application.yml new file mode 100644 index 00000000..1a34fa5b --- /dev/null +++ b/like-admin/src/main/resources/application.yml @@ -0,0 +1,41 @@ +# 服务配置 +server: + port: 8082 + +# 框架配置 +spring: + profiles: + active: test + # 数据源配置 + datasource: + url: jdbc:mysql://localhost:3306/local_frame?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false + type: com.zaxxer.hikari.HikariDataSource # 数据源类型 + driver-class-name: com.mysql.jdbc.Driver # MySql的驱动 + username: root # 数据库账号 + password: root # 数据库密码 + hikari: + connection-timeout: 30000 # 等待连接分配连接的最大时长(毫秒),超出时长还没可用连接则发送SQLException,默认30秒 + minimum-idle: 5 # 最小连接数 + maximum-pool-size: 20 # 最大连接数 + auto-commit: true # 自动提交 + idle-timeout: 600000 # 连接超时的最大时长(毫秒),超时则被释放(retired),默认10分钟 + pool-name: DateSourceHikariCP # 连接池名称 + max-lifetime: 1800000 # 连接的生命时长(毫秒),超时而且没被使用则被释放,默认30分钟(1800000ms) + connection-init-sql: SELECT 1 # 连接时发起SQL测试脚本 + # 限制配置 + servlet: + multipart: + max-file-size: 100MB # 文件上传大小限制 + max-request-size: 100MB # 文件最大请求限制 + enabled: true + +# Mybatis-plus配置 +mybatis-plus: + mapper-locations: classpath*:/mapper/**Mapper.xml # 映射文件路径 + typeAliasesPackage: com.hxkj.**.mapper + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + banner: false + db-config: + table-prefix: ls_ # 设置表前缀 \ No newline at end of file diff --git a/like-common/pom.xml b/like-common/pom.xml new file mode 100644 index 00000000..df997ef5 --- /dev/null +++ b/like-common/pom.xml @@ -0,0 +1,72 @@ + + + + + + org.hxkj + like-framework + 1.0-SNAPSHOT + + + + 4.0.0 + like-common + like-common + + + + + + org.springframework.boot + spring-boot-autoconfigure + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-aop + + + + org.springframework.boot + spring-boot-starter-validation + + + + mysql + mysql-connector-java + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.github.yulichang + mybatis-plus-join + + + + com.github.pagehelper + pagehelper-spring-boot-starter + + + + org.projectlombok + lombok + + + + com.alibaba + fastjson + + + + \ No newline at end of file diff --git a/like-common/src/main/java/com/hxkj/common/core/AjaxResult.java b/like-common/src/main/java/com/hxkj/common/core/AjaxResult.java new file mode 100644 index 00000000..944e727f --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/core/AjaxResult.java @@ -0,0 +1,165 @@ +package com.hxkj.common.core; + +import com.hxkj.common.enums.HttpEnum; +import lombok.Data; + +import java.util.ArrayList; + +@Data +public class AjaxResult { + + /** 状态码 **/ + private Integer code; + + /** 提示信息 **/ + private String msg; + + /** 响应数据 **/ + private Object data; + + /** + * 无参构造 + */ + public AjaxResult() {} + + /** + * 带参构造 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @param data 响应数据 + */ + public AjaxResult(Integer code, String msg, Object data) { + this.code = code; + this.msg = msg; + this.data = data; + } + + /** + * 成功返回结果 + * + * @author fzr + * @return AjaxResult + */ + public static AjaxResult success() { + return new AjaxResult(HttpEnum.SUCCESS.getCode(), HttpEnum.SUCCESS.getMsg(), new ArrayList<>()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param code 状态码 + * @return AjaxResult + */ + public static AjaxResult success(Integer code) { + return new AjaxResult(code, HttpEnum.FAILED.getMsg(), new ArrayList<>()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult success(String msg) { + return new AjaxResult(HttpEnum.SUCCESS.getCode(), msg, new ArrayList<>()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult success(Object data) { + return new AjaxResult(HttpEnum.SUCCESS.getCode(), HttpEnum.SUCCESS.getMsg(), data); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult success(Integer code, String msg) { + return new AjaxResult(code, msg, new ArrayList<>()); + } + + /** + * 成功返回结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult success(Integer code, String msg, Object data) { + return new AjaxResult(code, msg, data); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param code 状态码 + * @return AjaxResult + */ + public static AjaxResult failed(Integer code) { + return new AjaxResult(code, HttpEnum.FAILED.getMsg(), new ArrayList<>()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult failed(String msg) { + return new AjaxResult(HttpEnum.FAILED.getCode(), msg, new ArrayList<>()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult failed(Object data) { + return new AjaxResult(HttpEnum.FAILED.getCode(), HttpEnum.FAILED.getMsg(), data); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @return AjaxResult + */ + public static AjaxResult failed(Integer code, String msg) { + return new AjaxResult(code, msg, new ArrayList<>()); + } + + /** + * 响应失败结果 + * + * @author fzr + * @param code 状态码 + * @param msg 提示信息 + * @param data 响应数据 + * @return AjaxResult + */ + public static AjaxResult failed(Integer code, String msg, Object data) { + return new AjaxResult(code, msg, data); + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/core/PageResult.java b/like-common/src/main/java/com/hxkj/common/core/PageResult.java new file mode 100644 index 00000000..626eded8 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/core/PageResult.java @@ -0,0 +1,69 @@ +package com.hxkj.common.core; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.github.pagehelper.PageInfo; +import lombok.Data; + +import java.util.HashMap; +import java.util.List; + +@Data +public class PageResult { + + private Long count; //总记录数 + private Integer pageNo; //当前页码 + private Integer pageSize; //每页条数 + private List lists; //数据列表 + + /** + * PageHelper分页 + * + * @author fzr + * @param list 分页数据集 + * @param 实体类型 + * @return PageList + */ + public static PageResult pageHelper(List list) { + PageResult pageResult = new PageResult(); + PageInfo pageInfo = new PageInfo<>(list); + pageResult.setCount(pageInfo.getTotal()); + pageResult.setPageNo(pageInfo.getPageNum()); + pageResult.setPageSize(pageInfo.getPageSize()); + pageResult.setLists(pageInfo.getList()); + return pageResult; + } + + /** + * MyBatisPlus分页 + * + * @author fzr + * @param 实体类型 + * @return PageList + */ + public static PageResult iPageHandle(IPage iPage) { + PageResult pageResult = new PageResult(); + pageResult.setCount(iPage.getTotal()); + pageResult.setPageNo((int) iPage.getCurrent()); + pageResult.setPageSize((int) iPage.getSize()); + pageResult.setLists(iPage.getRecords()); + return pageResult; + } + + /** + * MyBatisPlus分页 + * + * @author fzr + * @param 实体类型 + * @return PageList + */ + public static PageResult iPageHandle(Long total, Long pageNo, Long size, List lists) { + PageResult pageResult = new PageResult(); + pageResult.setCount(total); + pageResult.setPageNo(Math.toIntExact(pageNo)); + pageResult.setPageSize(Math.toIntExact(size)); + pageResult.setLists(lists); + + return pageResult; + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/entity/system/SysAdmin.java b/like-common/src/main/java/com/hxkj/common/entity/system/SysAdmin.java new file mode 100644 index 00000000..cc617936 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/entity/system/SysAdmin.java @@ -0,0 +1,34 @@ +package com.hxkj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * 系统管理员实体 + */ +@Data +public class SysAdmin implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type=IdType.AUTO) + private Integer id; + private String nickname; + private String username; + private String password; + private String avatar; + private String salt; + private Integer role; + private Integer sort; + private Boolean isDisable; + private Boolean isDelete; + private String lastLoginIp; + private Long lastLoginTime; + private Long createTime; + private Long updateTime; + private Long deleteTime; + +} diff --git a/like-common/src/main/java/com/hxkj/common/entity/system/SysMenu.java b/like-common/src/main/java/com/hxkj/common/entity/system/SysMenu.java new file mode 100644 index 00000000..7f9d04fd --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/entity/system/SysMenu.java @@ -0,0 +1,31 @@ +package com.hxkj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * 系统菜单实体 + */ +@Data +public class SysMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + private Integer id; + private Integer pid; + private String menuType; + private String menuName; + private String menuIcon; + private Integer menuSort; + private String perms; + private Boolean isDisable; + private Boolean isDelete; + private Long createTime; + private Long updateTime; + private Long deleteTime; + +} diff --git a/like-common/src/main/java/com/hxkj/common/entity/system/SysRole.java b/like-common/src/main/java/com/hxkj/common/entity/system/SysRole.java new file mode 100644 index 00000000..e585d1f2 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/entity/system/SysRole.java @@ -0,0 +1,29 @@ +package com.hxkj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * 系统角色实体 + */ +@Data +public class SysRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + private Integer id; + private String name; + private String remark; + private Integer sort; + private String menuIds; + private Boolean isDisable; + private Boolean isDelete; + private Long createTime; + private Long updateTime; + private Long deleteTime; + +} diff --git a/like-common/src/main/java/com/hxkj/common/entity/system/SysRoleMenu.java b/like-common/src/main/java/com/hxkj/common/entity/system/SysRoleMenu.java new file mode 100644 index 00000000..999bef1a --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/entity/system/SysRoleMenu.java @@ -0,0 +1,22 @@ +package com.hxkj.common.entity.system; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.io.Serializable; + +/** + * 系统角色菜单实体 + */ +@Data +public class SysRoleMenu implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value="id", type= IdType.AUTO) + private Integer id; + private Integer roleId; + private Integer menuId; + +} diff --git a/like-common/src/main/java/com/hxkj/common/enums/HttpEnum.java b/like-common/src/main/java/com/hxkj/common/enums/HttpEnum.java new file mode 100644 index 00000000..7a9e1e36 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/enums/HttpEnum.java @@ -0,0 +1,48 @@ +package com.hxkj.common.enums; + +public enum HttpEnum { + + SUCCESS(200, "成功"), + FAILED(300, "失败"), + PARAMS_VALID_ERROR(310, "参数校验错误"), + PARAMS_TYPE_ERROR(320, "参数类型错误"), + REQUEST_METHOD_ERROR(330, "请求方法错误"), + ASSERT_ARGUMENT_ERROR(340, "断言参数错误"), + ASSERT_MYBATIS_ERROR(350, "断言Mybatis错误"), + NO_TOKEN(401, "token参数为空"), + NO_LOGIN(402, "token参数无效"), + NO_PERMISSION(403, "无相关权限"), + NOT_DATA(404, "无相关数据"), + SYSTEM_ERROR(500, "系统错误"); + + /** + * 构造方法 + */ + private final int code; + private final String msg; + HttpEnum(int code, String msg) { + this.code = code; + this.msg = msg; + } + + /** + * 获取状态码 + * + * @author fzr + * @return Long + */ + public int getCode() { + return this.code; + } + + /** + * 获取提示 + * + * @author fzr + * @return String + */ + public String getMsg() { + return this.msg; + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/exception/GlobalException.java b/like-common/src/main/java/com/hxkj/common/exception/GlobalException.java new file mode 100644 index 00000000..c82f18e5 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/exception/GlobalException.java @@ -0,0 +1,125 @@ +package com.hxkj.common.exception; + +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.hxkj.common.core.AjaxResult; +import com.hxkj.common.enums.HttpEnum; +import com.hxkj.common.utils.ThrowableUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; +import org.springframework.web.HttpMediaTypeNotSupportedException; +import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingServletRequestParameterException; +import org.springframework.web.bind.annotation.*; + +import java.util.Objects; + +/** + * 全局异常处理 + */ +@Slf4j +@ControllerAdvice +public class GlobalException { + +// /** +// * 处理所有不可知异常 +// * +// * @param e 异常 +// * @return AjaxResult +// */ +// @ResponseStatus(HttpStatus.OK) +// @ExceptionHandler(Throwable.class) +// public AjaxResult handleException(Throwable e) { +// log.error(ThrowableUtil.getStackTrace(e)); +// return AjaxResult.failed(HttpEnum.SYSTEM_ERROR.getCode(), HttpEnum.SUCCESS.getMsg()); +// } + + /** + * 拦截表单参数校验FROM + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(BindException.class) + @ResponseBody + public AjaxResult handleBindException(BindException e) { + BindingResult bindingResult = e.getBindingResult(); + Integer code = HttpEnum.PARAMS_VALID_ERROR.getCode(); + String msg = Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage(); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截路径参数校验PATH + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MissingServletRequestParameterException.class) + @ResponseBody + public AjaxResult handlePathException(MissingServletRequestParameterException e) { + Integer code = HttpEnum.PARAMS_VALID_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截JSON参数校验 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public AjaxResult handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + BindingResult bindingResult = e.getBindingResult(); + Integer code = HttpEnum.PARAMS_VALID_ERROR.getCode(); + String msg = Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage(); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截参数类型不正确 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(HttpMessageNotReadableException.class) + @ResponseBody + public AjaxResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + Integer code = HttpEnum.PARAMS_TYPE_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg.split(";")[0]); + } + + /** + * 拦截请求方法 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + @ResponseBody + public AjaxResult handleRequestMethodException(HttpRequestMethodNotSupportedException e) { + Integer code = HttpEnum.REQUEST_METHOD_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截断言异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(IllegalArgumentException.class) + public AjaxResult handleIllegalArgumentException(IllegalArgumentException e) { + Integer code = HttpEnum.ASSERT_ARGUMENT_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg); + } + + /** + * 拦截MybatisPlus异常 + */ + @ResponseStatus(HttpStatus.OK) + @ExceptionHandler(MybatisPlusException.class) + @ResponseBody + public AjaxResult handleMybatisPlusException(MybatisPlusException e) { + Integer code = HttpEnum.ASSERT_MYBATIS_ERROR.getCode(); + String msg = Objects.requireNonNull(e.getMessage()); + return AjaxResult.failed(code, msg); + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/mapper/system/SysAdminMapper.java b/like-common/src/main/java/com/hxkj/common/mapper/system/SysAdminMapper.java new file mode 100644 index 00000000..b7279cea --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/mapper/system/SysAdminMapper.java @@ -0,0 +1,14 @@ +package com.hxkj.common.mapper.system; + +import com.github.yulichang.base.MPJBaseMapper; +import com.hxkj.common.entity.system.SysAdmin; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * 系统管理员 + */ +@Mapper +public interface SysAdminMapper extends MPJBaseMapper { +} diff --git a/like-common/src/main/java/com/hxkj/common/mapper/system/SysMenuMapper.java b/like-common/src/main/java/com/hxkj/common/mapper/system/SysMenuMapper.java new file mode 100644 index 00000000..c4bd91de --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/mapper/system/SysMenuMapper.java @@ -0,0 +1,12 @@ +package com.hxkj.common.mapper.system; + +import com.github.yulichang.base.MPJBaseMapper; +import com.hxkj.common.entity.system.SysMenu; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统菜单 + */ +@Mapper +public interface SysMenuMapper extends MPJBaseMapper { +} diff --git a/like-common/src/main/java/com/hxkj/common/mapper/system/SysRoleMapper.java b/like-common/src/main/java/com/hxkj/common/mapper/system/SysRoleMapper.java new file mode 100644 index 00000000..61d1b503 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/mapper/system/SysRoleMapper.java @@ -0,0 +1,12 @@ +package com.hxkj.common.mapper.system; + +import com.github.yulichang.base.MPJBaseMapper; +import com.hxkj.common.entity.system.SysRole; +import org.apache.ibatis.annotations.Mapper; + +/** + * 系统角色 + */ +@Mapper +public interface SysRoleMapper extends MPJBaseMapper { +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/ArrayUtil.java b/like-common/src/main/java/com/hxkj/common/utils/ArrayUtil.java new file mode 100644 index 00000000..db7417da --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/ArrayUtil.java @@ -0,0 +1,54 @@ +package com.hxkj.common.utils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +public class ArrayUtil { + + /** + * JSONArray转树形结构 + * + * @author fzr + * @param arr JSON数组 + * @param id 主键字段名 + * @param pid 上级字段名 + * @param child 子级字段名 + * @return JSONArray + */ + public static JSONArray listToTree(JSONArray arr, String id, String pid, String child) { + JSONArray r = new JSONArray(); + JSONObject hash = new JSONObject(); + //将数组转为Object的形式,key为数组中的id + for (Object o : arr) { + JSONObject json = (JSONObject) o; + hash.put(json.getString(id), json); + } + //遍历结果集 + for (Object o : arr) { + //单条记录 + JSONObject aVal = (JSONObject) o; + + //在hash中取出key为单条记录中pid的值 + JSONObject hashVP = (JSONObject) hash.get(aVal.get(pid).toString()); + //如果记录的pid存在,则说明它有父节点,将她添加到孩子节点的集合中 + if (hashVP != null) { + //检查是否有child属性 + if (hashVP.get(child) != null) { + JSONArray ch = (JSONArray) hashVP.get(child); + ch.add(aVal); + hashVP.put(child, ch); + } else { + JSONArray ch = new JSONArray(); + ch.add(aVal); + hashVP.put(child, ch); + } + } else { + r.add(aVal); + } + } + + return r; + } + + +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/ConfigUtil.java b/like-common/src/main/java/com/hxkj/common/utils/ConfigUtil.java new file mode 100644 index 00000000..ba356f80 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/ConfigUtil.java @@ -0,0 +1,4 @@ +package com.hxkj.common.utils; + +public class ConfigUtil { +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/HttpUtil.java b/like-common/src/main/java/com/hxkj/common/utils/HttpUtil.java new file mode 100644 index 00000000..ff3705cf --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/HttpUtil.java @@ -0,0 +1,115 @@ +package com.hxkj.common.utils; + +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.*; + +/** + * 请求工具类 + */ +public class HttpUtil { + + /** + * 获取请求对象 + * + * @author fzr + * @return HttpServletRequest + */ + public static HttpServletRequest obj() { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (servletRequestAttributes != null) { + return servletRequestAttributes.getRequest(); + } + return null; + } + + /** + * 获取不带参请求URl + * + * @author fzr + * @return String + */ + public static String url() { + HttpServletRequest request = HttpUtil.obj(); + if (request != null) { + return request.getRequestURL().toString(); + } + return null; + } + + /** + * 获取请求域名 + * + * @author fzr + * @return String + */ + public static String domain() { + HttpServletRequest request = HttpUtil.obj(); + if (request != null) { + String requestUrl = request.getRequestURL().toString(); + List urls = Arrays.asList(requestUrl.split("/")); + + String agree = "http:"; + if (request.getServerPort() == 443) { + agree = "https:"; + } + + return agree + "//" + urls.get(2).split(":")[0]; + } + return null; + } + + /** + * 请求客户端IP + * + * @author fzr + * @return String + */ + public static String ip() { + HttpServletRequest request = HttpUtil.obj(); + if (request != null) { + String ipAddress; + try { + ipAddress = request.getHeader("x-forwarded-for"); + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getHeader("WL-Proxy-Client-IP"); + } + if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { + ipAddress = request.getRemoteAddr(); + if (ipAddress.equals("127.0.0.1")) { + // 根据网卡取本机配置的IP + InetAddress inet = null; + try { + inet = InetAddress.getLocalHost(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + assert inet != null; + ipAddress = inet.getHostAddress(); + } + } + // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 + // "***.***.***.***".length() + if (ipAddress != null && ipAddress.length() > 15) { + // = 15 + if (ipAddress.indexOf(",") > 0) { + ipAddress = ipAddress.substring(0, ipAddress.indexOf(",")); + } + } + } catch (Exception e) { + ipAddress=""; + } + return ipAddress == null ? "" : ipAddress; + } + return ""; + } + + +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/RedisUtil.java b/like-common/src/main/java/com/hxkj/common/utils/RedisUtil.java new file mode 100644 index 00000000..3b2ee1c2 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/RedisUtil.java @@ -0,0 +1,4 @@ +package com.hxkj.common.utils; + +public class RedisUtil { +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/SpringUtil.java b/like-common/src/main/java/com/hxkj/common/utils/SpringUtil.java new file mode 100644 index 00000000..eacc1566 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/SpringUtil.java @@ -0,0 +1,4 @@ +package com.hxkj.common.utils; + +public class SpringUtil { +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/ThrowableUtil.java b/like-common/src/main/java/com/hxkj/common/utils/ThrowableUtil.java new file mode 100644 index 00000000..4c311059 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/ThrowableUtil.java @@ -0,0 +1,26 @@ +package com.hxkj.common.utils; + +import java.io.PrintWriter; +import java.io.StringWriter; + +/** + * 异常工具类 + */ +public class ThrowableUtil { + + /** + * 获取堆栈信息 + * + * @author fzr + * @param throwable 异常 + * @return String + */ + public static String getStackTrace(Throwable throwable) { + StringWriter sw = new StringWriter(); + try (PrintWriter pw = new PrintWriter(sw)) { + throwable.printStackTrace(pw); + return sw.toString(); + } + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/TimeUtil.java b/like-common/src/main/java/com/hxkj/common/utils/TimeUtil.java new file mode 100644 index 00000000..1a0aff4a --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/TimeUtil.java @@ -0,0 +1,412 @@ +package com.hxkj.common.utils; + + +import java.text.DateFormat; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.regex.Pattern; + +public class TimeUtil { + + /** + * 时间戳转日期(默认格式) + * @author fzr + * @return String + */ + public static String timeToDate(long time) { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time * 1000)); + } + + /** + * 时间戳转日期(默认格式) + * @author fzr + * @return String + */ + public static String timeToDate(String time) { + if (time == null) { + time = "0"; + } + long longTime = Long.parseLong(time); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(longTime * 1000)); + } + + /** + * 时间戳转日期(指定格式) + * @author fzr + * @return String + */ + public static String timeToDate(long time, String format) { + return new SimpleDateFormat(format).format(new Date(time * 1000)); + } + + /** + * 时间戳转日期(指定格式) + * @author fzr + * @return String + */ + public static String timeToDate(String time, String format) { + long longTime = Long.parseLong(time); + return new SimpleDateFormat(format).format(new Date(longTime * 1000)); + } + + /** + * 日期转时间戳 + * @author fzr + * @param date 日期 + * @return Long + */ + public static Long dateToTime(String date) { + String dateTime = TimeUtil.formatDate(date); + return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse(dateTime, new ParsePosition(0)).getTime() / 1000; + } + + /** + * 毫秒转日期时间 + * @param time 毫秒 + * @return String + */ + public static String millisecondToDate(Long time) { + Date date = new Date(); + date.setTime(time); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + + /** + * 毫秒转日期时间 + * @param time 毫秒 + * @return String + */ + public static String millisecondToDate(String time) { + Date date = new Date(); + date.setTime(Long.parseLong(time)); + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + + /** + * 毫秒转日期时间 + * @param time 毫秒 + * @return String + */ + public static String millisecondToDate(Long time, String format) { + Date date = new Date(); + date.setTime(time); + return new SimpleDateFormat(format).format(date); + } + + /** + * 毫秒转日期时间 + * @param time 毫秒 + * @return String + */ + public static String millisecondToDate(String time, String format) { + Date date = new Date(); + date.setTime(Long.parseLong(time)); + return new SimpleDateFormat(format).format(date); + } + + /** + * 日期转固定格式 yyyy-MM-dd HH:mm:ss + * @author fzr + * @param dateStr 日期时间 + * @return String + */ + public static String formatDate(String dateStr){ + dateStr = dateStr.trim(); + HashMap dateRegFormat = new HashMap<>(); + dateRegFormat.put("^\\d{4}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D+\\d{1,2}\\D*$", "yyyy-MM-dd-HH-mm-ss");//2014年3月12日 13时5分34秒,2014-03-12 12:05:34,2014/3/12 12:5:34 + dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}$", "yyyy-MM-dd-HH-mm");//2014-03-12 12:05 + dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}\\D+\\d{2}$", "yyyy-MM-dd-HH");//2014-03-12 12 + dateRegFormat.put("^\\d{4}\\D+\\d{2}\\D+\\d{2}$", "yyyy-MM-dd");//2014-03-12 + dateRegFormat.put("^\\d{4}\\D+\\d{2}$", "yyyy-MM");//2014-03 + dateRegFormat.put("^\\d{4}$", "yyyy");//2014 + dateRegFormat.put("^\\d{14}$", "yyyyMMddHHmmss");//20140312120534 + dateRegFormat.put("^\\d{12}$", "yyyyMMddHHmm");//201403121205 + dateRegFormat.put("^\\d{10}$", "yyyyMMddHH");//2014031212 + dateRegFormat.put("^\\d{8}$", "yyyyMMdd");//20140312 + dateRegFormat.put("^\\d{6}$", "yyyyMM");//201403 + dateRegFormat.put("^\\d{2}\\s*:\\s*\\d{2}\\s*:\\s*\\d{2}$", "yyyy-MM-dd-HH-mm-ss");//13:05:34 拼接当前日期 + dateRegFormat.put("^\\d{2}\\s*:\\s*\\d{2}$", "yyyy-MM-dd-HH-mm");//13:05 拼接当前日期 + dateRegFormat.put("^\\d{2}\\D+\\d{1,2}\\D+\\d{1,2}$", "yy-MM-dd");//14.10.18(年.月.日) + dateRegFormat.put("^\\d{1,2}\\D+\\d{1,2}$", "yyyy-dd-MM");//30.12(日.月) 拼接当前年份 + dateRegFormat.put("^\\d{1,2}\\D+\\d{1,2}\\D+\\d{4}$", "dd-MM-yyyy");//12.21.2013(日.月.年) + + String curDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + DateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + DateFormat formatter2; + String dateReplace; + String strSuccess = ""; + try { + for (String key : dateRegFormat.keySet()) { + if (Pattern.compile(key).matcher(dateStr).matches()) { + formatter2 = new SimpleDateFormat(dateRegFormat.get(key)); + if (key.equals("^\\d{2}\\s*:\\s*\\d{2}\\s*:\\s*\\d{2}$") || key.equals("^\\d{2}\\s*:\\s*\\d{2}$")) { + // 13:05:34 或 13:05 拼接当前日期 + dateStr = curDate + "-" + dateStr; + } else if (key.equals("^\\d{1,2}\\D+\\d{1,2}$")) { + //21.1 (日.月) 拼接当前年份 + dateStr = curDate.substring(0, 4) + "-" + dateStr; + } + dateReplace = dateStr.replaceAll("\\D+", "-"); + strSuccess = formatter1.format(formatter2.parse(dateReplace)); + break; + } + } + return strSuccess; + } catch (Exception ignored) { } + return ""; + } + + /** + * 返回当前时间戳 + * @author fzr + * @return Long + */ + public static Long time() { + return System.currentTimeMillis() / 1000; + } + + /** + * 返回今日开始和结束的时间戳 + * @author fzr + * @return List + */ + public static List today() { + List list = new ArrayList<>(); + // 开始时间 + Calendar todayStart = Calendar.getInstance(); + todayStart.set(Calendar.HOUR, 0); + todayStart.set(Calendar.MINUTE, 0); + todayStart.set(Calendar.SECOND, 0); + todayStart.set(Calendar.MILLISECOND, 0); + list.add(todayStart.getTime().getTime() / 1000 - 43200); + + // 结束时间 + Calendar todayEnd = Calendar.getInstance(); + todayEnd.set(Calendar.HOUR_OF_DAY, 23); + todayEnd.set(Calendar.MINUTE, 59); + todayEnd.set(Calendar.SECOND, 59); + todayEnd.set(Calendar.MILLISECOND, 999); + list.add(todayEnd.getTime().getTime() / 1000); + + return list; + } + + /** + * 返回昨日开始和结束的时间戳 + * @author fzr + * @return List + */ + public static List yesterday() { + List today = TimeUtil.today(); + List list = new ArrayList<>(); + list.add(today.get(0) - 86400); + list.add(today.get(1) - 86400); + return list; + } + + /** + * 返回本周开始和结束的时间戳 + * @author fzr + * @return List + */ + public static List week() { + List list = new ArrayList<>(); + // 开始时间 + Calendar cal = Calendar.getInstance(); + cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0,0); + cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + list.add(cal.getTimeInMillis() / 1000); + // 结束时间 + list.add(list.get(0) + ((7 * 24 * 60 * 60 * 1000) / 1000)-1); + return list; + } + + /** + * 返回上周开始和结束的时间戳 + * @author fzr + * @return List + */ + public static List lastWeek() { + List week = TimeUtil.week(); + List list = new ArrayList<>(); + list.add(week.get(0) - 604800); + list.add(week.get(1) - 604800); + return list; + } + + /** + * 返回今天是周几 + * @author fzr + * @return Long + */ + public static Long dayOfWeek() { + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + boolean isFirstSunday = (cal.getFirstDayOfWeek() == Calendar.SUNDAY); + long week = cal.get(Calendar.DAY_OF_WEEK); + if(isFirstSunday){ + week = (week -1) == 0? 7:(week - 1); + } + return week; + } + + /** + * 返回本月开始和结束的时间戳 + * @author fzr + * @return List + */ + public static List month() { + List list = new ArrayList<>(); + // 开始时间 + Calendar calStart = Calendar.getInstance(); + calStart.set(calStart.get(Calendar.YEAR),calStart.get(Calendar.MONTH), calStart.get(Calendar.DAY_OF_MONTH), 0, 0,0); + calStart.set(Calendar.DAY_OF_MONTH,calStart.getActualMinimum(Calendar.DAY_OF_MONTH)); + list.add(calStart.getTimeInMillis() / 1000); + + // 结束时间 + Calendar calEnd = Calendar.getInstance(); + calEnd.set(calEnd.get(Calendar.YEAR),calEnd.get(Calendar.MONTH), calEnd.get(Calendar.DAY_OF_MONTH), 0, 0,0); + calEnd.set(Calendar.DAY_OF_MONTH, calEnd.getActualMaximum(Calendar.DAY_OF_MONTH)); + calEnd.set(Calendar.HOUR_OF_DAY, 24); + list.add(calEnd.getTimeInMillis() / 1000 - 1); + return list; + } + + /** + * 返回上个月开始和结束的时间戳 + * @author fzr + * @return List + */ + public static List lastMonth() { + List list = new ArrayList<>(); + // 开始时间 + Calendar calStart = Calendar.getInstance(); + calStart.add(Calendar.MONTH, -1); + calStart.set(Calendar.DAY_OF_MONTH,1); + calStart.set(Calendar.HOUR, 0); + calStart.set(Calendar.MINUTE, 0); + calStart.set(Calendar.SECOND, 0); + calStart.set(Calendar.MILLISECOND, 0); + list.add((calStart.getTimeInMillis() / 1000) - 43200); + + // 结束时间 + Calendar calEnd = Calendar.getInstance(); + calEnd.set(calEnd.get(Calendar.YEAR),calEnd.get(Calendar.MONTH), calEnd.get(Calendar.DAY_OF_MONTH), 0, 0,0); + calEnd.set(Calendar.DAY_OF_MONTH,calEnd.getActualMinimum(Calendar.DAY_OF_MONTH)); + list.add((calEnd.getTimeInMillis() / 1000)-1); + return list; + } + + /** + * 返回今年开始和结束的时间戳 + * @author fzr + * @return List + */ + public static List year() { + List list = new ArrayList<>(); + // 开始时间 + Calendar calStart = Calendar.getInstance(); + calStart.add(Calendar.YEAR, 0); + calStart.add(Calendar.DATE, 0); + calStart.add(Calendar.MONTH, 0); + calStart.set(Calendar.DAY_OF_YEAR, 1); + calStart.set(Calendar.HOUR_OF_DAY, 0); + calStart.set(Calendar.MINUTE, 0); + calStart.set(Calendar.SECOND, 0); + calStart.set(Calendar.MILLISECOND, 0); + list.add(calStart.getTimeInMillis() / 1000); + + // 结束时间 + Calendar calEnd = Calendar.getInstance(); + int year = calEnd.get(Calendar.YEAR); + calEnd.clear(); + calEnd.set(Calendar.YEAR, year); + calEnd.set(Calendar.HOUR_OF_DAY, 23); + calEnd.set(Calendar.MINUTE, 59); + calEnd.set(Calendar.SECOND, 59); + calEnd.set(Calendar.MILLISECOND, 999); + calEnd.roll(Calendar.DAY_OF_YEAR, -1); + list.add(calEnd.getTimeInMillis() / 1000); + return list; + } + + /** + * 返回去年开始和结束的时间戳 + * @author fzr + * @return List + */ + public static List lastYear() { + List list = new ArrayList<>(); + // 开始时间 + Calendar calStart = Calendar.getInstance(); + calStart.add(Calendar.YEAR, -1); + calStart.set(Calendar.HOUR_OF_DAY, 0); + calStart.set(Calendar.DAY_OF_YEAR, 1); + calStart.set(Calendar.MINUTE, 0); + calStart.set(Calendar.SECOND, 0); + calStart.set(Calendar.MILLISECOND, 0); + list.add(calStart.getTimeInMillis() / 1000); + + // 结束时间 + Calendar calEnd = Calendar.getInstance(); + calEnd.add(Calendar.YEAR, -1); + calEnd.set(Calendar.MONTH, calEnd.getActualMaximum(Calendar.MONTH)); + calEnd.set(Calendar.DAY_OF_MONTH, calEnd.getActualMaximum(Calendar.DAY_OF_MONTH)); + calEnd.set(Calendar.HOUR_OF_DAY, 23); + calEnd.set(Calendar.MINUTE, 59); + calEnd.set(Calendar.SECOND, 59); + calEnd.set(Calendar.MILLISECOND, 999); + list.add(calEnd.getTimeInMillis() / 1000); + return list; + } + + /** + * 获取几天前零点到现在/昨日结束的时间戳 + * @author fzr + * @return List + */ + public static List dayToNow(int day) { + List today = TimeUtil.today(); + List list = new ArrayList<>(); + list.add(today.get(0) - day * 86400L); + list.add(today.get(0) -1); + return list; + } + + /** + * 返回几天前的时间戳 + * @author fzr + * @param day (天) + * @return Long + */ + public Long daysAgo(long day) { + long currTime = System.currentTimeMillis() / 1000; + return currTime - (day * 86400); + } + + /** + * 返回几天后的时间戳 + * @author fzr + * @param day (天) + * @return Long + */ + public Long daysAfter(long day) { + long currTime = System.currentTimeMillis() / 1000; + return currTime + (day * 86400); + } + + /** + * 返回月份第几天 + * @author fzr + * @return int + */ + public static long monthDay(){ + Date date = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.DAY_OF_MONTH); + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/ToolsUtil.java b/like-common/src/main/java/com/hxkj/common/utils/ToolsUtil.java new file mode 100644 index 00000000..65d72c73 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/ToolsUtil.java @@ -0,0 +1,79 @@ +package com.hxkj.common.utils; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.util.Random; +import java.util.UUID; + +public class ToolsUtil { + + /** + * 制作UUID + * + * @author fzr + * @return String + */ + public static String makeUUID(){ + return UUID.randomUUID().toString().replaceAll("-","").substring(0,32); + } + + /** + * 制作MD5 + * + * @author fzr + * @param data 需加密的数据 + * @return String + */ + public static String makeMd5(String data){ + try { + MessageDigest md5 = MessageDigest.getInstance("MD5"); + byte [] array = md5.digest(data.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString(); + }catch (Exception e){ + e.printStackTrace(); + } + return null; + } + + /** + * 返回随机字符串 + * + * @author fzr + * @param length 要生成的长度 + * @return String + */ + public static String randomString(int length) { + Random random = new Random(); + StringBuilder stringBuffer = new StringBuilder(); + String str = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + int strLength = str.length(); + for (int i = 0; i < length; i++) { + int index = random.nextInt(strLength); + stringBuffer.append(str.charAt(index)); + } + return stringBuffer.toString(); + } + + /** + * 返回随机数字字符串 + * + * @author fzr + * @param length 要生成的长度 + * @return String + */ + public static String randomInt(int length) { + Random random = new Random(); + StringBuilder stringBuffer = new StringBuilder(); + String str = "0123456789"; + for (int i = 0; i < length; i++) { + int index = random.nextInt(10); + stringBuffer.append(str.charAt(index)); + } + return stringBuffer.toString(); + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/utils/UrlUtil.java b/like-common/src/main/java/com/hxkj/common/utils/UrlUtil.java new file mode 100644 index 00000000..1f859f8a --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/utils/UrlUtil.java @@ -0,0 +1,39 @@ +package com.hxkj.common.utils; + +public class UrlUtil { + + /** + * 访问前缀 + */ + private static final String uploadPrefix = "upload"; + + /** + * 转绝对路径 + * + * @author fzr + * @param url 相对路径 + * @return String + */ + public static String toAbsoluteUrl(String url) { + if(url.indexOf("/")!=0) { + url = "/" + url; + } + + return HttpUtil.domain() + "/" + uploadPrefix + url; + } + + /** + * 转相对路径 + * + * @param url 绝对路径 + * @return String + */ + public static String toRelativeUrl(String url) { + if (url == null || url.equals("")) { + return ""; + } + + return url.replace(HttpUtil.domain() + "/" + uploadPrefix + "/", ""); + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/validator/IDMustValidator.java b/like-common/src/main/java/com/hxkj/common/validator/IDMustValidator.java new file mode 100644 index 00000000..1a21601d --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/validator/IDMustValidator.java @@ -0,0 +1,23 @@ +package com.hxkj.common.validator; + +import com.hxkj.common.validator.annotation.IDMust; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +/** + * 验证主键ID参数 + */ +public class IDMustValidator implements ConstraintValidator { + + @Override + public void initialize(IDMust constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) { + return value != null && value > 0; + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/validator/IntegerContainsValidator.java b/like-common/src/main/java/com/hxkj/common/validator/IntegerContainsValidator.java new file mode 100644 index 00000000..538f7661 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/validator/IntegerContainsValidator.java @@ -0,0 +1,35 @@ +package com.hxkj.common.validator; + +import com.hxkj.common.validator.annotation.IntegerContains; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.HashSet; +import java.util.Set; + +/** + * 验证数字是否在数组中 + */ +public class IntegerContainsValidator implements ConstraintValidator { + + private Set limitValues; + + @Override + public void initialize (IntegerContains integerContains) { + HashSet set = new HashSet<>(); + for (int i : integerContains.values()) { + set.add(i); + } + limitValues = set; + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + + return limitValues.contains(value); + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/validator/StringContainsValidator.java b/like-common/src/main/java/com/hxkj/common/validator/StringContainsValidator.java new file mode 100644 index 00000000..19027586 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/validator/StringContainsValidator.java @@ -0,0 +1,32 @@ +package com.hxkj.common.validator; + +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.hxkj.common.validator.annotation.StringContains; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 验证字符串是否在数组中 + */ +public class StringContainsValidator implements ConstraintValidator { + + private Set limitValues; + + @Override + public void initialize (StringContains stringContains) { + limitValues = Arrays.stream(stringContains.values()).collect(Collectors.toSet()); + } + + @Override + public boolean isValid(String value, ConstraintValidatorContext context) { + if (StringUtils.isBlank(value)) { + return true; + } + return limitValues.contains(value.trim()); + } + +} diff --git a/like-common/src/main/java/com/hxkj/common/validator/annotation/IDMust.java b/like-common/src/main/java/com/hxkj/common/validator/annotation/IDMust.java new file mode 100644 index 00000000..b994888e --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/validator/annotation/IDMust.java @@ -0,0 +1,21 @@ +package com.hxkj.common.validator.annotation; + +import com.hxkj.common.validator.IDMustValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = IDMustValidator.class) +@Target({ ElementType.PARAMETER,ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface IDMust { + + String message() default "id参数必须存在且大于0"; + + Class[] groups() default {}; + + Class[] payload() default { }; + +} diff --git a/like-common/src/main/java/com/hxkj/common/validator/annotation/IntegerContains.java b/like-common/src/main/java/com/hxkj/common/validator/annotation/IntegerContains.java new file mode 100644 index 00000000..e04a98e0 --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/validator/annotation/IntegerContains.java @@ -0,0 +1,23 @@ +package com.hxkj.common.validator.annotation; + +import com.hxkj.common.validator.IntegerContainsValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = IntegerContainsValidator.class) +@Target({ ElementType.PARAMETER,ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface IntegerContains { + + String message() default "数值不符合规则"; + + int[] values() default {}; + + Class[] groups() default {}; + + Class[] payload() default { }; + +} diff --git a/like-common/src/main/java/com/hxkj/common/validator/annotation/StringContains.java b/like-common/src/main/java/com/hxkj/common/validator/annotation/StringContains.java new file mode 100644 index 00000000..f554893b --- /dev/null +++ b/like-common/src/main/java/com/hxkj/common/validator/annotation/StringContains.java @@ -0,0 +1,23 @@ +package com.hxkj.common.validator.annotation; + +import com.hxkj.common.validator.StringContainsValidator; + +import javax.validation.Constraint; +import javax.validation.Payload; +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = StringContainsValidator.class) +@Target({ ElementType.PARAMETER,ElementType.FIELD }) +@Retention(RetentionPolicy.RUNTIME) +public @interface StringContains { + + String message() default "字符串不符合规则"; + + String[] values() default {}; + + Class[] groups() default {}; + + Class[] payload() default { }; + +} diff --git a/like-front/pom.xml b/like-front/pom.xml new file mode 100644 index 00000000..e9a89e43 --- /dev/null +++ b/like-front/pom.xml @@ -0,0 +1,19 @@ + + + + like-framework + org.hxkj + 1.0-SNAPSHOT + + 4.0.0 + + like-front + + + 1.8 + 1.8 + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..c3865756 --- /dev/null +++ b/pom.xml @@ -0,0 +1,111 @@ + + + + + org.hxkj + like-framework + pom + 1.0-SNAPSHOT + 4.0.0 + + like-admin + like-front + like-common + + + + + UTF-8 + UTF-8 + 17 + 17 + 17 + 5.1.49 + 3.4.3.1 + 1.2.2 + 1.4.0 + 1.8.0 + 1.18.22 + 1.2.78 + + + + + + + + org.springframework.boot + spring-boot-dependencies + 2.5.10 + pom + import + + + + mysql + mysql-connector-java + ${mysql-connector.version} + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + com.github.yulichang + mybatis-plus-join + ${mybatis-plus-join.version} + + + + com.github.pagehelper + pagehelper-spring-boot-starter + ${pagehelper.version} + + + + org.apache.shiro + shiro-spring + ${shiro-spring.version} + + + + org.projectlombok + lombok + ${lombok.version} + + + + com.alibaba + fastjson + ${fastJson.version} + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.6.4 + + + org.apache.maven.plugins + maven-compiler-plugin + 3.10.0 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + + + \ No newline at end of file