zhangliang2 2 лет назад
Родитель
Сommit
c6011e48f2

+ 14 - 1
src/api/systemManagement.js

@@ -34,6 +34,13 @@ const getSceneImporPagetList = basePart + '/sceneImport/getSceneImporPagetList'
 const saveSceneGeneralTemplateAll = basePart + '/SceneGeneralTemplate/saveSceneGeneralTemplateAll'; // 保存泛化场景-new
 const saveTask = basePart + '/sceneImport/saveTask'; // 保存3个真实场景
 
+// 车辆设置
+const getVehicleTempPageList = basePart + '/vehicleTemp/getVehicleTempPageList' // 列表查询
+const getVehicleTempInfo = basePart + '/vehicleTemp/getVehicleTempInfo' // 详情查询
+const saveVehicleTemp = basePart + '/vehicleTemp/saveVehicleTemp' // 新增修改
+const delVehicleTempById = basePart + '/vehicleTemp/delVehicleTempById' // 删除
+const upload = basePart + '/file/upload' // 上传
+
 
 export default {
     getUserPageList,
@@ -62,5 +69,11 @@ export default {
 
     getSceneImporPagetList,
     saveSceneGeneralTemplateAll,
-    saveTask
+    saveTask,
+
+    getVehicleTempPageList,
+    getVehicleTempInfo,
+    saveVehicleTemp,
+    delVehicleTempById,
+    upload
 }

+ 5 - 1
src/components/upload/upload.vue

@@ -13,7 +13,7 @@
             :file-list="fileList"
             :limit="limit"
             :on-exceed="handleExceed"
-            multiple
+            :multiple="multiple"
         >
             <el-button size="small" type="primary">点击上传</el-button>
         </el-upload>
@@ -44,6 +44,10 @@ export default {
             type: Boolean,
             default: false,
         },
+        multiple: {
+            type: Boolean,
+            default: true,
+        },
         // 上传url
         uploadUrl: {
             type: String,

+ 18 - 0
src/router/systemManagement.js

@@ -115,6 +115,24 @@ export default [{
         },
         component: () => import("@/views/systemManagement/sceneUploadList")
     },
+    {
+        path: "/vehicleModelManagement",
+        name: "vehicleModelManagement",
+        meta: {
+            tabname: "车辆设置列表",
+            menuKind: "vehicleModelManagement"
+        },
+        component: () => import("@/views/systemManagement/vehicleModelManagement")
+    },
+    {
+        path: "/vehicleModelDetail",
+        name: "vehicleModelDetail",
+        meta: {
+            tabname: "车辆设置详情",
+            menuKind: "vehicleModelDetail"
+        },
+        component: () => import("@/views/systemManagement/vehicleModelDetail")
+    },
     {
         path: "/reportTemplateManagement",
         name: "reportTemplateManagement",

+ 13 - 47
src/views/modelLibrary/vehicleModel.vue

@@ -41,59 +41,24 @@
                             maxlength="200"
                         ></el-input>
                     </el-form-item>
-                    <el-form-item label="车辆模型:" prop="modelLabel">
+                    <el-form-item label="车辆模型:" prop="vehicleType">
                         <el-cascader
                             ref="cascader"
-                            v-model="form.modelLabel"
+                            v-model="form.vehicleType"
                             :options="modelLabelList"
                             :props="props"
                             @change="modelLabelChange"
                         ></el-cascader>
                     </el-form-item>
-                    <!-- <el-form-item label="车辆类型:" prop="vehicleType">
-                        <el-select v-model="form.vehicleType">
-                            <el-option
-                                v-for="item in vehicleTypeList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </el-form-item> -->
-                    <!-- <el-form-item label="车辆型号:" prop="vehicleModel">
-                        <el-input
-                            placeholder="请输入"
-                            maxlength="60"
-                            v-autoTrim="{ obj: form, key: 'vehicleModel' }"
-                            v-model="form.vehicleModel"
-                        >
-                        </el-input>
-                        <el-select v-model="form.vehicleModel" disabled>
-                            <el-option
-                                v-for="item in vehicleModelList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </el-form-item> -->
-                    <!-- <el-form-item label="车辆颜色:" prop="vehicleColour">
+                    <el-form-item label="车辆模型标识:" prop="modelLabel">
                         <el-input
                             placeholder="请输入"
-                            maxlength="60"
-                            v-autoTrim="{ obj: form, key: 'vehicleColour' }"
-                            v-model="form.vehicleColour"
+                            v-autoTrim="{ obj: form, key: 'modelLabel' }"
+                            v-model="form.modelLabel"
+                            disabled
                         >
                         </el-input>
-                        <el-select v-model="form.vehicleColour" disabled>
-                            <el-option
-                                v-for="item in vehicleColourList"
-                                :label="item.caption"
-                                :value="item.code"
-                                :key="item.code"
-                            ></el-option>
-                        </el-select>
-                    </el-form-item> -->
+                    </el-form-item>
                 </div>
 
                 <div class="titlePanel">
@@ -363,7 +328,8 @@ export default {
                 // vehicleType: "", // 车辆类型
                 // vehicleModel: "", // 车辆型号
                 // vehicleColour: "", // 车辆颜色
-                modelLabel: [], // 车辆模型
+                vehicleType: [], // 车辆模型
+                modelLabel: "", // 车辆模型标识
                 maxSpeed: "", // 最大速度
                 enginePower: "", // 发动机功率
                 maxDeceleration: "", // 最大减速度
@@ -404,6 +370,9 @@ export default {
                 // vehicleColour: [
                 //     { required: true, message: "请输入", trigger: "blur" },
                 // ],
+                modelLabel: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                ],
                 maxSpeed: [
                     { required: true, message: "请输入", trigger: "blur" },
                     {
@@ -547,13 +516,10 @@ export default {
                         trigger: ["blur"],
                     },
                 ],
-                // vehicleType: [
-                //     { required: true, message: "请选择", trigger: "change" },
-                // ],
                 wheelDrive: [
                     { required: true, message: "请选择", trigger: "change" },
                 ],
-                modelLabel: [
+                vehicleType: [
                     { required: true, message: "请选择", trigger: "change" },
                 ],
             },

+ 275 - 0
src/views/systemManagement/components/uploadVM.vue

@@ -0,0 +1,275 @@
+<template>
+    <div>
+        <el-upload
+            class="avatar-uploader"
+            ref="upload"
+            action=""
+            :before-upload="beforeUpload"
+            :on-change="handleChange"
+            :on-remove="handleRemove"
+            :on-preview="preview"
+            :on-success="success"
+            :on-error="error"
+            :http-request="toUpload"
+            :auto-upload="true"
+            :show-file-list="false"
+            :file-list="fileList"
+            :limit="limit"
+            :on-exceed="handleExceed"
+            :multiple="multiple"
+        >
+            <img v-if="imageUrl" :src="imageUrl" class="avatar" />
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+            <!-- <el-button size="small" type="primary">点击上传</el-button> -->
+        </el-upload>
+        <!--        <el-button @click="download">下载</el-button>-->
+    </div>
+</template>
+
+<script>
+export default {
+    name: "upload",
+    props: {
+        // 限制上传的个数
+        limit: {
+            type: Number,
+            default: 100,
+        },
+        // 一组文件传相同的值,保证其为一组
+        objectPath: {
+            type: String,
+            default: "1",
+        },
+        type: {
+            type: String,
+            default: "1",
+        },
+        model: {
+            type: String,
+            default: "",
+        },
+        // 是否需要处理大文件上传
+        needInstance: {
+            type: Boolean,
+            default: false,
+        },
+        multiple: {
+            type: Boolean,
+            default: true,
+        },
+        // 上传url
+        uploadUrl: {
+            type: String,
+            default: "",
+        },
+    },
+    data() {
+        return {
+            fileList: [],
+            attachmentList: [],
+            defaultParam: {},
+            imageUrl: "",
+        };
+    },
+    methods: {
+        beforeUpload(file) {
+            // .jpg,.jpeg,.png,.gif,.bmp,.JPG,.JPEG,.PNG,.GIF,.BMP
+            let arr = ["jpg", "jpeg", "png", "gif", "bmp"];
+            let i = file.name.lastIndexOf(".");
+            if (!arr.includes(file.name.slice(i + 1))) {
+                this.$message.warning("请上传图片");
+                return false;
+            }
+        },
+        handleChange(file, fileList) {
+            this.fileList = fileList;
+        },
+        handleExceed(files, fileList) {
+            this.$message.warning(
+                `当前限制选择 ${this.limit} 个文件,本次选择了 ${
+                    files.length
+                } 个文件,共选择了 ${files.length + fileList.length} 个文件`
+            );
+        },
+        async handleRemove(file, fileList) {
+            let md5 = "";
+            if (file.raw) {
+                await this.$md5(file.raw).then((res) => {
+                    md5 = res;
+                });
+            } else {
+                md5 = file.md5;
+            }
+
+            let removeIndex = "";
+            this.attachmentList.forEach((item, index) => {
+                if (md5 === item.md5) {
+                    removeIndex = index;
+                }
+            });
+
+            // if (removeIndex < 0) {
+            //     this.$message.error("删除失败");
+            // }
+
+            this.attachmentList.splice(removeIndex, 1);
+            this.$emit("attachmentChange", this.attachmentList);
+        },
+        async toUpload(file) {
+            let _this = this;
+
+            return new Promise(async (resolve, reject) => {
+                let formData = new FormData();
+                await formData.append("name", file.file.name);
+                // await formData.append('type', _this.defaultParam.md5)
+                await formData.append("type", this.type);
+                await formData.append("objectPath", this.objectPath);
+                // await formData.append("md5", _this.defaultParam.md5);
+                await formData.append("file", file.file);
+
+                let axios = this.$axios;
+                // 处理大文件上传 instance已被设置不携带token
+                // if (this.needInstance) {
+                //     axios = this.$instance;
+                // }
+
+                // 上传前进行通知
+                this.$emit("willUpload");
+
+                /* let url = this.uploadUrl;
+                let defaultParam = {};
+                if (!url) {
+                    url = this.$api.common.uploadWj;
+                    // 获取MD5值
+                    await this.$md5(file.file).then((res) => {
+                        defaultParam = {
+                            // file: file.file,
+                            md5: res,
+                        };
+                    });
+                } */
+
+                let url = this.$api.systemManagement.upload;
+                // let defaultParam = {};
+                // // 获取MD5值
+                // await this.$md5(file.file).then((res) => {
+                //     defaultParam = {
+                //         // file: file.file,
+                //         md5: res,
+                //     };
+                // });
+
+                await axios({
+                    method: "post",
+                    url,
+                    data: formData,
+                    withCredentials: true,
+                    headers: {
+                        "Content-type": "multipart/form-data",
+                    },
+                })
+                    .then((res) => {
+                        if (res.code == 200 && res.info) {
+                            this.attachmentList.push({
+                                // attachmentName: file.file.name,
+                                // attachmentAddress: res.params,
+                                // md5: defaultParam.md5 || "",
+                                // uid: file.file.uid,
+                                fileType: file.file.type,
+                                fileName: res.info.fileName,
+                                // videoPreview: res.info.videoPreview,
+                            });
+                            resolve("成功");
+                            this.imageUrl = res.info.previewUrl;
+                            this.$emit(
+                                "attachmentChange",
+                                res.info.fileName,
+                                this.model
+                            );
+                            // 上传完成后进行通知
+                            this.$emit("didUpload", "success");
+                        } else {
+                            this.$message.error(res.message || "上传失败");
+                            this.$emit("didUpload", "fail");
+                            reject("失败");
+                        }
+                    })
+                    .catch((err) => {
+                        this.$emit("didUpload", "error");
+                        reject(err);
+                    });
+            });
+        },
+        success(response, file, fileList) {
+            this.$message.success("上传成功 ");
+        },
+        error(response, file, fileList) {
+            this.$message.warning("上传失败");
+        },
+        preview(file) {
+            return false;
+            console.log(file);
+            console.log(this.attachmentList);
+            let item = this.attachmentList.find((item) =>
+                item.fileName.endsWith(file.name)
+            );
+            this.download(item.fileName, item.attachmentName);
+        },
+        download(downPath, downName) {
+            this.$axios({
+                method: "post",
+                url: this.$api.common.download,
+                responseType: "blob",
+                data: {
+                    objectName: downPath,
+                },
+            }).then((res) => {
+                const blob = new Blob([res]); //构造一个blob对象来处理数据
+                const fileName = downName;
+                //对于<a>标签,只有 Firefox 和 Chrome(内核) 支持 download 属性
+                //IE10以上支持blob但是依然不支持download
+                if ("download" in document.createElement("a")) {
+                    //支持a标签download的浏览器
+                    const link = document.createElement("a"); //创建a标签
+                    link.download = fileName; //a标签添加属性
+                    link.style.display = "none";
+                    link.href = URL.createObjectURL(blob);
+                    document.body.appendChild(link);
+                    link.click(); //执行下载
+                    URL.revokeObjectURL(link.href); //释放url
+                    document.body.removeChild(link); //释放标签
+                } else {
+                    //其他浏览器
+                    navigator.msSaveBlob(blob, fileName);
+                }
+            });
+        },
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.avatar-uploader .el-upload {
+    border: 1px dashed #ccc;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+    border-color: #409eff;
+}
+.avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 200px;
+    min-height: 100px;
+    line-height: 100px;
+    text-align: center;
+}
+.avatar {
+    width: 200px;
+    min-height: 100px;
+    display: block;
+}
+</style>

+ 607 - 0
src/views/systemManagement/vehicleModelDetail.vue

@@ -0,0 +1,607 @@
+<template>
+    <div>
+        <el-form ref="form" :model="form" :rules="rules" label-width="160px">
+            <div class="flexBox">
+                <el-form-item label="车辆模型标识:" prop="modelLabel">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="100"
+                        v-autoTrim="{ obj: form, key: 'modelLabel' }"
+                        v-model="form.modelLabel"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车辆类型:" prop="vehicleType">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="100"
+                        v-autoTrim="{ obj: form, key: 'vehicleType' }"
+                        v-model="form.vehicleType"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车辆型号:" prop="vehicleModel">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="100"
+                        v-autoTrim="{ obj: form, key: 'vehicleModel' }"
+                        v-model="form.vehicleModel"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车辆颜色:" prop="vehicleColour">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="100"
+                        v-autoTrim="{ obj: form, key: 'vehicleColour' }"
+                        v-model="form.vehicleColour"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanel">
+                <div class="titlePanelBor">控制参数</div>
+            </div>
+            <div class="flexBox">
+                <el-form-item label="最大速度(km/h):" prop="maxSpeed">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'maxSpeed' }"
+                        v-model="form.maxSpeed"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="发动机功率(kW):" prop="enginePower">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'enginePower' }"
+                        v-model="form.enginePower"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="最大减速度(m/s²):" prop="maxDeceleration">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'maxDeceleration' }"
+                        v-model="form.maxDeceleration"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="最大转向角度(deg):"
+                    prop="maxSteeringAngle"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'maxSteeringAngle' }"
+                        v-model="form.maxSteeringAngle"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="驱动方式:" prop="wheelDrive">
+                    <el-select v-model="form.wheelDrive">
+                        <el-option
+                            v-for="item in wheelDriveList"
+                            :label="item.caption"
+                            :value="item.code"
+                            :key="item.code"
+                        ></el-option>
+                    </el-select>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanel">
+                <div class="titlePanelBor">效率参数</div>
+            </div>
+            <div class="flexBox">
+                <el-form-item label="总效率:" prop="overallEfficiency">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="9"
+                        v-autoTrim="{ obj: form, key: 'overallEfficiency' }"
+                        v-model="form.overallEfficiency"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="前表面有效面积(㎡):"
+                    prop="frontSurfaceEffective"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'frontSurfaceEffective',
+                        }"
+                        v-model="form.frontSurfaceEffective"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="空气阻力系数:" prop="airDragCoefficient">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="9"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'airDragCoefficient',
+                        }"
+                        v-model="form.airDragCoefficient"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item
+                    label="滚动阻力系数:"
+                    prop="rollingResistanceCoefficient"
+                >
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="9"
+                        v-autoTrim="{
+                            obj: form,
+                            key: 'rollingResistanceCoefficient',
+                        }"
+                        v-model="form.rollingResistanceCoefficient"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanel">
+                <div class="titlePanelBor">几何参数</div>
+            </div>
+            <div class="flexBox">
+                <el-form-item label="车轮直径(m):" prop="wheelDiameter">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'wheelDiameter' }"
+                        v-model="form.wheelDiameter"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车前距(m):" prop="frontDistance">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'frontDistance' }"
+                        v-model="form.frontDistance"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车后距(m):" prop="rearDistance">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'rearDistance' }"
+                        v-model="form.rearDistance"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车左距(m):" prop="leftDistance">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'leftDistance' }"
+                        v-model="form.leftDistance"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车右距(m):" prop="rightDistance">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'rightDistance' }"
+                        v-model="form.rightDistance"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="车高(m):" prop="heightDistance">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'heightDistance' }"
+                        v-model="form.heightDistance"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="轴距(m):" prop="wheelbase">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'wheelbase' }"
+                        v-model="form.wheelbase"
+                    >
+                    </el-input>
+                </el-form-item>
+                <el-form-item label="质量(kg):" prop="mass">
+                    <el-input
+                        placeholder="请输入"
+                        maxlength="12"
+                        v-autoTrim="{ obj: form, key: 'mass' }"
+                        v-model="form.mass"
+                    >
+                    </el-input>
+                </el-form-item>
+            </div>
+
+            <div class="titlePanel">
+                <div class="titlePanelBor">视图</div>
+            </div>
+            <div class="tipBox flexBox">
+                <div class="tip">侧视图</div>
+                <div class="tip">俯视图</div>
+            </div>
+            <div class="modelBox flexBox">
+                <div class="uploadBox flexBox">
+                    <upload
+                        ref="uploadA"
+                        :multiple="false"
+                        type="vehicleImg"
+                        model="top"
+                        @attachmentChange="attachmentChange"
+                    ></upload>
+                </div>
+                <div class="uploadBox flexBox">
+                    <upload
+                        ref="uploadB"
+                        :multiple="false"
+                        type="vehicleImg"
+                        model="front"
+                        @attachmentChange="attachmentChange"
+                    ></upload>
+                </div>
+            </div>
+        </el-form>
+
+        <div class="btns">
+            <el-button type="primary" @click="save">确定</el-button>
+            <el-button type="primary" plain @click="cancel">取消</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import upload from "./components/uploadVM";
+import { mapState } from "vuex";
+
+export default {
+    name: "vehicleModelDetail", // 车辆设置详情
+    components: { upload },
+    data() {
+        // 校验非负且最多4位小数
+        let validateNum = (rule, value, callback) => {
+            !/^(0|[1-9][0-9]*)(\.\d{1,4})?$/.test(value) &&
+                callback(new Error(rule.message));
+            callback();
+        };
+        // 校验不大于1
+        let validateNoMore1 = (rule, value, callback) => {
+            if (value > 1) {
+                callback(new Error(rule.message));
+                return;
+            }
+            callback();
+        };
+
+        return {
+            form: {
+                modelLabel: "", // 车辆模型标识
+                vehicleType: "", // 车辆类型
+                vehicleModel: "", // 车辆型号
+                vehicleColour: "", // 车辆颜色
+                maxSpeed: "", // 最大速度
+                enginePower: "", // 发动机功率
+                maxDeceleration: "", // 最大减速度
+                maxSteeringAngle: "", // 最大转角
+                wheelDrive: "", // 驱动方式
+                overallEfficiency: "", // 总效率
+                frontSurfaceEffective: "", // 前表面有效面积
+                airDragCoefficient: "", // 空气阻力系数
+                rollingResistanceCoefficient: "", // 滚动阻力系数
+                wheelDiameter: "", // 车轮直径
+                frontDistance: "", // 车前距
+                rearDistance: "", // 车后距
+                leftDistance: "", // 车左距
+                rightDistance: "", // 车右距
+                heightDistance: "", // 车高
+                wheelbase: "", // 轴距
+                mass: "", // 质量
+                id: "",
+                vehicleFrontView: "", // 对应的图片相对地址
+                vehicleTopView: "", // 对应的图片相对地址
+            },
+            wheelDriveList: [],
+            rules: {
+                modelLabel: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                ],
+                vehicleType: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                ],
+                vehicleModel: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                ],
+                vehicleColour: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                ],
+
+                maxSpeed: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                enginePower: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                maxDeceleration: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                maxSteeringAngle: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                overallEfficiency: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNoMore1,
+                        message: "请输入不大于1的非负数",
+                        trigger: ["blur"],
+                    },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontSurfaceEffective: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                airDragCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNoMore1,
+                        message: "请输入不大于1的非负数",
+                        trigger: ["blur"],
+                    },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rollingResistanceCoefficient: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNoMore1,
+                        message: "请输入不大于1的非负数",
+                        trigger: ["blur"],
+                    },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                wheelDiameter: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                frontDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rearDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                leftDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                rightDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                heightDistance: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                wheelbase: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                mass: [
+                    { required: true, message: "请输入", trigger: "blur" },
+                    {
+                        validator: validateNum,
+                        message: "请输入最多带有4位小数的非负数",
+                        trigger: ["blur"],
+                    },
+                ],
+                wheelDrive: [
+                    { required: true, message: "请选择", trigger: "change" },
+                ],
+            },
+        };
+    },
+
+    computed: {
+        ...mapState(["fileHost", "fileUrl"]),
+    },
+
+    methods: {
+        save() {
+            this.$refs.form.validate((valid) => {
+                if (valid) {
+                    if (
+                        !this.form.vehicleFrontView ||
+                        !this.form.vehicleTopView
+                    ) {
+                        this.$message.error("请先上传图片");
+                        return;
+                    }
+
+                    this.$axios({
+                        method: "post",
+                        url: this.$api.systemManagement.saveVehicleTemp,
+                        data: {
+                            ...this.form,
+                        },
+                    }).then((res) => {
+                        if (res.code == 200 && res.info) {
+                            this.$message.success("保存成功");
+                            this.cancel();
+                        } else {
+                            this.$message.error(res.message || "保存失败");
+                        }
+                    });
+                }
+            });
+        },
+        cancel() {
+            this.$router.push({ path: "/vehicleModelManagement" });
+        },
+        attachmentChange(fileName, model) {
+            if (model === "top") {
+                this.form.vehicleTopView = fileName;
+            } else {
+                this.form.vehicleFrontView = fileName;
+            }
+        },
+        getImgUrl(addr) {
+            let url = "";
+            if (process.env.VUE_APP_IS_DEV == "true") {
+                url = this.fileHost + this.fileUrl;
+            } else {
+                url = this.fileUrl;
+            }
+
+            let token = localStorage.getItem("Authorization").split(" ")[1];
+            let src = `${url}?objectName=${addr}&access_token=${token}`;
+            return src;
+        },
+    },
+
+    async mounted() {
+        await this.$dicsListsInit({
+            wheelDriveList: "driveType",
+        });
+
+        if (this.$route.query.id) {
+            this.$axios({
+                method: "post",
+                url: this.$api.systemManagement.getVehicleTempInfo,
+                data: { id: this.$route.query.id },
+            }).then((res) => {
+                if (res.code == 200 && res.info) {
+                    this.form = res.info;
+                    if (res.info.vehicleFrontView) {
+                        this.$refs.uploadA.imageUrl = this.getImgUrl(
+                            res.info.vehicleFrontView
+                        );
+                    }
+                    if (res.info.vehicleTopView) {
+                        this.$refs.uploadB.imageUrl = this.getImgUrl(
+                            res.info.vehicleTopView
+                        );
+                    }
+                } else {
+                    this.$message.error(res.message || "获取信息失败");
+                }
+            });
+        }
+    },
+};
+</script>
+
+<style lang='less' scoped>
+.el-form {
+    padding: 30px 10px;
+}
+
+.titlePanel {
+    padding: 22px 0;
+}
+
+.tipBox {
+    padding: 0 20px;
+
+    .tip {
+        text-align: center;
+        width: 50%;
+        padding-left: 10px;
+        font-size: 12px;
+    }
+}
+
+.modelBox {
+    padding: 20px;
+
+    .uploadBox {
+        align-items: center;
+        justify-content: center;
+        width: 50%;
+    }
+}
+
+.btns {
+    padding-top: 30px;
+    text-align: center;
+}
+</style>

+ 189 - 0
src/views/systemManagement/vehicleModelManagement.vue

@@ -0,0 +1,189 @@
+<template>
+    <div>
+        <search-layout :needBox="true">
+            <template slot="searchItem1">
+                <span class="label">车辆模型标识</span>
+                <el-input
+                    v-model="searchParams.modelLabel"
+                    size="small"
+                    clearable
+                    placeholder="请输入"
+                    maxlength="60"
+                    @keyup.enter.native="doSearch"
+                >
+                </el-input>
+            </template>
+            <template slot="searchItem2">
+                <span class="label">车辆类型</span>
+                <el-input
+                    v-model="searchParams.vehicleType"
+                    size="small"
+                    clearable
+                    placeholder="请输入"
+                    maxlength="60"
+                    @keyup.enter.native="doSearch"
+                >
+                </el-input>
+            </template>
+
+            <template slot="searchBtn1">
+                <el-button type="primary" @click="doSearch">查询</el-button>
+            </template>
+            <template slot="searchBtn2">
+                <el-button type="primary" @click="doReset">重置</el-button>
+            </template>
+        </search-layout>
+
+        <div class="btnsPanel">
+            <el-button
+                type="primary"
+                icon="el-icon-circle-plus-outline"
+                @click="addOne"
+                >创建</el-button
+            >
+        </div>
+
+        <tableList
+            ref="table"
+            style="margin: 0 30px"
+            :columns="columns"
+            :getDataWay="getDataWay"
+            :pagination="pagination"
+            index
+        >
+            <el-table-column label="操作" slot="cgInfos" align="center">
+                <template v-slot="scope">
+                    <i
+                        @click="editRow(scope.row.id)"
+                        class="el-icon-edit-outline elIcon"
+                        title="编辑"
+                    ></i>
+                    <i
+                        @click="delRow(scope.row.id)"
+                        class="el-icon-delete elIcon"
+                        title="删除"
+                    ></i>
+                </template>
+            </el-table-column>
+        </tableList>
+    </div>
+</template>
+
+<script>
+import searchLayout from "@/components/grid/searchLayout";
+import tableList from "@/components/grid/TableList";
+
+export default {
+    name: "vehicleModelManagement", // 车辆设置列表
+    components: { searchLayout, tableList },
+    data() {
+        return {
+            searchParams: {
+                //搜索参数
+                modelLabel: "", // 车辆模型标识
+                vehicleType: "", // 车辆类型
+            },
+            columns: [
+                {
+                    label: "车辆模型标识",
+                    prop: "modelLabel",
+                },
+                {
+                    label: "车辆类型",
+                    prop: "vehicleType",
+                },
+                {
+                    label: "车辆型号",
+                    prop: "vehicleModel",
+                },
+                {
+                    label: "车辆颜色",
+                    prop: "vehicleColour",
+                },
+                {
+                    label: "创建时间",
+                    prop: "createTime",
+                },
+                {
+                    label: "操作",
+                    prop: "cgInfos",
+                    template: true,
+                },
+            ],
+            pagination: {
+                //分页使用
+                currentPage: 1,
+                pageSize: 10,
+                position: "right",
+                pageSizes: [10, 30, 50, 100, 200],
+                layout: "sizes, total, prev, pager, next, jumper",
+            },
+            getDataWay: {
+                //加载表格数据
+                dataType: "url",
+                type: "post",
+                // firstRequest: false,
+                data: this.$api.systemManagement.getVehicleTempPageList,
+                param: {},
+            },
+        };
+    },
+
+    methods: {
+        doSearch() {
+            this.refreshList(this.searchParams);
+        },
+        //刷新table
+        refreshList(param) {
+            param
+                ? this.$refs["table"].loadData(param)
+                : this.$refs["table"].loadData();
+        },
+        doReset() {
+            this.searchParams = {
+                modelLabel: "",
+                vehicleType: "",
+            };
+            this.doSearch();
+        },
+        addOne() {
+            this.$router.push({ path: "/vehicleModelDetail" });
+        },
+        editRow(id) {
+            this.$router.push({
+                path: "/vehicleModelDetail",
+                query: { id },
+            });
+        },
+        delRow(id) {
+            this.$confirm("确认是否删除?", "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+            }).then(() => {
+                this.$axios({
+                    method: "post",
+                    url: this.$api.systemManagement.delVehicleTempById,
+                    data: { id },
+                }).then((res) => {
+                    if (res.code == 200) {
+                        this.$message.success("删除成功");
+                    } else {
+                        this.$message.error(res.message || "删除失败");
+                    }
+                    this.doSearch();
+                });
+            });
+        },
+    },
+
+    mounted() {},
+};
+</script>
+
+<style lang='less' scoped>
+.btnsPanel {
+    margin: 45px 40px 15px;
+    text-align: right;
+}
+</style>