Files
UserbaseFront/src/views/app/EditAppContainer.vue
T

98 lines
3.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<AppForm v-model="visible" :initForm="detailData" :categoryList="categoryList" :isEdit="true" :loading="submitting"
@submit="handleSubmit" @cancel="visible = false" @reset-secret="handleResetSecret" />
</template>
<script setup lang="ts">
import { ref } from "vue";
import AppForm from "./AppForm.vue";
import MyConfirm from '@/components/MyConfirm'
/* ---------- 对外暴露 ---------- */
const visible = ref(false);
const categoryList = ref<any[]>([]);
// 编辑模式:从 appList 中根据 id 取出详情回填(无独立详情接口)
const detailData = ref<Record<string, any>>({});
const currentId = ref<number | null>(null);
// 成功后回调
let onSuccessCallback: (() => void) | null = null;
// useForm 托管提交——currentId 是 ref,闭包内 .value 在 sendForm 时取当前值
const { form, loading: submitting, send: sendForm, onSuccess, onError } = useForm(
(dto) => Apis.AppSettings.editApp({ pathParams: { id: currentId.value }, data: dto }),
{ initialForm: { id: null, name: '', categoryId: undefined, desc: '', clients: [], pcUrl: '', pcIcon: '', appUrl: '', appIcon: '', officialAccountUrl: '', dingtalkUrl: '' }, resetAfterSubmiting: true }
);
onSuccess(() => {
Message.success('编辑应用成功!');
visible.value = false;
onSuccessCallback?.();
});
onError((event) => {
Message.error(event?.error?.message || '编辑失败');
});
/* ---------- 打开编辑弹窗 ---------- */
/**
* @param id - 应用 ID
* @param row - 当前行完整数据(来自表格列表),直接用作回填数据
* @param categories - 应用类型列表
* @param onSuccess - 编辑成功后的回调
*/
function open(id: number, row: any, categories: any[], onSuccess?: () => void) {
currentId.value = id;
categoryList.value = categories || [];
// 直接用行数据回填(appList 接口返回的字段与表单一致)
detailData.value = { ...row };
onSuccessCallback = onSuccess || null;
visible.value = true;
}
/* ---------- 提交:由 useForm 接管 loading 与异常处理 ---------- */
async function handleSubmit(formData: Record<string, any>) {
if (!currentId.value) return;
form.value = {
id: currentId.value,
name: formData.name,
categoryId: formData.categoryId,
desc: formData.desc,
clients: formData.clients,
pcUrl: formData.pcUrl,
pcIcon: formData.pcIcon,
appUrl: formData.appUrl,
appIcon: formData.appIcon,
officialAccountUrl: formData.officialAccountUrl,
dingtalkUrl: formData.dingtalkUrl,
};
await sendForm();
}
/* ---------- 重置密钥(非表单提交,直接 MyConfirm + await) ---------- */
async function handleResetSecret() {
if (!currentId.value) return;
try {
await MyConfirm({
msg: '确定要重置该应用的 Secret 吗?',
info: '重置后原 Secret 将立即失效!',
async onOk() {
const newSecret = await Apis.AppSettings.resetAppSecret({
pathParams: { id: currentId.value! },
});
Message.success('密钥已重置!新 Secret: ' + (newSecret || ''));
// 更新表单中的 secret 回显值
if (newSecret) {
detailData.value = { ...detailData.value, appSecret: newSecret };
}
return true;
},
});
} catch {
// 用户取消
}
}
defineExpose({ open, visible });
</script>