Appearance
v2.0.0 不兼容更新
历经15个月,BuildAdmin
终于发布了第二个主要版本,在本版本中,我们将继续保持流行稳定技术栈
的特性,同时一次性优化了所有小版本中不便重构的细节。
历史累计的不兼容更新都将在此版本完成更新,从老版本更新工作量可能较大,请谨慎升级或闲时升级。
新版本特性
- 最低
php
版本限定为8.0.2
ThinkPHP
升级到8.0.0
vue
升级到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 |