库房管理软件采购申请流程代码实现解析

news2025/1/11 21:36:52

300rmb掏了个java+vue2的小系统,学习代码,调整下申请流程。

原有的入库流程是,库管(admin)提出采购申请给采购员(caigou),采购员采购入库时点击入库完成采购入库流程。

想弄清后端代码怎样流转申请?需要一点点找。

从vue的采购申请页面找到请求的后端api地址:

 采购申请页面vue路由是:

/admin/rurchase

对应的组件是:

admin/rurchase/Rurchase

 对应的vue代码地址是:

src\views\admin\rurchase\RurchaseAdd.vue

<template>
  <a-drawer
    title="新增采购申请"
    :maskClosable="false"
    placement="right"
    :closable="false"
    :visible="show"
    :width="1200"
    @close="onClose"
    style="height: calc(100% - 55px);overflow: auto;padding-bottom: 53px;"
  >
    <a-form :form="form" layout="vertical">
      <a-row :gutter="20">
        <a-col :span="12">
          <a-form-item label='申请人' v-bind="formItemLayout">
            <a-input v-decorator="[
            'applicant',
            { rules: [{ required: true, message: '请输入申请人!' }] }
            ]"/>
          </a-form-item>
        </a-col>
        <a-col :span="24">
          <a-form-item label='备注消息' v-bind="formItemLayout">
            <a-textarea :rows="4" v-decorator="[
            'content',
             { rules: [{ required: true, message: '请输入备注消息!' }] }
            ]"/>
          </a-form-item>
        </a-col>
        <a-col :span="24">
          <a-table :columns="columns" :data-source="dataList">
            <template slot="nameShow" slot-scope="text, record">
              <a-input v-model="record.name"></a-input>
            </template>
            <template slot="typeShow" slot-scope="text, record">
              <a-input v-model="record.type"></a-input>
            </template>
            <template slot="typeIdShow" slot-scope="text, record">
              <a-select v-model="record.typeId" style="width: 100%">
                <a-select-option v-for="(item, index) in consumableType" :value="item.id" :key="index">{{ item.name }}</a-select-option>
              </a-select>
            </template>
            <template slot="unitShow" slot-scope="text, record">
              <a-input v-model="record.unit"></a-input>
            </template>
            <template slot="amountShow" slot-scope="text, record">
              <a-input-number v-model="record.amount" :min="1" :step="1"/>
            </template>
            <template slot="priceShow" slot-scope="text, record">
              <a-input-number v-model="record.price" :min="1"/>
            </template>
          </a-table>
          <a-button @click="dataAdd" type="primary" ghost size="large" style="margin-top: 10px;width: 100%">
            新增物品
          </a-button>
        </a-col>
      </a-row>
    </a-form>
    <div class="drawer-bootom-button">
      <a-popconfirm title="确定放弃编辑?" @confirm="onClose" okText="确定" cancelText="取消">
        <a-button style="margin-right: .8rem">取消</a-button>
      </a-popconfirm>
      <a-button @click="handleSubmit" type="primary" :loading="loading">提交</a-button>
    </div>
  </a-drawer>
</template>

<script>
import {mapState} from 'vuex'
const formItemLayout = {
  labelCol: { span: 24 },
  wrapperCol: { span: 24 }
}
export default {
  name: 'RurchaseAdd',
  props: {
    rurchaseAddVisiable: {
      default: false
    }
  },
  computed: {
    ...mapState({
      currentUser: state => state.account.user
    }),
    show: {
      get: function () {
        return this.rurchaseAddVisiable
      },
      set: function () {
      }
    },
    columns () {
      return [{
        title: '物品名称',
        dataIndex: 'name',
        scopedSlots: {customRender: 'nameShow'}
      }, {
        title: '型号',
        dataIndex: 'type',
        scopedSlots: {customRender: 'typeShow'}
      }, {
        title: '数量',
        dataIndex: 'amount',
        scopedSlots: {customRender: 'amountShow'}
      }, {
        title: '所属类型',
        dataIndex: 'typeId',
        width: 200,
        scopedSlots: {customRender: 'typeIdShow'}
      }, {
        title: '单位',
        dataIndex: 'unit',
        scopedSlots: {customRender: 'unitShow'}
      }, {
        title: '单价',
        dataIndex: 'price',
        scopedSlots: {customRender: 'priceShow'}
      }]
    }
  },
  data () {
    return {
      formItemLayout,
      form: this.$form.createForm(this),
      loading: false,
      dataList: [],
      consumableType: []
    }
  },
  mounted () {
    this.getConsumableType()
  },
  methods: {
    getConsumableType () {
      this.$get('/cos/consumable-type/list').then((r) => {
        this.consumableType = r.data.data
      })
    },
    dataAdd () {
      this.dataList.push({name: '', type: '', typeId: '', unit: '', amount: '', price: ''})
    },
    reset () {
      this.loading = false
      this.form.resetFields()
    },
    onClose () {
      this.reset()
      this.$emit('close')
    },
    handleSubmit () {
      if (this.dataList.length !== 0) {
        let price = 0
        this.dataList.forEach(item => {
          price += item.price * item.amount
        })
        this.form.validateFields((err, values) => {
          if (!err) {
            values.price = price
            values.goods = JSON.stringify(this.dataList)
            this.loading = true
            this.$post('/cos/rurchase-request', {
              ...values
            }).then((r) => {
              this.reset()
              this.$emit('success')
            }).catch(() => {
              this.loading = false
            })
          }
        })
      } else {
        this.$message.warning('请添加记录!')
      }
    }
  }
}
</script>

<style scoped>

</style>

在前端代码中找到提交申请的后台api接口地址是:

/cos/rurchase-request

根据后台接口地址找到对应的java controller类和方法:

cc.mrbird.febs.cos.controller.RurchaseRequestController#save

这里用到了RESTfultool插件

package cc.mrbird.febs.cos.controller;


import cc.mrbird.febs.common.utils.R;
import cc.mrbird.febs.cos.entity.RurchaseRequest;
import cc.mrbird.febs.cos.service.IRurchaseRequestService;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

/**
 * @author FanK
 */
@RestController
@RequestMapping("/cos/rurchase-request")
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RurchaseRequestController {

    private final IRurchaseRequestService rurchaseRequestService;

    /**
     * 采购申请入库
     * @param rurchaseRequest
     * @return
     */
    @PostMapping("/rurchasePut")
    public R rurchasePut(RurchaseRequest rurchaseRequest) {
        return R.ok(rurchaseRequestService.rurchasePut(rurchaseRequest));
    }

    /**
     * 分页获取采购申请
     * @param page
     * @param rurchaseRequest
     * @return
     */
    @GetMapping("/page")
    public R page(Page page, RurchaseRequest rurchaseRequest) {
        return R.ok(rurchaseRequestService.rurchaseRequestByPage(page, rurchaseRequest));
    }

    /**
     * 添加采购申请
     * @param rurchaseRequest
     * @return
     */
    @PostMapping
    public R save(RurchaseRequest rurchaseRequest) {
        rurchaseRequest.setCreateDate(DateUtil.formatDateTime(new Date()));
        return R.ok(rurchaseRequestService.rurchaseRequestAdd(rurchaseRequest));
    }

    /**
     * 修改采购申请
     * @param rurchaseRequest
     * @return
     */
    @PutMapping
    public R edit(RurchaseRequest rurchaseRequest) {
        return R.ok(rurchaseRequestService.updateById(rurchaseRequest));
    }

    /**
     * 删除采购申请
     * @param ids
     * @return
     */
    @DeleteMapping("/{ids}")
    public R deleteByIds(@PathVariable("ids") List<Integer> ids) {
        return R.ok(rurchaseRequestService.removeByIds(ids));
    }

}

通过其调用的函数:

rurchaseRequestService.rurchaseRequestAdd(rurchaseRequest)

mybatis的mapper

cc.mrbird.febs.cos.service.IRurchaseRequestService

package cc.mrbird.febs.cos.service;

import cc.mrbird.febs.cos.entity.RurchaseRequest;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import java.util.LinkedHashMap;

/**
 * @author FanK
 */
public interface IRurchaseRequestService extends IService<RurchaseRequest> {

    // 分页获取采购申请
    IPage<LinkedHashMap<String, Object>> rurchaseRequestByPage(Page page, RurchaseRequest rurchaseRequest);

    // 添加采购申请
    Boolean rurchaseRequestAdd(RurchaseRequest rurchaseRequest);

    // 采购申请入库
    Boolean rurchasePut(RurchaseRequest rurchaseRequest);
}

IRurchaseRequestService的实现类:

cc.mrbird.febs.cos.service.impl.RurchaseRequestServiceImpl

package cc.mrbird.febs.cos.service.impl;

import cc.mrbird.febs.cos.entity.GoodsBelong;
import cc.mrbird.febs.cos.entity.RurchaseRequest;
import cc.mrbird.febs.cos.dao.RurchaseRequestMapper;
import cc.mrbird.febs.cos.entity.StockInfo;
import cc.mrbird.febs.cos.entity.StockPut;
import cc.mrbird.febs.cos.service.IGoodsBelongService;
import cc.mrbird.febs.cos.service.IRurchaseRequestService;
import cc.mrbird.febs.cos.service.IStockInfoService;
import cc.mrbird.febs.cos.service.IStockPutService;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * @author FanK
 */
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RurchaseRequestServiceImpl extends ServiceImpl<RurchaseRequestMapper, RurchaseRequest> implements IRurchaseRequestService {

    private final IGoodsBelongService goodsBelongService;

    private final IStockPutService stockPutService;

    private final IStockInfoService stockInfoService;

    @Override
    public IPage<LinkedHashMap<String, Object>> rurchaseRequestByPage(Page page, RurchaseRequest rurchaseRequest) {
        return baseMapper.rurchaseRequestByPage(page, rurchaseRequest);
    }

    @Override
    public Boolean rurchaseRequestAdd(RurchaseRequest rurchaseRequest) {
        rurchaseRequest.setNum("RUR-"+new Date().getTime());
        JSONArray array = JSONUtil.parseArray(rurchaseRequest.getGoods());
        List<GoodsBelong> goodsBelongList = JSONUtil.toList(array, GoodsBelong.class);
        rurchaseRequest.setStep(0);
        this.save(rurchaseRequest);
        goodsBelongList.forEach(item -> {
            item.setCreateDate(DateUtil.formatDateTime(new Date()));
            item.setNum(rurchaseRequest.getNum());
        });
        return goodsBelongService.saveBatch(goodsBelongList);
    }

    @Override
    public Boolean rurchasePut(RurchaseRequest rurchaseRequest) {
        JSONArray array = JSONUtil.parseArray(rurchaseRequest.getGoods());
        List<GoodsBelong> goodsBelongList = JSONUtil.toList(array, GoodsBelong.class);
        // 添加入库单
        StockPut stockPut = new StockPut();
        stockPut.setContent(rurchaseRequest.getRurchaseContent());
        stockPut.setCreateDate(DateUtil.formatDateTime(new Date()));
        stockPut.setCustodian(rurchaseRequest.getCustodian());
        stockPut.setPutUser(rurchaseRequest.getPutUser());
        stockPut.setPrice(rurchaseRequest.getPrice());
        stockPut.setNum("PUT-"+new Date().getTime());
        stockPutService.save(stockPut);

        goodsBelongList.forEach(item -> {
            item.setCreateDate(DateUtil.formatDateTime(new Date()));
            item.setNum(stockPut.getNum());
            // 判断库房物品是否存在
            StockInfo stockInfo = stockInfoService.getOne(Wrappers.<StockInfo>lambdaQuery().eq(StockInfo::getName, item.getName()).eq(StockInfo::getTypeId, item.getTypeId()).eq(StockInfo::getIsIn, 0));
            if (stockInfo != null) {
                // 更改库房数据
                stockInfoService.update(Wrappers.<StockInfo>lambdaUpdate().set(StockInfo::getAmount, stockInfo.getAmount()+item.getAmount())
                        .set(StockInfo::getPrice, stockInfo.getPrice())
                        .eq(StockInfo::getName, stockInfo.getName()));
            } else {
                // 重新添加库房数据
                StockInfo stock = new StockInfo();
                stock.setName(item.getName());
                stock.setAmount(item.getAmount());
                stock.setCreateDate(DateUtil.formatDateTime(new Date()));
                stock.setType(item.getType());
                stock.setTypeId(item.getTypeId());
                stock.setUnit(item.getUnit());
                stock.setPrice(item.getPrice());
                stock.setIsIn(0);
                stockInfo = stock;
                stockInfoService.save(stock);
            }
            // 添加入库记录
            StockInfo stockInfoPut = new StockInfo();
            stockInfoPut.setParentId(stockInfo.getId());
            stockInfoPut.setName(item.getName());
            stockInfoPut.setAmount(item.getAmount());
            stockInfoPut.setCreateDate(DateUtil.formatDateTime(new Date()));
            stockInfoPut.setType(item.getType());
            stockInfoPut.setTypeId(item.getTypeId());
            stockInfoPut.setUnit(item.getUnit());
            stockInfoPut.setPrice(item.getPrice());
            stockInfoPut.setIsIn(1);
            stockInfoService.save(stockInfoPut);

            // 添加所属信息
            GoodsBelong goodsBelong = new GoodsBelong();
            goodsBelong.setNum(stockPut.getNum());
            goodsBelong.setCreateDate(DateUtil.formatDateTime(new Date()));
            goodsBelong.setAmount(item.getAmount());
            goodsBelong.setName(item.getName());
            goodsBelong.setPrice(item.getPrice());
            goodsBelong.setType(item.getType());
            goodsBelong.setTypeId(item.getTypeId());
            goodsBelong.setUnit(item.getUnit());
            goodsBelongService.save(goodsBelong);
        });
        // 修改状态
        this.update(Wrappers.<RurchaseRequest>lambdaUpdate().set(RurchaseRequest::getStep, 1).eq(RurchaseRequest::getId, rurchaseRequest.getId()));
        return true;
    }
}

从RurchaseRequestServiceImpl#rurchaseRequestAdd方法中找到两个操作数据库的关键函数:

this.save(rurchaseRequest);
goodsBelongService.saveBatch(goodsBelongList);

这两个方法都是继承自mybatisplus的操作数据库的公共方法,可以在类的定义中找到对应的java实体类:

public class RurchaseRequestServiceImpl extends ServiceImpl<RurchaseRequestMapper, RurchaseRequest> implements IRurchaseRequestService
public interface IGoodsBelongService extends IService<GoodsBelong>

关于mybatisplus的使用方法参考:

Mybatis-plus之IService的使用_iservice mybatisplus-CSDN博客

https://www.cnblogs.com/kaibindirver/p/16086336.html

(不明白为什么extends ServiceImpl<RurchaseRequestMapper, RurchaseRequest>后,还要implements IRurchaseRequestService,需要看源码)

找到java实体类:

cc.mrbird.febs.cos.entity.GoodsBelong

cc.mrbird.febs.cos.entity.RurchaseRequest

package cc.mrbird.febs.cos.entity;

import java.io.Serializable;
import java.math.BigDecimal;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * 物品所属
 *
 * @author FanK
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class GoodsBelong implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "ID", type = IdType.AUTO)
    private Integer id;
    /**
     * 物品名称
     */
    private String name;

    /**
     * 型号
     */
    private String type;

    /**
     * 单位
     */
    private String unit;

    /**
     * 数量
     */
    private Integer amount;

    /**
     * 耗材类型
     */
    private Integer typeId;

    /**
     * 申请/入库单号
     */
    private String num;

    /**
     * 单价
     */
    private BigDecimal price;

    /**
     * 日期
     */
    private String createDate;


}
package cc.mrbird.febs.cos.entity;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.io.Serializable;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

/**
 * 采购申请
 *
 * @author FanK
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class RurchaseRequest implements Serializable {

    private static final long serialVersionUID = 1L;

    @TableId(value = "ID", type = IdType.AUTO)
    private Integer id;
    /**
     * 采购申请单号
     */
    private String num;

    /**
     * 采购说明
     */
    private String content;

    /**
     * 预计金额
     */
    private BigDecimal price;

    /**
     * 采购流程 0是正在采购 1是入库完成
     */
    private Integer process;

    /**
     * 当前流程
     */
    private Integer step;

    /**
     * 申请人
     */
    private String applicant;

    /**
     * 创建时间
     */
    private String createDate;

    @TableField(exist = false)
    private String goods;
    @TableField(exist = false)
    private String custodian;
    @TableField(exist = false)
    private String putUser;
    @TableField(exist = false)
    private String rurchaseContent;

}

从mybatisplus的表名对应关系,可以找到数据库的两张表:

goods_belong

类型长度小数点注释
idint主键
namevarchar200物品名称
typevarchar200型号
unitvarchar30单位
amountint数量
type_idint耗材类型
numvarchar200申请/入库单号
pricedecimal102单价
create_datedatetime日期 

rurchase_request

类型长度小数点注释
idint主键
numvarchar200采购申请单号
contentvarchar300采购说明
pricedecimal102预计金额
processtinyint采购流程 0是正在采购 1是入库完成
steptinyint当前流程
applicantvarchar200申请人
create_datedatetime创建时间

 库管admin新增一个采购申请,会在rurchase_request增加一条数据对应这个申请,同时会在goods_belong中新增若干条数据,对应申请表中的若干项物资

申请记录:

ps:其中step字段的值表示当前流程,0表示等待采购,1表示入库完成

申请的物品清单:

 在采购员账号caigou中可以办理采购入库:

当入库后,库存就会增加,对应的库存表会变化,涉及到多张表

stock_info

stock_put

goods_belong

rurchase_request

cc.mrbird.febs.cos.service.impl.RurchaseRequestServiceImpl#rurchasePut

    @Override
    public Boolean rurchasePut(RurchaseRequest rurchaseRequest) {
        JSONArray array = JSONUtil.parseArray(rurchaseRequest.getGoods());
        List<GoodsBelong> goodsBelongList = JSONUtil.toList(array, GoodsBelong.class);
        // 添加入库单
        StockPut stockPut = new StockPut();
        stockPut.setContent(rurchaseRequest.getRurchaseContent());
        stockPut.setCreateDate(DateUtil.formatDateTime(new Date()));
        stockPut.setCustodian(rurchaseRequest.getCustodian());
        stockPut.setPutUser(rurchaseRequest.getPutUser());
        stockPut.setPrice(rurchaseRequest.getPrice());
        stockPut.setNum("PUT-"+new Date().getTime());
        stockPutService.save(stockPut);

        goodsBelongList.forEach(item -> {
            item.setCreateDate(DateUtil.formatDateTime(new Date()));
            item.setNum(stockPut.getNum());
            // 判断库房物品是否存在
            StockInfo stockInfo = stockInfoService.getOne(Wrappers.<StockInfo>lambdaQuery().eq(StockInfo::getName, item.getName()).eq(StockInfo::getTypeId, item.getTypeId()).eq(StockInfo::getIsIn, 0));
            if (stockInfo != null) {
                // 更改库房数据
                stockInfoService.update(Wrappers.<StockInfo>lambdaUpdate().set(StockInfo::getAmount, stockInfo.getAmount()+item.getAmount())
                        .set(StockInfo::getPrice, stockInfo.getPrice())
                        .eq(StockInfo::getName, stockInfo.getName()));
            } else {
                // 重新添加库房数据
                StockInfo stock = new StockInfo();
                stock.setName(item.getName());
                stock.setAmount(item.getAmount());
                stock.setCreateDate(DateUtil.formatDateTime(new Date()));
                stock.setType(item.getType());
                stock.setTypeId(item.getTypeId());
                stock.setUnit(item.getUnit());
                stock.setPrice(item.getPrice());
                stock.setIsIn(0);
                stockInfo = stock;
                stockInfoService.save(stock);
            }
            // 添加入库记录
            StockInfo stockInfoPut = new StockInfo();
            stockInfoPut.setParentId(stockInfo.getId());
            stockInfoPut.setName(item.getName());
            stockInfoPut.setAmount(item.getAmount());
            stockInfoPut.setCreateDate(DateUtil.formatDateTime(new Date()));
            stockInfoPut.setType(item.getType());
            stockInfoPut.setTypeId(item.getTypeId());
            stockInfoPut.setUnit(item.getUnit());
            stockInfoPut.setPrice(item.getPrice());
            stockInfoPut.setIsIn(1);
            stockInfoService.save(stockInfoPut);

            // 添加所属信息
            GoodsBelong goodsBelong = new GoodsBelong();
            goodsBelong.setNum(stockPut.getNum());
            goodsBelong.setCreateDate(DateUtil.formatDateTime(new Date()));
            goodsBelong.setAmount(item.getAmount());
            goodsBelong.setName(item.getName());
            goodsBelong.setPrice(item.getPrice());
            goodsBelong.setType(item.getType());
            goodsBelong.setTypeId(item.getTypeId());
            goodsBelong.setUnit(item.getUnit());
            goodsBelongService.save(goodsBelong);
        });
        // 修改状态
        this.update(Wrappers.<RurchaseRequest>lambdaUpdate().set(RurchaseRequest::getStep, 1).eq(RurchaseRequest::getId, rurchaseRequest.getId()));
        return true;
    }

入库后goods_belong会增加三条入库操作记录

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

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

相关文章

基于深度学习之基于KNN算法智慧体育检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 智慧体育检测系统是一种基于K最近邻&#xff08;KNN&#xff09;算法的人工智能系统&#xff0c;旨在分析和评估个体…

Docker DeskTop安装与启动(Windows版本)

一、官网下载Docker安装包 Docker官网如下&#xff1a; Docker官网不同操作系统下载页面https://docs.docker.com/desktop/install/windows-install/ 二、安装Docker DeskTop 2.1 双击 Docker Installer.exe 以运行安装程序 2.2 安装操作 默认勾选&#xff0c;具体操作如下…

HCL模拟器综合实验案例(2)

本案例提供给计算机网络专业学生以及参加新华三杯的同学进行学习 题目 由于公司并购前的历史原因导致双方使用不同的 OSPF 进程&#xff0c;经由总部技术部统一规划后再做调整&#xff0c;现阶段使用暂时过渡方案&#xff0c;即使用静态路由、OSPF、RIP、BGP多协议组网&#x…

C++之继承(篇一)

&#x1f37c;博客主页:阿博历练记 &#x1f4d6;文章专栏:c &#x1f68d;代码仓库:阿博编程日记 &#x1f361;欢迎关注:欢迎友友们点赞收藏关注哦&#x1f339; 文章目录 &#x1f95d;1.继承的概念及定义&#x1f4dc;1.1继承的概念&#x1f5dd;️1.2继承图解&#x1f50d…

基于学校优化算法的无人机航迹规划-附代码

基于学校优化算法的无人机航迹规划 文章目录 基于学校优化算法的无人机航迹规划1.学校优化搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用学校优化算法来优化无人机航迹规划。 …

MySQL 分组后统计 TopN 思路优化

一、表信息 表结构如下&#xff1a; CREATE TABLE score (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,score int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT1746687 DEFAULT CHARSETutf8;使用存储过程生成十万条测试数据&am…

Elasticsearch:使用 ES|QL

在我之前的文章 “Elasticsearch&#xff1a;ES|QL 查询语言简介”&#xff0c;我对 ES|QL 做了一个简单的介绍。在今天的文章中&#xff0c;我们来描述如何使用 ES|QL。 REST API 这个用来返回 ES|QL (Elasticsearch qyery language) 的查询结果。它具有如下的格式&#xff1…

MongoDB安全及系例全教程

一、系列文章目录 一、MongoDB安装教程—官方原版 二、MongoDB 使用教程(配置、管理、监控)_linux mongodb 监控 三、MongoDB 基于角色的访问控制 四、MongoDB用户管理 五、MongoDB基础知识详解 六、MongoDB—Indexs 七、MongoDB事务详解 八、MongoDB分片教程 九、Mo…

用扩散AI生成的合成数据的质量评估方法【4个指标】

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 为了生成有用的图像数据集&#xff0c;我们使用真实世界的照片数据集作为指南针&#xff0c;探索即时工程的艺术。 我们的稳定扩散&#xff08;…

PPT模板,免费下载!

找免费PPT模板就上这6个网站&#xff0c;各种模板、素材都能找到&#xff0c;质量还很高&#xff0c;赶紧收藏起来&#xff01; 1、菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYwNDUx 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒…

红海云签约中国煤科信息公司,数智引领科技型国企人力资源数字化变革

中煤科工集团信息技术有限公司&#xff08;以下简称“中国煤科信息公司”&#xff09;隶属于中国煤炭科工集团&#xff0c;作为中国煤科核心软件的研发中心、数据技术中心、内部信息化支撑中心&#xff0c;是中国煤科加快智能矿山建设和数字化转型的核心力量。 基于对数字化转…

软件设计模式原则(一)迪米特法则

开一个小专题——详细总结一下软件设计模式原则&#xff0c;这部分在《软计》和《java设计模式》中算是很重要的知识点&#xff0c;值得展开详细讲解一下~首先介绍的是【迪米特法则】 一.定义 迪米特法则又称为最少知识原则&#xff0c;其定义为&#xff1a;一个软件实体应当尽…

vue使用JsBarcode生成条形码

在工作中&#xff0c;有一个需求是接口返回的订单号生成条形码&#xff0c;如图&#xff1a; 1.安装依赖 yarn add jsbarcode2.引入 在script标签中引入 import JsBarcode from jsbarcode 3.使用 this.$refs.a.src的值为条形码的地址。 <template><div><img…

linux下多机器ssh免密码登录配置

20,21,22,23等4台机器配置ssh免密登陆 确认sshd配置 查看/etc/ssh/sshd_config文件&#xff0c;确认如下配置没有被注释掉&#xff1a; AuthorizedKeysFile .ssh/authorized_keys每一台机器修改hosts配置主机名&#xff08;可选&#xff09; 执行ssh命令&#xff0c;如…

积分球测试粉末反射率

积分球测试粉末主要是基于光在积分球内的反射和混合。具体来说&#xff0c;当光线进入积分球时&#xff0c;它将在球的内表面上进行反射。由于积分球的内表面是高反射材料&#xff0c;所以大部分光线将被反射&#xff0c;而不会逃逸出球体。在积分球内&#xff0c;光线经过多次…

基于51单片机的全自动洗衣机系统设计

**单片机设计介绍&#xff0c;基于51单片机的全自动洗衣机系统设计(仿真、程序、论文) 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的全自动洗衣机系统是一种集成控制、传感、显示等功能于一体的智能洗衣机系统&a…

Security ❀ UDP/TCP传输层常见DOS攻击详解

文章目录 1. UDP协议基础2. UDP Flood2.1. 攻击原理2.2. 防护方法 3. TCP三次握手和四次挥手3.1. 三次握手3.2. 四次挥手 4. SYN Flood4.1. 攻击原理4.2. 防护方法 5. SYN-ACK Flood5.1. 攻击原理5.2. 防护方法 6. ACK Flood6.1. 攻击原理6.2. 防护方法 7. FIN/RST Flood7.1. 攻…

来可电子基于UDS的ECU刷写方案

车辆电子控制单元&#xff08;ECU&#xff09;的刷写方式也正在发生重大变化。传统的ECU刷写方法通常使用CAN卡连接电脑进行&#xff0c;现在越来越多的汽车商家和软件开发人员开始采用基于总线UDS来进行ECU刷写。 1、通过我们LKmast上位机软件编写配置刷写步骤 2、导入到我们…

python将图片序列保存成gif

这里用到的模块是imageio。用imageio.mimsave即可将图片序列保存成gif动态图。以下是本人编写的小实验&#xff1a; import cv2 import imageiopaths ["./images/0001.png", "./images/0002.png", "./images/0003.png", ...] frames [] for i…

瑞禧生物分享纳米粉体~二硫化钼粉体 MoS2 纯度:99% 纳米二硫化钼(MoS2)

二硫化钼粉体 名称&#xff1a;二硫化钼粉体 纯度&#xff1a;99% 外观&#xff1a;粉末 纳米二硫化钼(MoS2)粉体硫化钼粉体 二硫化铝化学性质稳定、热稳定性好 、摩擦系数低 、润滑作用优 良且在较为苛 刻的工作环境下能保持 良好的摩擦性能因此二硫化铝被广泛应用于固体润…