This commit is contained in:
TinyAnts
2022-03-25 14:33:56 +08:00
commit 448611c4a5
52 changed files with 3044 additions and 0 deletions

55
like-admin/pom.xml Normal file
View File

@@ -0,0 +1,55 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 父工程 -->
<parent>
<artifactId>like-framework</artifactId>
<groupId>org.hxkj</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 模块信息 -->
<modelVersion>4.0.0</modelVersion>
<artifactId>like-admin</artifactId>
<packaging>jar</packaging>
<!-- 特性信息 -->
<properties>
<like-common>1.0-SNAPSHOT</like-common>
</properties>
<!-- 项目管理 -->
<dependencies>
<!-- 公共依赖 -->
<dependency>
<groupId>org.hxkj</groupId>
<artifactId>like-common</artifactId>
<version>${like-common}</version>
</dependency>
<!-- Shiro鉴权依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
</dependency>
</dependencies>
<!-- 插件管理 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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, "");
}
}

View File

@@ -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<String, String> 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();
}
}

View File

@@ -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<SysAdmin> 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 "密码错误";
}
}
}

View File

@@ -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<SysAdminListVo> 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();
}
}

View File

@@ -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();
}
}

View File

@@ -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<SysRoleListVo> 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();
}
}

View File

@@ -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<SysAdmin> {
/**
* 获取管理员列表
*
* @author fzr
* @param pageParam 分页参数
* @return PageResult<SysAdminListVo>
*/
PageResult<SysAdminListVo> 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);
}

View File

@@ -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<SysMenu> {
JSONArray lists();
SysMenu detail(Integer id);
void add(SysMenuParam sysMenuParam);
void edit(SysMenuParam sysMenuParam);
void del(Integer id);
}

View File

@@ -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<SysRole> {
/**
* 根据id获取角色名称
* @param id 角色ID
* @return String
*/
String getRoleNameById(Integer id);
/**
* 角色列表
*
* @author fzr
* @param pageParam 参数
* @return PageResult<SysRoleListVo>
*/
PageResult<SysRoleListVo> 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);
}

View File

@@ -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<SysAdminMapper, SysAdmin> implements ISysAdminService {
@Resource
ISysRoleService iSysRoleService;
/**
* 获取管理员列表
*
* @author fzr
* @param pageParam 分页参数
* @return PageResult<SysAdminListVo>
*/
@Override
public PageResult<SysAdminListVo> lists(PageParam pageParam) {
Integer page = pageParam.getPageNo();
Integer limit = pageParam.getPageSize();
QueryWrapper<SysAdmin> 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<SysAdmin> iPage = this.page(new Page<>(page, limit), queryWrapper);
List<SysAdminListVo> 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<SysAdmin>()
.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<SysAdmin>()
.select(field)
.eq("is_delete", 0)
.eq("username", sysAdminParam.getUsername())
.last("limit 1")), "账号已存在换一个吧!");
Assert.isNull(this.getOne(new QueryWrapper<SysAdmin>()
.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<SysAdmin>()
.select(field)
.eq("is_delete", 0)
.eq("username", sysAdminParam.getUsername())
.ne("id", sysAdminParam.getId())
.last("limit 1")), "账号已存在换一个吧!");
Assert.isNull(this.getOne(new QueryWrapper<SysAdmin>()
.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<SysAdmin>()
.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);
}
}

View File

@@ -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<SysMenuMapper, SysMenu> implements ISysMenuService {
/**
* 菜单列表
*
* @author fzr
* @return JSONArray
*/
@Override
public JSONArray lists() {
QueryWrapper<SysMenu> 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<SysMenu> sysMenus = this.list( queryWrapper);
List<SysMenuListVo> 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<SysMenu>()
.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<SysMenu>()
.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<SysMenu>()
.eq("id", id)
.eq("is_delete", 0));
Assert.notNull(model, "菜单已不存在!");
model.setId(id);
model.setIsDelete(true);
model.setDeleteTime(System.currentTimeMillis() / 1000);
this.updateById(model);
}
}

View File

@@ -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<SysRoleMapper, SysRole> implements ISysRoleService {
/**
* 根据ID获取角色名称
*
* @author fzr
* @param id 角色ID
* @return String
*/
@Override
public String getRoleNameById(Integer id) {
QueryWrapper<SysRole> 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<SysRoleListVo>
*/
@Override
public PageResult<SysRoleListVo> lists(@Validated PageParam pageParam) {
Integer page = pageParam.getPageNo();
Integer limit = pageParam.getPageSize();
QueryWrapper<SysRole> 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<SysRole> iPage = this.page(new Page<>(page, limit), queryWrapper);
List<SysRoleListVo> 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<SysRole>()
.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<SysRole>()
.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<SysRole>()
.select("id,name")
.eq("id", sysRoleParam.getId())
.eq("is_delete", 0)
.last("limit 1")), "角色已不存在!");
Assert.isNull(this.getOne(new QueryWrapper<SysRole>()
.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<SysRole>()
.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);
}
}

View File

@@ -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;
}

View File

@@ -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 = "";
}

View File

@@ -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;
}

View File

@@ -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 = "";
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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_ # 设置表前缀

72
like-common/pom.xml Normal file
View File

@@ -0,0 +1,72 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 父工程 -->
<parent>
<groupId>org.hxkj</groupId>
<artifactId>like-framework</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 模块信息 -->
<modelVersion>4.0.0</modelVersion>
<artifactId>like-common</artifactId>
<name>like-common</name>
<!-- 依赖管理 -->
<dependencies>
<!-- Config依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!-- Web依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Aop依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- Validation依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Mysql连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- MyBatisPlus依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- MyBatisPlusJoin依赖 -->
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join</artifactId>
</dependency>
<!-- MyBatis分页依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<!-- Lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -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);
}
}

View File

@@ -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<T> {
private Long count; //总记录数
private Integer pageNo; //当前页码
private Integer pageSize; //每页条数
private List<T> lists; //数据列表
/**
* PageHelper分页
*
* @author fzr
* @param list 分页数据集
* @param <T> 实体类型
* @return PageList
*/
public static <T> PageResult<T> pageHelper(List<T> list) {
PageResult<T> pageResult = new PageResult<T>();
PageInfo<T> 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 <T> 实体类型
* @return PageList
*/
public static <T> PageResult<T> iPageHandle(IPage<T> iPage) {
PageResult<T> pageResult = new PageResult<T>();
pageResult.setCount(iPage.getTotal());
pageResult.setPageNo((int) iPage.getCurrent());
pageResult.setPageSize((int) iPage.getSize());
pageResult.setLists(iPage.getRecords());
return pageResult;
}
/**
* MyBatisPlus分页
*
* @author fzr
* @param <T> 实体类型
* @return PageList
*/
public static <T> PageResult<T> iPageHandle(Long total, Long pageNo, Long size, List<T> lists) {
PageResult<T> pageResult = new PageResult<T>();
pageResult.setCount(total);
pageResult.setPageNo(Math.toIntExact(pageNo));
pageResult.setPageSize(Math.toIntExact(size));
pageResult.setLists(lists);
return pageResult;
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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<SysAdmin> {
}

View File

@@ -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<SysMenu> {
}

View File

@@ -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<SysRole> {
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,4 @@
package com.hxkj.common.utils;
public class ConfigUtil {
}

View File

@@ -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<String> 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 "";
}
}

View File

@@ -0,0 +1,4 @@
package com.hxkj.common.utils;
public class RedisUtil {
}

View File

@@ -0,0 +1,4 @@
package com.hxkj.common.utils;
public class SpringUtil {
}

View File

@@ -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();
}
}
}

View File

@@ -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<String, String> 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:342014/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<Long> today() {
List<Long> 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<Long> yesterday() {
List<Long> today = TimeUtil.today();
List<Long> list = new ArrayList<>();
list.add(today.get(0) - 86400);
list.add(today.get(1) - 86400);
return list;
}
/**
* 返回本周开始和结束的时间戳
* @author fzr
* @return List
*/
public static List<Long> week() {
List<Long> 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<Long> lastWeek() {
List<Long> week = TimeUtil.week();
List<Long> 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<Long> month() {
List<Long> 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<Long> lastMonth() {
List<Long> 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<Long> year() {
List<Long> 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<Long> lastYear() {
List<Long> 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<Long> dayToNow(int day) {
List<Long> today = TimeUtil.today();
List<Long> 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);
}
}

View File

@@ -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();
}
}

View File

@@ -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 + "/", "");
}
}

View File

@@ -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<IDMust, Integer> {
@Override
public void initialize(IDMust constraintAnnotation) {
ConstraintValidator.super.initialize(constraintAnnotation);
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
return value != null && value > 0;
}
}

View File

@@ -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<IntegerContains, Integer> {
private Set<Integer> limitValues;
@Override
public void initialize (IntegerContains integerContains) {
HashSet<Integer> 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);
}
}

View File

@@ -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<StringContains, String> {
private Set<String> 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());
}
}

View File

@@ -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<? extends Payload>[] payload() default { };
}

View File

@@ -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<? extends Payload>[] payload() default { };
}

View File

@@ -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<? extends Payload>[] payload() default { };
}

19
like-front/pom.xml Normal file
View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>like-framework</artifactId>
<groupId>org.hxkj</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>like-front</artifactId>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>

111
pom.xml Normal file
View File

@@ -0,0 +1,111 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 模块信息 -->
<groupId>org.hxkj</groupId>
<artifactId>like-framework</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<modules>
<module>like-admin</module>
<module>like-front</module>
<module>like-common</module>
</modules>
<!-- 特性信息 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<java.version>17</java.version>
<mysql-connector.version>5.1.49</mysql-connector.version>
<mybatis-plus.version>3.4.3.1</mybatis-plus.version>
<mybatis-plus-join.version>1.2.2</mybatis-plus-join.version>
<pagehelper.version>1.4.0</pagehelper.version>
<shiro-spring.version>1.8.0</shiro-spring.version>
<lombok.version>1.18.22</lombok.version>
<fastJson.version>1.2.78</fastJson.version>
</properties>
<!-- 依赖声明 -->
<dependencyManagement>
<dependencies>
<!-- SpringBoot依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.10</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Mysql连接依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<!-- MyBatisPlus依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- MyBatisPlusJoin依赖 -->
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join</artifactId>
<version>${mybatis-plus-join.version}</version>
</dependency>
<!-- MyBatis分页依赖 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- Shiro鉴权依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro-spring.version}</version>
</dependency>
<!-- Lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastJson.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 插件管理 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.4</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>