From ae216140dcae830b4ad818903ac19c9cf09f9260 Mon Sep 17 00:00:00 2001 From: ycy <2861518472@qq.com> Date: Tue, 9 Apr 2024 17:18:01 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E2=9C=A8=20feat:=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=BC=E5=87=BAexcel=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 ++ .../finance-bill-manage/detailReport.vue | 32 +++++++++++++++++++ src/utils/excel.js | 24 ++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 src/utils/excel.js diff --git a/package.json b/package.json index a027f07..beb66d2 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,8 @@ "axios": "^1.6.8", "dayjs": "^1.11.10", "echarts": "^5.5.0", + "exceljs": "^4.4.0", + "file-saver": "^2.0.5", "less": "^4.2.0", "mockjs": "^1.1.0", "pinia": "^2.1.7", diff --git a/src/pages/finance-bill-manage/detailReport.vue b/src/pages/finance-bill-manage/detailReport.vue index e25e79e..578b0b7 100644 --- a/src/pages/finance-bill-manage/detailReport.vue +++ b/src/pages/finance-bill-manage/detailReport.vue @@ -29,6 +29,9 @@

报表明细

+ + 导出报表明细 + { const refresh = () => { tableList(); }; + +// 导出excel +const exportExcel = () => { + 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 }, + { header: "总票据比例", key: "7", width: 20 }, + ]; + const addRow = []; + tableData.value.forEach((item) => { + addRow.push({ + 1: item.branch, + 2: item.stockNum, + 3: item.cancelNum, + 4: item.receiveNum, + 5: item.breakNum, + 6: item.destoryNum, + 7: item.grossBillRatio, + }); + }); + ExcelUtils(title, titleFile, columns, addRow); +}; onMounted(() => { tableList(); }); diff --git a/src/utils/excel.js b/src/utils/excel.js new file mode 100644 index 0000000..17e7935 --- /dev/null +++ b/src/utils/excel.js @@ -0,0 +1,24 @@ +import ExcelJS from "exceljs"; +import saveAs from "file-saver"; // 引入FileSaver.js以使用saveAs函数 + +const ExcelUtils = (title, titleFile, columns, addRow) => { + // 创建一个新的工作簿 + const workbook = new ExcelJS.Workbook(); + // 添加一个新的工作表 + const worksheet = workbook.addWorksheet(title); + // 添加表头 + worksheet.columns = columns; + // 添加数据行 + for (const row of addRow) { + worksheet.addRow(row); + } + // 写入文件并下载 + workbook.xlsx.writeBuffer().then((buffer) => { + const blob = new Blob([buffer], { + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }); + saveAs(blob, `${titleFile}.xlsx`); + }); +}; + +export { ExcelUtils }; From fba8df4041aad8d2ab21d1c27390c483841ad187 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=89=8D=E5=8D=93?= <2284808383@qq.com> Date: Tue, 9 Apr 2024 17:35:48 +0800 Subject: [PATCH 2/3] stu --- mock/modules/lcz.js | 70 +++++++ src/api/login.js | 2 +- src/api/students.js | 13 +- src/pages/login/index.vue | 8 +- src/pages/students/student.vue | 337 +++++++++++++++++++++++---------- 5 files changed, 317 insertions(+), 113 deletions(-) create mode 100644 mock/modules/lcz.js diff --git a/mock/modules/lcz.js b/mock/modules/lcz.js new file mode 100644 index 0000000..19e4c97 --- /dev/null +++ b/mock/modules/lcz.js @@ -0,0 +1,70 @@ +import Mock from "mockjs" + +const student = Mock.mock({ + "list|100": [ + { + "Id|+1": 1, + "name": "@cname", + "gender":`@pick(['男', '女'])`, + "studentId": "@integer(1000000000,9999999999)", + "department":`@pick(['机电工程系', '护理分院','建筑系','材料科学与工程系','环境科学与工程系'])`, + "major":`@pick(['机械制造与自动化', '材料科学与工程', '环境科学与工程', '建筑工程', '护理学'])`, + "classes":`@pick(['机制1班', '材料1班', '环境1班', '建筑1班','护理1班'])`, + "status":`@pick(['休学', '退学', '复学'])`, + }, + ], + }); + + export default [ + { + url:'/api-list', + method:'get', + response: () => { + return { + code: 200, + data: student + } + } + }, + { + url: '/api-student', + 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, + } + } + } + ] \ No newline at end of file diff --git a/src/api/login.js b/src/api/login.js index 9efab9a..3bde586 100644 --- a/src/api/login.js +++ b/src/api/login.js @@ -5,4 +5,4 @@ const API = { }; export const reqUser = () => request.post(API.LOGIN_URL); -export const reqUserone = (data) => request.post(API.LOGIN_URL, data); \ No newline at end of file +// export const reqUserone = (data) => request.post(API.LOGIN_URL, data); \ No newline at end of file diff --git a/src/api/students.js b/src/api/students.js index b85d7e0..0bc246a 100644 --- a/src/api/students.js +++ b/src/api/students.js @@ -1,7 +1,8 @@ -import request from "@/utils/request"; -// 统一管理接口 -const API = { - STUDENT_URL: "/api/student", -}; +import request from '@/utils/request' -export const reqStudent = () => request.post(API.STUDENT_URL); \ No newline at end of file +export function getList() { + return request.get('/api-list') +} +export function getStudents(studentData) { + return request.post('/api-student', studentData) +} \ No newline at end of file diff --git a/src/pages/login/index.vue b/src/pages/login/index.vue index e95ce92..a987da9 100644 --- a/src/pages/login/index.vue +++ b/src/pages/login/index.vue @@ -55,7 +55,7 @@ import { MessagePlugin } from "tdesign-vue-next"; import { reactive, ref, onMounted } from "vue"; import { reqUser } from "@/api/login"; import { useRouter } from "vue-router"; -import axios from 'axios'; +// import axios from 'axios'; // import { TForm, TFormItem, TInput, TButton } from "tdesign-vue-next"; // import { DesktopIcon, LockOnIcon } from "tdesign-icons-vue"; @@ -103,7 +103,11 @@ onMounted(() => { const onSubmit = async () => { try { - const validateResult = await from.value?.validate(); + if (!form || !form.value) { + console.warn("form 或 form.value 不存在,无法进行表单验证"); + return; + } + const validateResult = await form.value?.validate(); if (validateResult?.result) { await reqUser(formData.account, formData.password); MessagePlugin.success("提交成功"); diff --git a/src/pages/students/student.vue b/src/pages/students/student.vue index dad652e..96d80dd 100644 --- a/src/pages/students/student.vue +++ b/src/pages/students/student.vue @@ -1,146 +1,275 @@ From a2b2a66c315a0ef75b1c651353988d851b350b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=95=E6=89=8D=E5=8D=93?= <2284808383@qq.com> Date: Tue, 9 Apr 2024 18:05:19 +0800 Subject: [PATCH 3/3] stu --- src/pages/students/student.vue | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/pages/students/student.vue b/src/pages/students/student.vue index 96d80dd..af3d510 100644 --- a/src/pages/students/student.vue +++ b/src/pages/students/student.vue @@ -151,7 +151,7 @@ const formData = ref({ classes: "", status: "", }) -const visible = ref(false) +const visible = ref(true) const studentList = ref([]); const studentColumns = ref([ @@ -213,7 +213,7 @@ const onSubmit = async () => { studentData.status ) { const res = await getStudents(studentData); - console.log(res); + // console.log(res); studentList.value = Array.from(res); pagination.total = res.length; } else { @@ -229,10 +229,11 @@ const onReset = () => { //获取表格数据 const TableData = async () => { const res = await getList() - console.log(res); + // console.log(res); studentList.value = res.data.list pagination.total = res.data.list.length } +console.log(TableData.name); onMounted(() => { TableData() @@ -240,11 +241,30 @@ onMounted(() => { // 修改学生状态 const Modify = row => { - visible.value = true + conlose.log(1) + visible.value = true; formData.value = { - name: row.label, + name: row.name, + gender: row.gender, + studentId: row.studentId, + department: row.department, + major: row.major, + classes: row.classes, + status: row.status, + }; +}; + +const onConfirmAnother = async () => { + try { + // 这里假设存在一个更新学生信息的API方法,例如updateStudent + await updateStudent(formData.value); + // 更新成功后,关闭弹窗并重新加载表格数据 + visible.value = false; + TableData(); + } catch (error) { + console.error('更新学生信息失败:', error); } -} +};