增加文章接口 以及bug处理

This commit is contained in:
TinyAnts 2022-04-02 16:46:26 +08:00
parent 7fb4668c52
commit 0b4ed60d0d
62 changed files with 1370 additions and 71 deletions

View File

@ -2,7 +2,7 @@ package com.hxkj.admin;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.hxkj.admin.config.SystemConfig;
import com.hxkj.admin.config.AdminConfig;
import com.hxkj.admin.service.ISystemAdminService;
import com.hxkj.admin.service.ISystemRoleMenuService;
import com.hxkj.common.core.AjaxResult;
@ -34,19 +34,26 @@ public class LikeAdminInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 404拦截
response.setContentType("application/json;charset=utf-8");
if (response.getStatus() == 404) {
AjaxResult result = AjaxResult.failed(HttpEnum.REQUEST_404_ERROR.getCode(), HttpEnum.REQUEST_404_ERROR.getMsg());
response.getWriter().print(JSON.toJSONString(result));
return false;
}
// 判断请求接口
if (!(handler instanceof HandlerMethod)) {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
// 免登录接口
List<String> notLoginUri = Arrays.asList(SystemConfig.notLoginUri);
List<String> notLoginUri = Arrays.asList(AdminConfig.notLoginUri);
if (notLoginUri.contains(request.getRequestURI())) {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
// Token是否为空
response.setContentType("application/json;charset=utf-8");
String token = request.getHeader("token");
if (StringUtils.isBlank(token)) {
AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_EMPTY.getCode(), HttpEnum.TOKEN_EMPTY.getMsg());
@ -55,7 +62,7 @@ public class LikeAdminInterceptor implements HandlerInterceptor {
}
// Token是否过期
token = SystemConfig.backstageTokenKey + token;
token = AdminConfig.backstageTokenKey + token;
if (!RedisUtil.exists(token)) {
AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_INVALID.getCode(), HttpEnum.TOKEN_INVALID.getMsg());
response.getWriter().print(JSON.toJSONString(result));
@ -64,15 +71,15 @@ public class LikeAdminInterceptor implements HandlerInterceptor {
// 用户信息缓存
String uid = RedisUtil.get(token).toString();
if (!RedisUtil.hExists(SystemConfig.backstageManageKey, uid)) {
if (!RedisUtil.hExists(AdminConfig.backstageManageKey, uid)) {
iSystemAdminService.cacheAdminUserByUid(Integer.parseInt(uid));
}
// 校验用户被删除
Map<String, Object> map = ToolsUtil.jsonToMap(RedisUtil.hGet(SystemConfig.backstageManageKey, uid).toString());
Map<String, Object> map = ToolsUtil.jsonToMap(RedisUtil.hGet(AdminConfig.backstageManageKey, uid).toString());
if (map == null || map.get("isDelete").toString().equals("1")) {
RedisUtil.del(token);
RedisUtil.hDel(SystemConfig.backstageManageKey, uid);
RedisUtil.hDel(AdminConfig.backstageManageKey, uid);
AjaxResult result = AjaxResult.failed(HttpEnum.TOKEN_INVALID.getCode(), HttpEnum.TOKEN_INVALID.getMsg());
response.getWriter().print(JSON.toJSONString(result));
return false;
@ -97,19 +104,19 @@ public class LikeAdminInterceptor implements HandlerInterceptor {
LikeAdminThreadLocal.put("nickname", map.get("nickname").toString());
// 免权限验证接口
List<String> notAuthUri = Arrays.asList(SystemConfig.notLoginUri);
List<String> notAuthUri = Arrays.asList(AdminConfig.notLoginUri);
if (notAuthUri.contains(request.getRequestURI()) || Integer.parseInt(uid) == 1) {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
// 校验角色权限是否存在
String roleId = map.get("role").toString();
if (!RedisUtil.hExists(SystemConfig.backstageRolesKey, roleId)) {
if (!RedisUtil.hExists(AdminConfig.backstageRolesKey, roleId)) {
iSystemRoleMenuService.cacheRoleMenusByRoleId(Integer.parseInt(roleId));
}
// 验证是否有权限操作
String menus = RedisUtil.hGet(SystemConfig.backstageRolesKey, roleId).toString();
String menus = RedisUtil.hGet(AdminConfig.backstageRolesKey, roleId).toString();
if (menus.equals("") || !Arrays.asList(menus.split(",")).contains(request.getRequestURI())) {
AjaxResult result = AjaxResult.failed(HttpEnum.NO_PERMISSION.getCode(), HttpEnum.NO_PERMISSION.getMsg());
response.getWriter().print(JSON.toJSONString(result));

View File

@ -17,7 +17,6 @@ public class LikeAdminThreadLocal {
*/
private static final java.lang.ThreadLocal<LinkedHashMap<String, Object>> MY_LOCAL = new java.lang.ThreadLocal<>();
/**
* 写入本地线程
*/

View File

@ -1,9 +1,9 @@
package com.hxkj.admin.config;
/**
* 系统配置
* 后台公共配置
*/
public class SystemConfig {
public class AdminConfig {
// 管理缓存键
public static final String backstageManageKey = "backstage:manage";

View File

@ -5,6 +5,9 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MybatisPlus配置
*/
@Configuration
public class MybatisPlusConfig {

View File

@ -11,6 +11,9 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
/**
* Web配置
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

View File

@ -1,6 +1,7 @@
package com.hxkj.admin.controller;
import com.alibaba.fastjson.JSONArray;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.admin.service.IAlbumService;
import com.hxkj.admin.validate.AlbumParam;
import com.hxkj.admin.validate.PageParam;
@ -42,6 +43,7 @@ public class AlbumController {
* @author fzr
* @return Object
*/
@Log(title = "相册重命名")
@PostMapping("/albumRename")
public Object albumRename(@Validated(value = AlbumParam.rename.class) @RequestBody AlbumParam albumParam) {
iAlbumService.albumRename(albumParam.getId(), albumParam.getName());
@ -54,6 +56,7 @@ public class AlbumController {
* @author fzr
* @return Object
*/
@Log(title = "相册移动")
@PostMapping("/albumMove")
public Object albumMove(@Validated(value = AlbumParam.albumMove.class) @RequestBody AlbumParam albumParam) {
iAlbumService.albumMove(albumParam.getId(), albumParam.getCid());
@ -66,6 +69,7 @@ public class AlbumController {
* @author fzr
* @return Object
*/
@Log(title = "相册删除")
@PostMapping("/albumDel")
public Object albumDel(@Validated(value = AlbumParam.delete.class) @RequestBody AlbumParam albumParam) {
iAlbumService.albumDel(albumParam.getId());
@ -90,6 +94,7 @@ public class AlbumController {
* @author fzr
* @return Object
*/
@Log(title = "相册分类新增")
@PostMapping("/cateAdd")
public Object cateAdd(@Validated(value = AlbumParam.cateAdd.class) @RequestBody AlbumParam albumParam) {
iAlbumService.cateAdd(albumParam);
@ -102,6 +107,7 @@ public class AlbumController {
* @author fzr
* @return Object
*/
@Log(title = "相册分类重命名")
@PostMapping("/cateRename")
public Object cateRename(@Validated(value = AlbumParam.rename.class) @RequestBody AlbumParam albumParam) {
iAlbumService.cateRename(albumParam.getId(), albumParam.getName());
@ -109,11 +115,12 @@ public class AlbumController {
}
/**
* 分类重命名
* 分类删除
*
* @author fzr
* @return Object
*/
@Log(title = "相册分类删除")
@PostMapping("/cateDel")
public Object cateDel(@Validated(value = AlbumParam.delete.class) @RequestBody AlbumParam albumParam) {
iAlbumService.cateDel(albumParam.getId());

View File

@ -0,0 +1,206 @@
package com.hxkj.admin.controller;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.admin.service.IArticleService;
import com.hxkj.admin.validate.article.CategoryParam;
import com.hxkj.admin.validate.article.ArticleParam;
import com.hxkj.admin.validate.PageParam;
import com.hxkj.admin.vo.article.ArticleDetailVo;
import com.hxkj.admin.vo.article.ArticleListVo;
import com.hxkj.admin.vo.article.CategoryVo;
import com.hxkj.common.core.AjaxResult;
import com.hxkj.common.core.PageResult;
import com.hxkj.common.validator.annotation.IDMust;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Map;
@RestController
@RequestMapping("/api/article")
public class ArticleController {
@Resource
IArticleService iArticleService;
/**
* 文章列表
*
* @author fzr
* @param pageParam 分页参数
* @param params 搜索参数
* @return Object
*/
@GetMapping("/articleList")
public Object articleList(@Validated PageParam pageParam,
@RequestParam Map<String, String> params) {
PageResult<ArticleListVo> vos = iArticleService.articleList(pageParam, params);
return AjaxResult.success(vos);
}
/**
* 文章列表
*
* @author fzr
* @param id 文章ID
* @return Object
*/
@GetMapping("/articleDetail")
public Object articleDetail(@Validated @IDMust() @RequestParam("id") Integer id) {
try {
ArticleDetailVo vo = iArticleService.articleDetail(id);
return AjaxResult.success(vo);
} catch (Exception e) {
return AjaxResult.failed(e.getMessage());
}
}
/**
* 文章新增
*
* @author fzr
* @param articleParam 文章参数
* @return Object
*/
@Log(title = "文章新增")
@PostMapping("/articleAdd")
public Object articleAdd(
@Validated(value = ArticleParam.create.class)
@RequestBody ArticleParam articleParam) {
try {
iArticleService.articleAdd(articleParam);
return AjaxResult.success();
} catch (Exception e) {
return AjaxResult.failed(e.getMessage());
}
}
/**
* 文章编辑
*
* @author fzr
* @param articleParam 文章参数
* @return Object
*/
@Log(title = "文章编辑")
@PostMapping("/articleEdit")
public Object articleEdit(@Validated(value = ArticleParam.update.class)
@RequestBody ArticleParam articleParam) {
try {
iArticleService.articleEdit(articleParam);
return AjaxResult.success();
} catch (Exception e) {
return AjaxResult.failed(e.getMessage());
}
}
/**
* 文章删除
*
* @author fzr
* @param articleParam 文章参数
* @return Object
*/
@Log(title = "文章删除")
@PostMapping("/articleDel")
public Object articleDel(@Validated(value = ArticleParam.delete.class)
@RequestBody ArticleParam articleParam) {
try {
iArticleService.articleDel(articleParam.getId());
return AjaxResult.success();
} catch (Exception e) {
return AjaxResult.failed(e.getMessage());
}
}
/**
* 分类列表
*
* @author fzr
* @param pageParam 分页参数
* @param params 搜索参数
* @return Object
*/
@GetMapping("/cateList")
public Object cateList(@Validated PageParam pageParam,
@RequestParam Map<String, String> params) {
try {
PageResult<CategoryVo> voPageResult = iArticleService.cateList(pageParam, params);
return AjaxResult.success(voPageResult);
} catch (Exception e) {
return AjaxResult.failed(e.getMessage());
}
}
/**
* 分类详情
*
* @author fzr
* @param id 主键
* @return Object
*/
@GetMapping("/cateDetail")
public Object cateDetail(@Validated @IDMust() @RequestParam("id") Integer id) {
CategoryVo vo = iArticleService.cateDetail(id);
return AjaxResult.success(vo);
}
/**
* 分类新增
*
* @author fzr
* @param articleCateParam 分类参数
* @return Object
*/
@Log(title = "文章分类新增")
@PostMapping("/cateAdd")
public Object cateAdd(@Validated(value = CategoryParam.create.class)
@RequestBody CategoryParam articleCateParam) {
try {
iArticleService.cateAdd(articleCateParam);
return AjaxResult.success();
} catch (Exception e) {
return AjaxResult.failed(e.getMessage());
}
}
/**
* 分类编辑
*
* @author fzr
* @param articleCateParam 分类编辑
* @return Object
*/
@Log(title = "文章分类编辑")
@PostMapping("/cateEdit")
public Object cateEdit(@Validated(value = CategoryParam.update.class)
@RequestBody CategoryParam articleCateParam) {
try {
iArticleService.cateEdit(articleCateParam);
return AjaxResult.success();
} catch (Exception e) {
return AjaxResult.failed(e.getMessage());
}
}
/**
* 分类删除
*
* @author fzr
* @param articleCateParam 分类删除
* @return Object
*/
@Log(title = "文章分类删除")
@PostMapping("/cateDel")
public Object cateDel(@Validated(value = CategoryParam.delete.class)
@RequestBody CategoryParam articleCateParam) {
try {
iArticleService.cateDel(articleCateParam.getId());
return AjaxResult.success();
} catch (Exception e) {
return AjaxResult.failed(e.getMessage());
}
}
}

View File

@ -1,6 +1,7 @@
package com.hxkj.admin.controller;
import com.hxkj.admin.LikeAdminThreadLocal;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.admin.service.IAlbumService;
import com.hxkj.common.core.AjaxResult;
import com.hxkj.common.enums.AlbumEnum;
@ -34,6 +35,7 @@ public class UploadController {
* @param request 请求对象
* @return Object
*/
@Log(title = "上传图片")
@PostMapping("/image")
public Object image(HttpServletRequest request) {
MultipartFile multipartFile = ((MultipartRequest) request).getFile("file");
@ -69,6 +71,7 @@ public class UploadController {
* @param request 请求对象
* @return Object
*/
@Log(title = "上传视频")
@PostMapping("/video")
public Object video(HttpServletRequest request) {
MultipartFile multipartFile = ((MultipartRequest) request).getFile("file");

View File

@ -1,6 +1,7 @@
package com.hxkj.admin.controller.monitor;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.common.core.AjaxResult;
import com.hxkj.common.utils.StringUtil;
import org.springframework.data.redis.connection.RedisServerCommands;
@ -29,6 +30,7 @@ public class CacheController {
* @author fzr
* @return Object
*/
@Log(title = "缓存监控")
@GetMapping("/cache")
public Object info() {
Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) RedisServerCommands::info);

View File

@ -1,5 +1,6 @@
package com.hxkj.admin.controller.monitor;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.common.core.AjaxResult;
import com.hxkj.common.core.ServerResult;
import org.springframework.web.bind.annotation.GetMapping;
@ -18,6 +19,7 @@ public class ServerController {
* @author fzr
* @return Object
*/
@Log(title = "服务监控")
@GetMapping("/server")
public Object info() {
ServerResult server = new ServerResult();

View File

@ -1,5 +1,6 @@
package com.hxkj.admin.controller.setting;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.admin.service.IBasicsService;
import com.hxkj.common.core.AjaxResult;
import com.hxkj.common.utils.HttpUtil;
@ -26,6 +27,7 @@ public class BasicsController {
* @author fzr
* @return Object
*/
@Log(title = "网站信息")
@RequestMapping("/website")
public Object website(@RequestBody Map<String, String> params) {
if (HttpUtil.isGet()) {
@ -47,6 +49,7 @@ public class BasicsController {
* @author fzr
* @return Object
*/
@Log(title = "备案信息")
@RequestMapping("/copyright")
public Object copyright(@RequestBody Map<String, String> params) {
if (HttpUtil.isGet()) {

View File

@ -1,5 +1,6 @@
package com.hxkj.admin.controller.system;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.admin.service.ISystemAdminService;
import com.hxkj.admin.validate.PageParam;
import com.hxkj.admin.validate.system.SystemAdminParam;
@ -55,6 +56,7 @@ public class SystemAdminController {
* @param systemAdminParam 参数
* @return Object
*/
@Log(title = "管理员新增")
@PostMapping("/add")
public Object add(@Validated(value = SystemAdminParam.create.class) @RequestBody SystemAdminParam systemAdminParam) {
iSystemAdminService.add(systemAdminParam);
@ -68,6 +70,7 @@ public class SystemAdminController {
* @param systemAdminParam 参数
* @return Object
*/
@Log(title = "管理员编辑")
@PostMapping("/edit")
public Object edit(@Validated(value = SystemAdminParam.update.class) @RequestBody SystemAdminParam systemAdminParam) {
iSystemAdminService.edit(systemAdminParam);
@ -80,6 +83,7 @@ public class SystemAdminController {
* @author fzr
* @return Object
*/
@Log(title = "管理员删除")
@PostMapping("/del")
public Object del(@Validated(value = SystemAdminParam.delete.class) @RequestBody SystemAdminParam systemAdminParam) {
iSystemAdminService.del(systemAdminParam.getId());

View File

@ -2,6 +2,7 @@ package com.hxkj.admin.controller.system;
import com.alibaba.fastjson.JSONArray;
import com.hxkj.admin.LikeAdminThreadLocal;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.admin.service.ISystemMenuService;
import com.hxkj.admin.validate.system.SystemMenuParam;
import com.hxkj.admin.vo.system.SystemMenuVo;
@ -65,6 +66,7 @@ public class SystemMenuController {
* @author fzr
* @return Object
*/
@Log(title = "菜单新增")
@PostMapping("/add")
public Object add(@Validated(value = SystemMenuParam.create.class) @RequestBody SystemMenuParam systemMenuParam) {
iSystemMenuService.add(systemMenuParam);
@ -77,6 +79,7 @@ public class SystemMenuController {
* @author fzr
* @return Object
*/
@Log(title = "菜单编辑")
@PostMapping("/edit")
public Object edit(@Validated(value = SystemMenuParam.update.class) @RequestBody SystemMenuParam systemMenuParam) {
iSystemMenuService.edit(systemMenuParam);
@ -89,6 +92,7 @@ public class SystemMenuController {
* @author fzr
* @return Object
*/
@Log(title = "菜单删除")
@PostMapping("/del")
public Object del(@Validated(value = SystemMenuParam.delete.class) @RequestBody SystemMenuParam systemMenuParam) {
iSystemMenuService.del(systemMenuParam.getId());

View File

@ -1,5 +1,6 @@
package com.hxkj.admin.controller.system;
import com.hxkj.admin.config.aop.Log;
import com.hxkj.admin.service.ISystemRoleService;
import com.hxkj.admin.validate.PageParam;
import com.hxkj.admin.validate.system.SystemRoleParam;
@ -29,6 +30,7 @@ public class SystemRoleController {
* @param pageParam 分页参数
* @return Object
*/
@Log(title = "角色列表")
@GetMapping("/lists")
public Object lists(@Validated PageParam pageParam) {
PageResult<SystemRoleVo> lists = iSystemRoleService.lists(pageParam);
@ -41,6 +43,7 @@ public class SystemRoleController {
* @author fzr
* @return Object
*/
@Log(title = "角色详情")
@GetMapping("/detail")
public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) {
SystemRoleVo vo = iSystemRoleService.detail(id);
@ -54,6 +57,7 @@ public class SystemRoleController {
* @param systemRoleParam 角色参数
* @return Object
*/
@Log(title = "角色新增")
@PostMapping("/add")
public Object add(@Validated(value = SystemRoleParam.create.class) @RequestBody SystemRoleParam systemRoleParam) {
iSystemRoleService.add(systemRoleParam);
@ -67,6 +71,7 @@ public class SystemRoleController {
* @param systemRoleParam 角色参数
* @return Object
*/
@Log(title = "角色编辑")
@PostMapping("/edit")
public Object edit(@Validated(value = SystemRoleParam.create.class) @RequestBody SystemRoleParam systemRoleParam) {
iSystemRoleService.edit(systemRoleParam);
@ -80,6 +85,7 @@ public class SystemRoleController {
* @param systemRoleParam 角色参数
* @return Object
*/
@Log(title = "角色删除")
@PostMapping("/del")
public Object del(@Validated(value = SystemRoleParam.delete.class) @RequestBody SystemRoleParam systemRoleParam) {
iSystemRoleService.del(systemRoleParam.getId());

View File

@ -9,7 +9,7 @@ import com.hxkj.common.core.PageResult;
import java.util.Map;
/**
* 相册服务
* 相册服务接口
*/
public interface IAlbumService {

View File

@ -0,0 +1,102 @@
package com.hxkj.admin.service;
import com.hxkj.admin.validate.PageParam;
import com.hxkj.admin.validate.article.CategoryParam;
import com.hxkj.admin.validate.article.ArticleParam;
import com.hxkj.admin.vo.article.ArticleDetailVo;
import com.hxkj.admin.vo.article.ArticleListVo;
import com.hxkj.admin.vo.article.CategoryVo;
import com.hxkj.common.core.PageResult;
import java.util.Map;
/**
* 文章服务接口类
*/
public interface IArticleService {
/**
* 文章列表
*
* @author fzr
* @param pageParam 分页参数
* @param params 搜索参数
* @return PageResult<ArticleListVo>
*/
PageResult<ArticleListVo> articleList(PageParam pageParam, Map<String, String> params);
/**
* 文章详情
*
* @author fzr
* @param id 主键ID
*/
ArticleDetailVo articleDetail(Integer id);
/**
* 文章新增
*
* @author fzr
* @param articleParam 文章参数
*/
void articleAdd(ArticleParam articleParam);
/**
* 文章编辑
*
* @author fzr
* @param articleParam 文章参数
*/
void articleEdit(ArticleParam articleParam);
/**
* 文章删除
*
* @author fzr
* @param id 文章主键
*/
void articleDel(Integer id);
/**
* 分类列表
*
* @author fzr
* @param pageParam 分页参数
* @param params 搜索参数
* @return PageResult<CategoryVo>
*/
PageResult<CategoryVo> cateList(PageParam pageParam, Map<String, String> params);
/**
* 分类详情
*
* @author fzr
* @param id 分类ID
*/
CategoryVo cateDetail(Integer id);
/**
* 分类新增
*
* @author fzr
* @param articleCateParam 分类参数
*/
void cateAdd(CategoryParam articleCateParam);
/**
* 分类编辑
*
* @author fzr
* @param articleCateParam 分类参数
*/
void cateEdit(CategoryParam articleCateParam);
/**
* 分类删除
*
* @author fzr
* @param id 分类ID
*/
void cateDel(Integer id);
}

View File

@ -3,7 +3,7 @@ package com.hxkj.admin.service;
import java.util.Map;
/**
* 基础配置服务
* 基础配置服务接口
*/
public interface IBasicsService {

View File

@ -3,7 +3,7 @@ package com.hxkj.admin.service;
import java.util.Map;
/**
* 主页服务
* 主页服务接口
*/
public interface IIndexService {

View File

@ -9,7 +9,7 @@ import com.hxkj.common.entity.system.SystemAdmin;
import java.util.Map;
/**
* 系统管理员服务
* 系统管理员服务接口类
*/
public interface ISystemAdminService {

View File

@ -8,7 +8,7 @@ import com.hxkj.common.core.PageResult;
import java.util.Map;
/**
* 系统日志服务类
* 系统日志服务类接口类
*/
public interface ISystemLogServer {

View File

@ -5,7 +5,7 @@ import com.hxkj.admin.validate.system.SystemLoginParam;
import java.util.Map;
/**
* 系统登录服务
* 系统登录服务接口类
*/
public interface ISystemLoginService {

View File

@ -5,7 +5,7 @@ import com.hxkj.admin.validate.system.SystemMenuParam;
import com.hxkj.admin.vo.system.SystemMenuVo;
/**
* 系统菜单服务
* 系统菜单服务接口类
*/
public interface ISystemMenuService {

View File

@ -3,7 +3,7 @@ package com.hxkj.admin.service;
import java.util.List;
/**
* 系统角色菜单服务
* 系统角色菜单服务接口类
*/
public interface ISystemRoleMenuService {

View File

@ -7,7 +7,7 @@ import com.hxkj.common.core.PageResult;
import org.springframework.validation.annotation.Validated;
/**
* 系统角色服务
* 系统角色服务接口类
*/
public interface ISystemRoleService {

View File

@ -28,8 +28,11 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* 相册服务实现类
*/
@Service
public class IAlbumServiceImpl implements IAlbumService {
public class AlbumServiceImpl implements IAlbumService {
@Resource
AlbumMapper albumMapper;

View File

@ -0,0 +1,298 @@
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.extension.plugins.pagination.Page;
import com.github.yulichang.query.MPJQueryWrapper;
import com.hxkj.admin.service.IArticleService;
import com.hxkj.admin.validate.PageParam;
import com.hxkj.admin.validate.article.CategoryParam;
import com.hxkj.admin.validate.article.ArticleParam;
import com.hxkj.admin.vo.article.ArticleDetailVo;
import com.hxkj.admin.vo.article.ArticleListVo;
import com.hxkj.admin.vo.article.CategoryVo;
import com.hxkj.common.core.PageResult;
import com.hxkj.common.entity.Article;
import com.hxkj.common.entity.ArticleCategory;
import com.hxkj.common.mapper.ArticleCategoryMapper;
import com.hxkj.common.mapper.ArticleMapper;
import com.hxkj.common.utils.StringUtil;
import com.hxkj.common.utils.TimeUtil;
import com.hxkj.common.utils.UrlUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import javax.annotation.Resource;
import java.util.*;
/**
* 文章服务实现类
*/
@Service
public class ArticleServiceImpl implements IArticleService {
@Resource
ArticleMapper articleMapper;
@Resource
ArticleCategoryMapper articleCategoryMapper;
/**
* 文章列表
*
* @author fzr
* @param pageParam 分页参数
* @param params 搜索参数
* @return PageResult<ArticleListVo>
*/
@Override
public PageResult<ArticleListVo> articleList(PageParam pageParam, Map<String, String> params) {
Integer pageNo = pageParam.getPageNo();
Integer pageSize = pageParam.getPageSize();
MPJQueryWrapper<Article> mpjQueryWrapper = new MPJQueryWrapper<Article>()
.selectAll(Article.class)
.select("ac.name as category")
.innerJoin("ls_article_category ac ON ac.id=t.cid")
.eq("t.is_delete", 0)
.orderByDesc(Arrays.asList("t.sort", "t.id"));
IPage<ArticleListVo> iPage = articleMapper.selectJoinPage(
new Page<>(pageNo, pageSize),
ArticleListVo.class,
mpjQueryWrapper);
for (ArticleListVo vo : iPage.getRecords()) {
vo.setImage(UrlUtil.toAbsoluteUrl(vo.getImage()));
vo.setCreateTime(TimeUtil.timestampToDate(vo.getCreateTime()));
vo.setUpdateTime(TimeUtil.timestampToDate(vo.getUpdateTime()));
}
return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), iPage.getRecords());
}
/**
* 文章详情
*
* @author fzr
* @param id 主键ID
*/
@Override
public ArticleDetailVo articleDetail(Integer id) {
Article model = articleMapper.selectOne(
new QueryWrapper<Article>()
.select(Article.class, info->
!info.getColumn().equals("is_delete") &&
!info.getColumn().equals("delete_time"))
.eq("id", id)
.eq("is_delete", 0));
Assert.notNull(model, "文章不存在");
ArticleDetailVo vo = new ArticleDetailVo();
BeanUtils.copyProperties(model, vo);
vo.setContent(StringUtil.isNull(model.getContent()) ? "" : model.getContent());
vo.setImage(UrlUtil.toAbsoluteUrl(model.getImage()));
vo.setCreateTime(TimeUtil.timestampToDate(model.getCreateTime()));
vo.setUpdateTime(TimeUtil.timestampToDate(model.getUpdateTime()));
return vo;
}
/**
* 文章新增
*
* @author fzr
* @param articleParam 文章参数
*/
@Override
public void articleAdd(ArticleParam articleParam) {
Article model = new Article();
model.setCid(articleParam.getCid());
model.setTitle(articleParam.getTitle());
model.setImage(UrlUtil.toRelativeUrl(articleParam.getImage()));
model.setIntro(articleParam.getIntro());
model.setContent(articleParam.getContent());
model.setSort(articleParam.getSort());
model.setIsShow(articleParam.getIsShow());
model.setVisit(0);
model.setCreateTime(TimeUtil.timestamp());
model.setUpdateTime(TimeUtil.timestamp());
articleMapper.insert(model);
}
/**
* 文章编辑
*
* @author fzr
* @param articleParam 文章参数
*/
@Override
public void articleEdit(ArticleParam articleParam) {
Article model = articleMapper.selectOne(
new QueryWrapper<Article>()
.eq("id", articleParam.getId())
.eq("is_delete", 0));
Assert.notNull(model, "文章不存在!");
Assert.notNull(articleCategoryMapper.selectOne(
new QueryWrapper<ArticleCategory>()
.eq("id", articleParam.getCid())
.eq("is_delete", 0)), "分类不存在");
model.setCid(articleParam.getCid());
model.setTitle(articleParam.getTitle());
model.setImage(UrlUtil.toRelativeUrl(articleParam.getImage()));
model.setIntro(articleParam.getIntro());
model.setContent(articleParam.getContent());
model.setIsShow(articleParam.getIsShow());
model.setSort(articleParam.getSort());
model.setUpdateTime(TimeUtil.timestamp());
articleMapper.updateById(model);
}
/**
* 文章删除
*
* @author fzr
* @param id 文章ID
*/
@Override
public void articleDel(Integer id) {
Article article = articleMapper.selectOne(
new QueryWrapper<Article>()
.eq("id", id)
.eq("is_delete", 0));
Assert.notNull(article, "文章不存在!");
article.setIsDelete(1);
article.setDeleteTime(TimeUtil.timestamp());
articleMapper.updateById(article);
}
/**
* 分类列表
*
* @param pageParam 分页参数
* @param params 搜索参数
* @return PageResult<CategoryVo>
*/
@Override
public PageResult<CategoryVo> cateList(PageParam pageParam, Map<String, String> params) {
Integer pageNo = pageParam.getPageNo();
Integer pageSize = pageParam.getPageSize();
QueryWrapper<ArticleCategory> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "name", "sort", "is_show", "create_time", "update_time")
.eq("is_delete", 0);
IPage<ArticleCategory> iPage = articleCategoryMapper.selectPage(new Page<>(pageNo, pageSize), queryWrapper);
List<CategoryVo> list = new ArrayList<>();
for (ArticleCategory category : iPage.getRecords()) {
CategoryVo vo = new CategoryVo();
BeanUtils.copyProperties(category, vo);
vo.setCreateTime(TimeUtil.timestampToDate(vo.getCreateTime()));
vo.setUpdateTime(TimeUtil.timestampToDate(vo.getUpdateTime()));
list.add(vo);
}
return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list);
}
/**
* 分类详情
*
* @author fzr
* @param id 分类ID
* @return CategoryVo
*/
@Override
public CategoryVo cateDetail(Integer id) {
ArticleCategory model = articleCategoryMapper.selectOne(
new QueryWrapper<ArticleCategory>()
.select(ArticleCategory.class, info->
!info.getColumn().equals("is_delete") &&
!info.getColumn().equals("delete_time"))
.eq("id", id)
.eq("is_delete", 0));
Assert.notNull(model, "分类不存在");
CategoryVo vo = new CategoryVo();
BeanUtils.copyProperties(model, vo);
vo.setCreateTime(TimeUtil.timestampToDate(model.getCreateTime()));
vo.setUpdateTime(TimeUtil.timestampToDate(model.getUpdateTime()));
return vo;
}
/**
* 分类新增
*
* @author fzr
* @param categoryParam 分类参数
*/
@Override
public void cateAdd(CategoryParam categoryParam) {
ArticleCategory model = new ArticleCategory();
model.setId(categoryParam.getId());
model.setName(categoryParam.getName());
model.setSort(categoryParam.getSort());
model.setCreateTime(TimeUtil.timestamp());
model.setUpdateTime(TimeUtil.timestamp());
articleCategoryMapper.insert(model);
}
/**
* 文章编辑
*
* @author fzr
* @param categoryParam 分类参数
*/
@Override
public void cateEdit(CategoryParam categoryParam) {
ArticleCategory model = articleCategoryMapper.selectOne(
new QueryWrapper<ArticleCategory>()
.select(ArticleCategory.class, info->
!info.getColumn().equals("is_delete") &&
!info.getColumn().equals("delete_time"))
.eq("id", categoryParam.getId())
.eq("is_delete", 0));
Assert.notNull(model, "分类不存在");
model.setName(categoryParam.getName());
model.setSort(categoryParam.getSort());
model.setUpdateTime(TimeUtil.timestamp());
articleCategoryMapper.updateById(model);
}
/**
* 分类参数
*
* @author fzr
* @param id 分类ID
*/
@Override
public void cateDel(Integer id) {
ArticleCategory model = articleCategoryMapper.selectOne(
new QueryWrapper<ArticleCategory>()
.select(ArticleCategory.class, info->
!info.getColumn().equals("is_delete") &&
!info.getColumn().equals("delete_time"))
.eq("id", id)
.eq("is_delete", 0));
Assert.notNull(model, "分类不存在");
model.setIsDelete(1);
model.setDeleteTime(TimeUtil.timestamp());
articleCategoryMapper.updateById(model);
}
}

View File

@ -8,6 +8,9 @@ import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 基础配置服务实现类
*/
@Service
public class BasicsServiceImpl implements IBasicsService {

View File

@ -1,15 +1,23 @@
package com.hxkj.admin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxkj.admin.service.IIndexService;
import com.hxkj.common.entity.Article;
import com.hxkj.common.mapper.ArticleMapper;
import com.hxkj.common.utils.TimeUtil;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Resource;
import java.util.*;
/**
* 主页服务实现类
*/
@Service
public class IIndexServiceImpl implements IIndexService {
public class IndexServiceImpl implements IIndexService {
@Resource
ArticleMapper articleMapper;
/**
* 控制台数据
@ -43,6 +51,14 @@ public class IIndexServiceImpl implements IIndexService {
visitor.put("list", new ArrayList<>());
console.put("visitor", visitor);
// 文章排名
List<Map<String, Object>> articles = articleMapper.selectMaps(new QueryWrapper<Article>()
.select("id", "title", "visit")
.eq("is_delete", 0)
.orderByDesc(Arrays.asList("visit", "id"))
.last("limit 10"));
console.put("article", articles);
return console;
}

View File

@ -5,7 +5,8 @@ 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.hxkj.admin.config.SystemConfig;
import com.hxkj.admin.LikeAdminThreadLocal;
import com.hxkj.admin.config.AdminConfig;
import com.hxkj.admin.service.ISystemAdminService;
import com.hxkj.admin.service.ISystemRoleService;
import com.hxkj.admin.validate.PageParam;
@ -21,8 +22,11 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
/**
* 系统管理员实现类
*/
@Service
public class ISystemAdminServiceImpl implements ISystemAdminService {
public class SystemAdminServiceImpl implements ISystemAdminService {
@Resource
SystemAdminMapper systemAdminMapper;
@ -78,8 +82,13 @@ public class ISystemAdminServiceImpl implements ISystemAdminService {
SystemAdminVo vo = new SystemAdminVo();
BeanUtils.copyProperties(sysAdmin, vo);
if (sysAdmin.getId() == 1) {
vo.setRole("超级管理员");
} else {
vo.setRole(iSystemRoleService.getRoleNameById(sysAdmin.getRole()));
}
vo.setAvatar(UrlUtil.toAbsoluteUrl(sysAdmin.getAvatar()));
vo.setRole(iSystemRoleService.getRoleNameById(sysAdmin.getRole()));
vo.setCreateTime(TimeUtil.timestampToDate(sysAdmin.getCreateTime()));
vo.setUpdateTime(TimeUtil.timestampToDate(sysAdmin.getUpdateTime()));
vo.setLastLoginTime(TimeUtil.timestampToDate(sysAdmin.getLastLoginTime()));
@ -236,6 +245,9 @@ public class ISystemAdminServiceImpl implements ISystemAdminService {
Assert.isFalse(id == 1, "系统管理员不允许删除");
int adminId = Integer.parseInt(LikeAdminThreadLocal.getAdminId().toString());
Assert.isFalse(id == adminId, "不能删除自己");
SystemAdmin model = new SystemAdmin();
model.setId(id);
model.setIsDelete(1);
@ -266,7 +278,7 @@ public class ISystemAdminServiceImpl implements ISystemAdminService {
user.put("createTime", TimeUtil.timestampToDate(sysAdmin.getCreateTime()));
user.put("updateTime", TimeUtil.timestampToDate(sysAdmin.getUpdateTime()));
map.put(String.valueOf(sysAdmin.getId()), JSON.toJSONString(user));
RedisUtil.hmSet(SystemConfig.backstageManageKey, map);
RedisUtil.hmSet(AdminConfig.backstageManageKey, map);
}
}

View File

@ -23,8 +23,11 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
/**
* 系统日志服务实现类
*/
@Service
public class ISystemLogServerImpl implements ISystemLogServer {
public class SystemLogServerImpl implements ISystemLogServer {
@Resource
SystemLogOperateMapper logOperateMapper;

View File

@ -1,6 +1,6 @@
package com.hxkj.admin.service.impl;
import com.hxkj.admin.config.SystemConfig;
import com.hxkj.admin.config.AdminConfig;
import com.hxkj.admin.service.ISystemAdminService;
import com.hxkj.admin.service.ISystemLoginService;
import com.hxkj.admin.validate.system.SystemLoginParam;
@ -23,8 +23,11 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
/**
* 系统登录服务实现类
*/
@Service
public class ISystemLoginServiceImpl implements ISystemLoginService {
public class SystemLoginServiceImpl implements ISystemLoginService {
@Resource
SystemLogLoginMapper systemLogLoginMapper;
@ -36,7 +39,7 @@ public class ISystemLoginServiceImpl implements ISystemLoginService {
ISystemAdminService iSystemAdminService;
private static final Logger log = LoggerFactory.getLogger(ISystemLoginServiceImpl.class);
private static final Logger log = LoggerFactory.getLogger(SystemLoginServiceImpl.class);
/**
* 登录
@ -61,8 +64,9 @@ public class ISystemLoginServiceImpl implements ISystemLoginService {
throw new LoginException(HttpEnum.LOGIN_DISABLE_ERROR.getCode(), HttpEnum.LOGIN_DISABLE_ERROR.getMsg());
}
String newPWd = password + sysAdmin.getId() + sysAdmin.getSalt();
String newPWd = password + sysAdmin.getSalt();
String md5Pwd = ToolsUtil.makeMd5(newPWd);
System.out.println(md5Pwd);
if (!md5Pwd.equals(sysAdmin.getPassword())) {
this.recordLoginLog(sysAdmin.getId(), systemLoginParam.getUsername(), HttpEnum.LOGIN_ACCOUNT_ERROR.getMsg());
throw new LoginException(HttpEnum.LOGIN_ACCOUNT_ERROR.getCode(), HttpEnum.LOGIN_ACCOUNT_ERROR.getMsg());
@ -74,7 +78,7 @@ public class ISystemLoginServiceImpl implements ISystemLoginService {
systemAdminMapper.updateById(sysAdmin);
String token = ToolsUtil.makeToken();
RedisUtil.set(SystemConfig.backstageTokenKey+token, sysAdmin.getId(), 7200);
RedisUtil.set(AdminConfig.backstageTokenKey+token, sysAdmin.getId(), 7200);
iSystemAdminService.cacheAdminUserByUid(sysAdmin.getId());
Map<String, Object> response = new LinkedHashMap<>();
@ -99,7 +103,7 @@ public class ISystemLoginServiceImpl implements ISystemLoginService {
*/
@Override
public void logout(String token) {
RedisUtil.del(SystemConfig.backstageTokenKey + token);
RedisUtil.del(AdminConfig.backstageTokenKey + token);
}
/**

View File

@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.hxkj.admin.LikeAdminThreadLocal;
import com.hxkj.admin.config.SystemConfig;
import com.hxkj.admin.config.AdminConfig;
import com.hxkj.admin.service.ISystemMenuService;
import com.hxkj.admin.service.ISystemRoleMenuService;
import com.hxkj.admin.validate.system.SystemMenuParam;
@ -23,7 +23,7 @@ import java.util.Arrays;
import java.util.List;
@Service
public class ISystemMenuServiceImpl implements ISystemMenuService {
public class SystemMenuServiceImpl implements ISystemMenuService {
@Resource
SystemMenuMapper systemMenuMapper;
@ -154,7 +154,7 @@ public class ISystemMenuServiceImpl implements ISystemMenuService {
model.setUpdateTime(System.currentTimeMillis() / 1000);
systemMenuMapper.updateById(model);
RedisUtil.del(SystemConfig.backstageRolesKey);
RedisUtil.del(AdminConfig.backstageRolesKey);
}
/**
@ -171,7 +171,7 @@ public class ISystemMenuServiceImpl implements ISystemMenuService {
systemMenuMapper.deleteById(id);
iSystemRoleMenuService.batchDeleteByMenuId(id);
RedisUtil.del(SystemConfig.backstageRolesKey);
RedisUtil.del(AdminConfig.backstageRolesKey);
}
}

View File

@ -1,7 +1,7 @@
package com.hxkj.admin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxkj.admin.config.SystemConfig;
import com.hxkj.admin.config.AdminConfig;
import com.hxkj.admin.service.ISystemRoleMenuService;
import com.hxkj.common.entity.system.SystemMenu;
import com.hxkj.common.entity.system.SystemRoleMenu;
@ -9,17 +9,18 @@ import com.hxkj.common.mapper.system.SystemMenuMapper;
import com.hxkj.common.mapper.system.SystemRoleMenuMapper;
import com.hxkj.common.utils.ArrayUtil;
import com.hxkj.common.utils.RedisUtil;
import com.hxkj.common.utils.ToolsUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* 系统菜单服务实现类
*/
@Service
public class ISystemRoleMenuServiceImpl implements ISystemRoleMenuService {
public class SystemRoleMenuServiceImpl implements ISystemRoleMenuService {
@Resource
SystemRoleMenuMapper systemRoleMenuMapper;
@ -114,7 +115,7 @@ public class ISystemRoleMenuServiceImpl implements ISystemRoleMenuService {
}
}
RedisUtil.hSet(SystemConfig.backstageRolesKey, String.valueOf(roleId), ArrayUtil.listStrToString(menuArray, ","));
RedisUtil.hSet(AdminConfig.backstageRolesKey, String.valueOf(roleId), ArrayUtil.listStrToString(menuArray, ","));
}
}

View File

@ -4,8 +4,7 @@ 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.hxkj.admin.config.SystemConfig;
import com.hxkj.admin.service.ISystemAdminService;
import com.hxkj.admin.config.AdminConfig;
import com.hxkj.admin.service.ISystemRoleMenuService;
import com.hxkj.admin.service.ISystemRoleService;
import com.hxkj.admin.validate.PageParam;
@ -28,8 +27,11 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 系统角色服务实现类
*/
@Service
public class ISystemRoleServiceImpl implements ISystemRoleService {
public class SystemRoleServiceImpl implements ISystemRoleService {
@Resource
SystemAdminMapper systemAdminMapper;
@ -199,7 +201,7 @@ public class ISystemRoleServiceImpl implements ISystemRoleService {
systemRoleMapper.deleteById(id);
iSystemRoleMenuService.batchDeleteByRoleId(id);
RedisUtil.hDel(SystemConfig.backstageRolesKey, String.valueOf(id));
RedisUtil.hDel(AdminConfig.backstageRolesKey, String.valueOf(id));
}
}

View File

@ -0,0 +1,56 @@
package com.hxkj.admin.validate.article;
import com.hxkj.admin.validate.system.SystemAdminParam;
import com.hxkj.common.validator.annotation.IDMust;
import com.hxkj.common.validator.annotation.IntegerContains;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 文章参数
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ArticleParam implements Serializable {
private static final long serialVersionUID = 1L;
public interface create{}
public interface update{}
public interface delete{}
@IDMust(message = "id参数必传且需大于0", groups = {update.class, delete.class})
private Integer id;
@IDMust(message = "id参数必传且需大于0", groups = {create.class, update.class})
private Integer cid;
@NotEmpty(message = "文章标题不能为空", groups = {create.class, update.class})
@Length(min = 1, max = 200, message = "文章标题不能大于200个字符", groups = {create.class, update.class})
private String title;
@Length(max = 200, message = "简介不能超出200个字符", groups = {create.class, update.class})
private String intro = "";
@Length(max = 200, message = "图片链接过长不能超200个字符", groups = {create.class, update.class})
private String image = "";
private String content = "";
@NotNull(message = "排序号不能为空", groups = {create.class, update.class})
@DecimalMin(value = "0", message = "排序号值不能少于0", groups = {create.class, update.class})
private Integer sort;
@NotNull(message = "缺少isShow参数", groups = {create.class, update.class})
@IntegerContains(values = {0, 1}, message = "isShow不是合法值", groups = {create.class, update.class})
private Integer isShow;
}

View File

@ -0,0 +1,44 @@
package com.hxkj.admin.validate.article;
import com.hxkj.common.validator.annotation.IDMust;
import com.hxkj.common.validator.annotation.IntegerContains;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.DecimalMin;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 文章分类参数
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class CategoryParam implements Serializable {
private static final long serialVersionUID = 1L;
public interface create{}
public interface update{}
public interface delete{}
@IDMust(message = "id参数必传且需大于0", groups = {ArticleParam.create.class, ArticleParam.delete.class})
private Integer id;
@NotEmpty(message = "分类名称不能为空", groups = {create.class, update.class})
@Length(min = 1, max = 60, message = "分类名称不能大于60个字符", groups = {create.class, update.class})
private String name;
@NotNull(message = "排序号不能为空", groups = {create.class, update.class})
@DecimalMin(value = "0", message = "排序号值不能少于0", groups = {create.class, update.class})
private Integer sort;
@NotNull(message = "缺少isShow参数", groups = {create.class, update.class})
@IntegerContains(values = {0, 1}, message = "isShow不是合法值", groups = {create.class, update.class})
private Integer isShow;
}

View File

@ -0,0 +1,27 @@
package com.hxkj.admin.vo.article;
import lombok.Data;
import java.io.Serializable;
/**
* 文章详情Vo
*/
@Data
public class ArticleDetailVo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer cid;
private String title;
private String image;
private String intro;
private String content;
private Integer visit;
private Integer sort;
private Integer isShow;
private String createTime;
private String updateTime;
}

View File

@ -0,0 +1,22 @@
package com.hxkj.admin.vo.article;
import lombok.Data;
import java.io.Serializable;
@Data
public class ArticleListVo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private String category;
private String title;
private String image;
private Integer visit;
private Integer sort;
private Integer isShow;
private String createTime;
private String updateTime;
}

View File

@ -0,0 +1,20 @@
package com.hxkj.admin.vo.article;
import lombok.Data;
import java.io.Serializable;
/**
* 文章分类Vo
*/
@Data
public class CategoryVo implements Serializable {
private Integer id;
private String name;
private Integer sort;
private Integer isShow;
private String createTime;
private String updateTime;
}

View File

@ -1,10 +1,5 @@
{
"properties": [
{
"name": "like.debug",
"type": "java.lang.String",
"description": "Description for like.debug."
},
{
"name": "like.upload-directory",
"type": "java.lang.String",

View File

@ -1,6 +1,5 @@
# 项目配置
like:
debug: true
upload-directory: D:\www\frame\
# 服务配置

View File

@ -7,4 +7,4 @@ Spring Boot Version: ${spring-boot.version}
// |_____|_|_|\_\/_/ \_\__,_|_| |_| |_|_|_| |_| //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
///////////////////////////////////////////////////////
//////////////////////////////////////////////////////

View File

@ -3,10 +3,13 @@ package com.hxkj.common.core;
import com.hxkj.common.enums.HttpEnum;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
@Data
public class AjaxResult {
public class AjaxResult implements Serializable {
private static final long serialVersionUID = 1L;
/** 状态码 **/
private Integer code;

View File

@ -0,0 +1,32 @@
package com.hxkj.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
/**
* 文章实体
*/
@Data
public class Article implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
private Integer id;
private Integer cid;
private String title;
private String intro;
private String image;
private String content;
private Integer visit;
private Integer sort;
private Integer isShow;
private Integer isDelete;
private Long createTime;
private Long updateTime;
private Long deleteTime;
}

View File

@ -0,0 +1,27 @@
package com.hxkj.common.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
/**
* 文章分类实体
*/
@Data
public class ArticleCategory implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)
private Integer id;
private String name;
private Integer sort;
private Integer isShow;
private Integer isDelete;
private Long createTime;
private Long updateTime;
private Long deleteTime;
}

View File

@ -10,8 +10,8 @@ import java.io.Serializable;
* 系统操作日志实体
*/
@Data
public class SystemLogOperate implements Serializable
{
public class SystemLogOperate implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value="id", type= IdType.AUTO)

View File

@ -3,8 +3,6 @@ package com.hxkj.common.entity.system;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
@ -12,8 +10,6 @@ import java.io.Serializable;
* 系统角色菜单实体
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class SystemRoleMenu implements Serializable {
private static final long serialVersionUID = 1L;

View File

@ -16,6 +16,7 @@ public enum HttpEnum {
TOKEN_INVALID(333, "token参数无效"),
NO_PERMISSION(403, "无相关权限"),
REQUEST_404_ERROR(404, "请求接口不存在"),
SYSTEM_ERROR(500, "系统错误");

View File

@ -1,6 +1,7 @@
package com.hxkj.common.exception;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.hxkj.common.config.GlobalConfig;
import com.hxkj.common.core.AjaxResult;
import com.hxkj.common.enums.HttpEnum;
import lombok.extern.slf4j.Slf4j;
@ -8,7 +9,6 @@ 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;
@ -30,7 +30,11 @@ public class GlobalException {
@ExceptionHandler(Exception.class)
@ResponseBody
public AjaxResult handleException(Exception e) {
System.out.println(e.getMessage());
if (GlobalConfig.debug) {
e.printStackTrace();
System.out.println(e.getMessage());
}
log.error("系统异常 {}", e.getMessage());
return AjaxResult.failed(HttpEnum.SYSTEM_ERROR.getCode(), HttpEnum.SYSTEM_ERROR.getMsg());
}

View File

@ -0,0 +1,12 @@
package com.hxkj.common.mapper;
import com.hxkj.common.core.basics.IBaseMapper;
import com.hxkj.common.entity.ArticleCategory;
import org.apache.ibatis.annotations.Mapper;
/**
* 文章分类
*/
@Mapper
public interface ArticleCategoryMapper extends IBaseMapper<ArticleCategory> {
}

View File

@ -0,0 +1,12 @@
package com.hxkj.common.mapper;
import com.hxkj.common.core.basics.IBaseMapper;
import com.hxkj.common.entity.Article;
import org.apache.ibatis.annotations.Mapper;
/**
* 文章
*/
@Mapper
public interface ArticleMapper extends IBaseMapper<Article> {
}

View File

@ -2,18 +2,49 @@
<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>likeadmin-java</artifactId>
<groupId>org.hxkj</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 模块信息 -->
<modelVersion>4.0.0</modelVersion>
<artifactId>like-front</artifactId>
<packaging>jar</packaging>
<!-- 特性信息 -->
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<like-common>1.0-SNAPSHOT</like-common>
</properties>
<!-- 项目管理 -->
<dependencies>
<!-- 公共依赖 -->
<dependency>
<groupId>org.hxkj</groupId>
<artifactId>like-common</artifactId>
<version>${like-common}</version>
</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,25 @@
package com.hxkj.front;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* 启动器
*/
@Configuration
@ComponentScan(basePackages = {"com.hxkj"})
@MapperScan(basePackages = {"com.hxkj.*.mapper"})
@EnableTransactionManagement
@SpringBootApplication(exclude = {RedisRepositoriesAutoConfiguration.class})
public class LikeFrontApplication {
public static void main(String[] args) {
SpringApplication.run(LikeFrontApplication.class, args);
}
}

View File

@ -0,0 +1,38 @@
package com.hxkj.front;
import com.alibaba.fastjson.JSON;
import com.hxkj.common.core.AjaxResult;
import com.hxkj.common.enums.HttpEnum;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 拦截器
*/
@Component
public class LikeFrontInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 404拦截
response.setContentType("application/json;charset=utf-8");
if (response.getStatus() == 404) {
AjaxResult result = AjaxResult.failed(HttpEnum.REQUEST_404_ERROR.getCode(), HttpEnum.REQUEST_404_ERROR.getMsg());
response.getWriter().print(JSON.toJSONString(result));
return false;
}
// 验证通过继续操作
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
LikeFrontThreadLocal.remove();
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}

View File

@ -0,0 +1,55 @@
package com.hxkj.front;
import java.util.LinkedHashMap;
public class LikeFrontThreadLocal {
/**
* 构造方法
*/
public LikeFrontThreadLocal() {}
/**
* 取得本地线程对象
*/
private static final java.lang.ThreadLocal<LinkedHashMap<String, Object>> MY_LOCAL = new java.lang.ThreadLocal<>();
/**
* 写入本地线程
*/
public static void put(String key, Object val) {
LinkedHashMap<String, Object> map = MY_LOCAL.get();
if (map == null) {
map = new LinkedHashMap<>();
}
map.put(key, val);
MY_LOCAL.set(map);
}
/**
* 获取本地线程
*/
public static Object get(String key) {
return MY_LOCAL.get().getOrDefault(key, "");
}
/**
* 获取用户ID
*/
public static Integer getUserId() {
String adminId = LikeFrontThreadLocal.get("userId").toString();
if (adminId.equals("")) {
return 0;
}
return Integer.parseInt(adminId);
}
/**
* 删除本地线程
*/
public static void remove() {
MY_LOCAL.remove();
}
}

View File

@ -0,0 +1,16 @@
package com.hxkj.front.config;
/**
* 前台公共配置
*/
public class FrontConfig {
// 免登录验证
public static String[] notLoginUri = new String[]{
"/api/login"
};
// 免权限验证
public static String[] notAuthUri = new String[]{};
}

View File

@ -0,0 +1,21 @@
package com.hxkj.front.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,54 @@
package com.hxkj.front.config;
import com.hxkj.common.config.GlobalConfig;
import com.hxkj.common.utils.YmlUtil;
import com.hxkj.front.LikeFrontInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Resource
LikeFrontInterceptor likeFrontInterceptor;
/**
* 配置允许跨域
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedHeaders("*")
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600);
}
/**
* 登录拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(likeFrontInterceptor).addPathPatterns("/**");
}
/**
* 资源目录映射
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String directory = YmlUtil.get("like.upload-directory");
if (directory == null || directory.equals("")) {
directory = GlobalConfig.uploadDirectory;
}
registry.addResourceHandler("/"+ GlobalConfig.publicPrefix +"/**")
.addResourceLocations("file:" + directory);
}
}

View File

@ -0,0 +1,17 @@
package com.hxkj.front.controller;
import com.hxkj.common.core.AjaxResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class IndexController {
@GetMapping("/index")
public Object index() {
return AjaxResult.success();
}
}

View File

@ -0,0 +1,9 @@
{
"properties": [
{
"name": "like.upload-directory",
"type": "java.lang.String",
"description": "Description for like.upload-directory."
}
]
}

View File

@ -0,0 +1,10 @@
Spring Boot Version: ${spring-boot.version}
///////////////////////////////////////////////////////
// _ _ _ _ _ _ //
// | | (_) | __ / \ __| |_ __ ___ (_)_ __ //
// | | | | |/ / / _ \ / _` | '_ ` _ \| | '_ \ //
// | |___| | < / ___ \ (_| | | | | | | | | | | //
// |_____|_|_|\_\/_/ \_\__,_|_| |_| |_|_|_| |_| //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
//////////////////////////////////////////////////////

View File

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<configuration monitorInterval="5">
<!-- 变量配置 -->
<Properties>
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<property name="FILE_PATH" value="/www/wwwroot/logs/like-front" />
<property name="FILE_NAME" value="admin-log4j2" />
</Properties>
<appenders>
<!-- 控制台输出 -->
<console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}"/>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!-- 临时测试日志 -->
<File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- Info日志分割压缩 -->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- warn日志分割压缩 -->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- error日志分割压缩 -->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<loggers>
<!-- 过滤指定DEBUG信息 -->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!-- 监控系统信息 -->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<!-- 初始化日志 -->
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>