This commit is contained in:
ycy 2024-04-10 15:07:30 +08:00
commit 0d0c7de975
12 changed files with 1470 additions and 181 deletions

View File

@ -5,20 +5,20 @@ const student = Mock.mock({
{ {
"Id|+1": 1, "Id|+1": 1,
"name": "@cname", "name": "@cname",
"gender":`@pick(['男', '女'])`, "gender": `@pick(['男', '女'])`,
"studentId": "@integer(1000000000,9999999999)", "studentId": "@integer(1000000000,9999999999)",
"department":`@pick(['机电工程系', '护理分院','建筑系','材料科学与工程系','环境科学与工程系'])`, "department": `@pick(['机电工程系', '护理分院','建筑系','材料科学与工程系','环境科学与工程系'])`,
"major":`@pick(['机械制造与自动化', '材料科学与工程', '环境科学与工程', '建筑工程', '护理学'])`, "major": `@pick(['机械制造与自动化', '材料科学与工程', '环境科学与工程', '建筑工程', '护理学'])`,
"classes":`@pick(['机制1班', '材料1班', '环境1班', '建筑1班','护理1班'])`, "classes": `@pick(['机制1班', '材料1班', '环境1班', '建筑1班','护理1班'])`,
"status":`@pick(['休学', '退学', '复学'])`, "status": `@pick(['休学', '退学', '复学'])`,
}, },
], ],
}); });
export default [ export default [
{ {
url:'/api-list', url: '/api-list',
method:'get', method: 'get',
response: () => { response: () => {
return { return {
code: 200, code: 200,
@ -26,6 +26,47 @@ const student = Mock.mock({
} }
} }
}, },
{
url: '/api-updateStudent',
method: 'post',
response: (req) => {
if (req.body.name !== '') {
return student.list.filter(item => item.name.includes(req.body.name))
}
else if (req.body.studentId !== '') {
const studentId = Number(req.body.studentId)
if (!isNaN(studentId)) {
return student.list.filter(item => item.studentId === studentId)
} else {
return {
code: 400,
message: 'Invalid student number format'
}
}
}
else if (req.body.name !== '') {
return student.list.filter(item => item.name.includes(req.body.name))
}
else if (req.body.gender !== '') {
return student.list.filter(item => item.gender.includes(req.body.gender))
}
else if (req.body.department !== '') {
return student.list.filter(item => item.grade.includes(req.body.department))
}
else if (req.body.major !== '') {
return student.list.filter(item => item.major.includes(req.body.major))
}
else if (req.body.classes !== '') {
return student.list.filter(item => item.classes.includes(req.body.classes))
}
else if (req.body.status !== '') {
return student.list.filter(item => item.major.includes(req.body.status))
}
return {
code: 200,
}
}
},
{ {
url: '/api-student', url: '/api-student',
method: 'post', method: 'post',
@ -67,4 +108,4 @@ const student = Mock.mock({
} }
} }
} }
] ]

View File

@ -44,6 +44,7 @@ const daily = Mock.mock({
}) })
export default [ export default [
//应收管理列表
{ {
url: '/get-sdy-managment-list', url: '/get-sdy-managment-list',
method: 'get', method: 'get',
@ -54,6 +55,7 @@ export default [
} }
} }
}, },
// 应收管理搜索
{ {
url: '/post-sdy-managment-find', url: '/post-sdy-managment-find',
method: 'post', method: 'post',
@ -100,6 +102,25 @@ export default [
} }
} }
}, },
// 借款管理搜索
{
url: '/post-sdy-loan-find',
method: 'post',
response: (req) => {
if (req.body.name !== '') {
const arr = loans.list.filter(item => item.proposer.includes(req.body.name))
return arr
} else if (req.body.studentnumber !== '') {
const studentnumber = Number(req.body.studentnumber)
const arr = loans.list.filter(item => item.student === studentnumber)
return arr
}
return {
code: 200,
data: arr
}
}
},
// 添加借款人 // 添加借款人
{ {
url: '/post-sdy-loan-add', url: '/post-sdy-loan-add',
@ -122,6 +143,7 @@ export default [
} }
} }
}, },
// 当日明细列表
{ {
url: '/post-sdy-daily-list', url: '/post-sdy-daily-list',
method: 'get', method: 'get',
@ -132,4 +154,5 @@ export default [
} }
} }
} }
] ]

914
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,10 @@ export function APILoansList() {
return request.get('/get-sdy-loan-list') return request.get('/get-sdy-loan-list')
} }
//查询贷款 //查询贷款
export function APILoansFind(data) {
return request.post('/post-sdy-loan-find', data)
}
//添加贷款
export function APILoansAdd(data) { export function APILoansAdd(data) {
return request.post('/post-sdy-loan-add', data) return request.post('/post-sdy-loan-add', data)
} }

View File

@ -6,3 +6,7 @@ export function getList() {
export function getStudents(studentData) { export function getStudents(studentData) {
return request.post('/api-student', studentData) return request.post('/api-student', studentData)
} }
export function updateStudent(updateStudent) {
return request.post('/api-updateStudent', updateStudent)
}

View File

@ -52,7 +52,10 @@
<span>助学贷款</span> <span>助学贷款</span>
</t-menu-item> </t-menu-item>
<t-menu-item value="3-4" to="/daily"> <t-menu-item value="3-4" to="/daily">
<span>收费日报</span> <span>收费日报及收费明细</span>
</t-menu-item>
<t-menu-item value="3-5" to="/charge-schedule">
<span>学生催款单</span>
</t-menu-item> </t-menu-item>
</t-submenu> </t-submenu>
<t-submenu value="4" title="学生管理"> <t-submenu value="4" title="学生管理">

View File

@ -90,6 +90,11 @@
</template> </template>
</t-table> </t-table>
</div> </div>
<div>
<t-button style="margin-top: 1rem" type="primary" @click="handleExport"
>导出excel表格</t-button
>
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
@ -99,6 +104,7 @@ import {
APIReceivablesAdd APIReceivablesAdd
} from '@/api/receivables-management/management' } from '@/api/receivables-management/management'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { ExcelUtils } from '@/utils/excel'
const router = useRouter() const router = useRouter()
// //
const formData = reactive({ const formData = reactive({
@ -265,6 +271,31 @@ const hreturn = row => {
path: 'bill-bill' path: 'bill-bill'
}) })
} }
//excel
const handleExport = () => {
const title = '报表明细excel'
const titleFile = '报表明细'
const columns = [
{ header: '姓名', key: '1', width: 20 },
{ header: '学号', key: '2', width: 20 },
{ header: '部门', key: '3', width: 20 },
{ header: '专业', key: '4', width: 20 },
{ header: '班级', key: '5', width: 20 },
{ header: '是否缴费', key: '6', width: 20 }
]
const addRow = []
tableData.value.forEach(item => {
addRow.push({
1: item.name,
2: item.studentnumber,
3: item.department,
4: item.major,
5: item.grade,
6: item.tuition
})
})
ExcelUtils(title, titleFile, columns, addRow)
}
onMounted(() => { onMounted(() => {
ReceivablesList() ReceivablesList()
}) })

View File

@ -0,0 +1,7 @@
<template>
<div>1</div>
</template>
<script setup></script>
<style lang="less" scoped></style>

View File

@ -11,7 +11,7 @@
/> />
</div> </div>
<div class="table"> <div class="table">
<div>1</div> <div>收费日报表</div>
<t-table <t-table
row-key="id" row-key="id"
:data="tableData" :data="tableData"
@ -21,7 +21,64 @@
:pagination="pagination" :pagination="pagination"
:show-header="true" :show-header="true"
cell-empty-content="-" cell-empty-content="-"
max-height="500" max-height="550"
lazy-load
@row-click="handleRowClick"
@page-change="onPageChange"
:loading="loading"
>
</t-table>
</div>
<div class="table">
<div>减免明细表</div>
<t-table
row-key="id"
:data="tableData"
:columns="columns"
:hover="true"
table-layout="auto"
:pagination="pagination"
:show-header="true"
cell-empty-content="-"
max-height="550"
lazy-load
@row-click="handleRowClick"
@page-change="onPageChange"
:loading="loading"
>
</t-table>
</div>
<div class="table">
<div>退费明细表</div>
<t-table
row-key="id"
:data="tableData"
:columns="columns"
:hover="true"
table-layout="auto"
:pagination="pagination"
:show-header="true"
cell-empty-content="-"
max-height="550"
lazy-load
@row-click="handleRowClick"
@page-change="onPageChange"
:loading="loading"
>
</t-table>
</div>
<div class="table">
<div>学生欠费明细表</div>
<t-table
row-key="id"
:data="tableData"
:columns="columns"
:hover="true"
table-layout="auto"
:pagination="pagination"
:show-header="true"
cell-empty-content="-"
max-height="550"
lazy-load lazy-load
@row-click="handleRowClick" @row-click="handleRowClick"
@page-change="onPageChange" @page-change="onPageChange"

View File

@ -50,7 +50,7 @@
:pagination="pagination" :pagination="pagination"
:show-header="true" :show-header="true"
cell-empty-content="-" cell-empty-content="-"
resizable max-height="550"
lazy-load lazy-load
:loading="loading" :loading="loading"
@row-click="handleRowClick" @row-click="handleRowClick"
@ -124,7 +124,8 @@
import { ref, onMounted } from 'vue' import { ref, onMounted } from 'vue'
import { import {
APILoansList, APILoansList,
APILoansAdd APILoansAdd,
APILoansFind
} from '@/api/receivables-management/management' } from '@/api/receivables-management/management'
import * as echarts from 'echarts' import * as echarts from 'echarts'
// //
@ -149,6 +150,7 @@ const columns = ref([
// //
const pagination = ref({ const pagination = ref({
defaultCurrent: 1, defaultCurrent: 1,
current: 1,
defaultPageSize: 10, defaultPageSize: 10,
total: 30 total: 30
}) })
@ -174,7 +176,8 @@ const handleRowClick = e => {
console.log(e) console.log(e)
} }
// //
const onPageChange = () => { const onPageChange = pageInfo => {
pagination.value.current = pageInfo.current
loading.value = true loading.value = true
const timerId = setTimeout(() => { const timerId = setTimeout(() => {
loading.value = false loading.value = false
@ -186,13 +189,33 @@ const LoansList = async () => {
const res = await APILoansList() const res = await APILoansList()
data.value = res.data.list data.value = res.data.list
pagination.value.total = res.data.list.length pagination.value.total = res.data.list.length
pagination.value.current = 1
} }
// //
const onReset = () => { const onReset = () => {
loading.value = true
LoansList() LoansList()
const timerId = setTimeout(() => {
loading.value = false
clearInterval(timerId)
}, 300)
} }
// //
const onSubmit = async () => {} const onSubmit = async () => {
console.log('表单提交', formData.value)
if (formData.value.name !== '') {
const res = await APILoansFind(formData.value)
data.value = res
pagination.value.total = res.data.length
pagination.value.current = 1
}
if (formData.value.studentnumber !== '') {
const res = await APILoansFind(formData.value)
data.value = res
pagination.value.total = res.data.length
pagination.value.current = 1
}
}
// //
const onClick = context => { const onClick = context => {
console.log('点击了确认按钮,弹出弹窗', context) console.log('点击了确认按钮,弹出弹窗', context)

View File

@ -22,17 +22,30 @@
</t-form-item> </t-form-item>
</t-col> </t-col>
<t-col :push="2" :span="4"> <t-col :push="2" :span="4">
<t-button theme="primary" type="submit" <t-button theme="primary" type="submit">查询</t-button>
>查询</t-button <t-button
> theme="default"
<t-button theme="default" variant="base" type="reset" variant="base"
style="margin-left: 1rem;">重置</t-button type="reset"
style="margin-left: 1rem"
>重置</t-button
> >
</t-col> </t-col>
</t-row> </t-row>
</t-form> </t-form>
</t-header> </t-header>
<t-content class="table-box"> <t-content class="table-box">
<div class="table-header">
<div>
<h4 style="font-size: 110%">学生列表</h4>
</div>
<div>
<t-button theme="primary" size="small" style="margin-right:2.5rem" @click="onAddSubmit">
<template #icon><add-icon /></template>
增加学员信息
</t-button>
</div>
</div>
<t-table <t-table
rowKey="Id" rowKey="Id"
:data="studentList" :data="studentList"
@ -59,10 +72,7 @@
@click="Modify(row)" @click="Modify(row)"
>修改</t-button >修改</t-button
> >
<t-popconfirm <t-popconfirm content="确认删除吗" @confirm="Delete(row)">
content="确认删除吗"
@confirm="Delete(row)"
>
<t-button theme="default" variant="text" size="small" <t-button theme="default" variant="text" size="small"
>删除</t-button >删除</t-button
> >
@ -71,46 +81,66 @@
</t-table> </t-table>
</t-content> </t-content>
</t-layout> </t-layout>
<t-space> <t-space>
<t-dialog <t-dialog
ref="postForm"
v-model="visible" v-model="visible"
header="学生变动处理" header="学生变动处理"
width="40%" width="40%"
:confirm-on-enter="true"
:on-cancel="onCancel" :on-cancel="onCancel"
:on-esc-keydown="onEscKeydown"
:on-close-btn-click="onCloseBtnClick" :on-close-btn-click="onCloseBtnClick"
:on-overlay-click="onOverlayClick"
:on-close="close"
:on-confirm="onConfirmAnother" :on-confirm="onConfirmAnother"
:close-on-overlay-click="false" ref="postForm"
> >
<t-space direction="vertical" style="width: 100%"> <t-space direction="vertical" style="width: 100%">
<div> <div>
<t-form <t-form
ref="form" ref="form"
:data="formData" :data="dialogData"
reset-type="initial" reset-type="initial"
colon colon
@reset="onReset" @reset="onReset"
> >
<t-form-item label="姓名" name="name"> <t-form-item label="姓名" name="name">
<t-input v-model="formData.name"></t-input> <t-input v-model="dialogData.name"></t-input>
</t-form-item> </t-form-item>
<t-form-item label="性别" name="gender"> <t-form-item label="性别" name="gender">
<t-input v-model="formData.gender"></t-input> <t-input v-model="dialogData.gender"></t-input>
</t-form-item> </t-form-item>
<t-form-item label="学号" name="studentId"> <t-form-item label="学号" name="studentId">
<t-input v-model="formData.studentId"></t-input> <t-input v-model="dialogData.studentId"></t-input>
</t-form-item> </t-form-item>
<t-form-item label="系院" name="department"> <t-form-item label="系院" name="department">
<t-input v-model="formData.department"></t-input> <t-input v-model="dialogData.department"></t-input>
</t-form-item> </t-form-item>
<t-form-item label="专业" name="major"> <t-form-item label="专业" name="major">
<t-input v-model="formData.major"></t-input> <t-input v-model="dialogData.major"></t-input>
</t-form-item> </t-form-item>
<t-form-item label="班级" name="classes"> <t-form-item label="班级" name="classes">
<t-input v-model="formData.classes"></t-input> <t-input v-model="dialogData.classes"></t-input>
</t-form-item> </t-form-item>
<t-form-item label="状态" name="status"> <t-form-item
<t-input v-model="formData.status"></t-input> label="状态"
name="status"
:span="12"
style="width: 16rem; margin-bottom: 0.5rem"
>
<t-select
v-model="dialogData.status"
clearable
placeholder="请选择状态"
>
<t-option
v-for="item in status"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</t-select>
</t-form-item> </t-form-item>
</t-form> </t-form>
</div> </div>
@ -118,12 +148,77 @@
</t-dialog> </t-dialog>
</t-space> </t-space>
<!-- <t-space>
<t-dialog
v-model:visible="visible"
header="新增学生信息"
width="40%"
:confirm-on-enter="true"
:on-cancel="onCancel"
:on-esc-keydown="onEscKeydown"
:on-close-btn-click="onCloseBtnClick"
:on-overlay-click="onOverlayClick"
:on-close="close"
:on-confirm="onConfirmAnother"
ref="postForm"
>
<t-space direction="vertical" style="width: 100%">
<div>
<t-form
ref="form"
:data="AddDialogData"
reset-type="initial"
colon
@reset="onReset"
>
<t-form-item label="姓名" name="name">
<t-input v-model="AddDialogData.name"></t-input>
</t-form-item>
<t-form-item label="性别" name="gender">
<t-input v-model="AddDialogData.gender"></t-input>
</t-form-item>
<t-form-item label="学号" name="studentId">
<t-input v-model="AddDialogData.studentId"></t-input>
</t-form-item>
<t-form-item label="系院" name="department">
<t-input v-model="AddDialogData.department"></t-input>
</t-form-item>
<t-form-item label="专业" name="major">
<t-input v-model="AddDialogData.major"></t-input>
</t-form-item>
<t-form-item label="班级" name="classes">
<t-input v-model="AddDialogData.classes"></t-input>
</t-form-item>
<t-form-item
label="状态"
name="status"
:span="12"
style="width: 16rem; margin-bottom: 0.5rem"
>
<t-select
v-model="AddDialogData.status"
clearable
placeholder="请选择状态"
>
<t-option
v-for="item in status"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</t-select>
</t-form-item>
</t-form>
</div>
</t-space>
</t-dialog>
</t-space> -->
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, reactive, computed, onMounted } from "vue"; import { ref, reactive, computed, onMounted } from "vue";
import {getList, getStudents } from "@/api/students"; import { getList, getStudents, updateStudent } from "@/api/students";
import { MessagePlugin } from "tdesign-vue-next"; import { MessagePlugin } from "tdesign-vue-next";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
// import { reqStudent } from "@/api/students"; // import { reqStudent } from "@/api/students";
@ -131,7 +226,7 @@ import { useRouter } from "vue-router";
const router = useRouter(); const router = useRouter();
const studentData = reactive({ const studentData = reactive({
Id:"", Id: "",
name: "", name: "",
gender: "", gender: "",
studentId: "", studentId: "",
@ -142,7 +237,7 @@ const studentData = reactive({
}); });
// //
const formData = ref({ const dialogData = ref({
name: "", name: "",
gender: "", gender: "",
studentId: "", studentId: "",
@ -150,8 +245,19 @@ const formData = ref({
major: "", major: "",
classes: "", classes: "",
status: "", status: "",
}) });
const visible = ref(true)
// const AddDialogData = ref({
// name: "",
// gender: "",
// studentId: "",
// department: "",
// major: "",
// classes: "",
// status: "",
// });
const visible = ref(false);
const studentList = ref([]); const studentList = ref([]);
const studentColumns = ref([ const studentColumns = ref([
@ -190,7 +296,7 @@ const studentColumns = ref([
{ {
colKey: "operation", colKey: "operation",
title: "操作", title: "操作",
align: "center" align: "center",
}, },
]); ]);
@ -223,27 +329,32 @@ const onSubmit = async () => {
// //
const onReset = () => { const onReset = () => {
TableData() TableData();
} };
const status = ref([
{ label: "休学", value: 0 },
{ label: "退学", value: 1 },
{ label: "复学", value: 2 },
]);
// //
const TableData = async () => { const TableData = async () => {
const res = await getList() const res = await getList();
// console.log(res); // console.log(res);
studentList.value = res.data.list studentList.value = res.data.list;
pagination.total = res.data.list.length pagination.total = res.data.list.length;
} };
console.log(TableData.name);
onMounted(() => { onMounted(() => {
TableData() TableData();
}) });
// //
const Modify = row => { const Modify = (row) => {
conlose.log(1) console.log("点击了确认按钮,弹出弹窗", row);
visible.value = true; visible.value = true;
formData.value = { dialogData.value = {
name: row.name, name: row.name,
gender: row.gender, gender: row.gender,
studentId: row.studentId, studentId: row.studentId,
@ -254,16 +365,85 @@ const Modify = row => {
}; };
}; };
// const onConfirmAnother = async () => {
// console.log("", );
// visible.value = false;
// await updateStudent(dialogData.value)
// };
const onConfirmAnother = async () => { const onConfirmAnother = async () => {
console.log("点击了确认按钮");
//
const studentId = dialogData.value.studentId;
//
try { try {
// APIupdateStudent const response = await updateStudent({ ...dialogData.value, studentId });
await updateStudent(formData.value); //
// if (response.success) {
visible.value = false; //
TableData(); const index = studentList.value.findIndex(
} catch (error) { (stu) => stu.studentId === studentId
console.error('更新学生信息失败:', error); );
if (index !== -1) {
studentList.value.splice(index, 1, dialogData.value);
} }
MessagePlugin.success("学生信息更新成功");
} else {
MessagePlugin.error(response.message || "学生信息更新失败");
}
} catch (error) {
console.error("更新学生信息时发生错误", error);
MessagePlugin.error("学生信息更新失败");
}
//
visible.value = false;
};
const Delete = async (row) => {
try {
// APIdeleteStudentID
const response = await deleteStudent(row.studentId);
if (response.success) {
//
const index = studentList.value.findIndex((stu) => stu.studentId === row.studentId);
if (index !== -1) {
studentList.value.splice(index, 1);
}
pagination.total -= 1;
//
MessagePlugin.success('学生信息删除成功');
} else {
//
MessagePlugin.error(response.message || '学生信息删除失败');
}
} catch (error) {
console.error('删除学生信息时发生错误', error);
MessagePlugin.error('学生信息删除失败');
}
};
const onAddSubmit = () =>{
console.log("点击新增");
visible.value = true;
}
const close = (context) => {
console.log("关闭弹窗点击关闭按钮、按下ESC、点击蒙层等触发", context);
};
const onCancel = (context) => {
console.log("点击了取消按钮", context);
};
const onEscKeydown = (context) => {
console.log("按下了ESC", context);
};
const onCloseBtnClick = (context) => {
console.log("点击了关闭按钮", context);
};
const onOverlayClick = (context) => {
console.log("点击了蒙层", context);
}; };
</script> </script>

View File

@ -42,7 +42,13 @@ const ReceivablesManagement = [
path: "/daily", path: "/daily",
name: "Daily", name: "Daily",
component: () => import("@/pages/receivables-management/daily.vue"), component: () => import("@/pages/receivables-management/daily.vue"),
meta: { title: "收费日报", }, meta: { title: "收费日报及收费明细", },
},
{
path: "/charge-schedule",
name: "ChargeSchedule",
component: () => import("@/pages/receivables-management/chargeSchedule.vue"),
meta: { title: "学生催款单", },
} }
], ],
}, },