优化 学生老师导入流程
This commit is contained in:
parent
26a1b003cd
commit
69ebb99616
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 () => {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -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)"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue