90bdbf7b6b5d5a8677943d302ba2568385141497.svn-base 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. <template>
  2. <div style="margin:-10px;">
  3. <a-spin size="large" :spinning="spinning">
  4. <!-- 添加任务栏 -->
  5. <div class="addPanel-position-box" v-if="edit">
  6. <div class="addPanel-container">
  7. <div class="panel-text-box">
  8. <a-icon type="credit-card" class="iconfont icon-margin" />
  9. <span>面板 / </span>
  10. <span>{{ layout.length }}</span>
  11. </div>
  12. <a-divider type="vertical" />
  13. <div class="add-panel-box" @click="add">
  14. <a-icon type="plus-circle" class="iconfont icon-margin icon-add" />
  15. <span >添加面板</span>
  16. </div>
  17. <div class="saveBtn-box">
  18. <a-button type="dashed" @click="handleEdit">退出编辑</a-button>
  19. <!-- <a-button type="primary">保存</a-button> -->
  20. </div>
  21. </div>
  22. </div>
  23. <grid-layout
  24. v-if="layout.length"
  25. :layout.sync="layout"
  26. :col-num="24"
  27. :row-height="30"
  28. :is-draggable="edit"
  29. :is-resizable="edit"
  30. :is-mirrored="false"
  31. :vertical-compact="true"
  32. :use-css-transforms="true"
  33. :margin="[10, 10]"
  34. @layout-updated="layoutUpdatedEvent"
  35. >
  36. <!-- :responsive="true"
  37. :breakpoints=" { lg: 1200, md: 996, sm: 768, xs: 480, xxs: 0 }"
  38. :cols="{ lg: 12, md: 10, sm: 6, xs: 4, xxs: 2 }" -->
  39. <grid-item
  40. v-for="(item,index) in layout"
  41. :x="item.x"
  42. :y="item.y"
  43. :w="item.w"
  44. :h="item.h"
  45. :i="item.i"
  46. :key="item.i"
  47. @resized="resizedEvent(item.i,item.key)"
  48. >
  49. <home-page-card
  50. :layoutData="item.data"
  51. :i="item.i"
  52. :key="item.key"
  53. :ref="item.i +'_'+ item.key"
  54. :edit="edit"
  55. @fn="compFn"
  56. >
  57. </home-page-card>
  58. </grid-item>
  59. </grid-layout>
  60. <div v-else class="empty-warp">
  61. <a-button type="dashed" icon="plus" @click="add">添加区块</a-button>
  62. <a-button type="dashed" icon="sync" @click="reset">恢复默认</a-button>
  63. </div>
  64. <home-page-modal ref="editVueGridLayoutModal" :layout="layout" @add="addGridItem" @delete="layoutItemDelete"></home-page-modal>
  65. </a-spin>
  66. </div>
  67. </template>
  68. <script>
  69. // 引入相关的依赖
  70. var testLayout = [
  71. { 'x': 0, 'y': 0, 'w': 18, 'h': 9, 'i': '0', 'data': { 'code': '', 'title': '我的任务', 'comp': 'MyTaskList', 'url': '/task/MyTaskList' }, 'key': '0' },
  72. { 'x': 0, 'y': 9, 'w': 18, 'h': 7, 'i': '3', 'data': { 'code': '', 'title': '我发起的流程', 'url': '/task/MyApplyProcessList', 'comp': 'MyApplyProcessList' }, 'key': '3' },
  73. { 'x': 0, 'y': 16, 'w': 18, 'h': 7, 'i': '2', 'data': { 'code': '', 'title': '系统通知', 'comp': 'Notice', 'url': '/isps/userAnnouncement' }, 'key': '2' },
  74. { 'x': 18, 'y': 9, 'w': 6, 'h': 14, 'i': '5', 'data': { 'code': '', 'title': '待办计划', 'url': '/pendingWork', 'comp': 'PendingWork' }, 'key': '5' }
  75. ]
  76. export default {
  77. name: 'HomePage',
  78. components: {
  79. },
  80. data() {
  81. return {
  82. layout: [],
  83. edit: false,
  84. firstItem: { 'x': 0, 'y': 0, 'w': 4, 'h': 7, 'i': '0' },
  85. url: {
  86. list: '/sys/sysHomePageLayout/getSysHomePageLayout',
  87. save: '/sys/sysHomePageLayout/edit',
  88. add: '/sys/sysHomePageLayout/add'
  89. },
  90. id: '',
  91. spinning: false
  92. }
  93. },
  94. watch: {
  95. $route(to) {
  96. if (to.fullPath === '/HomePage') {
  97. setTimeout(() => { // 解决tab页切换时 触发窗口切换事件 vue-grid-layout挤在一起bug 后期看看是否还有别的方式
  98. triggerWindowResizeEvent()
  99. }, 700)
  100. }
  101. }
  102. },
  103. created() {
  104. this.loadData()
  105. },
  106. // 方法集合
  107. methods: {
  108. loadData(parm) {
  109. this.spinning = true
  110. return postAction(this.url.list, parm || {}).then(res => {
  111. if (res.success) {
  112. this.layout = res.result.jsonData ? res.result.jsonData : []
  113. if (res.result.isDefaultLayout !== '1') {
  114. this.id = res.result.id
  115. }
  116. } else {
  117. this.$message.error(res.message)
  118. }
  119. this.spinning = false
  120. })
  121. },
  122. save(parm) {
  123. parm = Object.assign({ id: this.id }, parm)
  124. if (this.id) {
  125. putAction(this.url.save, parm || {}).then(res => {
  126. if (res.success) {
  127. this.id = res.result.id
  128. } else {
  129. this.$message.error(res.message)
  130. }
  131. })
  132. } else {
  133. postAction(this.url.add, parm || {}).then(res => {
  134. if (res.success) {
  135. this.id = res.result.id
  136. } else {
  137. this.$message.error(res.message)
  138. }
  139. })
  140. }
  141. },
  142. layoutUpdatedEvent(newLayout) { // 调用保存方法
  143. this.save({ layoutJson: JSON.stringify(newLayout) })
  144. },
  145. resizedEvent(i, key) { // 尺寸变化时 触发图形切换
  146. triggerWindowResizeEvent()
  147. },
  148. add() {
  149. this.$refs.editVueGridLayoutModal.editModalVisible = true
  150. },
  151. async reset() {
  152. // this.layout = [...testLayout]
  153. try {
  154. const res = await this.loadData({ 'isDefaultLayout': '1' })
  155. const res2 = await this.save({ layoutJson: JSON.stringify(this.layout) })
  156. } catch (err) {
  157. console.log(err)
  158. }
  159. },
  160. addGridItem(data, comp) { // 添加图表
  161. if (this.layout.length > 12) {
  162. this.$message.warning('最多只能添加12个区块')
  163. return false
  164. }
  165. let layout = {}
  166. if (this.layout.length === 0) {
  167. layout = { ...this.firstItem }
  168. } else {
  169. const lastLayout = this.layout[this.layout.length - 1]
  170. layout = {
  171. 'x': lastLayout.x >= 16 ? 0 : lastLayout.x + 8,
  172. 'y': lastLayout.x >= 16 ? lastLayout.y + 7 : lastLayout.y,
  173. 'w': 8,
  174. 'h': 7,
  175. 'i': (parseInt(this.layout[this.layout.length - 1].i) + 1).toString()
  176. }
  177. }
  178. layout.data = { ...data }
  179. layout.key = layout.i
  180. this.layout.push(layout)
  181. },
  182. layoutItemDelete(i) { // 删除图表
  183. this.layout = this.layout.filter(item => {
  184. return item.i !== i
  185. })
  186. },
  187. layoutItemRefresh(i) {
  188. this.layout.forEach(item => {
  189. if (item.i === i) {
  190. item.key = new Date().getTime()
  191. return false
  192. }
  193. })
  194. },
  195. handleEdit() {
  196. this.edit = !this.edit
  197. },
  198. handleMore() {
  199. this.$router.push({ path: this.layoutData.url })
  200. },
  201. compFn(type, data) {
  202. switch (type) {
  203. case 'delete':
  204. this.layoutItemDelete(data)
  205. break
  206. case 'add':
  207. this.add()
  208. break
  209. case 'refresh':
  210. this.layoutItemRefresh(data)
  211. break
  212. case 'edit':
  213. this.handleEdit()
  214. break
  215. case 'reset':
  216. this.reset()
  217. break
  218. }
  219. }
  220. }
  221. }
  222. </script>
  223. <style scoped>
  224. .empty-warp{
  225. height: 300px;
  226. width: 100%;
  227. background: white;
  228. text-align: center;
  229. margin: 10px;
  230. padding: 50px;
  231. }
  232. .empty-warp button{
  233. margin-right: 10px;
  234. }
  235. /* 头部添加面板区域 */
  236. .addPanel-position-box {
  237. position: sticky;
  238. top: 0px;
  239. z-index: 100;
  240. }
  241. .addPanel-container {
  242. height: 56px;
  243. display: flex;
  244. align-items: center;
  245. font-size: 14px;
  246. position: relative;
  247. background: #ebeef5;
  248. }
  249. .saveBtn-box {
  250. height: 100%;
  251. display: flex;
  252. justify-content: flex-end;
  253. align-items: center;
  254. position: absolute;
  255. right: 10px;
  256. }
  257. .saveBtn-box button{
  258. margin-right: 10px;
  259. }
  260. .panel-text-box {
  261. padding: 5px 10px;
  262. }
  263. .add-panel-box {
  264. padding: 5px 10px;
  265. cursor: pointer;
  266. }
  267. .add-panel-box:hover {
  268. background-color: rgba(0, 0, 0, 0.1);
  269. border-radius: 2px;
  270. color: #409eff;
  271. }
  272. .iconfont{
  273. font-size: 14px;
  274. }
  275. .icon-margin{
  276. margin-right:8px;
  277. }
  278. .icon-add{
  279. color: #40a9ff;
  280. }
  281. </style>