You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

Model.vue 21 kB

3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
3 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
3 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. <template>
  2. <div>
  3. <div class="ui container" id="header">
  4. <el-row style="margin-top: 15px">
  5. <el-table
  6. ref="table"
  7. :data="tableData"
  8. style="min-width: 100%"
  9. row-key="rowKey"
  10. lazy
  11. :load="load"
  12. :tree-props="{ children: 'Children', hasChildren: 'hasChildren' }"
  13. :header-cell-style="tableHeaderStyle"
  14. >
  15. <el-table-column
  16. prop="Name"
  17. :label="i18n.model_name"
  18. align="left"
  19. min-width="17%"
  20. >
  21. <template slot-scope="scope">
  22. <div class="expand-icon" v-if="scope.row.hasChildren === false">
  23. <i class="el-icon-arrow-right"></i>
  24. </div>
  25. <!-- <i class="el-icon-time"></i> -->
  26. <a
  27. class="text-over"
  28. :href="showinfoHref + scope.row.Name"
  29. :title="scope.row.Name"
  30. >{{ scope.row.Name }}</a
  31. >
  32. </template>
  33. </el-table-column>
  34. <el-table-column
  35. prop="Status"
  36. :label="i18n.model_status"
  37. align="center"
  38. min-width="6.5%"
  39. >
  40. <template slot-scope="scope">
  41. <span class="text-over" :title="scope.row.Status_title">
  42. <i style="vertical-align: middle" :class="scope.row.Status"></i
  43. ></span>
  44. </template>
  45. </el-table-column>
  46. <el-table-column
  47. prop="Version"
  48. :label="i18n.model_version"
  49. align="center"
  50. min-width="6%"
  51. >
  52. <template slot-scope="scope">
  53. <span class="text-over" :title="scope.row.Version">{{
  54. scope.row.Version
  55. }}</span>
  56. </template>
  57. </el-table-column>
  58. <el-table-column
  59. prop="VersionCount"
  60. :label="i18n.model_version_num"
  61. align="center"
  62. min-width="7%"
  63. >
  64. <template slot-scope="scope">
  65. <span class="text-over" :title="scope.row.VersionCount">{{
  66. scope.row.VersionCount
  67. }}</span>
  68. </template>
  69. </el-table-column>
  70. <el-table-column
  71. prop="Size"
  72. :label="i18n.model_size"
  73. align="center"
  74. min-width="10%"
  75. >
  76. <template slot-scope="scope">
  77. <span class="text-over">{{ renderSize(scope.row.Size) }}</span>
  78. </template>
  79. </el-table-column>
  80. <el-table-column
  81. prop="EngineName"
  82. :label="i18n.model_egine"
  83. align="center"
  84. min-width="8%"
  85. >
  86. <template slot-scope="scope">
  87. <span class="text-over" :title="scope.row.EngineName">{{
  88. scope.row.EngineName
  89. }}</span>
  90. </template>
  91. </el-table-column>
  92. <el-table-column
  93. prop="ComputeResource"
  94. :label="i18n.model_compute_resource"
  95. align="center"
  96. min-width="8%"
  97. >
  98. <template slot-scope="scope">
  99. <span class="text-over">{{ scope.row.ComputeResource }}</span>
  100. </template>
  101. </el-table-column>
  102. <el-table-column
  103. prop="CreatedUnix"
  104. :label="i18n.model_create_time"
  105. align="center"
  106. min-width="13.75%"
  107. >
  108. <template slot-scope="scope">
  109. {{ transTime(scope.row.CreatedUnix) }}
  110. </template>
  111. </el-table-column>
  112. <el-table-column
  113. prop="UserName"
  114. :label="i18n.model_creator"
  115. align="center"
  116. min-width="6.75%"
  117. >
  118. <template slot-scope="scope">
  119. <a
  120. :href="!scope.row.UserName ? '#' : '/' + scope.row.UserName"
  121. :title="scope.row.UserName || defaultAvatarName"
  122. >
  123. <img
  124. class="ui avatar image"
  125. :src="scope.row.UserRelAvatarLink || defaultAvatar"
  126. />
  127. </a>
  128. </template>
  129. </el-table-column>
  130. <el-table-column
  131. :label="i18n.model_operation"
  132. min-width="17%"
  133. align="center"
  134. >
  135. <template slot-scope="scope">
  136. <div class="space-around">
  137. <a
  138. :style="{
  139. visibility: !scope.row.Children ? 'visible' : 'hidden',
  140. }"
  141. :class="{ disabled: !scope.row.IsCanOper }"
  142. @click="
  143. showcreateVue(
  144. scope.row.Name,
  145. scope.row.Version,
  146. scope.row.Label
  147. )
  148. "
  149. >{{ i18n.model_create_new_ver }}</a
  150. >
  151. <a
  152. :href="loadhref + scope.row.ID"
  153. :class="{ disabled: !scope.row.IsCanOper }"
  154. >{{ i18n.model_download }}</a
  155. >
  156. <a
  157. :class="{ disabled: !scope.row.IsCanDelete }"
  158. @click="
  159. deleteModel(scope.row.ID, scope.row.cName, scope.row.rowKey)
  160. "
  161. >{{ i18n.model_delete }}</a
  162. >
  163. </div>
  164. </template>
  165. </el-table-column>
  166. </el-table>
  167. </el-row>
  168. <div class="ui container" style="margin-top: 50px; text-align: center">
  169. <el-pagination
  170. background
  171. @size-change="handleSizeChange"
  172. @current-change="handleCurrentChange"
  173. :current-page="currentPage"
  174. :page-sizes="[5, 10, 15]"
  175. :page-size="pageSize"
  176. layout="total, sizes, prev, pager, next, jumper"
  177. :total="totalNum"
  178. >
  179. </el-pagination>
  180. </div>
  181. </div>
  182. </div>
  183. </template>
  184. <script>
  185. const { _AppSubUrl, _StaticUrlPrefix, csrf } = window.config;
  186. export default {
  187. components: {},
  188. data() {
  189. return {
  190. i18n: {},
  191. currentPage: 1,
  192. pageSize: 10,
  193. totalNum: 0,
  194. params: { page: 0, pageSize: 10 },
  195. tableData: [],
  196. url: "",
  197. isLoading: true,
  198. loadNodeMap: new Map(),
  199. submitId: {},
  200. defaultAvatar: "/user/avatar/Ghost/-1",
  201. defaultAvatarName: "Ghost",
  202. data: "",
  203. timer: null,
  204. timerFlag: false,
  205. };
  206. },
  207. methods: {
  208. load(tree, treeNode, resolve) {
  209. try {
  210. this.loadNodeMap.set(tree.cName, { tree, treeNode, resolve });
  211. this.$axios
  212. .get(this.url + "show_model_child_api", {
  213. params: {
  214. name: tree.cName,
  215. },
  216. })
  217. .then((res) => {
  218. let TrainTaskInfo;
  219. let tableData;
  220. tableData = res.data;
  221. for (let i = 0; i < tableData.length; i++) {
  222. TrainTaskInfo = JSON.parse(tableData[i].TrainTaskInfo);
  223. tableData[i].EngineName = this.getEngineName(tableData[i]);
  224. tableData[i].ComputeResource = TrainTaskInfo.ComputeResource;
  225. tableData[i].cName = tableData[i].Name;
  226. tableData[i].rowKey = tableData[i].ID + Math.random();
  227. tableData[i].Name = "";
  228. tableData[i].VersionCount = "";
  229. tableData[i].Children = true;
  230. }
  231. resolve(tableData || []);
  232. });
  233. } catch (e) {
  234. this.loading = false;
  235. }
  236. },
  237. tableHeaderStyle({ row, column, rowIndex, columnIndex }) {
  238. if (rowIndex === 0) {
  239. return "background:#f5f5f6;color:#606266";
  240. }
  241. },
  242. handleSizeChange(val) {
  243. this.params.pageSize = val;
  244. this.getModelList();
  245. },
  246. handleCurrentChange(val) {
  247. this.params.page = val;
  248. this.getModelList();
  249. },
  250. showcreateVue(name, version, label) {
  251. let title = this.i18n.model_create_version_title;
  252. $(".ui.modal.second")
  253. .modal({
  254. centered: false,
  255. onShow: function () {
  256. $("#model_header").text(title);
  257. $('input[name="Name"]').addClass("model_disabled");
  258. $('input[name="Name"]').attr("readonly", "readonly");
  259. $('input[name="modelSelectedFile"]').attr("readonly", "readonly");
  260. $('input[name="Version"]').addClass("model_disabled");
  261. $(".ui.dimmer").css({
  262. "background-color": "rgb(136, 136, 136,0.7)",
  263. });
  264. $("#job-name").empty();
  265. $("#name").val(name);
  266. $("#label").val(label);
  267. let version_string = versionAdd(version);
  268. $("#version").val(version_string);
  269. loadTrainList();
  270. },
  271. onHide: function () {
  272. document.getElementById("formId").reset();
  273. $('input[name="Name"]').removeClass("model_disabled");
  274. $('input[name="Name"]').removeAttr("readonly");
  275. $('input[name="modelSelectedFile"]').removeAttr("readonly");
  276. var cityObj = $("#modelSelectedFile");
  277. cityObj.attr("value", "");
  278. $("#choice_model").dropdown("clear");
  279. $("#choice_version").dropdown("clear");
  280. $("#choice_Engine").dropdown("clear");
  281. $(".ui.dimmer").css({ "background-color": "" });
  282. $(".ui.error.message").text();
  283. $(".ui.error.message").css("display", "none");
  284. },
  285. })
  286. .modal("show");
  287. },
  288. check() {
  289. let jobid = document.getElementById("JobId").value;
  290. let versionname = document.getElementById("VersionName").value;
  291. let name = document.getElementById("name").value;
  292. let version = document.getElementById("version").value;
  293. let modelSelectedFile =
  294. document.getElementById("modelSelectedFile").value;
  295. if (jobid == "") {
  296. $(".required.ten.wide.field").addClass("error");
  297. return false;
  298. } else {
  299. $(".required.ten.wide.field").removeClass("error");
  300. }
  301. if (modelSelectedFile == "") {
  302. $("#modelSelectedFile").addClass("error");
  303. return false;
  304. } else {
  305. $("#modelSelectedFile").removeClass("error");
  306. }
  307. if (versionname == "") {
  308. $(".required.six.widde.field").addClass("error");
  309. return false;
  310. } else {
  311. $(".required.six.widde.field").removeClass("error");
  312. }
  313. if (name == "") {
  314. $("#modelname").addClass("error");
  315. return false;
  316. } else {
  317. $("#modelname").removeClass("error");
  318. }
  319. if (versionname == "") {
  320. $("#verionname").addClass("error");
  321. return false;
  322. } else {
  323. $("#verionname").removeClass("error");
  324. }
  325. return true;
  326. },
  327. submit() {
  328. let context = this;
  329. let flag = this.check();
  330. if (flag) {
  331. let cName = $("input[name='Name']").val();
  332. let version = $("input[name='Version']").val();
  333. let data = $("#formId").serialize();
  334. const initModel = $("input[name='initModel']").val();
  335. let url_href =
  336. version === "0.0.1"
  337. ? context.url_create_newModel
  338. : context.url_create_newVersion;
  339. $("#mask").css({ display: "block", "z-index": "9999" });
  340. $.ajax({
  341. url: url_href,
  342. type: "POST",
  343. data: data,
  344. success: function (res) {
  345. context.getModelList();
  346. $("input[name='modelSelectedFile']").val("");
  347. $(".ui.modal.second").modal("hide");
  348. if (initModel === "0") {
  349. location.reload();
  350. }
  351. },
  352. error: function (xhr) {
  353. // 隐藏 loading
  354. // 只有请求不正常(状态码不为200)才会执行
  355. $(".ui.error.message").text(xhr.responseText);
  356. $(".ui.error.message").css("display", "block");
  357. },
  358. complete: function (xhr) {
  359. $("#mask").css({ display: "none", "z-index": "1" });
  360. },
  361. });
  362. } else {
  363. return false;
  364. }
  365. },
  366. loadrefresh(row) {
  367. const store = this.$refs.table.store;
  368. if (!this.loadNodeMap.get(row.cName)) {
  369. const parent = store.states.data;
  370. const index = parent.findIndex((child) => child.rowKey == row.rowKey);
  371. this.getModelList();
  372. } else {
  373. let { tree, treeNode, resolve } = this.loadNodeMap.get(row.cName);
  374. const keys = Object.keys(store.states.lazyTreeNodeMap);
  375. if (keys.includes(row.rowKey)) {
  376. this.getModelList();
  377. } else {
  378. let parentRow = store.states.data.find(
  379. (child) => child.cName == row.cName
  380. );
  381. let childrenIndex = store.states.lazyTreeNodeMap[
  382. parentRow.rowKey
  383. ].findIndex((child) => child.rowKey == row.rowKey);
  384. parentRow.VersionCount = parentRow.VersionCount - 1;
  385. const parent = store.states.lazyTreeNodeMap[parentRow.rowKey];
  386. if (parent.length === 1) {
  387. this.getModelList();
  388. } else {
  389. parent.splice(childrenIndex, 1);
  390. }
  391. }
  392. }
  393. },
  394. deleteModel(id, name, rowKey) {
  395. let row = { cName: name, ID: id, rowKey: rowKey };
  396. let _this = this;
  397. let flag = 1;
  398. $(".ui.basic.modal.first")
  399. .modal({
  400. onDeny: function () {
  401. flag = false;
  402. },
  403. onApprove: function () {
  404. _this.$axios
  405. .delete(_this.url + "delete_model", {
  406. params: {
  407. ID: id,
  408. },
  409. })
  410. .then((res) => {
  411. _this.loadrefresh(row);
  412. // _this.getModelList()
  413. });
  414. flag = true;
  415. },
  416. onHidden: function () {
  417. if (flag == false) {
  418. $(".alert")
  419. .html("您已取消操作")
  420. .removeClass("alert-success")
  421. .addClass("alert-danger")
  422. .show()
  423. .delay(1500)
  424. .fadeOut();
  425. } else {
  426. $(".alert")
  427. .html("删除成功")
  428. .removeClass("alert-danger")
  429. .addClass("alert-success")
  430. .show()
  431. .delay(1500)
  432. .fadeOut();
  433. }
  434. },
  435. })
  436. .modal("show");
  437. },
  438. getEngineName(model) {
  439. if (model.Engine == 0) {
  440. return "PyTorch";
  441. } else if (model.Engine == 1 || model.Engine == 121) {
  442. return "TensorFlow";
  443. } else if (
  444. model.Engine == 2 ||
  445. model.Engine == 122 ||
  446. model.Engine == 35
  447. ) {
  448. return "MindSpore";
  449. } else if (model.Engine == 4) {
  450. return "PaddlePaddle";
  451. } else if (model.Engine == 5) {
  452. return "OneFlow";
  453. } else if (model.Engine == 6) {
  454. return "MXNet";
  455. } else {
  456. return "Other";
  457. }
  458. },
  459. intervalModelist() {
  460. if (!this.timerFlag) {
  461. this.timer = setInterval(() => {
  462. this.getModelList();
  463. }, 10000);
  464. }
  465. },
  466. getModelList() {
  467. let countStatus = 0;
  468. try {
  469. this.loadNodeMap.clear();
  470. this.$axios
  471. .get(location.href + "_api", {
  472. params: this.params,
  473. })
  474. .then((res) => {
  475. $(".ui.grid").removeAttr("style");
  476. $("#loadContainer").removeClass("loader");
  477. let TrainTaskInfo;
  478. this.tableData = res.data.data;
  479. for (let i = 0; i < this.tableData.length; i++) {
  480. TrainTaskInfo = JSON.parse(this.tableData[i].TrainTaskInfo);
  481. this.tableData[i].cName = this.tableData[i].Name;
  482. this.tableData[i].rowKey = this.tableData[i].ID + Math.random();
  483. this.tableData[i].EngineName = this.getEngineName(
  484. this.tableData[i]
  485. );
  486. this.tableData[i].ComputeResource = TrainTaskInfo.ComputeResource;
  487. this.tableData[i].hasChildren =
  488. res.data.data[i].VersionCount === 1 ? false : true;
  489. if (this.tableData[i].Status !== 1) {
  490. countStatus++;
  491. }
  492. switch (this.tableData[i].Status) {
  493. case 1:
  494. this.tableData[i].Status = "WAITING";
  495. this.tableData[i].Status_title = this.i18n.model_wait;
  496. break;
  497. case 2:
  498. this.tableData[i].Status = "FAILED";
  499. this.tableData[i].Status_title = this.tableData[i].StatusDesc;
  500. break;
  501. default:
  502. this.tableData[i].Status = "SUCCEEDED";
  503. this.tableData[i].Status_title = this.i18n.model_success;
  504. break;
  505. }
  506. }
  507. this.totalNum = res.data.count;
  508. if (countStatus === this.tableData.length) {
  509. clearInterval(this.timer);
  510. this.timer = null;
  511. this.timerFlag = false;
  512. } else {
  513. this.intervalModelist();
  514. this.timerFlag = true;
  515. }
  516. })
  517. .catch((err) => {
  518. console.log(err);
  519. });
  520. } catch (e) {
  521. console.log(e);
  522. }
  523. },
  524. },
  525. computed: {
  526. loadhref() {
  527. return this.url + "downloadall?ID=";
  528. },
  529. showinfoHref() {
  530. return this.url + "show_model_info?name=";
  531. },
  532. transTime() {
  533. return function (time) {
  534. let date = new Date(time * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  535. let Y = date.getFullYear() + "-";
  536. let M =
  537. (date.getMonth() + 1 < 10
  538. ? "0" + (date.getMonth() + 1)
  539. : date.getMonth() + 1) + "-";
  540. let D =
  541. (date.getDate() < 10 ? "0" + date.getDate() : date.getDate()) + " ";
  542. let h =
  543. (date.getHours() < 10 ? "0" + date.getHours() : date.getHours()) +
  544. ":";
  545. let m =
  546. (date.getMinutes() < 10
  547. ? "0" + date.getMinutes()
  548. : date.getMinutes()) + ":";
  549. let s =
  550. date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
  551. return Y + M + D + h + m + s;
  552. };
  553. },
  554. renderSize() {
  555. return function (value) {
  556. if (null == value || value == "") {
  557. return "0 Bytes";
  558. }
  559. var unitArr = new Array(
  560. "Bytes",
  561. "KB",
  562. "MB",
  563. "GB",
  564. "TB",
  565. "PB",
  566. "EB",
  567. "ZB",
  568. "YB"
  569. );
  570. var index = 0;
  571. var srcsize = parseFloat(value);
  572. index = Math.floor(Math.log(srcsize) / Math.log(1024));
  573. var size = srcsize / Math.pow(1024, index);
  574. size = size.toFixed(2); //保留的小数位数
  575. return size + unitArr[index];
  576. };
  577. },
  578. },
  579. mounted() {
  580. this.submitId = document.getElementById("submitId");
  581. this.intervalModelist();
  582. this.url = location.href.split("show_model")[0];
  583. this.submitId.addEventListener("click", this.submit);
  584. this.url_create_newVersion = this.url + "create_model";
  585. this.url_create_newModel = this.url + "create_new_model";
  586. },
  587. created() {
  588. if (document.documentElement.attributes["lang"].nodeValue == "en-US") {
  589. this.i18n = this.$locale.US;
  590. } else {
  591. this.i18n = this.$locale.CN;
  592. }
  593. this.getModelList();
  594. },
  595. beforeDestroy() {
  596. // 实例销毁之前对点击事件进行解绑
  597. this.submitId.removeEventListener("click", this.submit);
  598. clearInterval(this.timer);
  599. },
  600. };
  601. </script>
  602. <style scoped>
  603. .text-over {
  604. overflow: hidden;
  605. text-overflow: ellipsis;
  606. vertical-align: middle;
  607. white-space: nowrap;
  608. }
  609. .el-icon-arrow-right {
  610. font-family: element-icons !important;
  611. speak: none;
  612. font-style: normal;
  613. font-weight: 400;
  614. font-feature-settings: normal;
  615. font-variant: normal;
  616. text-transform: none;
  617. line-height: 1;
  618. vertical-align: middle;
  619. display: inline-block;
  620. -webkit-font-smoothing: antialiased;
  621. -moz-osx-font-smoothing: grayscale;
  622. border: 1px solid #d4d4d5;
  623. border-radius: 50%;
  624. color: #d4d4d5;
  625. margin-right: 4px;
  626. }
  627. .el-icon-arrow-right::before {
  628. content: "\e6e0";
  629. }
  630. .expand-icon {
  631. display: inline-block;
  632. width: 20px;
  633. line-height: 20px;
  634. height: 20px;
  635. text-align: center;
  636. margin-right: 3px;
  637. font-size: 12px;
  638. }
  639. /deep/ .el-table_1_column_1.is-left .cell {
  640. padding-right: 0px !important;
  641. white-space: nowrap;
  642. }
  643. /deep/ .el-table__expand-icon .el-icon-arrow-right {
  644. font-family: element-icons !important;
  645. speak: none;
  646. font-style: normal;
  647. font-weight: 400;
  648. font-feature-settings: normal;
  649. font-variant: normal;
  650. text-transform: none;
  651. line-height: 1;
  652. vertical-align: middle;
  653. display: inline-block;
  654. -webkit-font-smoothing: antialiased;
  655. -moz-osx-font-smoothing: grayscale;
  656. border: 1px solid #3291f8;
  657. border-radius: 50%;
  658. color: #3291f8;
  659. margin-right: 4px;
  660. }
  661. .space-around {
  662. display: flex;
  663. justify-content: space-around;
  664. }
  665. .disabled {
  666. cursor: default;
  667. pointer-events: none;
  668. color: rgba(0, 0, 0, 0.6) !important;
  669. opacity: 0.45 !important;
  670. }
  671. </style>