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 22 kB

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