dev #8

Merged
hy merged 45 commits from dev into master 2025-08-26 19:03:29 +08:00
7 changed files with 184 additions and 260 deletions
Showing only changes of commit 10b9a5caed - Show all commits

1
.gitignore vendored
View File

@ -21,3 +21,4 @@ tests/**/coverage/
*.sln *.sln
tsconfig.tsbuildinfo tsconfig.tsbuildinfo
.vscode .vscode
.vscode/settings.json

View File

@ -7,7 +7,8 @@
"editor.tabSize": 2, "editor.tabSize": 2,
"editor.formatOnPaste": true, "editor.formatOnPaste": true,
"editor.guides.bracketPairs": "active", "editor.guides.bracketPairs": "active",
"files.autoSave": "afterDelay", // "files.autoSave": "afterDelay",
"files.autoSave": "off",
"git.confirmSync": false, "git.confirmSync": false,
"workbench.startupEditor": "newUntitledFile", "workbench.startupEditor": "newUntitledFile",
"editor.suggestSelection": "first", "editor.suggestSelection": "first",

View File

@ -62,7 +62,7 @@ const tableData: TableConfig = {
grade: { grade: {
label: "年级", label: "年级",
width: "120px", width: "120px",
custom: (s) => `${s.gradeYear}${s.gradeLevel}`, // custom: (s) => `${s.gradeLevel}${s.gradeYear}`,
search: true, search: true,
add: false, // add: false, //
edit: false, // edit: false, //

View File

@ -133,6 +133,15 @@ const tableData: TableConfig = {
add: true, // add: true, //
edit: true, // edit: true, //
}, },
baseSchoolScore: {
label: "资源校平均分",
// rules: ruleRequiredNumber,
search: true,
width: "150px",
setting: {},
add: true, //
edit: true, //
},
startTime: { startTime: {
label: "考试时间", label: "考试时间",
width: "210px", width: "210px",

View File

@ -1,32 +1,12 @@
<template> <template>
<div> <div>
<el-form <el-form ref="userEditForm" :model="form" :label-width="formLabelWidth" clearable>
ref="userEditForm"
:model="form"
:label-width="formLabelWidth"
clearable
>
<el-row> <el-row>
<el-col :span="12">
<el-form-item label="账号:" prop="Account">
<el-input
type="text"
v-model="form.account"
autocomplete="off"
minlength="6"
maxlength="33"
:show-word-limit="true"
/>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="电话号码" :rules="rulePhone" prop="phone"> <el-form-item label="电话号码" :rules="rulePhone" prop="phone">
<el-input type="text" v-model="form.phone" /> <el-input type="text" v-model="form.phone" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="姓名:" prop="realName" :rules="ruleRequired"> <el-form-item label="姓名:" prop="realName" :rules="ruleRequired">
<el-input <el-input
@ -38,7 +18,10 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> </el-row>
<el-row>
<!-- <el-col :span="12">
<el-form-item label="所属云校" prop="cloudSchoolId"> <el-form-item label="所属云校" prop="cloudSchoolId">
<el-select <el-select
v-model="form.cloudSchoolId" v-model="form.cloudSchoolId"
@ -55,7 +38,7 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col> -->
</el-row> </el-row>
<el-row v-show="form.userType === 1"> <el-row v-show="form.userType === 1">
@ -119,12 +102,9 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="学生层次:" prop="level"> <el-form-item label="学生层次:" prop="level">
<el-radio-group v-model="form.subjectLevel.Level"> <el-radio-group v-model="form.subjectLevel.Level">
<el-radio <el-radio v-for="(item, i) in userLevelList" :key="i" :label="item.value">{{
v-for="(item, i) in userLevelList" item.text
:key="i" }}</el-radio>
:label="item.value"
>{{ item.text }}</el-radio
>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -134,10 +114,7 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="科目层次:"> <el-form-item label="科目层次:">
<ul class="userform_ul"> <ul class="userform_ul">
<li <li v-for="(value, i) in getUserSubjectLevel(form.subjectLevel)" :key="i">
v-for="(value, i) in getUserSubjectLevel(form.subjectLevel)"
:key="i"
>
{{ userLevel2subject(value[0]) }}: {{ userLevel2subject(value[0]) }}:
<el-radio-group v-model="form.subjectLevel[value[0]]"> <el-radio-group v-model="form.subjectLevel[value[0]]">
<el-radio <el-radio
@ -158,43 +135,42 @@
<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 type="success" @click="CheckPosition()">分配职位</el-button>
>分配职位</el-button
>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<div class="max-h-[400px] overflow-auto pb-1">
<div <div
v-for="(position, index) in positionList" v-for="(position, index) in positionList"
: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" v-if="position.enable === false">
<el-tag type="info">{{ "禁用" }}</el-tag> <el-tag type="info">{{ "禁用" }}</el-tag>
<el-tag type="info">{{ position.schoolName || "-" }}</el-tag> <el-tag type="info">{{ position.schoolName || "-" }}</el-tag>
<el-tag type="info">{{ <el-tag type="info">{{
position.graduationYear ? position.graduationYear + "届" : "-" position.graduationYear ? position.graduationYear + "届" : "-"
}}</el-tag> }}</el-tag>
<el-tag type="info">{{ position.grade || "-" }}</el-tag> <el-tag type="info">{{ position.grade || "-" }}</el-tag>
<el-tag type="info">{{ position.className || "-" }}</el-tag> <el-tag type="info">{{ position.className || "-" }}</el-tag>
<el-tag type="info">{{ position.subjectName || "-" }}</el-tag> <el-tag type="info">{{ position.subjectName || "-" }}</el-tag>
<el-tag type="info">{{ position.name || "-" }}</el-tag> <el-tag type="info">{{ position.name || "-" }}</el-tag>
<el-tag type="info">{{ position.endTime }}</el-tag> <el-tag type="info">{{ position.endTime }}</el-tag>
</div> </div>
<div class="subjectTagEnableDiv" v-else> <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">{{ position.grade || "-" }}</el-tag>
<el-tag type="primary" class="classTag">{{ <el-tag type="primary" class="classTag">{{
position.className || "-" position.className || "-"
}}</el-tag> }}</el-tag>
<el-tag type="info" class="subjectTag">{{ <el-tag type="info" 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> </div>
</div> </div>
<el-form-item> <el-form-item>
@ -227,17 +203,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from "vue"; import { ref, reactive, onMounted } from "vue";
import {} from "@/api/user"; import {} from "@/api/user";
import { import { cloudSchoolCombo, getUserInfo, editUser, Position } from "@/api/userCenter";
cloudSchoolCombo,
getUserInfo,
editUser,
Position
} from "@/api/userCenter";
import PositionForm from "./positionForm.vue"; import PositionForm from "./positionForm.vue";
import { getenum, getenumDic } from "@/api/enum"; import { getenum, getenumDic } from "@/api/enum";
import { ruleRequired, rulePhone } from "@/utils/rules"; import { ruleRequired, rulePhone } from "@/utils/rules";
import { ElMessage } from "element-plus"; import { ElMessage, FormInstance } from "element-plus";
import { ComboModel } from "@/components/hTable/hTable"; import { ComboModel } from "@/components/hTable/hTable";
import { InformationEvent } from "http";
interface FormData { interface FormData {
id: number; id: number;
@ -268,7 +240,7 @@ interface DialogConfig {
width: string; width: string;
} }
defineOptions({ defineOptions({
name: "UserEditForm" name: "UserEditForm",
}); });
const props = defineProps<{ const props = defineProps<{
@ -281,14 +253,14 @@ const loading = ref(false);
const subject1 = ref<ComboModel[]>([ const subject1 = ref<ComboModel[]>([
{ value: 4, text: "物理" }, { value: 4, text: "物理" },
{ value: 8, text: "历史" } { value: 8, text: "历史" },
]); ]);
const subject2 = ref<ComboModel[]>([ const subject2 = ref<ComboModel[]>([
{ value: 5, text: "化学" }, { value: 5, text: "化学" },
{ value: 6, text: "生物" }, { value: 6, text: "生物" },
{ value: 9, text: "地理" }, { value: 9, text: "地理" },
{ value: 7, text: "政治" } { value: 7, text: "政治" },
]); ]);
const userTypeList = ref<ComboModel[]>([]); const userTypeList = ref<ComboModel[]>([]);
@ -311,7 +283,7 @@ const defaultSubjectLevel = reactive({
Subject7: 0, Subject7: 0,
Subject8: 0, Subject8: 0,
Subject9: 0, Subject9: 0,
CreatePositionId: 1 CreatePositionId: 1,
}); });
const form = ref<FormData>({ const form = ref<FormData>({
@ -328,14 +300,14 @@ const form = ref<FormData>({
subjectLevels: [], subjectLevels: [],
subjectLevel: { ...defaultSubjectLevel }, subjectLevel: { ...defaultSubjectLevel },
positionIds: [], positionIds: [],
positionFormIds: [] positionFormIds: [],
}); });
const dialog = reactive<DialogConfig>({ const dialog = reactive<DialogConfig>({
close: false, close: false,
title: "", title: "",
visible: false, visible: false,
width: "1200px" width: "1200px",
}); });
const customeRules = reactive({ const customeRules = reactive({
@ -344,9 +316,9 @@ const customeRules = reactive({
{ {
pattern: /^1[3456789]\d{9}$/, pattern: /^1[3456789]\d{9}$/,
message: "手机号码格式不正确", message: "手机号码格式不正确",
trigger: "blur" trigger: "blur",
} },
] ],
}); });
const getUserSubjectLevel = (obj: Record<string, any>) => { const getUserSubjectLevel = (obj: Record<string, any>) => {
@ -354,7 +326,7 @@ const getUserSubjectLevel = (obj: Record<string, any>) => {
form.value.subjectLevel = { ...defaultSubjectLevel }; form.value.subjectLevel = { ...defaultSubjectLevel };
obj = form.value.subjectLevel; obj = form.value.subjectLevel;
} }
return Object.entries(obj).filter(s => s[0].includes("Subject")); return Object.entries(obj).filter((s) => s[0].includes("Subject"));
}; };
const userLevel2subject = (str: string) => { const userLevel2subject = (str: string) => {
@ -365,40 +337,31 @@ const userLevel2subject = (str: string) => {
const handlePagedCallback = () => { const handlePagedCallback = () => {
// Emit event to parent if needed // Emit event to parent if needed
}; };
const userEditForm = ref<FormInstance>();
const handleSubmitForm = () => { const handleSubmitForm = () => {
// Form validation and submission logic userEditForm.value.validate((valid) => {
loading.value = true; if (valid) {
const formData = { loading.value = true;
id: form.value.id || 0, const formData = {
userType: form.value.userType || 1, ...form.value,
level: form.value.level || 0, account: form.value.phone || "",
account: form.value.account || "", subjectLevels: form.value.subjectLevels || [],
// PassWord: form.value.id === 0 ? md5(form.value.PassWord).toUpperCase() : "", subjectLevel: form.value.subjectLevel || { ...defaultSubjectLevel },
realName: form.value.realName || "", positionIds: form.value.positionIds || [],
studentId: form.value.studentId || "", };
templateId: form.value.templateId || 0,
subjectLevels: form.value.subjectLevels || [],
subjectLevel: form.value.subjectLevel || { ...defaultSubjectLevel },
positionIds: form.value.positionIds || [],
gLSubject: form.value.gLSubject,
gSubject1: form.value.gSubject1,
gSubject2: form.value.gSubject2,
idCard: form.value.idCard,
cloudSchoolId: form.value.cloudSchoolId,
phone: form.value.phone,
pointPenSN: form.value.pointPenSN
};
editUser(formData).then(res => { editUser(formData).then((res) => {
loading.value = false; loading.value = false;
if (res.code === 200) { if (res.code === 200) {
ElMessage.success("操作成功"); ElMessage.success("操作成功");
handlePagedCallback(); handlePagedCallback();
} else { } else {
ElMessage.error(res.message); ElMessage.error(res.message);
}
});
} }
}); });
// Form validation and submission logic
}; };
const handleResetForm = () => { const handleResetForm = () => {
@ -416,7 +379,7 @@ const handleResetForm = () => {
idCard: "", idCard: "",
phone: "", phone: "",
cloudSchoolId: "", cloudSchoolId: "",
pointPenSN: "" pointPenSN: "",
}); });
positionList.value = []; positionList.value = [];
}; };
@ -429,11 +392,11 @@ const fetchInitData = async () => {
const typeRes = await getenum("UserTypeEnum"); const typeRes = await getenum("UserTypeEnum");
userTypeList.value = typeRes.data; userTypeList.value = typeRes.data;
// // //
const schoolRes = await cloudSchoolCombo(); // const schoolRes = await cloudSchoolCombo();
if (schoolRes.code === 200) { // if (schoolRes.code === 200) {
CloudSchoolArr.value = schoolRes.data; // CloudSchoolArr.value = schoolRes.data;
} // }
const enumDicRes = await getenumDic("SubjectEnum"); const enumDicRes = await getenumDic("SubjectEnum");
subjectLEnum.value = enumDicRes.data; subjectLEnum.value = enumDicRes.data;
@ -442,7 +405,7 @@ const fetchInitData = async () => {
const fetchFormData = () => { const fetchFormData = () => {
handleResetForm(); handleResetForm();
if (props.id !== 0) { if (props.id !== 0) {
getUserInfo(props.id).then(res => { getUserInfo(props.id).then((res) => {
if (res.code === 200) { if (res.code === 200) {
if (res.data.SubjectLevel && res.data.SubjectLevel.CreatePositionId) { if (res.data.SubjectLevel && res.data.SubjectLevel.CreatePositionId) {
delete res.data.SubjectLevel.CreatePositionId; delete res.data.SubjectLevel.CreatePositionId;
@ -468,7 +431,7 @@ const fetchFormData = () => {
idCard: res.data.idCard, idCard: res.data.idCard,
phone: res.data.phone, phone: res.data.phone,
cloudSchoolId: res.data.cloudSchoolId, cloudSchoolId: res.data.cloudSchoolId,
pointPenSN: res.data.pointPenSN pointPenSN: res.data.pointPenSN,
}); });
positionList.value = res.data.positions; positionList.value = res.data.positions;
@ -491,14 +454,14 @@ const CheckPosition = () => {
dialog.title = "选择职位"; dialog.title = "选择职位";
dialog.visible = true; dialog.visible = true;
PositionFormIds.value = positionList.value PositionFormIds.value = positionList.value
.filter(s => s.enable !== false) .filter((s) => s.enable !== false)
.map(s => s.id); .map((s) => s.id);
}; };
const handleCheckCallback = (checkPosition: Position[]) => { const handleCheckCallback = (checkPosition: Position[]) => {
dialog.visible = false; dialog.visible = false;
positionList.value = checkPosition; positionList.value = checkPosition;
form.value.positionIds = positionList.value.map(w => w.id); form.value.positionIds = positionList.value.map((w) => w.id);
}; };
onMounted(async () => { onMounted(async () => {

View File

@ -25,12 +25,7 @@
</el-form-item> --> </el-form-item> -->
<el-form-item v-show="search.userType === 1" style="width: 100px"> <el-form-item v-show="search.userType === 1" style="width: 100px">
<el-select <el-select v-model="search.level" placeholder="学生层次" clearable filterable>
v-model="search.level"
placeholder="学生层次"
clearable
filterable
>
<el-option <el-option
v-for="item in userLevelList" v-for="item in userLevelList"
:key="item.value" :key="item.value"
@ -78,12 +73,7 @@
</el-form-item> </el-form-item>
<el-form-item style="width: 100px"> <el-form-item style="width: 100px">
<el-select <el-select v-model="search.classId" placeholder="班级" clearable filterable>
v-model="search.classId"
placeholder="班级"
clearable
filterable
>
<el-option <el-option
v-for="item in classList" v-for="item in classList"
:key="item.value" :key="item.value"
@ -95,12 +85,7 @@
</el-form-item> </el-form-item>
<el-form-item style="width: 100px"> <el-form-item style="width: 100px">
<el-select <el-select v-model="search.subjectId" placeholder="科目" clearable filterable>
v-model="search.subjectId"
placeholder="科目"
clearable
filterable
>
<el-option <el-option
v-for="item in subjectList" v-for="item in subjectList"
:key="item.value" :key="item.value"
@ -117,10 +102,7 @@
> >
</el-form-item> </el-form-item>
<el-form-item v-show="selectUser"> <el-form-item v-show="selectUser">
<el-button <el-button type="success" @click="selectUserCallBack()" icon="el-icon-check"
type="success"
@click="selectUserCallBack()"
icon="el-icon-check"
>选择用户</el-button >选择用户</el-button
> >
</el-form-item> </el-form-item>
@ -161,13 +143,9 @@
<el-table-column prop="id" label="用户Id" width="100" /> <el-table-column prop="id" label="用户Id" width="100" />
<el-table-column label="用户信息" width="200"> <el-table-column label="用户信息" width="200">
<template #default="scope"> <template #default="scope">
<el-tag <el-tag :type="getUserTypeTag(scope.row.userType)" style="margin-right: 5px">{{
:type="getUserTypeTag(scope.row.userType)" userTypeList.find((s) => s.value == scope.row.userType)?.text
style="margin-right: 5px" }}</el-tag>
>{{
userTypeList.find(s => s.value == scope.row.userType)?.text
}}</el-tag
>
<span>{{ scope.row.realName }} </span> <span>{{ scope.row.realName }} </span>
</template> </template>
</el-table-column> </el-table-column>
@ -183,9 +161,7 @@
<div <div
v-for="(position, index) in scope.row.positions" v-for="(position, index) in scope.row.positions"
:key="'Position' + index" :key="'Position' + index"
v-show=" v-show="index < 3 || (index >= 3 && showAllPosition.includes(scope.row))"
index < 3 || (index >= 3 && showAllPosition.includes(scope.row))
"
> >
<div v-if="position.enable === false"> <div v-if="position.enable === false">
<el-tag type="info">{{ position.schoolName || "-" }}</el-tag> <el-tag type="info">{{ position.schoolName || "-" }}</el-tag>
@ -213,9 +189,7 @@
</div> </div>
</div> </div>
<div <div
v-if=" v-if="scope.row.positions != undefined && scope.row.positions.length > 3"
scope.row.positions != undefined && scope.row.positions.length > 3
"
@click="showPosition(scope.row)" @click="showPosition(scope.row)"
class="userTagRow" class="userTagRow"
> >
@ -268,7 +242,7 @@ import {
getSubjectData, getSubjectData,
getPageUserList, getPageUserList,
UserDetail, UserDetail,
Position Position,
} from "@/api/userCenter"; } from "@/api/userCenter";
import { getenum } from "@/api/enum"; import { getenum } from "@/api/enum";
import { hTableAPI } from "@/api/hTable"; import { hTableAPI } from "@/api/hTable";
@ -280,7 +254,7 @@ import {
Message, Message,
ArrowDownBold, ArrowDownBold,
Search, Search,
Star Star,
} from "@element-plus/icons-vue"; } from "@element-plus/icons-vue";
import { ComboModel } from "@/components/hTable/hTable"; import { ComboModel } from "@/components/hTable/hTable";
@ -348,20 +322,20 @@ interface DialogData {
const props = defineProps({ const props = defineProps({
selectUser: { selectUser: {
type: Boolean, type: Boolean,
default: false default: false,
}, },
selectCallBack: { selectCallBack: {
type: Function, type: Function,
default: () => {} default: () => {},
}, },
maxTableHeight: { maxTableHeight: {
type: Number, type: Number,
default: 580 default: 580,
}, },
searchData: { searchData: {
type: Object as () => SearchParams, type: Object as () => SearchParams,
default: undefined default: undefined,
} },
}); });
const baseUrl = import.meta.env.VITE_API_USERCENTER_URL; const baseUrl = import.meta.env.VITE_API_USERCENTER_URL;
@ -382,13 +356,13 @@ const search = reactive<SearchParams>({
grade: "", grade: "",
classId: "", classId: "",
subjectId: "", subjectId: "",
positionId: "" positionId: "",
}); });
const userTypeList = ref<ComboModel[]>([ const userTypeList = ref<ComboModel[]>([
{ value: 1, text: "学生" }, { value: 1, text: "学生" },
{ value: 2, text: "教师" }, { value: 2, text: "教师" },
{ value: 3, text: "管理员" } { value: 3, text: "管理员" },
]); ]);
const userLevelList = ref<ComboModel[]>([]); const userLevelList = ref<ComboModel[]>([]);
@ -399,7 +373,7 @@ const gradeList = ref<ComboModel[]>([
{ value: "初三", text: "初三" }, { value: "初三", text: "初三" },
{ value: "高一", text: "高一" }, { value: "高一", text: "高一" },
{ value: "高二", text: "高二" }, { value: "高二", text: "高二" },
{ value: "高三", text: "高三" } { value: "高三", text: "高三" },
]); ]);
const classList = ref<ComboModel[]>([]); const classList = ref<ComboModel[]>([]);
const subjectList = ref<ComboModel[]>([]); const subjectList = ref<ComboModel[]>([]);
@ -409,13 +383,13 @@ const table = reactive<TableData>({
data: [], data: [],
selectRows: [], selectRows: [],
sort: "", sort: "",
border: true border: true,
}); });
const pagination = reactive<PaginationData>({ const pagination = reactive<PaginationData>({
index: 1, index: 1,
size: 10, size: 10,
total: 0 total: 0,
}); });
const dialog = reactive<DialogData>({ const dialog = reactive<DialogData>({
@ -423,32 +397,32 @@ const dialog = reactive<DialogData>({
update: { update: {
title: "", title: "",
visible: false, visible: false,
width: "800px" width: "1000px",
}, },
editLevel: { editLevel: {
userIds: [], userIds: [],
title: "", title: "",
visible: false, visible: false,
width: "400px" width: "400px",
}, },
editSubjectLevel: { editSubjectLevel: {
userIds: [], userIds: [],
title: "", title: "",
visible: false, visible: false,
width: "450px" width: "450px",
}, },
bindUser: { bindUser: {
title: "分配权限码", title: "分配权限码",
visible: false, visible: false,
width: "1150px", width: "1150px",
height: "" height: "",
}, },
userBindInfo: { userBindInfo: {
title: "用户权限码", title: "用户权限码",
visible: false, visible: false,
width: "1150px", width: "1150px",
height: "" height: "",
} },
}); });
const checkUserBindInfo = () => { const checkUserBindInfo = () => {
@ -511,7 +485,7 @@ const exportUser = async () => {
SubjectId: search.subjectId || 0, SubjectId: search.subjectId || 0,
PositionId: search.positionId || 0, PositionId: search.positionId || 0,
PageIndex: pagination.index, PageIndex: pagination.index,
PageSize: pagination.size PageSize: pagination.size,
}; };
// const res = await exportUserApi(data); // const res = await exportUserApi(data);
@ -563,9 +537,9 @@ const getClass = () => {
const data = { const data = {
schoolId: search.schoolId || 0, schoolId: search.schoolId || 0,
graduationYear: search.graduationYear || 0, graduationYear: search.graduationYear || 0,
grade: search.grade grade: search.grade,
}; };
getClassCombo(data).then(res => { getClassCombo(data).then((res) => {
if (res.code === 200) { if (res.code === 200) {
classList.value = res.data; classList.value = res.data;
} }
@ -585,12 +559,12 @@ const fetchPagedData = (searchUnUse = false) => {
PositionId: search.positionId || 0, PositionId: search.positionId || 0,
PageIndex: pagination.index, PageIndex: pagination.index,
PageSize: pagination.size, PageSize: pagination.size,
UnUsed: searchUnUse UnUsed: searchUnUse,
}; };
getPageUserList(data).then(res => { getPageUserList(data).then((res) => {
if (res.code === 200) { if (res.code === 200) {
pagination.total = res.data.total; pagination.total = res.data.total;
res.data.data.forEach(item => { res.data.data.forEach((item) => {
if (item.positions) { if (item.positions) {
item.positions = PositionsSort(item.positions); item.positions = PositionsSort(item.positions);
} }
@ -663,14 +637,14 @@ const getUserLevelTag = (level: number) => {
return level === 0 return level === 0
? "info" ? "info"
: level === 1 : level === 1
? "success" ? "success"
: level === 2 : level === 2
? "warning" ? "warning"
: "error"; : "error";
}; };
const getUserLevelText = (level: number) => { const getUserLevelText = (level: number) => {
const r = userLevelList.value.filter(w => w.value === level); const r = userLevelList.value.filter((w) => w.value === level);
if (r.length > 0) { if (r.length > 0) {
return r[0].text; return r[0].text;
} }
@ -707,7 +681,7 @@ function pageIndexChange(o) {
const AddDialog = () => { const AddDialog = () => {
editId.value = 0; editId.value = 0;
dialog.update.title = "添加用户"; dialog.update.title = "添加教师";
dialog.update.visible = true; dialog.update.visible = true;
}; };
@ -732,7 +706,7 @@ const handleEditLevel = () => {
return; return;
} }
dialog.editLevel.title = "修改学生层次"; dialog.editLevel.title = "修改学生层次";
dialog.editLevel.userIds = table.selectRows.map(w => w.id); dialog.editLevel.userIds = table.selectRows.map((w) => w.id);
dialog.editLevel.visible = true; dialog.editLevel.visible = true;
}; };
@ -747,7 +721,7 @@ const handleEditSubjectLevel = () => {
return; return;
} }
dialog.editSubjectLevel.title = "修改学生科目层次"; dialog.editSubjectLevel.title = "修改学生科目层次";
dialog.editSubjectLevel.userIds = table.selectRows.map(w => w.id); dialog.editSubjectLevel.userIds = table.selectRows.map((w) => w.id);
dialog.editSubjectLevel.visible = true; dialog.editSubjectLevel.visible = true;
}; };
@ -791,7 +765,7 @@ const importData = () => {
}; };
const readerBlob = (data: Blob): Promise<any> => { const readerBlob = (data: Blob): Promise<any> => {
return new Promise(resolve => { return new Promise((resolve) => {
const reader = new FileReader(); const reader = new FileReader();
reader.readAsText(data, "utf-8"); reader.readAsText(data, "utf-8");
reader.onload = function () { reader.onload = function () {

View File

@ -62,12 +62,7 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-select <el-select v-model="search.classId" placeholder="班级" clearable filterable>
v-model="search.classId"
placeholder="班级"
clearable
filterable
>
<el-option <el-option
v-for="item in classList" v-for="item in classList"
:key="item.value" :key="item.value"
@ -78,12 +73,7 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-select <el-select v-model="search.subjectId" placeholder="科目" clearable filterable>
v-model="search.subjectId"
placeholder="科目"
clearable
filterable
>
<el-option <el-option
v-for="item in subjectList" v-for="item in subjectList"
:key="item.value" :key="item.value"
@ -93,7 +83,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <!-- <el-form-item>
<el-select <el-select
v-model="search.status" v-model="search.status"
placeholder="状态" placeholder="状态"
@ -107,21 +97,16 @@
:value="item.value" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item> <el-form-item>
<el-button <el-button type="primary" @click="handleReloadPaged" :icon="Search"
type="primary"
@click="handleReloadPaged"
icon="el-icon-search"
>查询</el-button >查询</el-button
> >
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="success" @click="asyncPosition" <el-button type="success" @click="asyncPosition">选择勾选职位</el-button>
>选择勾选职位</el-button
>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -147,15 +132,11 @@
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<el-table-column type="selection" width="40" /> <el-table-column type="selection" width="40" />
<el-table-column <el-table-column prop="name" label="职位名称[双击行快速选择]" width="220">
prop="name"
label="职位名称[双击行快速选择]"
width="220"
>
<template #default="scope"> <template #default="scope">
<span <span
>{{ scope.row.name }} >{{ scope.row.name }}
<el-tag v-show="selectPositions.find(s => scope.row.Id == s.id)" <el-tag v-show="selectPositions.find((s) => scope.row.Id == s.id)"
>已选</el-tag >已选</el-tag
> >
</span> </span>
@ -163,29 +144,19 @@
</el-table-column> </el-table-column>
<el-table-column prop="positionLevel" label="职级" width="80"> <el-table-column prop="positionLevel" label="职级" width="80">
<template #default="scope"> <template #default="scope">
<el-tag v-if="scope.row.positionLevel === 1" type="danger" <el-tag v-if="scope.row.positionLevel === 1" type="danger">教委</el-tag>
>教委</el-tag <el-tag v-else-if="scope.row.positionLevel === 2" type="warning">校级</el-tag>
>
<el-tag v-else-if="scope.row.positionLevel === 2" type="warning"
>校级</el-tag
>
<el-tag v-else-if="scope.row.positionLevel === 3">年级</el-tag> <el-tag v-else-if="scope.row.positionLevel === 3">年级</el-tag>
<el-tag v-else-if="scope.row.positionLevel === 4" type="success" <el-tag v-else-if="scope.row.positionLevel === 4" type="success">班级</el-tag>
>班级</el-tag <el-tag v-else-if="scope.row.positionLevel === 5" type="info">教师</el-tag>
> <el-tag v-else-if="scope.row.positionType === 1" type="info">学生</el-tag>
<el-tag v-else-if="scope.row.positionLevel === 5" type="info"
>教师</el-tag
>
<el-tag v-else-if="scope.row.positionType === 1" type="info"
>学生</el-tag
>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="学校 - 年级 - 班级 - 学科"> <el-table-column label="学校 - 年级 - 班级 - 学科">
<template #default="scope"> <template #default="scope">
<el-tag v-if="!scope.row.status" type="danger">锁定</el-tag> <el-tag v-if="!scope.row.status" type="danger">锁定</el-tag>
{{ scope.row.schoolName }} {{ scope.row.grade }} {{ scope.row.schoolName }} {{ scope.row.grade }} {{ scope.row.className }}
{{ scope.row.className }} {{ scope.row.subjectName }} {{ scope.row.subjectName }}
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -198,7 +169,7 @@
style="float: right" style="float: right"
type="success" type="success"
@click="handleConfirm" @click="handleConfirm"
icon="el-icon-check" :icon="Check"
>提交分配职位</el-button >提交分配职位</el-button
> >
</div> </div>
@ -217,7 +188,6 @@
</div> </div>
</div> </div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, reactive, onMounted } from "vue"; import { ref, reactive, onMounted } from "vue";
import { ElMessage, ElMessageBox } from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
@ -228,9 +198,10 @@ import {
getSubjectData, getSubjectData,
getPositionList, getPositionList,
getPositions, getPositions,
Position Position,
} from "@/api/userCenter"; } from "@/api/userCenter";
import { ComboModel } from "@/components/hTable/hTable"; import { ComboModel } from "@/components/hTable/hTable";
import { Check, Search } from "@element-plus/icons-vue";
interface SearchParams { interface SearchParams {
schoolId: string | number; schoolId: string | number;
@ -259,16 +230,16 @@ interface Dialog {
const props = defineProps({ const props = defineProps({
userType: { userType: {
type: Number, type: Number,
default: 0 default: 0,
}, },
positions: { positions: {
type: Array as () => number[], type: Array as () => number[],
default: () => [] default: () => [],
}, },
selectionCount: { selectionCount: {
type: Number, type: Number,
default: 999 default: 999,
} },
}); });
const emit = defineEmits(["handleCheckCallback", "handleCheckCallback"]); const emit = defineEmits(["handleCheckCallback", "handleCheckCallback"]);
@ -279,7 +250,7 @@ const search = reactive<SearchParams>({
grade: "", grade: "",
classId: "", classId: "",
subjectId: "", subjectId: "",
status: "" status: 1,
}); });
const selectPositions = ref<Position[]>([]); const selectPositions = ref<Position[]>([]);
@ -290,7 +261,7 @@ const gradeList = ref<ComboModel[]>([
{ value: "初三", text: "初三" }, { value: "初三", text: "初三" },
{ value: "高一", text: "高一" }, { value: "高一", text: "高一" },
{ value: "高二", text: "高二" }, { value: "高二", text: "高二" },
{ value: "高三", text: "高三" } { value: "高三", text: "高三" },
]); ]);
const classList = ref<ComboModel[]>([]); const classList = ref<ComboModel[]>([]);
const subjectList = ref<ComboModel[]>([]); const subjectList = ref<ComboModel[]>([]);
@ -298,17 +269,17 @@ const tableExpandRowKeys = ref<string[]>([]);
const positionList = ref<ComboModel[]>([ const positionList = ref<ComboModel[]>([
{ text: "学生", value: 1 }, { text: "学生", value: 1 },
{ text: "教师", value: 2 }, { text: "教师", value: 2 },
{ text: "管理员", value: 3 } { text: "管理员", value: 3 },
]); ]);
const statusList = ref<ComboModel[]>([ const statusList = ref<ComboModel[]>([
{ text: "正常", value: 1 }, { text: "正常", value: 1 },
{ text: "锁定", value: 2 } { text: "锁定", value: 2 },
]); ]);
const table = reactive<TableData>({ const table = reactive<TableData>({
data: [], data: [],
selectRows: [], selectRows: [],
border: true border: true,
}); });
const dialog = reactive<Dialog>({ const dialog = reactive<Dialog>({
@ -317,7 +288,7 @@ const dialog = reactive<Dialog>({
close: false, close: false,
title: "编辑职位", title: "编辑职位",
visible: false, visible: false,
width: "800px" width: "800px",
}); });
const authDialog = reactive<Dialog>({ const authDialog = reactive<Dialog>({
@ -326,7 +297,7 @@ const authDialog = reactive<Dialog>({
close: false, close: false,
title: "职位授权", title: "职位授权",
visible: false, visible: false,
width: "400px" width: "400px",
}); });
const positionTb = ref<FormInstance>(); const positionTb = ref<FormInstance>();
@ -430,7 +401,7 @@ const gradeChange = () => {
const getClass = async () => { const getClass = async () => {
const data = { const data = {
schoolId: search.schoolId || 0, schoolId: search.schoolId || 0,
grade: search.grade grade: search.grade,
}; };
const res = await getClassCombo(data); const res = await getClassCombo(data);
if (res.code === 200) { if (res.code === 200) {
@ -445,12 +416,17 @@ const fetchPagedData = async () => {
ClassId: search.classId || 0, ClassId: search.classId || 0,
SubjectId: search.subjectId || 0, SubjectId: search.subjectId || 0,
PositionType: search.positionType || 0, PositionType: search.positionType || 0,
Status: search.status || 0 Status: search.status || 0,
}; };
const res = await getPositionList(data); const res = await getPositionList(data);
if (res.code === 200) { if (res.code === 200) {
table.data = res.data; table.data = res.data;
tableExpandRowKeys.value = table.data.map(s => s.id.toString()); tableExpandRowKeys.value = [];
tableExpandRowKeys.value = table.data.map((s) => s.id.toString());
debugger;
tableExpandRowKeys.value.push(
res.data.find((s) => s.id == 1).children.map((s) => s.id.toString())
);
} }
}; };
@ -463,7 +439,7 @@ const handleConfirm = () => {
}; };
const tagClose = (p: Position) => { const tagClose = (p: Position) => {
selectPositions.value = selectPositions.value.filter(s => s !== p); selectPositions.value = selectPositions.value.filter((s) => s !== p);
}; };
const asyncPosition = (event: Event | null, rows?: Position[]) => { const asyncPosition = (event: Event | null, rows?: Position[]) => {
@ -472,9 +448,9 @@ const asyncPosition = (event: Event | null, rows?: Position[]) => {
ElMessage.warning("请选择要分配的职位"); ElMessage.warning("请选择要分配的职位");
return; return;
} }
const pIds = selectPositions.value.map(s => s.id); const pIds = selectPositions.value.map((s) => s.id);
selectPositions.value = selectPositions.value.concat( selectPositions.value = selectPositions.value.concat(
datas.filter(s => !pIds.includes(s.id)) datas.filter((s) => !pIds.includes(s.id))
); );
}; };
@ -482,7 +458,7 @@ onMounted(async () => {
userTypeToPosition(); userTypeToPosition();
if (props.positions && props.positions.length > 0) { if (props.positions && props.positions.length > 0) {
const res = await getPositions(props.positions); const res = await getPositions(props.positions);
selectPositions.value = res.data.map(s => ({ ...s })); selectPositions.value = res.data.map((s) => ({ ...s }));
} }
fetchInitData(); fetchInitData();
}); });