Giter Club home page Giter Club logo

kalvingit / kvf-admin Goto Github PK

View Code? Open in Web Editor NEW
440.0 16.0 166.0 10.1 MB

kvf-admin是一套基于springboot、mybatis、shiro及layui的轻量级快速开发框架、脚手架、后台管理系统、权限系统、基于activiti6整合的工作流OA系统,上手简单,拿来即用。

Home Page: http://kvfadmin.kalvinbg.cn

License: MIT License

Java 99.49% Dockerfile 0.01% Shell 0.01% Less 0.50%
admin layui-admin activiti6 mybatis-plus spring-boot code-generator spring-mvc docker

kvf-admin's Introduction

kvf-admin-logo

license springboot mybatis-plus code-generator layui hutool activiti6

kvf-admin

kvf-admin是一套快速开发框架、脚手架、后台管理系统、权限系统,上手简单,拿来即用。为广大开发者去除大部分重复繁锁的代码工作,让开发者拥有更多的时间陪恋人、家人和朋友。
技术交流群:214768328 二维码

  • 后端采用spring boot、mybatis(已集成mybatis-plus增强插件,开发更迅速,可查看官方文档了解更多:mybatis-plus)、shiro框架
  • 前端采用layui作为UI框架,实现90%的移动端自适应,支持主题更换
  • 提供代码生成器(wiki使用文档),只需编写20%左右的代码,剩下全部自动生成;支持一键及批量功能模块生成,并支持一定程度上的自定义配置并生成代码,相对比较灵活

基础框架功能模块

  • 用户管理
  • 部门管理
  • 菜单管理
  • 角色管理
  • 字典管理
  • 操作日志
  • 代码生成
  • 组件管理

kvf-admin-activiti(工作流OA版本)

kvf-admin-activiti是基于kvf-admin脚手架集成了工作流引擎(activiti6),并封装了核心工作流程(OA)功能模块。如下: 目前工作流(OA)模块还处于初始阶段,代码也比较粗糙,后续再不断完善优化。
备注:工作流版本在【activiti】分支

  • 核心API(支持启动流程、提交任务、驳回、驳回任意环节、驳回首环节、撤回、挂起/激活流程等API)
  • 流程管理(支持流程在线设计器、发布/部署、挂起、激活、导出/导入、配置表单、启动、删除)
  • 表单管理(支持快速表单在线设计器、增/删/改/查、预览表单)
  • 我的流程(发起流程申请)
  • 我的待办(支持快速办理、查看任务表单办理、历史审批意见、流程实时流转图等)
  • 我的已办(支持撤回功能)
  • 我的申请(查看所有当前用户申请过的流程情况)
  • 下一步计划,期待大家的反馈意见!

更新日志

👳👉‍点我点我点我

项目结构树

kvf-admin
│
│ pom.xml maven依赖管理pom文件
│  
├─sql
│      kvf_sys.sql  项目初始化数据表及基础数据sql脚本
│      
└─src
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─kalvin
    │  │          └─kvf
    │  │              │  KvfAdminApplication.java   项目启动类
    │  │              │  
    │  │              ├─common  通用模块
    │  │              └─modules 功能模块
    │  │                  ├─generator   代码生成器模块
    │  │                  └─sys 系统模块(核心)
    │  └─resources
    │      │  application.yml   spring boot 配置文件
    │      │  ehcache.xml   ehcache缓存配置文件
    │      │  
    │      ├─mapper mybatis mapper文件
    │      ├─static 静态资料
    │      └─templates  模板
    │          │  403.html  403页面
    │          │  home.html 系统首页页面
    │          │  index.html   主页
    │          │  login.html   登录页
    │          │  
    │          ├─common 通用模板
    │          │      base.html
    │          │      sys_tpl.html
    │          │      
    │          ├─generator  生成器模板
    │          │          
    │          └─sys    系统页面模板
    │                  
    └─test  单元测试块

软件需求

  • jdk8+
  • mysql5.7+

所用技术

前端

后端

  • spring boot v2.2.4.RELEASE
  • Mybatis
  • Mybatis-plus v3.3.0 (mybatis增强插件,无侵入。非常强大的插件,除了联表操作,几乎都可以使用它的sql条件构造器完成)
  • Shiro v1.4.0
  • Druid v1.1.21
  • ehcache
  • redis
  • hutool-all v4.5.1 (java通用工具类,此包几乎包括了所有常用的工具方法,你也可以按需引入相应工具模块包)

项目特点

  • 非常精简且轻量级的权限系统,代码简洁易懂,无论学习还是项目中应用,都是非常简单易上手的项目
  • 拥有界面配置化代码生成器,支持一键生成及简单自定义配置生成代码
  • 自动过滤输入的非法字符串,防止XSS攻击
  • 使用ehcache + redis作为缓存,对需要加入缓存的方法上添加@Cacheable注解即可(你也可以使用redisTemplate添加获取缓存),提升系统运行速度
  • 支持日志记录,可在需要加入日志操作记录的controller方法上添加@Log("业务操作备注")即可完成日志记录
  • 系统全局统一异常处理,所有异常信息统一处理返回R对象,前端处理提示信息更方便
  • 支持工作流(OA)功能
  • 完美支持多种部署方式(jar、tomcat、docker等)

本地部署

  • 通过git/gitee下载源码(推荐使用git,因为gitee不是实时更新的),若是工作流OA版本,请clone activiti分支
  • 创建数据库:执行sql/kvf_admin.sql脚本创建数据库及表并初始化系统基础数据,若是工作流OA版本需要额外执行sql/kvf_admin_activiti.sql脚本
  • 修改开发环境配置文件application-dev.yml,配置数据库账号和密码
  • 开发工具idea或eclipse还需要安装lombok插件,否则会提示找不到实体类的的get/set方法
  • 运行KvfAdminApplication.java,启动项目【kvf-admin】
  • idea启动访问:http://localhost/【一般idea都会自动去掉项目名】【这里使用80端口】
  • eclipse启动访问:http://localhost/kvf-admin【这里使用80端口】
  • 账号密码:admin/123456

linux部署

注意:以下三种方式部署前,记得初始化数据库哦

打包

开发环境(dev):
mvn package -P dev
测试环境(test):
mvn package -P test -Dmaven.test.skip=true
生产环境(prod):
mvn package -P prod -Dmaven.test.skip=true

jar包方式部署

项目已解决以jar包运行的情况下,无法读取文件等各种问题,所以放心使用

运行
nohup java -jar kvf-admin.jar &

tomcat部署

打包前先修改pom.xml的打包方式为war

<packaging>war</packaging>
运行
把war包拷贝到tomcat的webapps目录下,然后进入bin目录执行:
./startup.sh

docker部署

前提:安装docker及docker-compose

进入kvf-admin目录,在已打包(上面打包步骤)的情况下,构建docker镜像
mvn docker:build
进入./docker-compose目录

修改相应docker-compose配置(可选)

vim docker-compose.yml
vim .env
运行(启动所有镜像)
docker-compose up -d
或者启动指定镜像
docker-compose up -d kvf-admin

项目演示

系统效果图展示

系统效果图 系统效果图 系统效果图 系统效果图 系统效果图

开发指南

  • 前端通用配置js【kconfig.js】
  • 前端通用工具js【kcommon.js】
  • 前端静态文件引用统一管理配置【base.html】,在需要引用里面的配置的页面上引用即可,如引用通用的css:<link th:replace="common/base::static"/>
  • 后端自定义日志注解@Log("业务操作说明")[com.kalvin.kvf.common.annotation.Log],在需要加入日志的controller方法上加这个注解即可
  • 缓存使用点我:对需要加入缓存的方法上添加@Cacheable(value="cache_name")注解即可,同时需要在对应的方法上加上更新或删除缓存注解@CacheEvict(value = "cache_name", allEntries = true);也可以使用redisTemplate添加删除更新缓存
  • 代码生成器使用文档点我
  • Spring上下文工具【SpringContextKit.java】,可使用它手动获取指定bean。如IUserService userService = SpringContextKit.getBean(IUserService.class);
  • 自定义异常处理类【KvfException.java】,可用于业务层【service】抛出业务异常,如:throw new KvfException("不存在的任务ID"); ,前端可接收到这个提示信息
  • 统一接口返回数据封装类【R.java】,可用于控制层【controller】返回成功或失败等数据。如R.ok(data); 或 R.fail("验证码不正确");
  • 开发环境【dev】默认关闭登录验证码,若需要开启验证码登录可在application-dev.yml配置开启
  • 通用文件上传接口:CommonController->fileUpload

敬请期待

  • vue-admin版本

常见问题

1.有些人访问报错:org.apache.ibatis.binding.BindingException: Parameter 'xxx' not found,Available parameters are [0, 1, param1, param2]

为什么会出现部分人报错,有些却不报错呢? 答案参考这篇分析文章:点我

####解决方案:

  • 方案一: 可能是使用低版本的idea,因为低版本的idea默认是没有加上-parameters选项的,需要手动加上;(上面的分析文章有详细说明) 或者升级idea版本

  • 方案二: 在mapper的方法参数上加上@Param注解

2.mybatisPlus自带的crud方法默认会根据实体类字段驼峰自动转下划线匹配数据表字段,如果不需要自动转下划线该如何配置

全局配置:

可在配置项map-underscore-to-camel-case配置: 配置为true时,mybatisplus会根据实体类字段驼峰自动转下划线匹配数据表字段如:myColumn(实体字段) -> my_column(表字段)
map-underscore-to-camel-case:true
同理,配置为false时:myColumn(实体字段) -> myColumn(表字段)
map-underscore-to-camel-case:false 全局配置

局部配置:

如果只是部分表或字段需要,可在实体类的字段上配置@TableField(value="表字段")注解指定数据表字段名称如:

@TableField(value = "myColumn")
private String myColumn;

交流反馈

技术交流群

kvf-admin's People

Contributors

kalvingit 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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

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

kvf-admin's Issues

流程过程错误

在请假流程发起请假的时候,显示错误
Unknown property used in expression: ${result == 'access'}

activiti分支 工作流管理-》表单管理-》新建表单报错

Error updating database. Cause: java.sql.SQLSyntaxErrorException: Unknown column 'bind_table' in 'field list' ### The error may exist in com/kalvin/kvf/modules/workflow/mapper/FormMapper.java (best guess) ### The error may involve com.kalvin.kvf.modules.workflow.mapper.FormMapper.insert-Inline ### The error occurred while setting parameters ### SQL: INSERT INTO wf_form ( code, name, type, theme, design_data, bind_table, service_bean, entity_clazz, show_columns ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? ) ### Cause: java.sql.SQLSyntaxErrorException: Unknown column 'bind_table' in 'field list' ; bad SQL grammar []; nested exception is java.sql.SQLSyntaxErrorException: Unknown column 'bind_table' in 'field list'

原因:wf_form表少了bind_table, service_bean, entity_clazz, show_columns字段
up主记得更新kvf_admin_activiti.sql文件

CREATE TABLE wf_form (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
code varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '表单代号',
name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '表单名称',
type tinyint(2) NOT NULL DEFAULT 0 COMMENT '表单类型。0:简单表单;1:复杂表单;',
theme varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '表单主题。不配置默认为表单名称',
design_data text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '表单设计数据。',
js_code text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '表单js代码。仅当复杂表单才有',
create_time datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
PRIMARY KEY (id) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '表单设计表' ROW_FORMAT = Dynamic;

There is a deserialization vulnerability that can cause RCE

The author sets a fixed key in the com.kalvin.kvf.common.shiro.ShiroConfig file and uses this key to encrypt the rememberMe parameter in the cookie. This situation can cause a deserialization attack with very serious consequences.
2
Set up a local environment for attacks. When the attacker logs in and selects remember me, the cookie will have the rememberMe field
3

Blast the field and find that the encoded key is 2AvVhdsgUs0FSA3SDFAdag==, which is the same as the one set in the source code

After an audit, I found that the source code contains commons-beanutils-1.9.4.jar dependency, which is actually a dependency included in shiro.
Using this dependency, it is possible to generate a deserialized payload and then encrypt the payload using the key obtained by blasting.
Finally, write this payload after the rememberMe field and attack it. Successful RCE
00

Note that the JSESSIONID in the cookie field should be deleted, otherwise the system will make judgments directly based on the JSESSIONID.

quarz.sql 运行报错

[Err] 1046 - No database selected
[Err] -- quartz自带表结构
-- 需要用到定时任务才需要创建
DROP TABLE IF EXISTS qrtz_blob_triggers;
DROP TABLE IF EXISTS qrtz_calendars;
DROP TABLE IF EXISTS qrtz_cron_triggers;
DROP TABLE IF EXISTS qrtz_fired_triggers;
DROP TABLE IF EXISTS qrtz_job_details;
DROP TABLE IF EXISTS qrtz_locks;
DROP TABLE IF EXISTS qrtz_paused_trigger_grps;
DROP TABLE IF EXISTS qrtz_scheduler_state;
DROP TABLE IF EXISTS qrtz_simple_triggers;
DROP TABLE IF EXISTS qrtz_simprop_triggers;
DROP TABLE IF EXISTS qrtz_triggers;

CREATE TABLE QRTZ_JOB_DETAILS(
SCHED_NAME VARCHAR(120) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
JOB_CLASS_NAME VARCHAR(250) NOT NULL,
IS_DURABLE VARCHAR(1) NOT NULL,
IS_NONCONCURRENT VARCHAR(1) NOT NULL,
IS_UPDATE_DATA VARCHAR(1) NOT NULL,
REQUESTS_RECOVERY VARCHAR(1) NOT NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE QRTZ_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
JOB_NAME VARCHAR(200) NOT NULL,
JOB_GROUP VARCHAR(200) NOT NULL,
DESCRIPTION VARCHAR(250) NULL,
NEXT_FIRE_TIME BIGINT(13) NULL,
PREV_FIRE_TIME BIGINT(13) NULL,
PRIORITY INTEGER NULL,
TRIGGER_STATE VARCHAR(16) NOT NULL,
TRIGGER_TYPE VARCHAR(8) NOT NULL,
START_TIME BIGINT(13) NOT NULL,
END_TIME BIGINT(13) NULL,
CALENDAR_NAME VARCHAR(200) NULL,
MISFIRE_INSTR SMALLINT(2) NULL,
JOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,JOB_NAME,JOB_GROUP)
REFERENCES QRTZ_JOB_DETAILS(SCHED_NAME,JOB_NAME,JOB_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE QRTZ_SIMPLE_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
REPEAT_COUNT BIGINT(7) NOT NULL,
REPEAT_INTERVAL BIGINT(12) NOT NULL,
TIMES_TRIGGERED BIGINT(10) NOT NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE QRTZ_CRON_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
CRON_EXPRESSION VARCHAR(120) NOT NULL,
TIME_ZONE_ID VARCHAR(80),
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE QRTZ_SIMPROP_TRIGGERS
(
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
STR_PROP_1 VARCHAR(512) NULL,
STR_PROP_2 VARCHAR(512) NULL,
STR_PROP_3 VARCHAR(512) NULL,
INT_PROP_1 INT NULL,
INT_PROP_2 INT NULL,
LONG_PROP_1 BIGINT NULL,
LONG_PROP_2 BIGINT NULL,
DEC_PROP_1 NUMERIC(13,4) NULL,
DEC_PROP_2 NUMERIC(13,4) NULL,
BOOL_PROP_1 VARCHAR(1) NULL,
BOOL_PROP_2 VARCHAR(1) NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE QRTZ_BLOB_TRIGGERS (
SCHED_NAME VARCHAR(120) NOT NULL,
TRIGGER_NAME VARCHAR(200) NOT NULL,
TRIGGER_GROUP VARCHAR(200) NOT NULL,
BLOB_DATA BLOB NULL,
PRIMARY KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP),
INDEX (SCHED_NAME,TRIGGER_NAME, TRIGGER_GROUP),
FOREIGN KEY (SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP)
REFERENCES QRTZ_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIGGER_GROUP))
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE QRTZ_CALENDARS (
SCHED_NAME VARCHAR(120) NOT NULL,
CALENDAR_NAME VARCHAR(200) NOT NULL,
CALENDAR BLOB NOT NULL,
PRIMARY KEY (SCHED_NAME,CALENDAR_NAME))
ENGINE=InnoDB DEFAULT CHARSET=utf8;

[Msg] Finished - Unsuccessfully

流程图绘制优化

希望在绘制流程图时,可以在选择审批人时自动查询出系统里的用户

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.