Files
UserbaseFront/src/views/app/AddAppContainer.vue
T
chenxing b1dba84c49 feat(appicon): 应用图标 AppIcon 矢量选择器接入(YschAppIcons 资产库 10-04 轮)
- src/assets/appicon-icons.json:资产库图标清单
- src/components/AppIconPicker.vue:矢量图标+配色选择器(YschAppIcons mask 资产)
- AppForm.vue:平台模式 Pc 应用图标换 AppIconPicker(学校模式保留位图上传,学校覆盖线只收 pcIcon);App 位图图标移入高级折叠区(遗留通道,存量 pc_icon/app_icon 链路保留,新应用优先矢量图标键)
- AddAppContainer/EditAppContainer:配套接线
依据:根目录《AppIcon资产库落地-执行报告-20261004.md》P2 管理端图标选择器
2026-10-06 20:16:21 +08:00

70 lines
2.6 KiB
Vue

<template>
<AppForm v-model="visible" :initForm="initFormData" :categoryList="categoryList" :isEdit="false"
:loading="submitting" @submit="handleSubmit" @cancel="visible = false" />
</template>
<script setup lang="ts">
import { ref } from "vue";
import AppForm from "./AppForm.vue";
/* ---------- 对外暴露:由父组件(AppList)调用 ---------- */
const visible = ref(false);
// 应用类型列表——由父组件通过 expose 传入,或内部自行拉取
const categoryList = ref<any[]>([]);
// 新增模式:始终传空初始值
const initFormData = ref<Record<string, any>>({});
// 成功后回调
let onSuccessCallback: (() => void) | null = null;
// useForm 托管提交
const { form, loading: submitting, send: sendForm, onSuccess, onError } = useForm(
(dto) => Apis.AppSettings.addApp({ data: dto }),
{ initialForm: { name: '', categoryId: undefined, desc: '', appCode: '', appNature: 'BUSINESS', clients: [], pcUrl: '', pcIcon: '', appUrl: '', appIcon: '', iconKey: '', iconColor: '', officialAccountUrl: '', dingtalkUrl: '' }, resetAfterSubmiting: true }
);
onSuccess(() => {
Message.success('新增应用成功!');
visible.value = false;
onSuccessCallback?.();
});
onError((event) => {
// 错误提示已由全局 alova 拦截器统一弹出,这里仅记录日志避免二次弹窗
console.warn('[AddAppContainer] 新增应用失败:', event?.error?.message || '新增失败');
});
/* ---------- 打开弹窗 ---------- */
function open(categories: any[], defaultCategoryId?: number | null, onSuccess?: () => void) {
categoryList.value = categories || [];
// 若列表已筛选某应用类型,则新增弹窗自动带入该类型;选「全部」时不带入
initFormData.value = defaultCategoryId != null ? { categoryId: defaultCategoryId } : {};
onSuccessCallback = onSuccess || null;
visible.value = true;
}
/* ---------- 提交:由 useForm 接管 loading 与异常处理 ---------- */
async function handleSubmit(formData: Record<string, any>) {
form.value = {
name: formData.name,
categoryId: formData.categoryId,
desc: formData.desc,
appCode: formData.appCode,
appNature: formData.appNature,
clients: formData.clients,
pcUrl: formData.pcUrl,
pcIcon: formData.pcIcon,
appUrl: formData.appUrl,
appIcon: formData.appIcon,
iconKey: formData.iconKey,
iconColor: formData.iconColor,
officialAccountUrl: formData.officialAccountUrl,
dingtalkUrl: formData.dingtalkUrl,
};
await sendForm();
}
defineExpose({ open, visible });
</script>