Appearance
v2.0.0 不兼容更新
历经15个月,BuildAdmin终于发布了第二个主要版本,在本版本中,我们将继续保持流行稳定技术栈的特性,同时一次性优化了所有小版本中不便重构的细节。
历史累计的不兼容更新都将在此版本完成更新,从老版本更新工作量可能较大,请谨慎升级或闲时升级。
新版本特性
- 最低
php版本限定为8.0.2 ThinkPHP升级到8.0.0vue升级到v3.3- 有数据的表重新生成
CRUD代码时,改为根据设计修改表结构,不再删表重建 - 内置
font-awesome - 多富文本编辑器共存
- 前后端类型定义优化
- 公共函数归类、命名规则统一
- 省份地区数据与微信同步
- 表格列可通过
slot渲染 - 升级框架无需在对比
安装sql更新数据表结构,一行命令搞定结构迁移 - 大量细节优化,详见更新日志
完善类型定义
PHP8带来了联合类型,改进了类型系统,我们基于此,完善了所有服务端代码的类型定义,在完善了前后台基类的类型定义后,所有继承于它们的控制器,都需要同步完善类型定义
- 控制器有重写
index、add、edit、del方法的,均需配置方法的返回类型同父类。 - 控制器有重写属性的,比如:
model、noNeedLogin、preExcludeFields、withJoinTable等等,均需配置属性的类型同父类。 - 基础框架比如
TP,他们并没有为Model等类定义好方法和参数的类型,但BuildAdmin的基类做好了这个工作,这使更新变得繁琐,这是因为ba的基类也可能被开发者修改,同时既然最低要求php8,那就开发期间看到的代码都php8
- 建议使用
IDE,比如PhpStorm的提示快速完成类型配置 - 亦可直接访问控制器,根据程序报错指引修改类型
命名规则统一
数据表命名规则统一
| 原数据表 | 修改为 | 备注 |
|---|---|---|
| menu_rule | admin_rule | 因为会员规则表名为user_rule,相关目录/文件名均以修改 |
| 原字段 | 修改为 |
|---|---|
| updatetime int(10) | update_time bigint(16) |
| createtime int(10) | create_time bigint(16) |
| lastlogintime | last_login_time |
| lastloginip | last_login_ip |
| loginfailure | login_failure |
| joinip | join_ip |
| jointime | join_time |
这项修改意味着您的数据表结构需要更新,但新版本中数据表字段的修改无需逐一对比sql文件调整,仅需执行一行命令即可完成,我们可称之为数据表迁移。
- 参考更新文档拉取最新代码
- 确定已经执行了
composer update命令 - 站点根目录执行
php think migrate:run命令,成功后输出类似于:
ini
PS C:\build-admin> php think migrate:run
== 20230620180908 Install: migrating
== 20230620180908 Install: migrated 0.0179s
== 20230620180916 InstallData: migrating
== 20230620180916 InstallData: migrated 0.0288s
== 20230622221507 Version200: migrating
== 20230622221507 Version200: migrated 0.0561s
All Done. Took 0.1295s前端命名规则统一
属性类型定义
| 原属性名 | 新属性名 | 备注 |
|---|---|---|
| show-overflow-tooltip | showOverflowTooltip | 直接引用el的TableColumnCtx |
| block-help | blockHelp | FormItem |
| label-width | labelWidth | FormItem |
| show-message | showMessage | FormItem |
| inline-message | inlineMessage | FormItem |
| inline-message | inlineMessage | FormItem |
这项修改意味着您需要修改代码使用新的属性名,但不修改并不影响使用,只是编辑器会报属性找不到(属性未改名,只是类型定义的命名规则改变)
请求参数名
| 原参数名 | 修改为 | 备注 |
|---|---|---|
| quick_search | quickSearch | 快速查询关键词 |
| refresh_token | refreshToken | 刷新token |
通常无需对这项修改做出反应,除非您自己写了接受quick_search的代码,同时使用了前端公共请求函数
公共函数归纳或名称优化
服务端公共函数
随着系统越来越完善,之前可作为公共函数,但现应归纳为公共类
| 原函数 | 修改为 | 备注 |
|---|---|---|
| path_is_writable | Filesystem::pathIsWritable | 路径是否可写 |
| dir_is_empty | Filesystem::dirIsEmpty | 目录是否是空的 |
| del_empty_dir | Filesystem::delEmptyDir | 删除所有相对空目录 |
| delDir | Filesystem::delDir | 递归删除 |
| path_transform | Filesystem::fsFit | 路径分隔符根据当前系统分隔符适配 |
| get_dir_files | Filesystem::getDirFiles | 获取目录内的文件列表 |
| file_unit_to_byte | Filesystem::fileUnitToByte | 将文件大小转换为字节单位 |
| \ba\Date::unixtime | \ba\Date::unixTime | 获取一个基于时间偏移的Unix时间戳 |
| Helper::getTableName | TableManager::tableName | 获取[完整]表名 |
前端公共函数
| 原函数 | 修改为 | 备注 |
|---|---|---|
/@/components/table 的 timeFormat | /@/utils/common 的 timeFormat | 格式化时间 |
前端去除多余的 controllerUrls.ts
在以往,我们通常将一些控制器URL统一定义在此文件,然后在它处导入使用,但后续我们发现,它处导入使用的场景并不多,且此文件的存在会给萌新带来是否必须将URL定义在此文件内等困扰,我们舍弃了此文件,并完成了涉及此文件的系统内置代码的更新。您可以自行确定是否需要继续保留该文件,比如您已经在其中定义了很多URL,则推荐保留
公共语言翻译大写开头
此项修改是为了尽量避免公共语言与子级语言包冲突的情况发生,比如公共语言包中存在user,那么与user.user就存在了冲突。
您可能已经使用了部分公共语言翻译,更新后,您可以在
web目录搜索关键词批量替换为替换值,按使用频率排序
原翻译key | 修改后新的key | 搜索关键词 | 替换值 |
|---|---|---|---|
| quick Search Placeholder | Quick search placeholder | t('quick Search Placeholder' | t('Quick search placeholder' |
| updatetime | Update time | t('updatetime') | t('Update time') |
| createtime | Create time | t('createtime') | t('Create time') |
| operate | Operate | t('operate') | t('Operate') |
| id | Id | t('id') | t('Id') |
| state | State | t('state') | t('State') |
| Click Select | Click select | t('Click Select') | t('Click select') |
| complete | Complete | t('complete') | t('Complete') |
| add | Add | t('add') | t('Add') |
| edit | Edit | t('edit') | t('Edit') |
| info | Info | t('info') | t('Info') |
| delete | Delete | t('delete') | t('Delete') |
| refresh | Refresh | t('refresh') | t('Refresh') |
| shrink | Shrink | t('shrink') | t('Shrink') |
| open | Open | t('open') | t('Open') |
| search | Search | t('search') | t('Search') |
| to | To | t('to') | t('To') |
| none | None | t('none') | t('None') |
| unknown | Unknown | t('unknown') | t('Unknown') |
| weigh | Weigh | t('weigh') | t('Weigh') |
| weigh-sort | Drag sort | t('weigh-sort') | t('Drag sort') |
为了适应以上的语言翻译key修改,baTable.form.operate也需要改为大写开头:
| 搜索值 | 替换值 | 备注 |
|---|---|---|
['add', 'edit'].includes | ['Add', 'Edit'].includes | popupForm.vue显示条件 |
form.operate = 'add' | form.operate = 'Add' | baTable.form.operate 添加操作标识符 |
form.operate = 'edit' | form.operate = 'Edit' | baTable.form.operate 编辑操作标识符 |
form.operate = 'info' | form.operate = 'Info' | baTable.form.operate 详情操作标识符 |
form.operate == 'add' | form.operate == 'Add' | baTable.form.operate |
form.operate == 'edit' | form.operate == 'Edit' | baTable.form.operate |
form.operate == 'info' | form.operate == 'Info' | baTable.form.operate |
