RPMS_4s汽车维修管理

2023-11-08 06:10
文章标签 管理 汽车 维修 4s rpms

本文主要是介绍RPMS_4s汽车维修管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Saas

什么是Saas

SaaS是Software-as-a-service(软件即服务)。SaaS提供商为企业搭建信息化所需要的所有网络基础设施及软件、硬件运作平台,并负责所有前期的实施、后期的维护等一系列服务,企业无需购买软硬件、建设机房、招聘IT人员,即可通过互联网使用信息系统

在这里插入图片描述

Saas模式:

在这里插入图片描述

Saas 模式下面的数据安全问题

​ 方案一: 可一个租户都单独的数据库 – 安全性最高

在这里插入图片描述

方案二: 共享数据库 ,独立schema(oracle比较明显)(用户 方案 – 表)
在这里插入图片描述

方案三: 共享数据库 ,共享表 . – 目前

在这里插入图片描述

saas的权限设计

以前权限设计的模式:

在这里插入图片描述

Saas(平台) 怎么设计权限 ?

在这里插入图片描述

1.4 租户注册–流程

在这里插入图片描述

实现注册流程

学会: (1)怎么去保存 多张表

​ t_tenant /t_employee

​ (2)怎么处理 对象里面 有关联对象

​ employee (tenant)

前台封装参数值:

let para = Object.assign({}, this.employee);
let tenant = {companyName: para.companyName,companyNum:para.companyNum,address:para.address,logo:para.logo
}
para.tenant = tenant;

后台通过Employee对象接收

分页

(1) 创建PageList

​ pageSize page total rows

(2) 创建BaseQuery对象 – >接收到前台传过来的值

(3)在对应的service成添加了分页的方法

public PageList<Department> findPage(DepartmentQuery departmentQuery) {PageList<Department> pageList = new PageList();//查询总数 select count(*) from xxx where xxxxLong total = departmentMapper.findTotal(departmentQuery);//总的条数pageList.setTotal(total);// select *from xx  where limit  0, 10List<Department> departments = departmentMapper.findData(departmentQuery);//当前页的数据pageList.setRows(departments);return pageList;}

高级查询

 <!-- 分页查询总数据的方法 findTatal(DepartmentQuery query)--><select id="findTotal" parameterType="departmentQuery" resultType="long">select count(*) from t_department<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if></where></select><!--limit 0,10  10,10--><select id="findData" parameterType="departmentQuery" resultType="Department">select * from  t_department<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if></where>limit #{start},#{pageSize}</select>

mybatis关系处理

jpa /mybatis

一对一 多对一 – >1方处理

一对多 多对多 --> 多方处理

查询操作

对1方(1对1 多对1)

 <resultMap id="DepartmentMap" type="department"><id column="id" property="id"></id><result column="name" property="name"></result><result column="sn" property="sn"></result><!--对一方处理--><association property="manage" javaType="employee"><id column="eid" property="id"></id><result column="username" property="username"></result></association><association property="parent" javaType="department"><id column="pid" property="id"></id><result column="pname" property="name"></result></association><association property="tenant" javaType="tenant"><id column="tid" property="id"></id><result column="companyName" property="companyName"></result></association></resultMap><!--limit 0,10  10,10--><select id="findData" parameterType="departmentQuery" resultMap="DepartmentMap">select d.id , d.name , d.sn , e.id eid,e.username , p.id pid, p.name pname,t.id tid, t.companyNamefrom  t_department  djoin t_employee e on d.manager_id = e.idjoin t_department p on d.parent_id = p.idjoin t_tenant t on d.tenant_id = t.id<where><if test="name != null and name != ''">and name like concat('%',#{name},'%')</if></where>limit #{start},#{pageSize}</select>

对多(1对多 多对多)

<!-- 查询子部门处理多方--><select id="loadChildrenDept" resultMap="childrenDeptMap">select distinct d.id,d.name ,p.id pid ,p.name pname from t_department djoin t_department p  on d.parent_id = p.idorder by p.id</select><resultMap id="childrenDeptMap" type="department"><id column="pid" property="id"></id><result column="pname" property="name"></result><collection property="childrens" javaType="department"><id column="id" property="id"></id><result column="name" property="name"></result></collection></resultMap>

多对多注意:

​ 在分页的时候,不要嵌套结果 要使用嵌套查询

增(修改) 删除

(1)对1方处理 (1对1 多对1)-- 增加/修改

多个员工对应1个部门 – >

Emloyee:

​ usename, pwd,Department dept;

新增/修改

insert into t_employee (username,pwd,dept_id) values(#{username},#{pwd},#{dept.id})update t_employee set username = #{username},dept_id=#{dept.id} where id=#{id}insert into t_department(name,manage_id) values(#{name},#{manage.id})

(2)对多方处理(1对多/多对多)–保存修改

升级elementui版本:

​ 修改 package.json

  "element-ui": "^2.12.0",

修改main.js 的index.css文件

  import 'element-ui/lib/theme-chalk/index.css'

对话框:

修改 dialog 添加属性:
:visible.sync="addFormVisible"
穿梭框
		<el-form-item label="权限" prop="permissions"><el-transfer v-model="selectedPermissions" :data="allPermissions" :titles="titles"   :props="{key: 'id',label: 'name'}"  @change="handleChange"></el-transfer></el-form-item>
				 selectedPermissions:[],allPermissions:[{"id":1,"name":"添加员工"},{"id":2,"name":"修改员工"},{"id":3,"name":"删除员工"}],titles:['所有权限', '已选权限'],-----------------传值的时候,封装的参数-------------------------------- let paraselectPermsion = Object.assign({},this.selectedPermissions);para.permissions = [];for(let key in paraselectPermsion ){let permission ={"id": paraselectPermsion[key]}para.permissions.push(permission);}
接收保存
 public void saveRolePermisison(Role role){//保存角色t_roleroleMapper.save(role);// 方案一 : 多次操作数据库//方案二: 批量新增 insert into  t_role_permission(role_id,permission_id) values(1,1),(1,2)// insert into//  t_role_permission(role_id,permission_id) values(1,100),(1,201)List<Map<String,Object>> rplist = new ArrayList();List<Permission> permissions = role.getPermissions();for (Permission permission : permissions) {Long pid = permission.getId();Long rid = role.getId();Map rpMap = new HashMap();rpMap.put("roleId",rid);rpMap.put("permissionId",pid);rplist.add(rpMap);}roleMapper.saveRolePermission(rplist);}
 <insert id="saveRolePermission" parameterType="arrayList">insert into t_role_permission(role_id,permission_id) VALUES<foreach collection="list" item="item" separator=",">(#{item.roleId},#{item.permissionId})</foreach></insert>

常用组件

(1)下拉组件

	<el-form-item label="部门经理" prop="username"><el-select v-model="managerId" placeholder="请选择"><el-optionv-for="item in managers":key="item.id":label="item.username":value="item.id"></el-option></el-select></el-form-item>

(2)穿梭框

	<el-form-item label="权限" prop="permissions"><el-transfer v-model="selectedPermissions" :data="allPermissions" :titles="titles"   :props="{key: 'id',label: 'name'}"  @change="handleChange"></el-transfer></el-form-item>

(3)上传

<el-uploadclass="upload-demo"action="http://localhost/file/upload":on-success="handleSuccess":file-list="fileList"list-type="picture"><el-button size="small" type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>

百度地图–看官网

地图 在很多场景下面都在使用

地图有很多种类 – 百度地图 / 高德 /腾讯/谷歌

(1)百度平台得的key=123123123123123123123

百度地图

(2)怎么使用

​ a) 安装 vue-baidu-map

​ npm install vue-baidu-map --save

​ b) 全局引入百度地图 --main.js

import Vue from 'vue'
import BaiduMap from 'vue-baidu-map'Vue.use(BaiduMap,{// ak 是在百度地图开发者平台申请的密钥 详见 http://lbsyun.baidu.com/apiconsole/key */ak: 'Hfr6TfnXRMrg1Df5P2VjwORlDrR8BvTR'
})

c)测试

<!-- 准备一个对话框--><el-dialog title="百度地图" width="60%"   :visible.sync="mapDialogVisibale" v-model="mapDialogVisibale" :close-on-click-modal="false"><baidu-map center="成都市" :zoom="11"><bm-auto-complete v-model="keyword" :sugStyle="{zIndex: 2100}"><div style="margin-bottom:10px"><input  id="searchInput" type="text" placeholder="请输入关键字" class="searchinput"/><el-button type="success" @click="selectAdrressConfirm">确定</el-button></div></bm-auto-complete><bm-view class="bmap"/><bm-local-search :keyword="keyword" :auto-viewport="true" :panel="false"></bm-local-search></baidu-map></el-dialog>

​ # 1. 登录(掌握)

shiro: 安全框架,四大基石(身份认证 授权 密码学 会话管理)

项目里面怎么添加shiro

(1)创建一个shiro的maven模块

(2)导入jar包

<dependencies>  <dependency><groupId>cn.itsource</groupId><artifactId>crm_service</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-all</artifactId><version>1.4.1</version></dependency><!--servlet httpServletRequest --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency>
</dependencies>

3)配置 web.xml 配置 代理过滤器

​ shiro的配置

登录流程

在这里插入图片描述

4 登录之后访问数据流程

在这里插入图片描述

lucene

场景: 模糊查询

​ select * from xxx where name like ‘%xxx%’;

好不好:

​ 如果数据量比较多,效率就会很低

lucene:解决这个问题

lucene是什么

Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)

lucene: (1)它是apache下面的开源项目

​ (2)全文检索引擎工具包 – 对所有内容(文本 图片 视频 音频)进行检索 – 以后主要针对文本去搜索

​ (3) 全文检索的好处:

​ a)比较模糊查询的效率高,底层做了写优化

​ b)进行关键字的高亮显示

​ c)进行相关度 排序 --匹配多的排在最前面

​ d)模糊查询的效果不好 比如 查询 select * from xxx where language like ‘%java%’ – javascript --分词

​ e)对摘要截取

全文检索: 对所有内容(文本 图片 视频 音频)进行检索 – 以后主要针对文本去搜索

了解:

​ 结构化数据: 有结构的数据,比较关系型数据库的数据 (行和列有结构)

​ 半结构化数据: 非关系模型的、有基本固定结构模式的数据,例如日志文件、XML文档、JSON文档、

​ 非结构化数据: 没有固定模式的数据,如WORD、PDF、PPT、EXL,各种格式的图片、视频等

​ 把非结构化数据转换成结构化数据

​ 图片(xxx.jpg) – > 内容存入数据库 图片地址

lucene场景

在小的项目 – lucene – jdbc

大的项目 – elasticseach --springjdbc/jpa

使用lucene

了解一个写lucene核心

在这里插入图片描述

创建索引

 public void testCreateIndex() throws IOException {//得到存储目录Directory d = FSDirectory.open(Paths.get(path));//Directory d, IndexWriterConfig conf//索引写入配置对象 Analyzer analyzerAnalyzer analyzer = new SimpleAnalyzer();IndexWriterConfig conf = new IndexWriterConfig(analyzer);//得到一个索引的写入器对象IndexWriter indexWriter = new IndexWriter(d,conf);//相当于 一个行数据 -- 一个对象 new PersonDocument doc_1= new Document();doc_1.add(new TextField("title","doc文档1", Field.Store.YES));doc_1.add(new TextField("content",doc1, Field.Store.YES));Document doc_2= new Document();doc_2.add(new TextField("title","doc文档2", Field.Store.YES));doc_2.add(new TextField("content",doc2, Field.Store.YES));Document doc_3= new Document();doc_3.add(new TextField("title","doc文档3", Field.Store.YES));doc_3.add(new TextField("content",doc3, Field.Store.YES));//添加索引库indexWriter.addDocument(doc_1);indexWriter.addDocument(doc_2);indexWriter.addDocument(doc_3);indexWriter.commit();indexWriter.close();}

索引搜索

 public void testSeachIndex(String content) throws Exception {//得到query对象String f = "content"; //查询字段// QueryParser(String f, Analyzer a)Analyzer analyzer = new SimpleAnalyzer();QueryParser queryParser = new QueryParser(f,analyzer);Query query = queryParser.parse("content:"+content);//得到索引的查询对象Directory d = FSDirectory.open(Paths.get(path));IndexReader reader = DirectoryReader.open(d);IndexSearcher indexSearcher = new IndexSearcher(reader);//调用方法  10 查询满足条件的前面10条数据TopDocs topDocs = indexSearcher.search(query, 10);//得到命中的数组ScoreDoc[] scoreDocs = topDocs.scoreDocs;for (ScoreDoc scoreDoc : scoreDocs) {int docId = scoreDoc.doc;//docId (0,1,2)Document doc = indexSearcher.doc(docId);System.out.println("查询内容:"+doc.get("title")+"----"+doc.get("content"));}}

Lucene的API的认识

(1) Directory 目录

​ Directory d = FSDirectory.open(Paths.get(path)); --底层代码 会自动选择我们目录类型来存储索引

目录类型:

​ MMapDirectory : 针对64系统,它在维护索引库时,会结合“内存”与硬盘同步来处理索引。

​ SimpleFSDirectory : 传统的文件系统索引库。 window系统就是使用 --(现在)

​ RAMDirectory : 内存索引库

(2) Document类型

映射关系 lucene和数据库的映射关系

documentrow 行
Field(TextField,LongTield,…)column列(类型 varchar bit bigint…decimal(19,2).)
new Document()有一行数据
index索引库数据库db

Document TextField

Field:

​ doc_1.add(new TextField(“content”,doc1, Field.Store.YES));

还可以:–自定义类类型

Document document = new Document();
FieldType fieldType = new FieldType();fieldType.setStored(true); //是否存储
fieldType.setTokenized(true); //是否分词
fieldType.setIndexOptions(IndexOptions.DOCS); //是否索引document.add(new Field("name",department.getName(),fieldType));

1)是否分词:

fieldType.setTokenized(true); //是否分词

​ 地名 人名 不应该分词

​ 描述 , 介绍 应该分词

比如 一个字段的内容存储索引库 ,需要考虑这个字段是否需要分词

比如 中国首都在哪里 --需要

比如 黑龙江 日本 – (日(…) 本(…)–没有必要分词

2)是否存储 :

​ 我们内容是否要存储到索引库

哪些情况下不需要存储索引库?

​ 比如 比较大的内容 文件 图片

3)是否索引:

哪些情况下需要创建索引 哪些情况下不需要创建索引?

​ 如果这列需要作为一个 查询的条件,是否创建索引

分词器-ik分词器

分词(分词器):在一个内容 拆分开

什么需要情况下面:

​ 在创建索引的时候 --可以使用分词

​ 在搜索索引的时候 --可以使用分词

英文 通过空格来进行分词

this is my boyfirend

中文 通过ik分词器(设置停用词 和 扩展词)

操作

对文档的操作 – add

indexWriter.addDocument(doc_3); --文档新增
indexWriter.updateDocument(); --文档修改
indexWriter.deleteDocuments(); --文档删除

lucene的项目实战

	凡是使用查询的地方 都可以使用lucene 

​ 比如 : 系统日志 – 记录

​ (1) 把数据库里面数据 写到 索引库

​ 什么时候 把数据写到索引库?

​ 数据是否是及时数据 :

​ 是: 在添加数据库同时,及时添加索引库

​ 后: 页面上设计一个 同步 按钮(把数据库的内容同步到索引库)

​ (2) 把索引库的数据 查询出来 展示到页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T4HsAyzN-1579005929218)(笔记.assets/image-20200110112703775.png)]

(3)项目里面添加lucene实现步骤

​ a)创建一个模块 crm_fulltext

​ 导入包

​ 手动把jar到maven仓库

 mvn install:install-file -Dfile=IKAnalyzer2012_V5.jar -DgroupId=org.wltea -DartifactId=IKAnalyzer -Dversion=2012_V5 -Dpackaging=jar 

​ b)操作索引库方法

​ 引入操作索引库的工具类(LuceneUtil(crud以及分页))

​ c)测试

维修模块 前端

<template><div><section><!--工具条--><el-col :span="24" class="toolbar" style="padding-bottom: 0px;"><el-form :inline="true" :model="filters"><el-form-item><el-input v-model="filters.carnum" placeholder="车牌号"></el-input></el-form-item><el-form-item><el-select v-model="filters.state" placeholder="按状态展示" @change="getRepairOrder"><el-optionv-for="item in options":key="item.value":label="item.label":value="item.value"></el-option></el-select></el-form-item><el-form-item><el-button type="primary" icon="el-icon-search" v-on:click="getRepairOrder">查询</el-button></el-form-item><el-form-item><el-button icon="el-icon-refresh" @click="clearFilter">重置</el-button></el-form-item><el-form-item><el-button type="primary" icon="el-icon-circle-plus-outline" @click="handleAdd">新增</el-button></el-form-item></el-form></el-col><!--列表--><el-table :data="repairOrders" highlight-current-row v-loading="listLoading" @selection-change="selsChange" style="width: 100%;" @row-dblclick="showItems"><el-table-column type="selection" width="55"></el-table-column><el-table-column prop="id" label="维修工单号" width="180" sortable></el-table-column><el-table-column prop="custormer" label="客户姓名" width="120" sortable></el-table-column><el-table-column prop="carnum" label="车牌号" width="120" sortable></el-table-column><el-table-column prop="createtime" label="创建时间" width="160" sortable></el-table-column><el-table-column prop="employee.username" label="维修人员" min-width="120" ></el-table-column><el-table-column prop="address" label="客户地址" min-width="180" ></el-table-column><el-table-column prop="state" label="状态" min-width="100"><template slot-scope="scope"><span  v-if="scope.row.state==0"  style="color: red">已录入</span><span  v-else=""  style="color: green">已结算</span></template></el-table-column><el-table-column label="操作" width="150"><template scope="scope"><el-button size="small" @click="handleEdit(scope.$index, scope.row)">编辑</el-button><el-button type="danger" size="small" @click="handleDel(scope.$index, scope.row)">删除</el-button></template></el-table-column></el-table><!--工具条--><el-col :span="24" class="toolbar"><el-button type="danger" @click="batchRemove" :disabled="this.sels.length===0">批量删除</el-button><el-pagination layout="prev, pager, next" @current-change="handleCurrentChange" :page-size="10" :total="total" style="float:right;"></el-pagination></el-col><br><!--编辑界面--><el-dialog title="编辑" :visible.sync="editFormVisible" v-model="editFormVisible" :close-on-click-modal="false"><el-form :model="editForm" label-width="80px" :rules="editFormRules" ref="editForm"><el-form-item label="客户姓名" prop="custormer"><el-input v-model="editForm.custormer" auto-complete="off"></el-input></el-form-item><el-form-item label="车牌号" prop="carnum"><el-input v-model="editForm.carnum" auto-complete="off"></el-input></el-form-item><el-form-item label="联系方式" prop="phone"><el-input v-model="editForm.phone" auto-complete="off"></el-input></el-form-item><el-form-item label="邮箱地址" prop="email"><el-input v-model="editForm.email" auto-complete="off"></el-input></el-form-item><el-form-item label="维修人员" prop="username"><el-select v-model="editForm.employee.id" placeholder="请选择"><el-optionv-for="item in employees":key="item.id":label="item.username":value="item.id"></el-option></el-select></el-form-item><el-form-item label="地址" prop="address"><el-input  v-model="editForm.address"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click.native="editFormVisible = false">取消</el-button><el-button type="primary" @click.native="editSubmit" :loading="editLoading">提交</el-button></div></el-dialog><!--新增界面--><el-dialog title="新增" :visible.sync="addFormVisible" v-model="addFormVisible" :close-on-click-modal="false"><el-form :model="addForm" label-width="80px" :rules="addFormRules" ref="addForm"><el-form-item label="客户姓名" prop="custormer"><el-input v-model="addForm.custormer" auto-complete="off"></el-input></el-form-item><el-form-item label="车牌号" prop="carnum"><el-input v-model="addForm.carnum" auto-complete="off"></el-input></el-form-item><el-form-item label="联系方式" prop="phone"><el-input v-model="addForm.phone" auto-complete="off" ></el-input></el-form-item><el-form-item label="邮箱地址" prop="email"><el-input v-model="addForm.email" auto-complete="off" ></el-input></el-form-item><el-form-item label="维修人员" prop="username"><el-select v-model="addForm.employee.id" placeholder="请选择"><el-optionv-for="item in employees":key="item.id":label="item.username":value="item.id"></el-option></el-select></el-form-item><el-form-item label="地址" prop="address"><el-input type="textarea" v-model="addForm.address"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click.native="addFormVisible = false">取消</el-button><el-button type="primary" @click.native="addSubmit" :loading="addLoading">提交</el-button></div></el-dialog></section><section><!--明细上方工具条--><el-col :span="15" class="itemtoolbar" style="padding-bottom: 0px;"><el-form :inline="true" ><el-form-item><el-button type="primary" icon="el-icon-circle-plus-outline" @click="itemhandleAdd">新增明细单</el-button></el-form-item><el-form-item><el-button type="primary" icon="el-icon-circle-check-outline" @click="setted" style="background-color: orange">订单结算</el-button></el-form-item></el-form></el-col><el-col :span="9" class="itemtoolbar" style="padding-bottom: 0px;"><span style="font-size: 18px;color: #e64242;">维修车辆(双击选中):</span><span v-model="rep_carnum" style="font-size: 18px;color: #1d8ce0" width="50px">{{rep_carnum}}</span></el-col><!--列表--><el-table :data="repairorderitems" highlight-current-row v-loading="itemlistLoading" @selection-change="itemselsChange" style="width: 100%;"><el-table-column type="selection" width="55"></el-table-column><el-table-column prop="id" label="明细单号" width="100" sortable></el-table-column><el-table-column prop="repairOrder.id" label="维修工单号" width="100" sortable></el-table-column><el-table-column prop="employee.username" label="维修人员" width="120" ></el-table-column><el-table-column prop="autoParts.partsname" label="配件名" width="120" ></el-table-column><el-table-column prop="amt1" label="配件价格" width="150" sortable></el-table-column><el-table-column prop="amt2" label="工时费" min-width="120" sortable></el-table-column><el-table-column prop="num" label="数量" min-width="120" sortable></el-table-column><el-table-column prop="totalamt" label="总金额" min-width="180" sortable></el-table-column><el-table-column label="操作" width="150"><template scope="scope"><!--<el-button size="small" @click="itemhandleEdit(scope.$index, scope.row)">修改</el-button>--><el-button type="danger" size="small" @click="itemhandleDel(scope.$index, scope.row)">删除</el-button></template></el-table-column></el-table><!--工具条--><!--<el-col :span="24" class="toolbar"><el-button type="danger" @click="itembatchRemove" :disabled="this.itemsels.length===0">批量删除</el-button><el-pagination layout="prev, pager, next" @current-change="itemhandleCurrentChange" :page-size="10" :total="total" style="float:right;"></el-pagination></el-col>--><!--新增明细界面--><el-dialog title="新增" :visible.sync="repairorderitemFormVisible" v-model="repairorderitemFormVisible" :close-on-click-modal="false"><el-form :model="repairorderitem" label-width="80px" :rules="itemeditFormRules" ref="repairorderitem"><!--维修人员下拉框--><el-form-item label="维修人员" prop="employeeId"><el-select v-model="repairorderitem.employee.id" placeholder="请选择"><el-optionv-for="item in employees":key="item.id":label="item.username":value="item.id"></el-option></el-select></el-form-item><el-form-item label="配件" prop="Parts"><el-select v-model="repairorderitem.autoParts.pid" @change="Changeprice" placeholder="请选择"><el-optionv-for="item in Parts":key="item.pid":label="item.partsname":value="item.pid"></el-option></el-select></el-form-item><el-form-item label="零件单价" prop="amt1"><el-input v-model="repairorderitem.amt1" auto-complete="off" readonly></el-input></el-form-item><el-form-item label="工时费" prop="amt2"><el-input v-model="repairorderitem.amt2" auto-complete="off"></el-input></el-form-item><el-form-item label="零件数量" prop="num"><el-input v-model="repairorderitem.num" auto-complete="off"></el-input></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click.native="repairorderitemFormVisible = false">取消</el-button><el-button type="primary" @click.native="itemeditSubmit" :loading="addLoading">提交</el-button></div></el-dialog><!--结算界面--><el-dialog title="订单结算" :visible.sync="settedVisible" v-model="settedVisible" :close-on-click-modal="false"><el-form :model="settedVal" label-width="80px" :rules="setted1FormRules" ref="setted1"><el-form-item label="客户姓名" prop="custormer"  ><el-input v-model="settedVal.custormer" auto-complete="off" readonly></el-input></el-form-item><el-form-item label="应付金额" prop="re_amount"  ><el-input v-model="settedVal.re_amount" auto-complete="off" readonly></el-input></el-form-item><el-form-item label="实付金额" prop="pay_amount" ><el-input v-model="settedVal.pay_amount" auto-complete="off"></el-input></el-form-item><el-form-item label="地址" prop="address" ><el-input v-model="settedVal.address" auto-complete="off" readonly=""></el-input></el-form-item><el-form-item label="支付方式" prop="payType"><el-select label="支付方式" v-model="settedVal.payid.id" placeholder="请选择支付方式"><el-optionv-for="item in selectPayment":key="item.id":label="item.name":value="item.id"></el-option><!--<el-option label="现金" value="1"></el-option><el-option label="银行卡" value="2"></el-option><el-option label="微信" value="3"></el-option><el-option label="支付宝" value="4"></el-option--></el-select></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click.native="settedVisible = false">取消</el-button><el-button type="primary" @click="settedSave">提交</el-button></div></el-dialog></section></div>
</template><script>import util from '../../common/js/util'/*//import NProgress from 'nprogress'*/import { getUserListPage, removeUser, batchRemoveUser, editUser, addUser } from '../../api/api';export default {data() {//手机验证let telCheck = (rule, value, callback) => {if (!value) {return callback(new Error('手机号不能为空'));} else {const reg = /^1[3|4|5|7|8][0-9]\d{8}$/if (reg.test(value)) {callback();} else {return callback(new Error('请输入正确的手机号'));}}};let emailCheck = (rule, value, callback) => {//验证邮箱格式if (!value) {return callback(new Error('邮箱不能为空'));} else {const reg = /^[A-Za-zd0-9]+([-_.][A-Za-zd]+)*@([A-Za-zd]+[-.])+[A-Za-zd]{2,5}$/;if(reg.test(value)){return callback();}else{return callback(new Error('邮箱格式不正确。'));}}};/*部门验证*/let checkNum = (rule, value, callback) => {value = this.repairorderitem.num;let partsMaxNum=this.repairorderitem.partsMaxNum;if (value>partsMaxNum||value<0){return callback(new Error('该配件仓库最大数量为'+partsMaxNum+',配件数量必须是0至'+partsMaxNum));}else {callback();}};return {//状态查询options: [{value: '0',label: '已录入'}, {value: '1',label: '已结算'}],//结算弹窗settedVisible:false,//结算单数据settedVal:{mainid:{mainid:''},custormer:'',re_amount:null,pay_amount:null,payid:{id:'',name:''},returnType:{id:null},address:'',state:0,phone:'',email:''},//维修房高级查询filters: {carnum: '',custormer:'',state:''},selectPayment:[],repairOrders: [],total: 0,page: 1,listLoading: false,sels: [],//列表选中列addFormVisible: false,//新增界面是否显示addLoading: false,editFormVisible: false,//编辑界面是否显示editLoading: false,editFormRules: {custormer: [{ required: true, message: '请输入姓名', trigger: 'blur' },],carnum: [{ required: true, message: '车牌号必填!', trigger: 'blur' },],address: [{ required: true, message: '请输入还车地址', trigger: 'blur' }],phone: [{ required: true, trigger: 'blur',validator: telCheck }],email: [{ required: true, trigger: 'blur',validator: emailCheck }]},//编辑界面数据editForm: {id: 0,custormer: '',carnum: '',state:1,employee:{id:'',username:''},address: '',phone:'',email:''},//新增规则addFormRules: {custormer: [{ required: true, message: '请输入客户姓名', trigger: 'blur' }],carnum: [{ required: true, message: '车牌号必填!', trigger: 'blur' }],address: [{ required: true, message: '请输入还车地址', trigger: 'blur' }],phone: [{ required: true, trigger: 'blur',validator: telCheck }],email: [{ required: true, trigger: 'blur',validator: emailCheck }]},//新增界面数据addForm: {id: 0,custormer: '',carnum: '',employee:{id:'',username:''},address: '',phone:'',email:''},//明细栏数据//明细栏显示的车牌号,当前选中展示出来的维修单车牌号rep_carnum:'请双击选择维修单!',//明细右上角提示,明细所属的维修单号,当前选中展示出来的维修单号mainid:0,custormer:'',//初始化明细列表,默认为空repairorderitems: [],//明细分页itemtotal: 0,//初始时总共0条itempage: 1,//初始时为第一页//明细加载,默认不加载itemlistLoading: false,//明细多选时,选中行的值itemsels: [],//明细编辑界面,默认关闭repairorderitemFormVisible: false,Parts:[],employees:[],itemeditFormRules: {amt1: [{ required: true, message: '配件单价必填', trigger: 'blur' }],amt2: [{ required: true, message: '工时费必填', trigger: 'blur' }],num: [{ required: true, message: '配件数量必填', trigger: 'blur' },{ validator: checkNum, required: true, trigger: 'blur' }]},//结算框验证规则setted1FormRules: {pay_amount: [{ required: true, message: '请输入实付金额', trigger: 'blur' }],},//新增明细界面数据repairorderitem:{id: 0,repairOrder:{id:this.mainid,},employee:{id:'',username:''},autoParts:{pid:'',partsname:'',price:''},amt1: '',amt2: '',partsMaxNum:'',//可填入的最大数量num:'',//填入的配件数量totalamt:''}}},//方法methods: {formatEmployee: function (row, column) {return row.employee.username;},//清空查询刷新clearFilter() {this.filters.carnum='',this.filters.state='',this.getRepairOrder(),this.getRepairOrderItem(),this.rep_carnum='请双击选择维修单!'},//状态转换formatStatus: function (row, column) {return row.state == 1 ? '待维修':row.state == 0 ? '已结算' : '未知';},//维修单换页handleCurrentChange(val) {this.page = val;this.getRepairOrder();},//维修明细换页itemhandleCurrentChange(val) {this.page = val;this.getRepairOrderItem();},//获取订单列表getRepairOrder() {let para = {page: this.page,//name: this.filters.name,carnum: this.filters.carnum,state:this.filters.state};this.listLoading = true;//NProgress.start();this.$http.patch("/repairorder/page",para).then((res) => {this.repairOrders = res.data.rows;this.total = res.data.total;this.listLoading = false;this.getEmployees();});},//下拉配件列表对应价格Changeprice:function(index){this.$http.delete("/parts/findPrice/"+index,index).then((res) => {this.repairorderitem.amt1=res.data[0].price;this.repairorderitem.partsMaxNum=res.data[0].num;this.$forceUpdate();});},//获取订单明细列表getRepairOrderItem() {let para = {page: this.page,mainid:this.mainid};this.listLoading = true;//NProgress.start();this.$http.get("/repairorderitem/findByRepId/"+this.mainid).then(res=>{this.repairorderitems = res.data;console.debug(this.repairorderitems);//this.total = res.data.total;this.listLoading = false;this.getEmployees();this.getRepairOrder();this.getParts();});},//双击维修单一行显示明细showItems(row){/*console.debug(row);//将选中行赋值给中间变量this.repairorderitems=row;*///根据维修单号mainid查询明细this.mainid=row.id;this.custormer=row.custormer;//显示选中的车牌号this.rep_carnum=row.carnum;//获取根据维修单编号用户名this.$http.get("/repairorder/query/"+this.mainid).then(res=>{this.listLoading = false;this.state=res.data.state;});this.settedVal.mainid.mainid=this.mainid;//分页加载this.getRepairOrderItem();},//删除handleDel: function (index, row) {this.$confirm('确认删除该记录吗?', '提示', {type: 'warning'}).then(() => {this.listLoading = true;//NProgress.start();this.$http.delete("/repairorder/delete/"+row.id).then((res) => {this.listLoading = false;let {success,msg}=res.data;if(success){this.$message({message: '删除成功',type: 'success'});}else{this.$message({message: msg,type: 'error'});}this.getRepairOrder();this.getRepairOrderItem();});}).catch(() => {});},//明细单删除itemhandleDel: function (index, row) {this.$confirm('确认删除该记录吗?', '提示', {type: 'warning'}).then(() => {this.listLoading = true;//NProgress.start();this.$http.delete("/repairorderitem/delete/"+row.id).then((res) => {this.listLoading = false;let {success,msg}=res.data;if(success){this.$message({message: '删除成功',type: 'success'});}else{this.$message({message: msg,type: 'error'});}this.getRepairOrderItem();});}).catch(() => {});},//显示编辑界面handleEdit: function (index, row) {this.editFormVisible = true;//查询维修人员this.getEmployees();//回显this.editForm = Object.assign({}, row);this.$refs['editForm'].clearValidate();},//显示新增界面handleAdd: function () {this.addFormVisible = true;//清空表单this.addForm = {id: 0,custormer: '',carnum: '',state:0,employee:{id:'',username:''},address: '',phone:'',email:''};//清空验证this.$refs['addForm'].resetFields();//查询维修人员this.getEmployees();},/*  //修改明细itemhandleEdit: function (index, row) {//回显this.repairorderitemFormVisible = true;//回显作用 拷贝row到新的{}对象,防止修改时,主菜单栏也改变this.repairorderitem = Object.assign({}, row);},*///显示新增明细界面itemhandleAdd: function () {//判断是否选中维修单if(this.mainid===0){this.$message({message: "请双击选择维修单!",type: 'error'});return;}this.repairorderitemFormVisible = true;//清空表单this.repairorderitem = {id: 0,repairOrder:{id:this.mainid,},employee:{id:'',username:''},autoParts:{pid:'',partsname:''},amt1: '',amt2: '',num:'',totalamt:''};},getPayment:function(){this.$http.patch("/select/payment").then((res)=>{this.selectPayment=res.data;});},getEmployees(){this.$http.patch("/employee/repair").then(res=>{console.log(res.data);//判断是否是维修员for(var i=0 ;i<res.data.length;i++){if(res.data[i].department.id==10){this.employees[i]=res.data[i]}}});},getParts(){this.$http.patch("/parts/list").then(res=>{console.debug(res.data);for(var i=0 ;i<res.data.length;i++){{this.Parts[i]=res.data[i];}}});},//编辑editSubmit: function () {//提交之前的验证工作this.$refs.editForm.validate((valid) => {if (valid) {this.$confirm('确认提交吗?', '提示', {}).then(() => {this.editLoading = true;//NProgress.start();let para = Object.assign({}, this.editForm);this.$http.post('/repairorder/update',para).then(res=>{this.editLoading = false;//NProgress.done();this.$message({message: '提交成功',type: 'success'});this.$refs['editForm'].resetFields();this.editFormVisible = false;this.filters.carnum='';this.page=1;this.getRepairOrder();//清空明细栏this.rep_carnum='请双击选择维修单!';this.mainid=0;this.getRepairOrderItem();});});}});},//新增addSubmit: function () {//提交之前的验证工作this.$refs.addForm.validate((valid) => {if (valid) {this.$confirm('确认提交吗?', '提示', {}).then(() => {this.addLoading = true;//NProgress.start();let para = Object.assign({}, this.addForm);console.debug(para);this.$http.put('/repairorder/save',para).then(res=>{this.addLoading = false;//NProgress.done();this.$message({message: '提交成功',type: 'success'});//关闭新增对话框this.addFormVisible = false;this.getRepairOrder();});});}});},//新增明细itemeditSubmit: function () {//提交之前的验证工作this.$refs.repairorderitem.validate((valid) => {if (valid) {this.$confirm('确认提交吗?', '提示', {}).then(() => {this.addLoading = true;//NProgress.start();let para = Object.assign({}, this.repairorderitem);this.$http.put('/repairorderitem/save',para).then(res=>{this.addLoading = false;//NProgress.done();this.$message({message: '提交成功',type: 'success'});//重置表单this.$refs['repairorderitem'].resetFields();//关闭新增对话框this.repairorderitemFormVisible = false;this.getRepairOrderItem();});});}});},//维修单多选时,选中项变化时取值selsChange: function (sels) {this.sels = sels;},//维修明细单多选时,选中项变化时取值itemselsChange: function (itemsels) {this.sels = itemsels;},//批量删除batchRemove: function () {var ids = this.sels.map(item => item.id).toString();this.$confirm('确认删除选中记录吗?', '提示', {type: 'warning'}).then(() => {this.itemlistLoading = true;//NProgress.start();let para = { ids: ids };this.$http.post('/repairorder/delete/'+ids).then(res=>{this.listLoading = false;//NProgress.done();this.$message({message: '删除成功',type: 'success'});this.getRepairOrder();});}).catch(() => {});},//批量删除明细/*itembatchRemove: function () {this.$confirm('确认删除选中记录吗?', '提示', {type: 'warning'}).then(() => {this.itemlistLoading = true;var itempara = this.itemsels;this.$http.patch("/repairorderitem/deletes",itempara).then((res) => {this.listLoading = false;//根据前台返回的 AjaxResult,判断是否成功if(res.data.success){this.$message({message: res.data.message,type: 'success'});}else {this.$message({message: res.data.message,type: 'error'});};//刷新明细展示列表this.getRepairOrderItem();});}).catch(() => {});},*///结算弹窗的方法setted:function(index){//判断是否选中维修单 //维修单idif(this.mainid===0){this.$message({message: "请双击选择需要结算的维修单!",type: 'error'});return;}//判断是否结算if(this.state==1){this.$message({message: "该订单已结算!",type: 'error'});return;}this.getRepairOrder();//获取根据维修单编号用户名this.$http.get("/repairorder/query/"+this.mainid).then(res=>{this.listLoading = false;//顾客姓名this.settedVal.custormer=res.data.custormer;//地址this.settedVal.address=res.data.address;this.getRepairOrder();});//根据mainid查询订单明细this.$http.get("/repairorderitem/findByRepId/"+this.mainid).then(res=>{this.listLoading = false;let amountSum = 0;for(var i=0;i<res.data.length;i++){amountSum=amountSum+res.data[i].totalamt;}//计算出结算订单的总金额this.settedVal.re_amount= amountSum.toFixed();//计算出结算订单的应付金额this.settedVal.pay_amount= amountSum.toFixed();});this.settedVal.payid={id:'',name:''}this.settedVisible=true},//结算保存的方法settedSave(){this.$refs.setted1.validate((valid) => {if (valid) {this.$confirm('确认提交吗?', '提示', {}).then(() => {//拷贝后面对象的值到新的对象,防止后面的代码改动引起模型的变化let para = Object.assign({}, this.settedVal);console.debug(para)//添加与修改走同一个路径,所以不需要判断this.$http.put("/settlementorder/save",para).then((res) => {this.$message({message: '结算成功!',type: 'success'});//重置表单this.$refs['setted1'].resetFields();//关闭对话框this.settedVisible = false;//刷新数据this.filters.carnum='';this.mainid=0;//刷新维修单this.getRepairOrder();//清空明细栏this.getRepairOrderItem();this.rep_carnum='请双击选择维修单!';});});}});}},mounted() {this.getRepairOrder();this.getRepairOrderItem();this.getEmployees();this.getParts();this.getPayment();//获取所有维修员this.$http.patch('/employee/repair').then((res) => {this.employees=res.data;});//获取所有汽车配件this.$http.patch('/parts/list').then((res) => {this.Parts=res.data;});this.$http.patch('/select/payment').then((res) => {this.Parts=res.data;});}}</script><style scoped></style>

RepairOrderController


```java
package cn.itsource.rpms.web.controller;import cn.itsource.basic.query.BaseQuery;
import cn.itsource.basic.util.AjaxResult;
import cn.itsource.basic.util.PageList;
import cn.itsource.rpms.domain.RepairOrder;
import cn.itsource.rpms.query.RepairOrderQuery;
import cn.itsource.rpms.service.IRepairOrderItemService;
import cn.itsource.rpms.service.IRepairOrderService;
import cn.itsource.rpms.util.Constants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import java.util.List;@Controller
@RequestMapping("/repairorder")
@CrossOrigin//跨域访问的注解支持
public class RepairOrderController {@Autowiredprivate IRepairOrderService repairOrderService;@Autowiredprivate IRepairOrderItemService repairOrderItemService;/*查询全部的数据并分页*/@RequestMapping(value = "/list",method= RequestMethod.PATCH)@ResponseBodypublic List<RepairOrder> getList(){return repairOrderService.findAll();}/*分页查询*/@RequestMapping(value = "/page",method= RequestMethod.PATCH)@ResponseBodypublic PageList<RepairOrder> page(@RequestBody RepairOrderQuery repairOrderQuery){PageList<RepairOrder> pageList = repairOrderService.findByQuery(repairOrderQuery);return pageList;}//新增@RequestMapping(value="/save",method = RequestMethod.PUT)@ResponseBody@CrossOriginpublic AjaxResult save(@RequestBody RepairOrder repairOrder){System.out.println("新增数据");System.out.println(repairOrder);repairOrder.setState(Constants.REPAIRORDERNO);repairOrderService.save(repairOrder);return new AjaxResult();}//修改@RequestMapping(value="/update",method = RequestMethod.POST)@ResponseBodypublic AjaxResult update(@RequestBody  RepairOrder repairOrder){System.out.println("修改数据");System.out.println(repairOrder);repairOrderService.update(repairOrder);return new AjaxResult();}//根据id删除@RequestMapping(value="/delete/{id}",method = RequestMethod.DELETE)@ResponseBodypublic AjaxResult delete(@PathVariable("id") Long id){System.out.println("删除数据");System.out.println("删除的id:"+id);try {//删除明细repairOrderItemService.deleteByRepId(id);//删除维修单repairOrderService.delete(id);} catch (Exception e) {e.printStackTrace();return new AjaxResult("删除失败"+e.getMessage());}return new AjaxResult();}/*** 批量删除* @param ids* @return*/@RequestMapping(value="/delete/{ids}",method = RequestMethod.POST)@ResponseBody@CrossOriginpublic AjaxResult delBatch(@PathVariable("ids") String ids){String[] idss = ids.split(",");for (String s : idss) {Long id = Long.valueOf(s);try {//删除明细repairOrderItemService.deleteByRepId(id);//删除明细单repairOrderService.delete(id);} catch (Exception e) {e.printStackTrace();return new AjaxResult(false,"删除失败:"+e.getMessage());}}return new AjaxResult(true,"删除成功");}//根据id查询@RequestMapping(value="/query/{id}",method = RequestMethod.GET)@ResponseBodypublic RepairOrder queryOne(@PathVariable("id") Long id){System.out.println("查询数据");System.out.println("查询的id:"+id);return   repairOrderService.findOne(id);}}
# RepairOrderItemController```java
package cn.itsource.rpms.web.controller;import cn.itsource.basic.query.BaseQuery;
import cn.itsource.basic.util.AjaxResult;
import cn.itsource.basic.util.PageList;
import cn.itsource.rpms.domain.AutoParts;
import cn.itsource.rpms.domain.RepairOrder;
import cn.itsource.rpms.domain.RepairOrderItem;
import cn.itsource.rpms.query.RepairOrderItemQuery;
import cn.itsource.rpms.query.RepairOrderQuery;
import cn.itsource.rpms.service.IAutoPartsService;
import cn.itsource.rpms.service.IRepairOrderItemService;
import cn.itsource.rpms.service.IRepairOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import java.util.List;@Controller
@RequestMapping("/repairorderitem")
@CrossOrigin//跨域访问的注解支持
public class RepairOrderItemController {@Autowiredprivate IRepairOrderItemService repairOrderItemService;@Autowiredprivate IAutoPartsService autoPartsService;@Autowiredprivate IRepairOrderService repairOrderService;/*查询全部的方法*/@RequestMapping(value = "/list",method= RequestMethod.PATCH)@ResponseBodypublic List<RepairOrderItem> getList(){return repairOrderItemService.findAll();}//根据订单号查询明细@RequestMapping(value = "/findByRepId/{id}",method= RequestMethod.GET)@ResponseBodypublic List<RepairOrder> findByRepId(@PathVariable("id") Long id){return repairOrderItemService.findByRepId(id);}/*分页查询*/@RequestMapping(value = "/page",method= RequestMethod.PATCH)@ResponseBodypublic PageList<RepairOrderItem> page(@RequestBody RepairOrderItemQuery repairOrderItemQuery){PageList<RepairOrderItem> pageList = repairOrderItemService.findByQuery(repairOrderItemQuery);return pageList;}//新增@RequestMapping(value="/save",method = RequestMethod.PUT)@ResponseBodypublic AjaxResult save(@RequestBody RepairOrderItem repairOrderItem){System.out.println("新增数据");System.out.println(repairOrderItem);//得到前台输入的零件数量和idInteger num = repairOrderItem.getNum();//新增维修明细单,配件的减少AutoParts oneParts = autoPartsService.findOne(repairOrderItem.getAutoParts().getPid());Integer num1 = oneParts.getNum();AutoParts parts= new AutoParts();parts.setPid(repairOrderItem.getAutoParts().getPid());parts.setNum(num1-num);parts.setPartsname(oneParts.getPartsname());parts.setPrice(oneParts.getPrice());parts.setWarnnum(oneParts.getWarnnum());parts.setContext(oneParts.getContext());autoPartsService.update(parts);repairOrderItemService.save(repairOrderItem);return new AjaxResult();}//修改@RequestMapping(value="/update",method = RequestMethod.POST)@ResponseBodypublic AjaxResult update(@RequestBody  RepairOrderItem repairOrderItem){System.out.println("修改数据");System.out.println(repairOrderItem);repairOrderItemService.update(repairOrderItem);return new AjaxResult();}//根据id删除@RequestMapping(value="/delete/{id}",method = RequestMethod.DELETE)@ResponseBodypublic AjaxResult delete(@PathVariable("id") Long id){System.out.println("删除数据");System.out.println("删除的id:"+id);//查询明细单RepairOrderItem repairOrderItem = repairOrderItemService.findOne(id);//根据明细单查询维修单RepairOrder repairOrder = repairOrderService.findOne(repairOrderItem.getRepairOrder().getId());try {//判断状态未结算if(repairOrder.getState()!=1){//得到前台输入的零件数量和idInteger num = repairOrderItem.getNum();//删除维修明细单,配件的回复AutoParts oneParts = autoPartsService.findOne(repairOrderItem.getAutoParts().getPid());Integer num1 = oneParts.getNum();AutoParts parts= new AutoParts();parts.setPid(repairOrderItem.getAutoParts().getPid());parts.setNum(num1+num);parts.setPartsname(oneParts.getPartsname());parts.setPrice(oneParts.getPrice());parts.setWarnnum(oneParts.getWarnnum());parts.setContext(oneParts.getContext());autoPartsService.update(parts);repairOrderItemService.delete(id);}else {repairOrderItemService.delete(id);}} catch (Exception e) {e.printStackTrace();return new AjaxResult("删除失败"+e.getMessage());}return new AjaxResult();}//根据id查询@RequestMapping(value="/query/{id}",method = RequestMethod.GET)@ResponseBodypublic RepairOrderItem queryOne(@PathVariable("id") Long id){System.out.println("查询数据");System.out.println("查询的id:"+id);return   repairOrderItemService.findOne(id);}}

这篇关于RPMS_4s汽车维修管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/368273

相关文章

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Redis实现RBAC权限管理

《Redis实现RBAC权限管理》本文主要介绍了Redis实现RBAC权限管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1. 什么是 RBAC?2. 为什么使用 Redis 实现 RBAC?3. 设计 RBAC 数据结构

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

SpringBoot使用minio进行文件管理的流程步骤

《SpringBoot使用minio进行文件管理的流程步骤》MinIO是一个高性能的对象存储系统,兼容AmazonS3API,该软件设计用于处理非结构化数据,如图片、视频、日志文件以及备份数据等,本文... 目录一、拉取minio镜像二、创建配置文件和上传文件的目录三、启动容器四、浏览器登录 minio五、

IDEA中的Kafka管理神器详解

《IDEA中的Kafka管理神器详解》这款基于IDEA插件实现的Kafka管理工具,能够在本地IDE环境中直接运行,简化了设置流程,为开发者提供了更加紧密集成、高效且直观的Kafka操作体验... 目录免安装:IDEA中的Kafka管理神器!简介安装必要的插件创建 Kafka 连接第一步:创建连接第二步:选

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业