# tware **Repository Path**: chwhale/tware ## Basic Information - **Project Name**: tware - **Description**: 基于springboot、vue3.0开发的web开发框架 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: https://www.chwhale.com/ - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 6 - **Created**: 2023-02-09 - **Last Updated**: 2025-08-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![logo-cornflower-blue](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/logo-cornflower-blue.png) ## Tware # 快速开始 ## 框架介绍 ### 基础信息 > 该架构由多位开发经验十年以上的工程师进行研发,2015年Tware架构诞生,随着研发技术的更新换代,Tware也经历了多个版本的更新迭代。目前Tware已更新到5.0版本(springboot+mybatis+vue3.0),并在多家大中型企业中用于底层架构的搭建研发。 ### 快速链接 待完善 ### 开源组件清单 - mybatis-plus - pagehelper - druid - springfox-swagger2 - knife4j - easypoi - dynamic-datasource - flowable ### 环境搭建 * 安装环境 ``` JDK >= 1.8 (推荐1.8版本) Mysql >= 5.7.0 (推荐5.7版本) Redis >= 3.0 Maven >= 3.0 Node >= 12 ``` - 项目构建 **eclipse** 1、前往`Gitee`下载代码(https://gitee.com/chwhale/tware.git)下载解压到工作目录 2、导入到`Eclipse`,菜单 `File` -> `Import`,然后选择 `Maven` -> `Existing Maven Projects`,点击 `Next`> 按钮,选择工作目录,然后点击 `Finish` 按钮,即可成功导入。 `Eclipse`会自动加载`Maven`依赖包,初次加载会比较慢(根据自身网络情况而定) 3、创建数据库`twb`并导入数据脚本`twb.sql` 4、启动redis服务 5、打开项目运行`com.twb.TwbApplication`,控制台打印`服务启动成功!!`表示启动成功。 **idea** 1、`Check out from Version Control` -> `Git`,导入之后idea会自动进行构建 2、创建数据库`twb`并导入数据脚本`twb.sql` 3、启动redis服务 4、打开项目运行`com.twb.TwbApplication`,控制台打印`服务启动成功!!`表示启动成功。 ### 业务模块 ![image-20221031174009658](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221031174009658.png) ### 效果图 ## ![image-20220906221804341](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20220906221804341.png) ![image-20221222145043176](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145043176.png) ![image-20221222151105497](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222151105497.png) ![image-20221222145307482](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145307482.png) ![image-20221222145346033](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145346033.png) ![image-20221222151125290](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222151125290.png) ![image-20221222145452352](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145452352.png) ![image-20221222151154393](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222151154393.png) ![image-20221222145539040](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145539040.png) ![image-20221222145558881](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145558881.png) ![image-20221222145619377](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145619377.png) ![image-20221222145643916](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145643916.png) ![image-20221222145659234](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145659234.png) ![image-20221222145708215](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145708215.png) ![image-20221222145724404](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222145724404.png) ![image-20221222153005186](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222153005186.png) ![image-20221222150841095](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222150841095.png) ![image-20221222150910872](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222150910872.png) # 开发架构 ## twb后端模块说明 ~~~ twb ├── twb-starter-auth // 权限管理模块 ├── twb-starter-auth-entity // 权限管理实体类 ├── twb-starter-auth-security // 权限管理权限验证工具包 ├── twb-starter-code-gen // 代码生成模块 ├── twb-starter-core // 核心模块 ├── twb-starter-filecenter // 文件管理模块 ├── twb-starter-log // 日志管理模块 ├── twb-starter-message // 消息管理模块 ├── twb-starter-netty // 消息推送模块 ├── twb-starter-quartz // 定时任务模块 ├── twb-starter-run // 启动类 ├── twb-starter-system // 公共模块(字典、系统配置等) ├── twb-starter-system-entity // 公共模块实体类 ├── twb-starter-wechat // 微信工具类模块 ├── pom.xml // 公共依赖 ~~~ # 开发手册 ## 开发规范 **entity:** 1.entity分为“业务对象(表对象)”、“VO对象(前端入参接收对象)”、“DTO对象(前端出参返回对象)” 2.业务对象(表对象): ​ 1)命名方式:**TableName**,表名(驼峰) ​ 2)如果含有**“基础字段”**,继承BaseEntity ​ 3)如果**需要乐观锁**,且含有“基础字段”,继承BaseVersionEntity ​ 4)类名上方需添加**@Table**(name="表名")注解,和数据表绑定 ​ 5)主键列必须存在,且需注释**@Id** ​ 6)所有属性,如果不符合驼峰转下划线规范,则需添加**@Column**(name="列名") ​ 7)所有属性必须制定jdbcType对应数据库数据类型,**@ColumnType**(jdbcType=JdbcType.*) ​ 8)类必须继承**Serializable** 3.Vo对象(主要用于接收前端传回的参数) ​ 1)命名方式:方法名+Vo ​ 2)类名上方需添加**@ApiModel**(value="类名",description="对象描述") ​ 3)所有属性需添加**@ApiModelProperty**(value="属性描述") ​ 4)如果需要接收分页参数,继承**PageVo** 4.Dto对象(主要用于将数据返回给前端) ​ 1)命名方式:方法名+Dto ​ 2)类名上方需添加**@ApiModel**(value="类名",description="对象描述") ​ 3)所有属性需添加**@ApiModelProperty**(value="属性描述") ​ 4)如果需要“基础字段”,则继承**BaseDto** **controller:** > 1.controller类需添加如下注解: > > > > @RestController > > > > > @RequestMapping("接口地址前缀") > > > > > @Api(tags = "接口类描述",value="类名") > > 2.入参需用**vo**对象接受 > > 3.出参需用**dto**对象返回 > > 4.入参和出参均**不可使用业务对象(表对象)** > > 5.需继承[com]().tw.[core]().[base]().[controller]().**BaseController** > > 6.controller中**不允许出现mapper**对象,所有数据库查询**通过service处理** > > 7.查询方法注解使用@**GetMapping**,其他事务类方法使用@**PostMapping** > > 8.所有controller方法使用**Result** 作为返回信息,可使用**Results**工具类进行数据封装处理。 > > 9.所有controller方法需添加**@ApiOperation注解**,说明方法作用,方便前后端开发人员接口对接 > > 10.如果方法不需要**token验证**,添加@Auth(verifyToken=false) > > 11.命名方式:**TableName**Controller,表名(驼峰)+Controller **service 接口:** 1.interface需继承[com]().twb.[core]().[base]().[service]().**IBaseService** 2.实现类需继承[com]().twb.[core]().[base]().[service]().[impl]().BaseService,并实现相应的interface 3.实现类需添加@**Service**("tableNameService")注解 4.需要事务的方法需添加@**Transactional**注解 5.业务类异常使用**ServiceException**抛出 6.命名方式:**TableNameService**,表名(驼峰)+Service 7.分页查询方法示例 `public TwbPageInfo searchBootTest(SearchBootTestVo vo) { TwbPageUtil.startPage(vo); List list = bootTestMapper.searchBootTest(vo); return TwbPageUtil.of(list); }` **mapper:** 1.Mapper接口需继承TwbBaseMapper类 2.Mapper接口需添加注解@Mapper 3.命名方式:**TableNameMapper(.xml)**,表名(驼峰)+Mapper **数据库:** 1.表名和列明统一使用**下划线**方式命名(非必须) 2.基础列:(非必须) | 列名 | 编码 | 类型 | 长度 | 备注 | | ------------ | ----------- | -------- | ---- | ---------------------------- | | 主键 | ID | varchar | 32 | | | 逻辑删除标识 | ISDEL | INT | | 0:未删除;1:已删除;默认0 | | 创建人ID | CREATOR_ID | varchar | 32 | | | 创建人名称 | CREATOR | varchar | 100 | 建议存登录帐号 | | 创建时间 | CREATE_DATE | datetime | | | | 更新人ID | UPDATER_ID | varchar | 32 | | | 更新人名称 | UPDATER | varchar | 100 | 建议存登录帐号 | | 更新时间 | UPDATE_DATE | datetime | | | | 乐观锁版本号 | VERSION | INT | | 如果需要乐观锁,则添加此字段 | **方法命名规约:** 1) 获取单个对象的方法用 get 做前缀。 2) 获取多个对象的方法用 list/search(分页) 做前缀。 3) 获取统计值的方法用 count 做前缀。 4) 插入的方法用 save 做前缀。 5) 删除的方法用 delete 做前缀。 6) 修改的方法用 update 做前缀。 ## 权限相关 接口权限主要通过@Auth注解进行控制,默认所有接口都会进行权限校验。verifyToken=true表示验证登录权限,verifyUrl=true表示验证API接口权限。verifyToken优先级要高于verifyUrl,即veriftyToken=false则verifyUrl=false。案例参考: 1)忽略登录校验/完全开放: ` @Auth(verifyToken=false) @GetMapping("/getById") @ApiOperation(value = "根据ID获取系统日志详情") public Result getTwbLogOperationById( @NotBlank @RequestParam @ApiParam(value = "序号", name = "id", required = true) String id) { TwbLogOperation twbLogOperation = twbLogOperationService.getById(id); GetTwbLogOperationByIdDto LogOperationDto = new GetTwbLogOperationByIdDto(); BeanUtils.copyNotNullProperties(twbLogOperation, LogOperationDto); return Results.successWithData(LogOperationDto); }` 2)忽略接口权限校验: ` @Auth(verifyUrl=false) @GetMapping("/getById") @ApiOperation(value = "根据ID获取系统日志详情") public Result getTwbLogOperationById( @NotBlank @RequestParam @ApiParam(value = "序号", name = "id", required = true) String id) { TwbLogOperation twbLogOperation = twbLogOperationService.getById(id); GetTwbLogOperationByIdDto LogOperationDto = new GetTwbLogOperationByIdDto(); BeanUtils.copyNotNullProperties(twbLogOperation, LogOperationDto); return Results.successWithData(LogOperationDto); }` ## 系统配置 配置页面如下: ![image-20221031163050185](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221031163050185.png) 如何获取配置项: 架构内置**SystemGlobal**对象,可通过SystemGlobal获取系统配置以及字典内容等信息 `SystemGlobal.sysConfig("log")` ## 数据权限 数据权限可通过角色管理模块进行配置,数据权限优先级为全部数据> 本公司及以下数据 > 本公司数据 > 本部门及以下数据 > 本部门数据 > 仅本人数据 **使用方式:** Mapper增加**@DataScope**注解(可作用于方法和类),deptAlias为部门表别名,默认无别名;userAlias为用户表别名,默认无别名;ignore标识是否需要忽略,默认false。 **获取用户数据权限:** `TwbSecurityUtil.getLoginUserDataScopes(token);` ## 租户模式 租户模式可通过配置文件进行开启或关闭,配置样例如下: ![image-20221031175133450](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221031175133450.png) ## 定时任务 参考com.twb.quartz.jobs.TwbDemoJob,在yml配置文件中需要开启定时任务。 yml配置: `twb: quartz: enabled: true` 配置页面如下: ![image-20221222153623337](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221222153623337.png) ## 登录、权限、日志拦截器配置 参考spring-aop.xml ## 业务异常 业务异常统一使用**ServiceException**进行处理,其他异常统一通过全局异常进行处理。 ## 当前登录用户 在**controller**层可使用**this.getLoginUser()**获取登录用户,该用户默认为BaseLoginUser,可自行扩展(注:尽量不要直接改BaseLoginUser,架构已经通过泛型预留了扩展接口,可声明一个新的登录用户对象,并继承BaseLoginUser即可。)。 `BaseLoginUser baseLoginUser = this.getLoginUser();//默认登录用户对象` `SelfLoginUser selfLoginUser = this.getLoginUser();//自定义登录用户对象` ## 代码生成 可以一次性生成单表的crud前后端页面。页面如下: ![image-20221031165657593](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221031165657593.png) ![image-20221031165715673](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221031165715673.png) ![image-20221031165741226](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221031165741226.png) ![image-20221031165754628](https://gitee.com/chwhale/tware/raw/master/后端/twb/docs/images/image-20221031165754628.png) # 如何搭建自己的项目 ## 源码模式 将Tware下载下来,在Tware项目内新增maven module业务模块即可 ## 私服引入模式(推荐) 该模式需要企业内有自己的maven私服,将Tware通过mvn build构建到私服中,新建项目时,将Tware中的模块根据实际需求在pom中引入即可。