# v2.0.0 不兼容更新

历经15个月,BuildAdmin终于发布了第二个主要版本,在本版本中,我们将继续保持流行稳定技术栈的特性,同时一次性优化了所有小版本中不便重构的细节。

历史累计的不兼容更新都将在此版本完成更新,从老版本更新工作量可能较大,请谨慎升级或闲时升级。

# 新版本特性

  • 最低php版本限定为8.0.2
  • ThinkPHP升级到8.0.0
  • vue升级到v3.3
  • 有数据的表重新生成CRUD代码时,改为根据设计修改表结构,不再删表重建
  • 内置font-awesome
  • 多富文本编辑器共存
  • 前后端类型定义优化
  • 公共函数归类、命名规则统一
  • 省份地区数据与微信同步
  • 表格列可通过slot渲染
  • 升级框架无需在对比安装sql更新数据表结构,一行命令搞定结构迁移
  • 大量细节优化,详见更新日志 (opens new window)

# 完善类型定义

PHP8带来了联合类型,改进了类型系统,我们基于此,完善了所有服务端代码的类型定义,在完善了前后台基类的类型定义后,所有继承于它们的控制器,都需要同步完善类型定义

  1. 控制器有重写index、add、edit、del方法的,均需配置方法的返回类型同父类
  2. 控制器有重写属性的,比如:model、noNeedLogin、preExcludeFields、withJoinTable等等,均需配置属性的类型同父类
  3. 基础框架比如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文件调整,仅需执行一行命令即可完成,我们可称之为数据表迁移

  1. 参考更新文档 (opens new window)拉取最新代码
  2. 确定已经执行了composer update命令
  3. 站点根目录执行php think migrate:run命令,成功后输出类似于:
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/tabletimeFormat /@/utils/commontimeFormat 格式化时间

# 前端去除多余的 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