湖南旅游十大必去景区,南阳seo网站价格,营业执照查询系统,wordpress动漫视频网站文章目录 教材管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码#xff08;9.9#xffe5;带走#xff09; 教材管理系统
一、系统演示 教材管理系统 二、项目介绍
语言#xff1a;nodejs 框架#xff1a;egg.js、Vue 数据库… 文章目录 教材管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码9.9带走 教材管理系统
一、系统演示 教材管理系统 二、项目介绍
语言nodejs 框架egg.js、Vue 数据库MySQL
三个角色管理员、教师、学生
用户管理、角色管理、菜单管理、教材数据、教材征订、出入库记录、领书操作、领书分析、班级管理、课程信息、教师信息
三、系统部分功能截图 四、部分代码展示
import { createRouter, createWebHashHistory } from vue-router
import { getToken } from ../utils/cookie
import { roleMenu } from /api/login
import store from /storeexport const constantRoutes [{path: /login,name: Login,hidden: 1,component: () import(/* webpackChunkName: login */ ../views/login/Login.vue)},{path: /change/psw,component: () import(../views/index/Home.vue),redirect: /change/psw,hidden: 1,children: [{path: ,component: () import(/views/index/ChangePsw),name: ChangePsw,hidden: 0,meta: { title: 修改密码, icon: }}]},{path: /:w,component: () import(/views/index/404.vue),hidden: 1}
]const router createRouter({history: createWebHashHistory(),routes: constantRoutes
})const whiteList [/login]
router.beforeEach((to, from, next) {document.title to.meta.title || 系统const token getToken()if (token) {if (to.path /login) {next(/)} else {if (store.getters.addRouters.length 0) {roleMenu().then(res {store.dispatch(generateRoutes, res.data).then(() {store.getters.addRouters.forEach(item {router.addRoute(item)})next({ ...to, replace: true })})})store.dispatch(getCurUserInfo)} else {next()}}} else {if (whiteList.indexOf(to.path) ! -1) {next()} else {next(/login)}}
})router.afterEach((to, from) {setKeepAlive(to)
})function setKeepAlive(to) {if(to.meta.keep_alive 1) {store.commit(setKeepAlive, to.name);}
}export default router
templatediv stylepadding:20px;margin:20px;el-form :inlinetrue :modelseacheForm sizesmallel-form-item label教材el-input v-modelseacheForm.book clearable placeholder请输入教材名称 sizesmall //el-form-itemel-form-item label书号el-input v-modelseacheForm.ISBN clearable placeholder请输入教材书号 sizesmall //el-form-itemel-form-itemel-button typeprimary sizesmall clickrefresh搜索/el-button/el-form-item/el-formel-table :databookTable v-loadingtableLoading sizesmall stylewidth: 100%el-table-column typeindex label序号 aligncenter fixedleft width55 /el-table-column propbook aligncenter label教材名称 fixedleft width200 show-overflow-tooltip /el-table-column propeditor aligncenter label主编 show-overflow-tooltip /el-table-column proppubDate aligncenter label出版时间 show-overflow-tooltip /el-table-column propISBN aligncenter label书号 show-overflow-tooltip /el-table-column proppublisher aligncenter label出版社 show-overflow-tooltip /el-table-column propbook_type aligncenter label教材类型 show-overflow-tooltip /el-table-column propbook_usage aligncenter label使用情况 show-overflow-tooltip /el-table-column propprice aligncenter label单价 show-overflow-tooltip /el-table-column propbook_total aligncenter label教材库存 fixedright show-overflow-tooltip /el-table-column fixedright label操作 aligncenter width120template #default{row}el-button typeprimary sizesmall clickhandleAddBook(row)增订/el-button/template/el-table-column/el-tablediv classdemo-pagination-blockel-paginationv-model:currentPagecurrentPagev-model:page-sizepageSize:page-sizes[8, 20, 30, 50]:backgroundfalselayouttotal, sizes, prev, pager, next, jumper:totaltotalsize-changehandleSizeChangecurrent-changehandleCurrentChange//div el-dialog v-modeladdDialog title续订教材 width55%el-form :modelform :inlinetrue :rulesrules refruleFormRef label-width120pxel-form-item label教材名称 propbookel-input v-modelform.book disabled placeholder请输入教材名称 / /el-form-itemel-form-item label学生用书 propsdt_book_numsel-input v-model.numberform.sdt_book_nums placeholder请输入学生用书数量 / /el-form-itemel-form-item label学生备用 propstandby_numsel-input v-model.numberform.standby_nums placeholder请输入学生备用书数量 / /el-form-itemel-form-item label教师用书 proptch_book_numsel-input v-model.numberform.tch_book_nums placeholder请输入教师用书数量 / /el-form-itemel-form-item label教材单价 proppriceel-input v-model.numberform.price disabled placeholder请输入教材单价(单位元) / /el-form-itemel-form-item label教材总数el-input v-model.numberbookTotal disabled placeholder教材总价 / /el-form-itemel-form-item label教材总价el-input v-model.numberbookPriceTotal disabled placeholder教材总价 / /el-form-itemel-form-item label教材使用情况 propbook_usageel-select v-modelform.book_usage placeholder请选择教材使用情况el-option label选用 value选用 /el-option label不选用 value不选用 //el-select/el-form-item/el-formtemplate #footerspan classdialog-footerel-button clickaddDialogfalse取消/el-buttonel-button typeprimary clickonSubmit确定/el-button/span/template/el-dialog/div
/template
script setup
import { ElMessage,ElMessageBox } from element-plus;
import { computed, onMounted, reactive, ref} from vue;
import { operateRecord, operateStore } from /api/book/operate;
import { getRecordDetail } from /api/education/operate;
import dayjs from dayjs;
onMounted((){refresh();
})
const tableLoading ref(false);
const refresh () {tableLoading.value true;operateStore({limit:pageSize.value,page:currentPage.value,book:seacheForm.book,ISBN:seacheForm.ISBN,}).then(res{bookTable.value res.data.rows;total.value res.data.count;bookTable.value.forEach((item){item.pubDate ? item.pubDate dayjs(item.birth).format(YYYY-MM) : })tableLoading.value false;})
}// 搜索表单
const seacheForm reactive({});// 表格
const bookTable ref([]);
const total ref(0);
const bookTotal computed((){let total form.value.sdt_book_nums form.value.standby_nums form.value.tch_book_nums;return total;
})
const bookPriceTotal computed((){let total (form.value.sdt_book_nums form.value.standby_nums form.value.tch_book_nums) * Number(form.value.price);return total;
})
const addDialog ref(false);
const form ref({});
const handleAddBook (row) {getRecordDetail({record_id:row.record_id}).then(res{form.value res.data[0];form.value.sdt_book_nums0form.value.standby_nums0form.value.tch_book_nums0addDialog.value true;})
}const onSubmit () {if(bookTotal.value0){ElMessage({type:warning,message:未填写征订数量});return;}delete form.value.id;form.value.total bookPriceTotal.value;form.value.book_total bookTotal.value;form.value.apply 1;operateRecord({data:form.value,flag:1}).then(res{if(res.success){ElMessage({type:success,message:申请成功});addDialog.value false;}else{ElMessage({type:danger,message:申请失败});}})
}// 分页
const currentPage ref(1);
const pageSize ref(8);
const handleSizeChange (val) {pageSize.value val;refresh();
}
const handleCurrentChange (val) {currentPage.value val;refresh();
}/scriptstyle
/style
import { createRouter, createWebHashHistory } from vue-router
import { getToken } from ../utils/cookie
import { roleMenu } from /api/login
import store from /storeexport const constantRoutes [{path: /login,name: Login,hidden: 1,component: () import(/* webpackChunkName: login */ ../views/login/Login.vue)},{path: /change/psw,component: () import(../views/index/Home.vue),redirect: /change/psw,hidden: 1,children: [{path: ,component: () import(/views/index/ChangePsw),name: ChangePsw,hidden: 0,meta: { title: 修改密码, icon: }}]},{path: /:w,component: () import(/views/index/404.vue),hidden: 1}
]const router createRouter({history: createWebHashHistory(),routes: constantRoutes
})const whiteList [/login]
router.beforeEach((to, from, next) {document.title to.meta.title || 系统const token getToken()if (token) {if (to.path /login) {next(/)} else {if (store.getters.addRouters.length 0) {roleMenu().then(res {store.dispatch(generateRoutes, res.data).then(() {store.getters.addRouters.forEach(item {router.addRoute(item)})next({ ...to, replace: true })})})store.dispatch(getCurUserInfo)} else {next()}}} else {if (whiteList.indexOf(to.path) ! -1) {next()} else {next(/login)}}
})router.afterEach((to, from) {setKeepAlive(to)
})function setKeepAlive(to) {if(to.meta.keep_alive 1) {store.commit(setKeepAlive, to.name);}
}export default router
五、底部获取项目源码9.9带走
有问题或者需要协助调试运行项目的也可以