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

非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 4

三十三、出入库管理

 Header.vue导一下,RecordController加一个

 //将入库数据和原有数据相加吧//新增@PostMapping("/save")public Result save(@RequestBody Record record) {return recordService.save(record) ? Result.success() : Result.fail();}

GoodsManage.vue

<template><div><div style="margin-left:5px"><el-input v-model="name" placeholder="请输入物品名:" suffix-icon="el-icon-search" style="width:200px;"@keyup.enter.native="loadPost"></el-input><el-select v-model="storage" placehoLder="请选择仓库" style="margin-left: 5px;"><el-optionv-for="item in storageData":key="item.id":label="item.name":value="item.id"></el-option></el-select><el-select v-model="goodstype" placeholder="请选择分类" style="margin-left: 5px;"><el-optionv-for="item in goodstypeData":key="item.id":label="item.name":value="item.id"></el-option></el-select><el-button type="primary" style="margin-left:5px" @click="loadPost">查询</el-button><el-button type="success" @click="resetParam">重置</el-button><el-button type="primary" style="margin-left:5px" @click="add">新增</el-button><el-button type="success" style="margin-left:5px;" @click="inGoods">重置</el-button></div><el-table :data="tableData":header-cell-style="{background:'#f2f5fc',color:'#555'}"borderhighlight-current-row@current-change="selectCurrentChange"><el-table-column prop="id" label="ID" width="60"></el-table-column><el-table-column prop="name" label="物品名" width="80"></el-table-column><el-table-column prop="storage" label="仓库" :formatter="formatStorage"></el-table-column><el-table-column prop="goodstype" label="分类" :formatter="formatGoodsType"></el-table-column><el-table-column prop="count" label="数量"></el-table-column><el-table-column prop="remark" label="备注"></el-table-column><el-table-column prop="operate" label="操作"><template slot-scope="scope"><el-button size="small" type="success" @click="mod(scope.row)">编辑</el-button><el-popconfirmtitle="确定删除吗?"@confirm="del(scope.row.id)"style="margin-left:8px;"><el-button slot="reference" size="small" type="danger">删除</el-button></el-popconfirm></template></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pageNum":page-sizes="[5, 10, 20, 50]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination><el-dialogtitle="提示":visible.sync="centerDialogVisible"width="30%"center><el-form ref="form" :rules="rules" :model="form" label-width="80px"><el-form-item label="物品名" prop="name"><el-col :span="20"><el-input v-model="form.name"></el-input></el-col></el-form-item><el-form-item label="仓库" prop="storage"><el-col :span="20"><el-select v-model="form.storage" placehoLder="请选择仓库" style="margin-left: 5px;"><el-optionv-for="item in storageData":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-col></el-form-item><el-form-item label="分类" prop="goodstype"><el-col :span="20"><el-select v-model="form.goodstype" placeholder="请选择分类" style="margin-left: 5px;"><el-optionv-for="item in goodstypeData":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-col></el-form-item><el-form-item label="数量" prop="count"><el-col :span="20"><el-input v-model="form.count"></el-input></el-col></el-form-item><el-form-item label="备注" prop="remark"><el-col :span="20"><el-input type="textarea" v-model="form.remark"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="centerDialogVisible=false">取消</el-button><el-button type="primary" @click="save">确定</el-button></span></el-dialog><el-dialogtitle="提示":visible.sync="inDialogVisible"width="30%"center><el-form ref="form1" :rules="rules1" :model="form1" label-width="80px"><el-form-item label="物品名"><el-col :span="20"><el-input v-model="form1.goodsname" readonly></el-input></el-col></el-form-item><el-form-item label="数量" prop="count"><el-col :span="20"><el-input v-model="form1.count"></el-input></el-col></el-form-item><el-form-item label="备注" prop="remark"><el-col :span="20"><el-input type="textarea" v-model="form1.remark"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="inDialogVisible=false">取消</el-button><el-button type="primary" @click="doInGoods">确定</el-button></span></el-dialog></div>
</template><style scoped></style>
<script>
export default {name: "GoodsManage",data() {let checkCount = (rule, value, callback) => {if (value > 9999) {callback(new Error('数量输入过大'));} else {callback();}};return {user: JSON.parse(sessionStorage.getItem('CurUser')),storageData: [],tableData: [],goodstypeData: [],pageSize: 10,pageNum: 1,storage: '',goodstype: '',total: 0,name: '',centerDialogVisible: false,inDialogVisible: false,currentRow: {},form: {id: '',name: '',remark: '',count: '',storage: '',goodstype: '',},form1: {goods: '',goodsname: '',userid: '13',adminId: '',remark: ''},rules1: {},rules: {name: [{required: true, message: '请输入物品名', trigger: 'blur'},],storage: [{required: true, message: '请选择仓库', trigger: 'blur'}],goodstype: [{required: true, message: '请选择分类’,trigger:‘blur'}],count: [{required: true, message: '请输入数量', trigger: 'blur'},{pattern: /^([1-9][0-9]*){1,4}$/, message: '数量必须为正整数', trigger: "blur"},{validator: checkCount, trigger: 'blur'}]}}},methods: {selectCurrentChange(val) {this.currentRow = val;},formatStorage(row) {let temp = this.storageData.find(item => {return item.id === row.storage})return temp && temp.name},formatGoodsType(row) {let temp = this.goodstypeData.find(item => {return item.id === row.goodstype})return temp && temp.name},add() {this.centerDialogVisible = truethis.$nextTick(() => {this.resetForm()this.form.id = ''})},inGoods() {if (!this.currentRow.id) {alert('请选择记录');return;}this.inDialogVisible = truethis.$nextTick(() => {this.resetInForm()})this.form1.goodsname = this.currentRow.namethis.form1.goods = this.currentRow.idthis.form1.adminId = this.user.id},mod(row) {//this.form=row就可以了this.centerDialogVisible = truethis.$nextTick(() => {this.form.id = row.id;this.form.remark = row.remark;this.form.name = row.name;this.form.storage = row.storage;this.form.goodstype = row.goodstype;this.form.count = row.count;})},del(id) {this.$axios.get(this.$httpUrl + '/goods/del?id=' + id).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.loadPost();} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},resetForm() {//this.centerDialogVisible = truethis.$refs.form.resetFields();//this.form.id = '';},resetInForm() {this.$refs.form1.resetFields();},doSave() {this.$axios.post(this.$httpUrl + '/goods/save', this.form).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = falsethis.loadPost();this.resetForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},doMod() {this.$axios.post(this.$httpUrl + '/goods/update', this.form).then(res => res.data).then(res => {console.log(res);if (res.code == 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = false;this.loadPost();this.resetForm();} else {this.$message({message: '操作失败!',type: 'error'});}});},save() {this.$refs.form.validate((valid) => {if (valid) {if (this.form.id) {this.doMod();} else {this.doSave();}} else {console.log('error submit!!');return false;}});},loadPost() {this.$axios.post(this.$httpUrl + '/goods/listPage', {pageSize: this.pageSize,pageNum: this.pageNum,param: {name: this.name,goodstype: this.goodstype + '',//string和int强转一下storage: this.storage + ''}}).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.tableData = res.datathis.total = res.total} else {alert('获取数据失败!请刷新页面')}})},loadStorage() {this.$axios.get(this.$httpUrl + '/storage/list').then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.storageData = res.data} else {alert('获取数据失败!请刷新页面')}})},loadGoodsType() {this.$axios.get(this.$httpUrl + '/goodstype/list').then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.goodstypeData = res.data} else {alert('获取数据失败!请刷新页面')}})},resetParam() {this.name = ''this.storage = ''this.goodstype = ''},doInGoods() {this.$axios.post(this.$httpUrl + '/record/save', this.form1).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.inDialogVisible = falsethis.loadPost();this.resetInForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},handleSizeChange(val) {console.log(`每页 ${val} 条`);this.pageNum = 1//这个错误是先翻到第二页在调页面条数,显示无数据this.pageSize = valthis.loadPost()},handleCurrentChange(val) {console.log(`当前页: ${val}`);this.pageNum = valthis.loadPost()}},beforeMount() {this.loadStorage()this.loadGoodsType()this.loadPost()}
}</script>

1. 表里没有操作时间的,按我说的来做,数据库里面类型修改为timestamp,默认那里再加上CURRENT_TIMESTAMP这个默认值,

2.没有时间的直接改成`createtime` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间' ON UPDATE CURRENT_TIMESTAMP

3.操作时间为空的搜一下mybaitsplus的注解@TableField,加在实体类里

方法选一个即可 

CREATE TABLE `record` (`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',`goods` int(11) NOT NULL COMMENT '货品id',`userId` int(11) DEFAULT NULL COMMENT '取货人/补货人',`admin_id` int(11) DEFAULT NULL COMMENT '操作人id',`count` int(11) DEFAULT NULL COMMENT '数量',`createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '操作时间',`remark` varchar(1000) DEFAULT NULL COMMENT '备注',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

进一步补充goods的相关方法

package com.wms.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wms.common.QueryPageParam;
import com.wms.common.Result;
import com.wms.entity.Goods;
import com.wms.entity.Record;
import com.wms.service.GoodsService;
import com.wms.service.RecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;/*** <p>* 前端控制器* </p>** @author wms* @since 2024-12-07*/
@RestController
@RequestMapping("/record")
public class RecordController {@Autowiredprivate RecordService recordService;@Autowiredprivate GoodsService goodsService;@PostMapping("/listPage")public Result listPage(@RequestBody QueryPageParam query) {HashMap param = query.getParam();String name = (String) param.get("name");String storage = (String) param.get("storage");String goodstype = (String) param.get("goodstype");Page<Record> page = new Page();page.setCurrent(query.getPageNum());page.setSize(query.getPageSize());QueryWrapper<Record> queryWrapper = new QueryWrapper();queryWrapper.apply(" a.goods=b.id and b.storage=c.id and b.goodsType=d.id ");if (StringUtils.isNotBlank(name) && !"null".equals(name)) {//lambdaQueryWrapper.like(Record::getName, name);queryWrapper.like("b.name", name);}if (StringUtils.isNotBlank(storage) && !"null".equals(storage)) {queryWrapper.eq("c.id", storage);}if (StringUtils.isNotBlank(goodstype) && !"null".equals(goodstype)) {queryWrapper.eq("d.id", goodstype);}IPage result = recordService.pageCC(page, queryWrapper);return Result.success(result.getRecords(), result.getTotal());}//将入库数据和原有数据相加吧//新增@PostMapping("/save")public Result save(@RequestBody Record record) {Goods goods = goodsService.getById(record.getGoods());int n = record.getCount();int num = goods.getCount() + n;goods.setCount(num);goodsService.updateById(goods);return recordService.save(record) ? Result.success() : Result.fail();}
}

 可以实现初步功能

Record加一句

@TableField(exist=false)
private String action;

 RecordController添加出库相关的内容

 //将入库数据和原有数据相加吧//新增@PostMapping("/save")public Result save(@RequestBody Record record) {Goods goods = goodsService.getById(record.getGoods());int n = record.getCount();//出库if("2".equals(record.getAction())) {n = -n;record.setCount(n);}int num = goods.getCount() + n;goods.setCount(num);goodsService.updateById(goods);return recordService.save(record) ? Result.success() : Result.fail();}

 SelectUser.vue

<template><div><div style="margin-left:5px"><el-input v-model="name" placeholder="请输入名字:" suffix-icon="el-icon-search" style="width:200px;"@keyup.enter.native="loadPost"></el-input><el-select v-model="sex" filterableplacehoLder="请选择性别" style="margin-left:5px"><el-optionv-for="item in sexs":key="item.value":label="item.label":value="item.value"></el-option></el-select><el-button type="primary" style="margin-left:5px" @click="loadPost">查询</el-button><el-button type="success" @click="resetParam">重置</el-button><!--<el-button type="primary" style="margin-left:5px" @click="add">新增</el-button>--></div><el-table :data="tableData":header-cell-style="{background:'#f2f5fc',color:'#555'}"borderhighlight-current-row@current-change="selectCurrentChange"><el-table-column prop="id" label="ID" width="60"></el-table-column><el-table-column prop="no" label="账号" width="150"></el-table-column><el-table-column prop="name" label="姓名" width="120"></el-table-column><el-table-column prop="age" label="年龄" width="80"></el-table-column><el-table-column prop="sex" label="性别" width="80"><template slot-scope="scope"><el-tag:type="scope.row.sex === 1 ?'primary':'success'"disable-transitions>{{ scope.row.sex === 1 ? '男' : '女' }}</el-tag></template></el-table-column><el-table-column prop="roleId" label="角色" width="120"><template slot-scope="scope"><el-tag:type="scope.row.roleId === 0 ?'danger':(scope.row.roleId === 1 ?'primary':'success')"disable-transitions>{{ scope.row.roleId === 0 ? '超级管理员' : (scope.row.roleId === 1 ? '管理员' : '用户') }}</el-tag></template></el-table-column><el-table-column prop="phone" label="电话" ></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pageNum":page-sizes="[5, 10, 20, 50]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination><el-dialogtitle="提示":visible.sync="centerDialogVisible"width="30%"center><el-form ref="form" :rules="rules" :model="form" label-width="80px"><el-form-item label="账号" prop="no"><el-col :span="20"><el-input v-model="form.no"></el-input></el-col></el-form-item><el-form-item label="密码" prop="password"><el-col :span="20"><el-input v-model="form.password"></el-input></el-col></el-form-item><el-form-item label="名字" prop="name"><el-col :span="20"><el-input v-model="form.name"></el-input></el-col></el-form-item><el-form-item label="年龄" prop="age"><el-col :span="20"><el-input v-model="form.age"></el-input></el-col></el-form-item><el-form-item label="性别"><el-radio-group v-model="form.sex"><el-radio label="1">男</el-radio><el-radio label="0">女</el-radio></el-radio-group></el-form-item><el-form-item label="电话" prop="phone"><el-col :span="20"><el-input v-model="form.phone"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="centerDialogVisible=false">取消</el-button><el-button type="primary" @click="save">确定</el-button></span></el-dialog></div>
</template><style scoped></style>
<script>
export default {name: "SelectUser",data() {let checkAge = (rule, value, callback) => {if (value > 150) {callback(new Error('年龄太大!lbd再来我让你飞起来!'));} else {callback();}};let checkDuplicate = (rule, value, callback) => {if (this.form.id) {return callback();}this.$axios.get(this.$httpUrl + "/user/findByNo?no=" + this.form.no).then(res => res.data).then(res => {if (res.code !== 200) {//es6解构也可以callback();} else {callback(new Error('账号已经存在'));}});};return {tableData: [],pageSize: 10,pageNum: 1,total: 0,name: '',sex: '',sexs: [{value: '1',label: '男'}, {value: '0',label: '女'}],centerDialogVisible: false,form: {name: '',no: '',age: '',password: '',phone: '',sex: '0',roleId: '2'},rules: {no: [{required: true, message: '请输入账号', trigger: 'blur'},{min: 3, max: 8, message: '长度在3-8个字符', trigger: 'blur'},{validator: checkDuplicate, trigger: 'blur'}],name: [{required: true, message: '请输入名字', trigger: 'blur'},],password: [{required: true, message: '请输入密码', trigger: 'blur'},{min: 4, max: 10, message: '长度在4-10个字符之间', trigger: 'blur'}],age: [{required: true, message: '请输入年龄', trigger: 'blur'},{min: 1, max: 3, message: '长度在1到3个位', trigger: 'blur'},{pattern: /^([1-9][0-9]*){1,3}$/, message: '年龄必须为正整数字', trigger: "blur"},{validator: checkAge, trigger: 'blur'}],phone: [{required: true, message: "手机号不能为空", trigger: "blur"},{pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}]}}},methods: {add() {this.centerDialogVisible = truethis.$nextTick(() => {this.resetForm()})},mod(row) {//this.form=row就可以了this.centerDialogVisible = truethis.$nextTick(() => {this.form.id = row.id;this.form.no = row.no;this.form.name = row.name;this.form.sex = row.sex + '';this.form.age = row.age + '';//转化成字符串类型this.form.phone = row.phone;this.form.password = '';this.form.roleId = row.roleId;})//修改User的时候要确保账号不能修改,否则有可能会数据库存在账号相同的情况!!!!给账号的input里加个v-bind:disabled="isDisabled“,如果是修改就把isDisabled设置为true,添加就false},del(id) {this.$axios.get(this.$httpUrl + '/user/del?id=' + id).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.loadPost();} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},resetForm() {this.centerDialogVisible = truethis.$refs.form.resetFields();},doSave() {this.$axios.post(this.$httpUrl + '/user/save', this.form).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = falsethis.loadPost();this.resetForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},doMod() {this.$axios.post(this.$httpUrl + '/user/update', this.form).then(res => res.data).then(res => {console.log(res);if (res.code == 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = false;this.loadPost();this.resetForm();} else {this.$message({message: '操作失败!',type: 'error'});}});},save() {this.$refs.form.validate((valid) => {if (valid) {if (this.form.id) {this.doMod();} else {this.doSave();}} else {console.log('error submit!!');return false;}});},loadGet() {this.$axios.get(this.$httpUrl + '/user/list').then(res => res.data).then(res => {console.log(res)})},loadPost() {this.$axios.post(this.$httpUrl + '/user/listPageC1', {pageSize: this.pageSize,pageNum: this.pageNum,param: {name: this.name,sex: this.sex,roleId:'2'}}).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.tableData = res.datathis.total = res.total} else {alert('获取数据失败!请刷新页面')}})},resetParam() {this.name = ''this.sex = ''},selectCurrentChange(val) {//this.currentRow=valthis.$emit("doSelectUser",val)},handleSizeChange(val) {console.log(`每页 ${val} 条`);this.pageNum = 1//这个错误是先翻到第二页在调页面条数,显示无数据this.pageSize = valthis.loadPost()},handleCurrentChange(val) {console.log(`当前页: ${val}`);this.pageNum = valthis.loadPost()}},beforeMount() {// this.loadGet();this.loadPost()}
}</script>

GoodsManage.vue

<template><div><div style="margin-left:5px"><el-input v-model="name" placeholder="请输入物品名:" suffix-icon="el-icon-search" style="width:200px;"@keyup.enter.native="loadPost"></el-input><el-select v-model="storage" placehoLder="请选择仓库" style="margin-left: 5px;"><el-optionv-for="item in storageData":key="item.id":label="item.name":value="item.id"></el-option></el-select><el-select v-model="goodstype" placeholder="请选择分类" style="margin-left: 5px;"><el-optionv-for="item in goodstypeData":key="item.id":label="item.name":value="item.id"></el-option></el-select><el-button type="primary" style="margin-left:5px" @click="loadPost">查询</el-button><el-button type="success" @click="resetParam">重置</el-button><el-button type="primary" style="margin-left:5px" @click="add">新增</el-button><el-button type="success" style="margin-left:5px;" @click="inGoods">入库</el-button><el-button type="success" style="margin-left:5px;" @click="outGoods">出库</el-button></div><el-table :data="tableData":header-cell-style="{background:'#f2f5fc',color:'#555'}"borderhighlight-current-row@current-change="selectCurrentChange"><el-table-column prop="id" label="ID" width="60"></el-table-column><el-table-column prop="name" label="物品名" width="80"></el-table-column><el-table-column prop="storage" label="仓库" :formatter="formatStorage"></el-table-column><el-table-column prop="goodstype" label="分类" :formatter="formatGoodsType"></el-table-column><el-table-column prop="count" label="数量"></el-table-column><el-table-column prop="remark" label="备注"></el-table-column><el-table-column prop="operate" label="操作"><template slot-scope="scope"><el-button size="small" type="success" @click="mod(scope.row)">编辑</el-button><el-popconfirmtitle="确定删除吗?"@confirm="del(scope.row.id)"style="margin-left:8px;"><el-button slot="reference" size="small" type="danger">删除</el-button></el-popconfirm></template></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pageNum":page-sizes="[5, 10, 20, 50]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination><el-dialogtitle="物品维护":visible.sync="centerDialogVisible"width="30%"center><el-form ref="form" :rules="rules" :model="form" label-width="80px"><el-form-item label="物品名" prop="name"><el-col :span="20"><el-input v-model="form.name"></el-input></el-col></el-form-item><el-form-item label="仓库" prop="storage"><el-col :span="20"><el-select v-model="form.storage" placehoLder="请选择仓库" style="margin-left: 5px;"><el-optionv-for="item in storageData":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-col></el-form-item><el-form-item label="分类" prop="goodstype"><el-col :span="20"><el-select v-model="form.goodstype" placeholder="请选择分类" style="margin-left: 5px;"><el-optionv-for="item in goodstypeData":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-col></el-form-item><el-form-item label="数量" prop="count"><el-col :span="20"><el-input v-model="form.count"></el-input></el-col></el-form-item><el-form-item label="备注" prop="remark"><el-col :span="20"><el-input type="textarea" v-model="form.remark"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="centerDialogVisible=false">取消</el-button><el-button type="primary" @click="save">确定</el-button></span></el-dialog><el-dialogtitle="出入库":visible.sync="inDialogVisible"width="30%"center><el-dialogwidth="70%"title="用户选择":visible.sync="innerVisible"append-to-body><SelectUser @doSelectUser="doSelectUser"></SelectUser><span slot="footer" class="dialog-footer"><el-button @click="innerVisible=false">取消</el-button><el-button type="primary" @click="confirmUser">确定</el-button></span></el-dialog><el-form ref="form1" :rules="rules1" :model="form1" label-width="80px"><el-form-item label="物品名"><el-col :span="20"><el-input v-model="form1.goodsname" readonly></el-input></el-col></el-form-item><el-form-item label="申请人"><el-col :span="20"><el-input v-model="form1.username" readonly @click.native="selectUser"></el-input></el-col></el-form-item><el-form-item label="数量" prop="count"><el-col :span="20"><el-input v-model="form1.count"></el-input></el-col></el-form-item><el-form-item label="备注" prop="remark"><el-col :span="20"><el-input type="textarea" v-model="form1.remark"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="inDialogVisible=false">取消</el-button><el-button type="primary" @click="doInGoods">确定</el-button></span></el-dialog></div>
</template><style scoped></style>
<script>import SelectUser from "../user/SelectUser";export default {name: "GoodsManage",components: {SelectUser},data() {let checkCount = (rule, value, callback) => {if (value > 9999) {callback(new Error('数量输入过大'));} else {callback();}};return {user: JSON.parse(sessionStorage.getItem('CurUser')),storageData: [],tableData: [],goodstypeData: [],pageSize: 10,pageNum: 1,storage: '',goodstype: '',total: 0,name: '',centerDialogVisible: false,inDialogVisible: false,innerVisible: false,currentRow: {},tempUser: {},form: {id: '',name: '',remark: '',count: '',storage: '',goodstype: '',},form1: {goods: '',goodsname: '',count: '',username: '',userid: '',adminId: '',remark: '',action:1,},rules1: {},rules: {name: [{required: true, message: '请输入物品名', trigger: 'blur'},],storage: [{required: true, message: '请选择仓库', trigger: 'blur'}],goodstype: [{required: true, message: '请选择分类’,trigger:‘blur'}],count: [{required: true, message: '请输入数量', trigger: 'blur'},{pattern: /^([1-9][0-9]*){1,4}$/, message: '数量必须为正整数', trigger: "blur"},{validator: checkCount, trigger: 'blur'}]}}},methods: {confirmUser() {this.username = this.tempUser.namethis.userid = this.tempUser.idthis.innerVisible = false},doSelectUser(val) {console.log(val)this.tempUser = val},selectCurrentChange(val) {this.currentRow = val;},formatStorage(row) {let temp = this.storageData.find(item => {return item.id === row.storage})return temp && temp.name},formatGoodsType(row) {let temp = this.goodstypeData.find(item => {return item.id === row.goodstype})return temp && temp.name},add() {this.centerDialogVisible = truethis.$nextTick(() => {this.resetForm()this.form.id = ''})},inGoods() {if (!this.currentRow.id) {alert('请选择记录');return;}this.inDialogVisible = truethis.$nextTick(() => {this.resetInForm()})this.form1.goodsname = this.currentRow.namethis.form1.goods = this.currentRow.idthis.form1.adminId = this.user.idthis.form1.action = '1'},outGoods() {if (!this.currentRow.id) {alert('请选择记录');return;}this.inDialogVisible = truethis.$nextTick(() => {this.resetInForm()})this.form1.goodsname = this.currentRow.namethis.form1.goods = this.currentRow.idthis.form1.adminId = this.user.idthis.form1.action = '2'},mod(row) {//this.form=row就可以了this.centerDialogVisible = truethis.$nextTick(() => {this.form.id = row.id;this.form.remark = row.remark;this.form.name = row.name;this.form.storage = row.storage;this.form.goodstype = row.goodstype;this.form.count = row.count;})},del(id) {this.$axios.get(this.$httpUrl + '/goods/del?id=' + id).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.loadPost();} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},selectUser() {this.innerVisible = true;},resetForm() {//this.centerDialogVisible = truethis.$refs.form.resetFields();//this.form.id = '';},resetInForm() {this.$refs.form1.resetFields();},doSave() {this.$axios.post(this.$httpUrl + '/goods/save', this.form).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = falsethis.loadPost();this.resetForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},doMod() {this.$axios.post(this.$httpUrl + '/goods/update', this.form).then(res => res.data).then(res => {console.log(res);if (res.code == 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = false;this.loadPost();this.resetForm();} else {this.$message({message: '操作失败!',type: 'error'});}});},save() {this.$refs.form.validate((valid) => {if (valid) {if (this.form.id) {this.doMod();} else {this.doSave();}} else {console.log('error submit!!');return false;}});},loadPost() {this.$axios.post(this.$httpUrl + '/goods/listPage', {pageSize: this.pageSize,pageNum: this.pageNum,param: {name: this.name,goodstype: this.goodstype + '',//string和int强转一下storage: this.storage + ''}}).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.tableData = res.datathis.total = res.total} else {alert('获取数据失败!请刷新页面')}})},loadStorage() {this.$axios.get(this.$httpUrl + '/storage/list').then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.storageData = res.data} else {alert('获取数据失败!请刷新页面')}})},loadGoodsType() {this.$axios.get(this.$httpUrl + '/goodstype/list').then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.goodstypeData = res.data} else {alert('获取数据失败!请刷新页面')}})},resetParam() {this.name = ''this.storage = ''this.goodstype = ''},doInGoods() {this.$axios.post(this.$httpUrl + '/record/save', this.form1).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.inDialogVisible = falsethis.loadPost();this.resetInForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},handleSizeChange(val) {console.log(`每页 ${val} 条`);this.pageNum = 1//这个错误是先翻到第二页在调页面条数,显示无数据this.pageSize = valthis.loadPost()},handleCurrentChange(val) {console.log(`当前页: ${val}`);this.pageNum = valthis.loadPost()}},beforeMount() {this.loadStorage()this.loadGoodsType()this.loadPost()}
}</script>

申请人不知道为什么没传上去 😡😡😡😡😡😡😡😡😡😡😡😡

三十四、权限控制优化

如果要保险得在后端用过滤器进行监听,但是我懒得做

SelectUser

<template><div><div style="margin-left:5px"><el-input v-model="name" placeholder="请输入名字:" suffix-icon="el-icon-search" style="width:200px;"@keyup.enter.native="loadPost"></el-input><el-select v-model="sex" filterableplacehoLder="请选择性别" style="margin-left:5px"><el-optionv-for="item in sexs":key="item.value":label="item.label":value="item.value"></el-option></el-select><el-button type="primary" style="margin-left:5px" @click="loadPost">查询</el-button><el-button type="success" @click="resetParam">重置</el-button><!--<el-button type="primary" style="margin-left:5px" @click="add">新增</el-button>--></div><el-table :data="tableData":header-cell-style="{background:'#f2f5fc',color:'#555'}"borderhighlight-current-row@current-change="selectCurrentChange"><el-table-column prop="id" label="ID" width="60"></el-table-column><el-table-column prop="no" label="账号" width="150"></el-table-column><el-table-column prop="name" label="姓名" width="120"></el-table-column><el-table-column prop="age" label="年龄" width="80"></el-table-column><el-table-column prop="sex" label="性别" width="80"><template slot-scope="scope"><el-tag:type="scope.row.sex === 1 ?'primary':'success'"disable-transitions>{{ scope.row.sex === 1 ? '男' : '女' }}</el-tag></template></el-table-column><el-table-column prop="roleId" label="角色" width="120"><template slot-scope="scope"><el-tag:type="scope.row.roleId === 0 ?'danger':(scope.row.roleId === 1 ?'primary':'success')"disable-transitions>{{ scope.row.roleId === 0 ? '超级管理员' : (scope.row.roleId === 1 ? '管理员' : '用户') }}</el-tag></template></el-table-column><el-table-column prop="phone" label="电话" ></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pageNum":page-sizes="[5, 10, 20, 50]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination><el-dialogtitle="提示":visible.sync="centerDialogVisible"width="30%"center><el-form ref="form" :rules="rules" :model="form" label-width="80px"><el-form-item label="账号" prop="no"><el-col :span="20"><el-input v-model="form.no"></el-input></el-col></el-form-item><el-form-item label="密码" prop="password"><el-col :span="20"><el-input v-model="form.password"></el-input></el-col></el-form-item><el-form-item label="名字" prop="name"><el-col :span="20"><el-input v-model="form.name"></el-input></el-col></el-form-item><el-form-item label="年龄" prop="age"><el-col :span="20"><el-input v-model="form.age"></el-input></el-col></el-form-item><el-form-item label="性别"><el-radio-group v-model="form.sex"><el-radio label="1">男</el-radio><el-radio label="0">女</el-radio></el-radio-group></el-form-item><el-form-item label="电话" prop="phone"><el-col :span="20"><el-input v-model="form.phone"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="centerDialogVisible=false">取消</el-button><el-button type="primary" @click="save">确定</el-button></span></el-dialog></div>
</template><style scoped></style>
<script>
export default {name: "SelectUser",data() {let checkAge = (rule, value, callback) => {if (value > 150) {callback(new Error('年龄太大!lbd再来我让你飞起来!'));} else {callback();}};let checkDuplicate = (rule, value, callback) => {if (this.form.id) {return callback();}this.$axios.get(this.$httpUrl + "/user/findByNo?no=" + this.form.no).then(res => res.data).then(res => {if (res.code !== 200) {//es6解构也可以callback();} else {callback(new Error('账号已经存在'));}});};return {tableData: [],pageSize: 10,pageNum: 1,total: 0,name: '',sex: '',sexs: [{value: '1',label: '男'}, {value: '0',label: '女'}],centerDialogVisible: false,form: {name: '',no: '',age: '',password: '',phone: '',sex: '0',roleId: '2'},rules: {no: [{required: true, message: '请输入账号', trigger: 'blur'},{min: 3, max: 8, message: '长度在3-8个字符', trigger: 'blur'},{validator: checkDuplicate, trigger: 'blur'}],name: [{required: true, message: '请输入名字', trigger: 'blur'},],password: [{required: true, message: '请输入密码', trigger: 'blur'},{min: 4, max: 10, message: '长度在4-10个字符之间', trigger: 'blur'}],age: [{required: true, message: '请输入年龄', trigger: 'blur'},{min: 1, max: 3, message: '长度在1到3个位', trigger: 'blur'},{pattern: /^([1-9][0-9]*){1,3}$/, message: '年龄必须为正整数字', trigger: "blur"},{validator: checkAge, trigger: 'blur'}],phone: [{required: true, message: "手机号不能为空", trigger: "blur"},{pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}]}}},methods: {add() {this.centerDialogVisible = truethis.$nextTick(() => {this.resetForm()})},mod(row) {//this.form=row就可以了this.centerDialogVisible = truethis.$nextTick(() => {this.form.id = row.id;this.form.no = row.no;this.form.name = row.name;this.form.sex = row.sex + '';this.form.age = row.age + '';//转化成字符串类型this.form.phone = row.phone;this.form.password = '';this.form.roleId = row.roleId;})//修改User的时候要确保账号不能修改,否则有可能会数据库存在账号相同的情况!!!!给账号的input里加个v-bind:disabled="isDisabled“,如果是修改就把isDisabled设置为true,添加就false},del(id) {this.$axios.get(this.$httpUrl + '/user/del?id=' + id).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.loadPost();} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},resetForm() {this.centerDialogVisible = truethis.$refs.form.resetFields();},doSave() {this.$axios.post(this.$httpUrl + '/user/save', this.form).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = falsethis.loadPost();this.resetForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},doMod() {this.$axios.post(this.$httpUrl + '/user/update', this.form).then(res => res.data).then(res => {console.log(res);if (res.code == 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = false;this.loadPost();this.resetForm();} else {this.$message({message: '操作失败!',type: 'error'});}});},save() {this.$refs.form.validate((valid) => {if (valid) {if (this.form.id) {this.doMod();} else {this.doSave();}} else {console.log('error submit!!');return false;}});},loadGet() {this.$axios.get(this.$httpUrl + '/user/list').then(res => res.data).then(res => {console.log(res)})},loadPost() {this.$axios.post(this.$httpUrl + '/user/listPageC1', {pageSize: this.pageSize,pageNum: this.pageNum,param: {name: this.name,sex: this.sex,roleId:'2'}}).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.tableData = res.datathis.total = res.total} else {alert('获取数据失败!请刷新页面')}})},resetParam() {this.name = ''this.sex = ''},selectCurrentChange(val) {//this.currentRow=valthis.$emit("doSelectUser",val)},handleSizeChange(val) {console.log(`每页 ${val} 条`);this.pageNum = 1//这个错误是先翻到第二页在调页面条数,显示无数据this.pageSize = valthis.loadPost()},handleCurrentChange(val) {console.log(`当前页: ${val}`);this.pageNum = valthis.loadPost()}},beforeMount() {// this.loadGet();this.loadPost()}
}</script>

GoodsManage

<template><div><div style="margin-left:5px"><el-input v-model="name" placeholder="请输入物品名:" suffix-icon="el-icon-search" style="width:200px;"@keyup.enter.native="loadPost"></el-input><el-select v-model="storage" placehoLder="请选择仓库" style="margin-left: 5px;"><el-optionv-for="item in storageData":key="item.id":label="item.name":value="item.id"></el-option></el-select><el-select v-model="goodstype" placeholder="请选择分类" style="margin-left: 5px;"><el-optionv-for="item in goodstypeData":key="item.id":label="item.name":value="item.id"></el-option></el-select><el-button type="primary" style="margin-left:5px" @click="loadPost">查询</el-button><el-button type="success" @click="resetParam">重置</el-button><el-button type="primary" style="margin-left:5px" @click="add" v-if="user.roleId!=2">新增</el-button><el-button type="success" style="margin-left:5px;" @click="inGoods" v-if="user.roleId!=2">入库</el-button><el-button type="success" style="margin-left:5px;" @click="outGoods" v-if="user.roleId!=2">出库</el-button></div><el-table :data="tableData":header-cell-style="{background:'#f2f5fc',color:'#555'}"borderhighlight-current-row@current-change="selectCurrentChange"><el-table-column prop="id" label="ID" width="60"></el-table-column><el-table-column prop="name" label="物品名" width="80"></el-table-column><el-table-column prop="storage" label="仓库" :formatter="formatStorage"></el-table-column><el-table-column prop="goodstype" label="分类" :formatter="formatGoodsType"></el-table-column><el-table-column prop="count" label="数量"></el-table-column><el-table-column prop="remark" label="备注"></el-table-column><el-table-column prop="operate" label="操作" v-if="user.roleId!=2"><template slot-scope="scope"><el-button size="small" type="success" @click="mod(scope.row)">编辑</el-button><el-popconfirmtitle="确定删除吗?"@confirm="del(scope.row.id)"style="margin-left:8px;"><el-button slot="reference" size="small" type="danger">删除</el-button></el-popconfirm></template></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pageNum":page-sizes="[5, 10, 20, 50]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination><el-dialogtitle="物品维护":visible.sync="centerDialogVisible"width="30%"center><el-form ref="form" :rules="rules" :model="form" label-width="80px"><el-form-item label="物品名" prop="name"><el-col :span="20"><el-input v-model="form.name"></el-input></el-col></el-form-item><el-form-item label="仓库" prop="storage"><el-col :span="20"><el-select v-model="form.storage" placehoLder="请选择仓库" style="margin-left: 5px;"><el-optionv-for="item in storageData":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-col></el-form-item><el-form-item label="分类" prop="goodstype"><el-col :span="20"><el-select v-model="form.goodstype" placeholder="请选择分类" style="margin-left: 5px;"><el-optionv-for="item in goodstypeData":key="item.id":label="item.name":value="item.id"></el-option></el-select></el-col></el-form-item><el-form-item label="数量" prop="count"><el-col :span="20"><el-input v-model="form.count"></el-input></el-col></el-form-item><el-form-item label="备注" prop="remark"><el-col :span="20"><el-input type="textarea" v-model="form.remark"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="centerDialogVisible=false">取消</el-button><el-button type="primary" @click="save">确定</el-button></span></el-dialog><el-dialogtitle="出入库":visible.sync="inDialogVisible"width="30%"center><el-dialogwidth="70%"title="用户选择":visible.sync="innerVisible"append-to-body><SelectUser @doSelectUser="doSelectUser"></SelectUser><span slot="footer" class="dialog-footer"><el-button @click="innerVisible=false">取消</el-button><el-button type="primary" @click="confirmUser">确定</el-button></span></el-dialog><el-form ref="form1" :rules="rules1" :model="form1" label-width="80px"><el-form-item label="物品名"><el-col :span="20"><el-input v-model="form1.goodsname" readonly></el-input></el-col></el-form-item><el-form-item label="申请人"><el-col :span="20"><el-input v-model="form1.username" readonly @click.native="selectUser"></el-input></el-col></el-form-item><el-form-item label="数量" prop="count"><el-col :span="20"><el-input v-model="form1.count"></el-input></el-col></el-form-item><el-form-item label="备注" prop="remark"><el-col :span="20"><el-input type="textarea" v-model="form1.remark"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="inDialogVisible=false">取消</el-button><el-button type="primary" @click="doInGoods">确定</el-button></span></el-dialog></div>
</template><style scoped></style>
<script>import SelectUser from "../user/SelectUser";export default {name: "GoodsManage",components: {SelectUser},data() {let checkCount = (rule, value, callback) => {if (value > 9999) {callback(new Error('数量输入过大'));} else {callback();}};return {user: JSON.parse(sessionStorage.getItem('CurUser')),storageData: [],tableData: [],goodstypeData: [],pageSize: 10,pageNum: 1,storage: '',goodstype: '',total: 0,name: '',centerDialogVisible: false,inDialogVisible: false,innerVisible: false,currentRow: {},tempUser: {},form: {id: '',name: '',remark: '',count: '',storage: '',goodstype: '',},form1: {goods: '',goodsname: '',count: '',username: '',userid: '',adminId: '',remark: '',action: 1,},rules1: {},rules: {name: [{required: true, message: '请输入物品名', trigger: 'blur'},],storage: [{required: true, message: '请选择仓库', trigger: 'blur'}],goodstype: [{required: true, message: '请选择分类’,trigger:‘blur'}],count: [{required: true, message: '请输入数量', trigger: 'blur'},{pattern: /^([1-9][0-9]*){1,4}$/, message: '数量必须为正整数', trigger: "blur"},{validator: checkCount, trigger: 'blur'}]}}},methods: {confirmUser() {this.username = this.tempUser.namethis.userid = this.tempUser.idthis.innerVisible = false},doSelectUser(val) {console.log(val)this.tempUser = val},selectCurrentChange(val) {this.currentRow = val;},formatStorage(row) {let temp = this.storageData.find(item => {return item.id === row.storage})return temp && temp.name},formatGoodsType(row) {let temp = this.goodstypeData.find(item => {return item.id === row.goodstype})return temp && temp.name},add() {this.centerDialogVisible = truethis.$nextTick(() => {this.resetForm()this.form.id = ''})},inGoods() {if (!this.currentRow.id) {alert('请选择记录');return;}this.inDialogVisible = truethis.$nextTick(() => {this.resetInForm()})this.form1.goodsname = this.currentRow.namethis.form1.goods = this.currentRow.idthis.form1.adminId = this.user.idthis.form1.action = '1'},outGoods() {if (!this.currentRow.id) {alert('请选择记录');return;}this.inDialogVisible = truethis.$nextTick(() => {this.resetInForm()})this.form1.goodsname = this.currentRow.namethis.form1.goods = this.currentRow.idthis.form1.adminId = this.user.idthis.form1.action = '2'},mod(row) {//this.form=row就可以了this.centerDialogVisible = truethis.$nextTick(() => {this.form.id = row.id;this.form.remark = row.remark;this.form.name = row.name;this.form.storage = row.storage;this.form.goodstype = row.goodstype;this.form.count = row.count;})},del(id) {this.$axios.get(this.$httpUrl + '/goods/del?id=' + id).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.loadPost();} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},selectUser() {this.innerVisible = true;},resetForm() {//this.centerDialogVisible = truethis.$refs.form.resetFields();//this.form.id = '';},resetInForm() {this.$refs.form1.resetFields();},doSave() {this.$axios.post(this.$httpUrl + '/goods/save', this.form).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = falsethis.loadPost();this.resetForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},doMod() {this.$axios.post(this.$httpUrl + '/goods/update', this.form).then(res => res.data).then(res => {console.log(res);if (res.code == 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = false;this.loadPost();this.resetForm();} else {this.$message({message: '操作失败!',type: 'error'});}});},save() {this.$refs.form.validate((valid) => {if (valid) {if (this.form.id) {this.doMod();} else {this.doSave();}} else {console.log('error submit!!');return false;}});},loadPost() {this.$axios.post(this.$httpUrl + '/goods/listPage', {pageSize: this.pageSize,pageNum: this.pageNum,param: {name: this.name,goodstype: this.goodstype + '',//string和int强转一下storage: this.storage + ''}}).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.tableData = res.datathis.total = res.total} else {alert('获取数据失败!请刷新页面')}})},loadStorage() {this.$axios.get(this.$httpUrl + '/storage/list').then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.storageData = res.data} else {alert('获取数据失败!请刷新页面')}})},loadGoodsType() {this.$axios.get(this.$httpUrl + '/goodstype/list').then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.goodstypeData = res.data} else {alert('获取数据失败!请刷新页面')}})},resetParam() {this.name = ''this.storage = ''this.goodstype = ''},doInGoods() {this.$axios.post(this.$httpUrl + '/record/save', this.form1).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.inDialogVisible = falsethis.loadPost();this.resetInForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},handleSizeChange(val) {console.log(`每页 ${val} 条`);this.pageNum = 1//这个错误是先翻到第二页在调页面条数,显示无数据this.pageSize = valthis.loadPost()},handleCurrentChange(val) {console.log(`当前页: ${val}`);this.pageNum = valthis.loadPost()}},beforeMount() {this.loadStorage()this.loadGoodsType()this.loadPost()}
}</script>

RecordManage

<template><div><div style="margin-left:5px"><el-input v-model="name" placeholder="请输入物品名:" suffix-icon="el-icon-search" style="width:200px;"@keyup.enter.native="loadPost"></el-input><el-select v-model="storage" placehoLder="请选择仓库" style="margin-left: 5px;"><el-optionv-for="item in storageData":key="item.id":label="item.name":value="item.id"></el-option></el-select><el-select v-model="goodstype" placeholder="请选择分类" style="margin-left: 5px;"><el-optionv-for="item in goodstypeData":key="item.id":label="item.name":value="item.id"></el-option></el-select><el-button type="primary" style="margin-left:5px" @click="loadPost">查询</el-button><el-button type="success" @click="resetParam">重置</el-button></div><el-table :data="tableData":header-cell-style="{background:'#f2f5fc',color:'#555'}"border><el-table-column prop="id" label="ID" width="60"></el-table-column><el-table-column prop="goodsname" label="物品名" width="80"></el-table-column><el-table-column prop="storagename" label="仓库"  ></el-table-column><el-table-column prop="goodstypename" label="分类"  ></el-table-column><el-table-column prop="adminname" label="操作人"  ></el-table-column><el-table-column prop="username" label="申请人"  ></el-table-column><el-table-column prop="count" label="数量"></el-table-column><el-table-column prop="createtime" label="操作时间"></el-table-column><el-table-column prop="remark" label="备注"></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pageNum":page-sizes="[5, 10, 20, 50]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination></div>
</template><style scoped></style>
<script>
export default {name: "RecordManage",data() {return {user:JSON.parse(sessionStorage.getItem('CurUser')),storageData: [],tableData: [],goodstypeData: [],pageSize: 10,pageNum: 1,storage: '',goodstype: '',total: 0,name: '',centerDialogVisible: false,form: {id: '',name: '',remark: '',count: '',storage: '',goodstype: '',},}},methods: {formatStorage(row) {let temp = this.storageData.find(item => {return item.id === row.storage})return temp && temp.name},formatGoodsType(row) {let temp = this.goodstypeData.find(item => {return item.id === row.goodstype})return temp && temp.name},add() {this.centerDialogVisible = truethis.$nextTick(() => {this.resetForm()this.form.id = ''})},mod(row) {//this.form=row就可以了this.centerDialogVisible = truethis.$nextTick(() => {this.form.id = row.id;this.form.remark = row.remark;this.form.name = row.name;this.form.storage = row.storage;this.form.goodstype = row.goodstype;this.form.count = row.count;})},del(id) {this.$axios.get(this.$httpUrl + '/goods/del?id=' + id).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.loadPost();} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},resetForm() {this.centerDialogVisible = truethis.$refs.form.resetFields();this.form.id = '';},doSave() {this.$axios.post(this.$httpUrl + '/goods/save', this.form).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = falsethis.loadPost();this.resetForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},doMod() {this.$axios.post(this.$httpUrl + '/goods/update', this.form).then(res => res.data).then(res => {console.log(res);if (res.code == 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = false;this.loadPost();this.resetForm();} else {this.$message({message: '操作失败!',type: 'error'});}});},save() {this.$refs.form.validate((valid) => {if (valid) {if (this.form.id) {this.doMod();} else {this.doSave();}} else {console.log('error submit!!');return false;}});},loadPost() {this.$axios.post(this.$httpUrl + '/record/listPage', {pageSize: this.pageSize,pageNum: this.pageNum,param: {name: this.name,goodstype: this.goodstype + '',//string和int强转一下storage: this.storage + '',roleId:this.user.roleId+'',userId:this.user.id+'',}}).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.tableData = res.datathis.total = res.total} else {alert('获取数据失败!请刷新页面')}})},loadStorage() {this.$axios.get(this.$httpUrl + '/storage/list').then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.storageData = res.data} else {alert('获取数据失败!请刷新页面')}})},loadGoodsType() {this.$axios.get(this.$httpUrl + '/goodstype/list').then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.goodstypeData = res.data} else {alert('获取数据失败!请刷新页面')}})},resetParam() {this.name = ''this.storage = ''this.goodstype = ''},handleSizeChange(val) {console.log(`每页 ${val} 条`);this.pageNum = 1//这个错误是先翻到第二页在调页面条数,显示无数据this.pageSize = valthis.loadPost()},handleCurrentChange(val) {console.log(`当前页: ${val}`);this.pageNum = valthis.loadPost()}},beforeMount() {this.loadGoodsType()this.loadStorage()this.loadPost()}
}</script>

RecordController

package com.wms.controller;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wms.common.QueryPageParam;
import com.wms.common.Result;
import com.wms.entity.Goods;
import com.wms.entity.Record;
import com.wms.service.GoodsService;
import com.wms.service.RecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;/*** <p>* 前端控制器* </p>** @author wms* @since 2024-12-07*/
@RestController
@RequestMapping("/record")
public class RecordController {@Autowiredprivate RecordService recordService;@Autowiredprivate GoodsService goodsService;@PostMapping("/listPage")public Result listPage(@RequestBody QueryPageParam query) {HashMap param = query.getParam();String name = (String) param.get("name");String storage = (String) param.get("storage");String goodstype = (String) param.get("goodstype");String roleId = (String) param.get("roleId");String userId = (String) param.get("userId");Page<Record> page = new Page();page.setCurrent(query.getPageNum());page.setSize(query.getPageSize());QueryWrapper<Record> queryWrapper = new QueryWrapper();queryWrapper.apply(" a.goods=b.id and b.storage=c.id and b.goodsType=d.id ");if("2".equals(roleId)) {//queryWrapper.eq(Record::getUserid, userId);queryWrapper.apply("a.userId="+userId);}if (StringUtils.isNotBlank(name) && !"null".equals(name)) {//lambdaQueryWrapper.like(Record::getName, name);queryWrapper.like("b.name", name);}if (StringUtils.isNotBlank(storage) && !"null".equals(storage)) {queryWrapper.eq("c.id", storage);}if (StringUtils.isNotBlank(goodstype) && !"null".equals(goodstype)) {queryWrapper.eq("d.id", goodstype);}IPage result = recordService.pageCC(page, queryWrapper);return Result.success(result.getRecords(), result.getTotal());}//将入库数据和原有数据相加吧//新增@PostMapping("/save")public Result save(@RequestBody Record record) {Goods goods = goodsService.getById(record.getGoods());int n = record.getCount();//出库if("2".equals(record.getAction())) {n = -n;record.setCount(n);}int num = goods.getCount() + n;goods.setCount(num);goodsService.updateById(goods);return recordService.save(record) ? Result.success() : Result.fail();}
}

UserManage

<template><div><div style="margin-left:5px"><el-input v-model="name" placeholder="请输入名字:" suffix-icon="el-icon-search" style="width:200px;"@keyup.enter.native="loadPost"></el-input><el-select v-model="sex" filterableplacehoLder="请选择性别" style="margin-left:5px"><el-optionv-for="item in sexs":key="item.value":label="item.label":value="item.value"></el-option></el-select><el-button type="primary" style="margin-left:5px" @click="loadPost">查询</el-button><el-button type="success" @click="resetParam">重置</el-button><el-button type="primary" style="margin-left:5px" @click="add">新增</el-button></div><el-table :data="tableData":header-cell-style="{background:'#f2f5fc',color:'#555'}"border><el-table-column prop="id" label="ID" width="60"></el-table-column><el-table-column prop="no" label="账号" width="120"></el-table-column><el-table-column prop="name" label="姓名" width="80"></el-table-column><el-table-column prop="age" label="年龄" width="80"></el-table-column><el-table-column prop="sex" label="性别" width="80"><template slot-scope="scope"><el-tag:type="scope.row.sex === 1 ?'primary':'success'"disable-transitions>{{ scope.row.sex === 1 ? '男' : '女' }}</el-tag></template></el-table-column><el-table-column prop="roleId" label="角色" width="120"><template slot-scope="scope"><el-tag:type="scope.row.roleId === 0 ?'danger':(scope.row.roleId === 1 ?'primary':'success')"disable-transitions>{{ scope.row.roleId === 0 ? '超级管理员' : (scope.row.roleId === 1 ? '管理员' : '用户') }}</el-tag></template></el-table-column><el-table-column prop="phone" label="电话" width="120"></el-table-column><el-table-column prop="operate" label="操作"><template slot-scope="scope"><el-button size="small" type="success" @click="mod(scope.row)">编辑</el-button><el-popconfirmtitle="确定删除吗?"@confirm="del(scope.row.id)"style="margin-left:8px;"><el-button  slot="reference" size="small" type="danger">删除</el-button></el-popconfirm></template></el-table-column></el-table><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="pageNum":page-sizes="[5, 10, 20, 50]":page-size="pageSize"layout="total, sizes, prev, pager, next, jumper":total="total"></el-pagination><el-dialogtitle="提示":visible.sync="centerDialogVisible"width="30%"center><el-form ref="form" :rules="rules" :model="form" label-width="80px"><el-form-item label="账号" prop="no"><el-col :span="20"><el-input v-model="form.no"></el-input></el-col></el-form-item><el-form-item label="密码" prop="password"><el-col :span="20"><el-input v-model="form.password"></el-input></el-col></el-form-item><el-form-item label="名字" prop="name"><el-col :span="20"><el-input v-model="form.name"></el-input></el-col></el-form-item><el-form-item label="年龄" prop="age"><el-col :span="20"><el-input v-model="form.age"></el-input></el-col></el-form-item><el-form-item label="性别"><el-radio-group v-model="form.sex"><el-radio label="1">男</el-radio><el-radio label="0">女</el-radio></el-radio-group></el-form-item><el-form-item label="电话" prop="phone"><el-col :span="20"><el-input v-model="form.phone"></el-input></el-col></el-form-item></el-form><span slot="footer" class="dialog-footer"><el-button @click="centerDialogVisible=false">取消</el-button><el-button type="primary" @click="save">确定</el-button></span></el-dialog></div>
</template><style scoped></style>
<script>
export default {name: "UserManage",data() {let checkAge = (rule, value, callback) => {if (value > 150) {callback(new Error('年龄太大!lbd再来我让你飞起来!'));} else {callback();}};let checkDuplicate = (rule, value, callback) => {if (this.form.id) {return callback();}this.$axios.get(this.$httpUrl + "/user/findByNo?no=" + this.form.no).then(res => res.data).then(res => {if (res.code !== 200) {//es6解构也可以callback();} else {callback(new Error('账号已经存在'));}});};return {tableData: [],pageSize: 10,pageNum: 1,total: 0,name: '',sex: '',sexs: [{value: '1',label: '男'}, {value: '0',label: '女'}],centerDialogVisible: false,form: {name: '',no: '',age: '',password: '',phone: '',sex: '0',roleId: '2'},rules: {no: [{required: true, message: '请输入账号', trigger: 'blur'},{min: 3, max: 8, message: '长度在3-8个字符', trigger: 'blur'},{validator: checkDuplicate, trigger: 'blur'}],name: [{required: true, message: '请输入名字', trigger: 'blur'},],password: [{required: true, message: '请输入密码', trigger: 'blur'},{min: 4, max: 10, message: '长度在4-10个字符之间', trigger: 'blur'}],age: [{required: true, message: '请输入年龄', trigger: 'blur'},{min: 1, max: 3, message: '长度在1到3个位', trigger: 'blur'},{pattern: /^([1-9][0-9]*){1,3}$/, message: '年龄必须为正整数字', trigger: "blur"},{validator: checkAge, trigger: 'blur'}],phone: [{required: true, message: "手机号不能为空", trigger: "blur"},{pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "请输入正确的手机号码", trigger: "blur"}]}}},methods: {add() {this.centerDialogVisible = truethis.$nextTick(() => {this.resetForm()})},mod(row) {//this.form=row就可以了this.centerDialogVisible = truethis.$nextTick(() => {this.form.id = row.id;this.form.no = row.no;this.form.name = row.name;this.form.sex = row.sex + '';this.form.age = row.age + '';//转化成字符串类型this.form.phone = row.phone;this.form.password = '';this.form.roleId = row.roleId;})//修改User的时候要确保账号不能修改,否则有可能会数据库存在账号相同的情况!!!!给账号的input里加个v-bind:disabled="isDisabled“,如果是修改就把isDisabled设置为true,添加就false},del(id) {this.$axios.get(this.$httpUrl + '/user/del?id=' + id).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.loadPost();} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},resetForm() {this.centerDialogVisible = truethis.$refs.form.resetFields();},doSave() {this.$axios.post(this.$httpUrl + '/user/save', this.form).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = falsethis.loadPost();this.resetForm()} else {this.$message({message: '操作失败!请返回重新操作...',type: 'error'});}});},doMod() {this.$axios.post(this.$httpUrl + '/user/update', this.form).then(res => res.data).then(res => {console.log(res);if (res.code == 200) {this.$message({message: '操作成功!',type: 'success'});this.centerDialogVisible = false;this.loadPost();this.resetForm();} else {this.$message({message: '操作失败!',type: 'error'});}});},save() {this.$refs.form.validate((valid) => {if (valid) {if (this.form.id) {this.doMod();} else {this.doSave();}} else {console.log('error submit!!');return false;}});},loadGet() {this.$axios.get(this.$httpUrl + '/user/list').then(res => res.data).then(res => {console.log(res)})},loadPost() {this.$axios.post(this.$httpUrl + '/user/listPageC1', {pageSize: this.pageSize,pageNum: this.pageNum,param: {name: this.name,sex: this.sex,roleId:'2'}}).then(res => res.data).then(res => {console.log(res)if (res.code === 200) {this.tableData = res.datathis.total = res.total} else {alert('获取数据失败!请刷新页面')}})},resetParam() {this.name = ''this.sex = ''},handleSizeChange(val) {console.log(`每页 ${val} 条`);this.pageNum = 1//这个错误是先翻到第二页在调页面条数,显示无数据this.pageSize = valthis.loadPost()},handleCurrentChange(val) {console.log(`当前页: ${val}`);this.pageNum = valthis.loadPost()}},beforeMount() {// this.loadGet();this.loadPost()}
}</script>

三十五、如何部署前后端分离项目

预计在linux系统上部署并且部署到网站中去😭😭😭😭😭😭😭我看拖拖大法将会发挥作用

一、 要求:

1.后端:IDEAmaven
2.前端:node、vue环境
3.数据库:mysql

二、步骤:
1.获取代码放置到相应目录
2.后端代码处理

  • jdk版本
  • maven配置(路径配置、是否生效)
  • 执行数据库的脚本和修改数据库连接配置主机ip
  • 启动服务验证

     右键pom文件add maven即可

3.前端代码处理

  • 加载依赖           npm i
  • 配置执行环境
  • 启动验证

三十六、Vuex持久化后浏览器刷新丢失数据

1.分析

vuex持久化后,每当浏览器刷新就会丢失state中的数据
有没有办法可以保存这个state的数据呢?

2.插件vuex-persistedstate使用

安装:npm i vuex-persistedstate
在store/index.js 引入:

import createPersistedState from 'vuex-persistedstate'


使用:

plugins:[createPersistedState()]

3.菜单问题解决

菜单还在但是路由没了

4.动态路由问题

在App.vue中

<template><div id="app"><router-view></router-view></div>
</template><script>export default {name: 'App',components: { },data(){return{user:JSON.parse(sessionStorage.getItem('CurUser')),}},watch:{'$store.state.menu':{handler(val,old){if(!old&&this.user&&this.user.no){this.$store.commit("setRouter",val)}},immediate:true}}
}
</script><style></style>

store/index.js中添加

mutations: {setMenu(state,menuList) {state.menu=menuListaddNewRoute(menuList)},setRouter(state,menuList) {addNewRoute(menuList)}
},

相关文章:

非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 4

三十三、出入库管理 Header.vue导一下,RecordController加一个 //将入库数据和原有数据相加吧//新增PostMapping("/save")public Result save(RequestBody Record record) {return recordService.save(record) ? Result.success() : Result.fail();} GoodsManage.v…...

基于MATLAB的信号处理工具:信号分析器

信号&#xff08;或时间序列&#xff09;是与特定时间相关的一系列数字或测量值&#xff0c;不同的行业和学科将这一与时间相关的数字序列称为信号或时间序列。生物医学或电气工程师会将其称为信号&#xff0c;而统计学家或金融定量分析师会使用时间序列这一术语。例如&#xf…...

Codeforces Round 784 (Div. 4)

题目链接 A. Division? 题意 思路 模拟即可 示例代码 void solve() {int n;cin >> n;int ans;if(n > 1900) ans 1;else if(n > 1600) ans 2;else if(n > 1400) ans 3;else ans 4;cout << "Division " << ans << \n;}B. T…...

OpenNebula 开源虚拟平台,对标 VMware

Beeks Group 主要为金融服务提供商提供虚拟专用服务器和裸机服务器。该公司表示&#xff0c;转向 OpenNebula 不仅大幅降低了成本&#xff0c;还使其虚拟机效率提升了 200%&#xff0c;并将更多裸机服务器资源用于客户端负载&#xff0c;而非像以往使用 VMware 时那样用于虚拟机…...

软件项目标书参考,合同拟制,开发合同制定,开发协议,标书整体技术方案,实施方案,通用套用方案,业务流程,技术架构,数据库架构全资料下载(原件)

1、终止合同协议书 2、项目合作协议 3、合同交底纪要 4、合同管理台账 软件资料清单列表部分文档清单&#xff1a;工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&…...

Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1

文章目录 Jenkins环境一站式教程&#xff1a;从安装到配置&#xff0c;打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、安装配置Jenkins2.1 安装JDK…...

【Android】ARouter源码解析

本篇文章主要讲解了 ARouter 框架的源码分析&#xff0c;包括其初始化过程、核心方法等。 初始化 在使用ARouter的时候我们都会先进行初始化&#xff1a; ARouter.init(this);我们看下 init() 源码&#xff1a; public static void init(Application application) {// 检查…...

计算直线的交点数

主要实现思路 整体流程思路&#xff1a; 程序旨在解决给定平面上不同数量的直线&#xff08;无三线共点&#xff09;&#xff0c;求出每种直线数量下所有可能的交点数量&#xff0c;并按要求格式输出的问题。整体通过初始化一个二维数组来存储不同直线数量与交点数量对应的存在…...

STM32基于HAL库的串口接收中断触发机制和适用场景

1. HAL_UART_Receive_DMA函数 基本功能 作用&#xff1a;启动一个固定长度的 DMA 数据接收。特点&#xff1a; 需要预先指定接收数据的长度&#xff08;Size 参数&#xff09;。DMA 会一直工作直到接收到指定数量的数据&#xff0c;接收完成后触发 HAL_UART_RxCpltCallback 回…...

java面试宝典

本文只摘抄部分宝典内容&#xff0c;完整宝典可以在打开下方链接&#xff0c;在网盘获取 ^ _ ^ 链接:java面试宝典 提取码: wxy1 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 链接: java前端面试宝典 提取码: wxy1 复制这段内容后打开百度网盘手机App&#xff…...

Scala—Slice(提取子序列)方法详解

Scala—Slice&#xff08;提取子序列&#xff09;方法详解 在 Scala 中&#xff0c;slice 方法用于从集合中提取一个连续的子序列&#xff08;切片&#xff09;。可以应用于多种集合类型&#xff0c;如 List、Array、Seq 等。 一、slice 方法的定义 slice 根据提供的起始索引…...

【电子通识】案例:USB Type-C USB 3.0线缆做直通连接器TX/RX反向

【电子通识】案例:连接器接线顺序评估为什么新人总是评估不到位?-CSDN博客这个文章的后续。最近在做一个工装项目,需要用到USB Type-C线缆做连接。 此前已经做好了线序规划,结果新人做成实物后发现有的USB Type-C线缆可用,有的不行。其中发现USB3.0的TX-RX信号与自己的板卡…...

【SKFramework框架核心模块】3-5、函数扩展模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…...

使用 EasyExcel 提升 Excel 处理效率

目录 前言1. EasyExcel 的优点2. EasyExcel 的功能3. 在项目中使用 EasyExcel3.1 引入依赖3.2 实体类的定义与注解3.3 工具类方法的实现3.4 在 Controller 中使用 4. 总结5. 参考地址 前言 在日常开发中&#xff0c;Excel 文件的处理是不可避免的一项任务&#xff0c;特别是在…...

【提高篇】3.7 GPIO(七,GPIO开发模型 一)

目录 一,开发模型 二,初始化函数 2.1 时钟使能 一,开发模型 通常我们在进行GPIO相关外设的开发时,往往遵循下面4个步骤,如下: 初始化函数 用于进行时钟设置、参数设置、IO设置、中断设置等。读处理函数 用于从外设读取数据。写处理函数 用于从向外设写数据。中断处理…...

Webpack Tree Shaking 技术原理及应用实战,优化代码,精简产物

前言 在前端开发中&#xff0c;优化代码体积和提升应用性能是至关重要的课题。Webpack 提供了多种优化手段来帮助开发者实现这一目标&#xff0c;Tree Shaking 就是其中一种非常重要的优化技术&#xff0c;它通过在编译阶段移除未被使用的代码模块&#xff0c;从而显著减小最终…...

angular19-官方教程学习

周日了解到angular已经更新到19了&#xff0c;想按官方教程学习一遍&#xff0c;工欲善其事必先利其器&#xff0c;先更新工具&#xff1a; 安装新版版本 卸载老的nodejs 20.10.0&#xff0c;安装最新的LTS版本 https://nodejs.org 最新LTS版本已经是22.12.0 C:\Program File…...

RocketMQ集群部署完整指南

前言 本文将详细介绍RocketMQ集群的部署流程,包括环境准备、安装配置、启动运维等各个方面。 一、环境准备 1.1 系统要求 64位操作系统,建议LinuxJDK 1.8及以上版本源码安装需要Maven 3.2.x1.2 下载RocketMQ 可从以下地址获取RocketMQ安装包: Apache官方开源地址: http://r…...

解决mysql 内存持续上涨问题

问题背景&#xff1a; 业务量不大&#xff0c;Mysql 内存持续上涨&#xff0c;虽然不是很明显&#xff0c;但随着时间慢慢增长&#xff0c;1~2个月左右内存达到80%一旦有一些执行缓慢的sql 内存会快速上去增加/修改大表的字段内存会快速上去 常规操作&#xff1a; Mysql 设置…...

Qt 小项目 学生管理信息系统

主要是对数据库的增删查改的操作 登录/注册界面&#xff1a; 主页面&#xff1a; 添加信息&#xff1a; 删除信息&#xff1a; 删除第一行&#xff08;支持多行删除&#xff09; 需求分析&#xff1a; 用QT实现一个学生管理信息系统&#xff0c;数据库为MySQL 要求&#xf…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)

船舶制造装配管理现状&#xff1a;装配工作依赖人工经验&#xff0c;装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书&#xff0c;但在实际执行中&#xff0c;工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...