Skip to content

常见问题

温馨提示

以下常见问题仍无法解决你的疑惑,可尝试 进群 与群内各位大佬交流沟通。

其他

提问的智慧 🔥🔥🔥

建议先百度搜索或链接直达阅读 => 《提问的智慧》(如果你做惯了“甲方领导”,请必读!)

维护团队成员都是在各自 业余时间 维护(fā diàn) 开源 项目,有单独全职工作,也有各自生活节奏,所以我们提前告知您:

  1. 欢迎您在 Issue 中复现存在的问题,Issue 我们必然响应,并且我们非常欢迎您提个 PR 来修复它
  2. 如果您加入了交流群,可以考虑在交流群内与其他用户大佬交流。维护团队成员视个人意愿及空闲时间解答框架问题,谢绝微信私信提问
  3. 项目在持续迭代中,此刻调研的您如果觉得它无法满足自身需求,也没有什么亮点,那只说明项目与您的需求不太契合,且仍需要迭代,请口下留情转身调研其他同类框架
  4. 请勿把维护团队当 “许愿池的王八”,如果你的需求场景仅仅是你的业务,请免开尊口
  5. 不接受频繁 “催更”,需求墙里列的后续计划 90% 可能性会做,无非时间精力影响,计划会靠前或靠后而已。所以敬请关注需求墙和群动态

常见差评回复

“不是所有的鱼生活在同一片海里”

“道不同,不相为谋”

  • 这类项目这么多,老是开发有什么用?看起来也没什么亮点啊。

  • 为什么要用你这个,还要增加学习成本?为什么不直接用 Xxx?

    本项目简介中的项目来源有做详细说明,正式立项于作者当时工作需要,工作自用为主,开源的核心目的是共建和完善,无心推广和参与竞争,如果恰好能帮到更多人,帮助其梳理一个基础规范模板,也能满足作者成就感。

    作者热衷细节重构,有代码洁癖,所以项目重点始终在于代码质量(主要后端、次要前端)和解决方案细节完成度,欢迎更多 “代码洁癖”、“志同道合者” 多多 “批判”。

    为了降低项目学习成本,在迭代过程中,我们也做了大量的删减和重构,ContiNew Starter 的产生缘由之一也是为了降低学习成本,这是个持续的优化过程。

  • 初级程序员都爱写后台管理框架,因为简单,收获一些 star,到时候可以在简历里吹嘘。

    也许你真的是个大牛天天研究算法不下“基层”无此需求,也许是你的标准太低认定写一个中后台管理框架简单。

    作者在公司里也从没透露过所用的 ContiNew 框架是自己主导编写的,更遑论简历中。让领导和同事更多关注到自己,把自己“捧杀”?也许有人真有面试需要,但如果是人家用心开发的,为什么不能写在简历中?

项目能商用吗?

项目协议是否可商用
ContiNew AdminApache-2.0 开源许可协议可开发商业应用
ContiNew StarterLGPL-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 的优势:

  1. 易于迁移: 我们选择一个程序框架的原因就是希望减少重复功能开发,实际上框架带来的不仅仅是成品功能,还有成品的基础配置。你要开始一个 Spring Boot 项目开发,你不需要配置 JSON、API 接口文档、跨域、线程池等配置吗?如果这些配置代码全都在 Admin 里,没有 Starter,那你需要从 Admin 里复制很多的配置到新项目,或者说你要从程序框架中删除很多的配置代码。你能处理好,处理完整吗?你不累吗?我作为使用者之一,我感觉累。
  2. 易于扩展: 我们针对于 Starter 的开发目标就是通用且基础,不含业务逻辑,在设计和开发某个 starter 模块时,已尽可能开放了更多的“口子”可以进行重写或覆盖,你不妨看看代码。且未来在持续的重构中会继续优化完善,开放更多的“口子”,适配更多的可能,这恰恰需要更多人的智慧。

很多人担心要改代码怎么办? Starter 是一系列组件,如果“口子”不够大,你可以反馈一下我们一起讨论完善,发布个版本很快的。如果不满足你需求,要完全重构,这种场景你完全可以不引入某个 Starter,自己去编写一个自己内部的 Starter,亦或者关闭某个 Starter 的某些配置,改为采用自己的。(LGPL 涉及到的二次开发并不包含重写覆盖配置 @Bean、@Override,这是面向对象和 IOC 的魅力,和开源协议并不冲突,不要过于担忧协议范围)你换个参照物想一下,你把它当成 Hutool 工具库,Hutool 里有的工具方法你直接用,Hutool 里没有的你不也需要自己写或基于 Hutool 里的方法继续封装工具类吗?这难道也要担心涉及侵权吗?当然了,如果是改改包名或简单改动就发布为了另一个项目,我觉得懂点法律身怀正气的你都知道这没什么必要。

  1. 易于上手: 抽离了那些基础配置,Admin 就是一个纯粹的业务解决方案项目,大多数人需要的就是这么纯粹的内容。即使你是个新手,想要上手这个项目,你不需要关注那么多的其他配置了,甚至说它们对初学者是无关紧要的,这大大降低了你的上手/学习及改造成本。
  2. 易于升级: 对于一些配置优化和完善,升级只需要改改 Starter 版本号,不需要你再照着最新版疯狂复制代码,减少你出错的概率,提升你升级的效率。
  3. ...

总之,我们希望更多人多多反馈,一起完善。有技术的捧个技术场,有人的捧个人场,有钱的捧个钱场。

项目能二开开源吗?

非常欢迎在遵守对应项目开源协议的基础上进行二次开发开源,扩展生态系统,如方便欢迎在 生态系统 中登记,给有需要的人更多的选择。

项目 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 的配置类等。

要解决这个问题,首先我们需要有几个共识。

  1. Spring Boot Bean 扫描机制
    1. Spring Boot 默认扫描启动类(标注了 @SpringApplication 的类)所在的包及其子包
    2. 通过 @ComponentScan(basePackages = {"xxx", "xxx"}) 可以配置指定一个或多个不同的扫描包
  2. ContiNew Admin 的包扫描配置
    1. 启动类,位于 continew-webapi 模块的 top.continew.admin 包下
    2. 没有单独配置 @ComponentScan,采用的是 Spring Boot 默认的包扫描规则,即默认扫描 top.continew.admin 包及其子包下的 Bean
    3. application.yml 中有一个 project.base-package 配置,当前仅支持单包,是用于本项目内全局枚举字典扫描等场景的

在有了上述共识之后,请你做如下分析排查(if-else-if-else):

  1. 原版项目(clone 后一个标点符号都没有改动过)是否正常,如原版项目就存在此问题,提个 issue 到开源平台
  2. 是否有改动包结构,如果更改包结构,请把 top.continew.admin 包全部更改完整(如果有涉及模块名更改,请注意不要更改 continew-starter 模块名,它是 Maven 外部依赖,非 Admin 内部模块)
  3. 启动类所在的包能否扫描到报错的 Bean,例如:启动类在 com.example.admin 包下,报错的 Bean 在 com.example.test 包下,这种是无法扫描到的,除非你单独指定了 @ComponentScan(basePackages = {"com.example"})@ComponentScan(basePackages = {"com.example.admin", "com.example.test"})`
  4. 模块是否有被正确引入或传递引入到 continew-webapi 模块依赖中
  5. 通过 @Bean 注解配置的,请排查对应配置类是否有添加 @Configuration 注解
  6. ...(自行百度/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,你不能直接去修改这段内容,而是应该向下追加变更记录。

sql
-- 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,如下所示:

sql
-- 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

在服务器执行如下命令后重启服务。

bash
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 证书到期才真正不能用了)。

bash
# 清空缓存
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 即可。

ts
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: 前端基础知识,请先了解下前端的请求过程,前端请求接口后会代理转发到后端的。详情请点击了解