dev #31

Merged
hy merged 3 commits from dev into staging 2025-11-17 11:34:03 +08:00
4 changed files with 69 additions and 45 deletions

View File

@ -73,7 +73,7 @@ export default defineConfig([
} }
}, },
...tseslint.config({ ...tseslint.config({
extends: [...tseslint.configs.recommended], extends: [...tseslint.configs.recommended, "plugin:prettier/recommended"],
files: ["**/*.?([cm])ts", "**/*.?([cm])tsx"], files: ["**/*.?([cm])ts", "**/*.?([cm])tsx"],
rules: { rules: {
"@typescript-eslint/no-redeclare": "error", "@typescript-eslint/no-redeclare": "error",

View File

@ -12,11 +12,12 @@ import type {
import { stringify } from "qs"; import { stringify } from "qs";
import NProgress from "../progress"; import NProgress from "../progress";
import { getToken, formatToken } from "@/utils/auth"; import { getToken, formatToken } from "@/utils/auth";
import { useUserStoreHook } from "@/store/modules/user"; import { useUserStore, useUserStoreHook } from "@/store/modules/user";
// import { string } from "vue-types"; // import { string } from "vue-types";
import router from "@/router"; import router from "@/router";
import { ElMessage } from "element-plus"; import { ElMessage } from "element-plus";
import { message } from "../message"; import { message } from "../message";
import { store } from "@/store";
/**请求后端的地址 未配置则访问BaseURL */ /**请求后端的地址 未配置则访问BaseURL */
const apiServiceConfig = { const apiServiceConfig = {
@ -208,6 +209,10 @@ class PureHttp {
router.push({ router.push({
path: "/error/403" path: "/error/403"
}); });
}if (error.response?.status == 401) {
debugger;
ElMessage.warning("登录信息失效,请重新登录!");
return useUserStore(store).logOut();
} }
// 所有的响应异常 区分来源为取消请求/非取消请求 // 所有的响应异常 区分来源为取消请求/非取消请求
return Promise.reject($error); return Promise.reject($error);
@ -235,13 +240,13 @@ class PureHttp {
.request(config) .request(config)
.then((response: any) => { .then((response: any) => {
if (response.code != null && response.code !== 200) { if (response.code != null && response.code !== 200) {
message(response.message, { type: "error" }); message(response.message, { type: "error" });
} resolve(response); }
resolve(response);
}) })
.catch(error => { .catch(error => {
if (error.status != 200) { if (error.status != 200) {
ElMessage.warning("请求失败" + error.message); ElMessage.warning("请求失败: " + error.message);
} }
reject(error); reject(error);
}); });

View File

@ -3,17 +3,23 @@
<el-form ref="userEditForm" :model="form" :label-width="formLabelWidth" clearable> <el-form ref="userEditForm" :model="form" :label-width="formLabelWidth" clearable>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="电话号码" :rules="rulePhone" prop="phone"> <el-form-item label="姓名:" prop="realName" :rules="ruleRequired">
<el-input type="text" v-model="form.phone" /> <el-input
v-model="form.realName"
type="text"
autocomplete="off"
maxlength="20"
:show-word-limit="true"
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="姓名:" prop="realName" :rules="ruleRequired"> <el-form-item label="职务:" prop="studentId">
<el-input <el-input
v-model="form.studentId"
type="text" type="text"
v-model="form.realName"
autocomplete="off" autocomplete="off"
maxlength="20" maxlength="16"
:show-word-limit="true" :show-word-limit="true"
/> />
</el-form-item> </el-form-item>
@ -22,14 +28,13 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="职务:" prop="studentId"> <el-form-item label="账号" :rules="ruleRequiredI(20, 6)" prop="account">
<el-input <el-input v-model="form.account" type="text" />
type="text" </el-form-item>
v-model="form.studentId" </el-col>
autocomplete="off" <el-col :span="12">
maxlength="16" <el-form-item label="电话号码" :rules="rulePhone" prop="phone">
:show-word-limit="true" <el-input v-model="form.phone" type="text" />
/>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -45,7 +50,7 @@
>提示:任职信息所有项值<span class="text-red-500">必填</span>, >提示:任职信息所有项值<span class="text-red-500">必填</span>,
如若查询不到对应班级,请先添加 如若查询不到对应班级,请先添加
</span> </span>
<el-form :model="positionList" inline ref="positionEditForm"> <el-form ref="positionEditForm" :model="positionList" inline>
<div <div
v-for="(position, index) in positionList" v-for="(position, index) in positionList"
:key="index" :key="index"
@ -58,15 +63,15 @@
class="mr-[5px]!" class="mr-[5px]!"
type="danger" type="danger"
:icon="Delete" :icon="Delete"
@click="positionClose(position)"
circle circle
@click="positionClose(position)"
/> />
</el-form-item> </el-form-item>
<el-form-item :prop="`${index}.positionLevel`" :rules="ruleRequired"> <el-form-item :prop="`${index}.positionLevel`" :rules="ruleRequired">
<el-select <el-select
v-model="position.positionLevel"
:disabled="position.id != undefined" :disabled="position.id != undefined"
class="w-[100px]!" class="w-[100px]!"
v-model="position.positionLevel"
placeholder="类型" placeholder="类型"
clearable clearable
filterable filterable
@ -76,16 +81,15 @@
:key="item.value" :key="item.value"
:label="item.text" :label="item.text"
:value="item.value" :value="item.value"
> />
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :prop="`${index}.schoolId`" :rules="ruleRequired"> <el-form-item :prop="`${index}.schoolId`" :rules="ruleRequired">
<el-select <el-select
v-model="position.schoolId"
:disabled="position.id != undefined" :disabled="position.id != undefined"
class="w-[250px]!" class="w-[250px]!"
v-model="position.schoolId"
placeholder="学校" placeholder="学校"
clearable clearable
filterable filterable
@ -96,16 +100,15 @@
:key="item.value" :key="item.value"
:label="item.text" :label="item.text"
:value="item.value" :value="item.value"
> />
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item :prop="`${index}.grade`" :rules="ruleRequired"> <el-form-item :prop="`${index}.grade`" :rules="ruleRequired">
<el-select <el-select
v-model="position.grade"
:disabled="position.id != undefined" :disabled="position.id != undefined"
class="w-[150px]!" class="w-[150px]!"
v-model="position.grade"
placeholder="年级" placeholder="年级"
clearable clearable
filterable filterable
@ -116,8 +119,7 @@
:key="item.value" :key="item.value"
:label="item.text" :label="item.text"
:value="item.value" :value="item.value"
> />
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -126,10 +128,10 @@
:rules="position.positionLevel > 3 ? ruleRequired : []" :rules="position.positionLevel > 3 ? ruleRequired : []"
> >
<el-select <el-select
:disabled="position.id != undefined"
v-show="position.positionLevel > 3" v-show="position.positionLevel > 3"
class="w-[120px]!"
v-model="position.classId" v-model="position.classId"
:disabled="position.id != undefined"
class="w-[120px]!"
placeholder="班级" placeholder="班级"
clearable clearable
filterable filterable
@ -139,8 +141,7 @@
:key="item.value" :key="item.value"
:label="item.text" :label="item.text"
:value="item.value" :value="item.value"
> />
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -149,10 +150,10 @@
:rules="position.positionLevel == 5 ? ruleRequired : []" :rules="position.positionLevel == 5 ? ruleRequired : []"
> >
<el-select <el-select
:disabled="position.id != undefined"
v-show="position.positionLevel == 5" v-show="position.positionLevel == 5"
class="w-[100px]!"
v-model="position.subjectId" v-model="position.subjectId"
:disabled="position.id != undefined"
class="w-[100px]!"
placeholder="学科" placeholder="学科"
clearable clearable
filterable filterable
@ -162,8 +163,7 @@
:key="item.value" :key="item.value"
:label="item.text" :label="item.text"
:value="item.value" :value="item.value"
> />
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</div> </div>
@ -192,12 +192,20 @@ import {
import PositionForm from "./positionForm.vue"; import PositionForm from "./positionForm.vue";
import { getenum, getenumDic } from "@/api/enum"; import { getenum, getenumDic } from "@/api/enum";
import { PosititonIds } from "@/api/student"; import { PosititonIds } from "@/api/student";
import { ruleRequired, rulePhone } from "@/utils/rules"; import { ruleRequired, rulePhone, ruleRequiredI } from "@/utils/rules";
import { ElMessage, FormInstance } from "element-plus"; import { ElMessage, FormInstance } from "element-plus";
import { ComboModel, gradeComboModel } from "@/components/hTable/hTable"; import { ComboModel, gradeComboModel } from "@/components/hTable/hTable";
import { Check, Delete, Edit, Message, Search, Star } from "@element-plus/icons-vue"; import {
Check,
Delete,
Edit,
Message,
Phone,
Search,
Star,
} from "@element-plus/icons-vue";
import { de } from "element-plus/es/locales.mjs"; import { de } from "element-plus/es/locales.mjs";
import { request } from "node_modules/axios/index.cjs";
interface FormData { interface FormData {
id: number; id: number;
account: string; account: string;
@ -416,7 +424,8 @@ const handleSubmitForm = async () => {
const formData = { const formData = {
...form.value, ...form.value,
account: form.value.phone || "", account: form.value.account || "",
phone: form.value.phone || "",
positionIds: postIdArr, positionIds: postIdArr,
}; };
@ -581,6 +590,7 @@ onMounted(async () => {
margin-right: 0px !important; margin-right: 0px !important;
margin-bottom: 10px !important; margin-bottom: 10px !important;
} }
.subjectTagEnableDiv .el-select { .subjectTagEnableDiv .el-select {
margin-right: 5px; margin-right: 5px;
} }
@ -594,14 +604,17 @@ onMounted(async () => {
background-color: #909399; background-color: #909399;
color: white; color: white;
} }
.classTag { .classTag {
color: #a3bf08 !important; color: #a3bf08 !important;
background-color: #f4fbd1 !important; background-color: #f4fbd1 !important;
border-color: #f4fbd1 !important; border-color: #f4fbd1 !important;
} }
.subjectTagEnableDiv { .subjectTagEnableDiv {
padding: 1px; padding: 1px;
} }
.subjectTag { .subjectTag {
color: #eb0de4 !important; color: #eb0de4 !important;
background-color: #fbd9ff !important; background-color: #fbd9ff !important;

View File

@ -6,6 +6,9 @@
<el-form-item> <el-form-item>
<el-input v-model="search.searchStr" placeholder="姓名/账号/学号" /> <el-input v-model="search.searchStr" placeholder="姓名/账号/学号" />
</el-form-item> </el-form-item>
<el-form-item>
<el-input v-model="search.phone" placeholder="手机号" />
</el-form-item>
<!-- <el-form-item style="width: 100px"> <!-- <el-form-item style="width: 100px">
<el-select <el-select
v-model="search.userType" v-model="search.userType"
@ -270,7 +273,8 @@ import {
Message, Message,
ArrowDownBold, ArrowDownBold,
Search, Search,
Star Star,
Phone
} from "@element-plus/icons-vue"; } from "@element-plus/icons-vue";
import { ComboModel, gradeComboModel } from "@/components/hTable/hTable"; import { ComboModel, gradeComboModel } from "@/components/hTable/hTable";
import { ImportTeacher } from "@/api/student"; import { ImportTeacher } from "@/api/student";
@ -280,6 +284,7 @@ const schoolsAPI = new hTableAPI("usercenter/back/schools");
interface SearchParams { interface SearchParams {
searchStr: string; searchStr: string;
phone: string;
userType: string | number; userType: string | number;
level: string | number; level: string | number;
schoolId: string | number; schoolId: string | number;
@ -368,6 +373,7 @@ const selectUserTable = ref();
const search = reactive<SearchParams>({ const search = reactive<SearchParams>({
searchStr: "", searchStr: "",
phone: "",
userType: "", userType: "",
level: "", level: "",
schoolId: "", schoolId: "",
@ -571,6 +577,7 @@ const getClass = () => {
const fetchPagedData = (searchUnUse = false) => { const fetchPagedData = (searchUnUse = false) => {
const data = { const data = {
SearchStr: search.searchStr, SearchStr: search.searchStr,
Phone: search.phone,
UserType: 2, UserType: 2,
Level: search.level || 0, Level: search.level || 0,
SchoolId: search.schoolId || 0, SchoolId: search.schoolId || 0,
@ -715,7 +722,6 @@ const importData = () => {
fileE.onchange = async function () { fileE.onchange = async function () {
formData.append("file", fileE.files[0]); formData.append("file", fileE.files[0]);
let res = await ImportTeacher(fileE.files[0]); let res = await ImportTeacher(fileE.files[0]);
debugger;
if (res.code != undefined) { if (res.code != undefined) {
if (res.code !== 200) return ElMessage.error(res.message); if (res.code !== 200) return ElMessage.error(res.message);
else return ElMessage.success("所有数据录入成功"); else return ElMessage.success("所有数据录入成功");