内容修改

This commit is contained in:
2025-10-18 09:00:25 +08:00
parent 3ed5a39db5
commit cb50a8ffff
2 changed files with 510 additions and 450 deletions

View File

@@ -126,7 +126,8 @@ export function filterDynamicRoutes(routes) {
export const loadView = (view) => { export const loadView = (view) => {
if (process.env.NODE_ENV === 'development') { if (process.env.NODE_ENV === 'development') {
return (resolve) => require([`@/views/${view}`], resolve) // 在开发环境下,使用显式的 .vue 扩展以避免 require.context 的键不匹配问题
return (resolve) => require([`@/views/${view}.vue`], resolve)
} else { } else {
// 使用 import 实现生产环境的路由懒加载 // 使用 import 实现生产环境的路由懒加载
return () => import(`@/views/${view}`) return () => import(`@/views/${view}`)

View File

@@ -5,23 +5,23 @@
<el-input v-model="queryParams.stuNo" placeholder="请输入学号" clearable @keyup.enter.native="handleQuery" /> <el-input v-model="queryParams.stuNo" placeholder="请输入学号" clearable @keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="姓名" prop="stuName"> <el-form-item label="姓名" prop="stuName">
<el-input v-model="queryParams.stuName" placeholder="请输入姓名" clearable <el-input v-model="queryParams.stuName" placeholder="请输入姓名" clearable @keyup.enter.native="handleQuery" />
@keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item label="班级" prop="className"> <el-form-item label="班级" prop="className">
<el-input v-model="queryParams.className" placeholder="请输入班级" clearable <el-input v-model="queryParams.className" placeholder="请输入班级" clearable @keyup.enter.native="handleQuery" />
@keyup.enter.native="handleQuery" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="manyVClick">批量通过</el-button> <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="manyVClick">批量审核</el-button>
</el-col> </el-col>
</el-row> </el-row>
<el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="#" align="center" prop="id" /> <el-table-column label="#" align="center" prop="id" />
@@ -37,44 +37,40 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-view" @click="lookVClick(scope.row)">审核</el-button> <el-button size="mini" type="text" icon="el-icon-view" @click="lookVClick(scope.row)">审核</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="openEdit(scope.row)">修改数据</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
:limit.sync="queryParams.pageSize" @pagination="getList" />
<!-- 审核弹窗 -->
<el-dialog @close="getList" title="审核" :visible.sync="lookV" :fullscreen="true" :destroy-on-close="true"> <el-dialog @close="getList" title="审核" :visible.sync="lookV" :fullscreen="true" :destroy-on-close="true">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<GlLook v-if="lookV" :formData="lookForm" /> <GlLook v-if="lookV" :formData="lookForm" />
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<!-- 中职毕业证下载 --> <!-- 明材料下载 -->
<el-form label-width="120px" v-if="lookForm.hardFile"> <el-form label-width="120px" v-if="lookForm.hardFile">
<el-form-item label="证明材料"> <el-form-item label="证明材料">
<el-button type="primary" size="mini" icon="el-icon-download" @click="downloadDiploma">下载文件 <el-button type="primary" size="mini" icon="el-icon-download" @click="downloadDiploma">下载文件</el-button>
</el-button>
</el-form-item> </el-form-item>
<FileUpload v-model="editForm.hardFile" />
</el-form> </el-form>
<el-form label-width="200px" size="mini" class="lookForm"> <el-form label-width="200px" size="mini" class="lookForm">
<el-form-item label="是否通过"> <el-form-item label="是否通过">
<el-select @change="changeAuditRes" v-model="auditRes"> <el-select @change="changeAuditRes" v-model="auditRes">
<el-option label="通过" value="通过"></el-option> <el-option label="通过" value="通过" />
<el-option label="驳回" value="驳回"></el-option> <el-option label="驳回" value="驳回" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="意见"> <el-form-item label="意见">
<el-input type="textarea" v-model="auditForm.fdyCmt" /> <el-input type="textarea" v-model="auditForm.fdyCmt" />
</el-form-item> </el-form-item>
<el-form-item label="签名"> <el-form-item label="签名">
<el-upload style="display: inline;" :before-upload="boolImg" <el-upload style="display: inline;" :before-upload="boolImg" accept="image/jpg,image/jpeg,image/png,image/bmp" :limit="1" class="avatar-uploader" :action="upload.url" :headers="upload.headers" :show-file-list="false" :file-list="upload.fileList" :on-success="handleAvatarSuccess">
accept="image/jpg,image/jpeg,image/png,image/bmp" :limit="1" class="avatar-uploader" <img v-if="auditForm.fdySign" :src="baseurl + auditForm.fdySign" width="200px" height="50px" class="avatar">
:action="upload.url" :headers="upload.headers" :show-file-list="false"
:file-list="upload.fileList" :on-success="handleAvatarSuccess">
<img v-if="auditForm.fdySign" :src="baseurl + auditForm.fdySign" width="200px"
height="50px" class="avatar">
<span v-else> 点击上传</span> <span v-else> 点击上传</span>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
@@ -84,61 +80,119 @@
</el-form> </el-form>
<hr /> <hr />
<el-timeline> <el-timeline>
<el-timeline-item v-if="lookForm.fdyCmt && lookForm.fdyDate" :timestamp="lookForm.fdyDate" <el-timeline-item v-if="lookForm.fdyCmt && lookForm.fdyDate" :timestamp="lookForm.fdyDate" color="green" placement="top">
color="green" placement="top">
<el-card> <el-card>
<div> <div>
<strong>辅导员审核</strong> <strong>辅导员审核</strong>
<div>{{ lookForm.fdyCmt }}</div> <div>{{ lookForm.fdyCmt }}</div>
<img v-if="lookForm.fdySign" :src="baseurl + lookForm.fdySign" alt="辅导员签名" <img v-if="lookForm.fdySign" :src="baseurl + lookForm.fdySign" alt="辅导员签名" style="max-width:100px;margin-top:8px;" />
style="max-width:100px;margin-top:8px;" />
</div> </div>
</el-card> </el-card>
</el-timeline-item> </el-timeline-item>
<el-timeline-item v-if="lookForm.xwCmt && lookForm.xwDate" :timestamp="lookForm.xwDate" <el-timeline-item v-if="lookForm.xwCmt && lookForm.xwDate" :timestamp="lookForm.xwDate" color="green" placement="top">
color="green" placement="top">
<el-card> <el-card>
<div> <div>
<strong>院系审核</strong> <strong>院系审核</strong>
<div>{{ lookForm.xwCmt }}</div> <div>{{ lookForm.xwCmt }}</div>
<img v-if="lookForm.xwSign" :src="baseurl + lookForm.xwSign" alt="院系签名" <img v-if="lookForm.xwSign" :src="baseurl + lookForm.xwSign" alt="院系签名" style="max-width:100px;margin-top:8px;" />
style="max-width:100px;margin-top:8px;" />
</div> </div>
</el-card> </el-card>
</el-timeline-item> </el-timeline-item>
<el-timeline-item v-if="lookForm.xgCmt && lookForm.xgDate" :timestamp="lookForm.xgDate" <el-timeline-item v-if="lookForm.xgCmt && lookForm.xgDate" :timestamp="lookForm.xgDate" color="green" placement="top">
color="green" placement="top">
<el-card> <el-card>
<div> <div>
<strong>学工审核</strong> <strong>学工审核</strong>
<div>{{ lookForm.xgCmt }}</div> <div>{{ lookForm.xgCmt }}</div>
<img v-if="lookForm.xgSign" :src="baseurl + lookForm.xgSign" alt="学工签名" <img v-if="lookForm.xgSign" :src="baseurl + lookForm.xgSign" alt="学工签名" style="max-width:100px;margin-top:8px;" />
style="max-width:100px;margin-top:8px;" />
</div> </div>
</el-card> </el-card>
</el-timeline-item> </el-timeline-item>
</el-timeline> </el-timeline>
</el-col> </el-col>
</el-row> </el-row>
</el-dialog> </el-dialog>
<!-- 修改数据弹窗 -->
<el-dialog @close="getList" title="修改" :visible.sync="editV" width="900px">
<el-form label-width="200px" size="mini" class="lookForm">
<el-form-item label="入学时间">
<el-input v-model="editForm.inTime" />
</el-form-item>
<el-form-item label="曾获资助/奖励">
<el-input type="textarea" v-model="editForm.helpHis" />
</el-form-item>
<el-form-item label="家庭人口数">
<el-input v-model="editForm.familyNum" />
</el-form-item>
<el-form-item label="家庭月总收入">
<el-input v-model="editForm.monthMoney" />
</el-form-item>
<el-form-item label="人均月收入">
<el-input v-model="editForm.perMoney" />
</el-form-item>
<el-form-item label="收入来源">
<el-input v-model="editForm.moneySrc" />
</el-form-item>
<el-form-item label="成绩专业排名">
<el-input v-model="editForm.majorRank" />
</el-form-item>
<el-form-item label="专业人数">
<el-input v-model="editForm.majorNum" />
</el-form-item>
<el-form-item label="实行综合考评排名">
<el-radio-group v-model="editForm.isCph">
<el-radio :label="'是'"></el-radio>
<el-radio :label="'否'"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="综合考评班级排名">
<el-input v-model="editForm.classRank" />
</el-form-item>
<el-form-item label="班级人数">
<el-input v-model="editForm.classNum" />
</el-form-item>
<el-form-item label="必修课门数">
<el-input v-model="editForm.bxk" />
</el-form-item>
<el-form-item label="及格门数">
<el-input v-model="editForm.jg" />
</el-form-item>
<el-form-item label="申请理由">
<el-input type="textarea" v-model="editForm.applyReason" />
</el-form-item>
<el-form-item label="证明材料">
<FileUpload v-model="editForm.hardFile" />
</el-form-item>
<el-form-item label="申请人签名">
<el-upload style="display: inline;" :before-upload="boolImg"
accept="image/jpg,image/jpeg,image/png,image/bmp" :limit="1" class="avatar-uploader"
:action="upload.url" :headers="upload.headers" :show-file-list="false"
:file-list="upload.fileList" :on-success="handleAvatarSuccess">
<img v-if="editForm.applySign" :src="baseurl + editForm.applySign" width="200px" height="50px"
class="avatar">
<span v-else> 点击上传</span>
</el-upload>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" @click="handleEditSave" plain>提交修改</el-button>
</el-form-item>
</el-form>
</el-dialog>
<!-- 批量审核弹窗 -->
<el-dialog title="批量审核" :visible.sync="manyV" :destroy-on-close="true"> <el-dialog title="批量审核" :visible.sync="manyV" :destroy-on-close="true">
<el-form label-width="120px" size="mini" class="lookForm"> <el-form label-width="120px" size="mini" class="lookForm">
<el-form-item label="是否通过"> <el-form-item label="是否通过">
<el-select @change="changeManyRes" v-model="manyRes"> <el-select @change="changeManyRes" v-model="manyRes">
<el-option label="通过" value="通过"></el-option> <el-option label="通过" value="通过" />
<el-option label="驳回" value="驳回"></el-option> <el-option label="驳回" value="驳回" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="意见"> <el-form-item label="意见">
<el-input type="textarea" v-model="manyCmt" /> <el-input type="textarea" v-model="manyCmt" />
</el-form-item> </el-form-item>
<el-form-item label="签名"> <el-form-item label="签名">
<el-upload style="display: inline;" :before-upload="boolImg" <el-upload style="display: inline;" :before-upload="boolImg" accept="image/jpg,image/jpeg,image/png,image/bmp" :limit="1" class="avatar-uploader" :action="upload.url" :headers="upload.headers" :show-file-list="false" :file-list="upload.fileList" :on-success="handleAvatarSuccess1">
accept="image/jpg,image/jpeg,image/png,image/bmp" :limit="1" class="avatar-uploader"
:action="upload.url" :headers="upload.headers" :show-file-list="false"
:file-list="upload.fileList" :on-success="handleAvatarSuccess1">
<img v-if="manySign" :src="baseurl + manySign" width="200px" height="50px" class="avatar"> <img v-if="manySign" :src="baseurl + manySign" width="200px" height="50px" class="avatar">
<span v-else> 点击上传</span> <span v-else> 点击上传</span>
</el-upload> </el-upload>
@@ -147,43 +201,30 @@
<el-button type="primary" @click="doMany" plain>审核</el-button> <el-button type="primary" @click="doMany" plain>审核</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script>
<script>
import { boolImg, CheckImgExists, isEmpty, fullLoading } from "@/api/helpFunc"; import { boolImg, CheckImgExists, isEmpty, fullLoading } from "@/api/helpFunc";
import { getTokenKeySessionStorage as getToken } from "@/utils/auth"; import { getTokenKeySessionStorage as getToken } from "@/utils/auth";
import GlApply from "@/views/comprehensive/knzzGlApply/cpnt/GlApply.vue"; import GlApply from "@/views/comprehensive/knzzGlApply/cpnt/GlApply.vue";
import GlLook from "@/views/comprehensive/knzzGlApply/cpnt/GlLook.vue"; import GlLook from "@/views/comprehensive/knzzGlApply/cpnt/GlLook.vue";
import { listFdy as listView, doAudit, doMany } from "@/api/comprehensive/knzzGlApply"; import { listFdy as listView, doAudit, doMany, doEdit, getKnzzGlApply } from "@/api/comprehensive/knzzGlApply";
import { getOwnSign } from "@/api/workstudy/post"; import { getOwnSign } from "@/api/workstudy/post";
export default { export default {
name: "gl-fdy", name: "gl-fdy",
dicts: ['knzz_tufa_apply_status'], dicts: ["knzz_tufa_apply_status"],
components: { components: { GlApply, GlLook },
GlApply,
GlLook
},
data() { data() {
return { return {
loading: true, loading: true,
tableData: [], tableData: [],
total: 0, total: 0,
queryParams: { queryParams: { pageNum: 1, pageSize: 10 },
pageNum: 1,
pageSize: 10,
},
lookForm: {}, lookForm: {},
lookV: false, lookV: false,
@@ -235,10 +276,7 @@ export default {
}, },
editV: false, editV: false,
auditForm: { auditForm: { fdySign: "", fdyCmt: "" },
fdySign: "",
fdyCmt: ""
},
auditRes: null, auditRes: null,
upload: { upload: {
@@ -256,8 +294,8 @@ export default {
manyRes: null, manyRes: null,
manySign: "", manySign: "",
lookBiyeV: false, lookBiyeV: false,
lookBiyeUrl: '' lookBiyeUrl: ""
} };
}, },
created() { created() {
this.getList(); this.getList();
@@ -265,23 +303,23 @@ export default {
}, },
methods: { methods: {
getFileName(path) { getFileName(path) {
if (!path) return ''; if (!path) return "";
return path.split('/').pop(); return path.split("/").pop();
}, },
downloadDiploma() { downloadDiploma() {
const raw = this.lookForm.hardFile; const raw = this.lookForm.hardFile;
if (!raw) return; if (!raw) return;
// 支持逗号分隔的多个文件 // 支持逗号分隔的多个文件
const files = String(raw) const files = String(raw)
.split(',') .split(",")
.map(s => s.trim()) .map((s) => s.trim())
.filter(Boolean); .filter(Boolean);
const triggerDownload = (href, filename) => { const triggerDownload = (href, filename) => {
const link = document.createElement('a'); const link = document.createElement("a");
link.href = href; link.href = href;
// 设置下载文件名(跨域时可能被浏览器忽略,但不影响触发下载/打开) // 设置下载文件名(跨域时可能被浏览器忽略,但不影响触发下载/打开)
link.download = filename || ''; link.download = filename || "";
document.body.appendChild(link); document.body.appendChild(link);
link.click(); link.click();
document.body.removeChild(link); document.body.removeChild(link);
@@ -296,10 +334,8 @@ export default {
}); });
}, },
lookBiye() { lookBiye() {
const isAbsoluteUrl = this.lookForm.hardFile.startsWith('http'); const isAbsoluteUrl = this.lookForm.hardFile.startsWith("http");
const pdfUrl = isAbsoluteUrl const pdfUrl = isAbsoluteUrl ? this.lookForm.hardFile : `${this.baseurl}${this.lookForm.hardFile}`;
? this.lookForm.hardFile
: `${this.baseurl}${this.lookForm.hardFile}`;
this.lookBiyeUrl = pdfUrl; this.lookBiyeUrl = pdfUrl;
this.lookBiyeV = true; this.lookBiyeV = true;
}, },
@@ -318,17 +354,17 @@ export default {
}, },
changeManyRes(v) { changeManyRes(v) {
switch (v) { switch (v) {
case '通过': case "通过":
this.manyStatus = 2; this.manyStatus = 2;
this.manyCmt = '同意推荐该同学申请国家励志奖学金。'; this.manyCmt = "同意推荐该同学申请国家励志奖学金。";
break; break;
case '驳回': case "驳回":
this.manyStatus = 10; this.manyStatus = 10;
this.manyCmt = '驳回,驳回原因:'; this.manyCmt = "驳回,驳回原因:";
break; break;
default: default:
this.manyStatus = null; this.manyStatus = null;
this.manyCmt = ''; this.manyCmt = "";
break; break;
} }
}, },
@@ -354,13 +390,8 @@ export default {
return; return;
} }
let sdata = []; let sdata = [];
this.ids.map(x => { this.ids.map((x) => {
let temp = { let temp = { id: x, applyStatus: this.manyStatus, fdyCmt: this.manyCmt, fdySign: this.manySign };
id: x,
applyStatus: this.manyStatus,
fdyCmt: this.manyCmt,
fdySign: this.manySign
};
sdata.push(temp); sdata.push(temp);
}); });
let loading = fullLoading(this); let loading = fullLoading(this);
@@ -372,10 +403,9 @@ export default {
this.getList(); this.getList();
this.ids = []; this.ids = [];
} }
}, },
handleSelectionChange(selection) { handleSelectionChange(selection) {
this.ids = selection.map(item => item.id) this.ids = selection.map((item) => item.id);
}, },
async doNext() { async doNext() {
this.loading = true; this.loading = true;
@@ -412,6 +442,24 @@ export default {
this.lookV = false; this.lookV = false;
await this.doNext(); await this.doNext();
} }
},
async handleEditSave() {
const sdata = { ...this.editForm };
const loading = fullLoading(this);
const res =await doEdit(sdata);
loading.close();
if (res.code == 200) {
this.$message.success("保存成功");
if (this.editV) {
this.editForm = { ...this.editForm, ...payload };
this.editV = false;
} else {
this.lookForm = { ...this.lookForm, ...payload };
}
this.getList();
} else {
this.$message.error(res.msg || "保存失败");
}
}, },
async getOwnSign() { async getOwnSign() {
@@ -419,22 +467,21 @@ export default {
if (res.code == 200) { if (res.code == 200) {
let data = { ...res.data }; let data = { ...res.data };
if (isEmpty(data.signature)) { if (isEmpty(data.signature)) {
this.$confirm('您的签名尚未上传', '提示', { this.$confirm("您的签名尚未上传", "提示", {
confirmButtonText: '点我前往', confirmButtonText: "点我去设置",
cancelButtonText: '取消', cancelButtonText: "取消",
type: 'warning' type: "warning",
}).then(() => { })
this.$router.push("/user/profile") .then(() => {
}).catch(() => { this.$router.push("/user/profile");
})
}); .catch(() => {});
} else { } else {
this.auditForm.fdySign = data.signature; this.auditForm.fdySign = data.signature;
this.manySign = data.signature; this.manySign = data.signature;
} }
} }
}, },
handleAvatarSuccess(response, file, fileList) { handleAvatarSuccess(response, file, fileList) {
this.auditForm.fdySign = response.fileName; this.auditForm.fdySign = response.fileName;
this.upload.fileList = []; this.upload.fileList = [];
@@ -448,42 +495,54 @@ export default {
this.tableData = [...res.rows]; this.tableData = [...res.rows];
this.total = res.total; this.total = res.total;
} }
}, },
async lookVClick(row) { async lookVClick(row) {
this.auditRes = null; this.auditRes = null;
this.lookForm = {}; this.lookForm = {};
this.lookForm = { ...row }; this.lookForm = { ...row };
this.auditForm = { this.auditForm = { fdySign: "", fdyCmt: "" };
fdySign: "",
fdyCmt: ""
};
this.auditForm.id = row.id; this.auditForm.id = row.id;
await this.getOwnSign(); await this.getOwnSign();
this.lookV = true; this.lookV = true;
}, },
async openEdit(row) {
// 先拉取详情,保证 GlApply 在 created 中能拿到完整的 formData
const loading = fullLoading(this);
try {
const res = await getKnzzGlApply(row.id);
if (res.code === 200) {
// 直接使用后端返回的完整数据作为编辑表单数据
this.editForm = { ...res.data };
this.editV = true;
} else {
this.$message.error(res.msg || "获取详情失败");
}
} catch (e) {
this.$message.error("获取详情异常,请稍后重试");
} finally {
loading.close();
}
},
changeAuditRes(v) { changeAuditRes(v) {
switch (v) { switch (v) {
case '通过': case "通过":
this.auditForm.applyStatus = 2; this.auditForm.applyStatus = 2;
this.auditForm.fdyCmt = '同意推荐该同学申请国家励志奖学金。'; this.auditForm.fdyCmt = "同意推荐该同学申请国家励志奖学金。";
break; break;
case '驳回': case "驳回":
this.auditForm.applyStatus = 10; this.auditForm.applyStatus = 10;
this.auditForm.fdyCmt = '驳回,驳回原因:'; this.auditForm.fdyCmt = "驳回:请完善信息后再申请。";
break; break;
default: default:
this.auditForm.applyStatus = null; this.auditForm.applyStatus = null;
this.auditForm.fdyCmt = ''; this.auditForm.fdyCmt = "";
break; break;
} }
} },
},
} };
}
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.lookForm { .lookForm {
.el-form-item { .el-form-item {