当前位置: 首页 > news >正文

教材管理系统

文章目录

  • 教材管理系统
    • 一、系统演示
    • 二、项目介绍
    • 三、系统部分功能截图
    • 四、部分代码展示
    • 五、底部获取项目源码(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 '@/store'export 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
<template><div style="padding:20px;margin:20px;"><el-form :inline="true" :model="seacheForm" size="small"><el-form-item label="教材"><el-input v-model="seacheForm.book" clearable placeholder="请输入教材名称" size="small" /></el-form-item><el-form-item label="书号"><el-input v-model="seacheForm.ISBN" clearable placeholder="请输入教材书号" size="small" /></el-form-item><el-form-item><el-button type="primary" size="small" @click="refresh">搜索</el-button></el-form-item></el-form><el-table :data="bookTable" v-loading="tableLoading" size="small" style="width: 100%"><el-table-column type="index" label="序号" align="center" fixed="left" width="55"  /><el-table-column prop="book" align="center" label="教材名称" fixed="left" width="200" show-overflow-tooltip /><el-table-column prop="editor" align="center" label="主编" show-overflow-tooltip /><el-table-column prop="pubDate" align="center" label="出版时间" show-overflow-tooltip /><el-table-column prop="ISBN" align="center" label="书号"  show-overflow-tooltip /><el-table-column prop="publisher" align="center" label="出版社" show-overflow-tooltip /><el-table-column prop="book_type" align="center" label="教材类型" show-overflow-tooltip /><el-table-column prop="book_usage" align="center" label="使用情况" show-overflow-tooltip /><el-table-column prop="price" align="center" label="单价"  show-overflow-tooltip /><el-table-column prop="book_total" align="center" label="教材库存" fixed="right" show-overflow-tooltip /><el-table-column fixed="right" label="操作" align="center" width="120"><template #default="{row}"><el-button type="primary" size="small" @click="handleAddBook(row)">增订</el-button></template></el-table-column></el-table><div class="demo-pagination-block"><el-paginationv-model:currentPage="currentPage"v-model:page-size="pageSize":page-sizes="[8, 20, 30, 50]":background="false"layout="total, sizes, prev, pager, next, jumper":total="total"@size-change="handleSizeChange"@current-change="handleCurrentChange"/></div> <el-dialog v-model="addDialog" title="续订教材" width="55%"><el-form :model="form" :inline="true"  :rules="rules" ref="ruleFormRef"  label-width="120px"><el-form-item label="教材名称" prop="book"><el-input v-model="form.book" disabled placeholder="请输入教材名称" /> </el-form-item><el-form-item label="学生用书" prop="sdt_book_nums"><el-input v-model.number="form.sdt_book_nums" placeholder="请输入学生用书数量" /> </el-form-item><el-form-item label="学生备用" prop="standby_nums"><el-input v-model.number="form.standby_nums" placeholder="请输入学生备用书数量" /> </el-form-item><el-form-item label="教师用书" prop="tch_book_nums"><el-input v-model.number="form.tch_book_nums" placeholder="请输入教师用书数量" /> </el-form-item><el-form-item label="教材单价" prop="price"><el-input v-model.number="form.price" disabled placeholder="请输入教材单价(单位:元)" /> </el-form-item><el-form-item label="教材总数"><el-input v-model.number="bookTotal" disabled placeholder="教材总价" /> </el-form-item><el-form-item label="教材总价"><el-input v-model.number="bookPriceTotal" disabled placeholder="教材总价" /> </el-form-item><el-form-item label="教材使用情况" prop="book_usage"><el-select v-model="form.book_usage"  placeholder="请选择教材使用情况"><el-option label="选用" value="选用" /><el-option label="不选用" value="不选用" /></el-select></el-form-item></el-form><template #footer><span class="dialog-footer"><el-button @click="addDialog=false">取消</el-button><el-button type="primary" @click="onSubmit">确定</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_nums=0form.value.standby_nums=0form.value.tch_book_nums=0addDialog.value = true;})
}const onSubmit = () =>{if(bookTotal.value==0){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();
}</script><style>
</style>
import { createRouter, createWebHashHistory } from 'vue-router'
import { getToken } from '../utils/cookie'
import { roleMenu } from '@/api/login'
import store from '@/store'export 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¥带走)

有问题,或者需要协助调试运行项目的也可以

相关文章:

教材管理系统

文章目录 教材管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 教材管理系统 一、系统演示 教材管理系统 二、项目介绍 语言&#xff1a;nodejs 框架&#xff1a;egg.js、Vue 数据库…...

PV、UV、IP

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. PV1.1 PV 计算1.2 PV 的影响因素 2. UV2.1 UV 计算2.2UV 的影响因素 3. IP3.1 IP和UV①UV大于IP②UV小于IP 三者的关系PV 和 UV 前言 PV、UV、IP是我们在运…...

ZigBee学习——在官方例程上实现串口通信

Z-Stack版本为3.0.2 IAR版本为10.10.1 文章目录 一、添加头文件二、定义接收缓冲区三、编写Uart初始化函数四、编写串口回调函数五、函数声明六、函数调用七、可能遇到的问题(function “halUartInit“ has no prototype) 以下所有操作都是在APP层进行&#xff0c;也就是这个文…...

nginx添加lua模块

目录 已安装了nginx&#xff0c;后追加lua模块nginx 重新编译知识参考&#xff1a; 从零安装一、首先需要安装必要的库&#xff08;pcre、zlib、openssl&#xff09;二、安装LUA环境及相关库 &#xff08;LuaJIT、ngx_devel_kit、lua-nginx-module&#xff09;注意&#xff1a;…...

Csapp-chapter3-压栈和弹栈

bp与sp&#xff08;压栈和弹栈&#xff09; 在计算机内部的寄存器组中&#xff0c;有一对寄存器非常有意思&#xff1a;%ebp&#xff0c;%esp 文章目录 bp与sp&#xff08;压栈和弹栈&#xff09;寄存器组示例图%ebp与%esp总结 寄存器组示例图 首先我们应该对于计算机中的寄存…...

Rust入门1——HelloWorld

文章目录 一、HelloWorld二、控制台输入 以最简单的两个Rust程序例子入门Rust。首先需要下载安装Rust&#xff0c;之后在VSCode或Clion中运行Rust需要下载Rust插件 一、HelloWorld fn main(){println!("Hello World!"); }二、控制台输入 use std::io::stdin; fn …...

android中使用Bitmp对象绘制图形

1、引言 你是否还在因为不懂UI设计而不得不去借用别人的图片&#xff0c;甚至使用各种网图作为界面布局的一部分&#xff0c;那么今天就教你使用Bitmap对象去绘制自定义图形&#xff0c;并保存为png格式的图片&#xff0c;须知图片编辑软件本就是程序员开发出来的&#xff0c;我…...

Linux操作系统基础(八):Linux的vi/vim编辑器

文章目录 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 二、打开文件 三、VIM编辑器的三种模式(重点) 四、命令模式相关命令 五、底行模式相关命令 Linux的vi/vim编辑器 一、vi/vim编辑器介绍 vi是visual interface的简称, 是Linux中最经典的文本编辑器 vi的核心设计思想…...

nginx限制网段访问

文章目录 nginx限制网段访问介绍:使用:示例:介绍网段:nginx限制网段访问 介绍: Nginx的deny和allow指令是由ngx_http_access_module模块提供, Nginx安装默认内置了该模块 使用: nginx访问控制模块: 想禁止哪个ip访问就加上deny IP, 想允许哪个ip访问就加上allow…...

Linux开机自动执行自定义脚本或命令

尝试了多种方法&#xff0c;现总结如下&#xff1a; 在用户登录之前自动执行 1. /etc/init.d/rcS 2. /etc/inittab 在用户登录之后自动执行&#xff1a;下述方法&#xff0c;实际尝试发现&#xff0c;之后再输入用户名和密码后才会自动执行。当如果不需要输入用户名或密码时…...

【Linux】 网络编程套接字

目录 预备知识 网络字节序 网络字节序和主机字节序转换的库函数 socket编程接口 socket常见API sockaddr结构 套接字的种类 预备知识 1.在IP数据包头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 2.端口号&#xff1a;是传输层协议的内容…...

MATLAB矩阵的操作(第二部分)

师从清风 矩阵的创建方法 在MATLAB中&#xff0c;矩阵的创建方法主要有三种&#xff0c;分别是&#xff1a;直接输入法、函数创建法和导入本地文件中的数据。 直接输入法 输入矩阵时要以中括号“[ ]”作为标识符号&#xff0c;矩阵的所有元素必须都在中括号内。 矩阵的同行元…...

基础面试题整理6之Redis

1.Redis的应用场景 Redis支持类型&#xff1a;String、hash、set、zset、list String类型 hash类型 set类型 zset类型 list类型 一般用作缓存&#xff0c;例如 如何同时操作同一功能 2.redis是单线程 Redis服务端(数据操作)是单线程&#xff0c;所以Redis是并发安全的,因…...

MySQL基础查询篇(7)-常用的字符串函数

MySQL数据库是目前广泛应用于各种系统中的一种关系型数据库管理系统。在MySQL中&#xff0c;有许多常见的字符串函数&#xff0c;可以对字符串进行各种处理和操作。本文将介绍MySQL数据库中常用的一些字符串函数&#xff0c;并提供详细示例。 CONCAT函数&#xff1a;用于将两个…...

如何实现视线(目光)的检测与实时跟踪

如何实现视线(目光)的检测与实时跟踪 核心步骤展示说明 找到人脸 检测人脸特征点 根据特征点找到人眼区域 高精度梯度算法检测瞳孔中心 根据眼睛周边特征点计算眼睛中心 瞳孔中心和眼睛中心基于视线模型计算视线方向 视线方向可视化 详细实现与说明&#xff1a; https://stud…...

STM32 FSMC (Flexible static memory controller) 灵活静态内存控制器介绍

文章目录 1. 介绍FSMC2. FSMC特点3. Block示意图4. AHB接口4.1 Supported memories and transactionsGeneral transaction rulesConfiguration registers 5. 外部设备地址映射5.1 NOR/PSRAM地址映射将NOR Flash/PSRAM的支持进行封装 5.2 NAND/PC Card地址映射 1. 介绍FSMC 说到…...

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息维护模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…...

SpringBoot源码解读与原理分析(六)WebMvc场景的自动装配

文章目录 2.6 WebMvc场景下的自动装配原理2.6.1 WebMvcAutoConfiguration2.6.2 Servlet容器的装配2.6.2.1 EmbeddedTomcat、EmbeddedJetty、EmbeddedUndertow2.6.2.2 BeanPostProcessorsRegistrar(后置处理器的注册器)2.6.2.3 两个定制器的注册 2.6.3 DispatcherServlet的装配2…...

git恢复rebase过程中遇到权限问题和丢失的提交

文章目录 一、检查丢失的提交是否还在 reflog 中二、创建一个新分支来恢复丢失的提交三、处理权限问题四. 使用 git fsck 查找丢失对象1、创建一个新分支来恢复该提交2、检查和合并提交 五. 介绍git中命令reflog 与 fsck1、git reflog2、git fsck使用场景 一、检查丢失的提交是…...

Spring boot 集成redis

一、使用spring bootspring-boot-starter-data-redis 导入maven包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> spring boot配置文件 spring.re…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...