【开源】基于Vue.js的实验室耗材管理系统

文末获取源码,项目编号: S 081 。 \color{red}{文末获取源码,项目编号:S081。} 文末获取源码,项目编号:S081。
目录
- 一、摘要
- 1.1 项目介绍
- 1.2 项目录屏
- 二、功能模块
- 2.1 耗材档案模块
- 2.2 耗材入库模块
- 2.3 耗材出库模块
- 2.4 耗材申请模块
- 2.5 耗材审核模块
- 三、系统展示
- 四、核心代码
- 4.1 查询耗材品类
- 4.2 查询资产出库清单
- 4.3 资产出库
- 4.4 查询入库单
- 4.5 资产入库
- 五、免责说明
一、摘要
1.1 项目介绍
基于JAVA+Vue+SpringBoot+MySQL的实验室耗材管理系统,包含了耗材档案模块、耗材入库模块、耗材出库模块、耗材申请模块、耗材审核模块和耗材图表模块,还包含系统自带的用户管理、部门管理、角色管理、菜单管理、日志管理、数据字典管理、文件管理、图表展示等基础模块,实验室耗材管理系统基于角色的访问控制,给管理员和耗材管理专员使用,可将权限精确到按钮级别,您可以自定义角色并分配权限,系统适合设计精确的权限约束需求。
1.2 项目录屏
源码下载
二、功能模块
2.1 耗材档案模块
实验室耗材管理系统的耗材档案模块是用来管理和维护实验室中所有耗材的信息的模块。它可以帮助实验室管理人员有效地记录和跟踪实验室中的耗材信息,包括耗材的名称、规格、型号、供应商、采购日期、有效期、存放位置等。
实验室管理人员可以通过耗材档案模块将新购买的耗材信息录入系统中,包括耗材的基本信息和相关属性。实验室管理人员可以根据耗材的各种属性进行查询,快速定位和查找需要的耗材信息。耗材档案模块可以记录耗材的采购日期、供应商信息以及入库数量等,帮助管理人员对耗材进行合理的入库管理。当实验室需要使用某种耗材时,管理人员可以通过耗材档案模块进行出库操作,记录出库数量和使用目的等信息。
耗材档案模块可以实时统计和更新实验室中各种耗材的库存情况,提醒管理人员及时进行补充采购。当某种耗材过期或损坏无法使用时,可以通过耗材档案模块进行报废管理,记录报废原因和处理方式等信息。通过耗材档案模块,实验室管理人员可以更加方便地管理和控制实验室中的耗材,提高耗材的利用率和管理效率。
2.2 耗材入库模块
实验室耗材管理系统的耗材入库模块是用来记录和管理实验室中新购买的耗材入库信息的模块。实验室管理人员可以通过耗材入库模块将新购买的耗材信息录入系统中。包括耗材的名称、规格、型号、供应商、采购日期、有效期等基本信息。录入耗材信息时,还可以添加附加属性,如物料编号、批次号、条形码等。在录入耗材信息的同时,管理人员需要填写入库数量。系统会自动计算并更新库存数量,方便管理人员实时掌握实验室中各种耗材的库存情况。
耗材入库模块通常也包含供应商管理功能,可以记录供应商的联系信息、合作情况和评价等。在入库时,管理人员可以选择已经建立的供应商,并关联相应的耗材采购信息。耗材入库模块一般会生成入库单,用于记录每次耗材入库的详细信息,包括入库日期、供应商、采购单号、入库人等。管理人员可以根据入库单进行查询和统计,方便日后追溯和审核。有些实验室可能需要对入库的耗材进行质检。耗材入库模块可以提供相应的功能,管理人员可以记录质检结果、质检人员和质检日期等信息,确保入库的耗材符合实验室的质量要求。通过耗材入库模块,实验室管理人员可以方便地记录和管理实验室中新购买的耗材信息,及时更新库存数量,提高耗材管理的效率和准确性。
2.3 耗材出库模块
实验室耗材管理系统的耗材出库模块是用来记录和管理实验室中耗材的出库信息的模块。实验室管理人员可以通过耗材出库模块根据耗材的名称、规格、型号等信息进行查询,快速定位需要出库的耗材。管理人员可以通过耗材出库模块进行耗材的出库操作。在出库时,需要填写出库数量以及使用目的等相关信息。同时,系统会自动更新库存数量,确保库存信息的准确性。耗材出库模块一般会生成出库单,记录每次耗材出库的详细信息,包括出库日期、出库人、领用单位等。这些信息可以用于后续的追溯和审核。
耗材出库模块可以记录每次耗材的使用记录,包括使用人、使用日期、使用目的等。这样可以方便实验室管理人员对耗材的使用情况进行统计和分析。在耗材出库模块中,可以设置库存预警功能。当某种耗材的库存数量低于预设阈值时,系统会自动生成提醒通知,以便管理人员及时进行补充采购。通过耗材出库模块,实验室管理人员可以方便地记录和管理实验室中耗材的出库信息,及时更新库存数量,提高耗材管理的效率和准确性。
2.4 耗材申请模块
实验室耗材管理系统的耗材申请模块是用来方便实验室人员提交耗材申请并进行审批流程的模块。实验室内的人员可以通过耗材申请模块提交耗材的申请。在申请时,需要填写所需耗材的名称、数量、用途等相关信息。耗材申请模块一般会设计审批流程,包括申请人、审批人、审批顺序等。申请人提交耗材申请后,相应的审批人会收到通知,进行审批操作。系统会记录每个审批环节的处理情况,以便后续查询和追溯。耗材申请模块会根据用户的权限设置不同的审批权限。只有具有相应权限的人员才能进行审批操作,确保审批过程的安全性和准确性。
耗材申请模块会记录每次耗材申请的详细信息,包括申请日期、申请人、审批状态等。管理人员可以通过查询功能查看和统计申请记录,方便管理和掌握实验室内的耗材使用情况。耗材申请模块会通过系统消息或邮件等方式通知相关人员的申请状态和审批结果,提高沟通效率和及时性。通过耗材申请模块,实验室内的人员可以方便地提交耗材申请并进行审批流程,提高申请的准确性和效率。同时,管理人员可以更好地掌握和管理实验室的耗材使用情况。
2.5 耗材审核模块
实验室耗材管理系统的耗材审核模块是该系统中的一个重要部分,用于对实验室耗材的采购申请进行审核和管理。实验室成员可以通过系统向耗材审核模块提交耗材采购申请,包括所需耗材的名称、规格、数量、用途等信息。申请提交后,会自动生成一个申请单。申请单会经过一定的审核流程,根据实验室的设定,可以包括多级审核。审核人员可以对申请单进行审核、审批以及驳回操作。审核人员可以查看申请单的详细信息,包括耗材的具体需求和用途。
系统会记录每一次审核的结果和审核人的意见,以便后续查询和审计。审核记录可在系统中进行查看和导出,方便实验室管理人员进行数据分析和监控。系统可以通过邮件、短信等方式向相关人员发送审核结果的通知,提醒实验室成员耗材采购申请的进展情况。审核通过的耗材采购申请可以自动更新实验室的耗材库存信息,方便实验室管理人员进行库存管理和统计。
通过耗材审核模块,实验室可以实现对耗材采购申请的规范化、集中化管理,提高审核效率,减少人工操作和错误,确保实验室耗材的合理使用和供应链管理的准确性。
三、系统展示








四、核心代码
4.1 查询耗材品类
@ApiOperation(value = "查询耗材品类")
@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
public Result<IPage<AssetsType>> getByPage(@ModelAttribute AssetsType assetsType, @ModelAttribute PageVo page, @RequestParam(required = false) String natureType) {QueryWrapper<AssetsType> qw = new QueryWrapper<AssetsType>();if(StrUtil.isNotBlank(natureType)) {if(natureType.equals("1")){qw.eq("nature", "固定资产");}else{qw.eq("nature", "耗材");}}if(!ZwzNullUtils.isNull(assetsType.getNature())) {qw.eq("nature", assetsType.getNature());}if(!ZwzNullUtils.isNull(assetsType.getAssetName())) {qw.like("asset_name", assetsType.getAssetName());}return new ResultUtil<IPage<AssetsType>>().setData(iAssetsTypeService.page(PageUtil.initMpPage(page),qw));
}
4.2 查询资产出库清单
@ApiOperation(value = "查询资产出库清单")
@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
public Result<IPage<WarehouseOut>> getByPage(@ModelAttribute WarehouseOut warehouseOut, @ModelAttribute PageVo page){QueryWrapper<WarehouseOut> qw = new QueryWrapper<WarehouseOut>();if(!ZwzNullUtils.isNull(warehouseOut.getNature())) {qw.eq("nature", warehouseOut.getNature());}if(!ZwzNullUtils.isNull(warehouseOut.getAssetName())) {qw.like("asset_name", warehouseOut.getAssetName());}if(!ZwzNullUtils.isNull(warehouseOut.getRecipients())) {qw.like("recipients", warehouseOut.getRecipients());}IPage<WarehouseOut> data = iWarehouseOutService.page(PageUtil.initMpPage(page),qw);for (WarehouseOut wh : data.getRecords()) {AssetsType assetsType = iAssetsTypeService.getById(wh.getAssetId());double existnumber = Double.parseDouble(assetsType.getExistingNumber()) + Double.parseDouble(wh.getNumber());wh.setExistNumber("" + existnumber);}return new ResultUtil<IPage<WarehouseOut>>().setData(data);
}
4.3 资产出库
@ApiOperation(value = "资产出库")
@RequestMapping(value = "/insertOrUpdate", method = RequestMethod.POST)
public Result<WarehouseOut> saveOrUpdate(WarehouseOut warehouseOut){WarehouseOut oldWarehouseOut = iWarehouseOutService.getById(warehouseOut.getId());double oldNumber = 0.0;if(oldWarehouseOut != null){oldNumber = Double.parseDouble(oldWarehouseOut.getNumber());}// outNumber 要出库的数量double outNumber = Double.parseDouble(warehouseOut.getNumber());AssetsType oldAssetsType = iAssetsTypeService.getById(warehouseOut.getAssetId());if(oldAssetsType != null){// newNumber 出库后还有的数量 = 仓库原本还有的数量 - 出库单的出库数量 + 原有出库单的出库数量Double newNumber = Double.parseDouble(oldAssetsType.getExistingNumber()) - outNumber + oldNumber;if(newNumber >= 0){oldAssetsType.setExistingNumber(newNumber + "");iAssetsTypeService.saveOrUpdate(oldAssetsType);}else{return ResultUtil.error("手慢啦!库存不足!");}}if(ZwzNullUtils.isNull(warehouseOut.getId())) {warehouseOut.setAuditStatus(0);warehouseOut.setAuditTime("");}if(iWarehouseOutService.saveOrUpdate(warehouseOut)){return new ResultUtil<WarehouseOut>().setData(warehouseOut);}return ResultUtil.error();
}
4.4 查询入库单
@ApiOperation(value = "查询资产入库清单")
@RequestMapping(value = "/getByPage", method = RequestMethod.GET)
public Result<IPage<Warehousing>> getByPage(@ModelAttribute Warehousing warehousing, @ModelAttribute PageVo page){QueryWrapper<Warehousing> qw = new QueryWrapper<Warehousing>();if(!ZwzNullUtils.isNull(warehousing.getNature())) {qw.eq("nature", warehousing.getNature());}if(!ZwzNullUtils.isNull(warehousing.getAssetName())) {qw.like("asset_name", warehousing.getAssetName());}if(!ZwzNullUtils.isNull(warehousing.getInvoice())) {qw.like("invoice", warehousing.getInvoice());}return new ResultUtil<IPage<Warehousing>>().setData(iWarehousingService.page(PageUtil.initMpPage(page),qw));
}
4.5 资产入库
@ApiOperation(value = "资产入库")
@RequestMapping(value = "/insertOrUpdate", method = RequestMethod.POST)
public Result<Warehousing> insertOrUpdate(Warehousing warehousing){Warehousing oldWarehousing = iWarehousingService.getById(warehousing.getId());double oldNumber = 0.0;if(oldWarehousing != null){oldNumber = oldWarehousing.getNumber() == null ? 0.0 : Double.parseDouble(oldWarehousing.getNumber());}// 入库,更新库存AssetsType assetsType = iAssetsTypeServicel.getById(warehousing.getAssetId());if(assetsType != null){// number = 现在仓库总数量 + 该入库单现增加数量 - 该入库单原有增加数量double number = Double.parseDouble(assetsType.getNumber()) + Double.parseDouble(warehousing.getNumber()) - oldNumber;assetsType.setNumber(number + "");assetsType.setTotalPrice((Double.parseDouble(assetsType.getUnitPrice()) * number) + "");// existNumber = 现在仓库存在数量 + 该入库单现增加数量 - 该入库单原有增加数量double existNumber = Double.parseDouble(assetsType.getExistingNumber()) + Double.parseDouble(warehousing.getNumber()) - oldNumber;if(existNumber < 0) {return ResultUtil.error("入库数量大于已出库数量!");}assetsType.setExistingNumber(existNumber + "");iAssetsTypeServicel.saveOrUpdate(assetsType);}if(iWarehousingService.saveOrUpdate(warehousing)){return new ResultUtil<Warehousing>().setData(warehousing);}return ResultUtil.error();
}
五、免责说明
- 本项目仅供个人学习使用,商用授权请联系博主,否则后果自负。
- 博主拥有本软件构建后的应用系统全部内容所有权及独立的知识产权,拥有最终解释权。
- 如有问题,欢迎在仓库 Issue 留言,看到后会第一时间回复,相关意见会酌情考虑,但没有一定被采纳的承诺或保证。
下载本系统代码或使用本系统的用户,必须同意以下内容,否则请勿下载!
- 出于自愿而使用/开发本软件,了解使用本软件的风险,且同意自己承担使用本软件的风险。
- 利用本软件构建的网站的任何信息内容以及导致的任何版权纠纷和法律争议及后果和博主无关,博主对此不承担任何责任。
- 在任何情况下,对于因使用或无法使用本软件而导致的任何难以合理预估的损失(包括但不仅限于商业利润损失、业务中断与业务信息丢失),博主概不承担任何责任。
- 必须了解使用本软件的风险,博主不承诺提供一对一的技术支持、使用担保,也不承担任何因本软件而产生的难以预料的问题的相关责任。

相关文章:
【开源】基于Vue.js的实验室耗材管理系统
文末获取源码,项目编号: S 081 。 \color{red}{文末获取源码,项目编号:S081。} 文末获取源码,项目编号:S081。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗…...
Datawhale聪明办法学Python(task2Getting Started)
一、课程基本结构 课程开源地址:课程简介 - 聪明办法学 Python 第二版 章节结构: Chapter 0 安装 InstallationChapter 1 启航 Getting StartedChapter 2 数据类型和操作 Data Types and OperatorsChapter 3 变量与函数 Variables and FunctionsChapte…...
量化交易怎么操作?量化软件怎么选择比较好?(散户福利,建议收藏)
一:量化的具体操作步骤是什么呢?1. 数据获取:索取和收集金融市场数据。 2. 策略制定:制定数量交易策略,这包括制定投资目标、建立交易规则和风险控制机制等,这个过程需要不断优化和更新。 3. 编写算法&am…...
什么是 AWS IAM?如何使用 IAM 数据库身份验证连接到 Amazon RDS(上)
驾驭云服务的安全环境可能很复杂,但 AWS IAM 为安全访问管理提供了强大的框架。在本文中,我们将探讨什么是 AWS Identity and Access Management (IAM) 以及它如何增强安全性。我们还将提供有关使用 IAM 连接到 Amazon Relational Database Service (RDS…...
Python从入门到精通七:Python函数进阶
函数多返回值 学习目标: 知道函数如何返回多个返回值 问: 如果一个函数如些两个return (如下所示),程序如何执行? 答:只执行了第一个return,原因是因为return可以退出当前函数,导致return下方的代码不执…...
uniapp踩坑之项目:使用过滤器将时间格式化为特定格式
利用filters过滤器对数据直接进行格式化,注意:与method、onLoad、data同层级 <template><div><!-- orderInfo.time的数据为:2023-12-12 12:10:23 --><p>{{ orderInfo.time | formatDate }}</p> <!-- 2023-1…...
webpack学习-2.管理资源
webpack学习-2.管理资源 1.这章要干嘛2.加载css注意顺序! 3.总结 1.这章要干嘛 管理资源,什么意思呢?管理什么资源?项目中经常会 导入各种各样的css文件,图片文件,字体文件,数据文件等等&#…...
658. 找到 K 个最接近的元素
658. 找到 K 个最接近的元素 Java代码:滑窗 class Solution {public List<Integer> findClosestElements(int[] arr, int k, int x) {List<Integer> list new ArrayList<>();for (int i 0; i < arr.length; i) {arr[i] arr[i] - x;}for(i…...
十二、MapReduce概述
1、MapReduce (1)采用框架 MapReduce是“分散——>汇总”模式的分布式计算框架,可供开发人员进行相应计算 (2)编程接口: ~Map ~Reduce 其中,Map功能接口提供了“分散”的功能ÿ…...
shell条件测试
目录 1.1.用途 1.2.基本语法 1.2.1.格式: 1.2.2.例 1.3 文件测试 1.4.整数测试 1.4.1.作用 1.4.2.操作符 1.4.3.示例: 1.5.逻辑操作符 1.5.1.符号 1.5.2.例: 1.6.命令分隔符 1.1.用途 为了能够正确处理Shell程序运行过程中遇到的各种情况&am…...
python在线读取传奇列表,并解析为需要的JSON格式
python在线读取传奇列表,并解析为需要的JSON格式,以下为传奇中使用的TXT列表格式, [Server] ; 使用“/”字符分开颜色,也可以不使用颜色,支持以前的旧格式,只有标题和服务器标题支持颜色 ; 标题/颜色代码(0-255)|服务器标题/颜色代码(0-255)|服务器名称|服务器IP|服务器端…...
【docker 】 安装docker(centOS7)
官网 docker官网 github源码 官网 在CentOS上安装Docker引擎 官网 在Debian上安装Docker引擎 官网 在 Fedora上安装Docker引擎 官网 在ubuntu上安装Docker引擎 官网 在RHEL (s390x)上安装Docker引擎 官网 在SLES上安装Docker引擎 最完善的资料都在官网。 卸载旧版本 …...
智能网联汽车场景数据图像标注要求及方法
智能网联汽车场景数据图像标注要求及方法 1 范围 本标准规定了智能网联汽车场景数据图像中交通参与者、交通信号灯、交通标志、交通标线、可行驶区域、光照条件、遮挡截断情况7类元素的标注要求及方法。 本标准适用于智能网联汽车图像数据标注。 2 规范性引…...
四. 基于环视Camera的BEV感知算法-BEVFormer
目标 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. BEVFormerv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第四章—…...
gin投票系统3
对应视频v1版本 1.优化登陆接口 将同步改为异步 原login前端代码: <!doctype html> <html lang"en"> <head><meta charset"utf-8"><title>香香编程-投票项目</title> </head> <body> <m…...
windows如何解决端口冲突(实用篇)
在项目设计中,环境配置成功点击运行瞬间,一大堆红爆出,8080端口占用,这个是很烦人的。。。 解决方式: 笨方法:一、查看所有端口实用情况(挨个扫) 按住【WINR】快捷键打开运行输入…...
「PPT 下载」Google DevFest Keynote | 复杂的海外网络环境下,如何提升连接质量
(全网都在找的《社交泛娱乐出海作战地图》,点击获取👆) 12 月 10 日,“Google DevFest 2023 上海站”大会如期在上海市东方万国宴会中心举办。延续过往的技术交流碰撞、前沿技术学习基调传统,本届大会聚焦行…...
Logstash输入Kafka输出Es配置
Logstash介绍 Logstash是一个开源的数据收集引擎,具有实时管道功能。它可以从各种数据源中动态地统一和标准化数据,并将其发送到你选择的目的地。Logstash的早期目标主要是用于收集日志,但现在的功能已经远远超出这个范围。任何事件类型都可…...
Bash脚本处理ogg、flac格式到mp3格式的批量转换
现在下载的许多音乐文件是flac和ogg格式的,QQ音乐上下载的就是这样的,这些文件尺寸比较大,在某些场合使用不便,比如在车机上播放还是mp3格式合适,音质这些在车机上播放足够了,要求不高。比如本人就喜欢下载…...
Android 依据Build相关信息判断机型
Android 依据Build相关信息判断机型 本文主要通过Build的相关信息获取机型,目前机型判断的较少,后续继续维护更新 public static String parseBuild() {StringBuilder sb new StringBuilder();String deriveFingerprint Build.FINGERPRINT;String manufacturer Build.MANU…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
