添加会话模型和API Key配置功能

- 在模型模块中新增会话开关状态字段,支持会话模型的管理。
- 更新模型选择器,增加系统模型的API Key配置弹窗,提升用户体验。
- 优化错误处理逻辑,确保接口错误由全局拦截器处理,减少冗余提示。
- 更新相关样式以增强界面可读性和美观性。
This commit is contained in:
2026-05-11 20:01:03 +08:00
parent 0a42e700e2
commit 29838b030f
19 changed files with 1296 additions and 274 deletions

View File

@@ -114,7 +114,7 @@ const openDialog = async (row?: DialogFormData) => {
};
}
} catch (error) {
ElMessage.error('获取主播详情失败');
// 错误已由全局拦截器处理
} finally {
state.loading = false;
}
@@ -160,7 +160,7 @@ const onSubmit = async () => {
closeDialog();
emit('refresh');
} catch (error) {
ElMessage.error('操作失败');
// 错误已由全局拦截器处理
} finally {
state.loading = false;
}

View File

@@ -166,7 +166,7 @@ const getList = async () => {
tableData.total = res.data.total || 0;
}
} catch (error) {
ElMessage.error('获取主播列表失败');
// 错误已由全局拦截器处理
} finally {
tableData.loading = false;
}
@@ -192,7 +192,7 @@ const handleDelete = async (row: TableDataItem) => {
getList();
} catch (error) {
if (error !== 'cancel') {
ElMessage.error('删除失败');
// 错误已由全局拦截器处理
}
}
};

View File

@@ -101,14 +101,13 @@ const openDialog = async (row?: { id?: string }) => {
try {
loading.value = true;
// 详情加载失败时由当前弹窗给出更易懂的业务提示。
const res = await getLiveAccountDetail({ id: String(row.id) }, { errorMode: 'page' });
const res = await getLiveAccountDetail({ id: String(row.id) });
if (res?.data) {
fillForm(res.data);
}
dialogVisible.value = true;
} catch (error) {
ElMessage.error('获取直播账号详情失败');
} catch {
// 接口错误由 request 全局提示后端 message
} finally {
loading.value = false;
}
@@ -130,19 +129,18 @@ const handleSubmit = async () => {
remark: formData.remark,
};
// 提交失败提示交给当前弹窗自己处理,避免和 request.ts 的统一报错重复。
if (isEdit.value) {
await updateLiveAccount(payload, { errorMode: 'page' });
await updateLiveAccount(payload);
ElMessage.success('修改成功');
} else {
await createLiveAccount(payload, { errorMode: 'page' });
await createLiveAccount(payload);
ElMessage.success('新增成功');
}
dialogVisible.value = false;
emit('refresh');
} catch (error) {
ElMessage.error(isEdit.value ? '修改失败' : '新增失败');
} catch {
// 接口错误由 request 全局提示后端 message
} finally {
loading.value = false;
}

View File

@@ -131,17 +131,13 @@ const tableData = reactive({
const getList = async () => {
try {
tableData.loading = true;
// 列表失败文案由当前页面决定,避免和全局请求报错同时出现。
const res = await getLiveAccountList(
{
...tableData.param,
platform: searchForm.platform || undefined,
accountName: searchForm.accountName || undefined,
accountId: searchForm.accountId || undefined,
status: searchForm.status,
},
{ errorMode: 'page' }
);
const res = await getLiveAccountList({
...tableData.param,
platform: searchForm.platform || undefined,
accountName: searchForm.accountName || undefined,
accountId: searchForm.accountId || undefined,
status: searchForm.status,
});
if (res && res.data) {
tableData.data = (res.data.list || []).map((item: any) => ({
...item,
@@ -149,8 +145,8 @@ const getList = async () => {
}));
tableData.total = res.data.total || 0;
}
} catch (error) {
ElMessage.error('获取直播账号列表失败');
} catch {
// 接口错误由 request 全局提示后端 message
} finally {
tableData.loading = false;
}
@@ -195,12 +191,12 @@ const handleDelete = async (row: LiveAccountItem) => {
cancelButtonText: '取消',
type: 'warning',
});
await deleteLiveAccount({ id: row.id }, { errorMode: 'page' });
await deleteLiveAccount({ id: row.id });
ElMessage.success('删除成功');
getList();
} catch (error) {
if (error !== 'cancel') {
ElMessage.error('删除失败');
// 接口错误由 request 全局提示后端 message
}
}
};

View File

@@ -153,8 +153,7 @@ const openDialog = async (row?: { id?: string }) => {
await loadOptions();
if (row?.id) {
// 详情请求失败时,这个弹窗希望给出更明确的页面语义提示。
const res = await getScheduleDetail({ id: String(row.id) }, { errorMode: 'page' });
const res = await getScheduleDetail({ id: String(row.id) });
const detail = res?.data;
if (detail) {
formData.id = String(detail.id);
@@ -170,8 +169,8 @@ const openDialog = async (row?: { id?: string }) => {
}
dialogVisible.value = true;
} catch (error) {
ElMessage.error(isEdit.value ? '获取排班详情失败' : '加载排班基础数据失败');
} catch {
// 接口错误由 request 全局提示后端 message表单校验错误由表单项展示
} finally {
loading.value = false;
}
@@ -196,19 +195,18 @@ const handleSubmit = async () => {
remark: formData.remark,
};
// 提交失败文案由弹窗自己控制,避免接口层和弹窗层重复报错。
if (isEdit.value) {
await updateSchedule(payload, { errorMode: 'page' });
await updateSchedule(payload);
ElMessage.success('修改排班成功');
} else {
await createSchedule(payload, { errorMode: 'page' });
await createSchedule(payload);
ElMessage.success('新增排班成功');
}
dialogVisible.value = false;
emit('refresh');
} catch (error) {
ElMessage.error(isEdit.value ? '修改排班失败' : '新增排班失败');
} catch {
// 接口错误由 request 全局提示后端 message
} finally {
loading.value = false;
}

View File

@@ -144,16 +144,12 @@ const getStatusTagType = (status: number): 'success' | 'info' | 'warning' => {
const getList = async () => {
try {
tableData.loading = true;
// 列表失败文案由当前页面决定,避免和 request.ts 的全局错误提示重复。
const res = await getScheduleList(
{
...tableData.param,
anchorName: searchForm.anchorName || undefined,
accountName: searchForm.accountName || undefined,
status: searchForm.status,
} as any,
{ errorMode: 'page' }
);
const res = await getScheduleList({
...tableData.param,
anchorName: searchForm.anchorName || undefined,
accountName: searchForm.accountName || undefined,
status: searchForm.status,
} as any);
const scheduleData = res?.data;
if (scheduleData) {
tableData.data = (scheduleData.list || []).map((item: any) => ({
@@ -166,8 +162,8 @@ const getList = async () => {
}));
tableData.total = scheduleData.total || 0;
}
} catch (error) {
ElMessage.error('获取排班列表失败');
} catch {
// 接口错误由 request 全局提示后端 message
} finally {
tableData.loading = false;
}
@@ -211,12 +207,12 @@ const handleDelete = async (row: ScheduleItem) => {
cancelButtonText: '取消',
type: 'warning',
});
await deleteSchedule({ id: row.id }, { errorMode: 'page' });
await deleteSchedule({ id: row.id });
ElMessage.success('删除成功');
getList();
} catch (error) {
if (error !== 'cancel') {
ElMessage.error('删除失败');
// 接口错误由 request 全局提示后端 message
}
}
};