Files
UserhomeFront/src/api/UserSettingApi.ts
T
chenxing 5a19a4ed79
build / build (push) Successful in 42s
feat(小组件管理改版): 卡片网格管理台 + 校级覆盖层 + 退役系统设置/应用管理
后端
- 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 池管理仍在使用)
2026-10-11 21:40:31 +08:00

145 lines
5.2 KiB
TypeScript

import { DesktopAppTypeEnum, LightApp, UserSettingInfo, WidgetCatalog, WidgetPositionResp } from "@/types";
import { BaseDict, PageData, PageParams } from "@/types/Basics";
import Abstract from "@/utils/axios/abstract";
const path = "/api";
class UserSettings extends Abstract {
getUserWallpaperList(schId: number) {
const url = path + "/getUserWallpaperList";
return this.getRequest<any[]>({ url, params: { schId } });
}
deleteWallById(id: number) {
const url = path + "/deleteWallById";
return this.postRequest({ url, params: { id } });
}
checkWallpaper(schId: number, wallpaperUrl: string) {
const url = path + "/checkWallpaper";
return this.postRequest({ url, data: { schId, wallpaperUrl } });
}
getLogoList() {
const url = path + "/getLogoList";
return this.getRequest<any[]>({ url });
}
deleteLogoById(id: number) {
const url = path + "/deleteLogoById";
return this.postRequest({ url, params: { id } });
}
getUserSettings() {
const url = path + "/getUserSettings";
return this.getRequest<UserSettingInfo>({ url });
}
toggleWidgetShow(id?: number) {
const url = path + "/toggleWidgetShow";
return this.postRequest<any>({ url, data: { id } });
}
saveUserWidget(info: WidgetPositionResp) {
const url = path + "/saveUserWidget";
return this.postRequest<any>({ url, data: info as any });
}
saveUserAppIds(id: number | undefined, appIds: string) {
const url = path + "/saveUserAppIds";
return this.postRequest<any>({ url, data: { id, appIds } });
}
getLightAppSel() {
const url = path + "/getLightAppGroup";
return this.getRequest<any[]>({ url });
}
getLightAppList(): Promise<any[]> {
const url = path + "/getLightAppList";
return new Promise(async (resolve, reject) => {
let result: any[] = await this.getRequest<any[]>({ url });
result.forEach(element => {
if (!!element.layout) element.layout = JSON.parse(element.layout);
});
resolve(result);
});
}
saveLightApp(lightapp: LightApp) {
const url = path + "/saveLightApp";
lightapp.layout = JSON.stringify(lightapp.layout);
return this.postRequest<any[]>({ url, data: lightapp as any });
}
deleteLightAppById(id: number) {
const url = path + "/deleteLightAppById";
return this.postRequest({ url, params: { id } });
}
getUserDesktopAppList() {
const url = path + "/getUserDesktopAppList";
return this.getRequest<any[]>({ url });
}
saveUserDesktopAppById(appId: number, type: DesktopAppTypeEnum) {
const url = path + "/saveUserDesktopAppById";
return this.postRequest<any>({ url, data: { id: appId, type } });
}
deleteUserDesktopAppById(id: number, appId: number) {
const url = path + "/deleteDesktopAppById";
return this.postRequest<any>({ url, data: { id, appId } });
}
sortUserDesktopApp(ids: number[]) {
const url = path + "/sortUserDesktopApp";
return this.postRequest<any>({ url, data: { ids: ids.join(",") } });
}
/** 小组件统一取数:params 为 urlencoded 查询串(对齐旧 otherParams 口径) */
getWidgetData(code: string, params: string) {
const url = path + "/getWidgetData";
return this.getRequest<any>({ url, params: { code: code, params: params } });
}
/** 仅 comp_type=2:按需取自定义片段内容 */
getWidgetContent(code: string) {
const url = path + "/getWidgetContent";
return this.getRequest<any>({ url, params: { code: code } });
}
getWidgetCatalogList() {
const url = path + "/GetWidgetCatalogList";
return this.getRequest<WidgetCatalog[]>({ url });
}
/** 新增/编辑全局目录(仅超管):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();