ContiNew

什么是 ContiNew Admin

ContiNew Admin 是什么、为什么而生(维护者自述的项目起源)、核心特性与前后端技术栈基线。

本文是 4.x 的归档文档(冻结于 v4.2.0)。该分支只接收勘误修正, 内容基本不再变动;文中的源码路径、配置项与版本号均以 4.2.x 为准,不建议用于新项目。

新项目请查看 5.x 最新文档。已在 4.2.x 上运行的项目,本文仍是可靠依据。

是什么

AI 编程纪元已经开启,基于 ContiNew 项目开发,让 AI 助手“学习”更优雅的代码规范,“写出”更优质的代码。

ContiNew Admin(Continue New Admin),页面现代美观,且专注设计与代码细节的 高质量多租户中后台 管理系统框架。开箱即用,持续迭代优化,持续提供舒适的开发体验。

我们始终坚信好的产品必然是反复打磨出来的,而在工作中我们受限于客户需求、开发周期等因素,无法深度打磨、重构我们的代码,这也是架构腐烂的根源。所以,我们希望能在业余时间,通过开源社区的力量来打磨出一个好的产品,一个好的实践,一个好的生态。

我们的愿景在于,当你将 ContiNew 系列项目应用到工作场景时,不仅仅是得到效率的提高,更可以得到舒适的开发体验,让更多开发者的编程工作多一点“甜”。

工程形态上,后端为 Maven 多模块工程(依赖自上而下为 continew-server → continew-system → continew-common),基于 Spring Boot 3(Java 17),启动类为 top.continew.admin.ContiNewAdminApplication,dev 环境端口 8000;前端为独立仓库 continew-admin-ui,基于 Vue 3、Arco Design、TypeScript 与 Vite。框架的通用基础能力(CRUD 套件、认证、租户、数据权限、缓存、日志等)抽离在 ContiNew Starter 中,以 BOM 方式引入(2.17.0),Admin 在其上做业务实现与工程级扩展。

项目起源

我热衷于做数据归档,归档后的数据可以提高学习/工作效率,为记忆“减负”,在持续的数据归档中,优质的“沉淀”会带来非匀速、跨越式的学习/工作体验。数据归档是一件需要持续去做的事情。

从接触程序代码的第一天,我的程序数据归档也随之开始了,刷过的算法题、笔记、对接各种组件的配置文件,甚至于一些亮眼的样式设计、“如诗”的代码片段。这些数据的沉淀丰富了我的解决方案,提高了我的编程效率,逐渐为各种场景落实成了一个个雏形程序。再后来,我意识到,我归档的这些雏形程序,有一个更为妥贴的名称:程序框架/脚手架。

技术的发展,导致这些雏形程序的生命周期很是短暂,它们有别于我归档的其他数据,有时由于工作的原因,没有时间很好的去沉淀它们,在使用时变得越来越不顺手。所以,某段时间,我放弃了维护,而是去采用一些更为成熟的框架。

不过,在陆续几年使用了一些成熟框架后,我前后遇到了一些困难:

  1. 代码洁癖想要找到一个扩展性佳,代码规范良好,开发体验舒适的框架很不容易,总是差些什么
  2. 项目上手困难或是基础版功能不全,需要的全在专业版,亦或者代码阅读性差,文档收费
  3. 部分解决方案缺失,已有解决方案也过于偏向样板化,无法形成良好的逻辑闭环
  4. 好不容易找到一些相较合适的,没过多久,部分作者可能暂时没法对外发“电”了,随着了解深入,很多 Bug 或新技术趋势还是需要自己研究解决

在工作中,很多想法/设计受限于客户需求、开发工期,必须优先以交付为导向,但一些优秀的实践需要花时间持续进行沉淀,只要我没跳出这个圈子,我还是需要一直去做好程序归档。“种一棵树最好的时间是十年前,其次是现在”,最终,我选择在业余时间更加正视这件事,从头归档沉淀,从添加每一个依赖开始,我希望它能持续的迭代优化、演进,所以我把它命名为 ContiNew(Continue New)。并且这次我选择了开源,我希望它不仅仅能吸收我的需求和沉淀,而是依托开源协作模式,及时发现更多的问题,接受更多的可能性,沉淀更优秀的思考,设计。

解决什么问题

中后台项目的重复工作集中在权限模型、认证会话、文件存储、日志审计、任务调度这些横切能力上。ContiNew Admin 给出一套已经组合好且经过生产验证的默认实现,让新项目的起点是业务代码,而不是脚手架代码。

已经内置并开箱可用的功能包括用户、角色、菜单、部门、字典、参数配置、通知公告、文件管理(回收站与分片上传)、存储配置、短信配置、客户端配置、在线用户、登录与操作日志、多租户与租户套餐、AK/SK 能力开放、任务调度、代码生成。功能清单与使用方式见功能手册。

核心特性

多租户行级隔离:基于 ContiNew Starter 的 continew-starter-extension-tenant-mp(MyBatis-Plus 行级隔离),租户 ID 经 X-Tenant-Id 请求头传递,默认租户 ID 为 0。租户管理、套餐管理由 continew-plugin-tenant 插件提供。

认证与多方式登录:基于 Sa-Token(1.45.0)+ JWT,Token 名 Authorization。内置账号密码、邮箱验证码、手机验证码、JustAuth 第三方登录四种处理器。自 4.2.0 起引入 continew-starter-auth-refresh-token,采用 Access Token(内存持有)+ Refresh Token(HttpOnly Cookie)双令牌轮换。Token 有效期在「客户端配置」页面按端动态管理。

数据权限:基于 continew-starter-extension-datapermission-mp,Mapper 继承 DataPermissionMapper(continew-common 的 base/mapper 包),由 DefaultDataPermissionUserDataProvider 提供当前用户数据范围,角色与部门的数据权限关联存于 sys_role_dept 表。

CRUD 套件:Controller 标注 @CrudRequestMapping 并继承 BaseController,BaseController.preHandle 按 API 类型自动生成并校验权限码。例如 POST /system/user 自动要求 system:user:create 权限,无需手写鉴权注解。该套件由 ContiNew Starter 提供,完整说明见 CRUD 套件文档。

可插拔插件:能力开放(AK/SK 签名)、多租户、任务调度(Snail Job)、代码生成器四个功能以 continew-plugin 下的独立模块交付,可按需引入或裁剪。任务调度默认关闭(snail-job.enabled: false),生产配置默认开启。

代码生成器:连接数据库表生成后端 Controller/Service/Mapper/Entity 等 11 个模板与前端列表页、新增弹窗、详情抽屉等 4 个模板,产物与现有分层约定一致,生成后即可参与 CRUD 权限体系。

技术栈基线

后端(第三方依赖版本统一由父 POM ContiNew Starter 的依赖管理供给,根 pom.xml 的 parent 指向 top.continew.starter:continew-starter):

依赖版本
Spring Boot3.5.16
JDK17
ContiNew Starter(BOM)2.17.0
Sa-Token1.45.0
MyBatis Plus3.5.17
Liquibase4.31.1
JetCache2.7.9
Redisson3.52.0
CosID2.13.3
FastExcel1.3.0
Snail Job1.10.0
X File Storage2.3.0
SMS4J3.3.5
JustAuth1.16.7
Crane4j2.10.0
Hutool5.8.47

前端(版本取自 continew-admin-ui 的 package.json):

依赖版本
Vue3.5.4
Arco Design(@arco-design/web-vue)2.57.0
TypeScript5.0.4
Vite5.1.5
vue-router4.3.3
Pinia2.0.16
pnpm9.3.0

运行环境要求(JDK 17 为 Spring Boot 3 的最低要求):JDK 17、MySQL 8.0.42(亦支持 PostgreSQL,脚本位于 db/changelog/postgresql)、Redis 7.2.8、Maven 3.9+(仓库内置 mvnw)。

下一步

相关源码

目录