feat(小组件管理改版): 卡片网格管理台 + 校级覆盖层 + 退役系统设置/应用管理
build / build (push) Successful in 42s

后端
- widget_catalog 加 3 列:scope_type(三态可见范围)/ role_types(可见角色)/ role_alias(角色专属命名 JSON)
- 新增两表:widget_catalog_school(点名表,uk_widget_school)、widget_school_setting(校级覆盖层,uk_widget_sch)
- WidgetController 新增 GetWidgetCatalogList / SaveWidgetCatalog / DeleteWidgetCatalog /
  GetWidgetSchoolSetting / SaveWidgetSchoolSetting;权限拆 checkSuperAdmin(仅超管)与
  checkSchAdmin(超管或 roleId∈{2,5,7})
- SaveWidgetSchoolSetting 强制 schId 取当前登录校,前端传参不采信(防越权)
- 显示名三级链:校级别名 > 角色专属命名 > 组件名;role_alias 坏 JSON 降级不抛
- 启动期幂等 seeding(空库才写 3 条内置目录行)
- 手工 DDL 脚本 resources/sql/widget_catalog_v2.sql(含回滚)

前端
- WidgetManage 重写为卡片网格:超管/校管双视角、类型页签 + 搜索、拖拽排序、启停、
  删除、登记内置组件、空态引导
- 新增 WidgetCard / WidgetEditModal / WidgetRegisterModal
- UserSettingApi 加 6 个方法;types 加 WidgetCatalog 接口
- 管理端列表整行回传(SaveWidgetCatalog 为整行 merge)

退役
- 删除 SysSetting.vue / SysTempManage.vue / AppSettingApi.ts 与后端 AppSettingController /
  AppCategory(SQL) 全链路,清理路由、Settings 导航与样式分支
- 保留 SysSettingApi.ts(壁纸/logo 池管理仍在使用)
This commit is contained in:
chenxing
2026-10-11 21:40:31 +08:00
parent 9980ea1264
commit 5a19a4ed79
13 changed files with 2559 additions and 1024 deletions
-63
View File
@@ -1,63 +0,0 @@
import Abstract from "@/utils/axios/abstract";
import { PageData, PageParams } from "@/types/Basics";
const path = "/api";
export interface AppCategoryItem {
id?: number;
name: string;
apiUrl: string;
dataKey: string;
paramsKey: string;
roleType: number;
cId?: number;
cDate?: string;
resDate?: string;
}
/** 系统设置-应用管理(应用类别 CRUD + 模板管理) */
class AppSettingApi extends Abstract {
/** 应用分页列表 */
getAppCategoryList(params: PageParams & { roleType: number; name?: string }) {
const url = path + "/GetAppCategoryList";
return this.getRequest<PageData>({ url, params });
}
/** 保存应用(新增/编辑) */
saveAppCategory(data: AppCategoryItem) {
const url = path + "/SaveAppCategory";
return this.postRequest({ url, data });
}
/** 删除应用 */
deleteAppCategory(id: number) {
const url = path + "/DelAppCategory";
return this.postRequest({ url, params: { id } });
}
/** 查询应用详情 */
findAppCategory(id: number) {
const url = path + "/FindAppCategory";
return this.getRequest<AppCategoryItem>({ url, params: { id } });
}
/** 刷新资源时间戳(上传模板后调用) */
updateResDate(id: number) {
const url = path + "/UpdateResDate";
return this.postRequest({ url, params: { id } });
}
/** 模板文件列表 */
getTempList(appModId: number) {
const url = path + "/GetTempList";
return this.getRequest<any[]>({ url, params: { appModId } });
}
/** 保存模板文件内容(JSON body,避免大文件内容超出 URL/请求头长度限制) */
saveTempFile(appModId: number, fileName: string, content: string) {
const url = path + "/SaveTempFile";
return this.postRequest({ url, data: { appModId, fileName, content } });
}
}
export default new AppSettingApi();
+28 -3
View File
@@ -1,4 +1,4 @@
import { DesktopAppTypeEnum, LightApp, UserSettingInfo, WidgetPositionResp } from "@/types";
import { DesktopAppTypeEnum, LightApp, UserSettingInfo, WidgetCatalog, WidgetPositionResp } from "@/types";
import { BaseDict, PageData, PageParams } from "@/types/Basics";
import Abstract from "@/utils/axios/abstract";
@@ -107,13 +107,38 @@ class UserSettings extends Abstract {
getWidgetCatalogList() {
const url = path + "/GetWidgetCatalogList";
return this.getRequest<any[]>({ url });
return this.getRequest<WidgetCatalog[]>({ url });
}
saveWidgetCatalog(catalog: Record<string, any>) {
/** 新增/编辑全局目录(仅超管):scopeType/roleTypes/roleAlias/scopeSchIds 一并提交 */
saveWidgetCatalog(catalog: Partial<WidgetCatalog> & Record<string, any>) {
const url = path + "/SaveWidgetCatalog";
return this.postRequest<any>({ url, data: catalog });
}
/** 删除全局目录(仅超管),后端连带删点名表与校级覆盖行 */
deleteWidgetCatalog(id: number) {
const url = path + "/DeleteWidgetCatalog";
return this.postRequest<any>({ url, params: { id } });
}
/** 读本校覆盖行(编辑回显):schId 由后端取当前登录校 */
getWidgetSchoolSetting(widgetId: number) {
const url = path + "/GetWidgetSchoolSetting";
return this.getRequest<any>({ url, params: { widgetId } });
}
/** 保存本校覆盖(校管/超管):schId 由后端强制取当前登录校,前端不传 */
saveWidgetSchoolSetting(setting: Record<string, any>) {
const url = path + "/SaveWidgetSchoolSetting";
return this.postRequest<any>({ url, data: setting });
}
/** 机构树(仅超管):递归裁剪到学校层,children 即学校列表,用于可见范围多选 */
getSchTree() {
const url = path + "/getSchTree";
return this.getRequest<any>({ url });
}
}
export default new UserSettings();