1、项目介绍
本系统在功能分析上,主要是根据目标用户群的角度进行分析,为了便于展示分析结果,这里就使用用例图进行功能展示。
管理员用例图的绘制结果见图3-5。管理员登录进入本系统操作的功能包括管理车辆,管理公告,管理用户,审核牌照换补申请信息,审核牌照申请信息,审核牌照转移申请信息等。
用户用例图的绘制结果见图3-6。用户登录进入本系统操作的功能包括申请牌照换补,申请牌照,申请牌照转移,查看公告,管理车辆信息等。
2、技术框架
运行系统:windows
编程语言:java
系统架构:B/S
后端框框:SpringBoot
前端框架:Vue+HTML+JavaScript+Css
前后端分离:否
数据库:MySQL
Maven项目:是
数据库表数量:10
运行环境:JDK8+MySQL5.7+Maven3.6+IntelliJ IDEA
3、演示视频
基于springboot的机动车号牌管理
4、项目截图
5、文档截图
6、代码示例
<template>
<div class="addEdit-block">
<el-form
class="detail-form-content"
ref="ruleForm"
:model="ruleForm"
:rules="rules"
label-width="80px"
:style="{backgroundColor:addEditForm.addEditBoxColor}">
<el-row>
<el-col :span="12" v-if="sessionTable !='cheliang'">
<el-form-item class="select" v-if="type!='info'" label="车辆信息" prop="cheliangId">
<el-select v-model="ruleForm.cheliangId" :disabled="ro.cheliangId" filterable placeholder="请选择车辆信息" @change="cheliangChange">
<el-option
v-for="(item,index) in cheliangOptions"
v-bind:key="item.id"
:label="item.cheliangName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="sessionTable !='cheliang' ">
<el-form-item class="input" v-if="type!='info'" label="车辆名称" prop="cheliangName">
<el-input v-model="cheliangForm.cheliangName"
placeholder="车辆名称" clearable readonly></el-input>
</el-form-item>
<div v-else>
<el-form-item class="input" label="车辆名称" prop="cheliangName">
<el-input v-model="ruleForm.cheliangName"
placeholder="车辆名称" readonly></el-input>
</el-form-item>
</div>
</el-col>
<el-col :span="12" v-if="sessionTable !='cheliang' ">
<el-form-item class="input" v-if="type!='info'" label="车辆类型" prop="cheliangValue">
<el-input v-model="cheliangForm.cheliangValue"
placeholder="车辆类型" clearable readonly></el-input>
</el-form-item>
<div v-else>
<el-form-item class="input" label="车辆类型" prop="cheliangValue">
<el-input v-model="ruleForm.cheliangValue"
placeholder="车辆类型" readonly></el-input>
</el-form-item>
</div>
</el-col>
<el-col :span="12" v-if="sessionTable !='yonghu'">
<el-form-item class="select" v-if="type!='info'" label="用户" prop="yonghuId">
<el-select v-model="ruleForm.yonghuId" :disabled="ro.yonghuId" filterable placeholder="请选择用户" @change="yonghuChange">
<el-option
v-for="(item,index) in yonghuOptions"
v-bind:key="item.id"
:label="item.yonghuName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="sessionTable !='yonghu' ">
<el-form-item class="input" v-if="type!='info'" label="用户姓名" prop="yonghuName">
<el-input v-model="yonghuForm.yonghuName"
placeholder="用户姓名" clearable readonly></el-input>
</el-form-item>
<div v-else>
<el-form-item class="input" label="用户姓名" prop="yonghuName">
<el-input v-model="ruleForm.yonghuName"
placeholder="用户姓名" readonly></el-input>
</el-form-item>
</div>
</el-col>
<el-col :span="12" v-if="sessionTable !='yonghu' ">
<el-form-item class="upload" v-if="type!='info' && !ro.yonghuPhoto" label="头像" prop="yonghuPhoto">
<img style="margin-right:20px;" v-bind:key="index" v-for="(item,index) in (yonghuForm.yonghuPhoto || '').split(',')" :src="item" width="100" height="100">
</el-form-item>
<div v-else>
<el-form-item v-if="ruleForm.yonghuPhoto" label="头像" prop="yonghuPhoto">
<img style="margin-right:20px;" v-bind:key="index" v-for="(item,index) in (ruleForm.yonghuPhoto || '').split(',')" :src="item" width="100" height="100">
</el-form-item>
</div>
</el-col>
<el-col :span="12" v-if="sessionTable !='yonghu' ">
<el-form-item class="input" v-if="type!='info'" label="联系方式" prop="yonghuPhone">
<el-input v-model="yonghuForm.yonghuPhone"
placeholder="联系方式" clearable readonly></el-input>
</el-form-item>
<div v-else>
<el-form-item class="input" label="联系方式" prop="yonghuPhone">
<el-input v-model="ruleForm.yonghuPhone"
placeholder="联系方式" readonly></el-input>
</el-form-item>
</div>
</el-col>
<input id="updateId" name="id" type="hidden">
<input id="cheliangId" name="cheliangId" type="hidden">
<input id="yonghuId" name="yonghuId" type="hidden">
<el-col :span="12">
<el-form-item class="select" v-if="type!='info'" label="申请类型" prop="paizhaohuanbuTypes">
<el-select v-model="ruleForm.paizhaohuanbuTypes" :disabled="ro.paizhaohuanbuTypes" placeholder="请选择申请类型">
<el-option
v-for="(item,index) in paizhaohuanbuTypesOptions"
v-bind:key="item.codeIndex"
:label="item.indexName"
:value="item.codeIndex">
</el-option>
</el-select>
</el-form-item>
<div v-else>
<el-form-item class="input" label="申请类型" prop="paizhaohuanbuValue">
<el-input v-model="ruleForm.paizhaohuanbuValue"
placeholder="申请类型" readonly></el-input>
</el-form-item>
</div>
</el-col>
<el-col :span="12">
<el-form-item class="input" v-if="type!='info'" label="牌照" prop="paizhaohuanbuPaizhao">
<el-input v-model="ruleForm.paizhaohuanbuPaizhao"
placeholder="牌照" clearable :readonly="ro.paizhaohuanbuPaizhao"></el-input>
</el-form-item>
<div v-else>
<el-form-item class="input" label="牌照" prop="paizhaohuanbuPaizhao">
<el-input v-model="ruleForm.paizhaohuanbuPaizhao"
placeholder="牌照" readonly></el-input>
</el-form-item>
</div>
</el-col>
<el-col :span="12" v-if="type=='info'">
<div>
<el-form-item v-if="ruleForm.paizhaohuanbuYesnoTypes" label="申请状态" prop="paizhaohuanbuYesnoTypes">
<el-input v-model="ruleForm.paizhaohuanbuYesnoValue" placeholder="申请状态" readonly></el-input>
</el-form-item>
</div>
</el-col>
<el-col :span="12" v-if="type=='info'">
<div>
<el-form-item v-if="ruleForm.paizhaohuanbuYesnoText" label="申请结果" prop="paizhaohuanbuYesnoText">
<span v-html="ruleForm.paizhaohuanbuYesnoText"></span>
</el-form-item>
</div>
</el-col>
</el-row>
<el-form-item class="btn">
<el-button v-if="type!='info'" type="primary" class="btn-success" @click="onSubmit">提交</el-button>
<el-button v-if="type!='info'" class="btn-close" @click="back()">取消</el-button>
<el-button v-if="type=='info'" class="btn-close" @click="back()">返回</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
import styleJs from "../../../utils/style.js";
// 数字,邮件,手机,url,身份证校验
import { isNumber,isIntNumer,isEmail,isPhone, isMobile,isURL,checkIdCard } from "@/utils/validate";
export default {
data() {
return {
addEditForm:null,
id: '',
type: '',
sessionTable : "",//登录账户所在表名
role : "",//权限
userId:"",//当前登录人的id
cheliangForm: {},
yonghuForm: {},
ro:{
cheliangId: false,
yonghuId: false,
paizhaohuanbuTypes: false,
paizhaohuanbuPaizhao: false,
paizhaohuanbuYesnoTypes: false,
paizhaohuanbuYesnoText: false,
},
ruleForm: {
cheliangId: '',
yonghuId: '',
paizhaohuanbuTypes: '',
paizhaohuanbuPaizhao: '',
paizhaohuanbuYesnoTypes: '',
paizhaohuanbuYesnoText: '',
},
paizhaohuanbuTypesOptions : [],
paizhaohuanbuYesnoTypesOptions : [],
cheliangOptions : [],
yonghuOptions : [],
rules: {
cheliangId: [
{ required: true, message: '车辆不能为空', trigger: 'blur' },
{ pattern: /^[1-9][0-9]*$/,
message: '只允许输入整数',
trigger: 'blur'
}
],
yonghuId: [
{ required: true, message: '用户不能为空', trigger: 'blur' },
{ pattern: /^[1-9][0-9]*$/,
message: '只允许输入整数',
trigger: 'blur'
}
],
paizhaohuanbuTypes: [
{ required: true, message: '申请类型不能为空', trigger: 'blur' },
{ pattern: /^[1-9][0-9]*$/,
message: '只允许输入整数',
trigger: 'blur'
}
],
paizhaohuanbuPaizhao: [
{ required: true, message: '牌照不能为空', trigger: 'blur' },
],
paizhaohuanbuYesnoTypes: [
{ required: true, message: '申请状态不能为空', trigger: 'blur' },
{ pattern: /^[1-9][0-9]*$/,
message: '只允许输入整数',
trigger: 'blur'
}
],
paizhaohuanbuYesnoText: [
{ required: true, message: '申请结果不能为空', trigger: 'blur' },
],
}
};
},
props: ["parent"],
computed: {
},
created() {
//获取当前登录用户的信息
this.sessionTable = this.$storage.get("sessionTable");
this.role = this.$storage.get("role");
this.userId = this.$storage.get("userId");
if (this.role != "管理员"){
}
this.addEditForm = styleJs.addStyle();
this.addEditStyleChange()
this.addEditUploadStyleChange()
//获取下拉框信息
this.$http({
url:`dictionary/page?page=1&limit=100&sort=&order=&dicCode=paizhaohuanbu_types`,
method: "get"
}).then(({ data }) => {
if (data && data.code === 0) {
this.paizhaohuanbuTypesOptions = data.data.list;
}
});
this.$http({
url:`dictionary/page?page=1&limit=100&sort=&order=&dicCode=paizhaohuanbu_yesno_types`,
method: "get"
}).then(({ data }) => {
if (data && data.code === 0) {
this.paizhaohuanbuYesnoTypesOptions = data.data.list;
}
});
this.$http({
url: `cheliang/page?page=1&limit=100`,
method: "get"
}).then(({ data }) => {
if (data && data.code === 0) {
this.cheliangOptions = data.data.list;
}
});
this.$http({
url: `yonghu/page?page=1&limit=100`,
method: "get"
}).then(({ data }) => {
if (data && data.code === 0) {
this.yonghuOptions = data.data.list;
}
});
},
mounted() {
},
methods: {
// 下载
download(file){
window.open(`${file}`)
},
// 初始化
init(id,type) {
if (id) {
this.id = id;
this.type = type;
}
if(this.type=='info'||this.type=='else'){
this.info(id);
}
// 获取用户信息
this.$http({
url:`${this.$storage.get("sessionTable")}/session`,
method: "get"
}).then(({ data }) => {
if (data && data.code === 0) {
var json = data.data;
} else {
this.$message.error(data.msg);
}
});
},
cheliangChange(id){
this.$http({
url: `cheliang/info/`+id,
method: "get"
}).then(({ data }) => {
if (data && data.code === 0) {
this.cheliangForm = data.data;
}
});
},
yonghuChange(id){
this.$http({
url: `yonghu/info/`+id,
method: "get"
}).then(({ data }) => {
if (data && data.code === 0) {
this.yonghuForm = data.data;
}
});
},
// 多级联动参数
info(id) {
let _this =this;
_this.$http({
url: `paizhaohuanbu/info/${id}`,
method: 'get'
}).then(({ data }) => {
if (data && data.code === 0) {
_this.ruleForm = data.data;
_this.cheliangChange(data.data.cheliangId)
_this.yonghuChange(data.data.yonghuId)
} else {
_this.$message.error(data.msg);
}
});
},
// 提交
onSubmit() {
this.$refs["ruleForm"].validate(valid => {
if (valid) {
this.$http({
url:`paizhaohuanbu/${!this.ruleForm.id ? "save" : "update"}`,
method: "post",
data: this.ruleForm
}).then(({ data }) => {
if (data && data.code === 0) {
this.$message({
message: "操作成功",
type: "success",
duration: 1500,
onClose: () => {
this.parent.showFlag = true;
this.parent.addOrUpdateFlag = false;
this.parent.paizhaohuanbuCrossAddOrUpdateFlag = false;
this.parent.search();
this.parent.contentStyleChange();
}
});
} else {
this.$message.error(data.msg);
}
});
}
});
},
// 获取uuid
getUUID () {
return new Date().getTime();
},
// 返回
back() {
this.parent.showFlag = true;
this.parent.addOrUpdateFlag = false;
this.parent.paizhaohuanbuCrossAddOrUpdateFlag = false;
this.parent.contentStyleChange();
},
//图片
addEditStyleChange() {
this.$nextTick(()=>{
// input
document.querySelectorAll('.addEdit-block .input .el-input__inner').forEach(el=>{
el.style.height = this.addEditForm.inputHeight
el.style.color = this.addEditForm.inputFontColor
el.style.fontSize = this.addEditForm.inputFontSize
el.style.borderWidth = this.addEditForm.inputBorderWidth
el.style.borderStyle = this.addEditForm.inputBorderStyle
el.style.borderColor = this.addEditForm.inputBorderColor
el.style.borderRadius = this.addEditForm.inputBorderRadius
el.style.backgroundColor = this.addEditForm.inputBgColor
})
document.querySelectorAll('.addEdit-block .input .el-form-item__label').forEach(el=>{
el.style.lineHeight = this.addEditForm.inputHeight
el.style.color = this.addEditForm.inputLableColor
el.style.fontSize = this.addEditForm.inputLableFontSize
})
// select
document.querySelectorAll('.addEdit-block .select .el-input__inner').forEach(el=>{
el.style.height = this.addEditForm.selectHeight
el.style.color = this.addEditForm.selectFontColor
el.style.fontSize = this.addEditForm.selectFontSize
el.style.borderWidth = this.addEditForm.selectBorderWidth
el.style.borderStyle = this.addEditForm.selectBorderStyle
el.style.borderColor = this.addEditForm.selectBorderColor
el.style.borderRadius = this.addEditForm.selectBorderRadius
el.style.backgroundColor = this.addEditForm.selectBgColor
})
document.querySelectorAll('.addEdit-block .select .el-form-item__label').forEach(el=>{
el.style.lineHeight = this.addEditForm.selectHeight
el.style.color = this.addEditForm.selectLableColor
el.style.fontSize = this.addEditForm.selectLableFontSize
})
document.querySelectorAll('.addEdit-block .select .el-select__caret').forEach(el=>{
el.style.color = this.addEditForm.selectIconFontColor
el.style.fontSize = this.addEditForm.selectIconFontSize
})
// date
document.querySelectorAll('.addEdit-block .date .el-input__inner').forEach(el=>{
el.style.height = this.addEditForm.dateHeight
el.style.color = this.addEditForm.dateFontColor
el.style.fontSize = this.addEditForm.dateFontSize
el.style.borderWidth = this.addEditForm.dateBorderWidth
el.style.borderStyle = this.addEditForm.dateBorderStyle
el.style.borderColor = this.addEditForm.dateBorderColor
el.style.borderRadius = this.addEditForm.dateBorderRadius
el.style.backgroundColor = this.addEditForm.dateBgColor
})
document.querySelectorAll('.addEdit-block .date .el-form-item__label').forEach(el=>{
el.style.lineHeight = this.addEditForm.dateHeight
el.style.color = this.addEditForm.dateLableColor
el.style.fontSize = this.addEditForm.dateLableFontSize
})
document.querySelectorAll('.addEdit-block .date .el-input__icon').forEach(el=>{
el.style.color = this.addEditForm.dateIconFontColor
el.style.fontSize = this.addEditForm.dateIconFontSize
el.style.lineHeight = this.addEditForm.dateHeight
})
// upload
let iconLineHeight = parseInt(this.addEditForm.uploadHeight) - parseInt(this.addEditForm.uploadBorderWidth) * 2 + 'px'
document.querySelectorAll('.addEdit-block .upload .el-upload--picture-card').forEach(el=>{
el.style.width = this.addEditForm.uploadHeight
el.style.height = this.addEditForm.uploadHeight
el.style.borderWidth = this.addEditForm.uploadBorderWidth
el.style.borderStyle = this.addEditForm.uploadBorderStyle
el.style.borderColor = this.addEditForm.uploadBorderColor
el.style.borderRadius = this.addEditForm.uploadBorderRadius
el.style.backgroundColor = this.addEditForm.uploadBgColor
})
document.querySelectorAll('.addEdit-block .upload .el-form-item__label').forEach(el=>{
el.style.lineHeight = this.addEditForm.uploadHeight
el.style.color = this.addEditForm.uploadLableColor
el.style.fontSize = this.addEditForm.uploadLableFontSize
})
document.querySelectorAll('.addEdit-block .upload .el-icon-plus').forEach(el=>{
el.style.color = this.addEditForm.uploadIconFontColor
el.style.fontSize = this.addEditForm.uploadIconFontSize
el.style.lineHeight = iconLineHeight
el.style.display = 'block'
})
// 多文本输入框
document.querySelectorAll('.addEdit-block .textarea .el-textarea__inner').forEach(el=>{
el.style.height = this.addEditForm.textareaHeight
el.style.color = this.addEditForm.textareaFontColor
el.style.fontSize = this.addEditForm.textareaFontSize
el.style.borderWidth = this.addEditForm.textareaBorderWidth
el.style.borderStyle = this.addEditForm.textareaBorderStyle
el.style.borderColor = this.addEditForm.textareaBorderColor
el.style.borderRadius = this.addEditForm.textareaBorderRadius
el.style.backgroundColor = this.addEditForm.textareaBgColor
})
document.querySelectorAll('.addEdit-block .textarea .el-form-item__label').forEach(el=>{
// el.style.lineHeight = this.addEditForm.textareaHeight
el.style.color = this.addEditForm.textareaLableColor
el.style.fontSize = this.addEditForm.textareaLableFontSize
})
// 保存
document.querySelectorAll('.addEdit-block .btn .btn-success').forEach(el=>{
el.style.width = this.addEditForm.btnSaveWidth
el.style.height = this.addEditForm.btnSaveHeight
el.style.color = this.addEditForm.btnSaveFontColor
el.style.fontSize = this.addEditForm.btnSaveFontSize
el.style.borderWidth = this.addEditForm.btnSaveBorderWidth
el.style.borderStyle = this.addEditForm.btnSaveBorderStyle
el.style.borderColor = this.addEditForm.btnSaveBorderColor
el.style.borderRadius = this.addEditForm.btnSaveBorderRadius
el.style.backgroundColor = this.addEditForm.btnSaveBgColor
})
// 返回
document.querySelectorAll('.addEdit-block .btn .btn-close').forEach(el=>{
el.style.width = this.addEditForm.btnCancelWidth
el.style.height = this.addEditForm.btnCancelHeight
el.style.color = this.addEditForm.btnCancelFontColor
el.style.fontSize = this.addEditForm.btnCancelFontSize
el.style.borderWidth = this.addEditForm.btnCancelBorderWidth
el.style.borderStyle = this.addEditForm.btnCancelBorderStyle
el.style.borderColor = this.addEditForm.btnCancelBorderColor
el.style.borderRadius = this.addEditForm.btnCancelBorderRadius
el.style.backgroundColor = this.addEditForm.btnCancelBgColor
})
})
},
addEditUploadStyleChange() {
this.$nextTick(()=>{
document.querySelectorAll('.addEdit-block .upload .el-upload-list--picture-card .el-upload-list__item').forEach(el=>{
el.style.width = this.addEditForm.uploadHeight
el.style.height = this.addEditForm.uploadHeight
el.style.borderWidth = this.addEditForm.uploadBorderWidth
el.style.borderStyle = this.addEditForm.uploadBorderStyle
el.style.borderColor = this.addEditForm.uploadBorderColor
el.style.borderRadius = this.addEditForm.uploadBorderRadius
el.style.backgroundColor = this.addEditForm.uploadBgColor
})
})
},
}
};
</script>
<style lang="scss">
editor{
height: 500px;
& /deep/ .ql-container {
height: 310px;
}
}
.amap-wrapper {
width: 100%;
height: 500px;
}
.search-box {
position: absolute;
}
.addEdit-block {
margin: -10px;
}
.detail-form-content {
padding: 12px;
}
.btn .el-button {
padding: 0;
}</style>