非常简单实用的前后端分离项目-仓库管理系统(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的信号处理工具:信号分析器
信号(或时间序列)是与特定时间相关的一系列数字或测量值,不同的行业和学科将这一与时间相关的数字序列称为信号或时间序列。生物医学或电气工程师会将其称为信号,而统计学家或金融定量分析师会使用时间序列这一术语。例如…...

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

软件项目标书参考,合同拟制,开发合同制定,开发协议,标书整体技术方案,实施方案,通用套用方案,业务流程,技术架构,数据库架构全资料下载(原件)
1、终止合同协议书 2、项目合作协议 3、合同交底纪要 4、合同管理台账 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书,需求调研计划,用户需求调查单&…...

Jenkins环境一站式教程:从安装到配置,打造高效CI/CD流水线环境-Ubuntu 22.04.5 环境离线安装配置 Jenkins 2.479.1
文章目录 Jenkins环境一站式教程:从安装到配置,打造高效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 框架的源码分析,包括其初始化过程、核心方法等。 初始化 在使用ARouter的时候我们都会先进行初始化: ARouter.init(this);我们看下 init() 源码: public static void init(Application application) {// 检查…...

计算直线的交点数
主要实现思路 整体流程思路: 程序旨在解决给定平面上不同数量的直线(无三线共点),求出每种直线数量下所有可能的交点数量,并按要求格式输出的问题。整体通过初始化一个二维数组来存储不同直线数量与交点数量对应的存在…...
STM32基于HAL库的串口接收中断触发机制和适用场景
1. HAL_UART_Receive_DMA函数 基本功能 作用:启动一个固定长度的 DMA 数据接收。特点: 需要预先指定接收数据的长度(Size 参数)。DMA 会一直工作直到接收到指定数量的数据,接收完成后触发 HAL_UART_RxCpltCallback 回…...

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

Scala—Slice(提取子序列)方法详解
Scala—Slice(提取子序列)方法详解 在 Scala 中,slice 方法用于从集合中提取一个连续的子序列(切片)。可以应用于多种集合类型,如 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群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…...

使用 EasyExcel 提升 Excel 处理效率
目录 前言1. EasyExcel 的优点2. EasyExcel 的功能3. 在项目中使用 EasyExcel3.1 引入依赖3.2 实体类的定义与注解3.3 工具类方法的实现3.4 在 Controller 中使用 4. 总结5. 参考地址 前言 在日常开发中,Excel 文件的处理是不可避免的一项任务,特别是在…...
【提高篇】3.7 GPIO(七,GPIO开发模型 一)
目录 一,开发模型 二,初始化函数 2.1 时钟使能 一,开发模型 通常我们在进行GPIO相关外设的开发时,往往遵循下面4个步骤,如下: 初始化函数 用于进行时钟设置、参数设置、IO设置、中断设置等。读处理函数 用于从外设读取数据。写处理函数 用于从向外设写数据。中断处理…...

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

angular19-官方教程学习
周日了解到angular已经更新到19了,想按官方教程学习一遍,工欲善其事必先利其器,先更新工具: 安装新版版本 卸载老的nodejs 20.10.0,安装最新的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 内存持续上涨问题
问题背景: 业务量不大,Mysql 内存持续上涨,虽然不是很明显,但随着时间慢慢增长,1~2个月左右内存达到80%一旦有一些执行缓慢的sql 内存会快速上去增加/修改大表的字段内存会快速上去 常规操作: Mysql 设置…...

Qt 小项目 学生管理信息系统
主要是对数据库的增删查改的操作 登录/注册界面: 主页面: 添加信息: 删除信息: 删除第一行(支持多行删除) 需求分析: 用QT实现一个学生管理信息系统,数据库为MySQL 要求…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...

JDK 17 序列化是怎么回事
如何序列化?其实很简单,就是根据每个类型,用工厂类调用。逐个完成。 没什么漂亮的代码,只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...