vehicleModelDetail.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. <template>
  2. <div>
  3. <el-form ref="form" :model="form" :rules="rules" label-width="160px">
  4. <div class="flexBox">
  5. <el-form-item label="车辆模型标识:" prop="modelLabel">
  6. <el-input
  7. placeholder="请输入"
  8. maxlength="100"
  9. v-autoTrim="{ obj: form, key: 'modelLabel' }"
  10. v-model="form.modelLabel"
  11. >
  12. </el-input>
  13. </el-form-item>
  14. <el-form-item label="车辆类型:" prop="vehicleType">
  15. <el-input
  16. placeholder="请输入"
  17. maxlength="100"
  18. v-autoTrim="{ obj: form, key: 'vehicleType' }"
  19. v-model="form.vehicleType"
  20. >
  21. </el-input>
  22. </el-form-item>
  23. <el-form-item label="车辆型号:" prop="vehicleModel">
  24. <el-input
  25. placeholder="请输入"
  26. maxlength="100"
  27. v-autoTrim="{ obj: form, key: 'vehicleModel' }"
  28. v-model="form.vehicleModel"
  29. >
  30. </el-input>
  31. </el-form-item>
  32. <el-form-item label="车辆颜色:" prop="vehicleColour">
  33. <el-input
  34. placeholder="请输入"
  35. maxlength="100"
  36. v-autoTrim="{ obj: form, key: 'vehicleColour' }"
  37. v-model="form.vehicleColour"
  38. >
  39. </el-input>
  40. </el-form-item>
  41. <el-form-item label="序号:" prop="sort">
  42. <el-input
  43. placeholder="请输入"
  44. maxlength="10"
  45. v-autoTrim="{ obj: form, key: 'sort' }"
  46. v-model="form.sort"
  47. >
  48. </el-input>
  49. </el-form-item>
  50. <el-form-item label="是否有效:" prop="valid">
  51. <el-select v-model="form.valid">
  52. <el-option
  53. v-for="item in validList"
  54. :label="item.caption"
  55. :value="item.code"
  56. :key="item.code"
  57. ></el-option>
  58. </el-select>
  59. </el-form-item>
  60. </div>
  61. <div class="titlePanel">
  62. <div class="titlePanelBor">控制参数</div>
  63. </div>
  64. <div class="flexBox">
  65. <el-form-item label="最大速度(km/h):" prop="maxSpeed">
  66. <el-input
  67. placeholder="请输入"
  68. maxlength="12"
  69. v-autoTrim="{ obj: form, key: 'maxSpeed' }"
  70. v-model="form.maxSpeed"
  71. >
  72. </el-input>
  73. </el-form-item>
  74. <el-form-item label="发动机功率(kW):" prop="enginePower">
  75. <el-input
  76. placeholder="请输入"
  77. maxlength="12"
  78. v-autoTrim="{ obj: form, key: 'enginePower' }"
  79. v-model="form.enginePower"
  80. >
  81. </el-input>
  82. </el-form-item>
  83. <el-form-item label="最大减速度(m/s²):" prop="maxDeceleration">
  84. <el-input
  85. placeholder="请输入"
  86. maxlength="12"
  87. v-autoTrim="{ obj: form, key: 'maxDeceleration' }"
  88. v-model="form.maxDeceleration"
  89. >
  90. </el-input>
  91. </el-form-item>
  92. <el-form-item
  93. label="最大转向角度(deg):"
  94. prop="maxSteeringAngle"
  95. >
  96. <el-input
  97. placeholder="请输入"
  98. maxlength="12"
  99. v-autoTrim="{ obj: form, key: 'maxSteeringAngle' }"
  100. v-model="form.maxSteeringAngle"
  101. >
  102. </el-input>
  103. </el-form-item>
  104. <el-form-item label="驱动方式:" prop="wheelDrive">
  105. <el-select v-model="form.wheelDrive">
  106. <el-option
  107. v-for="item in wheelDriveList"
  108. :label="item.caption"
  109. :value="item.code"
  110. :key="item.code"
  111. ></el-option>
  112. </el-select>
  113. </el-form-item>
  114. </div>
  115. <div class="titlePanel">
  116. <div class="titlePanelBor">效率参数</div>
  117. </div>
  118. <div class="flexBox">
  119. <el-form-item label="总效率:" prop="overallEfficiency">
  120. <el-input
  121. placeholder="请输入"
  122. maxlength="9"
  123. v-autoTrim="{ obj: form, key: 'overallEfficiency' }"
  124. v-model="form.overallEfficiency"
  125. >
  126. </el-input>
  127. </el-form-item>
  128. <el-form-item
  129. label="前表面有效面积(㎡):"
  130. prop="frontSurfaceEffective"
  131. >
  132. <el-input
  133. placeholder="请输入"
  134. maxlength="12"
  135. v-autoTrim="{
  136. obj: form,
  137. key: 'frontSurfaceEffective',
  138. }"
  139. v-model="form.frontSurfaceEffective"
  140. >
  141. </el-input>
  142. </el-form-item>
  143. <el-form-item label="空气阻力系数:" prop="airDragCoefficient">
  144. <el-input
  145. placeholder="请输入"
  146. maxlength="9"
  147. v-autoTrim="{
  148. obj: form,
  149. key: 'airDragCoefficient',
  150. }"
  151. v-model="form.airDragCoefficient"
  152. >
  153. </el-input>
  154. </el-form-item>
  155. <el-form-item
  156. label="滚动阻力系数:"
  157. prop="rollingResistanceCoefficient"
  158. >
  159. <el-input
  160. placeholder="请输入"
  161. maxlength="9"
  162. v-autoTrim="{
  163. obj: form,
  164. key: 'rollingResistanceCoefficient',
  165. }"
  166. v-model="form.rollingResistanceCoefficient"
  167. >
  168. </el-input>
  169. </el-form-item>
  170. </div>
  171. <div class="titlePanel">
  172. <div class="titlePanelBor">几何参数</div>
  173. </div>
  174. <div class="flexBox">
  175. <el-form-item label="车轮直径(m):" prop="wheelDiameter">
  176. <el-input
  177. placeholder="请输入"
  178. maxlength="12"
  179. v-autoTrim="{ obj: form, key: 'wheelDiameter' }"
  180. v-model="form.wheelDiameter"
  181. >
  182. </el-input>
  183. </el-form-item>
  184. <el-form-item label="车前距(m):" prop="frontDistance">
  185. <el-input
  186. placeholder="请输入"
  187. maxlength="12"
  188. v-autoTrim="{ obj: form, key: 'frontDistance' }"
  189. v-model="form.frontDistance"
  190. >
  191. </el-input>
  192. </el-form-item>
  193. <el-form-item label="车后距(m):" prop="rearDistance">
  194. <el-input
  195. placeholder="请输入"
  196. maxlength="12"
  197. v-autoTrim="{ obj: form, key: 'rearDistance' }"
  198. v-model="form.rearDistance"
  199. >
  200. </el-input>
  201. </el-form-item>
  202. <el-form-item label="车左距(m):" prop="leftDistance">
  203. <el-input
  204. placeholder="请输入"
  205. maxlength="12"
  206. v-autoTrim="{ obj: form, key: 'leftDistance' }"
  207. v-model="form.leftDistance"
  208. >
  209. </el-input>
  210. </el-form-item>
  211. <el-form-item label="车右距(m):" prop="rightDistance">
  212. <el-input
  213. placeholder="请输入"
  214. maxlength="12"
  215. v-autoTrim="{ obj: form, key: 'rightDistance' }"
  216. v-model="form.rightDistance"
  217. >
  218. </el-input>
  219. </el-form-item>
  220. <el-form-item label="车高(m):" prop="heightDistance">
  221. <el-input
  222. placeholder="请输入"
  223. maxlength="12"
  224. v-autoTrim="{ obj: form, key: 'heightDistance' }"
  225. v-model="form.heightDistance"
  226. >
  227. </el-input>
  228. </el-form-item>
  229. <el-form-item label="轴距(m):" prop="wheelbase">
  230. <el-input
  231. placeholder="请输入"
  232. maxlength="12"
  233. v-autoTrim="{ obj: form, key: 'wheelbase' }"
  234. v-model="form.wheelbase"
  235. >
  236. </el-input>
  237. </el-form-item>
  238. <el-form-item label="质量(kg):" prop="mass">
  239. <el-input
  240. placeholder="请输入"
  241. maxlength="12"
  242. v-autoTrim="{ obj: form, key: 'mass' }"
  243. v-model="form.mass"
  244. >
  245. </el-input>
  246. </el-form-item>
  247. </div>
  248. <div class="titlePanel">
  249. <div class="titlePanelBor">视图</div>
  250. </div>
  251. <div class="tipBox flexBox">
  252. <div class="tip">侧视图</div>
  253. <div class="tip">俯视图</div>
  254. </div>
  255. <div class="modelBox flexBox">
  256. <div class="uploadBox flexBox">
  257. <upload
  258. ref="uploadA"
  259. :multiple="false"
  260. type="vehicleImg"
  261. model="front"
  262. @attachmentChange="attachmentChange"
  263. ></upload>
  264. </div>
  265. <div class="uploadBox flexBox">
  266. <upload
  267. ref="uploadB"
  268. :multiple="false"
  269. type="vehicleImg"
  270. model="top"
  271. @attachmentChange="attachmentChange"
  272. ></upload>
  273. </div>
  274. </div>
  275. </el-form>
  276. <div class="btns">
  277. <el-button type="primary" @click="save">确定</el-button>
  278. <el-button type="primary" plain @click="cancel">取消</el-button>
  279. </div>
  280. </div>
  281. </template>
  282. <script>
  283. import upload from "./components/uploadVM";
  284. import { mapState } from "vuex";
  285. export default {
  286. name: "vehicleModelDetail", // 车辆设置详情
  287. components: { upload },
  288. data() {
  289. // 校验非负且最多4位小数
  290. let validateNum = (rule, value, callback) => {
  291. !/^(0|[1-9][0-9]*)(\.\d{1,4})?$/.test(value) &&
  292. callback(new Error(rule.message));
  293. callback();
  294. };
  295. // 校验不大于1
  296. let validateNoMore1 = (rule, value, callback) => {
  297. if (value > 1) {
  298. callback(new Error(rule.message));
  299. return;
  300. }
  301. callback();
  302. };
  303. return {
  304. form: {
  305. modelLabel: "", // 车辆模型标识
  306. vehicleType: "", // 车辆类型
  307. vehicleModel: "", // 车辆型号
  308. vehicleColour: "", // 车辆颜色
  309. sort: "", // 序号
  310. valid: "", // 是否有效
  311. maxSpeed: "", // 最大速度
  312. enginePower: "", // 发动机功率
  313. maxDeceleration: "", // 最大减速度
  314. maxSteeringAngle: "", // 最大转角
  315. wheelDrive: "", // 驱动方式
  316. overallEfficiency: "", // 总效率
  317. frontSurfaceEffective: "", // 前表面有效面积
  318. airDragCoefficient: "", // 空气阻力系数
  319. rollingResistanceCoefficient: "", // 滚动阻力系数
  320. wheelDiameter: "", // 车轮直径
  321. frontDistance: "", // 车前距
  322. rearDistance: "", // 车后距
  323. leftDistance: "", // 车左距
  324. rightDistance: "", // 车右距
  325. heightDistance: "", // 车高
  326. wheelbase: "", // 轴距
  327. mass: "", // 质量
  328. id: "",
  329. vehicleFrontView: "", // 对应的图片相对地址
  330. vehicleTopView: "", // 对应的图片相对地址
  331. },
  332. wheelDriveList: [],
  333. validList: [
  334. {
  335. code: "0",
  336. caption: "无效",
  337. },
  338. {
  339. code: "1",
  340. caption: "有效",
  341. },
  342. ],
  343. rules: {
  344. modelLabel: [
  345. { required: true, message: "请输入", trigger: "blur" },
  346. ],
  347. vehicleType: [
  348. { required: true, message: "请输入", trigger: "blur" },
  349. ],
  350. vehicleModel: [
  351. { required: true, message: "请输入", trigger: "blur" },
  352. ],
  353. vehicleColour: [
  354. { required: true, message: "请输入", trigger: "blur" },
  355. ],
  356. sort: [{ required: true, message: "请输入", trigger: "blur" }],
  357. valid: [
  358. { required: true, message: "请选择", trigger: "change" },
  359. ],
  360. maxSpeed: [
  361. { required: true, message: "请输入", trigger: "blur" },
  362. {
  363. validator: validateNum,
  364. message: "请输入最多带有4位小数的非负数",
  365. trigger: ["blur"],
  366. },
  367. ],
  368. enginePower: [
  369. { required: true, message: "请输入", trigger: "blur" },
  370. {
  371. validator: validateNum,
  372. message: "请输入最多带有4位小数的非负数",
  373. trigger: ["blur"],
  374. },
  375. ],
  376. maxDeceleration: [
  377. { required: true, message: "请输入", trigger: "blur" },
  378. {
  379. validator: validateNum,
  380. message: "请输入最多带有4位小数的非负数",
  381. trigger: ["blur"],
  382. },
  383. ],
  384. maxSteeringAngle: [
  385. { required: true, message: "请输入", trigger: "blur" },
  386. {
  387. validator: validateNum,
  388. message: "请输入最多带有4位小数的非负数",
  389. trigger: ["blur"],
  390. },
  391. ],
  392. overallEfficiency: [
  393. { required: true, message: "请输入", trigger: "blur" },
  394. {
  395. validator: validateNoMore1,
  396. message: "请输入不大于1的非负数",
  397. trigger: ["blur"],
  398. },
  399. {
  400. validator: validateNum,
  401. message: "请输入最多带有4位小数的非负数",
  402. trigger: ["blur"],
  403. },
  404. ],
  405. frontSurfaceEffective: [
  406. { required: true, message: "请输入", trigger: "blur" },
  407. {
  408. validator: validateNum,
  409. message: "请输入最多带有4位小数的非负数",
  410. trigger: ["blur"],
  411. },
  412. ],
  413. airDragCoefficient: [
  414. { required: true, message: "请输入", trigger: "blur" },
  415. {
  416. validator: validateNoMore1,
  417. message: "请输入不大于1的非负数",
  418. trigger: ["blur"],
  419. },
  420. {
  421. validator: validateNum,
  422. message: "请输入最多带有4位小数的非负数",
  423. trigger: ["blur"],
  424. },
  425. ],
  426. rollingResistanceCoefficient: [
  427. { required: true, message: "请输入", trigger: "blur" },
  428. {
  429. validator: validateNoMore1,
  430. message: "请输入不大于1的非负数",
  431. trigger: ["blur"],
  432. },
  433. {
  434. validator: validateNum,
  435. message: "请输入最多带有4位小数的非负数",
  436. trigger: ["blur"],
  437. },
  438. ],
  439. wheelDiameter: [
  440. { required: true, message: "请输入", trigger: "blur" },
  441. {
  442. validator: validateNum,
  443. message: "请输入最多带有4位小数的非负数",
  444. trigger: ["blur"],
  445. },
  446. ],
  447. frontDistance: [
  448. { required: true, message: "请输入", trigger: "blur" },
  449. {
  450. validator: validateNum,
  451. message: "请输入最多带有4位小数的非负数",
  452. trigger: ["blur"],
  453. },
  454. ],
  455. rearDistance: [
  456. { required: true, message: "请输入", trigger: "blur" },
  457. {
  458. validator: validateNum,
  459. message: "请输入最多带有4位小数的非负数",
  460. trigger: ["blur"],
  461. },
  462. ],
  463. leftDistance: [
  464. { required: true, message: "请输入", trigger: "blur" },
  465. {
  466. validator: validateNum,
  467. message: "请输入最多带有4位小数的非负数",
  468. trigger: ["blur"],
  469. },
  470. ],
  471. rightDistance: [
  472. { required: true, message: "请输入", trigger: "blur" },
  473. {
  474. validator: validateNum,
  475. message: "请输入最多带有4位小数的非负数",
  476. trigger: ["blur"],
  477. },
  478. ],
  479. heightDistance: [
  480. { required: true, message: "请输入", trigger: "blur" },
  481. {
  482. validator: validateNum,
  483. message: "请输入最多带有4位小数的非负数",
  484. trigger: ["blur"],
  485. },
  486. ],
  487. wheelbase: [
  488. { required: true, message: "请输入", trigger: "blur" },
  489. {
  490. validator: validateNum,
  491. message: "请输入最多带有4位小数的非负数",
  492. trigger: ["blur"],
  493. },
  494. ],
  495. mass: [
  496. { required: true, message: "请输入", trigger: "blur" },
  497. {
  498. validator: validateNum,
  499. message: "请输入最多带有4位小数的非负数",
  500. trigger: ["blur"],
  501. },
  502. ],
  503. wheelDrive: [
  504. { required: true, message: "请选择", trigger: "change" },
  505. ],
  506. },
  507. };
  508. },
  509. computed: {
  510. ...mapState(["fileHost", "fileUrl"]),
  511. },
  512. methods: {
  513. save() {
  514. this.$refs.form.validate((valid) => {
  515. if (valid) {
  516. if (
  517. !this.form.vehicleFrontView ||
  518. !this.form.vehicleTopView
  519. ) {
  520. this.$message.error("请先上传图片");
  521. return;
  522. }
  523. this.$axios({
  524. method: "post",
  525. url: this.$api.systemManagement.saveVehicleTemp,
  526. data: {
  527. ...this.form,
  528. },
  529. }).then((res) => {
  530. if (res.code == 200 && res.info) {
  531. this.$message.success("保存成功");
  532. this.cancel();
  533. } else {
  534. this.$message.error(res.message || "保存失败");
  535. }
  536. });
  537. }
  538. });
  539. },
  540. cancel() {
  541. this.$router.push({ path: "/vehicleModelManagement" });
  542. },
  543. attachmentChange(fileName, model) {
  544. if (model === "top") {
  545. this.form.vehicleTopView = fileName;
  546. } else {
  547. this.form.vehicleFrontView = fileName;
  548. }
  549. },
  550. getImgUrl(addr) {
  551. let url = "";
  552. if (process.env.VUE_APP_IS_DEV == "true") {
  553. url = this.fileHost + this.fileUrl;
  554. } else {
  555. url = this.fileUrl;
  556. }
  557. let token = localStorage.getItem("Authorization").split(" ")[1];
  558. let src = `${url}?objectName=${addr}&access_token=${token}`;
  559. return src;
  560. },
  561. },
  562. async mounted() {
  563. await this.$dicsListsInit({
  564. wheelDriveList: "driveType",
  565. });
  566. if (this.$route.query.id) {
  567. this.$axios({
  568. method: "post",
  569. url: this.$api.systemManagement.getVehicleTempInfo,
  570. data: { id: this.$route.query.id },
  571. }).then((res) => {
  572. if (res.code == 200 && res.info) {
  573. this.form = res.info;
  574. if (res.info.vehicleFrontView) {
  575. this.$refs.uploadA.imageUrl = this.getImgUrl(
  576. res.info.vehicleFrontView
  577. );
  578. }
  579. if (res.info.vehicleTopView) {
  580. this.$refs.uploadB.imageUrl = this.getImgUrl(
  581. res.info.vehicleTopView
  582. );
  583. }
  584. } else {
  585. this.$message.error(res.message || "获取信息失败");
  586. }
  587. });
  588. }
  589. },
  590. };
  591. </script>
  592. <style lang='less' scoped>
  593. .el-form {
  594. padding: 30px 10px;
  595. }
  596. .titlePanel {
  597. padding: 22px 0;
  598. }
  599. .tipBox {
  600. padding: 0 20px;
  601. .tip {
  602. text-align: center;
  603. width: 50%;
  604. padding-left: 10px;
  605. font-size: 12px;
  606. }
  607. }
  608. .modelBox {
  609. padding: 20px;
  610. .uploadBox {
  611. align-items: center;
  612. justify-content: center;
  613. width: 50%;
  614. }
  615. }
  616. .btns {
  617. padding-top: 30px;
  618. text-align: center;
  619. }
  620. </style>