index.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. <template>
  2. <div class="container">
  3. <div class="left-pane">
  4. <el-input
  5. placeholder="请输入关键字"
  6. suffix-icon="el-icon-search"
  7. v-model="filterText"
  8. ></el-input>
  9. <div class="tree_container">
  10. <el-tree
  11. ref="tree"
  12. :data="list"
  13. :props="defaultProps"
  14. node-key="id"
  15. default-expand-all
  16. :filter-node-method="filterNode"
  17. @node-click="handleNodeClick"
  18. >
  19. <span slot-scope="{node, data}">
  20. <el-image :src="data.url"></el-image>
  21. <span style="padding-left: 10px; vertical-align: text-bottom;">{{ node.label }}</span>
  22. <span class="operate_btns">
  23. <dropdown
  24. v-if="data.children==undefined"
  25. :events="subMenuEvents"
  26. :data="{ node, data }"
  27. @itemClick="dropDownClick"
  28. ></dropdown>
  29. </span>
  30. </span>
  31. </el-tree>
  32. </div>
  33. <el-button
  34. class="createNewMessageType"
  35. @click="createNewMessage"
  36. >
  37. <i class="el-icon-s-order"></i>
  38. 新建消息模块
  39. </el-button>
  40. </div>
  41. <div class="right-pane">
  42. <commonMessage
  43. v-if="commonShow"
  44. v-bind="{selectedMessage:selectedMessage}"
  45. ></commonMessage>
  46. </div>
  47. <messageCreate
  48. ref="messageCreate"
  49. v-bind="{update:getMessageList}"
  50. ></messageCreate>
  51. </div>
  52. </template>
  53. <script>
  54. import commonMessage from "./commonMessage";
  55. import messageCreate from "./dialog/messageCreate";
  56. import dropdown from "@/components/Dropdown/index";
  57. import xiaoxi from "@/assets/tree/message/xiaoxi@2x.png";
  58. import api from "@/api/message/api";
  59. export default {
  60. components: {
  61. commonMessage,
  62. messageCreate,
  63. dropdown,
  64. },
  65. data() {
  66. return {
  67. commonShow: false,
  68. createSHow: false,
  69. remindShow: false,
  70. filterText: "",
  71. list: [],
  72. defaultProps: {
  73. children: "children",
  74. label: "label",
  75. },
  76. form: {},
  77. input: "",
  78. subMenuEvents: [{ label: "删除", funcName: "removeNode" }],
  79. selectedMessage: null,
  80. };
  81. },
  82. mounted() {
  83. this.getMessageList();
  84. },
  85. watch: {
  86. filterText(val) {
  87. this.$refs.tree.filter(val);
  88. },
  89. },
  90. methods: {
  91. filterNode(value, data) {
  92. if (!value) return true;
  93. return data.label.indexOf(value) !== -1;
  94. },
  95. createNewMessage() {
  96. this.$refs.messageCreate.dialogVisible = true;
  97. },
  98. handleNodeClick(data) {
  99. if (!data.children) {
  100. this.commonShow = true;
  101. this.selectedMessage = data;
  102. }
  103. },
  104. getMessageList() {
  105. api
  106. .getMessageList()
  107. .then((result) => {
  108. let arr = [];
  109. let index = 1;
  110. for (const key in result.data.data) {
  111. if (Object.hasOwnProperty.call(result.data.data, key)) {
  112. const element = result.data.data[key].map((item) => {
  113. item.url = xiaoxi;
  114. item.label = item.name;
  115. return item;
  116. });
  117. let obj = {
  118. id: index,
  119. label: key,
  120. url: xiaoxi,
  121. children: element,
  122. };
  123. arr.push(obj);
  124. index++;
  125. }
  126. }
  127. this.list = arr;
  128. })
  129. .catch((err) => {});
  130. },
  131. dropDownClick(eventType, data) {
  132. let that = this;
  133. switch (eventType) {
  134. case "removeNode":
  135. // 删除
  136. this.$confirm(
  137. "此操作将删除 " + data.data.label + " , 是否继续?",
  138. "提示",
  139. {
  140. confirmButtonText: "确定",
  141. cancelButtonText: "取消",
  142. type: "warning",
  143. }
  144. )
  145. .then(() => {
  146. const loading = this.$loading({
  147. lock: true,
  148. text: "删除中,请稍后!",
  149. spinner: "el-icon-loading",
  150. background: "rgba(0, 0, 0, 0.7)",
  151. customClass: "systemConfigLoading",
  152. });
  153. api
  154. .delMessage({
  155. message_id: data.data.id,
  156. })
  157. .then((result) => {
  158. loading.close();
  159. if (result.data.code == 0) {
  160. this.$message({
  161. type: "success",
  162. message: "删除成功!",
  163. });
  164. that.getMessageList();
  165. } else {
  166. this.$message({
  167. type: "error",
  168. message: "删除失败!",
  169. });
  170. }
  171. })
  172. .catch((err) => {
  173. loading.close();
  174. this.$message({
  175. type: "error",
  176. message: "删除失败!",
  177. });
  178. });
  179. })
  180. .catch(() => {
  181. this.$message({
  182. type: "info",
  183. message: "已取消删除",
  184. });
  185. });
  186. break;
  187. default:
  188. break;
  189. }
  190. },
  191. },
  192. };
  193. </script>
  194. <style lang="less" scoped>
  195. .container {
  196. position: relative;
  197. height: 100%;
  198. line-height: 20px;
  199. background-color: rgba(255, 255, 255, 1);
  200. color: rgba(16, 16, 16, 1);
  201. font-size: 14px;
  202. text-align: center;
  203. display: flex;
  204. box-shadow: 0px 0px 4px 0px rgba(0, 0, 0, 0.15);
  205. .left-pane {
  206. width: 300px;
  207. padding: 15px;
  208. height: calc(100% - 30px);
  209. .tree_container {
  210. height: calc(100% - 101px);
  211. margin-top: 10px;
  212. margin-bottom: 10px;
  213. overflow: hidden;
  214. overflow-y: auto;
  215. .el-tree {
  216. height: 100%;
  217. background-color: #fafafa;
  218. /deep/.el-tree-node__content {
  219. align-items: center;
  220. height: 30px;
  221. cursor: pointer;
  222. font-size: 16px;
  223. position: relative;
  224. color: #999999;
  225. padding-top: 10px;
  226. padding-left: 30px !important;
  227. .operate_btns {
  228. position: absolute;
  229. right: 20px;
  230. display: none;
  231. }
  232. &:hover,
  233. :focus-within {
  234. background-color: #f7fbff;
  235. .operate_btns {
  236. display: inline;
  237. }
  238. }
  239. }
  240. /deep/.el-tree-node__children {
  241. .el-tree-node__content {
  242. padding-left: 60px !important;
  243. }
  244. }
  245. }
  246. }
  247. .createNewMessageType {
  248. position: relative;
  249. width: 250px;
  250. text-align: center;
  251. font-size: 16px;
  252. color: #fff;
  253. background: #3da0d6;
  254. color: #fff;
  255. }
  256. }
  257. .right-pane {
  258. width: calc(100% - 330px);
  259. }
  260. }
  261. </style>