#scaffold V2.2

新版scaffold基于SpringBoot全面升级,完美整合springmvc + shiro + mybatis-plus + beetl!

在不用写xml配置(V1.0)的基础上进一步简化项目配置,让您更专注于业务开发!抛弃传统spring xml的配置方式,利用springboot + javabean方式配置spring,极大简化了pom.xml配置和spring配置.

scaffold项目代码简洁,注释丰富,上手容易,同时scaffold包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),可以直接作为一个后台管理系统的脚手架.

鸣谢

##技术讨论

如果对项目有任何疑问或者建议,欢迎加入scaffold技术交流群:600485702(加之前请先看一遍readme文档)

V2.2更新日志

菜单树由最多二级菜单拓展为三级菜单

用户管理页面新增部门树,方便查询部门人员信息

完善系统的session机制,增加session失效时间的跳转

完善scaffold代码生成功能,新增Dao和Service,并且所有的生成都是可选的

删除信息增加提示框

删除父菜单可以删除所有子菜单

新增对页面的js验证,所用框架为bootstrap validator

完善druid监控,新增Web应用监控,URI监控,session监控

修复新增含有0值的字典,查询会出现多条的bug

修复没有角色的用户登录报错的bug

注:SpringBoot强大的Auto Config和统一的依赖管理极大的简化了spring配置和maven依赖,在不了解其都配置了哪些东西的基础上可能会对初学者有一定困扰,所以建议初学者先看scaffold V1.0

##功能简介

用户管理

角色管理

部门管理

菜单管理

字典管理

业务日志

登录日志

监控管理

通知管理

代码生成

##使用说明

导入sql/scaffold.sql文件到mysql数据库

以maven方式导入项目到ide

修改application.yml中的数据库相关的配置,改为您本机的数据库配置

启动项目,管理员账号admin/密码111111

###如何启动项目

scaffold目前支持三种启动方式:

在IDE里运行ScaffoldApplication类中的main方法启动

执行如下maven命令

clean package -Dmaven.test.skip=true

并从target目录中找到scaffold-1.0.0-SNAPSHOT.jar,并在jar包的目录下执行如下java命令

java -jar scaffold-1.0.0-SNAPSHOT.jar

修改pom.xml中如下片段

jar

改为

war

并打包放入到tomcat中执行

###注意

建议本项目用jdk1.8,经测试jdk1.7登录页面会导致css丢失

##所用框架

###前端

Bootstrap v3.3.6

jQuery v2.1.4

bootstrap-table v1.11.1

layer v2.1

zTree core v3.5.28

WebUploader 0.1.5

###后端

SpringBoot 1.5.3.RELEASE

MyBatis-Plus 2.0.8

MyBatis 3.4.4

Spring 4.3.8.RELEASE

Beetl 2.7.15

hibernate-validator 5.3.5.Final

Ehcache 3.3.1

Kaptcha 2.3.2

Fastjson 1.2.31

Shiro 1.4.0

Druid 1.0.31

##项目包结构说明

├─main

│ │

│ ├─java

│ │ │

│ │ ├─com.gaowh.scaffold----------------项目主代码

│ │ │ │

│ │ │ ├─common----------------项目公用的部分(业务中经常调用的类,例如常量,异常,实体,注解,分页类,节点类)

│ │ │ │

│ │ │ ├─config----------------项目配置代码(例如mybtais-plus配置,ehcache配置等)

│ │ │ │

│ │ │ ├─core----------------项目运行的核心依靠(例如aop日志记录,拦截器,监听器,scaffold模板引擎,shiro权限检查等)

│ │ │ │

│ │ │ ├─modular----------------项目业务代码

│ │ │ │

│ │ │ ├─scaffoldApplication类----------------以main方法启动springboot的类

│ │ │ │

│ │ │ └─scaffoldServletInitializer类----------------用servlet容器启动springboot的核心类

│ │ │

│ │ └─generator----------------mybatis-plus Entity生成器

│ │

│ ├─resources----------------项目资源文件

│ │ │

│ │ ├─scaffoldTemplate----------------scaffold代码生成模板

│ │ │

│ │ ├─application.yml----------------springboot项目配置

│ │ │

│ │ └─ehcache.xml----------------ehcache缓存配置

│ │

│ └─webapp----------------web页面和静态资源存放的目录

注:SpringBoot项目默认不支持将静态资源和模板(web页面)放到webapp目录,但是个人感觉resources目录只放项目的配置更加简洁,所以就将web页面继续放到webapp目录了.

##项目特点

基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。

完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库,通过@BussinessLog注解和LogObjectHolder.me().set()方法,业务操作日志可具体记录哪个用户,执行了哪些业务,修改了哪些数据,并且日志记录为异步执行,详情请见@BussinessLog注解和LogObjectHolder,LogManager,LogAop类。

利用beetl模板引擎对前台页面进行封装和拆分,使臃肿的html代码变得简洁,更加易维护。

对常用js插件进行二次封装,使js代码变得简洁,更加易维护,具体请见webapp/static/js/common文件夹内js代码。

利用ehcache框架对经常调用的查询进行缓存,提升运行速度,具体请见ConstantFactory类中@Cacheable标记的方法。

controller层采用map + warpper方式的返回结果,返回给前端更为灵活的数据,具体参见com.gaowh.scaffold.modular.system.warpper包中具体类。

防止XSS攻击,通过XssFilter类对所有的输入的非法字符串进行过滤以及替换。

简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还可以生成Service和Dao,并且这些生成项都为可选的,通过ContextConfig下的一些列xxxSwitch开关,可灵活控制生成模板代码,让您把时间放在真正的业务上。

控制器层统一的异常拦截机制,利用@ControllerAdvice统一对异常拦截,具体见com.gaowh.scaffold.core.aop.GlobalExceptionHandler类。

页面统一的js key-value单例模式写法,每个页面生成一个唯一的全局变量,提高js的利用效率,并且有效防止多个人员开发引起的函数名/类名冲突,并且可以更好地去维护代码。

##基于javabean方式的spring配置

scaffold以简洁为核心,抛弃了传统的易错,臃肿xml配置,采用javabean的方式配置spring,简化了项目的配置,如下示例为配置mybatis-plus和数据源:

@Configuration

@MapperScan(basePackages = {"com.gaowh.scaffold.modular.*.dao", "com.gaowh.scaffold.common.persistence.dao"})

public class MybatisPlusConfig {

@Autowired

DruidProperties druidProperties;

/**

* mybatis-plus分页插件

*/

@Bean

public PaginationInterceptor paginationInterceptor() {

PaginationInterceptor paginationInterceptor = new PaginationInterceptor();

paginationInterceptor.setDialectType(DBType.MYSQL.getDb());

return paginationInterceptor;

}

/**

* druid数据库连接池

*/

@Bean(initMethod = "init")

public DruidDataSource dataSource() {

DruidDataSource dataSource = new DruidDataSource();

druidProperties.coinfig(dataSource);

return dataSource;

}

}

##业务日志记录原理

日志记录采用aop(LogAop类)方式对所有包含@BussinessLog注解的方法进行aop切入,会记录下当前用户执行了哪些操作(即@BussinessLog value属性的内容),如果涉及到数据修改,会取当前http请求的所有requestParameters与LogObjectHolder类中缓存的Object对象的所有字段作比较(所以在编辑之前的获取详情接口中需要缓存被修改对象之前的字段信息),日志内容会异步存入数据库中(通过ScheduledThreadPoolExecutor类)。

##beetl对前台页面的拆分与包装

例如,把主页拆分成三部分,每个部分单独一个页面,更加便于维护

@include("/common/_tab.html"){}

@include("/common/_right.html"){}

@include("/common/_theme.html"){}

以及对重复的html进行包装,使前端页面更加专注于业务实现,例如,把所有页面引用包进行提取

${layoutContent}

开发页面时,只需编写如下代码即可

@layout("/common/_container.html"){

部门管理

//自定义内容

@}

以上beetl的用法请参考beetl说明文档。

##对js常用代码的封装

在webapp/static/js/common目录中,有对常用js代码的封装,例如Feng.js,其中Feng.info(),Feng.success(),Feng.error()三个方法,分别封装了普通提示,成功提示,错误提示的代码,简化了layer提示层插件的使用。

##极简的图片上传方法

scaffold对web-upload进行二次封装,让图片的上传功能呢只用2行代码即可实现,如下

var avatarUp = new $WebUpload("avatar");

avatarUp.init();

具体实现请参考static/js/common/web-upload-object.js

##独创controller层,map+warpper返回方式

map+warpper方式即为把controller层的返回结果使用BeanKit工具类把原有bean转化为Map的的形式(或者原有bean直接是map的形式),再用单独写的一个包装类再包装一次这个map,使里面的参数更加具体,更加有含义,下面举一个例子,例如,在返回给前台一个性别时,数据库查出来1是男2是女,假如直接返回给前台,那么前台显示的时候还需要增加一次判断,并且前后端分离开发时又增加了一次交流和文档的成本,但是采用warpper包装的形式,可以直接把返回结果包装一下,例如动态增加一个字段sexName直接返回给前台性别的中文名称即可。

##swagger api管理使用说明

swagger会管理所有包含@ApiOperation注解的控制器方法,同时,可利用@ApiImplicitParams注解标记接口中的参数,具体用法请参考CodeController类中的用法。

@ApiOperation(value = "测试接口",notes = "测试接口")

@ApiResponse(code = 200, message = "成功!")

@ApiImplicitParam(name = "str1", value = "参数", required = true, dataType = "String",paramType = "form")

@RequestMapping(value = "/test", method = RequestMethod.POST)

@ResponseBody

@Permission(Const.ADMIN_NAME)

public String test(@RequestParam("str1")String str1) {

String str = str1;

return str1 == null?"参数为空":str1;

}

##常见问题答疑

为何有的业务没有service层: 部分业务比较简单,所以就没写service层,写service是为了让复杂业务更有条理,更清晰.

为何既有dao,又有mapper: mapper是mybatis-plus自动生成的,里边有许多mybatis-plus增强的方法,dao是自己写的业务,mybatis-plus自动生成代码时会覆盖mapper,所以就把自己写的dao分开了,生成代码的时候不影响

为何分页是前端实现:部分页面因为数据量比较少,就直接用客户端分页了,日志页面的分页是采用服务端分页的,如果其他业务有特别需要,可以参考日志的写法

##附图一张

mysql scaffold_GitHub - wggd/scaffold相关推荐

  1. mysql scaffold_dotnet core 3.0.0-preview8 EF DB First mysql和oracle用Scaffold 报错

    用Scaffold命令生成数据库实体类,新建个asp.net core 2.2 webapi项目,在.net core 2.2下是好的,能生成实体类.再新建asp.net core 3.0 webap ...

  2. asp.net mysql 创建变_[ASP.net教程]EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型...

    [ASP.net教程]EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型 0 2018-06-30 07:00:08 官方教程: ...

  3. ubuntu14.04使用rails连接mysql数据库

    rails自带的sqlite3各方面都不错,但是免费版缺少一个致命功能:加密码!虽说第三方有编译好的二进制版的加密版,但咱先不折腾鸟;直接上mysql吧. ubuntu安装mysql非常简单,先不聊; ...

  4. ef mysql 数据模型,EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型...

    官方教程:https://docs.microsoft.com/en-us/aspnet/core/data/?view=aspnetcore-2.1 使用EF CodeFirst在MySql中创建新 ...

  5. .net core 2.1 mysql_ASP.NET Core 2.2 + MySQL + DB First

    1 项目添加 Pomelo.EntityFrameworkCore.MySql 2 编辑项目文件,在节点中添加如下代码: netcoreapp2.2 InProcess 3 CMD 切换到当前项目目录 ...

  6. MySql 使用 EF Core 2.0 CodeFirst、DbFirst、数据库迁移(Migration)介绍及示例

    dotnet core 2.0 发布已经好几天了,期间也把原来 dotnet core 1.1 的 MVC 项目升级到了 2.0,升级过程还是比较顺利的,变动也不是太多.升级的过程中也少不了 Enti ...

  7. MySQL在EF Core下的Scaffolding操作

    Pomelo于2016年11月22日发布的MySQL for ef core中,增加了DbContext Scaffolding的支持,这项功能是让开发者可以从现有的数据库中提取表.列.索引及外键成为 ...

  8. 如何使用Flutter+SpringBoot+Mysql开发一个简易的抽奖APP(Android)教学

    如果你需要项目资源,欢迎来到我的个人博客:https://brath.top/2023/02/24/%E3%80%90Flutter&SpringBoot%E3%80%91%E5%A6%82% ...

  9. 创建第一个 Rails 程序(使用mysql)

    Rails 向来以Web快速开发闻名,究竟有多快,体验了才知道,本文将带你一步步开发一个Rails Web程序,适合Ruby on Rails初学者入门. 大部分内容是从英文教程翻译过来的,原文是基于 ...

最新文章

  1. WordPress qTranslate插件跨站请求伪造漏洞
  2. 【LeetCode】two num 利用comparable接口 对对象进行排序
  3. vue实现点击那个标题就显示哪个标题的细节
  4. 【NOIP2012模拟10.25】旅行
  5. Transform组件C#游戏开发快速入门
  6. vb.net連接ACCESS数据库
  7. 改时区_太平洋奇葩小国:为了虚名改时区,全国仅一个城市,至今仍是部落
  8. cmd mysql 报错_Mysql报错问题汇总
  9. 【转】WCF、Net remoting、Web service概念及区别
  10. 团队行为守则—如果你们由我来领导
  11. python笔记2-冒泡排序
  12. [POI2012]STU-Well(二分答案+神仙操作)
  13. java Socket 编程实例
  14. 大学高数常微分方程思维导图_思维导图_2016考研数学:高数中六种常见题型归纳_沪江英语...
  15. 牛客网sql练习题解(43-51)
  16. 91 卫图与bigemap地图下载器功能对比
  17. unity3d 连接mysql_我学院:Unity3D连接MySql数据库的方法
  18. 解决DELL台式机两用音频接口不能识别耳麦的问题
  19. Count UVA - 1645
  20. Zemax操作35--双高斯镜头优化

热门文章

  1. python设计模式 韦塞尔 pdf下载_《Python设计模式》 [美] 韦塞尔. 巴登霍斯特(Wessel Badenhorst)著 蒲成 译 【正版电子纸书阅读_PDF下载】- 书问...
  2. Spark读取HDFS文件报错:java.net.ConnectException: Call From to localhost:9000 failed on connection
  3. 华为手机根据app的按照目录判断app是否可以卸载的数据分析
  4. STC15实现温控闭环控制,数码管显示温度,按键调节温度,PID控制
  5. 绩效考核功能操作流程
  6. 【Proteus仿真】基于51单片机的八路抢答器
  7. python sklearn PCA 实例-主成分分析
  8. 公司类型其他有限责任公司什么意思
  9. wine安装迅雷、qq2009
  10. 【架构师】零基础到精通——微服务体系