新增多证书模板管理流程

This commit is contained in:
Certificate System
2026-08-13 18:06:05 +08:00
parent eac19ea593
commit abbefc4b48
27 changed files with 774 additions and 61 deletions

View File

@@ -19,6 +19,11 @@
<el-form-item label="默认发证单位">
<el-input v-model.trim="form.default_issuer_name" maxlength="128" />
</el-form-item>
<el-form-item label="默认证书模板">
<el-select v-model="form.default_template_code">
<el-option v-for="item in templates" :key="item.code" :label="item.name" :value="item.code" />
</el-select>
</el-form-item>
<el-form-item label="默认课程名称">
<el-input v-model.trim="form.default_course_name" maxlength="128" />
</el-form-item>
@@ -47,6 +52,9 @@
<el-table-column prop="default_course_name" label="课程名称" min-width="140" />
<el-table-column prop="default_stage_name" label="阶段名称" min-width="120" />
<el-table-column prop="default_issuer_name" label="发证单位" min-width="140" />
<el-table-column label="默认模板" min-width="150">
<template #default="{ row }">{{ templateName(row.default_template_code) }}</template>
</el-table-column>
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag :type="row.status === 'active' ? 'success' : 'info'">
@@ -71,17 +79,19 @@
import { ElMessage } from "element-plus";
import { computed, onMounted, reactive, ref } from "vue";
import { http, type ProjectCourse } from "../api";
import { http, type CertificateTemplate, type ProjectCourse } from "../api";
const allProjects = ref<ProjectCourse[]>([]);
const keyword = ref("");
const editingId = ref<number | null>(null);
const templates = ref<CertificateTemplate[]>([]);
const form = reactive({
code: "",
name: "",
default_course_name: "",
default_stage_name: "",
default_issuer_name: "本公司",
default_template_code: "classic",
status: "active",
});
@@ -110,6 +120,15 @@ async function loadProjects() {
allProjects.value = data;
}
async function loadTemplates() {
const { data } = await http.get<CertificateTemplate[]>("/admin/certificate-templates");
templates.value = data;
}
function templateName(code: string) {
return templates.value.find((item) => item.code === code)?.name || code;
}
function editProject(row: ProjectCourse) {
editingId.value = row.id;
Object.assign(form, {
@@ -118,6 +137,7 @@ function editProject(row: ProjectCourse) {
default_course_name: row.default_course_name || "",
default_stage_name: row.default_stage_name || "",
default_issuer_name: row.default_issuer_name,
default_template_code: row.default_template_code,
status: row.status,
});
}
@@ -130,6 +150,7 @@ function resetForm() {
default_course_name: "",
default_stage_name: "",
default_issuer_name: "本公司",
default_template_code: "classic",
status: "active",
});
}
@@ -141,6 +162,7 @@ function projectPayload() {
default_course_name: form.default_course_name || null,
default_stage_name: form.default_stage_name || null,
default_issuer_name: form.default_issuer_name,
default_template_code: form.default_template_code,
status: form.status,
};
}
@@ -165,7 +187,7 @@ async function toggleStatus(row: ProjectCourse) {
await loadProjects();
}
onMounted(loadProjects);
onMounted(() => Promise.all([loadProjects(), loadTemplates()]));
</script>
<style scoped>