smart-admin-web 10.10.1 → 10.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/api/index.d.ts +52 -1
  2. package/dist/api/index.js +151 -84
  3. package/dist/api/index.js.map +1 -1
  4. package/dist/api/schema.d.ts +936 -15
  5. package/dist/assets/icons/ph-subset.json.js +7 -7
  6. package/dist/index.js +278 -274
  7. package/dist/lib/runtime.js +1 -1
  8. package/dist/locales/en-US.d.ts +144 -0
  9. package/dist/locales/en-US.js +146 -0
  10. package/dist/locales/en-US.js.map +1 -1
  11. package/dist/locales/zh-CN.d.ts +144 -0
  12. package/dist/locales/zh-CN.js +146 -0
  13. package/dist/locales/zh-CN.js.map +1 -1
  14. package/dist/router/viewRegistry.js +1 -1
  15. package/dist/router/viewRegistry.js.map +1 -1
  16. package/dist/style.css +1 -1
  17. package/dist/types/api.d.ts +166 -0
  18. package/dist/types/api.js +12 -9
  19. package/dist/types/api.js.map +1 -1
  20. package/dist/views/system/ai-model/components/ProviderCard.vue.d.ts +13 -0
  21. package/dist/views/system/ai-model/components/ProviderCard.vue.js +8 -0
  22. package/dist/views/system/ai-model/components/ProviderCard.vue.js.map +1 -0
  23. package/dist/views/system/ai-model/components/ProviderCard2.vue.js +230 -0
  24. package/dist/views/system/ai-model/components/ProviderCard2.vue.js.map +1 -0
  25. package/dist/views/system/ai-model/components/ProviderForm.vue.d.ts +18 -0
  26. package/dist/views/system/ai-model/components/ProviderForm.vue.js +8 -0
  27. package/dist/views/system/ai-model/components/ProviderForm.vue.js.map +1 -0
  28. package/dist/views/system/ai-model/components/ProviderForm2.vue.js +507 -0
  29. package/dist/views/system/ai-model/components/ProviderForm2.vue.js.map +1 -0
  30. package/dist/views/system/ai-model/index.vue.d.ts +3 -0
  31. package/dist/views/system/ai-model/index.vue.js +8 -0
  32. package/dist/views/system/ai-model/index.vue.js.map +1 -0
  33. package/dist/views/system/ai-model/index2.vue.js +134 -0
  34. package/dist/views/system/ai-model/index2.vue.js.map +1 -0
  35. package/dist/views/system/ai-model/presets.d.ts +14 -0
  36. package/dist/views/system/ai-model/presets.js +22 -0
  37. package/dist/views/system/ai-model/presets.js.map +1 -0
  38. package/dist/views/system/ai-usage/index.vue.d.ts +3 -0
  39. package/dist/views/system/ai-usage/index.vue.js +8 -0
  40. package/dist/views/system/ai-usage/index.vue.js.map +1 -0
  41. package/dist/views/system/ai-usage/index2.vue.js +423 -0
  42. package/dist/views/system/ai-usage/index2.vue.js.map +1 -0
  43. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sources":["../../src/types/api.ts"],"sourcesContent":["// 接口出参领域类型(与后端 DTO 对齐)。API 层用它标注 unwrap<T> 的返回,视图直接消费。\nimport type { AppModule } from './menu'\n\n/** 登录/刷新出参(后端 LoginOutput)。 */\nexport interface LoginOutput {\n accessToken: string\n expiresAt: string\n refreshToken: string\n refreshExpiresAt: string\n userId: number\n account: string\n name: string\n /** 是否需强制改密(管理员建号/重置后首登为 true)。 */\n mustChangePassword: boolean\n /**\n * 会话交付模式(可选)。\n * - `body`:刷新令牌在 JSON 体(默认,前端 localStorage 持久化)\n * - `cookie`:刷新令牌在 HttpOnly Cookie,access 仅内存\n * 缺省时前端用 refreshToken 空串 + csrfRequired 兜底判定(见 stores/user.ts 的 isCookieSession)。\n */\n sessionMode?: 'body' | 'cookie' | string | null\n /**\n * 是否要求双提交 CSRF(`X-Smart-CSRF` + `smart_csrf` Cookie)。\n * Cookie 会话为 true;默认模式为 false/缺省。\n */\n csrfRequired?: boolean | null\n /** 是否超管;前端据此在 profile 接口故障时仍能正确 fail-open v-auth。 */\n isSuperAdmin?: boolean\n}\n\n/** 我的应用列表(后端 MyModulesOutput)。 */\nexport interface MyModulesOutput {\n modules: AppModule[]\n defaultModuleId?: number | null\n}\n\n/** 个人资料(后端 UserProfile)。 */\nexport interface UserProfile {\n id: number\n account: string\n name: string\n orgId?: number | null\n positionId?: number | null\n /** 机构名称(未分配/已删则 null) */\n orgName?: string | null\n /** 职位名称(未分配/已删则 null) */\n positionName?: string | null\n nickname?: string | null\n phone?: string | null\n email?: string | null\n /** 性别:字典 gender 的项 Value(\"1\"男/\"2\"女/\"0\"未知) */\n gender?: string | null\n /** 头像(文件签名直链 ViewUrl,直接进 img) */\n avatar?: string | null\n isSuperAdmin: boolean\n}\n\n/** 我的会话项(后端 MySessionItem;个人视角,isCurrent 标记本次请求所用会话)。 */\nexport interface MySessionItem {\n sessionId: string\n ip?: string | null\n userAgent?: string | null\n loginTime: string\n expiresAt: string\n isCurrent: boolean\n}\n\n/** 后端统一分页结果 PagedList<T>。 */\nexport interface PagedList<T> {\n current: number\n size: number\n total: number\n pages: number\n items: T[]\n}\n\n/** 用户列表项(后端 UserItem;刻意不含密码)。 */\nexport interface UserItem {\n id: number\n account: string\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n orgName?: string | null\n positionName?: string | null\n directorName?: string | null\n enabled: boolean\n isSuperAdmin: boolean\n /** 管理员显式强制 TOTP(只能加严)。 */\n forceTotp?: boolean\n /** 是否已绑定 TOTP(只读)。 */\n totpEnabled?: boolean\n createTime: string\n}\n\n/** 模块/应用管理行(后端 SysModule;列表全字段)。 */\nexport interface ModuleRow {\n id: number\n code: string\n title: string\n icon?: string | null\n defaultRoute?: string | null\n /** 后端路由匹配前缀(如 sys/biz):菜单配按钮时权限路由下拉据此按应用软过滤;留空=不过滤。 */\n apiPrefix?: string | null\n sort: number\n enabled: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 工作台首页统计(后端 DashboardSummaryOutput)。趋势三条数组等长(近 7 日,含今天,无登录的日子为 0)。 */\nexport interface DashboardSummary {\n roles: number\n users: number\n perms: number\n onlineSessions: number\n trendDays: string[]\n trendLogins: number[]\n trendActiveUsers: number[]\n}\n\n/** 字典项消费投影(后端 SysDictItem;sort 归一为 number,甩掉 int64 序列化的 number|string 噪音)。 */\nexport interface DictItem {\n label: string\n value: string\n sort: number\n enabled: boolean\n}\n\n/** 模块新增/编辑入参(后端 ModuleInput)。 */\nexport interface ModuleInput {\n code: string\n title: string\n icon?: string | null\n defaultRoute?: string | null\n apiPrefix?: string | null\n sort: number\n enabled: boolean\n remark?: string | null\n}\n\n/** 系统配置行(后端 SysConfig;列表返回全字段,int64 收敛为 number)。 */\nexport interface SysConfig {\n id: number\n configKey: string\n configValue?: string | null\n name: string\n groupCode?: string | null\n sort: number\n remark?: string | null\n createTime?: string\n}\n\n/** 配置新增/编辑入参(后端 ConfigInput;configKey 创建后不可改)。 */\nexport interface ConfigInput {\n configKey: string\n configValue?: string | null\n name: string\n groupCode?: string | null\n sort: number\n remark?: string | null\n}\n\n/** 字典类型行(后端 SysDictType;Code 创建后不可改)。int64 收敛为 number。 */\nexport interface SysDictType {\n id: number\n code: string\n name: string\n sort: number\n enabled: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 字典项行(后端 SysDictItem;管理端分页含停用项,带 id——区别于下拉投影 DictItem)。int64 收敛为 number。 */\nexport interface SysDictItem {\n id: number\n dictTypeCode: string\n label: string\n value: string\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 字典类型新增/编辑入参(后端 DictTypeInput;code 创建后不可改,更新时服务端忽略)。 */\nexport interface DictTypeInput {\n code: string\n name: string\n sort: number\n enabled: boolean\n remark?: string | null\n}\n\n/** 字典项新增/编辑入参(后端 DictItemInput;dictTypeCode = 当前类型,表单隐藏)。 */\nexport interface DictItemInput {\n dictTypeCode: string\n label: string\n value: string\n sort: number\n enabled: boolean\n}\n\n/** 文件记录行(后端 SysFile;列表返回,int64 收敛为 number)。 */\nexport interface SysFile {\n id: number\n originalName: string\n storagePath: string\n extension: string\n contentType?: string | null\n sizeBytes: number\n fileHash?: string | null\n createTime?: string\n}\n\n/** 上传出参(后端 FileUploadOutput)。 */\nexport interface FileUploadOutput {\n id: number\n originalName: string\n /** 存储层相对路径。**别当 URL 用**:后端默认不静态托管上传目录,当 src 必然坏链。要展示图片用 viewUrl。 */\n storagePath: string\n sizeBytes: number\n fileHash?: string | null\n /** 签名直链(匿名可取、不可伪造),可直接塞进 `<img src>`;后端签发,前端不自己拼。 */\n viewUrl?: string | null\n}\n\n/** 分片上传初始化出参(后端 ChunkInitOutput)。 */\nexport interface ChunkInitOutput {\n /** 秒传命中(同内容哈希已存在,无需再传)。 */\n uploaded: boolean\n /** 秒传命中时的既有文件。 */\n file?: FileUploadOutput | null\n /** 上传会话 Id(= 文件哈希);非秒传时返回。 */\n uploadId?: string | null\n /** 服务端已收到的分片下标(断点续传:跳过已传)。 */\n receivedIndexes: number[]\n}\n\n/** 在线会话行(后端 OnlineSessionItem;只读 + 强退按 sessionId)。int64 收敛为 number。 */\nexport interface OnlineSessionItem {\n sessionId: string\n userId: number\n account: string\n ip?: string | null\n userAgent?: string | null\n loginTime?: string\n expiresAt?: string\n}\n\n/** 登录日志行(后端 SysLoginLog;只读,int64 收敛为 number)。 */\nexport interface SysLoginLog {\n id: number\n account: string\n success: boolean\n resultCode: number\n userId?: number | null\n name?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 操作日志行(后端 SysOpLog;只读,分页项已含全字段,详情抽屉直接用行数据)。 */\nexport interface SysOpLog {\n id: number\n title: string\n httpMethod: string\n path: string\n paramJson?: string | null\n resultCode: number\n success: boolean\n exceptionMessage?: string | null\n elapsedMs: number\n operatorId?: number | null\n operatorName?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 磁盘分区容量(后端 DiskInfo)。 */\nexport interface DiskInfo {\n name: string\n totalBytes: number\n freeBytes: number\n}\n\n/** 服务器运行快照(后端 ServerInfoOutput;进程/主机基础指标)。 */\nexport interface ServerInfoOutput {\n machineName: string\n osDescription: string\n frameworkDescription: string\n processArchitecture: string\n processorCount: number\n processUptimeSeconds: number\n processCpuPercent: number\n processWorkingSetBytes: number\n gcHeapBytes: number\n totalAvailableMemoryBytes: number\n threadCount: number\n disks: DiskInfo[]\n}\n\n/** 异常日志行(后端 SysExceptionLog;未捕获异常留痕,只读,分页项已含全字段)。 */\nexport interface SysExceptionLog {\n id: number\n httpMethod: string\n path: string\n traceId?: string | null\n exceptionType: string\n message?: string | null\n stackTrace?: string | null\n operatorId?: number | null\n operatorName?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 机构行(后端 SysOrg;平铺,前端 buildTree)。int64 收敛为 number。 */\nexport interface SysOrg {\n id: number\n parentId: number\n name: string\n code: string\n category?: string | null\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 机构新增/编辑入参(后端 OrgInput;parentId 0=根,code 编辑禁用)。 */\nexport interface OrgInput {\n parentId: number\n name: string\n code: string\n category?: string | null\n sort: number\n enabled: boolean\n}\n\n/** 职位行(后端 SysPosition)。int64 收敛为 number。 */\nexport interface SysPosition {\n id: number\n name: string\n code: string\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 职位新增/编辑入参(后端 PositionInput;增改同一份字段,code 编辑禁用)。 */\nexport interface PositionInput {\n name: string\n code: string\n sort: number\n enabled: boolean\n}\n\n/** 角色行(后端 SysRole)。int64 收敛为 number。 */\nexport interface SysRole {\n id: number\n name: string\n code: string\n sort: number\n enabled: boolean\n remark?: string | null\n isDelegatable?: boolean | null\n createTime?: string\n}\n\n/** 角色新增/编辑入参(后端 RoleInput;增改同一份字段,code 编辑禁用)。 */\nexport interface RoleInput {\n name: string\n code: string\n sort: number\n enabled: boolean\n remark?: string | null\n isDelegatable?: boolean | null\n}\n\n/** 数据范围类型(后端 DataScopeType;存库为 int,枚举值须与后端一致)。 */\nexport enum DataScopeType {\n All = 1,\n Org = 2,\n OrgAndChildren = 3,\n Self = 4,\n Custom = 5,\n}\n\n/** 角色数据范围配置(后端 SysRoleDataScope;数据范围抽屉回显)。customOrgIds 逗号分隔。 */\nexport interface SysRoleDataScope {\n id: number\n roleId: number\n scopeType: DataScopeType\n customOrgIds: string\n}\n\n/** 新增用户入参(后端 AddUserInput;account 建后不可改,password 留空=系统生成随机强口令)。 */\nexport interface AddUserInput {\n account: string\n password?: string | null\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n /** 建号即强制 TOTP。 */\n forceTotp?: boolean\n roleIds: number[]\n}\n\n/** 新增用户出参(后端 AddUserOutput):新 Id + 实际生效的初始口令明文——留空口令时是随机生成的,不展示给管理员就没人知道。 */\nexport interface AddUserOutput {\n id: number\n initialPassword: string\n}\n\n/** 一条可授权路由(后端 PermissionRouteItem);喂菜单表单权限码下拉,code 即写进 SysMenu.Permission 的值。 */\nexport interface PermissionRouteItem {\n code: string\n method: string\n path: string\n}\n\n/** 更新用户入参(后端 UpdateUserInput;无 account/password。roleIds 由 detail 原样带回避免清空)。 */\nexport interface UpdateUserInput {\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n forceTotp?: boolean\n roleIds: number[]\n}\n\n/** 用户详情(后端 UserDetail;列表字段 + roleIds,编辑回显用)。 */\nexport interface UserDetail {\n id: number\n account: string\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n isSuperAdmin: boolean\n forceTotp?: boolean\n totpEnabled?: boolean\n roleIds: number[]\n createTime?: string\n}\n\n/** 通知类型(后端 NoticeType;存库 int,枚举值须与后端一致)。 */\nexport enum NoticeType {\n Notice = 1,\n Announcement = 2,\n Message = 3,\n}\n\n/** 接收范围(后端 ReceiverType;All=0 对全体广播,Role/User 定向)。 */\nexport enum ReceiverType {\n All = 0,\n Role = 1,\n User = 2,\n}\n\n/**\n * 通知动作(后端 NoticeAction):前端渲染成正文下的按钮。url 以 /api/ 开头是接口调用(按 method 发请求),\n * 其它单个 / 开头的站内路径是页面跳转;协议相对 URL(//host、/\\host)发布时即被拒绝。\n * label 含 `.` 视为 i18n key。comment=true 先弹意见框,把 { comment } 作为请求体带上。\n */\nexport interface NoticeAction {\n label: string\n method: 'GET' | 'POST'\n url: string\n style?: 'primary' | 'default' | 'error' | null\n confirm?: boolean\n comment?: boolean\n}\n\n/** 通知行(后端 SysNotice;管理端列表全字段,int64 收敛为 number)。 */\nexport interface SysNotice {\n id: number\n title: string\n content?: string | null\n type: NoticeType\n createTime?: string\n /** 动作列表原文(JSON 数组);管理端只展示条数 */\n actionsJson?: string | null\n}\n\n/** 我的通知项(后端 NoticeMineItem;含当前用户已读标记)。 */\nexport interface NoticeMineItem {\n id: number\n title: string\n content?: string | null\n type: NoticeType\n publishTime: string\n isRead: boolean\n actions?: NoticeAction[] | null\n}\n\n/** 发布通知入参(后端 NoticePublishInput)。 */\nexport interface NoticePublishInput {\n title: string\n content?: string | null\n type: NoticeType\n /** 接收范围;缺省 All 广播全体。 */\n receiverType: ReceiverType\n /** 接收目标 Id(角色 Id 或用户 Id,取决于 receiverType);All 时忽略。 */\n receiverIds?: number[]\n /** 动作列表(可选,最多 5 条) */\n actions?: NoticeAction[] | null\n}\n\n// ── 导入 / 导出(与后端 Core DTO 对齐) ──\n\n/** 导入列声明。 */\nexport interface ImportColumn {\n key: string\n title: string\n required?: boolean\n dictTypeCode?: string | null\n hint?: string | null\n width?: number\n}\n\n/** 导出列声明(前端选列弹窗用;DefaultSelected 决定默认勾选)。 */\nexport interface ExportColumnDef {\n key: string\n title: string\n defaultSelected?: boolean\n}\n\n/** 单元格级错误:只带码,文案由前端 translateError(code) 渲染。 */\nexport interface CellError {\n columnKey: string\n code: number\n args?: Record<string, unknown> | null\n}\n\n/** 一行导入数据;单元格一律字符串。 */\nexport interface ImportRow {\n index: number\n cells: Record<string, string | null | undefined>\n errors: CellError[]\n}\n\n/** 预览 / 重验结果。 */\nexport interface ImportPreview {\n headers: string[]\n /** 表头文本 → 列 Key */\n mapping: Record<string, string>\n columns: ImportColumn[]\n rows: ImportRow[]\n total: number\n errorRows: number\n columnErrors: CellError[]\n}\n\n/** 重复处理策略(与后端 DuplicateStrategy 一致)。 */\nexport enum DuplicateStrategy {\n Skip = 0,\n Overwrite = 1,\n Error = 2,\n}\n\n/** 提交结果。 */\nexport interface ImportCommitResult {\n total: number\n inserted: number\n updated: number\n skipped: number\n failed: number\n failures: ImportRow[]\n}\n\n// ── 定时任务(与后端 SysJob/SysJobLog/JobInput 对齐) ──\n\n/** 载荷类型(后端 JobHandlerKind;存库 int)。 */\nexport enum JobHandlerKind {\n Compiled = 1,\n Http = 2,\n Sql = 3,\n}\n\n/** 触发类型(后端 JobTriggerKind)。 */\nexport enum JobTriggerKind {\n Cron = 1,\n Interval = 2,\n OneShot = 3,\n}\n\n/** 错过策略(后端 JobMisfireStrategy)。 */\nexport enum JobMisfireStrategy {\n Skip = 1,\n FireOnceNow = 2,\n}\n\n/** 并发模式(后端 JobConcurrencyMode;SerialSkip=上次未结束则跳过本次)。 */\nexport enum JobConcurrencyMode {\n SerialSkip = 1,\n Parallel = 2,\n}\n\n/** 任务状态(后端 JobStatus;无 Running 态——\"正在运行\"由未闭合执行记录推导)。 */\nexport enum JobStatus {\n Ready = 1,\n Paused = 2,\n Completed = 3,\n Panic = 4,\n}\n\n/** 单次执行结果(后端 JobRunStatus)。 */\nexport enum JobRunStatus {\n Running = 1,\n Success = 2,\n Failed = 3,\n Timeout = 4,\n Cancelled = 5,\n Skipped = 6,\n}\n\n/** 触发来源(后端 JobFireMode)。 */\nexport enum JobFireMode {\n Schedule = 1,\n Manual = 2,\n Misfire = 3,\n MissedSkipped = 4,\n}\n\n/** 任务行(后端 SysJob;page 返回整行,编辑表单直接用行数据回填)。 */\nexport interface SysJob {\n id: number\n code: string\n name: string\n handlerKind: JobHandlerKind\n handlerName: string\n /** 属性包 JSON(Dictionary<string,string?> 字符串化;HTTP 的 headers 值读取时已被掩码)。 */\n propsJson?: string | null\n triggerKind: JobTriggerKind\n cronExpression?: string | null\n intervalSeconds?: number | null\n oneShotTime?: string | null\n startTime?: string | null\n endTime?: string | null\n misfireStrategy: JobMisfireStrategy\n concurrencyMode: JobConcurrencyMode\n status: JobStatus\n nextRunTime?: string | null\n lastRunTime?: string | null\n numberOfRuns: number\n numberOfErrors: number\n consecutiveErrors: number\n timeoutSeconds: number\n retryCount: number\n retryIntervalSeconds: number\n failAlertThreshold: number\n alertByNotice: boolean\n alertEmails?: string | null\n isSystem: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 任务新增/编辑入参(后端 JobInput;code 仅新增时生效,更新被服务层忽略)。 */\nexport interface JobInput {\n code: string\n name: string\n handlerKind: JobHandlerKind\n /** 编译类填处理器标识;HTTP/SQL 由服务端固定填内置处理器名,传空即可。 */\n handlerName: string\n /** 属性包对象(非字符串!后端存成 propsJson;HTTP 的 headers 子键值对序列化成 JSON 字符串放 properties.headers)。 */\n properties?: Record<string, string> | null\n triggerKind: JobTriggerKind\n cronExpression?: string | null\n /** ≥5(<5 后端拒 47004)。 */\n intervalSeconds?: number | null\n oneShotTime?: string | null\n startTime?: string | null\n endTime?: string | null\n misfireStrategy: JobMisfireStrategy\n concurrencyMode: JobConcurrencyMode\n timeoutSeconds: number\n retryCount: number\n retryIntervalSeconds: number\n failAlertThreshold: number\n alertByNotice: boolean\n alertEmails?: string | null\n remark?: string | null\n}\n\n/** 执行记录行(后端 SysJobLog;endTime 为空 = 运行中,同 fireInstanceId 聚合重试)。 */\nexport interface SysJobLog {\n id: number\n jobId: number\n jobName: string\n fireInstanceId: number\n retryIndex: number\n fireMode: JobFireMode\n scheduledTime: string\n startTime: string\n endTime?: string | null\n runStatus: JobRunStatus\n elapsedMs: number\n nodeName: string\n killRequested: boolean\n messageText?: string | null\n errorText?: string | null\n createTime?: string\n}\n\n/** cron 预览结果(后端 CronPreviewOutput)。 */\nexport interface CronPreviewOutput {\n normalized: string\n occurrences: string[]\n /** 秒段等效每秒执行的告警(仅提示,不拦截)。 */\n everySecondWarning: boolean\n}\n\n/** 处理器清单(后端 JobHandlersOutput)。 */\nexport interface JobHandlersOutput {\n /** 已注册的编译类处理器名(IAdminJob.Name)。 */\n handlers: string[]\n /** SQL 载荷总闸(SmartAdmin:Jobs:Sql:Enabled);false 时前端禁选 SQL 并提示。 */\n sqlEnabled: boolean\n}\n\n/** 成败趋势的一天。 */\nexport interface JobTrendPoint {\n date: string\n success: number\n failed: number\n}\n\n/** 即将执行的一项。 */\nexport interface JobUpcomingItem {\n jobId: number\n name: string\n nextRunTime: string\n}\n\n/** 集群节点一行(角色由与锁行比对得出)。 */\nexport interface JobNodeItem {\n nodeName: string\n hostName: string\n isLeader: boolean\n lastHeartbeat: string\n workerId: number\n pid: number\n}\n\n/** 任务监控仪表盘(后端 JobDashboardOutput)。 */\nexport interface JobDashboard {\n todaySuccess: number\n todayFailed: number\n running: number\n totalJobs: number\n /** 按状态的任务数(键 = Ready/Paused/Completed/Panic)。 */\n statusCounts: Record<string, number>\n trend: JobTrendPoint[]\n upcoming: JobUpcomingItem[]\n nodes: JobNodeItem[]\n}\n"],"names":["DataScopeType","NoticeType","ReceiverType","DuplicateStrategy","JobHandlerKind","JobTriggerKind","JobMisfireStrategy","JobConcurrencyMode","JobStatus","JobRunStatus","JobFireMode"],"mappings":"AAqYO,IAAKA,sBAAAA,OACVA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,iBAAiB,CAAA,IAAjB,kBACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UALUA,IAAAA,KAAA,CAAA,CAAA,GAsFAC,sBAAAA,OACVA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,eAAe,CAAA,IAAf,gBACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QAHUA,IAAAA,KAAA,CAAA,CAAA,GAqGAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SAHUA,IAAAA,KAAA,CAAA,CAAA,GAmBAC,sBAAAA,OACVA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,cAAc,CAAA,IAAd,eAFUA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAAA,EAAA,aAAa,CAAA,IAAb,cACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YAFUA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SAJUA,IAAAA,KAAA,CAAA,CAAA,GAQAC,sBAAAA,OACVA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WANUA,IAAAA,KAAA,CAAA,CAAA,GAUAC,sBAAAA,OACVA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,gBAAgB,CAAA,IAAhB,iBAJUA,IAAAA,KAAA,CAAA,CAAA;"}
1
+ {"version":3,"file":"api.js","sources":["../../src/types/api.ts"],"sourcesContent":["// 接口出参领域类型(与后端 DTO 对齐)。API 层用它标注 unwrap<T> 的返回,视图直接消费。\nimport type { AppModule } from './menu'\n\n/** 登录/刷新出参(后端 LoginOutput)。 */\nexport interface LoginOutput {\n accessToken: string\n expiresAt: string\n refreshToken: string\n refreshExpiresAt: string\n userId: number\n account: string\n name: string\n /** 是否需强制改密(管理员建号/重置后首登为 true)。 */\n mustChangePassword: boolean\n /**\n * 会话交付模式(可选)。\n * - `body`:刷新令牌在 JSON 体(默认,前端 localStorage 持久化)\n * - `cookie`:刷新令牌在 HttpOnly Cookie,access 仅内存\n * 缺省时前端用 refreshToken 空串 + csrfRequired 兜底判定(见 stores/user.ts 的 isCookieSession)。\n */\n sessionMode?: 'body' | 'cookie' | string | null\n /**\n * 是否要求双提交 CSRF(`X-Smart-CSRF` + `smart_csrf` Cookie)。\n * Cookie 会话为 true;默认模式为 false/缺省。\n */\n csrfRequired?: boolean | null\n /** 是否超管;前端据此在 profile 接口故障时仍能正确 fail-open v-auth。 */\n isSuperAdmin?: boolean\n}\n\n/** 我的应用列表(后端 MyModulesOutput)。 */\nexport interface MyModulesOutput {\n modules: AppModule[]\n defaultModuleId?: number | null\n}\n\n/** 个人资料(后端 UserProfile)。 */\nexport interface UserProfile {\n id: number\n account: string\n name: string\n orgId?: number | null\n positionId?: number | null\n /** 机构名称(未分配/已删则 null) */\n orgName?: string | null\n /** 职位名称(未分配/已删则 null) */\n positionName?: string | null\n nickname?: string | null\n phone?: string | null\n email?: string | null\n /** 性别:字典 gender 的项 Value(\"1\"男/\"2\"女/\"0\"未知) */\n gender?: string | null\n /** 头像(文件签名直链 ViewUrl,直接进 img) */\n avatar?: string | null\n isSuperAdmin: boolean\n}\n\n/** 我的会话项(后端 MySessionItem;个人视角,isCurrent 标记本次请求所用会话)。 */\nexport interface MySessionItem {\n sessionId: string\n ip?: string | null\n userAgent?: string | null\n loginTime: string\n expiresAt: string\n isCurrent: boolean\n}\n\n/** 后端统一分页结果 PagedList<T>。 */\nexport interface PagedList<T> {\n current: number\n size: number\n total: number\n pages: number\n items: T[]\n}\n\n/** 用户列表项(后端 UserItem;刻意不含密码)。 */\nexport interface UserItem {\n id: number\n account: string\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n orgName?: string | null\n positionName?: string | null\n directorName?: string | null\n enabled: boolean\n isSuperAdmin: boolean\n /** 管理员显式强制 TOTP(只能加严)。 */\n forceTotp?: boolean\n /** 是否已绑定 TOTP(只读)。 */\n totpEnabled?: boolean\n createTime: string\n}\n\n/** 模块/应用管理行(后端 SysModule;列表全字段)。 */\nexport interface ModuleRow {\n id: number\n code: string\n title: string\n icon?: string | null\n defaultRoute?: string | null\n /** 后端路由匹配前缀(如 sys/biz):菜单配按钮时权限路由下拉据此按应用软过滤;留空=不过滤。 */\n apiPrefix?: string | null\n sort: number\n enabled: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 工作台首页统计(后端 DashboardSummaryOutput)。趋势三条数组等长(近 7 日,含今天,无登录的日子为 0)。 */\nexport interface DashboardSummary {\n roles: number\n users: number\n perms: number\n onlineSessions: number\n trendDays: string[]\n trendLogins: number[]\n trendActiveUsers: number[]\n}\n\n/** 字典项消费投影(后端 SysDictItem;sort 归一为 number,甩掉 int64 序列化的 number|string 噪音)。 */\nexport interface DictItem {\n label: string\n value: string\n sort: number\n enabled: boolean\n}\n\n/** 模块新增/编辑入参(后端 ModuleInput)。 */\nexport interface ModuleInput {\n code: string\n title: string\n icon?: string | null\n defaultRoute?: string | null\n apiPrefix?: string | null\n sort: number\n enabled: boolean\n remark?: string | null\n}\n\n/** 系统配置行(后端 SysConfig;列表返回全字段,int64 收敛为 number)。 */\nexport interface SysConfig {\n id: number\n configKey: string\n configValue?: string | null\n name: string\n groupCode?: string | null\n sort: number\n remark?: string | null\n createTime?: string\n}\n\n/** 配置新增/编辑入参(后端 ConfigInput;configKey 创建后不可改)。 */\nexport interface ConfigInput {\n configKey: string\n configValue?: string | null\n name: string\n groupCode?: string | null\n sort: number\n remark?: string | null\n}\n\n/** 字典类型行(后端 SysDictType;Code 创建后不可改)。int64 收敛为 number。 */\nexport interface SysDictType {\n id: number\n code: string\n name: string\n sort: number\n enabled: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 字典项行(后端 SysDictItem;管理端分页含停用项,带 id——区别于下拉投影 DictItem)。int64 收敛为 number。 */\nexport interface SysDictItem {\n id: number\n dictTypeCode: string\n label: string\n value: string\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 字典类型新增/编辑入参(后端 DictTypeInput;code 创建后不可改,更新时服务端忽略)。 */\nexport interface DictTypeInput {\n code: string\n name: string\n sort: number\n enabled: boolean\n remark?: string | null\n}\n\n/** 字典项新增/编辑入参(后端 DictItemInput;dictTypeCode = 当前类型,表单隐藏)。 */\nexport interface DictItemInput {\n dictTypeCode: string\n label: string\n value: string\n sort: number\n enabled: boolean\n}\n\n/** 文件记录行(后端 SysFile;列表返回,int64 收敛为 number)。 */\nexport interface SysFile {\n id: number\n originalName: string\n storagePath: string\n extension: string\n contentType?: string | null\n sizeBytes: number\n fileHash?: string | null\n createTime?: string\n}\n\n/** 上传出参(后端 FileUploadOutput)。 */\nexport interface FileUploadOutput {\n id: number\n originalName: string\n /** 存储层相对路径。**别当 URL 用**:后端默认不静态托管上传目录,当 src 必然坏链。要展示图片用 viewUrl。 */\n storagePath: string\n sizeBytes: number\n fileHash?: string | null\n /** 签名直链(匿名可取、不可伪造),可直接塞进 `<img src>`;后端签发,前端不自己拼。 */\n viewUrl?: string | null\n}\n\n/** 分片上传初始化出参(后端 ChunkInitOutput)。 */\nexport interface ChunkInitOutput {\n /** 秒传命中(同内容哈希已存在,无需再传)。 */\n uploaded: boolean\n /** 秒传命中时的既有文件。 */\n file?: FileUploadOutput | null\n /** 上传会话 Id(= 文件哈希);非秒传时返回。 */\n uploadId?: string | null\n /** 服务端已收到的分片下标(断点续传:跳过已传)。 */\n receivedIndexes: number[]\n}\n\n/** 在线会话行(后端 OnlineSessionItem;只读 + 强退按 sessionId)。int64 收敛为 number。 */\nexport interface OnlineSessionItem {\n sessionId: string\n userId: number\n account: string\n ip?: string | null\n userAgent?: string | null\n loginTime?: string\n expiresAt?: string\n}\n\n/** 登录日志行(后端 SysLoginLog;只读,int64 收敛为 number)。 */\nexport interface SysLoginLog {\n id: number\n account: string\n success: boolean\n resultCode: number\n userId?: number | null\n name?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 操作日志行(后端 SysOpLog;只读,分页项已含全字段,详情抽屉直接用行数据)。 */\nexport interface SysOpLog {\n id: number\n title: string\n httpMethod: string\n path: string\n paramJson?: string | null\n resultCode: number\n success: boolean\n exceptionMessage?: string | null\n elapsedMs: number\n operatorId?: number | null\n operatorName?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 磁盘分区容量(后端 DiskInfo)。 */\nexport interface DiskInfo {\n name: string\n totalBytes: number\n freeBytes: number\n}\n\n/** 服务器运行快照(后端 ServerInfoOutput;进程/主机基础指标)。 */\nexport interface ServerInfoOutput {\n machineName: string\n osDescription: string\n frameworkDescription: string\n processArchitecture: string\n processorCount: number\n processUptimeSeconds: number\n processCpuPercent: number\n processWorkingSetBytes: number\n gcHeapBytes: number\n totalAvailableMemoryBytes: number\n threadCount: number\n disks: DiskInfo[]\n}\n\n/** 异常日志行(后端 SysExceptionLog;未捕获异常留痕,只读,分页项已含全字段)。 */\nexport interface SysExceptionLog {\n id: number\n httpMethod: string\n path: string\n traceId?: string | null\n exceptionType: string\n message?: string | null\n stackTrace?: string | null\n operatorId?: number | null\n operatorName?: string | null\n ip?: string | null\n userAgent?: string | null\n createTime: string\n}\n\n/** 机构行(后端 SysOrg;平铺,前端 buildTree)。int64 收敛为 number。 */\nexport interface SysOrg {\n id: number\n parentId: number\n name: string\n code: string\n category?: string | null\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 机构新增/编辑入参(后端 OrgInput;parentId 0=根,code 编辑禁用)。 */\nexport interface OrgInput {\n parentId: number\n name: string\n code: string\n category?: string | null\n sort: number\n enabled: boolean\n}\n\n/** 职位行(后端 SysPosition)。int64 收敛为 number。 */\nexport interface SysPosition {\n id: number\n name: string\n code: string\n sort: number\n enabled: boolean\n createTime?: string\n}\n\n/** 职位新增/编辑入参(后端 PositionInput;增改同一份字段,code 编辑禁用)。 */\nexport interface PositionInput {\n name: string\n code: string\n sort: number\n enabled: boolean\n}\n\n/** 角色行(后端 SysRole)。int64 收敛为 number。 */\nexport interface SysRole {\n id: number\n name: string\n code: string\n sort: number\n enabled: boolean\n remark?: string | null\n isDelegatable?: boolean | null\n createTime?: string\n}\n\n/** 角色新增/编辑入参(后端 RoleInput;增改同一份字段,code 编辑禁用)。 */\nexport interface RoleInput {\n name: string\n code: string\n sort: number\n enabled: boolean\n remark?: string | null\n isDelegatable?: boolean | null\n}\n\n/** 数据范围类型(后端 DataScopeType;存库为 int,枚举值须与后端一致)。 */\nexport enum DataScopeType {\n All = 1,\n Org = 2,\n OrgAndChildren = 3,\n Self = 4,\n Custom = 5,\n}\n\n/** 角色数据范围配置(后端 SysRoleDataScope;数据范围抽屉回显)。customOrgIds 逗号分隔。 */\nexport interface SysRoleDataScope {\n id: number\n roleId: number\n scopeType: DataScopeType\n customOrgIds: string\n}\n\n/** 新增用户入参(后端 AddUserInput;account 建后不可改,password 留空=系统生成随机强口令)。 */\nexport interface AddUserInput {\n account: string\n password?: string | null\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n /** 建号即强制 TOTP。 */\n forceTotp?: boolean\n roleIds: number[]\n}\n\n/** 新增用户出参(后端 AddUserOutput):新 Id + 实际生效的初始口令明文——留空口令时是随机生成的,不展示给管理员就没人知道。 */\nexport interface AddUserOutput {\n id: number\n initialPassword: string\n}\n\n/** 一条可授权路由(后端 PermissionRouteItem);喂菜单表单权限码下拉,code 即写进 SysMenu.Permission 的值。 */\nexport interface PermissionRouteItem {\n code: string\n method: string\n path: string\n}\n\n/** 更新用户入参(后端 UpdateUserInput;无 account/password。roleIds 由 detail 原样带回避免清空)。 */\nexport interface UpdateUserInput {\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n forceTotp?: boolean\n roleIds: number[]\n}\n\n/** 用户详情(后端 UserDetail;列表字段 + roleIds,编辑回显用)。 */\nexport interface UserDetail {\n id: number\n account: string\n name: string\n nickname?: string | null\n phone?: string | null\n email?: string | null\n gender?: string | null\n avatar?: string | null\n orgId?: number | null\n positionId?: number | null\n directorId?: number | null\n enabled: boolean\n isSuperAdmin: boolean\n forceTotp?: boolean\n totpEnabled?: boolean\n roleIds: number[]\n createTime?: string\n}\n\n/** 通知类型(后端 NoticeType;存库 int,枚举值须与后端一致)。 */\nexport enum NoticeType {\n Notice = 1,\n Announcement = 2,\n Message = 3,\n}\n\n/** 接收范围(后端 ReceiverType;All=0 对全体广播,Role/User 定向)。 */\nexport enum ReceiverType {\n All = 0,\n Role = 1,\n User = 2,\n}\n\n/**\n * 通知动作(后端 NoticeAction):前端渲染成正文下的按钮。url 以 /api/ 开头是接口调用(按 method 发请求),\n * 其它单个 / 开头的站内路径是页面跳转;协议相对 URL(//host、/\\host)发布时即被拒绝。\n * label 含 `.` 视为 i18n key。comment=true 先弹意见框,把 { comment } 作为请求体带上。\n */\nexport interface NoticeAction {\n label: string\n method: 'GET' | 'POST'\n url: string\n style?: 'primary' | 'default' | 'error' | null\n confirm?: boolean\n comment?: boolean\n}\n\n/** 通知行(后端 SysNotice;管理端列表全字段,int64 收敛为 number)。 */\nexport interface SysNotice {\n id: number\n title: string\n content?: string | null\n type: NoticeType\n createTime?: string\n /** 动作列表原文(JSON 数组);管理端只展示条数 */\n actionsJson?: string | null\n}\n\n/** 我的通知项(后端 NoticeMineItem;含当前用户已读标记)。 */\nexport interface NoticeMineItem {\n id: number\n title: string\n content?: string | null\n type: NoticeType\n publishTime: string\n isRead: boolean\n actions?: NoticeAction[] | null\n}\n\n/** 发布通知入参(后端 NoticePublishInput)。 */\nexport interface NoticePublishInput {\n title: string\n content?: string | null\n type: NoticeType\n /** 接收范围;缺省 All 广播全体。 */\n receiverType: ReceiverType\n /** 接收目标 Id(角色 Id 或用户 Id,取决于 receiverType);All 时忽略。 */\n receiverIds?: number[]\n /** 动作列表(可选,最多 5 条) */\n actions?: NoticeAction[] | null\n}\n\n// ── 导入 / 导出(与后端 Core DTO 对齐) ──\n\n/** 导入列声明。 */\nexport interface ImportColumn {\n key: string\n title: string\n required?: boolean\n dictTypeCode?: string | null\n hint?: string | null\n width?: number\n}\n\n/** 导出列声明(前端选列弹窗用;DefaultSelected 决定默认勾选)。 */\nexport interface ExportColumnDef {\n key: string\n title: string\n defaultSelected?: boolean\n}\n\n/** 单元格级错误:只带码,文案由前端 translateError(code) 渲染。 */\nexport interface CellError {\n columnKey: string\n code: number\n args?: Record<string, unknown> | null\n}\n\n/** 一行导入数据;单元格一律字符串。 */\nexport interface ImportRow {\n index: number\n cells: Record<string, string | null | undefined>\n errors: CellError[]\n}\n\n/** 预览 / 重验结果。 */\nexport interface ImportPreview {\n headers: string[]\n /** 表头文本 → 列 Key */\n mapping: Record<string, string>\n columns: ImportColumn[]\n rows: ImportRow[]\n total: number\n errorRows: number\n columnErrors: CellError[]\n}\n\n/** 重复处理策略(与后端 DuplicateStrategy 一致)。 */\nexport enum DuplicateStrategy {\n Skip = 0,\n Overwrite = 1,\n Error = 2,\n}\n\n/** 提交结果。 */\nexport interface ImportCommitResult {\n total: number\n inserted: number\n updated: number\n skipped: number\n failed: number\n failures: ImportRow[]\n}\n\n// ── 定时任务(与后端 SysJob/SysJobLog/JobInput 对齐) ──\n\n/** 载荷类型(后端 JobHandlerKind;存库 int)。 */\nexport enum JobHandlerKind {\n Compiled = 1,\n Http = 2,\n Sql = 3,\n}\n\n/** 触发类型(后端 JobTriggerKind)。 */\nexport enum JobTriggerKind {\n Cron = 1,\n Interval = 2,\n OneShot = 3,\n}\n\n/** 错过策略(后端 JobMisfireStrategy)。 */\nexport enum JobMisfireStrategy {\n Skip = 1,\n FireOnceNow = 2,\n}\n\n/** 并发模式(后端 JobConcurrencyMode;SerialSkip=上次未结束则跳过本次)。 */\nexport enum JobConcurrencyMode {\n SerialSkip = 1,\n Parallel = 2,\n}\n\n/** 任务状态(后端 JobStatus;无 Running 态——\"正在运行\"由未闭合执行记录推导)。 */\nexport enum JobStatus {\n Ready = 1,\n Paused = 2,\n Completed = 3,\n Panic = 4,\n}\n\n/** 单次执行结果(后端 JobRunStatus)。 */\nexport enum JobRunStatus {\n Running = 1,\n Success = 2,\n Failed = 3,\n Timeout = 4,\n Cancelled = 5,\n Skipped = 6,\n}\n\n/** 触发来源(后端 JobFireMode)。 */\nexport enum JobFireMode {\n Schedule = 1,\n Manual = 2,\n Misfire = 3,\n MissedSkipped = 4,\n}\n\n/** 任务行(后端 SysJob;page 返回整行,编辑表单直接用行数据回填)。 */\nexport interface SysJob {\n id: number\n code: string\n name: string\n handlerKind: JobHandlerKind\n handlerName: string\n /** 属性包 JSON(Dictionary<string,string?> 字符串化;HTTP 的 headers 值读取时已被掩码)。 */\n propsJson?: string | null\n triggerKind: JobTriggerKind\n cronExpression?: string | null\n intervalSeconds?: number | null\n oneShotTime?: string | null\n startTime?: string | null\n endTime?: string | null\n misfireStrategy: JobMisfireStrategy\n concurrencyMode: JobConcurrencyMode\n status: JobStatus\n nextRunTime?: string | null\n lastRunTime?: string | null\n numberOfRuns: number\n numberOfErrors: number\n consecutiveErrors: number\n timeoutSeconds: number\n retryCount: number\n retryIntervalSeconds: number\n failAlertThreshold: number\n alertByNotice: boolean\n alertEmails?: string | null\n isSystem: boolean\n remark?: string | null\n createTime?: string\n}\n\n/** 任务新增/编辑入参(后端 JobInput;code 仅新增时生效,更新被服务层忽略)。 */\nexport interface JobInput {\n code: string\n name: string\n handlerKind: JobHandlerKind\n /** 编译类填处理器标识;HTTP/SQL 由服务端固定填内置处理器名,传空即可。 */\n handlerName: string\n /** 属性包对象(非字符串!后端存成 propsJson;HTTP 的 headers 子键值对序列化成 JSON 字符串放 properties.headers)。 */\n properties?: Record<string, string> | null\n triggerKind: JobTriggerKind\n cronExpression?: string | null\n /** ≥5(<5 后端拒 47004)。 */\n intervalSeconds?: number | null\n oneShotTime?: string | null\n startTime?: string | null\n endTime?: string | null\n misfireStrategy: JobMisfireStrategy\n concurrencyMode: JobConcurrencyMode\n timeoutSeconds: number\n retryCount: number\n retryIntervalSeconds: number\n failAlertThreshold: number\n alertByNotice: boolean\n alertEmails?: string | null\n remark?: string | null\n}\n\n/** 执行记录行(后端 SysJobLog;endTime 为空 = 运行中,同 fireInstanceId 聚合重试)。 */\nexport interface SysJobLog {\n id: number\n jobId: number\n jobName: string\n fireInstanceId: number\n retryIndex: number\n fireMode: JobFireMode\n scheduledTime: string\n startTime: string\n endTime?: string | null\n runStatus: JobRunStatus\n elapsedMs: number\n nodeName: string\n killRequested: boolean\n messageText?: string | null\n errorText?: string | null\n createTime?: string\n}\n\n/** cron 预览结果(后端 CronPreviewOutput)。 */\nexport interface CronPreviewOutput {\n normalized: string\n occurrences: string[]\n /** 秒段等效每秒执行的告警(仅提示,不拦截)。 */\n everySecondWarning: boolean\n}\n\n/** 处理器清单(后端 JobHandlersOutput)。 */\nexport interface JobHandlersOutput {\n /** 已注册的编译类处理器名(IAdminJob.Name)。 */\n handlers: string[]\n /** SQL 载荷总闸(SmartAdmin:Jobs:Sql:Enabled);false 时前端禁选 SQL 并提示。 */\n sqlEnabled: boolean\n}\n\n/** 成败趋势的一天。 */\nexport interface JobTrendPoint {\n date: string\n success: number\n failed: number\n}\n\n/** 即将执行的一项。 */\nexport interface JobUpcomingItem {\n jobId: number\n name: string\n nextRunTime: string\n}\n\n/** 集群节点一行(角色由与锁行比对得出)。 */\nexport interface JobNodeItem {\n nodeName: string\n hostName: string\n isLeader: boolean\n lastHeartbeat: string\n workerId: number\n pid: number\n}\n\n/** 任务监控仪表盘(后端 JobDashboardOutput)。 */\nexport interface JobDashboard {\n todaySuccess: number\n todayFailed: number\n running: number\n totalJobs: number\n /** 按状态的任务数(键 = Ready/Paused/Completed/Panic)。 */\n statusCounts: Record<string, number>\n trend: JobTrendPoint[]\n upcoming: JobUpcomingItem[]\n nodes: JobNodeItem[]\n}\n\n// ── AI 管理(与后端 AiProviderModels/AiUsageModels 对齐;错误码文案在 error.ai.*,别重复) ──\n\n/** 厂商下的一个模型(后端 AiModelView)。 */\nexport interface AiModelView {\n id: number\n name: string\n displayName: string\n enabled: boolean\n isDefault: boolean\n contextWindow: number | null\n inputPrice: number | null\n outputPrice: number | null\n}\n\n/** 厂商行(后端 AiProviderView;列表/详情共用,apiKey 只回 hasApiKey + 掩码提示,不回明文)。 */\nexport interface AiProviderView {\n id: number\n code: string\n name: string\n preset: string\n protocol: string\n baseUrl: string\n authScheme: string\n apiKeyHint: string | null\n hasApiKey: boolean\n enabled: boolean\n sort: number\n remark: string | null\n models: AiModelView[]\n}\n\n/**\n * 模型新增/编辑入参(后端 AiModelInput;id 为 `null` = 新增该行)。\n * 后端定义为位置式 record——字段在请求体里必须都存在(可以是 null),不能整键省略,\n * 这里特意都不带 `?`,免得页面代码漏填导致类型能过编译、实际发请求时字段缺失。\n */\nexport interface AiModelInput {\n id: number | null\n name: string\n displayName: string\n enabled: boolean\n isDefault: boolean\n contextWindow: number | null\n inputPrice: number | null\n outputPrice: number | null\n}\n\n/** 厂商新增入参(后端 AiProviderAddInput;code 仅新增时填,apiKey 传 null 由后端拒绝/提示未配置)。 */\nexport interface AiProviderAddInput {\n code: string\n name: string\n preset: string\n baseUrl: string\n authScheme: string\n apiKey: string | null\n sort: number\n remark: string | null\n models: AiModelInput[]\n}\n\n/** 厂商编辑入参(后端 AiProviderUpdateInput;无 code——编辑禁用;apiKey 传 null = 不修改现有 Key)。 */\nexport interface AiProviderUpdateInput {\n code: string\n name: string\n baseUrl: string\n authScheme: string\n apiKey: string | null\n sort: number\n remark: string | null\n models: AiModelInput[]\n}\n\n/** 厂商预置(GET /api/v1/sys/ai/provider/presets,静态表,表单下拉用)。 */\nexport interface AiModelPreset {\n name: string\n displayName: string\n contextWindow?: number | null\n}\n\n/** 厂商预置(后端 AiProviderPresets.cs 落定的 11 个 code)。 */\nexport interface AiProviderPreset {\n code: string\n name: string\n protocol: string\n baseUrl: string\n authScheme: string\n models: AiModelPreset[]\n}\n\n/**\n * 后端 AiUsageSource 是普通枚举,没配 JsonStringEnumConverter,序列化按数字下发(System.Text.Json 默认行为)。\n * 1=Reported(上游上报的真实用量),2=Missing(上游没给,记 0 或估算兜底)。\n */\nexport const AI_USAGE_SOURCE = { Reported: 1, Missing: 2 } as const\nexport type AiUsageSourceValue = 1 | 2\n\n/** 一次调用的 Token 用量(后端 AiUsage;source 标记数值是上游上报还是估算兜底)。 */\nexport interface AiUsage {\n inputTokens: number\n outputTokens: number\n totalTokens: number\n source: AiUsageSourceValue\n}\n\n/** 测试连接结果(后端 AiTestResult)。 */\nexport interface AiTestResult {\n ok: boolean\n model?: string | null\n latencyMs: number\n usage?: AiUsage | null\n error?: string | null\n}\n\n/**\n * 用量统计分组维度(后端 AiUsageGroupBy,普通枚举,查询参按数字下发/上送)。\n * 1=Provider、2=Model、3=Scene、4=User。\n */\nexport const AI_USAGE_GROUP_BY = { Provider: 1, Model: 2, Scene: 3, User: 4 } as const\nexport type AiUsageGroupBy = 1 | 2 | 3 | 4\n\n/** 用量统计四格指标(后端 AiUsageTotals;failuresByErrorCode 键为 ErrorCode 数值)。 */\nexport interface AiUsageTotals {\n totalTokens: number\n inputTokens: number\n outputTokens: number\n callCount: number\n failureCount: number\n failuresByErrorCode: Record<number, number>\n}\n\n/** 分组维度下的一行(后端 AiUsageGroupRow)。 */\nexport interface AiUsageGroupRow {\n key: string\n label?: string | null\n inputTokens: number\n outputTokens: number\n callCount: number\n sharePercent: number\n avgLatencyMs: number\n}\n\n/** 用量统计汇总(后端 AiUsageSummary)。 */\nexport interface AiUsageSummary {\n totals: AiUsageTotals\n groups: AiUsageGroupRow[]\n}\n\n/** 用量趋势的一天(后端 AiUsageTrendPoint)。 */\nexport interface AiUsageTrendPoint {\n date: string\n inputTokens: number\n outputTokens: number\n callCount: number\n}\n\n/** 用量明细行(后端 SysAiUsageLog;只读,分页项已含全字段)。 */\nexport interface SysAiUsageLog {\n id: number\n providerId: number\n providerCode: string\n model: string\n scene: string\n userId?: number | null\n inputTokens: number\n outputTokens: number\n totalTokens: number\n usageSource: AiUsageSourceValue\n latencyMs: number\n success: boolean\n errorCode?: number | null\n errorMessage?: string | null\n streamed: boolean\n requestId?: string | null\n createTime: string\n}\n"],"names":["DataScopeType","NoticeType","ReceiverType","DuplicateStrategy","JobHandlerKind","JobTriggerKind","JobMisfireStrategy","JobConcurrencyMode","JobStatus","JobRunStatus","JobFireMode","AI_USAGE_SOURCE","AI_USAGE_GROUP_BY"],"mappings":"AAqYO,IAAKA,sBAAAA,OACVA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,iBAAiB,CAAA,IAAjB,kBACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UALUA,IAAAA,KAAA,CAAA,CAAA,GAsFAC,sBAAAA,OACVA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,eAAe,CAAA,IAAf,gBACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,MAAM,CAAA,IAAN,OACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QAHUA,IAAAA,KAAA,CAAA,CAAA,GAqGAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SAHUA,IAAAA,KAAA,CAAA,CAAA,GAmBAC,sBAAAA,OACVA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,MAAM,CAAA,IAAN,OAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WAHUA,IAAAA,KAAA,CAAA,CAAA,GAOAC,sBAAAA,OACVA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,cAAc,CAAA,IAAd,eAFUA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAAA,EAAA,aAAa,CAAA,IAAb,cACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YAFUA,IAAAA,KAAA,CAAA,CAAA,GAMAC,sBAAAA,OACVA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,QAAQ,CAAA,IAAR,SAJUA,IAAAA,KAAA,CAAA,CAAA,GAQAC,sBAAAA,OACVA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WANUA,IAAAA,KAAA,CAAA,CAAA,GAUAC,sBAAAA,OACVA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,UAAU,CAAA,IAAV,WACAA,EAAAA,EAAA,gBAAgB,CAAA,IAAhB,iBAJUA,IAAAA,KAAA,CAAA,CAAA;AA0OL,MAAMC,IAAkB,EAAE,UAAU,GAAG,SAAS,EAAA,GAwB1CC,IAAoB,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,EAAA;"}
@@ -0,0 +1,13 @@
1
+ import { AiProviderView } from '../../../../types/api';
2
+ type __VLS_Props = {
3
+ provider: AiProviderView;
4
+ };
5
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
6
+ edit: () => any;
7
+ deleted: () => any;
8
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
9
+ onEdit?: (() => any) | undefined;
10
+ onDeleted?: (() => any) | undefined;
11
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
12
+ declare const _default: typeof __VLS_export;
13
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import o from "./ProviderCard2.vue.js";
2
+ /* empty css */
3
+ import r from "../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const e = /* @__PURE__ */ r(o, [["__scopeId", "data-v-659dbae9"]]);
5
+ export {
6
+ e as default
7
+ };
8
+ //# sourceMappingURL=ProviderCard.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderCard.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
@@ -0,0 +1,230 @@
1
+ import { defineComponent as H, computed as h, ref as w, resolveDirective as R, openBlock as l, createBlock as m, unref as e, normalizeClass as P, withCtx as d, createElementVNode as s, normalizeStyle as F, createVNode as u, toDisplayString as t, createTextVNode as n, createElementBlock as p, createCommentVNode as g, Fragment as I, withDirectives as C } from "vue";
2
+ import { useMessage as L, NCard as O, NTag as A, NSpace as Y, NPopover as j, NButton as z } from "naive-ui";
3
+ import { useI18n as G } from "vue-i18n";
4
+ import _ from "../../../../components/AppIcon.vue.js";
5
+ import J from "../../../../components/StatusSwitch/index.vue.js";
6
+ import { useConfirm as Q } from "../../../../composables/useConfirm.js";
7
+ import { useAuthStore as W } from "../../../../stores/auth.js";
8
+ import { aiProviderApi as T } from "../../../../api/index.js";
9
+ import { translateError as X } from "../../../../utils/error.js";
10
+ import { resolvePresetMeta as Z } from "../presets.js";
11
+ const ee = { class: "card-head" }, te = { class: "head-meta" }, oe = { class: "name-row" }, se = { class: "name" }, ae = { class: "code" }, ie = {
12
+ key: 0,
13
+ class: "pending-tip"
14
+ }, le = { class: "card-body" }, de = { class: "row" }, re = { class: "label" }, ne = ["title"], ce = { class: "row" }, ue = { class: "label" }, ve = { class: "value" }, me = {
15
+ key: 0,
16
+ class: "mask"
17
+ }, pe = { class: "row" }, fe = { class: "label" }, he = { class: "value" }, ye = { class: "card-actions" }, ge = { class: "switch-group" }, _e = { class: "switch-text" }, ke = {
18
+ key: 0,
19
+ class: "test-result"
20
+ }, be = { class: "test-row" }, Me = { class: "test-row" }, we = {
21
+ key: 0,
22
+ class: "test-row"
23
+ }, Ce = {
24
+ key: 1,
25
+ class: "test-row test-error"
26
+ }, xe = /* @__PURE__ */ H({
27
+ __name: "ProviderCard",
28
+ props: {
29
+ provider: {}
30
+ },
31
+ emits: ["edit", "deleted"],
32
+ setup(a, { emit: D }) {
33
+ const r = a, N = D, { t: o } = G(), E = L(), { confirm: U } = Q(), x = W(), S = h(() => Z(r.provider.preset)), k = h(
34
+ () => !r.provider.hasApiKey && r.provider.authScheme !== "none"
35
+ ), q = h(() => k.value ? "pending" : r.provider.enabled ? "enabled" : "disabled"), K = h(() => r.provider.models.find((f) => f.isDefault) ?? null), $ = h(() => x.hasPerm("PUT:/api/v1/sys/ai/provider/{id}"));
36
+ async function B() {
37
+ await U({
38
+ type: "warning",
39
+ content: o("aiModel.deleteConfirm", { name: r.provider.name }),
40
+ action: () => T.remove(r.provider.id),
41
+ successMsg: o("aiModel.deleted")
42
+ }) && N("deleted");
43
+ }
44
+ const y = w(!1), b = w(!1), i = w(null);
45
+ async function V() {
46
+ y.value = !0;
47
+ try {
48
+ i.value = await T.test(r.provider.id), b.value = !0;
49
+ } catch (f) {
50
+ E.error(X(f));
51
+ } finally {
52
+ y.value = !1;
53
+ }
54
+ }
55
+ return (f, v) => {
56
+ const M = R("auth");
57
+ return l(), m(e(O), {
58
+ size: "small",
59
+ bordered: !0,
60
+ class: P(["provider-card", `provider-card--${q.value}`])
61
+ }, {
62
+ default: d(() => [
63
+ s("div", ee, [
64
+ s("span", {
65
+ class: "badge",
66
+ style: F({ color: S.value.color })
67
+ }, [
68
+ u(_, {
69
+ icon: S.value.icon,
70
+ size: 22
71
+ }, null, 8, ["icon"])
72
+ ], 4),
73
+ s("div", te, [
74
+ s("div", oe, [
75
+ s("span", se, t(a.provider.name), 1),
76
+ u(e(A), {
77
+ size: "small",
78
+ bordered: !1
79
+ }, {
80
+ default: d(() => [
81
+ n(t(a.provider.protocol), 1)
82
+ ]),
83
+ _: 1
84
+ })
85
+ ]),
86
+ s("code", ae, t(a.provider.code), 1)
87
+ ])
88
+ ]),
89
+ k.value ? (l(), p("div", ie, [
90
+ u(_, {
91
+ icon: "ph:warning-circle-duotone",
92
+ size: 14
93
+ }),
94
+ n(" " + t(e(o)("aiModel.pendingConfigTip")), 1)
95
+ ])) : g("", !0),
96
+ s("div", le, [
97
+ s("div", de, [
98
+ s("span", re, t(e(o)("aiModel.provider.baseUrl")), 1),
99
+ s("span", {
100
+ class: "value ellipsis",
101
+ title: a.provider.baseUrl
102
+ }, t(a.provider.baseUrl), 9, ne)
103
+ ]),
104
+ s("div", ce, [
105
+ s("span", ue, t(e(o)("aiModel.provider.apiKey")), 1),
106
+ s("span", ve, [
107
+ n(t(a.provider.hasApiKey ? e(o)("aiModel.provider.hasApiKeyYes") : e(o)("aiModel.provider.hasApiKeyNo")) + " ", 1),
108
+ a.provider.hasApiKey && a.provider.apiKeyHint ? (l(), p("span", me, " **** " + t(a.provider.apiKeyHint), 1)) : g("", !0)
109
+ ])
110
+ ]),
111
+ s("div", pe, [
112
+ s("span", fe, t(e(o)("aiModel.model.title")), 1),
113
+ s("span", he, t(a.provider.models.length) + " · " + t(K.value ? K.value.displayName : e(o)("aiModel.model.noDefault")), 1)
114
+ ])
115
+ ]),
116
+ s("div", ye, [
117
+ s("div", ge, [
118
+ $.value ? (l(), m(J, {
119
+ key: 0,
120
+ value: a.provider.enabled,
121
+ disabled: k.value,
122
+ confirm: (c) => c ? null : e(o)("aiModel.provider.disableConfirm", { name: a.provider.name }),
123
+ request: (c) => e(T).setEnabled(a.provider.id, c),
124
+ "onUpdate:value": v[0] || (v[0] = (c) => a.provider.enabled = c)
125
+ }, null, 8, ["value", "disabled", "confirm", "request"])) : (l(), m(e(A), {
126
+ key: 1,
127
+ size: "small",
128
+ bordered: !1,
129
+ type: a.provider.enabled ? "success" : "default"
130
+ }, {
131
+ default: d(() => [
132
+ n(t(a.provider.enabled ? e(o)("common.enabled") : e(o)("common.disabled")), 1)
133
+ ]),
134
+ _: 1
135
+ }, 8, ["type"])),
136
+ s("span", _e, t(a.provider.enabled ? e(o)("aiModel.enabled") : e(o)("aiModel.disabled")), 1)
137
+ ]),
138
+ u(e(Y), {
139
+ size: 4,
140
+ "wrap-item": !1
141
+ }, {
142
+ default: d(() => [
143
+ u(e(j), {
144
+ trigger: "manual",
145
+ show: b.value,
146
+ placement: "top",
147
+ width: 260,
148
+ onClickoutside: v[1] || (v[1] = (c) => b.value = !1)
149
+ }, {
150
+ trigger: d(() => [
151
+ C((l(), m(e(z), {
152
+ size: "small",
153
+ quaternary: "",
154
+ loading: y.value,
155
+ onClick: V
156
+ }, {
157
+ icon: d(() => [
158
+ u(_, {
159
+ icon: "ph:lightning",
160
+ size: 14
161
+ })
162
+ ]),
163
+ default: d(() => [
164
+ n(" " + t(y.value ? e(o)("aiModel.test.testing") : e(o)("aiModel.test.action")), 1)
165
+ ]),
166
+ _: 1
167
+ }, 8, ["loading"])), [
168
+ [M, "POST:/api/v1/sys/ai/provider/{id}/test"]
169
+ ])
170
+ ]),
171
+ default: d(() => [
172
+ i.value ? (l(), p("div", ke, [
173
+ s("div", {
174
+ class: P(["test-head", i.value.ok ? "ok" : "fail"])
175
+ }, [
176
+ u(_, {
177
+ icon: i.value.ok ? "ph:check-circle-duotone" : "ph:x-circle-duotone",
178
+ size: 16
179
+ }, null, 8, ["icon"]),
180
+ n(" " + t(i.value.ok ? e(o)("aiModel.test.ok") : e(o)("aiModel.test.failed")), 1)
181
+ ], 2),
182
+ i.value.ok ? (l(), p(I, { key: 0 }, [
183
+ s("div", be, t(e(o)("aiModel.test.model")) + ":" + t(i.value.model), 1),
184
+ s("div", Me, t(e(o)("aiModel.test.latency", { ms: i.value.latencyMs })), 1),
185
+ i.value.usage ? (l(), p("div", we, t(e(o)("aiModel.test.usage")) + ": " + t(e(o)("aiModel.test.inputTokens")) + " " + t(i.value.usage.inputTokens) + " / " + t(e(o)("aiModel.test.outputTokens")) + " " + t(i.value.usage.outputTokens), 1)) : g("", !0)
186
+ ], 64)) : (l(), p("div", Ce, t(e(o)("aiModel.test.error")) + ":" + t(i.value.error), 1))
187
+ ])) : g("", !0)
188
+ ]),
189
+ _: 1
190
+ }, 8, ["show"]),
191
+ C((l(), m(e(z), {
192
+ size: "small",
193
+ quaternary: "",
194
+ type: "primary",
195
+ onClick: v[2] || (v[2] = (c) => N("edit"))
196
+ }, {
197
+ default: d(() => [
198
+ n(t(e(o)("common.edit")), 1)
199
+ ]),
200
+ _: 1
201
+ })), [
202
+ [M, "PUT:/api/v1/sys/ai/provider/{id}"]
203
+ ]),
204
+ C((l(), m(e(z), {
205
+ size: "small",
206
+ quaternary: "",
207
+ type: "error",
208
+ onClick: B
209
+ }, {
210
+ default: d(() => [
211
+ n(t(e(o)("common.delete")), 1)
212
+ ]),
213
+ _: 1
214
+ })), [
215
+ [M, "DELETE:/api/v1/sys/ai/provider/{id}"]
216
+ ])
217
+ ]),
218
+ _: 1
219
+ })
220
+ ])
221
+ ]),
222
+ _: 1
223
+ }, 8, ["class"]);
224
+ };
225
+ }
226
+ });
227
+ export {
228
+ xe as default
229
+ };
230
+ //# sourceMappingURL=ProviderCard2.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderCard2.vue.js","sources":["../../../../../src/views/system/ai-model/components/ProviderCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 单个厂商卡片:三态视觉(启用/停用/待配置 Key)+ 启停开关 + 编辑入口 + 删除 + 测试连接。\n// 待配置态判据:authScheme != 'none' 却没配 Key —— 没 Key 不可能真正启用成功(后端 SetEnabledAsync\n// 会拒 49004),即便库里 enabled=true 也按「待配置」显示,三态互斥、待配置优先。\nimport { computed, ref } from 'vue'\nimport { NButton, NCard, NPopover, NSpace, NTag, useMessage } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { aiProviderApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport type { AiProviderView, AiTestResult } from '#/types/api'\nimport { resolvePresetMeta } from '../presets'\n\nconst props = defineProps<{ provider: AiProviderView }>()\nconst emit = defineEmits<{ (e: 'edit'): void; (e: 'deleted'): void }>()\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { confirm } = useConfirm()\nconst authStore = useAuthStore()\n\nconst meta = computed(() => resolvePresetMeta(props.provider.preset))\n/** 没配 Key 就不可能真正启用成功,即便库里 enabled=true 也按「待配置」显示,优先于启用/停用视觉。 */\nconst pendingConfig = computed(\n () => !props.provider.hasApiKey && props.provider.authScheme !== 'none',\n)\nconst cardState = computed(() => {\n if (pendingConfig.value) return 'pending'\n return props.provider.enabled ? 'enabled' : 'disabled'\n})\nconst defaultModel = computed(() => props.provider.models.find(m => m.isDefault) ?? null)\n\nconst canUpdate = computed(() => authStore.hasPerm('PUT:/api/v1/sys/ai/provider/{id}'))\n\nasync function onDelete() {\n const ok = await confirm({\n type: 'warning',\n content: t('aiModel.deleteConfirm', { name: props.provider.name }),\n action: () => aiProviderApi.remove(props.provider.id),\n successMsg: t('aiModel.deleted'),\n })\n if (ok) emit('deleted')\n}\n\n// ── 测试连接:结果在返回体里(ok=false 不代表接口失败),不走 translateError,\n// 只有网络层/其它异常才兜底 message.error。结果用 manual 触发的 popover 展示。 ──\nconst testing = ref(false)\nconst testResultShow = ref(false)\nconst testResult = ref<AiTestResult | null>(null)\nasync function onTest() {\n testing.value = true\n try {\n testResult.value = await aiProviderApi.test(props.provider.id)\n testResultShow.value = true\n } catch (e) {\n message.error(translateError(e))\n } finally {\n testing.value = false\n }\n}\n</script>\n\n<template>\n <n-card\n size=\"small\"\n :bordered=\"true\"\n class=\"provider-card\"\n :class=\"`provider-card--${cardState}`\"\n >\n <div class=\"card-head\">\n <span class=\"badge\" :style=\"{ color: meta.color }\">\n <AppIcon :icon=\"meta.icon\" :size=\"22\" />\n </span>\n <div class=\"head-meta\">\n <div class=\"name-row\">\n <span class=\"name\">{{ provider.name }}</span>\n <n-tag size=\"small\" :bordered=\"false\">{{ provider.protocol }}</n-tag>\n </div>\n <code class=\"code\">{{ provider.code }}</code>\n </div>\n </div>\n\n <div v-if=\"pendingConfig\" class=\"pending-tip\">\n <AppIcon icon=\"ph:warning-circle-duotone\" :size=\"14\" />\n {{ t('aiModel.pendingConfigTip') }}\n </div>\n\n <div class=\"card-body\">\n <div class=\"row\">\n <span class=\"label\">{{ t('aiModel.provider.baseUrl') }}</span>\n <span class=\"value ellipsis\" :title=\"provider.baseUrl\">{{ provider.baseUrl }}</span>\n </div>\n <div class=\"row\">\n <span class=\"label\">{{ t('aiModel.provider.apiKey') }}</span>\n <span class=\"value\">\n {{\n provider.hasApiKey\n ? t('aiModel.provider.hasApiKeyYes')\n : t('aiModel.provider.hasApiKeyNo')\n }}\n <span v-if=\"provider.hasApiKey && provider.apiKeyHint\" class=\"mask\">\n **** {{ provider.apiKeyHint }}\n </span>\n </span>\n </div>\n <div class=\"row\">\n <span class=\"label\">{{ t('aiModel.model.title') }}</span>\n <span class=\"value\">\n {{ provider.models.length }} ·\n {{ defaultModel ? defaultModel.displayName : t('aiModel.model.noDefault') }}\n </span>\n </div>\n </div>\n\n <div class=\"card-actions\">\n <div class=\"switch-group\">\n <StatusSwitch\n v-if=\"canUpdate\"\n :value=\"provider.enabled\"\n :disabled=\"pendingConfig\"\n :confirm=\"\n (next: boolean) =>\n next ? null : t('aiModel.provider.disableConfirm', { name: provider.name })\n \"\n :request=\"(next: boolean) => aiProviderApi.setEnabled(provider.id, next)\"\n @update:value=\"(v: boolean) => (provider.enabled = v)\"\n />\n <n-tag\n v-else\n size=\"small\"\n :bordered=\"false\"\n :type=\"provider.enabled ? 'success' : 'default'\"\n >\n {{ provider.enabled ? t('common.enabled') : t('common.disabled') }}\n </n-tag>\n <span class=\"switch-text\">\n {{ provider.enabled ? t('aiModel.enabled') : t('aiModel.disabled') }}\n </span>\n </div>\n\n <n-space :size=\"4\" :wrap-item=\"false\">\n <n-popover\n trigger=\"manual\"\n :show=\"testResultShow\"\n placement=\"top\"\n :width=\"260\"\n @clickoutside=\"testResultShow = false\"\n >\n <template #trigger>\n <n-button\n v-auth=\"'POST:/api/v1/sys/ai/provider/{id}/test'\"\n size=\"small\"\n quaternary\n :loading=\"testing\"\n @click=\"onTest\"\n >\n <template #icon><AppIcon icon=\"ph:lightning\" :size=\"14\" /></template>\n {{ testing ? t('aiModel.test.testing') : t('aiModel.test.action') }}\n </n-button>\n </template>\n <div v-if=\"testResult\" class=\"test-result\">\n <div class=\"test-head\" :class=\"testResult.ok ? 'ok' : 'fail'\">\n <AppIcon\n :icon=\"testResult.ok ? 'ph:check-circle-duotone' : 'ph:x-circle-duotone'\"\n :size=\"16\"\n />\n {{ testResult.ok ? t('aiModel.test.ok') : t('aiModel.test.failed') }}\n </div>\n <template v-if=\"testResult.ok\">\n <div class=\"test-row\">{{ t('aiModel.test.model') }}:{{ testResult.model }}</div>\n <div class=\"test-row\">\n {{ t('aiModel.test.latency', { ms: testResult.latencyMs }) }}\n </div>\n <div v-if=\"testResult.usage\" class=\"test-row\">\n {{ t('aiModel.test.usage') }}: {{ t('aiModel.test.inputTokens') }}\n {{ testResult.usage.inputTokens }} / {{ t('aiModel.test.outputTokens') }}\n {{ testResult.usage.outputTokens }}\n </div>\n </template>\n <div v-else class=\"test-row test-error\">\n {{ t('aiModel.test.error') }}:{{ testResult.error }}\n </div>\n </div>\n </n-popover>\n\n <n-button\n v-auth=\"'PUT:/api/v1/sys/ai/provider/{id}'\"\n size=\"small\"\n quaternary\n type=\"primary\"\n @click=\"emit('edit')\"\n >\n {{ t('common.edit') }}\n </n-button>\n <n-button\n v-auth=\"'DELETE:/api/v1/sys/ai/provider/{id}'\"\n size=\"small\"\n quaternary\n type=\"error\"\n @click=\"onDelete\"\n >\n {{ t('common.delete') }}\n </n-button>\n </n-space>\n </div>\n </n-card>\n</template>\n\n<style scoped>\n.provider-card {\n border-radius: var(--radius-lg);\n transition:\n border-color 0.15s,\n background-color 0.15s,\n opacity 0.15s;\n}\n.provider-card :deep(.n-card-content) {\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n/* 状态着色必须压过 naive 的 .n-card.n-card--bordered(同权重,加载顺序不确定),\n 故修饰类与 .provider-card 复合写,靠权重取胜。 */\n.provider-card.provider-card--enabled {\n border-color: color-mix(in srgb, var(--color-primary) 45%, var(--color-border));\n background: color-mix(in srgb, var(--color-primary) 4%, var(--color-bg-container));\n}\n.provider-card.provider-card--disabled {\n opacity: 0.72;\n}\n.provider-card.provider-card--pending {\n border-style: dashed;\n border-color: color-mix(in srgb, var(--color-warning) 55%, var(--color-border));\n}\n.card-head {\n display: flex;\n align-items: flex-start;\n gap: 10px;\n min-width: 0;\n}\n.badge {\n flex-shrink: 0;\n width: 42px;\n height: 42px;\n border-radius: var(--radius-md);\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, currentColor 14%, transparent);\n}\n.head-meta {\n min-width: 0;\n flex: 1;\n}\n.name-row {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-wrap: wrap;\n}\n.name {\n font-size: 15px;\n font-weight: 600;\n color: var(--color-text-primary);\n line-height: 1.3;\n}\n.code {\n display: inline-block;\n margin-top: 4px;\n font-size: 12px;\n color: var(--color-text-tertiary);\n background: var(--color-fill);\n padding: 1px 6px;\n border-radius: 4px;\n}\n.pending-tip {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px;\n border-radius: var(--radius-sm);\n background: var(--color-warning-bg);\n color: var(--color-warning);\n font-size: 12px;\n}\n.card-body {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.row {\n display: flex;\n align-items: baseline;\n gap: 8px;\n font-size: 12px;\n min-width: 0;\n}\n.label {\n flex-shrink: 0;\n color: var(--color-text-tertiary);\n width: 66px;\n}\n.value {\n min-width: 0;\n color: var(--color-text-secondary);\n}\n.value.ellipsis {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n}\n.mask {\n margin-left: 4px;\n color: var(--color-text-tertiary);\n}\n.card-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-wrap: wrap;\n gap: 8px;\n padding-top: 8px;\n border-top: 1px dashed var(--color-border);\n}\n.switch-group {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.switch-text {\n font-size: 12px;\n color: var(--color-text-tertiary);\n}\n.test-result {\n display: flex;\n flex-direction: column;\n gap: 4px;\n font-size: 12px;\n}\n.test-head {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n margin-bottom: 2px;\n}\n.test-head.ok {\n color: var(--color-success);\n}\n.test-head.fail {\n color: var(--color-danger);\n}\n.test-row {\n color: var(--color-text-secondary);\n}\n.test-error {\n color: var(--color-danger);\n}\n</style>\n"],"names":["props","__props","emit","__emit","t","useI18n","message","useMessage","confirm","useConfirm","authStore","useAuthStore","meta","computed","resolvePresetMeta","pendingConfig","cardState","defaultModel","m","canUpdate","onDelete","aiProviderApi","testing","ref","testResultShow","testResult","onTest","e","translateError","_createBlock","_unref","NCard","_normalizeClass","_createElementVNode","_hoisted_1","_normalizeStyle","_createVNode","AppIcon","_hoisted_2","_hoisted_3","_hoisted_4","_toDisplayString","NTag","_createTextVNode","_hoisted_5","_openBlock","_createElementBlock","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","StatusSwitch","next","v","_hoisted_20","NSpace","NPopover","NButton","_hoisted_21","_Fragment","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { AiProviderView } from '../../../../types/api';
2
+ type __VLS_Props = {
3
+ editing: AiProviderView | null;
4
+ };
5
+ type __VLS_ModelProps = {
6
+ 'show'?: boolean;
7
+ };
8
+ type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
9
+ declare const __VLS_export: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
10
+ "update:show": (value: boolean) => any;
11
+ } & {
12
+ saved: () => any;
13
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
14
+ onSaved?: (() => any) | undefined;
15
+ "onUpdate:show"?: ((value: boolean) => any) | undefined;
16
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
17
+ declare const _default: typeof __VLS_export;
18
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import o from "./ProviderForm2.vue.js";
2
+ /* empty css */
3
+ import r from "../../../../_virtual/_plugin-vue_export-helper.js";
4
+ const e = /* @__PURE__ */ r(o, [["__scopeId", "data-v-adc0e948"]]);
5
+ export {
6
+ e as default
7
+ };
8
+ //# sourceMappingURL=ProviderForm.vue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProviderForm.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}