index.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <template>
  2. <!-- 图库框架 列表页 -->
  3. <div class="chart-frame-wrap">
  4. <span class="slide-icon slide-right" @click="slideHandle" v-show="isSlideLeft">
  5. <i class="el-icon-d-arrow-right"></i>
  6. </span>
  7. <div class="catalog-wrap page-block-wrap" id="catalog-left" v-show="!isSlideLeft">
  8. <span class="slide-icon slide-left" @click="slideHandle">
  9. <i class="el-icon-d-arrow-left"></i>
  10. </span>
  11. <span class="move-btn resize" v-drag id="resize"></span>
  12. <div class="btn-wrap">
  13. <el-button type="primary" @click="$router.push('/editframe')">添加框架</el-button>
  14. </div>
  15. <div class="search-wrap">
  16. <el-select style="width:100%"
  17. filterable remote
  18. placeholder="请输入框架名称"
  19. v-model="searchText"
  20. :remote-method="searchHandle"
  21. value-key="frameId"
  22. clearable
  23. >
  24. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  25. <el-option
  26. v-for="item in searchOptions"
  27. :key="item.frameId"
  28. :label="item.name"
  29. :value="item"
  30. />
  31. </el-select>
  32. </div>
  33. <div class="catalog-list">
  34. <div class="public-catalog">
  35. <p>公共框架</p>
  36. <div class="catalog-tree">
  37. <el-tree
  38. ref="catalogTree"
  39. class="catalog-tree other-tree"
  40. empty-text="暂无分类"
  41. :data="mockPublic"
  42. node-key="nodeKeyId"
  43. :expand-on-click-node="false"
  44. @current-change="(data,node)=>{nodeChange(data,node)}"
  45. >
  46. <span class="custom-tree-node" slot-scope="{ data,node }"
  47. >
  48. <span class="tree-label">{{ data.name }}</span>
  49. </span>
  50. </el-tree>
  51. </div>
  52. </div>
  53. <div class="my-list">
  54. <p>我的框架</p>
  55. <draggable
  56. v-model="mockFrameList"
  57. class="classify-ul"
  58. animation="300"
  59. tag="ul"
  60. @start="menuDragStart"
  61. @update="menuDragenter"
  62. @end="menuDragOver"
  63. >
  64. <li class="classify-item" :class="{'active':currentFrame.frameId===item.frameId}"
  65. v-for="item in mockFrameList" :key="item.frameId"
  66. @click="chooseFrame(item)"
  67. >
  68. <span>
  69. <img src="~@/assets/img/data_m/move_ico.png"
  70. alt="" class="move"
  71. style="width: 14px; height: 14px;"
  72. />
  73. </span>
  74. <span class="item-label text_oneLine">{{ item.name }}</span>
  75. <el-dropdown style="margin-right: 10px" @command="handleCommand" trigger="click">
  76. <span class="el-dropdown-link el-dropdown-link-img">
  77. <img class="icon" src="~@/assets/img/chart_m/Group.png" v-if="item.IsPublic === 0">
  78. <img class="icon" src="~@/assets/img/chart_m/User.png" v-else>
  79. </span>
  80. <el-dropdown-menu slot="dropdown">
  81. <el-dropdown-item
  82. :command="{key:'own'}"
  83. :class="item.IsPublic === 0 ? 'el-dropdown-menu-item-chat-act' : ''"
  84. class="el-dropdown-menu-item-chat"
  85. >
  86. <div style="display: flex;align-items: center;">
  87. <img v-if="item.IsPublic === 0" src="~@/assets/img/chart_m/Group_act.png">
  88. <img v-else src="~@/assets/img/chart_m/Group.png">
  89. <span style="margin-left:5px">仅自己可见</span>
  90. </div>
  91. </el-dropdown-item>
  92. <el-dropdown-item
  93. :command="{key:'public'}"
  94. :class="item.IsPublic === 1 ? 'el-dropdown-menu-item-chat-act' : ''"
  95. class="el-dropdown-menu-item-chat"
  96. >
  97. <div style="display: flex;align-items: center;">
  98. <img v-if="item.IsPublic === 1" src="~@/assets/img/chart_m/User_act.png">
  99. <img v-else src="~@/assets/img/chart_m/User.png">
  100. <span style="margin-left:5px">所有人可见</span>
  101. </div>
  102. </el-dropdown-item>
  103. </el-dropdown-menu>
  104. </el-dropdown>
  105. <el-dropdown @command="handleCommand" trigger="click">
  106. <span class="el-dropdown-link">
  107. <i class="el-icon-more" style="font-size: 16px;transform: rotate(90deg);cursor: pointer"/>
  108. </span>
  109. <el-dropdown-menu slot="dropdown">
  110. <el-dropdown-item v-if="permissionBtn.isShowBtn('myETAPermission','myChart_classifyOpt_rename')"
  111. :command="{key:'edit'}">重命名</el-dropdown-item>
  112. <el-dropdown-item v-if="permissionBtn.isShowBtn('myETAPermission','myChart_classifyOpt_delete')"
  113. :command="{key:'del'}">删除</el-dropdown-item>
  114. </el-dropdown-menu>
  115. </el-dropdown>
  116. </li>
  117. </draggable>
  118. </div>
  119. </div>
  120. </div>
  121. <div class="detail-wrap page-block-wrap" id="detail-right">
  122. <div class="empty" v-if="!currentFrame.frameId&&currentList.length===0">
  123. <tableNoData text="暂无数据"/>
  124. </div>
  125. <template v-else>
  126. <div class="list" v-if="model==='list'">
  127. <div class="list-item"
  128. v-for="item in currentList" :key="item.nodeKeyId"
  129. @click="changeModel('frame',item)"
  130. >
  131. <div class="item-title text_oneLine">
  132. <span>{{item.name}}</span>
  133. </div>
  134. <div style="height:1px;background:#ECECEC;margin:0 -10px;"></div>
  135. <div class="item-image"
  136. :style="`background-image:url(${item.CoverImg?item.CoverImg:require('@/assets/img/document_m/default-img.png')})`"></div>
  137. </div>
  138. <div class="empty" v-if="currentList.length===0">
  139. <tableNoData text="暂无数据"/>
  140. </div>
  141. </div>
  142. <div class="detail" v-else>
  143. <div class="top-info">
  144. <span>更新时间:{{currentFrame.updateTime}}</span>
  145. <span class="title text_oneLine">{{currentFrame.name}}</span>
  146. <div class="tool">
  147. <el-button type="text" @click="handleOption('edit',currentFrame)" v-if="frameType==='my'">编辑</el-button>
  148. <el-button type="text" @click="handleOption('copy',currentFrame)">复制图片</el-button>
  149. <el-button type="text" @click="handleOption('del',currentFrame)" style="color:red;"
  150. v-if="frameType==='my'">删除</el-button>
  151. </div>
  152. </div>
  153. <div class="frame-wrap"></div>
  154. </div>
  155. </template>
  156. </div>
  157. <!-- 重命名弹窗 -->
  158. <el-dialog
  159. title="重命名框架"
  160. :visible.sync="isRenameDialogShow"
  161. :close-on-click-modal="false"
  162. :modal-append-to-body="false"
  163. @close="isRenameDialogShow=false"
  164. width="589px"
  165. v-dialogDrag
  166. center
  167. >
  168. <div class="dialog-container">
  169. <div>
  170. <span style="margin-right:5px;">框架名称</span>
  171. <el-input v-model="modifyFrame.name" placeholder="请输入框架名称"></el-input>
  172. </div>
  173. </div>
  174. <div class="dialog-footer">
  175. <el-button @click="isRenameDialogShow=false">取消</el-button>
  176. <el-button type="primary" @click="renameFrame">确定</el-button>
  177. </div>
  178. </el-dialog>
  179. </div>
  180. </template>
  181. <script>
  182. import draggable from 'vuedraggable';
  183. export default {
  184. components:{draggable},
  185. directives: {
  186. drag(el, bindings) {
  187. el.onmousedown = function (e) {
  188. let init = e.clientX;
  189. let left = $('#catalog-left')[0];
  190. let initWidth = left.offsetWidth;
  191. document.onmousemove = function (e) {
  192. let end = e.clientX;
  193. let newWidth = end - init + initWidth;
  194. left.style.width = newWidth+'px';
  195. //reloadFrame()
  196. };
  197. document.onmouseup = function () {
  198. document.onmousemove = document.onmouseup = null;
  199. e.releaseCapture && e.releaseCapture();
  200. };
  201. e.setCapture && e.setCapture();
  202. return false;
  203. };
  204. },
  205. },
  206. data() {
  207. return {
  208. isSlideLeft:false,//控制左侧目录栏是否显示
  209. searchText:'',
  210. searchOptions:[],
  211. mockPublic:[
  212. {
  213. catalogId:1,
  214. name:'XXX的框架',
  215. nodeKeyId:1,
  216. children:[{
  217. frameId:1,
  218. name:'黄金稳住了吗?aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
  219. nodeKeyId:'1-1',
  220. updateTime:'2023/10/13'
  221. }]
  222. },
  223. {
  224. catalogId:2,
  225. name:'aaa的框架',
  226. nodeKeyId:2,
  227. children:[]
  228. }
  229. ],
  230. currentList:[],
  231. mockFrameList:[
  232. {
  233. frameId:2,
  234. name:'框架1',
  235. IsPublic:0,
  236. updateTime:'2023/10/10'
  237. },
  238. {
  239. frameId:3,
  240. name:'框架2',
  241. IsPublic:1,
  242. updateTime:'2023/10/11'
  243. }
  244. ],
  245. currentFrame:{},
  246. modifyFrame:{},
  247. isRenameDialogShow:false,
  248. model:'frame',
  249. frameType:'my'
  250. };
  251. },
  252. methods: {
  253. slideHandle(){
  254. this.isSlideLeft = !this.isSlideLeft;
  255. },
  256. getPublicList(){},
  257. getMyList(type){
  258. if(type!=='init') return
  259. //如果是其他页面跳转来的
  260. if(this.$route.query.frameId){
  261. this.currentFrame = this.mockFrameList.find(i=>i.frameId===Number(this.$route.query.frameId))||{}
  262. }else{
  263. //否则选择mockFrameList的第一个
  264. this.currentFrame = this.mockFrameList[0]||{}
  265. }
  266. },
  267. searchHandle(){},
  268. nodeChange(data,node){
  269. this.frameType = 'public'
  270. this.changeModel(node.level===2?'frame':'list',data)
  271. },
  272. changeModel(type,data){
  273. this.model = type
  274. if(type==='frame'){
  275. this.currentFrame = data
  276. }else{
  277. this.currentList = data.children||[]
  278. }
  279. },
  280. menuDragStart(){},
  281. menuDragenter(){},
  282. menuDragOver(){},
  283. handleCommand(command){
  284. if(command.key==='edit'){
  285. this.modifyFrame = _.cloneDeep(this.currentFrame)
  286. this.isRenameDialogShow = true
  287. }
  288. if(command.key==='del'){
  289. this.deleteFrame(this.currentFrame)
  290. }
  291. },
  292. chooseFrame(item){
  293. this.frameType = 'my'
  294. this.changeModel('frame',item)
  295. },
  296. handleOption(type,data){
  297. const optionMap = {
  298. 'edit':this.handleEditFrame,
  299. 'copy':this.copyFrame,
  300. 'del':this.deleteFrame,
  301. }
  302. optionMap[type](data)
  303. },
  304. handleEditFrame(data){
  305. this.$router.push({path:'/editframe',query:{frameId:data.frameId}})
  306. },
  307. copyFrame(data){},
  308. deleteFrame(data){
  309. this.$confirm("删除后不可恢复,确认删除吗?","提示",{
  310. confirmButtonText:"确定",
  311. cancelButtonText:"取消",
  312. type:"warning"
  313. }).then(()=>{
  314. //删除
  315. this.$message.success("删除成功")
  316. this.getPublicList()
  317. this.getMyList()
  318. }).catch(()=>{})
  319. },
  320. renameFrame(){
  321. //this.modifyFrame
  322. this.$message.success("编辑成功")
  323. this.isRenameDialogShow = false
  324. this.getPublicList()
  325. this.getMyList()
  326. }
  327. },
  328. mounted(){
  329. this.getPublicList()
  330. this.getMyList('init')
  331. }
  332. };
  333. </script>
  334. <style lang="scss">
  335. @import "./css/customTree.scss";
  336. </style>
  337. <style scoped lang="scss">
  338. @import "./css/basePage.scss";
  339. </style>