开始尝试从0写一个项目--前端(三)

器材管理板块

添加器材管理导航

src\views\home\Home.vue

src\router\index.js

src\views\equipment\Equipment.vue

<template><div>hello!</div></template>

测试

搜索导航+分页查询

src\views\equipment\Equipment.vue

<template><div><!-- 导航 --><el-form :inline="true" class="demo-form-inline"><div style="float: left"><label style="margin-right: 5px">器材名称: </label><el-input  v-model="name" placeholder="请输入器材名称" style="width: 40%" /><el-button type="primary" style="margin-left: 20px" >查询</el-button></div><div><el-button type="primary" style="float: right" >+添加器材</el-button></div></el-form><!-- 分页查询 --><div><el-table :data="records" stripe style="width: 100%"><el-table-column prop="name" label="器材名称" width="180"></el-table-column><el-table-column prop="img" label="图片" width="180"></el-table-column><el-table-column prop="number" label="数量" width="180"></el-table-column><el-table-column prop="comment" label="描述" width="180"></el-table-column><el-table-column prop="status" label="器材状态"><template slot-scope="scope">{{ scope.row.status === 0 ? "禁用" : "启用" }}</template></el-table-column><el-table-column prop="updateTime" label="最后操作时间"></el-table-column><el-table-column label="操作"><template slot-scope="scope"><el-button type="text" @click="handleUpdateStu(scope.row)">修改</el-button><el-button type="text" @click="handleStartOrStop(scope.row)">{{ scope.row.status === 0 ? "启用" :"禁用"}}</el-button></template></el-table-column></el-table></div></div></template><script>export default {data() {return {name: '',        //器材名称,对应上面的输入框page: 1,         //页码pageSize: 10,    // 每页记录数total: 0,         //总记录数records: []      //当前页要展示的数据集合}},    
}</script>

src\views\equipment\Equipment.vue

<template><div><el-form :inline="true" :model="formInline" class="demo-form-inline"><div style="float: left"><label style="margin-right: 5px">学生姓名: </label><el-input v-model="name" placeholder="请输入学生姓名" style="width: 40%" /><el-button type="primary" style="margin-left: 20px" @click="pageQuery()">查询</el-button></div><div><el-button type="primary" style="float: right" @click="handleAddStu">+添加学生</el-button></div></el-form><br><br><br><div><el-table :data="records" stripe style="width: 100%"><el-table-column prop="name" label="学生姓名" width="180"></el-table-column><el-table-column prop="username" label="账号" width="180"></el-table-column><el-table-column prop="phone" label="手机号"></el-table-column><el-table-column prop="status" label="账号状态"><template slot-scope="scope">{{ scope.row.status === 0 ? "禁用" : "启用" }}</template></el-table-column><el-table-column prop="updateTime" label="最后操作时间"></el-table-column><el-table-column label="操作"><template slot-scope="scope"><el-button type="text" @click="handleUpdateStu(scope.row)">修改</el-button><el-button type="text" @click="handleStartOrStop(scope.row)">{{ scope.row.status === 0 ? "启用" :"禁用"}}</el-button></template></el-table-column></el-table></div><br><div><el-pagination class="pageList" @size-change="handleSizeChange" @current-change="handleCurrentChange":current-page="page" :page-sizes="[10, 20, 30, 40]" :page-size="pageSize"layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination></div></div>
</template><script>
// import request from '@/utils/request'
import { page, startOrStopStatus } from '@/api/Student'export default {data() {return {name: '',        //学生姓名,对应上面的输入框page: 1,         //页码pageSize: 10,    // 每页记录数total: 0,         //总记录数records: []      //当前页要展示的数据集合}},created() {this.pageQuery()},methods: {pageQuery() {//准备参数const params = {page: this.page,pageSize: this.pageSize,name: this.name}/* request({url: "/api/admin/student/page",               // 请求地址method: "get",                      // 请求方法params: params,                       headers: {                            // 请求头"Content-Type": "application/json",},}) */page(params).then((res) => {//解析结果if (res.data.code === 1) {this.total = res.data.data.totalthis.records = res.data.data.records}}).catch(err => {this.$router.push("/login");})},//每页记录数发生变化时触发handleSizeChange(pageSize) {this.pageSize = pageSizethis.pageQuery()},//page发生变化时触发handleCurrentChange(page) {this.page = pagethis.pageQuery()},//新增员工handleAddStu() {this.$router.push('/student/addStudent')},//启用禁用员工状态handleStartOrStop(row) {//判断账号是否是管理员账号,不能更改管理员账号if (row.username === 'admin') {this.$message.error("这是管理员账号,不允许更改!")return}this.$confirm('是否确认修改员工状态?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {const p = {id: row.id,status: !row.status ? 1 : 0}startOrStopStatus(p).then(res =>{if(res.data.code === 1){this.$message.success("状态修改成功!")this.pageQuery()}})})},//修改编辑学生信息handleUpdateStu(row){if(row.username === 'admin'){this.$message.error("这是管理员账号,不允许修改!!")return}//跳转到修改页面,通过地址栏传递参数this.$router.push({ path: '/student/addStudent', query: {id: row.id}})}}
}
</script>

src\api\Equipment.js

import request from '@/utils/request'/* 分页查询 */
export const pageEquipment = (params) =>request({'url': '/api/admin/equipment/page','method': 'get',params: params})

新增器材

src\router\index.js

src\views\equipment\Equipment.vue

src\views\equipment\addEquipment.vue

<template><div>hello</div>
</template>

测试

完善表单

请求

src\api\Equipment.js

import request from '@/utils/request'/* 分页查询 */
export const pageEquipment = (params) =>request({'url': '/api/admin/equipment/page','method': 'get',params: params})/* 新增器材 */
export const addEquipment = (params) =>request({'url': '/api/admin/equipment','method': 'post',data: params})

新增板块的界面

src\views\equipment\addEquipment.vue

<template><div class="form-container"><el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"><el-form-item label="器材名称:" required prop="name"><el-input v-model="ruleForm.name"></el-input></el-form-item><el-form-item label="数量:" required prop="number"><el-input v-model="ruleForm.number"></el-input></el-form-item><el-form-item label="描述" prop="comment"><el-input v-model="ruleForm.comment"></el-input></el-form-item><el-form-item label="器材图片:" prop="img"><div class="img-upload-container"><!-- 监听 update:imageUrl 事件并更新 ruleForm.img --><img-upload @update:imageUrl="handleImageUrlUpdate" /><!-- <img-upload :prop-image-url="ruleForm.img"></img-upload> --><span class="img-upload-instructions">图片大小不超过2M<br>仅能上传 PNG JPEGJPG类型图片<br>建议上传200*200或300*300尺寸的图片</span></div></el-form-item><el-form-item><el-button type="primary" @click="submitForm('ruleForm')">保存</el-button><el-button @click="$router.push('/equipment');">返回</el-button></el-form-item></el-form></div></template><script>
import ImgUpload from '@/components/img-upload/img-upload.vue'
import { addEquipment } from '@/api/Equipment'export default {components: {ImgUpload,},data() {return {// imageUrl: '',ruleForm: {name: '',img: '',number: '',comment: ''},rules: {name: [{ required: true, message: '请输入器材名称', trigger: 'blur' }],number: [{ required: true, message: '请输入器材数量', trigger: 'blur' }],},}},methods: {submitForm(formName) {this.$refs[formName].validate((valid) => {if (valid) {alert(this.ruleForm.img)if (!this.ruleForm.img)return this.$message.error('套餐图片不能为空')addEquipment(this.ruleForm).then((res) => {if (res.data.code === 1) {this.$message.success("添加成功!")this.$router.push('/equipment')} else {this.$message.error("res.data.msg")}})} else {console.log('error submit!!');return false;}});},handleImageUrlUpdate(newImageUrl) {alert(newImageUrl)this.ruleForm.img = newImageUrl;}},
}</script><style scoped>
.form-container {display: flex;justify-content: center;align-items: center;height: 70vh;/* 或者你想要的任何高度 */width: 100%;max-width: 600px;/* 限制最大宽度以适应较小的屏幕 */margin: 0 auto;/* 水平居中 */padding: 20px;/* 内边距 */background-color: #ffffff;/* 背景颜色 */border-radius: 8px;/* 圆角 */box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);/* 阴影效果 */
}/* 为提示文字设置样式 */
.img-upload-instructions {font-size: 12px;/* 根据需要调整字体大小 */color: #666;/* 根据需要调整颜色 */margin-bottom: 5px;/* 可选: 添加底部边距 */
}/* 为整个上传组件设置样式 */
.img-upload-container {display: flex;/* 使用Flex布局 */align-items: center;/* 垂直居中 */gap: 10px;/* 间距 */
}
</style>

上传文件OSS的逻辑

src\components\img-upload\img-upload.vue

<template><div class="upload-item"><el-upload ref="uploadfiles" :accept="type" :class="{ borderNone: imageUrl }" class="avatar-uploader"action="/api/admin/common/upload" :show-file-list="false" :on-success="handleAvatarSuccess":on-remove="handleRemove" :on-error="handleError" :before-upload="beforeAvatarUpload" :headers="headers"><img v-if="imageUrl" :src="imageUrl" class="avatar"><i v-else class="el-icon-plus avatar-uploader-icon" /><span v-if="imageUrl" class="el-upload-list__item-actions"><span class="el-upload-span" @click.stop="oploadImgDel">删除图片</span><span class="el-upload-span"> 重新上传 </span></span></el-upload><p class="upload-tips"><slot /></p></div>
</template><script>
import { getToken } from '@/utils/cookies'export default {name: 'UploadImage',props: {type: {type: String,default: '.jpg,.jpeg,.png'},size: {type: Number,default: 2},propImageUrl: {type: String,default: ''}},data() {return {headers: {token: getToken()},imageUrl: ''};},methods: {handleRemove() {// 方法实现},oploadImgDel() {this.imageUrl = '';this.$emit('imageChange', this.imageUrl);},beforeAvatarUpload(file) {const isLt2M = file.size / 1024 / 1024 < this.size;if (!isLt2M) {this.$message({message: `上传文件大小不能超过${this.size}M!`,type: 'error'});return false;}},handleError(err, file, fileList) {console.log(err, file, fileList, 'handleError');this.$message({message: '图片上传失败',type: 'error'});},handleAvatarSuccess(response) {this.imageUrl = `${response.data}`;// 发出一个事件,包含新的图片 URL  this.$emit('update:imageUrl', this.imageUrl);  }},watch: {propImageUrl: function (val) {this.imageUrl = val;}}
};
</script><style lang='scss'>
.borderNone {.el-upload {border: 1px solid #d9d9d9 !important;}
}
</style>
<style scoped lang="scss">
.avatar-uploader .el-icon-plus:after {position: absolute;display: inline-block;content: ' ' !important;left: calc(50% - 20px);top: calc(50% - 40px);width: 40px;height: 40px;// background: url('./../../assets/icons/icon_upload@2x.png') center center no-repeat;background-size: 20px;
}.el-upload-list__item-actions:hover .upload-icon {display: inline-block;
}.el-icon-zoom-in:before {content: '\E626';
}.el-icon-delete:before {content: '\E612';
}.el-upload-list__item-actions:hover {opacity: 1;
}.upload-item {.el-form-item__content {width: 500px !important;}display: flex;align-items: center;border: 1px solid #ccc;/* 添加边框*/width: 200px;/* 设置宽度 */height: 200px;/* 设置高度,使之与宽度相同 */
}.upload-tips {font-size: 12px;color: #666666;display: inline-block;line-height: 17px;margin-left: 36px;
}.el-upload-list__item-actions {position: absolute;width: 100%;height: 100%;left: 0;top: 0;cursor: default;text-align: center;color: #fff;opacity: 0;font-size: 20px;background-color: rgba(0, 0, 0, 0.5);transition: opacity 0.3s;display: flex;justify-content: center;align-items: center;flex-direction: column;
}.avatar-uploader .el-upload {border: 1px dashed #d9d9d9;border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;
}.avatar-uploader {display: inline-block;
}.avatar-uploader .el-upload:hover {border-color: #ffc200;
}.el-upload-span {width: 100px;height: 30px;border: 1px solid #ffffff;border-radius: 4px;font-size: 14px;text-align: center;line-height: 30px;
}.el-upload-span:first-child {margin-bottom: 20px;
}.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 200px;height: 160px;line-height: 160px;text-align: center;
}.avatar {width: 200px;height: 160px;display: block;
}
</style>

上传oss图片文件时需要的jwt令牌获取

src\utils\cookies.js

import Cookies from 'js-cookie';// 获取令牌
export const getToken = () => sessionStorage.getItem('jwtToken');

ps:如果出现模块找不到,不存在的时候,直接

npm install 模块

例如:

Module not found: Error: Can't resolve 'js-cookie' in 'D:\bishe\project\sems-front\src\utils'

解决方法:

这个错误表明你的项目无法找到js-cookie模块,这意味着你可能还没有安装它或者路径配置有问题。js-cookie是一个用于操作浏览器Cookies的小型JavaScript库。

解决方案

安装 js-cookie

确保你已经安装了js-cookie。你可以通过运行以下命令来安装它:

npm install js-cookie --save

或者如果你使用的是Yarn:

yarn add js-cookie

测试:

ps:OSS折磨死我了,踩了无数的坑,全靠各种搜索资料,卡了我2天,呜呜呜,麻了,有什么不知道的真可以问我,呜呜呜,你们踩的坑我应该都踩过,麻了

未完。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/50474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Discourse 备份和恢复中有关附件的问题

下面的这个问题是在官方论坛上网友问的内容是&#xff1a; 我想问一下&#xff0c;备份和附件分别挂载了不同的S3 备份的时候会把附件的S3里面的内容也都一起备份了吗&#xff1f;如果不选择包含上传的图片和附件&#xff0c;那么恢复备份的时候&#xff0c;附件用的S3里面的内…

【区块链+绿色低碳】雄韬智慧锂电储能管理系统 | FISCO BCOS应用案例

雄韬智慧锂电储能管理系统&#xff08;Energy Management System&#xff0c;以下简称 EMS&#xff09;是雄韬集团响应国家实现新型电力 系统建设&#xff0c;助力“碳达峰、碳中和”目标而自主开发的创新智慧锂电储能系统。 系统采用了 FISCO BCOS 联盟链&#xff0c;融合了物…

Java 8 中 20 个高频面试题及答案

文章目录 前言20 道高频题问题 1&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出列表中所有的偶数&#xff1f;问题 2&#xff1a;给定一个整数列表&#xff0c;使用 Stream 函数找出所有以 1 开头的数字&#xff1f;问题 3&#xff1a;如何使用 Stream 函数在给…

【C++题解】1782. 字符图形2-星号倒直角

问题&#xff1a;1782. 字符图形2-星号倒直角 类型&#xff1a;嵌套循环、图形输出 题目描述&#xff1a; 打印字符图形。 输入&#xff1a; 一个整数&#xff08; 0<n<10 &#xff09;。 输出&#xff1a; 一个字符图形。 样例&#xff1a; 输入&#xff1a; 3…

微信Android一面凉经(2024)

微信Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《微信Android一面凉经(2024)》。 面试职位: 微信-客户端开发工程师-基础功能(广州) And…

D语言

提起编程语言&#xff0c;相信大家第一时间想到的肯定都是C,但是相信资历较大的程序员们都不会忘记D语言 D语言自 1999 年发布至今已发展了 20 年 它既拥有 Java 那样强大的表现力 又具有 C 相当的性能 却因为 2.x 版本破坏性升级 导致社区大量核心开发者将其放弃。 2010 年——…

Ubuntu22.04系统安装nodejs 14 保姆级教程

下载软件包 从NodeSource 的官方源下载并安装 Node.js 14.x 版本的软件包&#xff0c;适用于 Debian 和 Ubuntu 系统&#xff1a; curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - 更新软件源 更新软件源 sudo apt-get update 下载bodejs14 下载nodejs14 sud…

双指针算法的实现(三题详解)

这是C算法基础-基础算法专栏的第十五篇文章&#xff0c;专栏详情请见此处。 ps&#xff1a;转眼间暑假已过半&#xff0c;我在这段时间也积累了很多文章&#xff0c;所以到开学&#xff08;9月1日&#xff09;为止&#xff0c;每个周我将会在周三和周六发文章(o&#xff9f;▽&…

Springboot项目的行为验证码AJ-Captcha(源码解读)

目录 前言1. 复用验证码2. 源码解读2.1 先走DefaultCaptchaServiceImpl类2.2 核心ClickWordCaptchaServiceImpl类 3. 具体使用 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目…

针对datax-web 中Swagger UI接口未授权访问

application.yml 添加以下配置 实现访问doc.html 以及/v2/api-docs 接口时需要进行简单的校验 swagger:basic:enable: trueusername: adminpassword: 12345 配置重启后再进行相关访问则需要输入用户名和密码

Ubuntu 24.04 LTS Noble安装 FileZilla Server

FileZilla Server 是一款使用图形用户界面快速创建 FTP 服务器的软件。它有助于测试需要 FTP 服务器功能的各种项目。虽然早期的 FileZilla FTP 服务器仅适用于 Windows 和 macOS&#xff0c;但现在我们也可以在 Linux&#xff08;例如 Ubuntu 24.04&#xff09;上安装 FileZil…

c++红黑树,插入公式

概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;因而是接近…

Docker安装 OpenResty详细教程

OpenResty 是一个基于 Nginx 的高性能 Web 平台&#xff0c;它集成了 Lua 脚本语言&#xff0c;使得开发者可以在 Nginx 服务器上轻松地进行动态 Web 应用开发。OpenResty 的核心目标是通过将 Nginx 的高性能与 Lua 的灵活性结合起来&#xff0c;提供一个强大且高效的 Web 开发…

Hadoop3.3.5的安装与单机/伪分布式配置

文章目录 一、安装须知二、安装jdk三、安装shh四、安装配置hadoop五、运行hadoop 一、安装须知 本次安装的Hadoop版本为hadoop3.3.5。 在这之前完成了VMware虚拟软件的安装&#xff0c;并安装了Ubuntu22.04&#xff0c;在这基础上进行相关配置。 二、安装jdk 在Ubuntu中使用…

cesium海洋到站提示

项目地址:Every Admin: 用于快速搭建后台管理和其他页面的项目,组件化开发,以及大屏展示. <template> <div class"topbox"> xx海洋管理 </div> <div class"selectbox"> <div class"title"> 航线列表 </div>…

Docker快速搭建WordPress博客系统网站

WordPress 是一款广泛使用的开源内容管理系统(CMS),用于创建和管理网站和博客。 主要功能: 易于使用的界面:WordPress 提供了一个直观的后台管理界面,使用户能够轻松创建、编辑和管理网站内容。 主题和模板:WordPress 提供了各种主题和模板,可根据网站需求进行选择和自…

MQ消息队列+Lua 脚本实现异步处理下单流程

具体实现和代码可参考我以前做过的笔记&#xff1a;《黑马点评》异步秒杀优化|消息队列 回顾一下下单流程&#xff1a; 用户发起请求 会先请求Nginx,Nginx反向代理到Tomcat&#xff0c;而Tomcat中的程序&#xff0c;会进行串行工作&#xff0c; 分为以下几个操作&#xff1…

前端(1)HTML

1、标签 创建1.html文件&#xff0c;浏览器输入E:/frontheima/1.html&#xff0c;可以访问页面 页面展示 在VSCODE安装IDEA的快捷键&#xff0c;比如ctld复制一行、ctrlx剪切 <p id"p1" title"标题1">Hello,world!</p> <p id"p2"…

聊一聊知识图谱结合RAG

因为最近在做一些关于提高公司内部使用的聊天机器人的回答准确率&#xff0c;并且最近微软官方也是开源了一下graphrag的源码&#xff0c;所以想聊一聊这个知识图谱结合rag。 rag在利用私有数据增强大模型回答的领域是一种比较典型的技术&#xff0c;也就是我们提出问题的时候&…

排序系列 之 希尔排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 英文名为ShellSort&#xff0c;又称“缩小增量排序”是直接插入排序算法的一种更高效的改进版本希尔排序是把记录按下标的指定步长分组&#xff0c;然后按照每组使用直接插入排序&#…