From aba4d2d3bc8a942e55b6a1f202f52b5ddd4dd9bf Mon Sep 17 00:00:00 2001 From: TongTongStudio Date: Thu, 6 Aug 2026 02:25:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(device):=20=E6=96=B0=E5=A2=9E=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E5=9B=BE=E6=A0=87=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增应用图标库页面,支持图标分页查询、锁定/解锁、手动上传和删除操作。 --- src/api/device/appIcon.ts | 73 +++++ src/api/device/types.ts | 33 ++ src/views/devices/app-icon/index.vue | 435 +++++++++++++++++++++++++++ 3 files changed, 541 insertions(+) create mode 100644 src/api/device/appIcon.ts create mode 100644 src/api/device/types.ts create mode 100644 src/views/devices/app-icon/index.vue diff --git a/src/api/device/appIcon.ts b/src/api/device/appIcon.ts new file mode 100644 index 00000000..32a9c95b --- /dev/null +++ b/src/api/device/appIcon.ts @@ -0,0 +1,73 @@ +import request from "@/utils/request"; +import type { AppIconQuery, AppIconVO } from "./types"; + +const APP_ICON_BASE_URL = "/api/v1/app-icons"; + +const AppIconAPI = { + /** 应用图标库分页列表(不传 packageName 返回全部) */ + getPage(queryParams: AppIconQuery) { + return request>({ + url: `${APP_ICON_BASE_URL}/page`, + method: "get", + params: queryParams, + }); + }, + + /** 获取应用当前生效图标信息 */ + getCurrentIcon(packageName: string) { + return request({ + url: `${APP_ICON_BASE_URL}/${packageName}`, + method: "get", + }); + }, + + /** 获取应用图标历史版本列表(含当前,按版本倒序) */ + getHistory(packageName: string) { + return request({ + url: `${APP_ICON_BASE_URL}/${packageName}/history`, + method: "get", + }); + }, + + /** 选取历史版本并锁定 */ + lock(packageName: string, iconId: number) { + return request({ + url: `${APP_ICON_BASE_URL}/${packageName}/lock`, + method: "post", + params: { iconId }, + }); + }, + + /** 解锁当前图标 */ + unlock(packageName: string) { + return request({ + url: `${APP_ICON_BASE_URL}/${packageName}/unlock`, + method: "post", + }); + }, + + /** 上传应用图标 */ + upload(packageName: string, file: File, appName?: string) { + const formData = new FormData(); + formData.append("file", file); + if (appName) { + formData.append("appName", appName); + } + return request({ + url: `${APP_ICON_BASE_URL}/${packageName}/upload`, + method: "post", + data: formData, + headers: { "Content-Type": "multipart/form-data" }, + }); + }, + + /** 删除应用图标版本 */ + delete(packageName: string, iconId: number) { + return request({ + url: `${APP_ICON_BASE_URL}/${packageName}/${iconId}`, + method: "delete", + }); + }, +}; + +export default AppIconAPI; diff --git a/src/api/device/types.ts b/src/api/device/types.ts new file mode 100644 index 00000000..e857d52c --- /dev/null +++ b/src/api/device/types.ts @@ -0,0 +1,33 @@ +import type { BaseQueryParams } from "@/api/common"; + +/** 应用图标分页查询参数 */ +export interface AppIconQuery extends BaseQueryParams { + /** 应用包名(可选,不传则返回全部) */ + packageName?: string; +} + +/** 应用图标VO */ +export interface AppIconVO { + /** 主键ID */ + id?: number; + /** 应用包名 */ + packageName?: string; + /** 应用名称 */ + appName?: string; + /** 图标访问地址 */ + iconUrl?: string; + /** 图标文件MD5 */ + iconMd5?: string; + /** 版本号(同包名内自增) */ + version?: number; + /** 状态(1当前生效 0历史版本) */ + status?: number; + /** 是否锁定(0未锁定 1已锁定) */ + locked?: number; + /** 图标来源(device/admin) */ + source?: string; + /** 创建时间 */ + createTime?: string; + /** 更新时间 */ + updateTime?: string; +} diff --git a/src/views/devices/app-icon/index.vue b/src/views/devices/app-icon/index.vue new file mode 100644 index 00000000..ec98ff02 --- /dev/null +++ b/src/views/devices/app-icon/index.vue @@ -0,0 +1,435 @@ + + + + +