ApplyTab.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709
  1. <template>
  2. <div>
  3. <!-- 无待办显示 -->
  4. <div class="applyList_null" v-if="applyList.length == 0">
  5. <a-empty />
  6. </div>
  7. <div class="applyTab">
  8. <a-card class="cardTask" v-for="item in applyList" :key="item.id">
  9. <p class="pTitle">
  10. <span>
  11. <img src="@assets/title.png" />
  12. </span>
  13. <i>
  14. {{ item.processName }}
  15. </i>
  16. </p>
  17. <p v-if="item.currTaskName">
  18. 当前审批环节:
  19. <span style="color:black;">
  20. {{ item.currTaskName }}
  21. </span>
  22. </p>
  23. <p>
  24. 创建时间:
  25. <span style="color:black;">
  26. {{ item.createTime }}
  27. </span>
  28. </p>
  29. <!-- 状态 -->
  30. <p class="fl">
  31. 状态:
  32. <span v-if="item.status == 0" class="statusComm" style="background:rgb(9, 40, 52,.2);">
  33. 草稿
  34. </span>
  35. <span v-if="item.status == 1" class="statusComm" style="background:rgb(252, 96, 10,.2);">
  36. 处理中
  37. </span>
  38. <span v-if="item.status == 2" class="statusComm" style="background:rgb(9, 40, 52,.2);">
  39. 已结束
  40. </span>
  41. <span v-if="item.status == 3" class="statusComm" style="background:rgb(9, 40, 52,.2);">
  42. 已撤回
  43. </span>
  44. </p>
  45. <!-- 结果 -->
  46. <p class="fr">
  47. 结果:
  48. <span class="resultComm" v-if="item.result == 0" style="background:rgba(52, 123, 152,.5);">
  49. 未提交
  50. </span>
  51. <span class="resultComm" v-else-if="item.result == 1" style="background:rgb(252, 96, 10,.5);">
  52. 处理中
  53. </span>
  54. <span class="resultComm" v-else-if="item.result == 2" style="background:rgb(9, 40, 52,.5);">
  55. 通过
  56. </span>
  57. <span class="resultComm" v-else-if="item.result == 3" style="background:rgba(9, 40, 52,.5);">
  58. 驳回
  59. </span>
  60. </p>
  61. <a-divider></a-divider>
  62. <!-- 操作 -->
  63. <div class="operation">
  64. <div class="btns">
  65. <!-- 结果 0 -->
  66. <span v-if="item.status == 0">
  67. <a-button
  68. class="itemBtn"
  69. ghost
  70. @click="apply(item)"
  71. style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.9);color:#00A0E9;"
  72. >
  73. 提交申请
  74. </a-button>
  75. <a-button
  76. class="itemBtn"
  77. ghost
  78. @click="edit(item)"
  79. style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:orange;"
  80. >
  81. 编辑
  82. </a-button>
  83. <a-popconfirm title="确定删除吗?" placement="left" @confirm="() => remove(item)">
  84. <a-button class="itemBtn" ghost style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:#4e73b9;">
  85. 删除
  86. </a-button>
  87. </a-popconfirm>
  88. </span>
  89. <!-- 处理中 渲染的按钮 -->
  90. <span v-if="item.status == 1" class="ingBtns">
  91. <a-button
  92. class="itemBtn"
  93. ghost
  94. @click="cancel(item)"
  95. style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:#8000ff;"
  96. >
  97. 撤回
  98. </a-button>
  99. <a-button
  100. class="itemBtn"
  101. ghost
  102. @click="history(item)"
  103. style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:blue;"
  104. >
  105. 查看进度
  106. </a-button>
  107. <a-button
  108. class="itemBtn"
  109. ghost
  110. @click="detail(item)"
  111. style="box-shadow: 8px 8px 8px rgba(128, 128, 128,.7);color:#999;"
  112. >
  113. 表单数据
  114. </a-button>
  115. </span>
  116. <!-- 驳回 状态 渲染的按钮 -->
  117. <span v-if="item.status == 2 || item.status == 3" class="overBtns">
  118. <a-button
  119. class="itemBtn"
  120. ghost
  121. @click="apply(item)"
  122. style="box-shadow: 8px 8px 8px rgba(128, 128, 128);color:#00A0E9;"
  123. >
  124. 重新申请
  125. </a-button>
  126. <a-button
  127. class="itemBtn"
  128. ghost
  129. @click="edit(item)"
  130. style="box-shadow: 8px 8px 8px rgba(128, 128, 128);color:#000000;"
  131. >
  132. 编辑
  133. </a-button>
  134. <a-button
  135. class="itemBtn"
  136. ghost
  137. @click="history(item)"
  138. style="box-shadow: 8px 8px 8px rgba(128, 128, 128);color:blue;"
  139. >
  140. 审批历史
  141. </a-button>
  142. <a-popconfirm title="确定删除吗?" placement="left" @confirm="() => remove(item)">
  143. <a-button class="itemBtn" ghost style="box-shadow: 8px 8px 8px rgba(128, 128, 128);color:red;">
  144. 删除
  145. </a-button>
  146. </a-popconfirm>
  147. </span>
  148. </div>
  149. </div>
  150. </a-card>
  151. <!--流程申请选择-->
  152. <a-drawer
  153. title="选择流程"
  154. width="33%"
  155. placement="right"
  156. :closable="false"
  157. @close="processModalVisible = false"
  158. :visible="processModalVisible"
  159. >
  160. <a-input-search style="margin-bottom: 10px;width: 200px" placeholder="输入流程名称" @search="onSearchProcess" />
  161. <a-empty description="无流程可供选择" v-if="activeKeyAll.length == 0" />
  162. <div v-else>
  163. <a-collapse v-model="activeKey">
  164. <a-collapse-panel
  165. v-for="(value, index) in activeKeyAll"
  166. :header="filterDictText(dictOptions, value) || '未分类'"
  167. :key="value"
  168. >
  169. <a-list :grid="{ gutter: 10, column: 1 }" :dataSource="processDataMap[value]">
  170. <a-list-item slot="renderItem" slot-scope="item">
  171. <a-card>
  172. <div slot="title">
  173. <a-row>
  174. <a-col span="12" :title="item.name">{{ item.name }} </a-col>
  175. <a-col span="12" style="text-align: right;">
  176. <a href="javascript:void (0)" @click="chooseProcess(item)">发起申请</a>
  177. </a-col>
  178. </a-row>
  179. </div>
  180. <b>版本:</b>v.{{ item.version }}
  181. <br />
  182. <b>说明:</b>{{ item.description }}
  183. </a-card>
  184. </a-list-item>
  185. </a-list>
  186. </a-collapse-panel>
  187. </a-collapse>
  188. </div>
  189. </a-drawer>
  190. <!--流程表单-->
  191. <a-modal :title="lcModa.title" v-model="lcModa.visible" :footer="null" :maskClosable="false" width="100%">
  192. <component
  193. :disabled="lcModa.disabled"
  194. v-if="lcModa.visible"
  195. :is="lcModa.formComponent"
  196. :processData="lcModa.processData"
  197. :isNew="lcModa.isNew"
  198. @afterSubmit="afterSub"
  199. @close=";(lcModa.visible = false), (lcModa.disabled = false)"
  200. ></component>
  201. </a-modal>
  202. <!--提交申请表单-->
  203. <a-modal title="提交申请" v-model="modalVisible" :mask-closable="false" :width="500" :footer="null">
  204. <div v-if="modalVisible">
  205. <a-form-item label="选择审批人" v-show="showAssign">
  206. <a-select
  207. style="width: 100%"
  208. v-model="form.assignees"
  209. placeholder="请选择"
  210. mode="multiple"
  211. :allowClear="true"
  212. >
  213. <a-select-option v-for="(item, i) in assigneeList" :key="i" :value="item.username">
  214. {{ item.realname }}
  215. </a-select-option>
  216. </a-select>
  217. </a-form-item>
  218. <a-form-item label="下一审批人" v-show="isGateway">
  219. <a-alert type="info" showIcon message="分支网关处不支持自定义选择下一审批人,将自动下发给所有可审批人。"
  220. >,将发送给下一节点所有人</a-alert
  221. >
  222. </a-form-item>
  223. <a-form-item label="优先级" prop="priority">
  224. <a-select v-model="form.priority" placeholder="请选择" :allowClear="true" style="width: 100%">
  225. <a-select-option :value="0">普通</a-select-option>
  226. <a-select-option :value="1">重要</a-select-option>
  227. <a-select-option :value="2">紧急</a-select-option>
  228. </a-select>
  229. </a-form-item>
  230. <a-form-item label="消息通知">
  231. <a-checkbox v-model="form.sendMessage">站内消息通知</a-checkbox>
  232. <!-- <a-checkbox v-model="form.sendSms" disabled>短信通知</a-checkbox>
  233. <a-checkbox v-model="form.sendEmail" disabled>邮件通知</a-checkbox> -->
  234. </a-form-item>
  235. <!-- 提交 -->
  236. <div slot="footer">
  237. <a-button type="text" @click="modalVisible = false">取消</a-button>
  238. <div style="display:inline-block;width: 20px;"></div>
  239. <a-button type="primary" :disabled="submitLoading" @click="applySubmit">提交</a-button>
  240. </div>
  241. </div>
  242. </a-modal>
  243. <!-- 审批历史 -->
  244. <a-modal title="审批历史" v-model="modalLsVisible" :mask-closable="false" :width="'100%'" :footer="null">
  245. <div v-if="modalLsVisible">
  246. <historyModal :procInstId="procInstId"></historyModal>
  247. </div>
  248. </a-modal>
  249. <!-- 确认撤回 -->
  250. <a-modal title="确认撤回" v-model="modalCancelVisible" :mask-closable="false" :width="500">
  251. <a-form ref="delForm" v-model="cancelForm" :label-width="70" v-if="modalCancelVisible">
  252. <a-form-item label="撤回原因" prop="reason">
  253. <a-input type="textarea" v-model="cancelForm.reason" :rows="4" />
  254. </a-form-item>
  255. </a-form>
  256. <div slot="footer">
  257. <a-button type="text" @click="modalCancelVisible = false">取消</a-button>
  258. <a-button type="primary" :disabled="submitLoading" @click="handelSubmitCancel">提交</a-button>
  259. </div>
  260. </a-modal>
  261. </div>
  262. </div>
  263. </template>
  264. <script>
  265. import HistoryModal from '@views/user/tabs/HistoryModal'
  266. import { defineComponent } from 'vue'
  267. import { JeecgListMixin } from '@/mixins/JeecgListMixin'
  268. import { activitiMixin } from '@/views/activiti/mixins/activitiMixin'
  269. import { filterObj } from '@/utils/util'
  270. import JEllipsis from '@/components/jeecg/JEllipsis'
  271. import { deleteAction, getAction, downFile } from '@/api/manage'
  272. import pick from 'lodash.pick'
  273. import JTreeSelect from '@/components/jeecg/JTreeSelect'
  274. import { initDictOptions, filterDictText } from '@/components/dict/JDictSelectUtil'
  275. import historicDetail from '@/views/activiti/historicDetail'
  276. export default {
  277. name: 'applyTab',
  278. mixins: [activitiMixin, JeecgListMixin],
  279. components: {
  280. JEllipsis,
  281. JTreeSelect,
  282. HistoryModal
  283. },
  284. data() {
  285. return {
  286. applyList: [], // 申请列表
  287. description: '我的申请',
  288. dictOptions: [],
  289. url: {
  290. list: '/actBusiness/listData',
  291. getProcessDataList: '/activiti_process/listData',
  292. delByIds: '/actBusiness/delByIds',
  293. getFirstNode: '/actProcessIns/getFirstNode',
  294. applyBusiness: '/actBusiness/apply',
  295. cancelApply: '/actBusiness/cancel'
  296. },
  297. // 查询条件
  298. queryParam: {
  299. createTimeRange: [],
  300. keyWord: ''
  301. },
  302. // 表头
  303. labelCol: {
  304. xs: { span: 4 },
  305. sm: { span: 4 }
  306. },
  307. wrapperCol: {
  308. xs: { span: 20 },
  309. sm: { span: 20 }
  310. },
  311. processModalVisible: null,
  312. activeKeyAll: [],
  313. activeKey: [],
  314. processDataMap: {},
  315. searchProcessKey: null,
  316. addApplyLoading: false,
  317. lcModa: {
  318. title: '',
  319. disabled: false,
  320. visible: false,
  321. formComponent: null,
  322. isNew: false
  323. },
  324. form: {
  325. priority: 0,
  326. assignees: [],
  327. sendMessage: true
  328. },
  329. modalVisible: false,
  330. showAssign: false,
  331. assigneeList: [],
  332. isGateway: false,
  333. dictPriority: [],
  334. submitLoading: false,
  335. error: '',
  336. /*审批历史*/
  337. modalLsVisible: false,
  338. procInstId: '',
  339. modalCancelVisible: false,
  340. cancelForm: {}
  341. }
  342. },
  343. methods: {
  344. //初始化字典 - 流程分类
  345. initDictConfig() {
  346. initDictOptions('bpm_process_type').then(res => {
  347. if (res.success) {
  348. this.dictOptions = res.result
  349. }
  350. })
  351. },
  352. //字典
  353. filterDictText(dictOptions, text) {
  354. if (dictOptions instanceof Array) {
  355. for (let dictItem of dictOptions) {
  356. if (text === dictItem.value) {
  357. return dictItem.text
  358. }
  359. }
  360. }
  361. return text || text == 'null' ? '' : text
  362. },
  363. //进度列表
  364. getProcessList() {
  365. this.addApplyLoading = true
  366. this.postFormAction(this.url.getProcessDataList, { status: 1, roles: true })
  367. .then(res => {
  368. this.activeKeyAll = []
  369. if (res.success) {
  370. var result = res.result || []
  371. if (result.length > 0) {
  372. let searchProcessKey = this.searchProcessKey
  373. if (searchProcessKey) {
  374. //过滤条件
  375. result = _.filter(result, function(o) {
  376. return o.name.indexOf(searchProcessKey) > -1
  377. })
  378. }
  379. this.processDataMap = _.groupBy(result, 'categoryId')
  380. for (const categoryId in this.processDataMap) {
  381. this.activeKeyAll.push(categoryId)
  382. }
  383. this.activeKey = this.activeKeyAll
  384. }
  385. this.processModalVisible = true
  386. } else {
  387. this.$message.warning(res.message)
  388. }
  389. })
  390. .finally(() => (this.addApplyLoading = false))
  391. },
  392. //
  393. loadData(arg) {
  394. console.log('我可以自动调用loadData')
  395. if (!this.url.list) {
  396. this.$message.error('请设置url.list属性!')
  397. return
  398. }
  399. //加载数据 若传入参数1则加载第一页的内容
  400. if (arg === 1) {
  401. this.ipagination.current = 1
  402. }
  403. var params = this.getQueryParams() //查询条件
  404. this.loading = true
  405. getAction(this.url.list, params).then(res => {
  406. if (res.success) {
  407. let records = res.result || []
  408. this.applyList = records
  409. this.ipagination.total = records.length
  410. }
  411. if (res.code === 510) {
  412. this.$message.warning(res.message)
  413. }
  414. this.loading = false
  415. })
  416. },
  417. //分页、排序、筛选变化时触发
  418. handleTableChange(pagination, filters, sorter) {
  419. //TODO 筛选
  420. console.log('走这没 分页啊')
  421. console.log(Object)
  422. if (Object.keys(sorter).length > 0) {
  423. console.log(Object)
  424. console.log(Object.key)
  425. this.isorter.column = sorter.field
  426. this.isorter.order = 'ascend' == sorter.order ? 'asc' : 'desc'
  427. }
  428. this.ipagination = pagination
  429. this.loadData()
  430. },
  431. // 选择参数
  432. getQueryParams() {
  433. var param = Object.assign({}, this.queryParam, this.isorter)
  434. delete param.createTimeRange // 时间参数不传递后台
  435. return filterObj(param)
  436. },
  437. // 重置
  438. searchReset() {
  439. var that = this
  440. var logType = that.queryParam.logType
  441. that.queryParam = {} //清空查询区域参数
  442. that.queryParam.logType = logType
  443. that.loadData(this.ipagination.current)
  444. },
  445. //
  446. onDateChange: function(value, dateString) {
  447. console.log(dateString[0], dateString[1])
  448. this.queryParam.createTime_begin = dateString[0]
  449. this.queryParam.createTime_end = dateString[1]
  450. },
  451. //
  452. onDateOk(value) {
  453. console.log(value)
  454. },
  455. // 申请
  456. apply(v) {
  457. if (!v.procDefId || v.procDefId == 'null') {
  458. this.$message.error('流程定义为空')
  459. return
  460. }
  461. this.form.id = v.id
  462. this.form.procDefId = v.procDefId
  463. this.form.title = v.title
  464. // 加载审批人
  465. this.getAction(this.url.getFirstNode, { procDefId: v.procDefId }).then(res => {
  466. if (res.success) {
  467. if (res.result.type == 3 || res.result.type == 4) {
  468. this.isGateway = true
  469. this.modalVisible = true
  470. this.form.firstGateway = true
  471. this.showAssign = false
  472. this.error = ''
  473. return
  474. }
  475. this.form.firstGateway = false
  476. this.isGateway = false
  477. if (res.result.users && res.result.users.length > 0) {
  478. this.error = ''
  479. this.assigneeList = res.result.users
  480. // 默认勾选
  481. let ids = []
  482. res.result.users.forEach(e => {
  483. ids.push(e.username)
  484. })
  485. this.form.assignees = ids
  486. this.showAssign = true
  487. } else {
  488. this.form.assignees = []
  489. this.showAssign = true
  490. this.error = '审批节点未分配候选审批人员,请联系管理员!'
  491. }
  492. if (this.error) {
  493. this.$message.error(this.error)
  494. return
  495. }
  496. this.modalVisible = true
  497. this.loadData()
  498. } else {
  499. this.$message.error(res.message)
  500. }
  501. })
  502. },
  503. //重新申请 提交
  504. applySubmit() {
  505. if (this.showAssign && this.form.assignees.length < 1) {
  506. this.error = '请至少选择一个审批人'
  507. this.$message.error(this.error)
  508. return
  509. } else {
  510. this.error = ''
  511. }
  512. this.submitLoading = true
  513. var params = Object.assign({}, this.form)
  514. params.assignees = params.assignees.join(',')
  515. this.postFormAction(this.url.applyBusiness, params)
  516. .then(res => {
  517. if (res.success) {
  518. this.$message.success('操作成功')
  519. this.loadData()
  520. this.modalVisible = false
  521. console.log('重新申请的提交 走这没')
  522. this.loadData()
  523. } else {
  524. this.$message.error(res.message)
  525. }
  526. console.log('这是哪 走这没')
  527. this.loadData()
  528. })
  529. .finally(() => (this.submitLoading = false))
  530. },
  531. // 编辑
  532. edit(r, isView) {
  533. if (!r.routeName) {
  534. this.$message.warning('该流程信息未配置表单,请联系开发人员!')
  535. return
  536. }
  537. if (r.routeName.indexOf('外部表单') != -1) {
  538. alert('调用其他项目页面')
  539. } else if (r.routeName.indexOf('自定义') != -1) {
  540. isView = isView || false
  541. this.lcModa.disabled = isView
  542. this.lcModa.title = '修改流程业务信息:' + r.title
  543. if (isView) this.lcModa.title = '查看流程业务信息:' + r.title
  544. let com = { component: () => import(`@/views/activiti/form/demoForm2`) }
  545. this.lcModa.formComponent = com.component
  546. this.lcModa.isNew = false
  547. this.lcModa.processData = r
  548. this.lcModa.visible = true
  549. } else {
  550. isView = isView || false
  551. this.lcModa.disabled = isView
  552. this.lcModa.title = '修改流程业务信息:' + r.title
  553. if (isView) this.lcModa.title = '查看流程业务信息:' + r.title
  554. this.lcModa.formComponent = this.getFormComponent(r.routeName).component
  555. this.lcModa.processData = r
  556. this.lcModa.isNew = false
  557. this.lcModa.visible = true
  558. }
  559. },
  560. // 删除
  561. remove(r) {
  562. console.log('点击了删除')
  563. this.postFormAction(this.url.delByIds, { ids: r.id }).then(res => {
  564. if (res.success) {
  565. this.$message.success(res.message)
  566. this.loadData()
  567. } else {
  568. this.$message.error(res.message)
  569. }
  570. })
  571. },
  572. // 撤回
  573. cancel(v) {
  574. this.cancelForm.id = v.id
  575. this.cancelForm.procInstId = v.procInstId
  576. this.modalCancelVisible = true
  577. },
  578. //
  579. handelSubmitCancel() {
  580. this.submitLoading = true
  581. this.postFormAction(this.url.cancelApply, this.cancelForm)
  582. .then(res => {
  583. if (res.success) {
  584. this.$message.success('操作成功')
  585. this.loadData()
  586. this.modalCancelVisible = false
  587. } else {
  588. this.$message.error(res.message)
  589. }
  590. })
  591. .finally(() => (this.submitLoading = false))
  592. },
  593. // 历史
  594. history(v) {
  595. if (!v.procInstId) {
  596. this.$message.error('流程实例ID不存在')
  597. return
  598. }
  599. this.procInstId = v.procInstId
  600. this.modalLsVisible = true
  601. },
  602. // 详情
  603. detail(v) {
  604. // this.$refs.modal.detail("1","8a8080f079ea4ed50179ea4f6c470001")
  605. this.edit(v, true)
  606. },
  607. // 发起申请 可删
  608. addApply() {
  609. this.getProcessList()
  610. },
  611. //
  612. onSearchProcess(value) {
  613. this.searchProcessKey = value
  614. this.getProcessList()
  615. },
  616. //
  617. chooseProcess(v) {
  618. console.log(v)
  619. // this.$refs.modal.add("1")
  620. if (!v.routeName) {
  621. this.$message.warning('该流程信息未配置表单,请联系开发人员!')
  622. return
  623. }
  624. if (v.routeName.indexOf('外部表单') != -1) {
  625. alert('调用其他项目页面')
  626. } else if (v.routeName.indexOf('自定义') != -1) {
  627. this.lcModa.disabled = false
  628. let com = { component: () => import(`@/views/activiti/form/demoForm2`) }
  629. this.lcModa.formComponent = com.component
  630. this.lcModa.title = '发起流程:' + v.name
  631. this.lcModa.isNew = true
  632. this.lcModa.processData = v
  633. this.lcModa.visible = true
  634. } else {
  635. this.lcModa.disabled = false
  636. this.lcModa.formComponent = this.getFormComponent(v.routeName).component
  637. this.lcModa.title = '发起流程:' + v.name
  638. this.lcModa.isNew = true
  639. this.lcModa.processData = v
  640. this.lcModa.visible = true
  641. }
  642. console.log('发起', v)
  643. },
  644. //
  645. afterSub(formData) {
  646. this.lcModa.visible = false
  647. this.loadData()
  648. }
  649. }
  650. }
  651. </script>
  652. <style src="@assets/less/overwrite.less" lang="less" scoped></style>
  653. <style lang="less">
  654. @import '~@assets/less/common.less';
  655. </style>
  656. <style lang="less" scoped></style>