# WellCloud **Repository Path**: well-plus/WellCloud ## Basic Information - **Project Name**: WellCloud - **Description**: well平台,专注于将服务模块化,单点应用也可以拔插即用 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2020-07-30 - **Last Updated**: 2023-07-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 项目名 well平台 ### 平台脚手架 平台的基础功能使用guns脚手架开发 gun6.0 更新版本日期:2019.10.25对应版本 ### 扩展功能 1、目录结构调整 cloud |_docs |_cloud_base (基础模块) | |_cloud_base_generator 代码生成器模块 | |_cloud_base_comm 公共模块 | |_cloud_base_auth 权限模块 | |_cloud_base_sys 系统管理模块 |_cloud_main (启动模块) | |_cloud_main_admin 后台入口模块(带管理页面) | |_cloud_base_api api接口模块 |_cloud_plugins (插件模块) |_cloud_plugins_datasource 数据库连接插件(后期会重新优化) |_cloud_plugins_mutidatasource 多数据源切换插件(已完成) |_cloud_plugins_quartz 定时任务插件(单应用版,已优化完成) |_cloud_plugins_quartz_dcs 定时任务插件(中间件版,未完成) |_cloud_plugins_wechat 微信插件(开发中) A、cloud_base目录下的模块是基础模块,正常的一个业务系统都应具备的 B、cloud_main目录下的模块是启动模块,可以理解为业务模块,跟业务直接相关,当业务达到一定水平后,可抽取出来放到 插件目录下,让业务变得可拔插 C、cloud_plugins目录下的模块是插件模块,可拔插,直接引用,默认可扫描到,若自行扩展请按照包命名方式进行扩展,否则需要主动配置扫描, 当不想使用时,取消引用不会影响整个框架的运行 1. 前端框架easyweb 3.1.5,layui 2.5.5。 2. 抽象出一套权限模型,利用接口进行权限控制和调用规则,方便在权限控制方面进行拓展。 3. 统一采用LoginContextHolder.getContext().getUser()获取当前登录用户。 4. 权限框架 spring security + jwt,采用令牌登录方式,更加灵活可拓展,同时方便对接多系统SSO。 5. 新增常量容器模型,对系统变量,常量,以及用户自定义的一些参数进行在线维护,在线刷新参数值,无需重启。 6. 系统的验证码开关,顶部导航栏开关,系统默认密码等在常量容器进行维护,极大方便了系统使用。 7. 所有页面加载的css和js进行版本控制,当升级项目时,更新对应版本号,可控制浏览器对缓存js和css的刷新。 ### 版权声明 采用LGPL-3.0开源协议 ### 前端模板 * 所用前端模板为EasyWeb后台开发框架,官网地址为:[https://easyweb.vip/](https://easyweb.vip/) ### 管理系统功能 1.用户管理 2.角色管理 3.部门管理 4.菜单管理 5.字典管理 6.业务日志 7.登录日志 8.监控管理 9.通知管理 10.职务管理 11.代码生成 12.在线参数配置 ### 项目特点 1. 基于SpringBoot,简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 2. 完善的日志记录体系,可记录登录日志,业务操作日志(可记录操作前和操作后的数据),异常日志到数据库,通过@BussinessLog注解和LogObjectHolder.me().set()方法,业务操作日志可具体记录哪个用户,执行了哪些业务,修改了哪些数据,并且日志记录为异步执行,详情请见@BussinessLog注解和LogObjectHolder,LogManager,LogAop类。 3. 利用beetl模板引擎对前台页面进行封装和拆分,使臃肿的html代码变得简洁,更加易维护。 4. 对常用js插件进行二次封装,使js代码变得简洁,更加易维护。 5. controller层采用map + warpper方式的返回结果,返回给前端更为灵活的数据,具体参见cn.well.cloud.sys.modular.system.warpper包中具体类。 6. 防止XSS攻击,通过XssFilter类对所有的输入的非法字符串进行过滤以及替换。 7. 简单可用的代码生成体系,通过SimpleTemplateEngine可生成带有主页跳转和增删改查的通用控制器、html页面以及相关的js,还可以生成Service和Dao,并且这些生成项都为可选的,通过ContextConfig下的一些列xxxSwitch开关,可灵活控制生成模板代码,让您把时间放在真正的业务上。 8. 控制器层统一的异常拦截机制,利用@ControllerAdvice统一对异常拦截,具体见com.stylefeng.guns.core.aop.GlobalExceptionHandler类。 9. 页面统一的js key-value单例模式写法,每个页面生成一个唯一的全局变量,提高js的利用效率,并且有效防止多个人员开发引起的函数名/类名冲突,并且可以更好地去维护代码。 10. 在线系统参数配置,灵活控制常用功能的开关,无需重启项目即可生效,实时刷新。 ### 业务日志记录 日志记录采用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常用代码的封装 在cloud-base-sys工程下,webapp/common/js/目录中,有对常用js代码的封装,例如Feng.js,其中Feng.info(),Feng.success(),Feng.error()三个方法,分别封装了普通提示,成功提示,错误提示的代码,简化了layer提示层插件的使用。 ### 独创controller层,map+warpper返回方式 map+warpper方式即为把controller层的返回结果使用BeanKit工具类把原有bean转化为Map的的形式(或者原有bean直接是map的形式),再用单独写的一个包装类再包装一次这个map,使里面的参数更加具体,更加有含义,下面举一个例子,例如,在返回给前台一个性别时,数据库查出来1是男2是女,假如直接返回给前台,那么前台显示的时候还需要增加一次判断,并且前后端分离开发时又增加了一次交流和文档的成本,但是采用warpper包装的形式,可以直接把返回结果包装一下,例如动态增加一个字段sexName直接返回给前台性别的中文名称即可。 ### 独创mybatis数据范围拦截器,实现对数据权限的过滤 数据范围控制是指,对拥有相同角色的用户,根据部门的不同进行相应的数据筛选,如果部门不相同,那么有可能展示出的具体数据是不一致的.所以说Guns对数据范围控制是以部门id为单位来标识的,如何增加数据范围拦截呢?只需在相关的mapper接口的参数中增加一个DataScope对象即可,DataScope中有两个字段,scopeName用来标识sql语句中部门id的字段名称,例如deptiid或者id,另一个字段deptIds就是具体需要过滤的部门id的集合.拦截器原理如下:拦截mapper中包含DataScope对象的方法,获取其原始sql,并做一个包装限制部门id在deptIds范围内的数据进行展示. ### swagger api管理使用说明 swagger会管理所有包含@ApiOperation注解的控制器方法,同时,可利用@ApiImplicitParams注解标记接口中的参数,具体用法请参考CodeController类中的用法。 ``` @ApiOperation("业务测试接口") @ApiImplicitParams({ @ApiImplicitParam(name = "moduleName", value = "模块名称", required = true, dataType = "String"), @ApiImplicitParam(name = "bizChName", value = "业务名称", required = true, dataType = "String"), @ApiImplicitParam(name = "bizEnName", value = "业务英文名称", required = true, dataType = "String"), @ApiImplicitParam(name = "path", value = "项目生成类路径", required = true, dataType = "String") }) @RequestMapping(value = "/generate", method = RequestMethod.POST) ``` ### jwt token鉴权机制 jwt token鉴权机制是指若需要请求服务器接口,必须通过AuthController获取一个请求令牌(jwt token),持有jwt token的用户才可以访问服务器的其他资源,如果没有此令牌,则访问接口会直接忽略,请求获取jwt token时,需要携带credenceName和credenceCode(可以是账号密码,可以是手机号验证码等等),校验credenceName和credenceCode成功后,会颁发给客户端一个jwt token还有一个随机字符串,用于传输过程中对数据进行签名用,签名机制请见下面介绍.基于token的鉴权机制类似于http协议也是无状态的,它不需要在服务端去保留用户的认证信息或者会话信息.这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了,这就为应用的扩展提供了便利. ### 签名机制 签名机制是指客户端向服务端传输数据中,对传输数据进行md5加密,并且加密过程中利用Auth接口返回的随机字符串进行混淆加密,并把md5值同时附带给服务端,服务端通获取数据之后对数据再进行一次md5加密,若加密结果和客户端传来的数据一致,则认定客户端请求的数据是没有被篡改的,若不一致,则认为被加密的数据是被篡改的