Giter Club home page Giter Club logo

smpe-admin's Introduction

SMPE-ADMIN后台管理系统

项目简介

一个基于Spring Boot 2.1.0、JDK1.8+ 、 Mybatis Plus、JWT + Spring Security、Redis、Vue的前后端分离的后台管理系统

官方文档

默认管理员账号密码: admin / 123456

项目源码

后端源码 前端源码
GitHub https://github.com/sanyueruanjian/smpe-admin https://github.com/sanyueruanjian/smpe-admin-web

主要特性

  • 使用最新技术栈,社区资源丰富。
  • 支持接口限流,避免恶意请求导致服务层压力过大
  • 支持接口级别的功能权限与数据权限,可自定义操作
  • 自定义权限注解与匿名接口注解,可快速对接口拦截与放行
  • 前后端统一异常拦截处理,统一输出异常,避免繁琐的判断
  • 自定义扩展Mybatis-Plus的功能
  • 高效率开发,代码生成器可一键生成前后端代码
  • 完善的日志记录体系简单注解即可实现

系统功能

  • 用户管理:提供用户的相关配置,新增用户后,默认密码为123456
  • 角色管理:对权限与菜单进行分配,可根据部门设置角色的数据权限
  • 菜单管理:已实现菜单动态路由,后端可配置化,支持多级菜单
  • 部门管理:可配置系统组织架构,树形表格展示
  • 岗位管理:配置各个部门的职位
  • 任务调度:管理定时任务

系统监控

  • 在线用户:记录登陆系统的用户
  • 操作日志:记录用户的操作情况
  • 异常日志:记录用户的异常操作情况

项目结构

项目采用按功能分模块的开发方式,结构如下

  • smpe-common 为系统的公共模块,各种工具类,公共配置存在该模块
  • smpe-system 为系统核心模块也是项目入口模块,也是最终需要打包部署的模块
  • smpe-log 为日志模块

详细结构

- smpe-common 公共模块
    - annotation 为系统自定义注解
    - aspect 自定义注解的切面
    - base 提供了常用基类
    - bean 读取yml中的通用配置类
    - config 全局配置文件,例如swagger、MyBatis-Plus、redis、跨域处理等的配置
        - thread 线程池相关
    - enums 全局枚举类
    - exception 项目统一异常的处理
    - response 统一返回前端数据封装
    - utils 系统通用工具类
- smpe-log 日志模块
    - annotation 日志自定义注解
    - aspect 自定义日志切面
    - controller 日志控制层
    - entity 日志实体
    - enums 日志常用枚举
    - mapper 日志接口
    - service 日志服务
- smpe-system 系统核心模块(系统启动入口)
    - config 核心模块配置(非全局配置)
    - modules 系统相关模块(登录授权、用户部门管理等、自定义业务)
        - business 业务模块(一般项目业务开发模块可放在此包下,各模块可构建自己的config、utils、enums等)
        - generator mpbatisplus的代码生成(后端)
        - security 安全认证(SpringSecurity+JWT)
        - system 系统核心模块(用户、角色、部门、岗位、菜单管理等)(各模块文件夹结构可参考如下)
            - controller
            - entity
                - bo
                - dto
            - mapper
            - service
                - impl
                - mapstruct(Java实体映射文件)
            - config(仅限本模块使用的配置文件,没有可忽略)
            - utils(仅限本模块使用的工具类,没有可忽略)
        - upload 文件模块(上传、下载等)
    - utils 核心模块工具类(仅限smpe-system子工程使用的工具类,非全局使用)
- smpe-xxx (自定义待开发模块)
- sql 数据库文件
- Dockerfile 构建后端服务器环境的Dockerfile(基于docker)
- smpe-admin.sh 后端部署脚本
- smpe-admin.conf nginx配置文件

使用指南

参考官方文档

服务器部署

参考:

  1. docker安装及docker常用命令
  2. docker 构建git+maven+jdk8的centos7环境,实现轻量级的springboot项目的自动化部署
  3. docker安装nginx规范所有项目的反向代理(一个项目一个反向代理的conf配置文件)
  4. docker 构建centos7+git+nvm镜像,实现自主切换node版本统一部署前端vue项目

鸣谢

反馈交流

QQ交流群:571506692

smpe-admin's People

Contributors

duktig666 avatar jiaoqianjin avatar jiefei30 avatar l2xing avatar yunkunzhang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

smpe-admin's Issues

数据库异常处理,如果为数据库语句执行错误,那么会直接抛出异常,不执行以后的代码

当前使用版本(必填,否则不予处理)

v0.1.2-dev

该问题是如何引起的?(确定最新版也有问题再提!!!)

在向数据库插入数据时,如果数据库语句异常,那么会直接抛出异常,不会等待执行下面的语句判断,在执行自己的异常处理

重现步骤(如果有就写完整)

编写测试类->调用数据库mapper的方法->插入错误信息->数据库会直接抛出异常->不执行下面的语句
样例:
11
22
33

报错信息

java.sql.sQLException: Incorrect integer value: 'xxx'for column 'xxx' at row 1

修改菜单组件名称不生效

当前使用版本(必填,否则不予处理)

v0.1.0-beta

该问题是如何引起的?(确定最新版也有问题再提!!!)

数据库组件名称字段为name
前端传参组件名称:componentName,后端数据库Menu实体未做映射

重现步骤(如果有就写完整)

报错信息

菜单显示和角色查看菜单权限问题

当前使用版本(必填,否则不予处理)

v0.1.2-dev

该问题是如何引起的?(确定最新版也有问题再提!!!)

前端显示与数据库中的记录不同步

重现步骤(如果有就写完整)

在前端更改角色对菜单的权限后,数据库相应记录发生变化,但是前端在刷新后仍旧没有改变(包括左侧菜单及菜单子目录)

报错信息

部门分页查询异常

v0.1.0-beta

dept分页查询异常

错误信息

文件位置:
smpe-admin/smpe-system/src/main/java/marchsoft/modules/system/controller/DeptController.java /

   @ApiOperation("查询部门")
    @GetMapping
    @PreAuthorize("@smpe.check('user:list','dept:list')")
    public Result<Object> query(DeptQueryCriteria criteria, PageVO pageVO) {
        log.info("【查询部门 /api/dept】操作人userId:" + SecurityUtils.getCurrentUserId() + "; 部门查询条件 criteria= " + criteria + "; 分页pageVo= " + pageVO);
        pageVO.setSize(-1);  //此处代码限制了分页查询
        return Result.success(deptService.queryAll(criteria, pageVO, true));
    }

request获取的token与实际token不一致问题

当前使用版本(必填,否则不予处理)

1.0.0

该问题是如何引起的?(确定最新版也有问题再提!!!)

图片
TokenProvider解析request时长度截取错误,多截取了一个字母

重现步骤(如果有就写完整)

报错信息

条件查询的结果与预期不匹配

当前使用版本(必填,否则不予处理)

v0.1.2-dev

该问题是如何引起的?(确定最新版也有问题再提!!!)

LambdaQueryWrapper构造的查询条件出现逻辑错误。

重现步骤(如果有就写完整)

编写LambdaQueryWrapper->调用数据库mapper的方法->返回与预期查询结果不符的数据

样例:
预期查询结果为:指定的日志类型当中符合查询条件的日志
如图所示:
image
代码如下:

 /**
     * description: 构建查询角色的LambdaQueryWrapper
     *
     * @param criteria /
     * Date: 2021/1/14 20:12
     */
    public LambdaQueryWrapper<SysLog> buildSysLogQueryCriteria(SysLogQueryCriteria criteria) {
        LambdaQueryWrapper<SysLog> wrapper = new LambdaQueryWrapper<>();
        // 设置查询的日志类型
        wrapper.eq(SysLog::getLogType, criteria.getLogType());
        // 判断查询条件是否为空
        if (StrUtil.isNotEmpty(criteria.getBlurry())) {
            wrapper.like(SysLog::getDescription, criteria.getBlurry()).or()
                    .like(SysLog::getAddress, criteria.getBlurry()).or()
                    .like(SysLog::getRequestIp, criteria.getBlurry()).or()
                    .like(SysLog::getMethod, criteria.getBlurry()).or()
                    .like(SysLog::getParams, criteria.getBlurry())
        }
        // 判断是否添加创建时间范围条件
        if (ObjectUtil.isNotNull(criteria.getStartTime()) && ObjectUtil.isNotNull(criteria.getEndTime())) {
            wrapper.between(SysLog::getCreateTime, criteria.getStartTime(), criteria.getEndTime());
        }
        return wrapper;
    }

实际查询结果:符合查询条件的日志(日志类型条件没有生效)
如图所示:
image
结果如下:

SMPE-ADMIN- 2021-01-23 20:14:16 [http-nio-8000-exec-1] INFO  jdbc.sqltiming - SELECT id, user_id, description, log_type, method, params, request_time, request_ip, address, 
browser, create_by, update_by, create_time, update_time FROM sys_log u WHERE (log_type = '0' 
AND description LIKE '%内网IP%' OR address LIKE '%内网IP%' OR request_ip LIKE '%内网IP%' OR method 
LIKE '%内网IP%' OR params LIKE '%内网IP%') ORDER BY create_time DESC LIMIT 10 ;
 {executed in 2 msec}
SMPE-ADMIN- 2021-01-23 20:14:16 [http-nio-8000-exec-1] INFO  jdbc.resultsettable - 
|----|--------|------------|---------|---------------------------------------------------------|-------|-------------|--------------|--------|--------|----------|----------|------------|------------|
|id  |user_id |description |log_type |method                                                   |params |request_time |request_ip    |address |browser |create_by |update_by |create_time |update_time |
|----|--------|------------|---------|---------------------------------------------------------|-------|-------------|--------------|--------|--------|----------|----------|------------|------------|
|255 |1       |删除所有ERROR日志 |3        |marchsoft.controller.SysLogController.delAllErrorLog()   |       |11           |192.xxx.xxx.1 |内网IP    |Chrome  |0         |0         |[unread]    |[unread]    |
|254 |1       |导出错误数据      |3        |marchsoft.controller.SysLogController.downloadErrorLog() |       |176          |192.xxx.xxx.1 |内网IP    |Chrome  |0         |0         |[unread]    |[unread]    |
|252 |1       |删除所有INFO日志  |0        |marchsoft.controller.SysLogController.delAllInfoLog()    |       |18           |192.xxx.xxx.1 |内网IP    |Chrome  |0         |0         |[unread]    |[unread]    |
|253 |1       |测试数据        |0        |marchsoft.controller.SysLogController.query()            |       |29           |192.xxx.xxx.1 |内网IP    |Chrome  |0         |0         |[unread]    |[unread]    |
|----|--------|------------|---------|---------------------------------------------------------|-------|-------------|--------------|--------|--------|----------|----------|------------|------------|

传入的参数当中log_type = '0' ,但是查询出来的结果当中含有log_type = '3'的数据。

报错信息

LambdaQueryWrapper修改意见

该Pull Request关联的Issue

#63

修改描述

通过AND 嵌套来进行逻辑完善,将多个查询条件的合与日志类型查询条件做交运算。

测试用例

image
代码如下:

/**
     * description: 构建查询角色的LambdaQueryWrapper
     *
     * @param criteria /
     * Date: 2021/1/14 20:12
     */
    public LambdaQueryWrapper<SysLog> buildSysLogQueryCriteria(SysLogQueryCriteria criteria) {
        LambdaQueryWrapper<SysLog> wrapper = new LambdaQueryWrapper<>();
        // 设置查询的日志类型
        wrapper.eq(SysLog::getLogType, criteria.getLogType());
        // 判断查询条件是否为空
        if (StrUtil.isNotEmpty(criteria.getBlurry())) {
            wrapper.and(i -> i.like(SysLog::getDescription, criteria.getBlurry()).or()
                    .like(SysLog::getAddress, criteria.getBlurry()).or()
                    .like(SysLog::getRequestIp, criteria.getBlurry()).or()
                    .like(SysLog::getMethod, criteria.getBlurry()).or()
                    .like(SysLog::getParams, criteria.getBlurry()));
        }
        // 判断是否添加创建时间范围条件
        if (ObjectUtil.isNotNull(criteria.getStartTime()) && ObjectUtil.isNotNull(criteria.getEndTime())) {
            wrapper.between(SysLog::getCreateTime, criteria.getStartTime(), criteria.getEndTime());
        }
        return wrapper;
    }

image
查询结果如下:

SMPE-ADMIN- 2021-01-23 20:26:00 [http-nio-8000-exec-1] INFO  jdbc.sqltiming - SELECT id, user_id, description, log_type, method, params, request_time, request_ip, address, 
browser, create_by, update_by, create_time, update_time FROM sys_log u WHERE (log_type = '0' 
AND (description LIKE '%内网IP%' OR address LIKE '%内网IP%' OR request_ip LIKE '%内网IP%' OR method 
LIKE '%内网IP%' OR params LIKE '%内网IP%')) ORDER BY create_time DESC LIMIT 10 ;

修复效果的截屏

image
结果如下:

SMPE-ADMIN- 2021-01-23 20:26:00 [http-nio-8000-exec-1] INFO  jdbc.resultsettable - 
|----|--------|------------|---------|------------------------------------------------------|-------|-------------|--------------|--------|--------|----------|----------|------------|------------|
|id  |user_id |description |log_type |method                                                |params |request_time |request_ip    |address |browser |create_by |update_by |create_time |update_time |
|----|--------|------------|---------|------------------------------------------------------|-------|-------------|--------------|--------|--------|----------|----------|------------|------------|
|252 |1       |删除所有INFO日志  |0        |marchsoft.controller.SysLogController.delAllInfoLog() |       |18           |192.xxx.xxx.1 |内网IP    |Chrome  |0         |0         |[unread]    |[unread]    |
|253 |1       |测试数据        |0        |marchsoft.controller.SysLogController.query()         |       |29           |192.xxx.xxx.1 |内网IP    |Chrome  |0         |0         |[unread]    |[unread]    |
|----|--------|------------|---------|------------------------------------------------------|-------|-------------|--------------|--------|--------|----------|----------|------------|------------|

角色的菜单显示与后端数据库中的记录不同步

当前使用版本(必填,否则不予处理)

v0.1.2-dev

该问题是如何引起的?(确定最新版也有问题再提!!!)

前端的角色对于菜单的权限与数据库中的记录不同步

重现步骤(如果有就写完整)

更改角色对于菜单的权限并保存 => 查看数据库,对应记录发生改变 => 刷新前端页面,仍为更改前的菜单显示

报错信息

个人中心修改信息之后显示的还是修改之前的

当前使用版本(必填,否则不予处理)

v0.1.0-beta

该问题是如何引起的?(确定最新版也有问题再提!!!)

修改用户信息之后未清除缓存,查询的还是缓存里的信息

usercontroller里直接调用mybatis的修改方法,修改之后并未清除用户缓存

重现步骤(如果有就写完整)

报错信息

Token失效出现预期外异常

v0.1.0-beta

token失效

登陆admin账户后后删除token

 java.lang.NumberFormatException: For input string: "admin"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Long.parseLong(Long.java:589)
	at java.lang.Long.parseLong(Long.java:631)
	at marchsoft.modules.security.security.TokenFilter.doFilter(TokenFilter.java:65)

Mysql5.6版本以上limit与order by同时使用出现数据重复问题

建议内容

使用框架时要注意limit与order by的同时使用,在5.6版本以上的mysql排序时使用堆排序,堆排序不稳定,会导致具有相同排序字段的数据查询出来后顺序和数据库不一致,分页后出现数据重复的情况

实施方案

仅供参考

  1. 排序时加上order by id使每一次查询的排序字段都不一样
  2. 加索引

导出的Bug

当前使用版本(必填,否则不予处理)

v0.1.2-dev

该问题是如何引起的?(确定最新版也有问题再提!!!)

由于请求拦截中41行的if (response.data.code !== 0) 判断条件引起的,根源是后端返回的数据中不含该code,输出为undefined。

重现步骤(如果有就写完整)

进入页面,点击导出,弹出错误提示框,内容为空

报错信息

update语句更新返回值建议

建议内容

update类的语句执行后返回数据影响数而不是匹配数

实施方案

在jdbc的url后拼接useAffectedRows=true

日志文件总打印到统一文件

当前使用版本(必填,否则不予处理)

v1.0.0-release

该问题是如何引起的?(确定最新版也有问题再提!!!)

logback-xx.xml 配置有问题

重现步骤(如果有就写完整)

每天生成的日志文件会打印到统一文件,没有按一个小时一个文件打印

报错信息

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.