优化 学生老师导入流程

This commit is contained in:
小肥羊 2025-08-24 17:20:33 +08:00
parent 26a1b003cd
commit 69ebb99616
8 changed files with 179 additions and 315 deletions

View File

@ -6,13 +6,34 @@ import { Res } from "@/utils/http/types";
* @description * @description
* @return {object} * @return {object}
*/ */
export function ImportExamInfo(id: number, file: File) { export function ImportTeacher(file: File) {
let formData = new FormData(); let formData = new FormData();
formData.append("eId", id.toString());
formData.append("file", file); formData.append("file", file);
return http.request<any>( return http.request<any>(
"post", "post",
`ExamClassInfo/Import`, `Student/ImportTeacher`,
{
data: formData
},
{
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
responseType: "blob"
}
);
}
/**
* @description
* @return {object}
*/
export function ImportStudent(file: File) {
let formData = new FormData();
formData.append("file", file);
return http.request<any>(
"post",
`Student/Import`,
{ {
data: formData data: formData
}, },
@ -36,7 +57,7 @@ export function EditStudent(data) {
} }
/** /**
* @description * @description PageList
* @return {object} * @return {object}
*/ */
export function PageList(data) { export function PageList(data) {
@ -45,7 +66,7 @@ export function PageList(data) {
}); });
} }
/** /**
* @description * @description StudentInfo
* @return {object} * @return {object}
*/ */
export function StudentInfo(uid) { export function StudentInfo(uid) {

View File

@ -9,7 +9,7 @@ import { ruleRequired } from "@/utils/rules";
const ControllerName = "classes"; const ControllerName = "classes";
defineOptions({ defineOptions({
name: ControllerName name: ControllerName,
}); });
const SchoolApi = new hTableAPI("usercenter/back/schools"); const SchoolApi = new hTableAPI("usercenter/back/schools");
@ -28,7 +28,7 @@ const tableData: TableConfig = {
PageSize: 20, PageSize: 20,
OrderBy: "CreateTime", // OrderBy: "CreateTime", //
defaultConditions: [], // defaultConditions: [], //
Conditions: [] Conditions: [],
}, },
operationColumn: true, // operationColumn: true, //
operationColumnData: [ operationColumnData: [
@ -36,7 +36,7 @@ const tableData: TableConfig = {
// //
topBtn: false, // topBtn: false, //
label: "修改", label: "修改",
btnType: "edit" // add edit del custom btnType: "edit", // add edit del custom
}, },
{ {
topBtn: true, // topBtn: true, //
@ -48,16 +48,16 @@ const tableData: TableConfig = {
title: "新增班级", // title title: "新增班级", // title
src: "class/edit", // src: "class/edit", //
width: "550px", // width: "550px", //
height: "520px" // height: "520px", //
} },
}, },
{ {
topBtn: false, // topBtn: false, //
show: true, show: true,
label: "删除", label: "删除",
btnType: "del", // add edit del btnType: "del", // add edit del
btnStyle: "danger" // topBtn: true success danger btnStyle: "danger", // topBtn: true success danger
} },
], ],
column: { column: {
// //
@ -66,7 +66,7 @@ const tableData: TableConfig = {
search: true, search: true,
add: false, // add: false, //
edit: false, // edit: false, //
width: "150px" width: "150px",
}, },
schoolId: { schoolId: {
label: "学校", label: "学校",
@ -76,7 +76,7 @@ const tableData: TableConfig = {
type: "dropdown", type: "dropdown",
add: true, // add: true, //
edit: true, // edit: true, //
setting: {} setting: {},
}, },
name: { name: {
label: "名称", label: "名称",
@ -85,43 +85,43 @@ const tableData: TableConfig = {
search: true, search: true,
searchType: ConditionalType.Like, // searchType: ConditionalType.Like, //
add: true, // add: true, //
edit: true // edit: true, //
}, },
Grade: { Grade: {
label: "年级", label: "年级",
rules: ruleRequired, rules: ruleRequired,
width: "180px", width: "180px",
type: "dropdown", type: "dropdown",
custom: row => `${row.grade ?? ""}`, custom: (row) => `${row.grade ?? ""}`,
// `${row.grade ?? ""} ${row.gradeLevel + row.graduationYear}`, // `${row.grade ?? ""} ${row.gradeLevel + row.graduationYear}`,
search: true, search: true,
setting: {}, setting: {},
add: true, // add: true, //
edit: false // edit: false, //
},
GradeLevel: {
label: "年级",
search: false,
type: "dropdown",
searchType: ConditionalType.Like,
add: true, //
edit: true, //
width: "70px",
setting: {
datasource: [
{ text: "初", value: "初" },
{ text: "高", value: "高" },
{ text: "小", value: "小" }
]
}
},
GraduationYear: {
label: "届",
search: false,
add: true, //
edit: true, //
width: "80px"
}, },
// GradeLevel: {
// label: "",
// search: false,
// type: "dropdown",
// searchType: ConditionalType.Like,
// add: true, //
// edit: true, //
// width: "70px",
// setting: {
// datasource: [
// { text: "", value: "" },
// { text: "", value: "" },
// { text: "", value: "" }
// ]
// }
// },
// GraduationYear: {
// label: "",
// search: false,
// add: true, //
// edit: true, //
// width: "80px"
// },
type: { type: {
label: "类型", label: "类型",
rules: ruleRequired, rules: ruleRequired,
@ -130,8 +130,8 @@ const tableData: TableConfig = {
search: true, search: true,
add: true, // add: true, //
edit: true, // edit: true, //
setting: {} setting: {},
} },
// createTime: { // createTime: {
// label: "", // label: "",
// width: "180px", // width: "180px",
@ -151,9 +151,9 @@ const tableData: TableConfig = {
}, },
data: [], data: [],
pageData: { pageData: {
total: 0 total: 0,
}, },
selectRows: [] selectRows: [],
}; };
const showTable = ref(false); const showTable = ref(false);
@ -172,11 +172,9 @@ onMounted(async () => {
{ text: "三年级", value: "三年级" }, { text: "三年级", value: "三年级" },
{ text: "四年级", value: "四年级" }, { text: "四年级", value: "四年级" },
{ text: "五年级", value: "五年级" }, { text: "五年级", value: "五年级" },
{ text: "六年级", value: "六年级" } { text: "六年级", value: "六年级" },
]; ];
tableData.column.type.setting.datasource = ( tableData.column.type.setting.datasource = (await getenum("ClassTypeEnum")).data;
await getenum("ClassTypeEnum")
).data;
tableData.column.schoolId.setting.datasource = ( tableData.column.schoolId.setting.datasource = (
await SchoolApi.querycombo({ TextName: "Name", ValueName: "Id" }) await SchoolApi.querycombo({ TextName: "Name", ValueName: "Id" })
).data; ).data;

View File

@ -60,7 +60,7 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row v-show="form.userType === 1"> <el-row v-show="form.userType === 1" class="pb-4.5">
<el-col :span="24"> <el-col :span="24">
<div style="display: flex; gap: 10px"> <div style="display: flex; gap: 10px">
<label for="Level" class="el-form-item__label" style="width: 120px" <label for="Level" class="el-form-item__label" style="width: 120px"
@ -117,6 +117,9 @@
</el-col> </el-col>
</el-row> </el-row>
<el-form-item label="备注:" prop="remark">
<el-input v-model="form.remark" maxlength="500" type="textarea" />
</el-form-item>
<el-row> <el-row>
<el-col :span="12"> </el-col> <el-col :span="12"> </el-col>
</el-row> </el-row>
@ -197,6 +200,7 @@ import { ComboModel } from "@/components/hTable/hTable";
interface FormData { interface FormData {
id: number; id: number;
uId?: number;
account: string; account: string;
userType: number; userType: number;
level: number; level: number;
@ -322,9 +326,10 @@ const userLevel2subject = (str: string) => {
const name = str.match(/[0-9]+/)?.[0] || ""; const name = str.match(/[0-9]+/)?.[0] || "";
return subjectLEnum.value[name]; return subjectLEnum.value[name];
}; };
const emit = defineEmits(["handlePagedCallback"]);
const handlePagedCallback = () => { const handlePagedCallback = () => {
// Emit event to parent if needed // Emit event to parent if needed
emit("handlePagedCallback");
}; };
const handleSubmitForm = () => { const handleSubmitForm = () => {
@ -332,7 +337,7 @@ const handleSubmitForm = () => {
if (valid) { if (valid) {
loading.value = true; loading.value = true;
const formData = { const formData = {
id: form.value.id || 0, id: form.value.uId || 0,
userType: form.value.userType || 1, userType: form.value.userType || 1,
level: form.value.level || 0, level: form.value.level || 0,
account: form.value.account || "", account: form.value.account || "",
@ -408,6 +413,7 @@ const fetchFormData = async () => {
let sInfo = await StudentInfo(props.id); let sInfo = await StudentInfo(props.id);
Object.assign(form.value, { Object.assign(form.value, {
id: res.data.id, id: res.data.id,
uId: res.data.id,
userType: res.data.userType, userType: res.data.userType,
level: res.data.level, level: res.data.level,
account: res.data.account, account: res.data.account,

View File

@ -112,11 +112,11 @@
<!-- 按钮组 --> <!-- 按钮组 -->
<el-button type="success" @click="importData">导入用户</el-button> <el-button type="success" @click="importData">导入用户</el-button>
<el-button type="default" @click="downLoadImportUsersTemplate" <el-button type="default" @click="downLoadImportUsersTemplate"
>下载导入用户模板</el-button >下载学生模板</el-button
> >
<el-button title="根据当前筛选条件导出" type="success" @click="exportUser" <!-- <el-button title="根据当前筛选条件导出" type="primary" @click="exportUser"
>导出用户</el-button >导出用户</el-button
> > -->
</div> </div>
<div class="toolbar-container" v-show="!selectUser"> <div class="toolbar-container" v-show="!selectUser">
<!-- 按钮组 --> <!-- 按钮组 -->
@ -184,6 +184,7 @@
<span v-else>退出</span> <span v-else>退出</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="remark" label="备注" />
</el-table> </el-table>
<el-pagination <el-pagination
style="display: flex; justify-content: center; padding-top: 10px" style="display: flex; justify-content: center; padding-top: 10px"
@ -239,7 +240,7 @@ import {
Star, Star,
} from "@element-plus/icons-vue"; } from "@element-plus/icons-vue";
import { ComboModel } from "@/components/hTable/hTable"; import { ComboModel } from "@/components/hTable/hTable";
import { PageList } from "@/api/student"; import { ImportStudent, PageList } from "@/api/student";
const classAPI = new hTableAPI("usercenter/back/classes"); const classAPI = new hTableAPI("usercenter/back/classes");
const schoolsAPI = new hTableAPI("usercenter/back/schools"); const schoolsAPI = new hTableAPI("usercenter/back/schools");
@ -714,37 +715,38 @@ const handleEditSubjectLevelCallback = () => {
}; };
const importData = () => { const importData = () => {
// const fileE = document.createElement("input"); console.log("批量导入");
// fileE.type = "file";
// const formData = new FormData(); let fileE = document.createElement("input");
// fileE.onchange = async function () { fileE.type = "file";
// formData.append("File", fileE.files![0]); var formData = new window.FormData();
// const res = await ImporExportTemplate(formData); fileE.onchange = async function () {
// if (res.type === "application/json") { formData.append("file", fileE.files[0]);
// const json = await readerBlob(res); let res = await ImportStudent(fileE.files[0]);
// if (json !== undefined && json.code !== 200) { if (res.code != undefined) {
// return ElMessage.error(json.Message); if (res.code !== 200) return ElMessage.error(res.message);
// } else { else return ElMessage.success("所有数据录入成功");
// return ElMessage.success(","); } else if (res.type === "application/json") {
// } let json = await res.text();
// } else if (res === undefined || res.size === 0) { if (json !== undefined && json.Code !== 200) {
// ElMessage.success(","); return ElMessage.error(json.Message);
// return; } else {
// } return ElMessage.success("操所有数据录入成功作成功");
// const url = res && window.URL.createObjectURL(res); }
// const link = document.createElement("a"); } else if (res === undefined || res.size === 0)
// link.href = url; return ElMessage.success("所有数据录入成功");
// link.setAttribute("download", ".xlsx"); const url = res && window.URL.createObjectURL(res);
// document.body.appendChild(link); const link = document.createElement("a");
// link.click(); link.href = url;
// document.body.removeChild(link); link.setAttribute("download", "未成功导入的考试信息数据" + ".xlsx");
// ElMessage.success(","); document.body.appendChild(link);
// }; link.click();
// try { document.body.removeChild(link);
// fileE.click(); ElMessage.success("导入失败,已导出错误数据");
// } catch (error) { };
// console.error(error); try {
// } fileE.click();
} catch (error) {}
}; };
const readerBlob = (data: Blob): Promise<any> => { const readerBlob = (data: Blob): Promise<any> => {
@ -759,7 +761,8 @@ const readerBlob = (data: Blob): Promise<any> => {
}; };
const downLoadImportUsersTemplate = () => { const downLoadImportUsersTemplate = () => {
window.open(excelImportUsersUrl, "_blank"); let impUrl = import.meta.env.VITE_API_BASEURL + "/Student/DwImportTemplate";
window.open(impUrl, "_blank");
}; };
onMounted(async () => { onMounted(async () => {

View File

@ -21,120 +21,21 @@
</el-row> </el-row>
<el-row> <el-row>
<!-- <el-col :span="12"> <el-col :span="12">
<el-form-item label="所属云校" prop="cloudSchoolId"> <el-form-item label="职务:" prop="studentId">
<el-select <el-input
v-model="form.cloudSchoolId" type="text"
filterable v-model="form.studentId"
style="width: 180px" autocomplete="off"
> maxlength="16"
<el-option :show-word-limit="true"
v-for="(item, i) in CloudSchoolArr" />
:key="i"
autocomplete="off"
:label="item.text"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
</el-col> -->
</el-row>
<el-row v-show="form.userType === 1">
<el-col :span="24">
<div style="display: flex; gap: 10px">
<label for="Level" class="el-form-item__label" style="width: 120px"
>新高考</label
>
<el-select
v-model="form.gLSubject"
filterable
placeholder="历史/地理"
style="width: 180px"
>
<el-option
v-for="(item, i) in subject1"
:key="i"
autocomplete="off"
:label="item.text"
:value="item.value"
>
</el-option>
</el-select>
<el-select
v-model="form.gSubject1"
filterable
placeholder="小学科"
style="width: 180px"
>
<el-option
v-for="(item, i) in subject2"
:key="i"
autocomplete="off"
:label="item.text"
:value="item.value"
>
</el-option>
</el-select>
<el-select
v-model="form.gSubject2"
filterable
placeholder="小学科"
style="width: 180px"
>
<el-option
v-for="(item, i) in subject2"
:key="i"
autocomplete="off"
:label="item.text"
:value="item.value"
>
</el-option>
</el-select>
</div>
</el-col>
</el-row>
<el-row v-if="form.userType === 1">
<el-col :span="24">
<el-form-item label="学生层次:" prop="level">
<el-radio-group v-model="form.subjectLevel.Level">
<el-radio v-for="(item, i) in userLevelList" :key="i" :label="item.value">{{
item.text
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="form.userType === 1">
<el-col :span="24">
<el-form-item label="科目层次:">
<ul class="userform_ul">
<li v-for="(value, i) in getUserSubjectLevel(form.subjectLevel)" :key="i">
{{ userLevel2subject(value[0]) }}:
<el-radio-group v-model="form.subjectLevel[value[0]]">
<el-radio
v-for="(level, j) in userLevelList"
:key="j"
:label="level.value"
>{{ level.text }}</el-radio
>
</el-radio-group>
</li>
</ul>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row>
<el-col :span="12"> </el-col>
</el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="职位" prop="positionIds" :rules="ruleRequired"> <el-form-item label="任教信息:" prop="positionIds" :rules="ruleRequired">
<el-button type="success" @click="CheckPosition()">分配职位</el-button> <el-button type="success" @click="CheckPosition()">分配职位</el-button>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -145,29 +46,18 @@
:key="index" :key="index"
style="padding-left: 120px; padding-bottom: 20px" style="padding-left: 120px; padding-bottom: 20px"
> >
<div class="subjectTagEnableDiv" v-if="position.enable === false"> <div class="subjectTagEnableDiv">
<el-tag type="info">{{ "禁用" }}</el-tag> <el-tag v-if="!position.enable" type="info">已禁用</el-tag>
<el-tag type="info">{{ position.schoolName || "-" }}</el-tag>
<el-tag type="info">{{
position.graduationYear ? position.graduationYear + "届" : "-"
}}</el-tag>
<el-tag type="info">{{ position.grade || "-" }}</el-tag>
<el-tag type="info">{{ position.className || "-" }}</el-tag>
<el-tag type="info">{{ position.subjectName || "-" }}</el-tag>
<el-tag type="info">{{ position.name || "-" }}</el-tag>
<el-tag type="info">{{ position.endTime }}</el-tag>
</div>
<div class="subjectTagEnableDiv" v-else>
<el-tag>{{ position.schoolName || "-" }}</el-tag> <el-tag>{{ position.schoolName || "-" }}</el-tag>
<el-tag type="warning">{{ <el-tag type="warning">{{
position.graduationYear ? position.graduationYear + "届" : "-" position.graduationYear ? position.graduationYear + "届" : "-"
}}</el-tag> }}</el-tag>
<el-tag type="success">{{ position.grade || "-" }}</el-tag> <el-tag type="success" v-show="position.grade">{{ position.grade }}</el-tag>
<el-tag type="primary" class="classTag">{{ <el-tag type="primary" v-show="position.className" class="classTag">{{
position.className || "-" position.className
}}</el-tag> }}</el-tag>
<el-tag type="info" class="subjectTag">{{ <el-tag type="info" v-show="position.subjectName" class="subjectTag">{{
position.subjectName || "-" position.subjectName
}}</el-tag> }}</el-tag>
<el-tag type="danger">{{ position.name || "-" }}</el-tag> <el-tag type="danger">{{ position.name || "-" }}</el-tag>
</div> </div>
@ -263,6 +153,7 @@ const subject2 = ref<ComboModel[]>([
{ value: 7, text: "政治" }, { value: 7, text: "政治" },
]); ]);
const emit = defineEmits(["handlePagedCallback"]);
const userTypeList = ref<ComboModel[]>([]); const userTypeList = ref<ComboModel[]>([]);
const userLevelList = ref<ComboModel[]>([]); const userLevelList = ref<ComboModel[]>([]);
const subjectLEnum = ref<Record<string, string>>({}); const subjectLEnum = ref<Record<string, string>>({});
@ -335,7 +226,7 @@ const userLevel2subject = (str: string) => {
}; };
const handlePagedCallback = () => { const handlePagedCallback = () => {
// Emit event to parent if needed emit("handlePagedCallback");
}; };
const userEditForm = ref<FormInstance>(); const userEditForm = ref<FormInstance>();
const handleSubmitForm = () => { const handleSubmitForm = () => {
@ -345,8 +236,6 @@ const handleSubmitForm = () => {
const formData = { const formData = {
...form.value, ...form.value,
account: form.value.phone || "", account: form.value.phone || "",
subjectLevels: form.value.subjectLevels || [],
subjectLevel: form.value.subjectLevel || { ...defaultSubjectLevel },
positionIds: form.value.positionIds || [], positionIds: form.value.positionIds || [],
}; };
@ -361,6 +250,7 @@ const handleSubmitForm = () => {
}); });
} }
}); });
// Form validation and submission logic // Form validation and submission logic
}; };
@ -460,7 +350,10 @@ const CheckPosition = () => {
const handleCheckCallback = (checkPosition: Position[]) => { const handleCheckCallback = (checkPosition: Position[]) => {
dialog.visible = false; dialog.visible = false;
positionList.value = checkPosition; positionList.value = checkPosition.map((s) => {
s.enable = true;
return s;
});
form.value.positionIds = positionList.value.map((w) => w.id); form.value.positionIds = positionList.value.map((w) => w.id);
}; };

View File

@ -114,9 +114,9 @@
<el-button type="default" @click="downLoadImportUsersTemplate" <el-button type="default" @click="downLoadImportUsersTemplate"
>下载导入用户模板</el-button >下载导入用户模板</el-button
> >
<el-button title="根据当前筛选条件导出" type="success" @click="exportUser" <!-- <el-button title="根据当前筛选条件导出" type="primary" @click="exportUser"
>导出用户</el-button >导出用户</el-button
> > -->
</div> </div>
<div class="toolbar-container" v-show="!selectUser"> <div class="toolbar-container" v-show="!selectUser">
<!-- 按钮组 --> <!-- 按钮组 -->
@ -156,7 +156,9 @@
<!-- <el-table-column prop="studentId" label="学号" width="120" /> <!-- <el-table-column prop="studentId" label="学号" width="120" />
<el-table-column prop="gKSubject" label="新高考学科" width="150" /> --> <el-table-column prop="gKSubject" label="新高考学科" width="150" /> -->
<el-table-column label="职位"> <el-table-column prop="studentId" label="职务" width="120" />
<el-table-column label="任教信息">
<template #default="scope"> <template #default="scope">
<div <div
v-for="(position, index) in scope.row.positions" v-for="(position, index) in scope.row.positions"
@ -258,6 +260,7 @@ import {
Star, Star,
} from "@element-plus/icons-vue"; } from "@element-plus/icons-vue";
import { ComboModel } from "@/components/hTable/hTable"; import { ComboModel } from "@/components/hTable/hTable";
import { ImportTeacher } from "@/api/student";
const classAPI = new hTableAPI("usercenter/back/classes"); const classAPI = new hTableAPI("usercenter/back/classes");
const schoolsAPI = new hTableAPI("usercenter/back/schools"); const schoolsAPI = new hTableAPI("usercenter/back/schools");
@ -579,57 +582,6 @@ const handleSelectionChange = (selection: UserDetail[]) => {
table.selectRows = selection; table.selectRows = selection;
}; };
const handleDelete = () => {
// if (table.selectRows.length === 0) {
// ElMessage.warning("");
// return;
// }
// const ids: number[] = [];
// table.selectRows.forEach(it => {
// ids.push(it.Id);
// });
// ElMessageBox.confirm(", ?", "", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning"
// }).then(() => {
// delUser(ids).then(res => {
// if (res.code === 200) {
// handleReloadPaged();
// ElMessage.success("");
// } else {
// ElMessage.error(res.Message);
// }
// });
// });
};
const handleRestPass = async () => {
// if (table.selectRows.length === 0) {
// ElMessage.warning("");
// } else {
// const ids: number[] = [];
// table.selectRows.forEach(it => {
// ids.push(it.Id);
// });
// try {
// await ElMessageBox.confirm("?", "", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning"
// });
// const res = await restUserPass(ids);
// if (res.code === 200) {
// ElMessage.success("");
// } else {
// ElMessage.error("");
// }
// } catch (error) {
// // User cancelled
// }
// }
};
const getUserTypeTag = (type: number) => { const getUserTypeTag = (type: number) => {
return type === 1 ? "info" : "warning"; return type === 1 ? "info" : "warning";
}; };
@ -732,51 +684,43 @@ const handleEditSubjectLevelCallback = () => {
}; };
const importData = () => { const importData = () => {
// const fileE = document.createElement("input"); console.log("批量导入");
// fileE.type = "file";
// const formData = new FormData();
// fileE.onchange = async function () {
// formData.append("File", fileE.files![0]);
// const res = await ImporExportTemplate(formData);
// if (res.type === "application/json") {
// const json = await readerBlob(res);
// if (json !== undefined && json.code !== 200) {
// return ElMessage.error(json.Message);
// } else {
// return ElMessage.success(",");
// }
// } else if (res === undefined || res.size === 0) {
// ElMessage.success(",");
// return;
// }
// const url = res && window.URL.createObjectURL(res);
// const link = document.createElement("a");
// link.href = url;
// link.setAttribute("download", ".xlsx");
// document.body.appendChild(link);
// link.click();
// document.body.removeChild(link);
// ElMessage.success(",");
// };
// try {
// fileE.click();
// } catch (error) {
// console.error(error);
// }
};
const readerBlob = (data: Blob): Promise<any> => { let fileE = document.createElement("input");
return new Promise((resolve) => { fileE.type = "file";
const reader = new FileReader(); var formData = new window.FormData();
reader.readAsText(data, "utf-8"); fileE.onchange = async function () {
reader.onload = function () { formData.append("file", fileE.files[0]);
const dd = JSON.parse(reader.result as string); let res = await ImportTeacher(fileE.files[0]);
resolve(dd); if (res.code != undefined) {
}; if (res.code !== 200) return ElMessage.error(res.message);
}); else return ElMessage.success("所有数据录入成功");
} else if (res.type === "application/json") {
let json = await res.text();
if (json !== undefined && json.Code !== 200) {
return ElMessage.error(json.Message);
} else {
return ElMessage.success("操所有数据录入成功作成功");
}
} else if (res === undefined || res.size === 0)
return ElMessage.success("所有数据录入成功");
const url = res && window.URL.createObjectURL(res);
const link = document.createElement("a");
link.href = url;
link.setAttribute("download", "未成功导入的老师信息数据" + ".xlsx");
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
ElMessage.success("导入失败,已导出错误数据");
};
try {
fileE.click();
} catch (error) {}
}; };
const downLoadImportUsersTemplate = () => { const downLoadImportUsersTemplate = () => {
const baseUrl = import.meta.env.VITE_API_BASEURL;
const excelImportUsersUrl = `${baseUrl}/Student/DwImportTeacherTemplate`;
window.open(excelImportUsersUrl, "_blank"); window.open(excelImportUsersUrl, "_blank");
}; };

View File

@ -423,7 +423,6 @@ const fetchPagedData = async () => {
table.data = res.data; table.data = res.data;
tableExpandRowKeys.value = []; tableExpandRowKeys.value = [];
tableExpandRowKeys.value = table.data.map((s) => s.id.toString()); tableExpandRowKeys.value = table.data.map((s) => s.id.toString());
debugger;
tableExpandRowKeys.value.push( tableExpandRowKeys.value.push(
res.data.find((s) => s.id == 1).children.map((s) => s.id.toString()) res.data.find((s) => s.id == 1).children.map((s) => s.id.toString())
); );

View File

@ -88,7 +88,7 @@
<el-button type="info" @click="downLoadTpl">下载模版</el-button> <el-button type="info" @click="downLoadTpl">下载模版</el-button>
</div> </div>
<!-- 表格区域 --> <!-- 表格区域 -->
<el-table :data="listData" style="width: 100%"> <el-table :data="listData" style="width: 100%" :max-height="500">
<el-table-column label="操作" width="200"> <el-table-column label="操作" width="200">
<template #default="{ row }"> <template #default="{ row }">
<!-- <el-button size="small" type="danger" plain @click="onDelete(row)" <!-- <el-button size="small" type="danger" plain @click="onDelete(row)"