常见问题
温馨提示
以下常见问题仍无法解决你的疑惑,可尝试 进群 与群内各位大佬交流沟通。
其他
提问的智慧 🔥🔥🔥
建议先百度搜索或链接直达阅读 => 《提问的智慧》(如果你做惯了“甲方领导”,请必读!)
维护团队成员都是在各自 业余时间 维护(fā diàn) 开源 项目,有单独全职工作,也有各自生活节奏,所以我们提前告知您:
- 欢迎您在 Issue 中复现存在的问题,Issue 我们必然响应,并且我们非常欢迎您提个 PR 来修复它
- 如果您加入了交流群,可以考虑在交流群内与其他用户大佬交流。维护团队成员视个人意愿及空闲时间解答框架问题,谢绝微信私信提问
- 项目在持续迭代中,此刻调研的您如果觉得它无法满足自身需求,也没有什么亮点,那只说明项目与您的需求不太契合,且仍需要迭代,请口下留情转身调研其他同类框架
- 请勿把维护团队当 “许愿池的王八”,如果你的需求场景仅仅是你的业务,请免开尊口
- 不接受频繁 “催更”,需求墙里列的后续计划 90% 可能性会做,无非时间精力影响,计划会靠前或靠后而已。所以敬请关注需求墙和群动态
常见差评回复
“不是所有的鱼生活在同一片海里”
“道不同,不相为谋”
这类项目这么多,老是开发有什么用?看起来也没什么亮点啊。
为什么要用你这个,还要增加学习成本?为什么不直接用 Xxx?
本项目简介中的项目来源有做详细说明,正式立项于作者当时工作需要,工作自用为主,开源的核心目的是共建和完善,无心推广和参与竞争,如果恰好能帮到更多人,帮助其梳理一个基础规范模板,也能满足作者成就感。
作者热衷细节重构,有代码洁癖,所以项目重点始终在于代码质量(主要后端、次要前端)和解决方案细节完成度,欢迎更多 “代码洁癖”、“志同道合者” 多多 “批判”。
为了降低项目学习成本,在迭代过程中,我们也做了大量的删减和重构,ContiNew Starter 的产生缘由之一也是为了降低学习成本,这是个持续的优化过程。
初级程序员都爱写后台管理框架,因为简单,收获一些 star,到时候可以在简历里吹嘘。
也许你真的是个大牛天天研究算法不下“基层”无此需求,也许是你的标准太低认定写一个中后台管理框架简单。
作者在公司里也从没透露过所用的 ContiNew 框架是自己主导编写的,更遑论简历中。让领导和同事更多关注到自己,把自己“捧杀”?也许有人真有面试需要,但如果是人家用心开发的,为什么不能写在简历中?
项目能商用吗?
项目 | 协议 | 是否可商用 |
---|---|---|
ContiNew Admin | Apache-2.0 开源许可协议 | 可开发商业应用 |
ContiNew Starter | LGPL-3.0 开源许可协议 | 通过 Maven/Gradle 等依赖方式开发商业应用 |
关于 ContiNew Starter 采用 LGPL-3.0 开源协议说明
很多人争议 ContiNew Starter 为什么采用了 LGPL-3.0 开源许可协议?其实这个开源协议本身没有任何问题,出发点就是希望能够汇集更多人的智慧,使通用的东西更加通用。但总有人看惯了 Apache 2.0 和 MIT 之后,下意识就认为这不可商用,这里统一说明一下:
从 ContiNew Admin v2.1.0 版本开始,我们调整了总体设计,抽取并封装后端基础组件及各框架通用集成配置 到 ContiNew Starter 项目。Admin 项目被设计为一个解决方案框架,提供通用应用和方案,而 Starter 项目则是被设计为一个应用脚手架,且发布至了 Maven 中央仓库,这意味着你可以在任意项目中直接引入所需依赖来使用这些配置。即使你不用 Admin 项目,你依然可以直接选择这些 Starter 来让你的 Spring Boot 程序开发变得更 easy!
Starter 的优势:
- 易于迁移: 我们选择一个程序框架的原因就是希望减少重复功能开发,实际上框架带来的不仅仅是成品功能,还有成品的基础配置。你要开始一个 Spring Boot 项目开发,你不需要配置 JSON、API 接口文档、跨域、线程池等配置吗?如果这些配置代码全都在 Admin 里,没有 Starter,那你需要从 Admin 里复制很多的配置到新项目,或者说你要从程序框架中删除很多的配置代码。你能处理好,处理完整吗?你不累吗?我作为使用者之一,我感觉累。
- 易于扩展: 我们针对于 Starter 的开发目标就是通用且基础,不含业务逻辑,在设计和开发某个 starter 模块时,已尽可能开放了更多的“口子”可以进行重写或覆盖,你不妨看看代码。且未来在持续的重构中会继续优化完善,开放更多的“口子”,适配更多的可能,这恰恰需要更多人的智慧。
很多人担心要改代码怎么办? Starter 是一系列组件,如果“口子”不够大,你可以反馈一下我们一起讨论完善,发布个版本很快的。如果不满足你需求,要完全重构,这种场景你完全可以不引入某个 Starter,自己去编写一个自己内部的 Starter,亦或者关闭某个 Starter 的某些配置,改为采用自己的。(LGPL 涉及到的二次开发并不包含重写覆盖配置 @Bean、@Override,这是面向对象和 IOC 的魅力,和开源协议并不冲突,不要过于担忧协议范围)你换个参照物想一下,你把它当成 Hutool 工具库,Hutool 里有的工具方法你直接用,Hutool 里没有的你不也需要自己写或基于 Hutool 里的方法继续封装工具类吗?这难道也要担心涉及侵权吗?当然了,如果是改改包名或简单改动就发布为了另一个项目,我觉得懂点法律身怀正气的你都知道这没什么必要。
- 易于上手: 抽离了那些基础配置,Admin 就是一个纯粹的业务解决方案项目,大多数人需要的就是这么纯粹的内容。即使你是个新手,想要上手这个项目,你不需要关注那么多的其他配置了,甚至说它们对初学者是无关紧要的,这大大降低了你的上手/学习及改造成本。
- 易于升级: 对于一些配置优化和完善,升级只需要改改 Starter 版本号,不需要你再照着最新版疯狂复制代码,减少你出错的概率,提升你升级的效率。
- ...
总之,我们希望更多人多多反馈,一起完善。有技术的捧个技术场,有人的捧个人场,有钱的捧个钱场。
项目能二开开源吗?
非常欢迎在遵守对应项目开源协议的基础上进行二次开发开源,扩展生态系统,如方便欢迎在 生态系统 中登记,给有需要的人更多的选择。
项目 dev 分支可以直接用来开发吗?
理论上我们不建议,dev 分支是开发分支,有些重构开发内容并未完成或功能 PR 合并后可能还没有进行代码 review 及功能测试,出现问题概率更高。但如果已经处于版本开发后期,且你精力允许后期跟进升级,可以考虑直接使用。
项目能开发 Vue2、JS、JDK 1.8、MyBatis Flex 等等版本吗?
我们欢迎有意愿的大佬扩展 ContiNew 生态并投稿,给更多人群更多选择。
JDK 1.8(Spring Boot 2.7.x) 我们在 1.3.x 分支仍有保留,但早已经停止维护。
Vue2 本项目开始时已经在逐渐被淘汰,所以从未考虑也无计划开发 Vue2 版本。
JS 版本我们精力有限,无法维护多个版本。
MyBatis Flex,我们有进行调研,如果行业市场普遍采用,我们也会跟进调整技术栈。
...
历史的车轮滚滚向前,ContiNew 项目名称已经体现了(ContiNew,Continue New),我们会持续更新重构,技术栈也将持续跟随行业市场。
项目什么时候上 Cloud?
除技术栈升级考量外,也考虑到为了 cloud 而 cloud 的市场,我们目前在需求计划中已经列了 continew-cloud 计划,但此需求计划优先级很低,提升优先级的可能性就是近期我所在单位会涉及此类项目开发。如你急需 cloud 版本,请调研其他成熟框架。
我们更关注代码质量和解决方案的细节设计闭环,且业余开源精力有限不急于多线拓展,也无心进行项目推广和竞争。
项目有商业版吗?
暂无计划。为爱发电,支持赞助。
项目怎么升级到最新版本?🔥
Admin 项目分为两部分,一部分是写在 Starter 中的通用配置和组件能力,一部分是 Admin 本体中的通用业务代码。
Admin 本体项目是一个代码模板,直白点说就是作者帮你写了一个项目基础的部分代码,你下载后就可以基于现有的代码和规范继续开发你的业务了。
所以理论上 Admin 本体项目谈不上更新,因为你的业务和作者写的通用模板肯定不一样。
但如果你是发现了已有代码的 Bug,或者发现 Admin 更新中修复了某个 Bug,你可以打开对应提交记录,参照着修改对应部分的代码,这也算是一种升级。
如果是 Starter 部分的配置,因为作者已经将 Starter 发布到了 Maven 中央仓库,所以,你可以像升级其他外部依赖(Spring、Hutool 等)版本一样升级它。记得多参考 Admin 本体升级 Starter 版本时的提交记录。
单独开了一篇说明此事,详情请查看《框架更新》。
接不接定制开发?
作者仅在业余时间维护开源项目,有单独全职工作,不接定制开发。如有需要,可协助各位老板在交流群内发送广告。Coder help coder.
作者是全栈吗?
Creator 是 Java 后端开发,不擅长前端开发(欢迎有意的前端同学参与 PR 开发),所以很多时候,你会看到后端会相对频繁更新。但在提供解决方案时,会尽力通过迭代方式逐步完善前端细节,且拥有一双发现“美”的眼睛。
在 < v3.0.0
使用 Arco Design Vue UI 框架官方提供的前端模板(Arco Design Pro Vue)进行扩展开发。
在 >= v3.0.0
使用由 林大
开源的基于 Arco Design Vue UI 框架的前端模板(Gi Demo)进行扩展开发。
Creator 虽不擅长前端,但对前端开发仍坚持追寻 “持续迭代优化,持续提供开箱即用,舒适的开发体验。” 的 slogan,目前维护团队的前端主力为 秋大,且定期会同步 林大
的 Gi Demo
更新。
ContiNew Admin
【综合】项目启动后,页面空白
Q: 前后端项目均启动成功,访问却是空白页面,打开浏览器控制台也没有报错信息。
A: 交流群内曾有且仅有一位童鞋遇到过此问题,请检查浏览器有没有启用 ublock oragin
扩展组件,如果有请调整规则或在本页面关闭。
【后端】找不到某个 Bean 或访问接口提示 No endpoint🔥
A: 毫不夸张,这是像 NPE、404 一样大多数时候都很容易解决的问题。
场景一: 项目启动报错,提示找不到某个 Bean。
Consider defining a bean of type 'xx.xx.xx.Xxx' in your configuration.
场景二: 项目正常启动,访问接口提示 No endpoint XX。
org.springframework.web.servlet.NoHandlerFoundException: No endpoint XXX /xxx/xx.
它们属于一类问题,都是对应的 Bean(包含 Controller) 没有被 Spring 扫描到引起的,你要确认的就是当前你的扫描包配置能不能扫描到对应 Bean/对应 Bean 的实现类/对应 Bean 的配置类等。
要解决这个问题,首先我们需要有几个共识。
- Spring Boot Bean 扫描机制
- Spring Boot 默认扫描启动类(标注了 @SpringApplication 的类)所在的包及其子包
- 通过
@ComponentScan(basePackages = {"xxx", "xxx"})
可以配置指定一个或多个不同的扫描包
- ContiNew Admin 的包扫描配置
- 启动类,位于
continew-webapi
模块的top.continew.admin
包下 - 没有单独配置
@ComponentScan
,采用的是 Spring Boot 默认的包扫描规则,即默认扫描top.continew.admin
包及其子包下的 Bean - 在
application.yml
中有一个project.base-package
配置,当前仅支持单包,是用于本项目内全局枚举字典扫描等场景的
- 启动类,位于
在有了上述共识之后,请你做如下分析排查(if-else-if-else):
- 原版项目(clone 后一个标点符号都没有改动过)是否正常,如原版项目就存在此问题,提个 issue 到开源平台
- 是否有改动包结构,如果更改包结构,请把
top.continew.admin
包全部更改完整(如果有涉及模块名更改,请注意不要更改continew-starter
模块名,它是 Maven 外部依赖,非 Admin 内部模块) - 启动类所在的包能否扫描到报错的 Bean,例如:启动类在
com.example.admin
包下,报错的 Bean 在com.example.test
包下,这种是无法扫描到的,除非你单独指定了@ComponentScan(basePackages = {"com.example"})
或@ComponentScan(basePackages = {"com.example.admin", "com.example.test"
})` - 模块是否有被正确引入或传递引入到
continew-webapi
模块依赖中 - 通过
@Bean
注解配置的,请排查对应配置类是否有添加@Configuration
注解 - ...(自行百度/GPT:Spring 扫描不到 xxx)
无关提醒
IntelliJ IDEA 中某些依赖注入下有红线,如果项目能正常启动请忽略,类似问题想解决可以自行百度。
【后端】项目更新后启动报错
Q: 后端项目之前启动没问题,更新(git pull
)了最新内容之后,启动就报类似如下错误:
Unsatisfied dependency expressed through bean property 'sqlSessionTemplate': Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: Validation Failed:
1 changesets check sum
db/changelog/xxx/continew-admin_xxx.sql::1::Charles7c was:
8:1181b1e4347607c6084736f1a9c27327 but is now: 8:382915a29ba9c391a43b7b346e5fb6b3
...
A: 首先必须承认及道歉,这是维护团队的 锅,然后说解决方法。
解决方法: 打开你的数据库,找到 databasechangelog
表,删除它(这是最简单的)。然后如果你能查看下拉下来的提交有哪些表变更了,不妨手动更新下表结构,更甚者如果你还没太多重要数据,直接删除所有数据库表。操作完后,再启动项目就没事了。
下面再来简单解释下错误原因:
直接原因: 项目启动时,如果启用了 liquibase
,则 liquibase
会在执行相关 SQL 脚本前进行一致性校验,如果检查到 已经执行过的 SQL 脚本内容与执行记录不一致,也就是发生了修改,就会报错。
根本原因: 正常来讲,已经执行过的 SQL 脚本不会再进行修改,真要进行修改也不是直接去改原来的那段脚本内容,而是应该进行追加变更记录。
例如:假设下方的 SQL 脚本内容是已经被 liquibase
执行过的,那如果后面随着需求调整 name
字段要调整为 dept_name
,你不能直接去修改这段内容,而是应该向下追加变更记录。
-- changeset Charles7c:1
CREATE TABLE IF NOT EXISTS `sys_dept` (
`id` bigint(20) AUTO_INCREMENT COMMENT 'ID',
`name` varchar(30) NOT NULL COMMENT '部门名称',
`parent_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '上级部门ID',
`ancestors` varchar(512) NOT NULL DEFAULT '' COMMENT '祖级列表',
`description` varchar(200) DEFAULT NULL COMMENT '描述',
`sort` int NOT NULL DEFAULT 999 COMMENT '部门排序',
`status` tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:启用;2:禁用)',
`is_system` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否为系统内置数据',
`create_user` bigint(20) NOT NULL COMMENT '创建人',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_user` bigint(20) DEFAULT NULL COMMENT '修改人',
`update_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uk_name_parent_id`(`name`, `parent_id`) USING BTREE,
INDEX `idx_parent_id`(`parent_id`) USING BTREE,
INDEX `idx_create_user`(`create_user`) USING BTREE,
INDEX `idx_update_user`(`update_user`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='部门表';
根据本项目的划分,表结构列的变更应该在对应版本的 xxx_column
文件中追加 -- changeset
,如下所示:
-- changeset Charles7c:1
ALTER TABLE `sys_dept` CHANGE `name` `dept_name` varchar(30) NOT NULL COMMENT '部门名称';
追加完后,在下次启动项目的时候 liquibase
检测到这个变更就会自动执行,也就完成了修改。
再次致歉
不过维护团队没有按规范实施,当然不是觉得因为使用人数少,所以肆无忌惮地做变更。😅
liquibase
是用于管理数据库版本,跟踪、管理和应用数据库变化的工具,建议学习了解一下。
【后端】项目启动后,访问项目 URL 提示跨域错误
在开发环境(dev)的跨域配置中,后端项目配置为了 *
,表示放行所有域名。而在生产环境(prod)的跨域配置中,后端项目则配置为了项目前端 URL,所以如果你遇到跨域问题,可以首先确认下后端项目的跨域配置是否正确。
在确认没有问题的情况下,再确认下自己本地是不是开启了 V*N 等代*软件,尝试关闭后再试试。
【后端】项目启动后,CosID 报错误
machineId can't be greater than maxMachine[xx] or less than 0.
将 CosID 的 machine-bit
位数参数调大一些。
【后端】获取图形验证码接口控制台报 load font error
在服务器执行如下命令后重启服务。
yum install fontconfig
【前端】项目安装依赖提示证书过期
Q: pnpm install
报错,报错提示类似如下:
npm ERR! request to registry.npm.taobao.org failed, reason: certificate has expired
A: 早在 2021 年,淘宝就发文称,npm 淘宝镜像已经从 registry.npm.taobao.org 切换到了 registry.npmmirror.com。旧域名也将于 2022 年 5 月 31 日停止服务(不过,直到近段时间 HTTPS 证书到期才真正不能用了)。
# 清空缓存
npm cache clean --force
# 切换新源
npm config set registry https://registry.npmmirror.com
【前端】点击导出按钮报错 v2.5.0
Q: 点击导出按钮,报错提示如下:
Notification
由于部分模拟数据需要,前端默认启用了 Mock.js,而 Mock.js 会将 responseType 设置为 '',这不仅会导致关键判断出错,也会导致导出的文件无法打开,实际开发时自行关闭 Mock 即可。
A: 如报错提示所述,实际开发时,打开 continew-admin-ui/src/utils/setup-mock.ts
,关闭 Mock 即可。
export default ({ mock, setup }: { mock?: boolean; setup: () => void }) => {
// 在生产环境也启用 mock
if (mock !== false) setup();
// if (mock !== false) setup();
};
如有需要,实际开发时,除关闭 Mock 外,同时修改 continew-admin-ui/src/components/crud/index.ts
中的导出错误提示。
【前端】添加完菜单后路由不可用 v2.5.0
Q: 添加完菜单后,点击菜单没有反应,打开控制台后有路由报错。
A: 目前前端项目的动态路由,是采用的基础脚手架 Arco Design Pro Vue 的设计方案 #147,作者称之为半动态路由,所以添加完菜单后,还需要在前端 router 下配置一个对应的静态路由(主要是为了指定其组件地址)。
补充问题
2024/2/22:群友 Joshua 使用时发现如果路由配置到 views/basic
目录,即以 /basic
为路由前缀,会出现配置失效的问题,初步怀疑是由关键词污染导致。
【前端】在目录下只添加了一个菜单,目录不显示
Q: 在目录下只添加了一个菜单,目录不显示。
A: 这是 GiDemo 中的一个小配置,如果目录下只有一个菜单,则不显示目录,而直接显示菜单。可通过还原此提交来恢复仅一个菜单的目录层级展示。目录下仅有一个菜单时平铺展示。
相关处理代码可查阅:continew-admin-ui/src/layout/components/Menu/MenuItem.vue
。
【前端】配置好后端接口地址,接口 404
Q: 下载的 2.5.x 版本前端,配置好后端接口地址后,访问页面报接口 404。
A: 前后端版本一定要一 一对应,2.5.x 前端只支持后端 2.5.x 版本,友情建议前后端都升级到最新版本。
【前端】网络控制台里请求的不是后端,是前端地址
Q: 启动后,在浏览器的网络控制台里,请求的 URL 是前端的,而不是后端的。
A: 前端基础知识,请先了解下前端的请求过程,前端请求接口后会代理转发到后端的。详情请点击了解。