@kotori-bot/kotori-plugin-webui 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/{LICENSE → LICENSE.md} +674 -674
  2. package/dist/css/{307.17441c4b.css → 178.50389cc5.css} +1 -1
  3. package/dist/css/191.03157bbe.css +1 -0
  4. package/dist/css/373.0cce6c3e.css +1 -0
  5. package/dist/css/454.0d732bed.css +1 -0
  6. package/dist/css/47.49d67fd6.css +1 -0
  7. package/dist/css/5.b049cb20.css +1 -0
  8. package/dist/css/60.e08a7f71.css +1 -0
  9. package/dist/css/620.53b4f39d.css +1 -0
  10. package/dist/css/866.7bd164ea.css +1 -0
  11. package/dist/css/871.78adf960.css +1 -0
  12. package/dist/css/878.75469f9c.css +1 -0
  13. package/dist/css/974.14fe0cd3.css +1 -0
  14. package/dist/css/app.2339ed96.css +1 -0
  15. package/dist/css/chunk-vendors.9c1b0e0b.css +1 -0
  16. package/dist/fonts/iconfont.0785b652.eot +0 -0
  17. package/dist/fonts/iconfont.6cfc7ac2.woff +0 -0
  18. package/dist/fonts/iconfont.7f7c61f0.ttf +0 -0
  19. package/dist/fonts/iconfont.e5653996.woff2 +0 -0
  20. package/dist/img/addAvatar.5d18468f.svg +1 -0
  21. package/dist/img/favicon-gray.c2bacd13.svg +81 -0
  22. package/dist/img/iconfont.8017d8e3.svg +405 -0
  23. package/dist/img/removeAvatar.102a1309.svg +1 -0
  24. package/dist/index.html +1 -1
  25. package/dist/js/178.5506400e.js +2 -0
  26. package/dist/js/178.5506400e.js.map +1 -0
  27. package/dist/js/191.d1d8acb0.js +112 -0
  28. package/dist/js/191.d1d8acb0.js.map +1 -0
  29. package/dist/js/373.8f482efc.js +2 -0
  30. package/dist/js/373.8f482efc.js.map +1 -0
  31. package/dist/js/454.9fcb434d.js +2 -0
  32. package/dist/js/454.9fcb434d.js.map +1 -0
  33. package/dist/js/47.b880ff7d.js +2 -0
  34. package/dist/js/47.b880ff7d.js.map +1 -0
  35. package/dist/js/5.f818b113.js +2 -0
  36. package/dist/js/5.f818b113.js.map +1 -0
  37. package/dist/js/60.df7c62f1.js +2 -0
  38. package/dist/js/60.df7c62f1.js.map +1 -0
  39. package/dist/js/620.cc5f8280.js +2 -0
  40. package/dist/js/620.cc5f8280.js.map +1 -0
  41. package/dist/js/866.4506cf7d.js +2 -0
  42. package/dist/js/866.4506cf7d.js.map +1 -0
  43. package/dist/js/871.adcb95ca.js +2 -0
  44. package/dist/js/871.adcb95ca.js.map +1 -0
  45. package/dist/js/878.d5db5741.js +2 -0
  46. package/dist/js/878.d5db5741.js.map +1 -0
  47. package/dist/js/974.5d32785c.js +2 -0
  48. package/dist/js/974.5d32785c.js.map +1 -0
  49. package/dist/js/app.ff7f084b.js +2 -0
  50. package/dist/js/app.ff7f084b.js.map +1 -0
  51. package/dist/js/chunk-vendors.b2a9455e.js +77 -0
  52. package/dist/js/chunk-vendors.b2a9455e.js.map +1 -0
  53. package/lib/index.js +12 -14
  54. package/lib/plugin/index.js +8 -10
  55. package/lib/routers/api/accounts.d.ts +1 -1
  56. package/lib/routers/api/accounts.js +8 -10
  57. package/lib/routers/api/config.d.ts +1 -1
  58. package/lib/routers/api/config.js +8 -10
  59. package/lib/routers/api/data.d.ts +1 -1
  60. package/lib/routers/api/data.js +8 -10
  61. package/lib/routers/api/demo.d.ts +1 -1
  62. package/lib/routers/api/demo.js +8 -10
  63. package/lib/routers/index.d.ts +1 -1
  64. package/lib/routers/index.js +8 -10
  65. package/lib/routers/router.js +8 -10
  66. package/lib/service/index.d.ts +19 -30
  67. package/lib/service/index.js +8 -10
  68. package/lib/types/index.js +8 -10
  69. package/lib/utils/autoSave.js +8 -10
  70. package/lib/utils/common.js +8 -10
  71. package/lib/utils/observer.js +8 -10
  72. package/lib/utils/transport.js +8 -10
  73. package/lib/ws/index.js +8 -10
  74. package/package.json +2 -2
  75. package/dist/css/157.4f26d8f6.css +0 -1
  76. package/dist/css/398.68e1d5c0.css +0 -1
  77. package/dist/css/501.9015c7b8.css +0 -1
  78. package/dist/css/61.c4036428.css +0 -1
  79. package/dist/css/677.1f6dda12.css +0 -1
  80. package/dist/css/805.47c05599.css +0 -1
  81. package/dist/css/859.a4c60906.css +0 -1
  82. package/dist/css/879.594eeca0.css +0 -1
  83. package/dist/css/988.a57fcb7a.css +0 -1
  84. package/dist/css/app.8629041a.css +0 -1
  85. package/dist/css/chunk-vendors.8f724415.css +0 -1
  86. package/dist/js/157.b3b7776c.js +0 -112
  87. package/dist/js/157.b3b7776c.js.map +0 -1
  88. package/dist/js/307.5dcc1e5b.js +0 -2
  89. package/dist/js/307.5dcc1e5b.js.map +0 -1
  90. package/dist/js/398.5a1256fe.js +0 -2
  91. package/dist/js/398.5a1256fe.js.map +0 -1
  92. package/dist/js/501.2cce9c69.js +0 -2
  93. package/dist/js/501.2cce9c69.js.map +0 -1
  94. package/dist/js/61.b1925deb.js +0 -2
  95. package/dist/js/61.b1925deb.js.map +0 -1
  96. package/dist/js/677.17ed8bda.js +0 -2
  97. package/dist/js/677.17ed8bda.js.map +0 -1
  98. package/dist/js/805.635a82e6.js +0 -2
  99. package/dist/js/805.635a82e6.js.map +0 -1
  100. package/dist/js/859.740917f5.js +0 -2
  101. package/dist/js/859.740917f5.js.map +0 -1
  102. package/dist/js/879.c08f48f3.js +0 -2
  103. package/dist/js/879.c08f48f3.js.map +0 -1
  104. package/dist/js/988.6ab22bc8.js +0 -2
  105. package/dist/js/988.6ab22bc8.js.map +0 -1
  106. package/dist/js/app.4afe7ee6.js +0 -2
  107. package/dist/js/app.4afe7ee6.js.map +0 -1
  108. package/dist/js/chunk-vendors.74ce961b.js +0 -75
  109. package/dist/js/chunk-vendors.74ce961b.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/5.f818b113.js","mappings":"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","sources":["webpack://kams/./src/components/layout/aside.vue","webpack://kams/src/components/layout/aside.vue","webpack://kams/./src/components/layout/aside.vue?e6ba","webpack://kams/./src/components/layout/aside.vue?55c2","webpack://kams/./src/components/layout/container.vue","webpack://kams/src/components/layout/container.vue","webpack://kams/./src/components/layout/container.vue?8825","webpack://kams/./src/components/layout/container.vue?497a","webpack://kams/./src/components/menus/index.vue","webpack://kams/src/components/menus/index.vue","webpack://kams/./src/components/menus/index.vue?1108","webpack://kams/./src/components/menus/index.vue?581e","webpack://kams/./src/components/menus/menu-item.vue","webpack://kams/src/components/menus/menu-item.vue","webpack://kams/./src/components/menus/menu-item.vue?3887","webpack://kams/./src/components/menus/menu-item.vue?866e","webpack://kams/./src/views/sandBox/index.vue","webpack://kams/./src/utils/sandBox/group/index.js","webpack://kams/./node_modules/nanoid/url-alphabet/index.js","webpack://kams/./node_modules/nanoid/index.browser.js","webpack://kams/./src/utils/sandBox/user/index.js","webpack://kams/./src/utils/sandBox/administrators/index.js","webpack://kams/./src/views/sandBox/aside/left.vue","webpack://kams/./src/views/sandBox/aside/tab/tab.vue","webpack://kams/src/views/sandBox/aside/tab/tab.vue","webpack://kams/./src/views/sandBox/aside/tab/tab.vue?2900","webpack://kams/./src/views/sandBox/aside/tab/tab.vue?cb0c","webpack://kams/./src/views/sandBox/ui/grayButton.vue","webpack://kams/src/views/sandBox/ui/grayButton.vue","webpack://kams/./src/views/sandBox/ui/grayButton.vue?a6bb","webpack://kams/./src/views/sandBox/ui/grayButton.vue?484b","webpack://kams/./src/utils/formatTimeStamp.js","webpack://kams/src/views/sandBox/aside/left.vue","webpack://kams/./src/views/sandBox/aside/left.vue?6eee","webpack://kams/./src/views/sandBox/aside/left.vue?a3e1","webpack://kams/./src/views/sandBox/aside/right.vue","webpack://kams/./src/utils/sandBox/permissionService.js","webpack://kams/src/views/sandBox/aside/right.vue","webpack://kams/./src/views/sandBox/aside/right.vue?0c61","webpack://kams/./src/views/sandBox/aside/right.vue?db58","webpack://kams/./src/views/sandBox/main/chat.vue","webpack://kams/./src/views/sandBox/main/message.vue","webpack://kams/src/views/sandBox/main/message.vue","webpack://kams/./src/views/sandBox/main/message.vue?8fb4","webpack://kams/./src/views/sandBox/main/message.vue?4e13","webpack://kams/src/views/sandBox/main/chat.vue","webpack://kams/./src/views/sandBox/main/chat.vue?e37e","webpack://kams/./src/views/sandBox/main/chat.vue?eb4d","webpack://kams/src/views/sandBox/index.vue","webpack://kams/./src/views/sandBox/index.vue?f7e6","webpack://kams/./src/views/sandBox/index.vue?d1e0","webpack://kams/./src/mixin/index.js"],"sourcesContent":["var render = function render(){var _vm=this,_c=_vm._self._c;return _c('aside',{ref:\"aside\",staticClass:\"k-sb-aside k-aside\"},[_c('div',{staticClass:\"k-aside-default\"},[_vm._t(\"default\")],2),_c('div',{staticClass:\"k-aside-inner\"},[_vm._t(\"inner\")],2)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <aside ref=\"aside\" class=\"k-sb-aside k-aside\">\r\n <div class=\"k-aside-default\">\r\n <slot></slot>\r\n </div>\r\n <div class=\"k-aside-inner\">\r\n <slot name=\"inner\"></slot>\r\n </div>\r\n </aside>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: 'k-sb-aside'\r\n};\r\n</script>\r\n\r\n<style lang=\"less\">\r\n.k-aside {\r\n display: flex;\r\n flex-direction: column;\r\n background: #fff;\r\n box-sizing: border-box;\r\n height: 100%;\r\n}\r\n.k-aside-inner {\r\n overflow: auto;\r\n box-sizing: border-box;\r\n\r\n &::-webkit-scrollbar {\r\n width: 5px; // 设置滚动条的宽度\r\n height: 0;\r\n }\r\n &::-webkit-scrollbar-track {\r\n background: transparent;\r\n width: 0px;\r\n height: 0;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n position: absolute;\r\n right: -10px;\r\n // width: 0px;\r\n border-radius: 6px;\r\n background-color: #8888881a;\r\n }\r\n &::-webkit-scrollbar-thumb:hover {\r\n background: #88888833; // 鼠标悬停时滚动条的颜色\r\n }\r\n}\r\n</style>\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./aside.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./aside.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./aside.vue?vue&type=template&id=d3871a34\"\nimport script from \"./aside.vue?vue&type=script&lang=js\"\nexport * from \"./aside.vue?vue&type=script&lang=js\"\nimport style0 from \"./aside.vue?vue&type=style&index=0&id=d3871a34&prod&lang=less\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('section',{staticClass:\"k-container\",class:`k-container-${_vm.direction}`},[_vm._t(\"default\")],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <section :class=\"`k-container-${direction}`\" class=\"k-container\">\r\n <slot></slot>\r\n </section>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: 'k-container',\r\n props: {\r\n direction: {\r\n type: String,\r\n default: 'horizontal'\r\n }\r\n },\r\n computed: {}\r\n};\r\n</script>\r\n\r\n<style>\r\n.k-container-horizontal {\r\n display: flex;\r\n flex-direction: row;\r\n}\r\n.k-container-vertical {\r\n display: flex;\r\n flex-direction: column;\r\n}\r\n</style>\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./container.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./container.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./container.vue?vue&type=template&id=ab070982\"\nimport script from \"./container.vue?vue&type=script&lang=js\"\nexport * from \"./container.vue?vue&type=script&lang=js\"\nimport style0 from \"./container.vue?vue&type=style&index=0&id=ab070982&prod&lang=css\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('ul',{staticClass:\"k-menu\",style:({\n flexDirection: this.mode\n })},[_vm._t(\"default\")],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <ul\r\n class=\"k-menu\"\r\n :style=\"{\r\n flexDirection: this.mode\r\n }\"\r\n >\r\n <slot></slot>\r\n </ul>\r\n</template>\r\n\r\n<script>\r\nimport Vue from 'vue';\r\nexport default {\r\n name: 'k-menu',\r\n data() {\r\n return {\r\n activeIndex: this.defaultActive\r\n };\r\n },\r\n provide() {\r\n return {\r\n root: this\r\n };\r\n },\r\n props: {\r\n activeColor: {\r\n type: String\r\n },\r\n activeShape: {\r\n type: Array,\r\n default() {\r\n return [];\r\n }\r\n },\r\n backgroundColor: {\r\n type: String\r\n },\r\n textColor: {},\r\n mode: {\r\n type: String,\r\n default() {\r\n return 'column';\r\n }\r\n },\r\n defaultActive: {\r\n type: String\r\n },\r\n router: {\r\n type: Boolean\r\n }\r\n },\r\n methods: {\r\n changeRouteFn(path) {\r\n if (this.router) {\r\n this.$router.push(path);\r\n }\r\n this.activeIndex = path;\r\n }\r\n },\r\n computed: {\r\n rootMenu() {\r\n return {\r\n activeColor: this.activeColor,\r\n backgroundColor: this.backgroundColor,\r\n activeIndex: this.defaultActive\r\n };\r\n }\r\n },\r\n watch: {\r\n defaultActive(val) {\r\n this.activeIndex = val;\r\n }\r\n },\r\n beforeCreate() {\r\n this.$bus = new Vue();\r\n },\r\n mounted() {\r\n this.$bus.$on('changeRoute', this.changeRouteFn);\r\n },\r\n beforeDestroy() {\r\n this.$bus.$off('changeRoute', this.changeRouteFn);\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"less\" scoped>\r\n.k-menu {\r\n display: flex;\r\n list-style: none;\r\n // overflow-x: auto;\r\n height: auto;\r\n\r\n &::-webkit-scrollbar {\r\n width: 0px; // 设置滚动条的宽度\r\n height: 0;\r\n }\r\n &::-webkit-scrollbar-track {\r\n background: transparent;\r\n width: 0px;\r\n height: 0;\r\n }\r\n &::-webkit-scrollbar-thumb {\r\n position: absolute;\r\n width: 0px;\r\n border-radius: 6px;\r\n background-color: #8888881a;\r\n }\r\n &::-webkit-scrollbar-thumb:hover {\r\n background: #88888829; // 鼠标悬停时滚动条的颜色\r\n }\r\n}\r\n</style>\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=8321ac56&scoped=true\"\nimport script from \"./index.vue?vue&type=script&lang=js\"\nexport * from \"./index.vue?vue&type=script&lang=js\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=8321ac56&prod&lang=less&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"8321ac56\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('el-tooltip',{ref:\"tooltip\",staticClass:\"item\",attrs:{\"disabled\":!_vm.tips,\"effect\":\"dark\",\"content\":_vm.title,\"placement\":\"right\",\"manual\":\"\"}},[_c('li',{staticClass:\"k-menu-item\",class:[{ className: _vm.className }, { active: _vm.active }, _vm.direction],style:([\n _vm.itemStyle,\n { height: `${_vm.height}px`, minHeight: `${_vm.height}px` },\n { justifyContent: _vm.align }\n ]),on:{\"mouseenter\":_vm.onmouseenterFn,\"mouseleave\":_vm.onMouseLeaveFn,\"click\":_vm.handleClickFn}},[(_vm.activeShape.includes('line'))?[_c('transition',{attrs:{\"appear\":\"\",\"name\":\"appear\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.active),expression:\"active\"}],staticClass:\"current-shape line\",style:({ background: _vm.root.activeColor })})])]:_vm._e(),(_vm.activeShape.includes('circle'))?[_c('transition',{attrs:{\"appear\":\"\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.active),expression:\"active\"}],staticClass:\"current-shape circle\",style:(_vm.circleStyle)})])]:_vm._e(),_vm._t(\"default\")],2)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <el-tooltip\r\n :disabled=\"!tips\"\r\n ref=\"tooltip\"\r\n class=\"item\"\r\n effect=\"dark\"\r\n :content=\"title\"\r\n placement=\"right\"\r\n manual\r\n >\r\n <li\r\n class=\"k-menu-item\"\r\n :class=\"[{ className }, { active }, direction]\"\r\n :style=\"[\r\n itemStyle,\r\n { height: `${height}px`, minHeight: `${height}px` },\r\n { justifyContent: align }\r\n ]\"\r\n @mouseenter=\"onmouseenterFn\"\r\n @mouseleave=\"onMouseLeaveFn\"\r\n @click=\"handleClickFn\"\r\n >\r\n <template v-if=\"activeShape.includes('line')\">\r\n <transition appear name=\"appear\">\r\n <div\r\n v-show=\"active\"\r\n class=\"current-shape line\"\r\n :style=\"{ background: root.activeColor }\"\r\n ></div>\r\n </transition>\r\n </template>\r\n <template v-if=\"activeShape.includes('circle')\">\r\n <transition appear>\r\n <div v-show=\"active\" class=\"current-shape circle\" :style=\"circleStyle\"></div>\r\n </transition>\r\n </template>\r\n <slot></slot>\r\n </li>\r\n </el-tooltip>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: 'k-menu-item',\r\n data() {\r\n return {\r\n activeColor: this.root.activeColor\r\n };\r\n },\r\n inject: ['root'],\r\n methods: {\r\n onmouseenterFn() {\r\n this.$el.style.backgroundColor = this.root.backgroundColor;\r\n this.handleTooltipFn(true);\r\n },\r\n onMouseLeaveFn() {\r\n if (this.activeShape.includes('background') && this.active) return;\r\n this.$el.style.backgroundColor = '';\r\n this.handleTooltipFn(false);\r\n },\r\n handleClickFn() {\r\n this.root.$bus.$emit('changeRoute', this.index);\r\n this.$emit('click', this);\r\n this.root.$emit('select', this);\r\n },\r\n handleTooltipFn(isShow) {\r\n this.$refs.tooltip.showPopper = isShow;\r\n }\r\n },\r\n computed: {\r\n active() {\r\n if (!this.root.router) return this.root.activeIndex === this.index;\r\n const activeArr = this.root.activeIndex.split('/');\r\n const indexArr = this.index.split('/');\r\n return activeArr.includes(indexArr[1]);\r\n },\r\n itemStyle() {\r\n const style = {\r\n color: this.active ? this.root.activeColor : this.root.textColor,\r\n borderLeftColor: this.active ? this.root.activeColor : this.root.textColor,\r\n backgroundColor: ''\r\n };\r\n if (this.activeShape.includes('background')) {\r\n style.backgroundColor = this.active ? this.root.backgroundColor : '';\r\n }\r\n return style;\r\n },\r\n circleStyle() {\r\n return {\r\n border: `3px solid ${this.root.activeColor}`,\r\n filter: `drop-shadow(0 0 4px ${this.root.activeColor})`\r\n };\r\n },\r\n activeShape() {\r\n return this.root.activeShape;\r\n },\r\n tips() {\r\n if (this.title) return true;\r\n return false;\r\n },\r\n direction() {\r\n return `k-menu-item-${this.root.mode}`;\r\n }\r\n },\r\n beforeMount() {},\r\n mounted() {},\r\n props: {\r\n icon: {\r\n type: String,\r\n default() {\r\n return '';\r\n }\r\n },\r\n index: {\r\n type: String\r\n },\r\n title: {\r\n type: String\r\n },\r\n width: {\r\n type: String,\r\n default() {\r\n return '70';\r\n }\r\n },\r\n height: {\r\n type: String,\r\n default() {\r\n return '70';\r\n }\r\n },\r\n className: {\r\n type: String,\r\n default() {\r\n return '';\r\n }\r\n },\r\n align: {\r\n type: String,\r\n default() {\r\n return 'center';\r\n }\r\n }\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"less\" scoped>\r\n.k-menu-item {\r\n display: flex;\r\n position: relative;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n max-width: 500px;\r\n // text-align: center;\r\n list-style-type: none;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n user-select: none;\r\n\r\n .line {\r\n position: absolute;\r\n left: 0;\r\n height: 70%;\r\n width: 4px;\r\n border-radius: 0 8px 8px 0;\r\n }\r\n\r\n .circle {\r\n position: absolute;\r\n margin: 0 auto;\r\n height: 77%;\r\n width: 77%;\r\n border-radius: 50%;\r\n z-index: 1;\r\n }\r\n}\r\n.k-menu-item-row + .k-menu-item-row {\r\n margin-inline-start: 10px;\r\n}\r\n\r\n.k-menu-item-column + .k-menu-item-column {\r\n margin-block-start: 10px;\r\n}\r\n\r\n.current-shape {\r\n pointer-events: none;\r\n}\r\n\r\n/* 进入的起点、离开的终点 */\r\n.appear-enter,\r\n.appear-leave-to {\r\n // transform: scaleY(0);\r\n transform: translateX(-100%);\r\n}\r\n.appear-enter-active,\r\n.appear-leave-active {\r\n transition: 0.2s ease;\r\n}\r\n/* 进入的终点、离开的起点 */\r\n.appear-enter-to,\r\n.appear-leave {\r\n // transform: scaleY(1);\r\n transform: translateX(0);\r\n}\r\n</style>\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./menu-item.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./menu-item.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./menu-item.vue?vue&type=template&id=dbebb810&scoped=true\"\nimport script from \"./menu-item.vue?vue&type=script&lang=js\"\nexport * from \"./menu-item.vue?vue&type=script&lang=js\"\nimport style0 from \"./menu-item.vue?vue&type=style&index=0&id=dbebb810&prod&lang=less&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"dbebb810\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('k-container',{directives:[{name:\"loading\",rawName:\"v-loading\",value:(0),expression:\"0\"}],staticClass:\"k-sb-container\",attrs:{\"direction\":\"horizontal\"}},[_c('sb-left-aside',{ref:\"leftAsideRef\",attrs:{\"updateChatTarget\":_vm.updateChatTargetFn,\"updateCollapseMsg\":_vm.updateCollapseMsgFn},on:{\"switchMsg\":_vm.switchMsgCallback,\"handleMenuAction\":_vm.handleMenuAction}}),_c('k-container',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.show.isShowChatBox),expression:\"show.isShowChatBox\"}],staticClass:\"k-sb-main\",attrs:{\"direction\":\"vertical\"}},[_c('header',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.show.isShowChatBox),expression:\"show.isShowChatBox\"}],staticClass:\"k-chat-header\"},[_c('gray-button',{directives:[{name:\"show\",rawName:\"v-show\",value:(!_vm.show.isCollapseMsg),expression:\"!show.isCollapseMsg\"}],staticClass:\"icon-btn\",nativeOn:{\"click\":function($event){return _vm.collapseMsghandler()}}},[_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":\"展开消息列表\",\"placement\":\"right\"}},[_c('pps-icon',{attrs:{\"icon\":\"pps-icon-side-hide\"}})],1)],1),_c('div',{staticClass:\"k-chat-header-content\"},[_c('h1',{staticClass:\"k-chat-header-title\"},[_vm._v(_vm._s(_vm.chatTarget.name)+_vm._s(_vm.getGroupMemberLength))])]),_c('gray-button',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.chatTarget.isGroup),expression:\"chatTarget.isGroup\"}],staticClass:\"showGroupInfo\",nativeOn:{\"click\":function($event){return _vm.collapseRighthandler()}}},[_c('i',{staticClass:\"el-icon-more\"})])],1),_c('k-container',{staticClass:\"k-chat-main\",attrs:{\"direction\":\"horizontal\"}},[_c('sb-chat-main',{ref:\"chatMainRef\",attrs:{\"chatTarget\":_vm.chatTarget,\"memberList\":_vm.getMemberList},on:{\"handleMenuAction\":_vm.handleMenuAction}}),(_vm.chatTarget.isGroup)?_c('sb-right-aside',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.show.isCollapseRight),expression:\"show.isCollapseRight\"}],attrs:{\"chatTarget\":_vm.chatTarget,\"memberList\":_vm.getMemberList},on:{\"handleMenuAction\":_vm.handleMenuAction}}):_vm._e(),(_vm.chatTarget.isGroup)?_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isShowRightMask),expression:\"isShowRightMask\"}],staticClass:\"mask\",on:{\"click\":function($event){return _vm.collapseRighthandler()}}}):_vm._e()],1)],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import store from '@/store';\r\n// 群组类\r\n/**\r\n * @description: 群组类\r\n * @param {*} name 群名\r\n * @param {*} id 群号\r\n * @param {*} lord 群主id\r\n * @param {*} avatar 群头像\r\n */\r\nexport default class Group {\r\n constructor({ name, numId, id, lord, avatar }) {\r\n this.id = id || `group-${numId}`;\r\n this.numId = numId || this.self().numId;\r\n this.name = name || this.self().name;\r\n this.lord = lord || this.self().lord;\r\n this.avatar = avatar || `https://k.hotaru.icu/api/data/avatar/${name}`;\r\n this.admins = this.self().admins || [];\r\n this.members = this.self().members || [];\r\n }\r\n\r\n mount() {\r\n store.commit('sandBox/ADD_GROUP', this);\r\n store.commit('sandBox/CREATE_GROUP_MESSAGE', this);\r\n return this;\r\n }\r\n\r\n getAllMember() {\r\n return this.self().members.map(({ id, role }) => {\r\n const user = store.getters['sandBox/getUserById'](id);\r\n return { ...user, role };\r\n });\r\n }\r\n\r\n getMemberById(id) {\r\n return this.getAllMember().find((member) => member.id === id) || null;\r\n }\r\n\r\n getAllMessage() {\r\n return store.getters['sandBox/getGroupMessage'](this.id);\r\n }\r\n\r\n addMember({ uid, role }) {\r\n store.commit('sandBox/ADD_MEMBER', { gid: this.id, uid, role });\r\n }\r\n\r\n removeMember(id) {\r\n store.commit('sandBox/REMOVE_MEMBER', { gid: this.id, uid: id });\r\n }\r\n\r\n self() {\r\n return store.getters['sandBox/getGroupById'](this.id);\r\n }\r\n}\r\n","export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","import { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array(size))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","import Group from '../group';\r\nimport store from '@/store';\r\nimport { nanoid } from 'nanoid';\r\n\r\nconst ROLE_SELF = 'self';\r\nconst ROLE_FRIEND = 'friend';\r\n// 用户类\r\n/**\r\n * @description: 用户类\r\n * @param {*} param0 { numId:用户id, name:用户名, age:年龄, sex:性别, avatar:头像 }\r\n */\r\nexport default class User {\r\n constructor({ numId, name, age, sex, avatar, id }) {\r\n this.name = name || this.self().name;\r\n this.id = id || `user-${numId}`;\r\n this.numId = numId || this.self().numId;\r\n this.age = age || this.self().age;\r\n this.sex = sex || this.self().sex;\r\n\r\n // 计算用户头像码\r\n this.order = this.self().order || store.state.sandBox.registeredUsersCount;\r\n const avatar_code = this.order * 10 ** (this.order % 2) * 10;\r\n\r\n this.avatar = avatar || `https://picsum.photos/id/${avatar_code}/50/50`;\r\n this.groups = this.self().groups || [];\r\n this.friends = this.self().friends || [];\r\n }\r\n\r\n /**\r\n * 挂载用户\r\n * @returns 用户对象\r\n */\r\n mount() {\r\n const hasUser = store.getters['sandBox/getUserById'](this.id);\r\n if (hasUser) return false;\r\n store.commit('sandBox/ADD_USER', this);\r\n store.commit('sandBox/CREATE_PRIVATE_MESSAGE', this.id);\r\n this.addFriend('user-super-admin');\r\n return this;\r\n }\r\n\r\n /**\r\n * 获取好友列表\r\n * @returns 对象数组\r\n */\r\n getAllFriend() {\r\n return this.self().friends;\r\n }\r\n\r\n /**\r\n * 获取群组列表\r\n * @returns 群组列表\r\n */\r\n getAllGroups() {\r\n const g_list = this.self().groups.map(({ id }) => id);\r\n const all_groups = g_list.map((gid) => {\r\n return store.getters['sandBox/getGroupById'](gid);\r\n });\r\n return all_groups;\r\n }\r\n\r\n /**\r\n * 通过群组id获取群组信息\r\n * @param {*} id 群组id\r\n * @returns 群组信息\r\n */\r\n getGroupById(groupId) {\r\n const hasGroup = this.self().groups.some(({ id }) => id === groupId);\r\n return hasGroup && store.getters['sandBox/getGroupById'](groupId);\r\n }\r\n\r\n /**\r\n * 添加好友\r\n * @param {*} fid 好友id\r\n */\r\n addFriend(fid) {\r\n const friend = store.getters['sandBox/getUserById'](fid);\r\n const hasFriend = this.self().friends?.some((friendItem) => friendItem.id === fid);\r\n if (!friend || hasFriend || fid === this.id) return false;\r\n store.commit('sandBox/ADD_FRIEND', { fid, id: this.id });\r\n store.commit('sandBox/INIT_PRIVATE_MESSAGE', { id: this.id, fid });\r\n this.sendMessageToFriend({\r\n id: fid,\r\n content: '我们已成功添加为好友,现在可以开始聊天啦~'\r\n });\r\n this.receiveAddFriend(friend);\r\n return true;\r\n }\r\n\r\n receiveAddFriend(friend) {\r\n store.commit('sandBox/ADD_FRIEND', { fid: this.id, id: friend.id });\r\n const frdMsg = store.getters['sandBox/getPrivateMessage'](friend.id);\r\n if (!Reflect.has(frdMsg, this.id)) {\r\n store.commit('sandBox/INIT_PRIVATE_MESSAGE', { id: friend.id, fid: this.id });\r\n console.log(`${this.self().name}已添加到${friend.name}的好友列表中`);\r\n }\r\n }\r\n\r\n /**\r\n * 删除好友\r\n * @param {*} friendId 好友id\r\n */\r\n removeFriendById(fid) {\r\n const res = this.deleteFriendMessage(fid);\r\n if (!res) console.log('删除信息失败');\r\n const delRes1 = store.commit('sandBox/REMOVE_FRIEND', { fid, id: this.self().id });\r\n store.commit('sandBox/REMOVE_FRIEND', { fid: this.self().id, id: fid });\r\n console.log(delRes1);\r\n return true;\r\n }\r\n\r\n /**\r\n * 创建群组\r\n * @param {*} { id: 群组id, name: 群组名称, members: 邀请成员列表, avatar: 群组头像 }\r\n * @returns 群组对象\r\n */\r\n createGroup({ id, name, members, avatar }) {\r\n if (!id && !name) return false;\r\n const gid = `group-${id}`;\r\n const normalizeMembers = this._memberNormalize(members);\r\n const hasGroup = this.getGroupById(gid);\r\n if (hasGroup) return false;\r\n const group = new Group({ name, numId: id, lord: this.id, avatar }).mount();\r\n normalizeMembers.forEach(async (member) => {\r\n const mid = member.id;\r\n const hasUser = this.getUserById(mid);\r\n if (!hasUser) return console.log(`用户${mid}不存在`);\r\n const role = mid === this.id ? 'lord' : 'member';\r\n group.addMember({ uid: member.id, role });\r\n });\r\n group.addMember({ uid: this.id, role: 'lord' });\r\n group.addMember({ uid: 'user-super-admin', role: 'super-admin' });\r\n return group;\r\n }\r\n\r\n /**\r\n * 删除群组\r\n * @param {*} gid 群组id\r\n */\r\n removeGroupById(gid) {\r\n const group = store.getters['sandBox/getGroupById'](gid);\r\n if (!group) return false;\r\n const isLord = group.lord === this.id || this.self().isSuper;\r\n if (!isLord) return false;\r\n\r\n store.commit('sandBox/CLEAR_GROUP_MESSAGE', gid);\r\n store.commit('sandBox/REMOVE_GROUP', gid);\r\n return true;\r\n }\r\n\r\n /**\r\n * 加入群组\r\n * @param {*} gid 群组id\r\n */\r\n addGroupById(gid) {\r\n const group = new Group({ id: gid });\r\n const hasGroup = group.self();\r\n if (!hasGroup) return errorLogFn('User: 群组不存在');\r\n const hasMember = group.getAllMember().some((member) => member.id === this.id);\r\n if (hasMember) return errorLogFn('User: 群组已加入');\r\n group.addMember({ uid: this.id, role: 'member' });\r\n return true;\r\n }\r\n\r\n /**\r\n * 邀请用户加入群组\r\n * @param {*} param0 { groupId:群组id, invitee:被邀请人id }\r\n */\r\n inviteUserToGroup({ groupId, invitee }) {\r\n const group = new Group({ id: groupId });\r\n const hasGroup = group.self();\r\n const normalizeInvitee = this._memberNormalize(invitee);\r\n const hasSelf = group.getMemberById(this.id);\r\n if (!hasGroup || !hasSelf) return errorLogFn('User: 群组不存在或您不是群主');\r\n normalizeInvitee.forEach((invitee) => {\r\n const hasMember = group.getMemberById(invitee.id);\r\n if (hasMember) return errorLogFn('User: 该用户已加入群组');\r\n group.addMember({ uid: invitee.id, role: 'member' });\r\n });\r\n return true;\r\n }\r\n\r\n /**\r\n * 离开群组\r\n * @param {*} gid 群组id\r\n */\r\n leaveGroupById(gid) {\r\n const group = store.getters['sandBox/getGroupById'](gid);\r\n if (!group) return false;\r\n store.commit('sandBox/REMOVE_MEMBER', { gid, mid: this.self().id });\r\n return true;\r\n }\r\n\r\n /**\r\n * 踢出群成员\r\n * @param {*} param0 { groupId:群组id, expellee:被踢人id }\r\n */\r\n kickMemberById({ groupId, expellee }) {\r\n const group = store.getters['sandBox/getGroupById'](groupId);\r\n const exp = group.members.some((m) => m.id === expellee);\r\n if (!group || !exp || expellee === this.id) return errorLogFn('User: 信息错误');\r\n if (!this._isAdmin(groupId)) return errorLogFn('User: 不是管理员');\r\n if (group.admins.some((ad) => ad === expellee) || group.lord === expellee) return false;\r\n store.commit('sandBox/REMOVE_MEMBER', { gid: groupId, mid: expellee });\r\n return true;\r\n }\r\n\r\n // 操作信息\r\n\r\n /**\r\n * 发送私聊消息\r\n * @param {*} param0 { id:好友id, content:消息内容 }\r\n */\r\n sendMessageToFriend({ id, content, replyMsg = null }) {\r\n if (!this.self().friends.some((friend) => friend.id === id)) return false;\r\n const msgId = nanoid();\r\n const timestamp = Date.now();\r\n const message = {\r\n id: msgId,\r\n role: ROLE_SELF,\r\n receiver: id,\r\n content,\r\n date: timestamp,\r\n replyMsg\r\n };\r\n const msgOption = { sender: this.id, receiver: id, message };\r\n store.commit('sandBox/SEND_PRIVATE_MESSAGE', msgOption);\r\n this.receiveFriendMessage({ id, content, msgId, timestamp });\r\n return { status: true, data: msgOption };\r\n }\r\n\r\n /**\r\n * 接收私聊消息\r\n * @param {*} param0 {id, content, msgId, timestamp}\r\n */\r\n receiveFriendMessage({ id, content, msgId, timestamp }) {\r\n const message = { id: msgId, role: ROLE_FRIEND, content, date: timestamp, sender: this.id };\r\n const msgOption = { sender: id, receiver: this.id, message };\r\n store.commit('sandBox/SEND_PRIVATE_MESSAGE', msgOption);\r\n }\r\n\r\n /**\r\n * 删除私聊消息\r\n * @param {*} fid 好友id\r\n * @param {*} msgId 消息id\r\n */\r\n deleteFriendMessage(fid, msgId = null) {\r\n if (!this.self().friends.some((friend) => friend.id === fid)) return false;\r\n store.commit('sandBox/DEL_PRIVATE_MESSAGE', { sender: fid, receiver: this.id, msgId });\r\n store.commit('sandBox/DEL_PRIVATE_MESSAGE', { sender: this.id, receiver: fid, msgId });\r\n return true;\r\n }\r\n\r\n /**\r\n * 发送群聊消息\r\n * @param {*} param0 { id:群组id, content:消息内容 }\r\n */\r\n sendMessageToGroup({ id, content, replyMsg = null }) {\r\n const group = store.getters['sandBox/getGroupById'](id);\r\n if (!group) return false;\r\n const hasMember = group.members.some((member) => member.id === this.id);\r\n if (!hasMember) return false;\r\n const groupMsg = store.getters['sandBox/getGroupMessage'](id);\r\n const hasMute = groupMsg.isMute || groupMsg.muteMembers.includes(this.id);\r\n if (!this._isAdmin(id) && hasMute) return false;\r\n const message = {\r\n id: nanoid(),\r\n role: this.id,\r\n isGroup: true,\r\n content,\r\n date: Date.now(),\r\n replyMsg\r\n };\r\n store.commit('sandBox/SEND_GROUP_MESSAGE', { gid: id, message });\r\n return { status: true, data: { gid: id, message } };\r\n }\r\n\r\n /**\r\n * 删除群聊消息\r\n * @param {*} param0 { id:群组id, msgId:消息id }\r\n */\r\n deleteGroupMessage({ id, msgId }) {\r\n const group = store.getters['sandBox/getGroupById'](id);\r\n if (!group) return errorLogFn('User: 群组不存在');\r\n const hasMember = group.members.some((member) => member.id === this.id);\r\n if (!hasMember) return errorLogFn('User: 非群组成员');\r\n const groupMsg = store.getters['sandBox/getGroupMessage'](id);\r\n const hasMessage = groupMsg.messages.some((message) => message.id === msgId);\r\n if (!hasMessage) return errorLogFn('User: 消息不存在');\r\n const isMyMessage = groupMsg.messages.find((message) => message.id === msgId).role === this.id;\r\n if (!this._isAdmin(id) && !isMyMessage) return errorLogFn('User: 非管理员或消息作者');\r\n store.commit('sandBox/DEL_GROUP_MESSAGE', { id, msgId });\r\n return true;\r\n }\r\n\r\n /**\r\n * 群组禁言\r\n * @param {*} gid 群组id\r\n * @param {*} isMute 是否禁言\r\n */\r\n handleMuteGroupById(gid, isMute) {\r\n if (!this._isAdmin(gid)) return errorLogFn('User: 群组权限不足');\r\n store.commit('sandBox/HANDLE_MUTE_GROUP', { gid, isMute });\r\n return true;\r\n }\r\n\r\n /**\r\n * 群成员禁言\r\n * @param {*} gid 群组id\r\n * @param {*} mid 成员id\r\n */\r\n muteMemberById(gid, mid, duration) {\r\n if (!this._isAdmin(gid)) return false;\r\n if (this._isAdmin(gid, mid)) return false;\r\n store.commit('sandBox/MUTE_MEMBER', { gid, mid, duration });\r\n return true;\r\n }\r\n\r\n /**\r\n * 群成员取消禁言\r\n * @param {*} gid 群组id\r\n * @param {*} mid 成员id\r\n */\r\n unmuteMemberById(gid, mid) {\r\n if (!this._isAdmin(gid)) return false;\r\n store.commit('sandBox/UNMUTE_MEMBER', { gid, mid });\r\n return true;\r\n }\r\n\r\n /**\r\n * 设置群管理员\r\n * @param {*} param0 { gid:群组id, mid:成员id }\r\n */\r\n setGroupAdmin({ gid, mid }) {\r\n if (!this.isLord(gid)) return false;\r\n const group = this.getGroupById(gid);\r\n if (group.lord === mid) return false;\r\n if (!group.members.some(({ id }) => id === mid)) return false;\r\n if (group.admins.some((id) => id === mid)) return false;\r\n store.commit('sandBox/SET_GROUP_ADMIN', { gid, mid });\r\n return true;\r\n }\r\n\r\n /**\r\n * 撤销群组管理员\r\n * @param {string} gid 群组id\r\n * @param {string} mid 成员id\r\n * @returns {boolean} 是否成功\r\n */\r\n revokeGroupAdmin(gid, mid) {\r\n if (!this.isLord(gid)) return false;\r\n const group = this.getGroupById(gid);\r\n if (!group.members.some(({ id }) => id === mid)) return false;\r\n if (!group.admins.some((id) => id === mid)) return false;\r\n const res = store.commit('sandBox/REVOKE_GROUP_ADMIN', { gid, mid });\r\n console.log(res);\r\n return true;\r\n }\r\n\r\n /**\r\n * 获取好友消息\r\n * @param {*} friendId 好友id\r\n */\r\n getFriendMessageById(friendId) {\r\n const allMsg = store.getters['sandBox/getPrivateMessage'](this.id);\r\n const friendMsg = allMsg[friendId] || [];\r\n return friendMsg;\r\n }\r\n\r\n /**\r\n * 获取群消息\r\n */\r\n getGroupMessageById(groupId) {\r\n return store.getters['sandBox/getGroupMessage'](groupId);\r\n }\r\n\r\n // 私有方法\r\n /**\r\n * @description: 将传入的成员参数进行规范化\r\n * @param {Array} members\r\n * @return {Array}\r\n */\r\n _memberNormalize(members) {\r\n let memberHandle;\r\n if (members instanceof Array) {\r\n return members\r\n .map((member) => {\r\n if (member instanceof Object) {\r\n return member;\r\n } else {\r\n memberHandle = store.getters['sandBox/getUserById'](member);\r\n return memberHandle;\r\n }\r\n })\r\n .filter((member) => member); // 过滤掉不存在的用户\r\n } else if (members instanceof Object) {\r\n return [members];\r\n } else {\r\n memberHandle = store.getters['sandBox/getUserById'](members);\r\n return memberHandle && typeof memberHandle === 'object' ? [memberHandle] : []; // 检测members是否为有效对象\r\n }\r\n }\r\n\r\n /**\r\n * @description: 获取当前用户\r\n * @return {Object}\r\n */\r\n self() {\r\n return store.getters['sandBox/getUserById'](this.id);\r\n }\r\n\r\n /**\r\n * @description: 判断当前用户是否为管理员\r\n * @param {String} gid\r\n * @return {Boolean}\r\n */\r\n _isAdmin(gid, uid) {\r\n const group = store.getters['sandBox/getGroupById'](gid);\r\n if (!group) return false;\r\n const id = uid || this.id;\r\n const isLord = group.lord === id || this.self().isSuper;\r\n const isAdmin = group.admins.some((ad) => ad === id) || isLord;\r\n return isAdmin;\r\n }\r\n\r\n isLord(gid, uid) {\r\n const group = store.getters['sandBox/getGroupById'](gid);\r\n const id = uid || this.id;\r\n const isLord = group.lord === id || this.self().isSuper;\r\n return isLord;\r\n }\r\n}\r\n\r\nconst errorLogFn = (error) => {\r\n console.error(error);\r\n return false;\r\n};\r\n","import Group from '../group';\r\nimport User from '../user';\r\nimport store from '@/store';\r\nexport default class Administrators {\r\n // 操作用户\r\n getAllUser() {\r\n return store.getters['sandBox/getAllUser'];\r\n }\r\n\r\n getUserById(id) {\r\n return store.getters['sandBox/getUserById'](id);\r\n }\r\n\r\n removeUserById(id) {\r\n const user = this.getUserById(id);\r\n const u = new User({ id });\r\n user.groups.forEach((group) => {\r\n if (group.role === 'lord') return u.removeGroupById(group.id);\r\n if (group.role === 'admin') return u.leaveGroupById(group.id);\r\n store.commit('sandBox/REMOVE_MEMBER', { gid: group.id, mid: id });\r\n });\r\n user.friends.forEach((friend) => {\r\n store.commit('sandBox/REMOVE_FRIEND', { fid: id, id: friend.id });\r\n });\r\n store.commit('sandBox/CLEAR_USER_MESSAGE', id);\r\n store.commit('sandBox/REMOVE_USER', id);\r\n }\r\n\r\n clearUSer() {\r\n store.commit('sandBox/CLEAR_USERS');\r\n }\r\n\r\n // 操作群组\r\n createGroup({ id, name, members, lord, avatar }) {\r\n if (!id && !name) return false;\r\n const gid = `group-${id}`;\r\n const normalizeMembers = this._memberNormalize(members);\r\n const hasGroup = this.getGroupById(gid);\r\n if (hasGroup) return false;\r\n const group = new Group({ name, numId: id, lord, avatar }).mount();\r\n normalizeMembers.forEach(async (member) => {\r\n const mid = member.id;\r\n const hasUser = this.getUserById(mid);\r\n if (!hasUser) return console.log(`用户${mid}不存在`);\r\n const role = mid === lord ? 'lord' : 'member';\r\n group.addMember({ uid: member.id, role });\r\n });\r\n group.addMember({ uid: lord, role: 'lord' });\r\n group.addMember({ uid: 'user-super-admin', role: 'super-admin' });\r\n return group;\r\n }\r\n\r\n getAllGroup() {\r\n return store.getters['sandBox/getAllGroup'];\r\n }\r\n\r\n getGroupById(gid) {\r\n return store.getters['sandBox/getGroupById'](gid);\r\n }\r\n\r\n removeGroupById(gid) {\r\n const members = store.getters['sandBox/getGroupById'](gid).members;\r\n members.forEach((member) => {\r\n const user = store.getters['sandBox/getUserById'](member.id);\r\n user.groups = user.groups.filter((group) => group.id !== gid);\r\n });\r\n store.commit('sandBox/DEL_GROUP_MESSAGE', { gid });\r\n store.commit('sandBox/REMOVE_GROUP', gid);\r\n }\r\n\r\n // 私有方法\r\n /**\r\n * @description: 将传入的成员参数进行规范化\r\n * @param {Array} members\r\n * @return {Array}\r\n */\r\n _memberNormalize(members) {\r\n let memberHandle;\r\n if (members instanceof Array) {\r\n return members\r\n .map((member) => {\r\n if (member instanceof Object) {\r\n return member;\r\n } else {\r\n memberHandle = store.getters['sandBox/getUserById'](member);\r\n return memberHandle;\r\n }\r\n })\r\n .filter((member) => member); // 过滤掉不存在的用户\r\n } else if (members instanceof Object) {\r\n return [members];\r\n } else {\r\n memberHandle = store.getters['sandBox/getUserById'](members);\r\n return memberHandle && typeof memberHandle === 'object' ? [memberHandle] : []; // 检测members是否为有效对象\r\n }\r\n }\r\n\r\n __memberNormalize(members) {\r\n if (members instanceof Object) return [members];\r\n if (!(members instanceof Array)) {\r\n members = store.getters['sandBox/getUserById'](`user-${members}`);\r\n return members && members instanceof Object ? [members] : [];\r\n }\r\n return members\r\n .map((member) => {\r\n if (member instanceof Object) return member;\r\n return store.getters['sandBox/getUserById'](`user-${member}`) || null;\r\n })\r\n .filter((member) => member !== null);\r\n }\r\n}\r\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('k-container',{staticClass:\"left-aside\",attrs:{\"direction\":\"horizontal\"}},[_c('k-sb-aside',{staticClass:\"aside-users\",scopedSlots:_vm._u([{key:\"inner\",fn:function(){return [(_vm.getAllUser.length)?_c('k-menu',{attrs:{\"default-active\":_vm.getCurrentUser?.id,\"active-color\":\"#752bec\",\"active-shape\":['circle'],\"text-color\":\"#061e26\",\"background-color\":\"#f2f2f2\",\"mode\":\"column\"}},_vm._l((_vm.getAllUser),function(user,index){return _c('k-menu-item',{key:index,attrs:{\"index\":user.id,\"width\":\"60\",\"height\":\"60\"},on:{\"click\":function($event){return _vm.switchUserFn(user.id)}}},[_c('pps-context-menu',{attrs:{\"menus\":user.isSuper ? [] : [{ label: '发起群聊', uid: `${user.id}`, task: 1 }]},on:{\"select\":_vm.contextMenuFn},scopedSlots:_vm._u([{key:\"item\",fn:function({ menu }){return _vm._l((menu),function(item,index){return _c('div',{key:index,staticClass:\"menu-item\",on:{\"click\":function($event){return _vm.contextMenuFn(item)}}},[_vm._v(\" \"+_vm._s(item.label)+\" \")])})}}],null,true)},[_c('template',{slot:\"prepend\"},[_c('el-tooltip',{staticClass:\"item\",attrs:{\"effect\":\"dark\",\"content\":\"账户信息\",\"placement\":\"top\"}},[_c('pps-icon',{attrs:{\"icon\":\"pps-icon-account\"},on:{\"click\":function($event){return _vm.showUserDetailFn(user)}}})],1),_c('el-tooltip',{staticClass:\"item\",attrs:{\"effect\":\"dark\",\"content\":\"好友\",\"placement\":\"top\"}},[_c('pps-icon',{attrs:{\"icon\":\"pps-icon-contact\"},on:{\"click\":function($event){return _vm.showFriendListFn(user)}}})],1),_c('el-tooltip',{staticClass:\"item\",attrs:{\"effect\":\"dark\",\"content\":\"群聊\",\"placement\":\"top\"}},[_c('pps-icon',{attrs:{\"icon\":\"pps-icon-group\"},on:{\"click\":function($event){return _vm.showGroupListFn(user)}}})],1)],1),(!user.isSuper)?_c('div',{staticClass:\"delete-user\",attrs:{\"slot\":\"append\"},slot:\"append\"},[_c('div',{on:{\"click\":function($event){return _vm.contextMenuFn({ uid: `${user.id}`, task: 2 })}}},[_vm._v(\" \"+_vm._s(`移除 ${user.name}`)+\" \")])]):_vm._e(),_c('div',{staticClass:\"user-avatar\",attrs:{\"slot\":\"content\"},slot:\"content\"},[_c('el-tooltip',{staticClass:\"item\",attrs:{\"effect\":\"dark\",\"content\":user.name,\"placement\":\"right\"}},[_c('pps-avatar',{attrs:{\"src\":user.avatar,\"size\":\"40\"}})],1)],1)],2)],1)}),1):_vm._e()]},proxy:true}])},[_c('header',{staticClass:\"k-chat-header\"},[_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":\"添加用户\",\"placement\":\"bottom\"}},[_c('div',{staticClass:\"add-user-avatar\",on:{\"click\":function($event){_vm.show.createUser = true}}},[_c('img',{staticClass:\"add-user\",attrs:{\"src\":_vm.ADD_USER_IMG,\"alt\":\"添加用户\"}})])])],1),_c('div',{staticClass:\"fill-empty\"}),(0)?_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":\"移除用户\",\"placement\":\"right\"}},[_c('div',{staticClass:\"remove-user-button\",on:{\"click\":_vm.removeUserFn}},[_c('img',{attrs:{\"src\":_vm.REMOVE_USER,\"alt\":\"移除用户\"}})])]):_vm._e()],1),_c('transition',[_c('k-sb-aside',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.show.isCollapseMsg),expression:\"show.isCollapseMsg\"}],staticClass:\"aside-list\",scopedSlots:_vm._u([{key:\"inner\",fn:function(){return [_c('k-menu',{key:_vm.messageList[0]?.id,ref:\"msgMenuRef\",staticClass:\"list\",attrs:{\"default-active\":null,\"active-color\":\"#fff\",\"active-shape\":['background'],\"text-color\":\"#061e26\",\"background-color\":\"#a07fff\",\"mode\":\"column\"},on:{\"select\":_vm.selectMsgFn}},_vm._l((_vm.showMessageList),function(item){return _c('k-menu-item',{key:item.id,attrs:{\"index\":item.id,\"height\":\"60\"}},[_c('div',{staticClass:\"list-item\"},[_c('pps-avatar',{attrs:{\"src\":item.avatar,\"size\":\"40\",\"title\":item.name}}),_c('div',{staticClass:\"name\",attrs:{\"title\":item.name}},[_c('span',{staticClass:\"name-text\"},[_vm._v(_vm._s(item.name))]),_c('p',{staticClass:\"name__message\"},[_vm._v(_vm._s(item.message))])]),_c('span',{staticClass:\"closeBtn\"},[_vm._v(\" \"+_vm._s(item.date)+\" \")])],1)])}),1)]},proxy:true}])},[_c('header',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.show.isCollapseMsg),expression:\"show.isCollapseMsg\"}],staticClass:\"k-chat-header\"},[_c('k-tab',{class:{ isTransparent: !_vm.show.isCollapseMsg },attrs:{\"tabs\":['私聊', '群聊']},on:{\"changeTab\":_vm.toggleMsgTabFn}}),_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":\"加好友/群\",\"placement\":\"bottom\"}},[_c('gray-button',{staticClass:\"icon-btn\",nativeOn:{\"click\":function($event){_vm.show.addFriend = true}}},[_c('svg',{staticClass:\"icon\",attrs:{\"t\":\"1723230695956\",\"viewBox\":\"0 0 1024 1024\",\"version\":\"1.1\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"p-id\":\"34315\",\"width\":\"16\",\"height\":\"16\",\"data-spm-anchor-id\":\"a313x.search_index.0.i6.27883a81IeQ0Uy\"}},[_c('path',{attrs:{\"d\":\"M914.618182 477.090909H546.909091V109.381818c0-18.618182-16.290909-34.909091-34.909091-34.909091s-34.909091 16.290909-34.909091 34.909091v367.709091H109.381818c-18.618182 0-34.909091 16.290909-34.909091 34.909091s16.290909 34.909091 34.909091 34.909091h367.709091v367.709091c0 18.618182 16.290909 34.909091 34.909091 34.909091s34.909091-16.290909 34.909091-34.909091V546.909091h367.709091c18.618182 0 34.909091-16.290909 34.909091-34.909091s-16.290909-34.909091-34.909091-34.909091z\",\"fill\":\"#7a7a7a\",\"p-id\":\"34316\"}})])])],1),_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":\"收起消息列表\",\"placement\":\"right\"}},[_c('gray-button',{staticClass:\"icon-btn\",nativeOn:{\"click\":function($event){return _vm.collapseMsghandler(false)}}},[_c('pps-icon',{attrs:{\"icon\":\"pps-icon-side-show\"}})],1)],1)],1)])],1),(_vm.getIsNarrowScreen)?_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.show.isCollapseMsg),expression:\"show.isCollapseMsg\"}],staticClass:\"mask\",on:{\"click\":function($event){return _vm.collapseMsghandler(false)}}}):_vm._e(),_c('pps-dialog',{staticClass:\"create-user-dialog\",attrs:{\"show\":_vm.show.createUser,\"title\":\"创建用户\"},on:{\"update:show\":function($event){return _vm.$set(_vm.show, \"createUser\", $event)},\"canceled\":_vm.cancelCreateUserFn,\"confirmed\":_vm.createUserFn},scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('pps-form',[_c('pps-input',{attrs:{\"label\":\"昵称\",\"content\":_vm.createUser.name,\"placeholder\":\"请输入昵称\"},on:{\"update:content\":function($event){return _vm.$set(_vm.createUser, \"name\", $event)}}}),_c('pps-input',{attrs:{\"label\":\"账号\",\"content\":_vm.createUser.id,\"placeholder\":\"请输入账号\"},on:{\"update:content\":function($event){return _vm.$set(_vm.createUser, \"id\", $event)}}}),_c('pps-input',{attrs:{\"label\":\"年龄\",\"content\":_vm.createUser.age,\"type\":\"number\",\"placeholder\":\"请输入年龄\"},on:{\"update:content\":function($event){return _vm.$set(_vm.createUser, \"age\", $event)}}}),_c('div',{staticClass:\"user-sex-wrapper\"},[_c('label',{staticClass:\"sex-text-label\",attrs:{\"for\":\"t\"}},[_vm._v(\"性别:\")]),_c('el-radio',{attrs:{\"label\":\"男\"},model:{value:(_vm.createUser.sex),callback:function ($$v) {_vm.$set(_vm.createUser, \"sex\", $$v)},expression:\"createUser.sex\"}},[_vm._v(\"男\")]),_c('el-radio',{attrs:{\"label\":\"女\"},model:{value:(_vm.createUser.sex),callback:function ($$v) {_vm.$set(_vm.createUser, \"sex\", $$v)},expression:\"createUser.sex\"}},[_vm._v(\"女\")])],1),_c('pps-input',{attrs:{\"label\":\"头像\",\"content\":_vm.createUser.avatar,\"placeholder\":\"请输入https地址\"},on:{\"update:content\":function($event){return _vm.$set(_vm.createUser, \"avatar\", $event)}}})],1),_c('hr'),_c('div',{staticClass:\"quick-wrapper\"},[_c('span',{staticClass:\"quick__text\"},[_vm._v(\"快速创建10个用户\")]),_c('pps-button',{staticClass:\"quick__btn\",attrs:{\"theme\":\"confirm\"},on:{\"click\":function($event){return _vm.bulkCreateUsers()}}},[_c('i',{staticClass:\"el-icon-plus\"}),_vm._v(\" 快速创建 \")])],1)]},proxy:true}])}),_c('pps-dialog',{attrs:{\"show\":_vm.show.removeUser,\"title\":\"移除用户\",\"content\":`确定要移除${_vm.removeUser}用户吗?`},on:{\"update:show\":function($event){return _vm.$set(_vm.show, \"removeUser\", $event)},\"confirmed\":function($event){return _vm.removeUserFn(_vm.removeUser)}}}),_c('pps-dialog',{staticClass:\"add-friend-dialog\",attrs:{\"after-show\":_vm.emitTabUpdate,\"show\":_vm.show.addFriend,\"callback\":_vm.closeAddObjDialogFn,\"title\":\"全站搜索\"},on:{\"update:show\":function($event){return _vm.$set(_vm.show, \"addFriend\", $event)}},scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('pps-input',{attrs:{\"clearable\":\"\",\"content\":_vm.searchDialog.input,\"placeholder\":`请输入${_vm.searchDialog.tabs[_vm.searchDialog.index]} ID`},on:{\"change\":function($event){return _vm.searchFn()},\"update:content\":function($event){return _vm.$set(_vm.searchDialog, \"input\", $event)}}},[_c('span',{staticStyle:{\"padding\":\"0 8px\"},attrs:{\"slot\":\"prepend\"},slot:\"prepend\"},[_vm._v(\" \"+_vm._s(_vm.searchDialog.tabPrefix[_vm.searchDialog.index])+\"- \")])]),_c('k-tab',{ref:\"k-tab\",attrs:{\"tabs\":_vm.searchDialog.tabs},on:{\"changeTab\":_vm.switchSearchTabFn},scopedSlots:_vm._u([{key:\"thumb\",fn:function(){return [_c('div',{staticClass:\"thumb\"})]},proxy:true}])}),_c('el-table',{staticStyle:{\"width\":\"100%\"},attrs:{\"data\":_vm.tableData,\"border\":\"\"}},[_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"搜索结果\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('img',{staticClass:\"avatar\",attrs:{\"src\":scope.row.avatar,\"alt\":\"\"}})]}}])}),_c('el-table-column',{attrs:{\"align\":\"center\",\"prop\":\"name\",\"label\":\"昵称\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"prop\":\"id\",\"label\":\"id\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"操作\"},scopedSlots:_vm._u([{key:\"default\",fn:function({ row }){return [_c('pps-button',{attrs:{\"disabled\":row.isAdded},on:{\"click\":function($event){return _vm.addFriendFn(row.id)}}},[_vm._v(\" \"+_vm._s(row.isAdded ? '已添加' : '添加')+\" \")])]}}])})],1)]},proxy:true}])}),_c('pps-dialog',{staticClass:\"create-group-dialog\",attrs:{\"show\":_vm.show.createGroup,\"title\":\"发起群聊\"},on:{\"update:show\":function($event){return _vm.$set(_vm.show, \"createGroup\", $event)},\"confirmed\":_vm.createGroupFn},scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('div',{staticClass:\"create-group-content\"},[_c('div',{staticClass:\"left\",staticStyle:{\"text-align\":\"center\"}},[_c('h4',[_vm._v(\"好友列表\")]),_c('el-table',{attrs:{\"show-header\":true,\"data\":_vm.getFriendListExceptSuper},on:{\"selection-change\":_vm.handleSelectionChange}},[_c('el-table-column',{attrs:{\"type\":\"selection\",\"align\":\"center\",\"label\":\"选择\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"头像\"},scopedSlots:_vm._u([{key:\"default\",fn:function({ row }){return [_c('pps-avatar',{attrs:{\"src\":row.avatar,\"size\":\"30\",\"title\":row.name}})]}}])}),_c('el-table-column',{attrs:{\"prop\":\"name\",\"align\":\"center\",\"label\":\"名称\"}})],1)],1),_c('div',{staticClass:\"right\"},[_c('pps-input',{attrs:{\"label\":\"群聊ID\",\"content\":_vm.createGroup.id,\"placeholder\":\"请输入ID\"},on:{\"update:content\":function($event){return _vm.$set(_vm.createGroup, \"id\", $event)}}}),_c('pps-input',{attrs:{\"label\":\"群聊名称\",\"content\":_vm.createGroup.name,\"placeholder\":\"请输入名称\"},on:{\"update:content\":function($event){return _vm.$set(_vm.createGroup, \"name\", $event)}}}),_c('pps-input',{attrs:{\"label\":\"群聊头像\",\"content\":_vm.createGroup.avatar,\"placeholder\":\"请输入链接\"},on:{\"update:content\":function($event){return _vm.$set(_vm.createGroup, \"avatar\", $event)}}})],1)])]},proxy:true}])}),_c('pps-dialog',{attrs:{\"show\":_vm.show.friendList,\"title\":\"好友列表\",\"callback\":_vm.closeUserInfoFn},on:{\"update:show\":function($event){return _vm.$set(_vm.show, \"friendList\", $event)}},scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('el-table',{attrs:{\"show-header\":true,\"data\":_vm.selectFreindLIst}},[_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"头像\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('pps-avatar',{attrs:{\"src\":scope.row.avatar,\"size\":\"40\"}})]}}])}),_c('el-table-column',{attrs:{\"align\":\"center\",\"prop\":\"id\",\"label\":\"id\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"prop\":\"name\",\"label\":\"昵称\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"操作\"},scopedSlots:_vm._u([{key:\"default\",fn:function({ row }){return [_c('pps-button',{attrs:{\"disabled\":row.id === 'user-super-admin',\"theme\":\"danger\"},on:{\"click\":function($event){return _vm.removeFriendFn(row.id)}}},[_vm._v(\" 删除 \")])]}}])})],1)]},proxy:true}])}),_c('pps-dialog',{attrs:{\"show\":_vm.show.groupList,\"title\":\"群聊列表\",\"callback\":_vm.closeUserInfoFn},on:{\"update:show\":function($event){return _vm.$set(_vm.show, \"groupList\", $event)}},scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('el-table',{attrs:{\"data\":_vm.selcetGroupList}},[_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"群聊头像\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('pps-avatar',{attrs:{\"src\":scope.row.avatar,\"size\":\"40\"}})]}}])}),_c('el-table-column',{attrs:{\"align\":\"center\",\"prop\":\"id\",\"label\":\"群聊id\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"prop\":\"name\",\"label\":\"群聊名称\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"操作\"},scopedSlots:_vm._u([{key:\"default\",fn:function({ row }){return [(row.lord === _vm.userDetailDate.id)?_c('pps-button',{attrs:{\"disabled\":row.lord !== _vm.userDetailDate.id,\"theme\":\"danger\"},on:{\"click\":function($event){return _vm.removeGroupFn(row)}}},[_vm._v(\" 解散 \")]):_c('pps-button',{attrs:{\"theme\":\"primary\"},on:{\"click\":function($event){return _vm.leaveGroupFn(row)}}},[_vm._v(\"退出\")])]}}])})],1)]},proxy:true}])}),_c('pps-dialog',{attrs:{\"show\":_vm.show.userInfo,\"title\":\"用户信息\",\"callback\":_vm.closeUserInfoFn},on:{\"update:show\":function($event){return _vm.$set(_vm.show, \"userInfo\", $event)}},scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('div',{staticClass:\"user-info-wrapper\"},[_c('img',{staticClass:\"user-avatar\",attrs:{\"src\":_vm.userDetailDate.avatar,\"alt\":\"\"}}),_c('el-descriptions',{staticClass:\"margin-top\",attrs:{\"column\":2,\"border\":\"\"}},[_c('el-descriptions-item',[_c('template',{slot:\"label\"},[_vm._v(\"昵称\")]),_vm._v(\" \"+_vm._s(_vm.userDetailDate.name)+\" \")],2),_c('el-descriptions-item',[_c('template',{slot:\"label\"},[_vm._v(\"ID\")]),_vm._v(\" \"+_vm._s(_vm.userDetailDate.id)+\" \")],2),_c('el-descriptions-item',[_c('template',{slot:\"label\"},[_vm._v(\"年龄\")]),_vm._v(\" \"+_vm._s(_vm.userDetailDate.age)+\" \")],2),_c('el-descriptions-item',[_c('template',{slot:\"label\"},[_vm._v(\"性别\")]),_vm._v(\" \"+_vm._s(_vm.userDetailDate.sex)+\" \")],2)],1)],1)]},proxy:true}])})],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"k-tab-wrapper\",on:{\"updateTab\":_vm.changeTabFn}},[_vm._l((_vm.tabs),function(tab,index){return _c('div',{key:index,ref:\"tab-item\",refInFor:true,staticClass:\"k-tab-item\",on:{\"click\":function($event){return _vm.changeTabFn(index)}}},[_c('div',{staticClass:\"k-tab-font\",class:{ 'k-tab-current': _vm.current === index }},[_vm._v(_vm._s(tab))])])}),_c('div',{ref:\"tab-thumb\",staticClass:\"tab-thumb\",style:({ left: _vm.x + 'px', top: _vm.y + 'px' })},[_vm._t(\"thumb\",function(){return [_c('div',{staticClass:\"k-tab-thumb\"})]})],2)],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <div class=\"k-tab-wrapper\" @updateTab=\"changeTabFn\">\r\n <div\r\n ref=\"tab-item\"\r\n @click=\"changeTabFn(index)\"\r\n v-for=\"(tab, index) in tabs\"\r\n :key=\"index\"\r\n class=\"k-tab-item\"\r\n >\r\n <div class=\"k-tab-font\" :class=\"{ 'k-tab-current': current === index }\">{{ tab }}</div>\r\n </div>\r\n <div class=\"tab-thumb\" ref=\"tab-thumb\" :style=\"{ left: x + 'px', top: y + 'px' }\">\r\n <slot name=\"thumb\"><div class=\"k-tab-thumb\"></div></slot>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: 'k-tab',\r\n props: {\r\n tabs: {\r\n type: Array,\r\n default() {\r\n return [];\r\n }\r\n },\r\n defaultActive: {\r\n type: Number,\r\n default() {\r\n return 0;\r\n }\r\n }\r\n },\r\n data() {\r\n return {\r\n x: 0,\r\n y: 0,\r\n current: 0\r\n };\r\n },\r\n methods: {\r\n changeTabFn(tab = 0) {\r\n this.$emit('changeTab', tab);\r\n this.current = tab;\r\n const { offsetLeft, offsetTop } = this.$refs['tab-item'][tab];\r\n this.x = offsetLeft;\r\n this.y = offsetTop;\r\n }\r\n },\r\n mounted() {\r\n this.changeTabFn(this.defaultActive);\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"less\">\r\n.k-tab-wrapper {\r\n display: flex;\r\n position: relative;\r\n flex-direction: row;\r\n justify-content: space-around;\r\n align-items: center;\r\n background-color: #eeeeee;\r\n // width: 140px;\r\n width: auto;\r\n padding: 0 5px;\r\n height: 35px;\r\n border-radius: 5px;\r\n\r\n .k-tab-item {\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.3s;\r\n z-index: 1;\r\n user-select: none;\r\n\r\n .k-tab-font {\r\n // border: 1px solid #000;\r\n text-align: center;\r\n width: 60px;\r\n height: 27px;\r\n line-height: 27px;\r\n color: #7a7a7a;\r\n\r\n &:not(.k-tab-current):hover {\r\n color: #a0a0a0;\r\n }\r\n\r\n &:not(.k-tab-current):active {\r\n color: #c2c2c2;\r\n }\r\n }\r\n .k-tab-current {\r\n color: #752bec;\r\n }\r\n }\r\n\r\n .k-tab-thumb {\r\n position: absolute;\r\n background-color: #fff;\r\n width: 60px;\r\n height: 27px;\r\n border-radius: 3px;\r\n pointer-events: none;\r\n }\r\n .tab-thumb {\r\n height: 100%;\r\n position: absolute;\r\n transition: all 0.15s ease;\r\n }\r\n}\r\n</style>\r\n","import mod from \"-!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./tab.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../../node_modules/thread-loader/dist/cjs.js!../../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./tab.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./tab.vue?vue&type=template&id=1a745ad4\"\nimport script from \"./tab.vue?vue&type=script&lang=js\"\nexport * from \"./tab.vue?vue&type=script&lang=js\"\nimport style0 from \"./tab.vue?vue&type=style&index=0&id=1a745ad4&prod&lang=less\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"gray-btn\"},[_vm._t(\"default\")],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <div class=\"gray-btn\">\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nexport default {\r\n name: 'gray-button'\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n.gray-btn {\r\n width: 33px;\r\n height: 33px;\r\n border: none;\r\n background-color: #eeeeee;\r\n border-radius: 5px;\r\n color: #636c76;\r\n padding: 0;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n\r\n &:hover {\r\n background-color: #e2e2e2;\r\n }\r\n &:active {\r\n background-color: #d7d7d7;\r\n }\r\n}\r\n</style>\r\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./grayButton.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./grayButton.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./grayButton.vue?vue&type=template&id=00d3292e\"\nimport script from \"./grayButton.vue?vue&type=script&lang=js\"\nexport * from \"./grayButton.vue?vue&type=script&lang=js\"\nimport style0 from \"./grayButton.vue?vue&type=style&index=0&id=00d3292e&prod&lang=scss\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","export function formatTimestamp(ts) {\r\n const inputDate = new Date(ts);\r\n const now = new Date();\r\n\r\n const year = inputDate.getFullYear();\r\n const month = inputDate.getMonth();\r\n const date = inputDate.getDate();\r\n // 判断是否是今天\r\n const isToday = year === now.getFullYear() && month === now.getMonth() && date === now.getDate();\r\n\r\n if (isToday) {\r\n return inputDate.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\r\n } else {\r\n return `${padZero(month + 1)}/${padZero(date)}`;\r\n }\r\n}\r\nfunction padZero(n) {\r\n return n < 10 ? '0' + n : n;\r\n}\r\n","<template>\r\n <k-container direction=\"horizontal\" class=\"left-aside\">\r\n <!-- 切换用户导航栏 -->\r\n <k-sb-aside class=\"aside-users\">\r\n <header class=\"k-chat-header\">\r\n <el-tooltip effect=\"dark\" content=\"添加用户\" placement=\"bottom\">\r\n <div class=\"add-user-avatar\" @click=\"show.createUser = true\">\r\n <img class=\"add-user\" :src=\"ADD_USER_IMG\" alt=\"添加用户\" />\r\n </div>\r\n </el-tooltip>\r\n </header>\r\n <template #inner>\r\n <k-menu\r\n v-if=\"getAllUser.length\"\r\n :default-active=\"getCurrentUser?.id\"\r\n active-color=\"#752bec\"\r\n :active-shape=\"['circle']\"\r\n text-color=\"#061e26\"\r\n background-color=\"#f2f2f2\"\r\n mode=\"column\"\r\n >\r\n <k-menu-item\r\n v-for=\"(user, index) in getAllUser\"\r\n :key=\"index\"\r\n :index=\"user.id\"\r\n width=\"60\"\r\n height=\"60\"\r\n @click=\"switchUserFn(user.id)\"\r\n >\r\n <pps-context-menu\r\n :menus=\"user.isSuper ? [] : [{ label: '发起群聊', uid: `${user.id}`, task: 1 }]\"\r\n @select=\"contextMenuFn\"\r\n >\r\n <template slot=\"prepend\">\r\n <el-tooltip class=\"item\" effect=\"dark\" content=\"账户信息\" placement=\"top\">\r\n <pps-icon icon=\"pps-icon-account\" @click=\"showUserDetailFn(user)\"></pps-icon>\r\n </el-tooltip>\r\n <el-tooltip class=\"item\" effect=\"dark\" content=\"好友\" placement=\"top\">\r\n <pps-icon icon=\"pps-icon-contact\" @click=\"showFriendListFn(user)\"></pps-icon>\r\n </el-tooltip>\r\n <el-tooltip class=\"item\" effect=\"dark\" content=\"群聊\" placement=\"top\">\r\n <pps-icon icon=\"pps-icon-group\" @click=\"showGroupListFn(user)\"></pps-icon>\r\n </el-tooltip>\r\n </template>\r\n <div v-if=\"!user.isSuper\" class=\"delete-user\" slot=\"append\">\r\n <div @click=\"contextMenuFn({ uid: `${user.id}`, task: 2 })\">\r\n {{ `移除 ${user.name}` }}\r\n </div>\r\n </div>\r\n <template v-slot:item=\"{ menu }\">\r\n <div\r\n class=\"menu-item\"\r\n v-for=\"(item, index) in menu\"\r\n :key=\"index\"\r\n @click=\"contextMenuFn(item)\"\r\n >\r\n {{ item.label }}\r\n </div>\r\n </template>\r\n <div class=\"user-avatar\" slot=\"content\">\r\n <el-tooltip class=\"item\" effect=\"dark\" :content=\"user.name\" placement=\"right\">\r\n <pps-avatar :src=\"user.avatar\" size=\"40\"></pps-avatar>\r\n </el-tooltip>\r\n </div>\r\n </pps-context-menu>\r\n </k-menu-item>\r\n </k-menu>\r\n </template>\r\n <div class=\"fill-empty\"></div>\r\n <el-tooltip v-if=\"0\" effect=\"dark\" content=\"移除用户\" placement=\"right\">\r\n <div class=\"remove-user-button\" @click=\"removeUserFn\">\r\n <img :src=\"REMOVE_USER\" alt=\"移除用户\" />\r\n </div>\r\n </el-tooltip>\r\n </k-sb-aside>\r\n\r\n <!-- 好友群聊 列表 -->\r\n <transition>\r\n <k-sb-aside class=\"aside-list\" v-show=\"show.isCollapseMsg\">\r\n <header class=\"k-chat-header\" v-show=\"show.isCollapseMsg\">\r\n <k-tab\r\n :tabs=\"['私聊', '群聊']\"\r\n @changeTab=\"toggleMsgTabFn\"\r\n :class=\"{ isTransparent: !show.isCollapseMsg }\"\r\n ></k-tab>\r\n <el-tooltip effect=\"dark\" content=\"加好友/群\" placement=\"bottom\">\r\n <gray-button class=\"icon-btn\" @click.native=\"show.addFriend = true\">\r\n <svg\r\n t=\"1723230695956\"\r\n class=\"icon\"\r\n viewBox=\"0 0 1024 1024\"\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n p-id=\"34315\"\r\n width=\"16\"\r\n height=\"16\"\r\n data-spm-anchor-id=\"a313x.search_index.0.i6.27883a81IeQ0Uy\"\r\n >\r\n <path\r\n d=\"M914.618182 477.090909H546.909091V109.381818c0-18.618182-16.290909-34.909091-34.909091-34.909091s-34.909091 16.290909-34.909091 34.909091v367.709091H109.381818c-18.618182 0-34.909091 16.290909-34.909091 34.909091s16.290909 34.909091 34.909091 34.909091h367.709091v367.709091c0 18.618182 16.290909 34.909091 34.909091 34.909091s34.909091-16.290909 34.909091-34.909091V546.909091h367.709091c18.618182 0 34.909091-16.290909 34.909091-34.909091s-16.290909-34.909091-34.909091-34.909091z\"\r\n fill=\"#7a7a7a\"\r\n p-id=\"34316\"\r\n ></path>\r\n </svg>\r\n </gray-button>\r\n </el-tooltip>\r\n <!-- 收起消息列表 -->\r\n <el-tooltip effect=\"dark\" content=\"收起消息列表\" placement=\"right\">\r\n <gray-button class=\"icon-btn\" @click.native=\"collapseMsghandler(false)\">\r\n <pps-icon icon=\"pps-icon-side-show\"></pps-icon>\r\n </gray-button>\r\n </el-tooltip>\r\n </header>\r\n <template #inner>\r\n <k-menu\r\n class=\"list\"\r\n ref=\"msgMenuRef\"\r\n :default-active=\"null\"\r\n :key=\"messageList[0]?.id\"\r\n @select=\"selectMsgFn\"\r\n active-color=\"#fff\"\r\n :active-shape=\"['background']\"\r\n text-color=\"#061e26\"\r\n background-color=\"#a07fff\"\r\n mode=\"column\"\r\n >\r\n <k-menu-item\r\n v-for=\"item in showMessageList\"\r\n :key=\"item.id\"\r\n :index=\"item.id\"\r\n height=\"60\"\r\n >\r\n <div class=\"list-item\">\r\n <pps-avatar :src=\"item.avatar\" size=\"40\" :title=\"item.name\"></pps-avatar>\r\n <div class=\"name\" :title=\"item.name\">\r\n <span class=\"name-text\">{{ item.name }}</span>\r\n <p class=\"name__message\">{{ item.message }}</p>\r\n </div>\r\n <span class=\"closeBtn\">\r\n {{ item.date }}\r\n </span>\r\n </div>\r\n </k-menu-item>\r\n </k-menu>\r\n </template>\r\n </k-sb-aside>\r\n </transition>\r\n\r\n <!-- 遮罩层 -->\r\n <div\r\n class=\"mask\"\r\n v-show=\"show.isCollapseMsg\"\r\n v-if=\"getIsNarrowScreen\"\r\n @click=\"collapseMsghandler(false)\"\r\n ></div>\r\n\r\n <!-- 创建用户 对话框 -->\r\n <pps-dialog\r\n :show.sync=\"show.createUser\"\r\n @canceled=\"cancelCreateUserFn\"\r\n @confirmed=\"createUserFn\"\r\n class=\"create-user-dialog\"\r\n title=\"创建用户\"\r\n >\r\n <template v-slot:content>\r\n <pps-form>\r\n <!-- <div class=\"user-input-label\">名称</div> -->\r\n <pps-input label=\"昵称\" :content.sync=\"createUser.name\" placeholder=\"请输入昵称\" />\r\n <!-- <div class=\"user-input-label\">账号</div> -->\r\n <pps-input label=\"账号\" :content.sync=\"createUser.id\" placeholder=\"请输入账号\" />\r\n <!-- <div class=\"user-input-label\">年龄</div> -->\r\n <pps-input\r\n label=\"年龄\"\r\n :content.sync=\"createUser.age\"\r\n type=\"number\"\r\n placeholder=\"请输入年龄\"\r\n />\r\n <div class=\"user-sex-wrapper\">\r\n <label class=\"sex-text-label\" for=\"t\">性别:</label>\r\n <el-radio v-model=\"createUser.sex\" label=\"男\">男</el-radio>\r\n <el-radio v-model=\"createUser.sex\" label=\"女\">女</el-radio>\r\n </div>\r\n <!-- <div class=\"user-input-label\">头像</div> -->\r\n <pps-input label=\"头像\" :content.sync=\"createUser.avatar\" placeholder=\"请输入https地址\" />\r\n </pps-form>\r\n <hr />\r\n <div class=\"quick-wrapper\">\r\n <span class=\"quick__text\">快速创建10个用户</span>\r\n <pps-button class=\"quick__btn\" theme=\"confirm\" @click=\"bulkCreateUsers()\">\r\n <i class=\"el-icon-plus\"></i>\r\n 快速创建\r\n </pps-button>\r\n </div>\r\n </template>\r\n </pps-dialog>\r\n\r\n <!-- 移除用户 对话框 -->\r\n <pps-dialog\r\n :show.sync=\"show.removeUser\"\r\n @confirmed=\"removeUserFn(removeUser)\"\r\n title=\"移除用户\"\r\n :content=\"`确定要移除${removeUser}用户吗?`\"\r\n ></pps-dialog>\r\n\r\n <!-- 添加对象 对话框 -->\r\n <pps-dialog\r\n class=\"add-friend-dialog\"\r\n :after-show=\"emitTabUpdate\"\r\n :show.sync=\"show.addFriend\"\r\n :callback=\"closeAddObjDialogFn\"\r\n title=\"全站搜索\"\r\n >\r\n <template v-slot:content>\r\n <pps-input\r\n @change=\"searchFn()\"\r\n clearable\r\n :content.sync=\"searchDialog.input\"\r\n :placeholder=\"`请输入${searchDialog.tabs[searchDialog.index]} ID`\"\r\n >\r\n <span slot=\"prepend\" style=\"padding: 0 8px\">\r\n {{ searchDialog.tabPrefix[searchDialog.index] }}-\r\n </span>\r\n </pps-input>\r\n <k-tab ref=\"k-tab\" :tabs=\"searchDialog.tabs\" @changeTab=\"switchSearchTabFn\">\r\n <template v-slot:thumb>\r\n <div class=\"thumb\"></div>\r\n </template>\r\n </k-tab>\r\n <el-table :data=\"tableData\" border style=\"width: 100%\">\r\n <el-table-column align=\"center\" label=\"搜索结果\">\r\n <template slot-scope=\"scope\">\r\n <img class=\"avatar\" :src=\"scope.row.avatar\" alt=\"\" />\r\n </template>\r\n </el-table-column>\r\n <el-table-column align=\"center\" prop=\"name\" label=\"昵称\"></el-table-column>\r\n <el-table-column align=\"center\" prop=\"id\" label=\"id\"></el-table-column>\r\n <el-table-column align=\"center\" label=\"操作\">\r\n <template slot-scope=\"{ row }\">\r\n <pps-button @click=\"addFriendFn(row.id)\" :disabled=\"row.isAdded\">\r\n {{ row.isAdded ? '已添加' : '添加' }}\r\n </pps-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </template>\r\n </pps-dialog>\r\n\r\n <!-- 创建群聊 对话框 -->\r\n <pps-dialog\r\n class=\"create-group-dialog\"\r\n :show.sync=\"show.createGroup\"\r\n @confirmed=\"createGroupFn\"\r\n title=\"发起群聊\"\r\n >\r\n <template v-slot:content>\r\n <div class=\"create-group-content\">\r\n <div class=\"left\" style=\"text-align: center\">\r\n <h4>好友列表</h4>\r\n <el-table\r\n @selection-change=\"handleSelectionChange\"\r\n :show-header=\"true\"\r\n :data=\"getFriendListExceptSuper\"\r\n >\r\n <el-table-column type=\"selection\" align=\"center\" label=\"选择\"></el-table-column>\r\n <el-table-column align=\"center\" label=\"头像\">\r\n <template slot-scope=\"{ row }\">\r\n <pps-avatar :src=\"row.avatar\" size=\"30\" :title=\"row.name\"></pps-avatar>\r\n </template>\r\n </el-table-column>\r\n <el-table-column prop=\"name\" align=\"center\" label=\"名称\"></el-table-column>\r\n </el-table>\r\n </div>\r\n <div class=\"right\">\r\n <pps-input label=\"群聊ID\" :content.sync=\"createGroup.id\" placeholder=\"请输入ID\" />\r\n <pps-input label=\"群聊名称\" :content.sync=\"createGroup.name\" placeholder=\"请输入名称\" />\r\n <pps-input\r\n label=\"群聊头像\"\r\n :content.sync=\"createGroup.avatar\"\r\n placeholder=\"请输入链接\"\r\n />\r\n </div>\r\n </div>\r\n </template>\r\n </pps-dialog>\r\n\r\n <!-- 好友列表 -->\r\n <pps-dialog :show.sync=\"show.friendList\" title=\"好友列表\" :callback=\"closeUserInfoFn\">\r\n <template v-slot:content>\r\n <el-table :show-header=\"true\" :data=\"selectFreindLIst\">\r\n <el-table-column align=\"center\" label=\"头像\">\r\n <template slot-scope=\"scope\">\r\n <pps-avatar :src=\"scope.row.avatar\" size=\"40\"></pps-avatar>\r\n </template>\r\n </el-table-column>\r\n <el-table-column align=\"center\" prop=\"id\" label=\"id\"></el-table-column>\r\n <el-table-column align=\"center\" prop=\"name\" label=\"昵称\"></el-table-column>\r\n <el-table-column align=\"center\" label=\"操作\">\r\n <template slot-scope=\"{ row }\">\r\n <pps-button\r\n :disabled=\"row.id === 'user-super-admin'\"\r\n theme=\"danger\"\r\n @click=\"removeFriendFn(row.id)\"\r\n >\r\n 删除\r\n </pps-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </template>\r\n </pps-dialog>\r\n\r\n <!-- 群聊列表 -->\r\n <pps-dialog :show.sync=\"show.groupList\" title=\"群聊列表\" :callback=\"closeUserInfoFn\">\r\n <template v-slot:content>\r\n <el-table :data=\"selcetGroupList\">\r\n <el-table-column align=\"center\" label=\"群聊头像\">\r\n <template slot-scope=\"scope\">\r\n <pps-avatar :src=\"scope.row.avatar\" size=\"40\"></pps-avatar>\r\n </template>\r\n </el-table-column>\r\n <el-table-column align=\"center\" prop=\"id\" label=\"群聊id\"></el-table-column>\r\n <el-table-column align=\"center\" prop=\"name\" label=\"群聊名称\"></el-table-column>\r\n <el-table-column align=\"center\" label=\"操作\">\r\n <template slot-scope=\"{ row }\">\r\n <pps-button\r\n :disabled=\"row.lord !== userDetailDate.id\"\r\n v-if=\"row.lord === userDetailDate.id\"\r\n theme=\"danger\"\r\n @click=\"removeGroupFn(row)\"\r\n >\r\n 解散\r\n </pps-button>\r\n <pps-button v-else theme=\"primary\" @click=\"leaveGroupFn(row)\">退出</pps-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </template>\r\n </pps-dialog>\r\n\r\n <!-- 用户信息 -->\r\n <pps-dialog :show.sync=\"show.userInfo\" title=\"用户信息\" :callback=\"closeUserInfoFn\">\r\n <template v-slot:content>\r\n <div class=\"user-info-wrapper\">\r\n <img class=\"user-avatar\" :src=\"userDetailDate.avatar\" alt=\"\" />\r\n <el-descriptions class=\"margin-top\" :column=\"2\" border>\r\n <el-descriptions-item>\r\n <template slot=\"label\">昵称</template>\r\n {{ userDetailDate.name }}\r\n </el-descriptions-item>\r\n <el-descriptions-item>\r\n <template slot=\"label\">ID</template>\r\n {{ userDetailDate.id }}\r\n </el-descriptions-item>\r\n <el-descriptions-item>\r\n <template slot=\"label\">年龄</template>\r\n {{ userDetailDate.age }}\r\n </el-descriptions-item>\r\n <el-descriptions-item>\r\n <template slot=\"label\">性别</template>\r\n {{ userDetailDate.sex }}\r\n </el-descriptions-item>\r\n </el-descriptions>\r\n </div>\r\n </template>\r\n </pps-dialog>\r\n </k-container>\r\n</template>\r\n\r\n<script>\r\nimport { mapGetters } from 'vuex';\r\n// import debounce from 'debounce';\r\nimport kContainer from '@/components/layout/container';\r\nimport kMenuItem from '@/components/menus/menu-item.vue';\r\nimport kMenu from '@/components/menus/index.vue';\r\nimport kSbAside from '@/components/layout/aside';\r\nimport kTab from './tab/tab.vue';\r\nimport User from '@/utils/sandBox/user';\r\nimport Administrators from '@/utils/sandBox/administrators';\r\nimport ADD_USER_IMG from '@/assets/addAvatar.svg';\r\nimport REMOVE_USER from '@/assets/removeAvatar.svg';\r\nimport grayButton from '../ui/grayButton.vue';\r\nimport { formatTimestamp } from '@/utils/formatTimeStamp';\r\nexport default {\r\n name: 'sb-left-aside',\r\n components: { kSbAside, kContainer, kMenu, kMenuItem, kTab, grayButton },\r\n data() {\r\n return {\r\n users: [],\r\n admin: new Administrators(),\r\n ADD_USER_IMG,\r\n REMOVE_USER,\r\n messageMode: 0,\r\n messageList: [],\r\n show: {\r\n createUser: false,\r\n createGroup: false,\r\n removeUser: false,\r\n addFriend: false,\r\n friendList: false,\r\n groupList: false,\r\n userInfo: false,\r\n isCollapseMsg: true\r\n },\r\n createUser: {\r\n name: null,\r\n avatar: null,\r\n id: null,\r\n age: null,\r\n sex: '男'\r\n },\r\n createGroup: {\r\n id: null,\r\n name: null,\r\n avatar: null,\r\n members: [],\r\n checkList: []\r\n },\r\n removeUser: null,\r\n searchDialog: {\r\n tabs: ['用户', '群聊', '机器人'],\r\n tabPrefix: ['user', 'group', 'user'],\r\n index: 0,\r\n input: ''\r\n },\r\n tableData: [],\r\n userDetailDate: {}\r\n };\r\n },\r\n props: {\r\n updateChatTarget: {\r\n type: Function,\r\n default() {\r\n return null;\r\n }\r\n },\r\n updateCollapseMsg: {\r\n type: Function,\r\n default() {\r\n return null;\r\n }\r\n }\r\n },\r\n methods: {\r\n collapseMsghandler(state) {\r\n this.show.isCollapseMsg = state;\r\n this.updateCollapseMsg(state);\r\n },\r\n switchUserFn(id) {\r\n if (this.getCurrentUser.id === id) return;\r\n this.$store.commit('sandBox/SWITCH_USER', id);\r\n this.$refs.msgMenuRef.activeIndex = null;\r\n this.$store.commit('sandBox/SWITCH_CHAT');\r\n this.updateChatTarget(null, false, null);\r\n this.collapseMsghandler(true);\r\n },\r\n removeUserFn(id) {\r\n this.admin.removeUserById(id);\r\n this.$store.commit('sandBox/SWITCH_USER');\r\n },\r\n createUserFn() {\r\n const adder = this.createUser;\r\n const hasData = adder.id && adder.name && adder.age && adder.sex;\r\n if (!hasData) {\r\n this.$dialog({ title: '警告', content: '请填写完整信息' })\r\n .then((action) => {\r\n this.show.createUser = true;\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n return;\r\n }\r\n // eslint-disable-next-line no-unused-vars\r\n const newUser = new User({\r\n numId: adder.id,\r\n name: adder.name,\r\n age: adder.age,\r\n sex: adder.sex,\r\n avatar: adder.avatar\r\n });\r\n const res = newUser.mount();\r\n if (!res) {\r\n this.$dialog({ title: '警告', content: '用户已存在' })\r\n .then((action) => {})\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n }\r\n this.cancelCreateUserFn();\r\n },\r\n createGroupFn() {\r\n const res = this.admin.createGroup({\r\n id: this.createGroup.id,\r\n name: this.createGroup.name,\r\n lord: this.userDetailDate.id,\r\n avatar: this.createGroup.avatar,\r\n members: this.createGroup.checkList\r\n });\r\n if (!res) {\r\n this.$dialog({ title: '警告', content: '群聊创建失败!信息不完整或已存在' })\r\n .then((action) => {\r\n this.show.createGroup = true;\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n }\r\n },\r\n handleSelectionChange(val) {\r\n this.createGroup.checkList = val;\r\n },\r\n cancelCreateUserFn() {\r\n this.createUser = {\r\n name: null,\r\n avatar: null,\r\n id: null,\r\n age: null,\r\n sex: null\r\n };\r\n },\r\n contextMenuFn(menu) {\r\n this.removeUser = menu.uid;\r\n if (menu.task === 2) {\r\n this.show.removeUser = true;\r\n } else if (menu.task === 1) {\r\n this.userDetailDate = this.admin.getUserById(menu.uid);\r\n this.show.createGroup = true;\r\n }\r\n },\r\n toggleMsgTabFn(tab) {\r\n this.messageMode = tab;\r\n },\r\n switchSearchTabFn(tab) {\r\n this.searchDialog.index = tab;\r\n this.searchFn();\r\n },\r\n searchFn() {\r\n this.tableData = [];\r\n const id = this.searchDialog.input;\r\n if (!id) return;\r\n const self = new User(this.getCurrentUser);\r\n const admin = new Administrators();\r\n switch (this.searchDialog.index) {\r\n case 0: {\r\n const userListWithSuper = admin.getAllUser();\r\n userListWithSuper.forEach((user) => {\r\n if (user.isSuper) return;\r\n if (user.numId.includes(id)) {\r\n const isAdded = self.friends.some((friend) => friend.id === user.id);\r\n this.tableData.push({ ...user, isAdded });\r\n }\r\n });\r\n break;\r\n }\r\n case 1: {\r\n const groupList = admin.getAllGroup();\r\n groupList.forEach((group) => {\r\n if (group.id.includes(id)) {\r\n const isAdded = self.groups.some((g) => g.id === group.id);\r\n this.tableData.push({ ...group, isAdded });\r\n }\r\n });\r\n break;\r\n }\r\n case 2: {\r\n const userList = admin.getAllUser();\r\n userList.forEach((user) => {\r\n if (!user.isSuper) return;\r\n if (user.numId.includes(id)) {\r\n const isAdded = self.friends.some((f) => f.id === user.id);\r\n this.tableData.push({ ...user, isAdded });\r\n }\r\n });\r\n break;\r\n }\r\n }\r\n },\r\n closeAddObjDialogFn() {\r\n this.tableData = [];\r\n this.searchDialog.input = '';\r\n },\r\n addFriendFn(id) {\r\n const user = new User(this.getCurrentUser);\r\n switch (this.searchDialog.index) {\r\n case 0: {\r\n const targetUser = this.admin.getUserById(id);\r\n this.$emit('handleMenuAction', {\r\n targetUser,\r\n actionType: 'ADD_FRIEND'\r\n });\r\n break;\r\n }\r\n case 1:\r\n user.addGroupById(id);\r\n break;\r\n case 2:\r\n // this.tableData = admin.getAllRobots();\r\n break;\r\n }\r\n },\r\n removeFriendFn(fid) {\r\n const targetUser = this.admin.getUserById(fid);\r\n this.$emit('handleMenuAction', {\r\n targetUser,\r\n actionType: 'REMOVE_FRIEND',\r\n currentUser: this.userDetailDate\r\n });\r\n },\r\n emitTabUpdate() {\r\n this.$refs['k-tab'].changeTabFn();\r\n },\r\n deleteFriendMsgFn(friend) {\r\n const curUser = new User(this.getCurrentUser);\r\n const res = curUser.deleteFriendMessage(friend.id);\r\n console.log('删除消息', res);\r\n },\r\n removeGroupFn(group) {\r\n const targetUser = new User(this.userDetailDate);\r\n this.$emit('handleMenuAction', {\r\n targetUser,\r\n groupId: group.id,\r\n actionType: 'REMOVE_GROUP'\r\n });\r\n },\r\n leaveGroupFn(group) {\r\n const targetUser = new User(this.userDetailDate);\r\n this.$emit('handleMenuAction', {\r\n targetUser,\r\n groupId: group.id,\r\n actionType: 'LEAVE_GROUP'\r\n });\r\n },\r\n selectMsgFn({ index }) {\r\n const user = new User(this.getCurrentUser);\r\n let chat;\r\n if (this.messageMode) {\r\n chat = user.getGroupMessageById(index);\r\n this.$store.commit('sandBox/SWITCH_CHAT', chat);\r\n this.updateChatTarget(index, true, chat.name);\r\n } else {\r\n chat = user.getFriendMessageById(index);\r\n this.$store.commit('sandBox/SWITCH_CHAT', chat);\r\n const friend = this.admin.getUserById(index);\r\n this.updateChatTarget(index, false, friend.name);\r\n }\r\n this.$emit('switchMsg', chat);\r\n this.collapseMsghandler(!this.getIsNarrowScreen);\r\n },\r\n selectNewMsgFn(msg) {\r\n console.log(msg);\r\n return 'test';\r\n },\r\n showUserDetailFn(userInfo) {\r\n Object.assign(this.userDetailDate, userInfo);\r\n this.show.userInfo = true;\r\n },\r\n closeUserInfoFn() {\r\n this.userDetailDate = {};\r\n },\r\n showFriendListFn(user) {\r\n this.userDetailDate = user;\r\n this.show.friendList = true;\r\n },\r\n showGroupListFn(user) {\r\n this.userDetailDate = user;\r\n this.show.groupList = true;\r\n },\r\n bulkCreateUsers() {\r\n const userList = [\r\n { numId: '1', name: 'u1', age: 18, sex: '男' },\r\n { numId: '2', name: 'u2', age: 18, sex: '男' },\r\n { numId: '3', name: 'u3', age: 18, sex: '男' },\r\n { numId: '4', name: 'u4', age: 20, sex: '女' },\r\n { numId: '5', name: 'u5', age: 18, sex: '女' },\r\n { numId: '6', name: 'u6', age: 18, sex: '女' },\r\n { numId: '7', name: 'u7', age: 18, sex: '女' },\r\n { numId: '8', name: 'u8', age: 18, sex: '女' }\r\n ];\r\n\r\n userList.forEach((user) => {\r\n const u = new User(user).mount();\r\n console.log(u);\r\n });\r\n }\r\n },\r\n computed: {\r\n ...mapGetters('sandBox', ['getCurrentUser', 'getAllUser', 'getCurrentMsg']),\r\n ...mapGetters('layoutOption', ['getIsNarrowScreen']),\r\n showMessageList() {\r\n const user = new User(this.getCurrentUser);\r\n let chatList = [];\r\n if (this.messageMode) {\r\n chatList = user.groups.map(({ id }) => {\r\n let message, date;\r\n const group = user.getGroupById(id);\r\n const lastMessage = user.getGroupMessageById(id).messages.at(-1);\r\n if (lastMessage === undefined) {\r\n message = '\\u00A0';\r\n date = '';\r\n } else {\r\n const sender = this.admin.getUserById(lastMessage.role);\r\n message = `${sender.name}: ${lastMessage.content}`;\r\n date = formatTimestamp(lastMessage.date);\r\n }\r\n return { ...group, message, date };\r\n });\r\n } else {\r\n // 获取好友列表和最新信息\r\n chatList = user.friends.map((friend) => {\r\n let message, date;\r\n const lastMessage = user.getFriendMessageById(friend.id).at(-1);\r\n if (lastMessage === undefined) {\r\n message = '\\u00A0';\r\n date = '';\r\n } else {\r\n message = lastMessage.content;\r\n date = formatTimestamp(lastMessage.date);\r\n }\r\n return { ...friend, message, date };\r\n });\r\n }\r\n return chatList;\r\n },\r\n getFriendListExceptSuper() {\r\n const targetUser = this.admin.getUserById(this.userDetailDate.id);\r\n const list = targetUser.friends.filter((friend) => friend.id !== 'user-super-admin');\r\n return list;\r\n },\r\n selectFreindLIst() {\r\n const user = new User(this.userDetailDate);\r\n const friend_list = user.friends;\r\n return friend_list;\r\n },\r\n selcetGroupList() {\r\n const user = new User(this.userDetailDate);\r\n const group_list = user.getAllGroups();\r\n return group_list;\r\n }\r\n },\r\n watch: {\r\n getIsNarrowScreen(val) {\r\n if (val) {\r\n this.show.isCollapseMsg = false;\r\n } else {\r\n this.show.isCollapseMsg = true;\r\n }\r\n }\r\n },\r\n created() {},\r\n mounted() {\r\n this.collapseMsghandler(true);\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.left-aside {\r\n height: var(--k-main);\r\n position: relative;\r\n .mask {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100dvw;\r\n height: 100%;\r\n background: #000;\r\n opacity: 0.5;\r\n z-index: 3;\r\n }\r\n\r\n .aside-users {\r\n width: 60px;\r\n background-color: #f2f2f2;\r\n border-bottom: 2px solid #e9e9e9;\r\n border-right: 2px solid #e9e9e9;\r\n z-index: 5;\r\n\r\n .k-chat-header {\r\n position: sticky;\r\n top: 0;\r\n min-height: 60px;\r\n z-index: 1;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n // background-color: #e9e9e9;\r\n border-bottom: 2px solid #e9e9e9;\r\n\r\n & ::v-deep .add-user-avatar {\r\n width: 45px;\r\n height: 45px;\r\n\r\n &:hover {\r\n transform: scale(1.1);\r\n transition: all 0.3s ease;\r\n }\r\n\r\n img {\r\n width: 100%;\r\n height: 100%;\r\n vertical-align: bottom;\r\n border-radius: 50%;\r\n cursor: pointer;\r\n &:hover {\r\n background-color: #fff;\r\n }\r\n }\r\n }\r\n }\r\n .user-avatar {\r\n width: 40px;\r\n height: 40px;\r\n transition: transform 0.15s ease;\r\n\r\n &:hover {\r\n transform: scale(1.1);\r\n }\r\n &:active {\r\n transform: scale(0.9);\r\n }\r\n .user-avatar-img {\r\n width: 100%;\r\n height: 100%;\r\n vertical-align: bottom;\r\n border-radius: 50%;\r\n }\r\n }\r\n & ::v-deep .pps-context-menu_wrapper {\r\n width: 150px;\r\n .pps-context-menu_prepend {\r\n div {\r\n height: 100%;\r\n padding: 4px;\r\n &:hover {\r\n background: #f5f5f5;\r\n }\r\n }\r\n }\r\n .delete-user {\r\n width: 100%;\r\n padding: 5px;\r\n border-radius: inherit;\r\n color: red;\r\n &:hover {\r\n background: #f5f5f5;\r\n }\r\n }\r\n .menu-item {\r\n padding: 5px;\r\n cursor: pointer;\r\n border-radius: inherit;\r\n &:hover {\r\n background: #f5f5f5;\r\n }\r\n }\r\n }\r\n .remove-user-button {\r\n position: sticky;\r\n bottom: 0;\r\n width: 60px;\r\n height: 60px;\r\n line-height: 60px;\r\n text-align: center;\r\n border-top: 2px solid #e9e9e9;\r\n box-sizing: border-box;\r\n cursor: pointer;\r\n\r\n img {\r\n width: 45px;\r\n border-radius: 50%;\r\n &:hover {\r\n background-color: #fff;\r\n }\r\n }\r\n }\r\n & ::v-deep .k-aside-inner {\r\n &::-webkit-scrollbar {\r\n width: 0px;\r\n }\r\n }\r\n .fill-empty {\r\n height: 0;\r\n flex-grow: 1;\r\n }\r\n }\r\n .aside-list {\r\n flex-grow: 1;\r\n max-width: 241px;\r\n background-color: #fff;\r\n border-bottom: 2px solid #e9e9e9;\r\n border-right: 2px solid #e9e9e9;\r\n\r\n @media screen and (max-width: 528px) {\r\n position: fixed;\r\n left: 60px;\r\n // min-width: calc(100dvw - 60px); // 无法触发过渡效果\r\n z-index: 4;\r\n }\r\n\r\n .k-chat-header {\r\n display: flex;\r\n align-items: center;\r\n border-bottom: 2px solid #e9e9e9;\r\n\r\n .icon-btn {\r\n margin-left: 10px;\r\n }\r\n .k-tab-wrapper {\r\n margin-left: 15px;\r\n }\r\n &:last-child {\r\n margin-right: 10px;\r\n }\r\n }\r\n\r\n .list {\r\n .k-menu-item {\r\n border-radius: initial;\r\n margin-block-start: 0;\r\n .list-item {\r\n display: inline-flex;\r\n align-items: center;\r\n width: 100%;\r\n padding: 0 10px;\r\n .name {\r\n margin-inline-start: 10px;\r\n flex: 1;\r\n min-width: 0;\r\n .name__message {\r\n font-size: 12px;\r\n color: var(--sb-reply-color);\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n }\r\n .closeBtn {\r\n margin-left: auto;\r\n font-size: 12px;\r\n color: var(--sb-reply-color);\r\n }\r\n }\r\n }\r\n .k-menu-item.active {\r\n .name__message {\r\n color: #fff !important;\r\n }\r\n .closeBtn {\r\n color: #fff !important;\r\n }\r\n }\r\n }\r\n }\r\n .create-user-dialog {\r\n .pps-form {\r\n box-sizing: border-box;\r\n .user-sex-wrapper {\r\n display: flex;\r\n align-items: center;\r\n height: 38px;\r\n line-height: 38px;\r\n margin: 20px 0;\r\n\r\n .sex-text-label {\r\n width: 4rem;\r\n text-align: right;\r\n margin-right: 15px;\r\n }\r\n }\r\n }\r\n .quick-wrapper {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 10px;\r\n background: #f5f7fa;\r\n border-radius: 8px;\r\n .quick__btn {\r\n border-radius: 6px;\r\n padding: 6px 12px;\r\n\r\n i{ margin-right: 2px;}\r\n }\r\n }\r\n }\r\n .add-friend-dialog {\r\n height: 100%;\r\n width: fit-content;\r\n @media screen and (max-width: 700px) {\r\n width: 100%;\r\n }\r\n .pps-dialog-window {\r\n .pps-input {\r\n width: 100%;\r\n }\r\n .k-tab-wrapper {\r\n margin-top: 20px;\r\n background: #fff;\r\n margin-bottom: 20px;\r\n .thumb {\r\n position: absolute;\r\n bottom: 0;\r\n height: 3px;\r\n width: 60px;\r\n background-color: blueviolet;\r\n }\r\n }\r\n .el-table__body {\r\n width: auto !important;\r\n }\r\n }\r\n .avatar {\r\n border-radius: 50%;\r\n width: 35px;\r\n }\r\n }\r\n .create-group-dialog {\r\n height: 100%;\r\n .create-group-content {\r\n display: flex;\r\n flex-direction: column-reverse;\r\n gap: 20px;\r\n width: 100%;\r\n img {\r\n width: 30px;\r\n border-radius: 50%;\r\n }\r\n }\r\n .pps-input-label {\r\n width: 60px;\r\n text-align: right;\r\n }\r\n @media screen and (max-width: 700px) {\r\n width: 100%;\r\n }\r\n }\r\n .user-info-wrapper {\r\n display: flex;\r\n justify-content: center;\r\n height: 100px;\r\n\r\n .el-descriptions {\r\n &::v-deep .el-descriptions__body {\r\n table {\r\n height: 100px;\r\n }\r\n }\r\n }\r\n\r\n .user-avatar {\r\n border: 1px solid #ebeef5;\r\n box-sizing: border-box;\r\n height: 100px;\r\n width: 100px;\r\n }\r\n }\r\n}\r\n\r\n.empty {\r\n height: calc(var(--k-main-height) - var(--k-footer-height));\r\n}\r\n.avatar-img {\r\n border-radius: 50%;\r\n}\r\n\r\n// 过渡\r\n.v-enter,\r\n.v-leave-to {\r\n width: 0;\r\n // transform: translateX(-241px);\r\n // left: 0px;\r\n}\r\n.v-enter-active,\r\n.v-leave-active {\r\n transition: 0.3s ease-in-out;\r\n}\r\n.v-enter-to,\r\n.v-leave {\r\n width: 241px;\r\n // transform: translateX(0);\r\n // left: 60px;\r\n}\r\n.isTransparent {\r\n z-index: -111;\r\n}\r\n</style>\r\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./left.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./left.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./left.vue?vue&type=template&id=d637fd6a&scoped=true\"\nimport script from \"./left.vue?vue&type=script&lang=js\"\nexport * from \"./left.vue?vue&type=script&lang=js\"\nimport style0 from \"./left.vue?vue&type=style&index=0&id=d637fd6a&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d637fd6a\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('transition',[_c('div',{staticClass:\"right-aside-wapper\"},[_c('k-sb-aside',{staticClass:\"aside-group\",scopedSlots:_vm._u([{key:\"inner\",fn:function(){return [_c('ul',{staticClass:\"member-list\"},_vm._l((_vm.sortedMemberList),function(user,index){return _c('li',{key:index,staticClass:\"member-item\",on:{\"click\":function($event){return _vm.viewUserProfile(user)}}},[_c('pps-context-menu',{attrs:{\"menus\":_vm.getUserMenuItems(user)},on:{\"select\":_vm.avatarContextMenuFn}},[_c('div',{staticClass:\"user-item\",attrs:{\"slot\":\"content\"},slot:\"content\"},[_c('pps-avatar',{attrs:{\"src\":user.avatar,\"size\":\"20\"}}),_c('div',{staticClass:\"user-name\"},[_vm._v(_vm._s(user.name))]),(_vm.chatTarget.isGroup)?_c('div',{staticClass:\"user-role\",class:user.role},[_vm._v(\" \"+_vm._s(_vm.tranRoleFn(user.role))+\" \")]):_vm._e()],1)])],1)}),0)]},proxy:true}])},[_c('div',{staticClass:\"member-title\"},[_c('div',{staticClass:\"title\"},[_vm._v(\"群聊成员-\"+_vm._s(_vm.getGroupMemberLength)+\"人\")]),_c('div',{staticClass:\"btn-area\"},[_c('gray-button',{staticClass:\"icon-btn\",nativeOn:{\"click\":function($event){_vm.isShowFriendList = true}}},[_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":\"邀请加群\",\"placement\":\"top\"}},[_c('svg',{staticClass:\"icon\",attrs:{\"t\":\"1723230695956\",\"viewBox\":\"0 0 1024 1024\",\"version\":\"1.1\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"p-id\":\"34315\",\"width\":\"16\",\"height\":\"16\",\"data-spm-anchor-id\":\"a313x.search_index.0.i6.27883a81IeQ0Uy\"}},[_c('path',{attrs:{\"d\":\"M914.618182 477.090909H546.909091V109.381818c0-18.618182-16.290909-34.909091-34.909091-34.909091s-34.909091 16.290909-34.909091 34.909091v367.709091H109.381818c-18.618182 0-34.909091 16.290909-34.909091 34.909091s16.290909 34.909091 34.909091 34.909091h367.709091v367.709091c0 18.618182 16.290909 34.909091 34.909091 34.909091s34.909091-16.290909 34.909091-34.909091V546.909091h367.709091c18.618182 0 34.909091-16.290909 34.909091-34.909091s-16.290909-34.909091-34.909091-34.909091z\",\"fill\":\"#7a7a7a\",\"p-id\":\"34316\"}})])])],1),(_vm.isShowMuteBtn)?_c('gray-button',{staticClass:\"icon-btn\",nativeOn:{\"click\":function($event){return _vm.muteGroup.apply(null, arguments)}}},[_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":_vm.isMuteAll ? '解开禁言' : '全体禁言',\"placement\":\"top\"}},[_c('i',{class:_vm.muteBtnClass})])],1):_vm._e(),_c('gray-button',{staticClass:\"icon-btn leave\",nativeOn:{\"click\":function($event){return _vm.leaveGroupFn()}}},[_c('el-tooltip',{attrs:{\"effect\":\"dark\",\"content\":\"退出群聊\",\"placement\":\"top\"}},[_c('i',{staticClass:\"layui-icon layui-icon-close\"})])],1)],1)])]),_c('pps-dialog',{attrs:{\"show\":_vm.isShowFriendList,\"title\":\"好友列表\"},on:{\"update:show\":function($event){_vm.isShowFriendList=$event}},scopedSlots:_vm._u([{key:\"content\",fn:function(){return [_c('el-table',{attrs:{\"show-header\":true,\"data\":_vm.getCurrentUser.friends}},[_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"头像\"},scopedSlots:_vm._u([{key:\"default\",fn:function(scope){return [_c('pps-avatar',{attrs:{\"src\":scope.row.avatar,\"size\":\"40\"}})]}}])}),_c('el-table-column',{attrs:{\"align\":\"center\",\"prop\":\"id\",\"label\":\"id\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"prop\":\"name\",\"label\":\"昵称\"}}),_c('el-table-column',{attrs:{\"align\":\"center\",\"label\":\"操作\"},scopedSlots:_vm._u([{key:\"default\",fn:function({ row }){return [_c('pps-button',{attrs:{\"disabled\":_vm.isInvited(row),\"theme\":_vm.isInvited(row) ? 'primary' : 'confirm'},on:{\"click\":function($event){return _vm.inviteFriendFn(row)}}},[_vm._v(\" \"+_vm._s(_vm.isInvited(row) ? '已进群' : '邀请')+\" \")])]}}])})],1)]},proxy:true}])})],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","// 角色权限级别\r\nconst ROLE_LEVEL = {\r\n member: 1,\r\n admin: 2,\r\n lord: 3,\r\n 'super-admin': 4\r\n};\r\n\r\n// 菜单项定义\r\nconst MENU_ITEMS = {\r\n VIEW_PROFILE: {\r\n label: '查看资料',\r\n roles: ['member', 'admin', 'lord', 'super-admin']\r\n },\r\n AT_USER: {\r\n label: '@ TA',\r\n roles: ['member', 'admin', 'lord', 'super-admin'],\r\n excludeSelf: true\r\n },\r\n ADD_FRIEND: {\r\n label: '添加好友',\r\n roles: ['member', 'admin', 'lord', 'super-admin'],\r\n excludeSelf: true,\r\n friendRelation: 'not-friend'\r\n },\r\n REMOVE_FRIEND: {\r\n label: '移除好友',\r\n roles: ['member', 'admin', 'lord', 'super-admin'],\r\n excludeSelf: true,\r\n friendRelation: 'friend'\r\n },\r\n MUTE_USER: {\r\n label: '设置禁言',\r\n roles: ['admin', 'lord', 'super-admin'],\r\n minTargetLevel: 1, // 只能禁言普通成员\r\n maxTargetLevel: 1, // 只能禁言普通成员\r\n requireNotMuted: true\r\n },\r\n UNMUTE_USER: {\r\n label: '取消禁言',\r\n roles: ['admin', 'lord', 'super-admin'],\r\n minTargetLevel: 1, // 只能取消普通成员的禁言\r\n maxTargetLevel: 1, // 只能取消普通成员的禁言\r\n requireMuted: true\r\n },\r\n REMOVE_USER: {\r\n label: '移出本群',\r\n roles: ['admin', 'lord', 'super-admin'],\r\n minTargetLevel: 1,\r\n maxTargetLevel: 1\r\n },\r\n SET_ADMIN: {\r\n label: '设为管理',\r\n roles: ['lord', 'super-admin'],\r\n minTargetLevel: 1,\r\n maxTargetLevel: 1,\r\n requireNotAdmin: true\r\n },\r\n REVOKE_ADMIN: {\r\n label: '撤销管理',\r\n roles: ['lord', 'super-admin'],\r\n minTargetLevel: 2,\r\n maxTargetLevel: 2,\r\n requireAdmin: true\r\n }\r\n};\r\n\r\n/**\r\n * 获取用户可见的菜单项\r\n * @param {Object} currentUser - 当前操作者\r\n * @param {Object} targetUser - 目标用户\r\n * @param {Object} group - 群组信息\r\n * @returns {Array} 可见的菜单项列表\r\n */\r\nexport const getVisibleMenuItems = (currentUser = { role: null, id: null }, targetUser, group) => {\r\n if (!targetUser) return [];\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n const currentLevel = ROLE_LEVEL[currentUser.role] || 0;\r\n const targetLevel = ROLE_LEVEL[targetUser.role] || 0;\r\n const isFriend = isMemberFriend(currentUser, targetUser);\r\n const isMuted = isMemberMuted(targetUser, group);\r\n const isAdmin = isMemberAdmin(targetUser, group);\r\n\r\n return Object.entries(MENU_ITEMS)\r\n .filter(([key, item]) => {\r\n const {\r\n roles,\r\n excludeSelf,\r\n friendRelation,\r\n minTargetLevel,\r\n maxTargetLevel,\r\n requireMuted,\r\n requireNotMuted,\r\n requireAdmin,\r\n requireNotAdmin\r\n } = item;\r\n // 检查当前用户是否有权限\r\n if (!roles.includes(currentUser.role)) return errorLogFn('您没有权限执行此操作');\r\n\r\n // 排除自身操作\r\n if (excludeSelf && currentUser.id === targetUser.id) return errorLogFn('您不能操作自己');\r\n\r\n // 检查目标用户等级限制\r\n if (minTargetLevel && targetLevel < minTargetLevel) return errorLogFn('目标用户等级不足');\r\n if (maxTargetLevel && targetLevel > maxTargetLevel) return errorLogFn('目标用户等级过高');\r\n\r\n // 检查用户是否符合好友关系\r\n if (friendRelation === 'friend' && !isFriend) return errorLogFn('您不是好友关系');\r\n if (friendRelation === 'not-friend' && isFriend) return errorLogFn('您已经是好友关系');\r\n\r\n // 检查禁言状态\r\n if (requireMuted && !isMuted) return errorLogFn('用户未被禁言');\r\n if (requireNotMuted && isMuted) return errorLogFn('用户被已禁言');\r\n\r\n // 检查是否为管理员\r\n if (requireAdmin && !isAdmin) return errorLogFn('用户不是群组管理员');\r\n if (requireNotAdmin && isAdmin) return errorLogFn('用户是群组管理员');\r\n\r\n return true;\r\n })\r\n .map(([key, item]) => ({\r\n key,\r\n label: item.label,\r\n uid: targetUser.id,\r\n task: key.toLowerCase().replace(/_/g, '-')\r\n }));\r\n};\r\n// eslint-disable-next-line node/handle-callback-err\r\nconst errorLogFn = (error) => {\r\n // console.error(error);\r\n return false;\r\n};\r\nconst isMemberMuted = (targetUser, group) => {\r\n return group.getAllMessage().muteMembers.includes(targetUser.id) || false;\r\n};\r\nconst isMemberFriend = (currentUser, targetUser) => {\r\n return currentUser.friends.some(({ id }) => id === targetUser.id);\r\n};\r\nconst isMemberAdmin = (targetUser, group) => {\r\n const member = group.getMemberById(targetUser.id);\r\n const role_m = member.role;\r\n const role_g = targetUser.groups.find(({ id }) => id === group.id).role;\r\n if (role_m === 'admin' || role_g === 'admin') return true;\r\n return false;\r\n};\r\n","<template>\r\n <transition>\r\n <div class=\"right-aside-wapper\">\r\n <k-sb-aside class=\"aside-group\">\r\n <div class=\"member-title\">\r\n <div class=\"title\">群聊成员-{{ getGroupMemberLength }}人</div>\r\n <div class=\"btn-area\">\r\n <!-- 邀请好友 -->\r\n <gray-button class=\"icon-btn\" @click.native=\"isShowFriendList = true\">\r\n <el-tooltip effect=\"dark\" content=\"邀请加群\" placement=\"top\">\r\n <svg\r\n t=\"1723230695956\"\r\n class=\"icon\"\r\n viewBox=\"0 0 1024 1024\"\r\n version=\"1.1\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n p-id=\"34315\"\r\n width=\"16\"\r\n height=\"16\"\r\n data-spm-anchor-id=\"a313x.search_index.0.i6.27883a81IeQ0Uy\"\r\n >\r\n <path\r\n d=\"M914.618182 477.090909H546.909091V109.381818c0-18.618182-16.290909-34.909091-34.909091-34.909091s-34.909091 16.290909-34.909091 34.909091v367.709091H109.381818c-18.618182 0-34.909091 16.290909-34.909091 34.909091s16.290909 34.909091 34.909091 34.909091h367.709091v367.709091c0 18.618182 16.290909 34.909091 34.909091 34.909091s34.909091-16.290909 34.909091-34.909091V546.909091h367.709091c18.618182 0 34.909091-16.290909 34.909091-34.909091s-16.290909-34.909091-34.909091-34.909091z\"\r\n fill=\"#7a7a7a\"\r\n p-id=\"34316\"\r\n ></path>\r\n </svg>\r\n </el-tooltip>\r\n </gray-button>\r\n <!-- 全体禁言 -->\r\n <gray-button v-if=\"isShowMuteBtn\" class=\"icon-btn\" @click.native=\"muteGroup\">\r\n <el-tooltip\r\n effect=\"dark\"\r\n :content=\"isMuteAll ? '解开禁言' : '全体禁言'\"\r\n placement=\"top\"\r\n >\r\n <i :class=\"muteBtnClass\"></i>\r\n </el-tooltip>\r\n </gray-button>\r\n <!-- 退出群聊 -->\r\n <gray-button class=\"icon-btn leave\" @click.native=\"leaveGroupFn()\">\r\n <el-tooltip effect=\"dark\" content=\"退出群聊\" placement=\"top\">\r\n <i class=\"layui-icon layui-icon-close\"></i>\r\n </el-tooltip>\r\n </gray-button>\r\n </div>\r\n </div>\r\n\r\n <template #inner>\r\n <ul class=\"member-list\">\r\n <li\r\n class=\"member-item\"\r\n @click=\"viewUserProfile(user)\"\r\n v-for=\"(user, index) in sortedMemberList\"\r\n :key=\"index\"\r\n >\r\n <pps-context-menu :menus=\"getUserMenuItems(user)\" @select=\"avatarContextMenuFn\">\r\n <div class=\"user-item\" slot=\"content\">\r\n <pps-avatar :src=\"user.avatar\" size=\"20\"></pps-avatar>\r\n <div class=\"user-name\">{{ user.name }}</div>\r\n <div v-if=\"chatTarget.isGroup\" :class=\"user.role\" class=\"user-role\">\r\n {{ tranRoleFn(user.role) }}\r\n </div>\r\n </div>\r\n </pps-context-menu>\r\n </li>\r\n </ul>\r\n </template>\r\n </k-sb-aside>\r\n\r\n <pps-dialog :show.sync=\"isShowFriendList\" title=\"好友列表\">\r\n <template v-slot:content>\r\n <el-table :show-header=\"true\" :data=\"getCurrentUser.friends\">\r\n <el-table-column align=\"center\" label=\"头像\">\r\n <template slot-scope=\"scope\">\r\n <pps-avatar :src=\"scope.row.avatar\" size=\"40\"></pps-avatar>\r\n </template>\r\n </el-table-column>\r\n <el-table-column align=\"center\" prop=\"id\" label=\"id\"></el-table-column>\r\n <el-table-column align=\"center\" prop=\"name\" label=\"昵称\"></el-table-column>\r\n <el-table-column align=\"center\" label=\"操作\">\r\n <template slot-scope=\"{ row }\">\r\n <pps-button\r\n :disabled=\"isInvited(row)\"\r\n :theme=\"isInvited(row) ? 'primary' : 'confirm'\"\r\n @click=\"inviteFriendFn(row)\"\r\n >\r\n {{ isInvited(row) ? '已进群' : '邀请' }}\r\n </pps-button>\r\n </template>\r\n </el-table-column>\r\n </el-table>\r\n </template>\r\n </pps-dialog>\r\n </div>\r\n </transition>\r\n</template>\r\n\r\n<script>\r\nimport { tranRoleMixin } from '@/mixin/index';\r\nimport { getVisibleMenuItems } from '@/utils/sandBox/permissionService';\r\nimport kSbAside from '@/components/layout/aside';\r\nimport Group from '@/utils/sandBox/group';\r\nimport User from '@/utils/sandBox/user';\r\nimport Administrators from '@/utils/sandBox/administrators';\r\nimport { mapGetters } from 'vuex';\r\nimport grayButton from '../ui/grayButton.vue';\r\nexport default {\r\n name: 'sb-right-aside',\r\n components: { kSbAside, grayButton },\r\n mixins: [tranRoleMixin],\r\n data() {\r\n return {\r\n admin: new Administrators(),\r\n group: null,\r\n isShowFriendList: false\r\n };\r\n },\r\n methods: {\r\n getUserMenuItems(user) {\r\n const curUer = this.memberList.find(({ id }) => id === this.getCurrentUser.id);\r\n const group = new Group({ id: this.chatTarget.id });\r\n const menu = getVisibleMenuItems(curUer, user, group);\r\n return menu;\r\n },\r\n viewUserProfile(user) {\r\n this.$emit('handleMenuAction', {\r\n targetUser: user,\r\n actionType: 'VIEW_PROFILE'\r\n });\r\n },\r\n inviteFriendFn(user) {\r\n this.$emit('handleMenuAction', {\r\n targetUser: user,\r\n actionType: 'INVITE_FRIEND',\r\n groupId: this.chatTarget.id\r\n });\r\n },\r\n isInvited(user) {\r\n const isEnter = new Group({ id: this.chatTarget.id }).getMemberById(user.id);\r\n if (!isEnter) return false;\r\n return true;\r\n },\r\n leaveGroupFn() {\r\n this.$dialog({ title: '警告', content: '确定要退出群聊吗?' })\r\n .then((action) => {\r\n const user = this.getCurrentUser;\r\n console.log(this.group, user);\r\n if (this.group.lord === user.id) {\r\n this.$emit('handleMenuAction', {\r\n actionType: 'REMOVE_GROUP',\r\n groupId: this.chatTarget.id,\r\n targetUser: user\r\n });\r\n } else {\r\n this.$emit('handleMenuAction', {\r\n actionType: 'LEAVE_GROUP',\r\n groupId: this.chatTarget.id,\r\n targetUser: user\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n console.log(error);\r\n });\r\n },\r\n muteGroup() {\r\n const isMute = new User(this.getCurrentUser).getGroupMessageById(this.chatTarget.id).isMute;\r\n\r\n this.$emit('handleMenuAction', {\r\n actionType: 'MUTE_GROUP',\r\n groupId: this.chatTarget.id,\r\n currentUser: !isMute\r\n });\r\n }\r\n },\r\n computed: {\r\n ...mapGetters('sandBox', ['getCurrentUser', 'getGroupMessage']),\r\n ...mapGetters('layoutOption', ['getIsNarrowScreen']),\r\n sortedMemberList() {\r\n // 角色优先级映射\r\n const rolePriorityMap = new Map([\r\n ['super-admin', 0],\r\n ['lord', 1],\r\n ['admin', 2],\r\n ['member', 3]\r\n ]);\r\n // 获取权重值\r\n const getPriority = (role) => {\r\n return rolePriorityMap.has(role) ? rolePriorityMap.get(role) : 4;\r\n };\r\n // 排序\r\n const sortedMemberList = [...this.memberList].sort((a, b) => {\r\n return getPriority(a.role) - getPriority(b.role);\r\n });\r\n return sortedMemberList;\r\n },\r\n getGroupMemberLength() {\r\n return this.memberList.length;\r\n },\r\n isMuteAll() {\r\n return this.getGroupMessage(this.group.id).isMute;\r\n },\r\n muteBtnClass() {\r\n return this.isMuteAll ? 'el-icon-turn-off-microphone' : 'el-icon-microphone';\r\n },\r\n isShowMuteBtn() {\r\n const u = new User(this.getCurrentUser);\r\n return u._isAdmin(this.chatTarget.id);\r\n }\r\n },\r\n watch: {},\r\n created() {\r\n this.group = new Group({ id: this.chatTarget.id });\r\n },\r\n mounted() {\r\n // console.log(this.sortedMemberList);\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.right-aside-wapper {\r\n z-index: 4;\r\n height: 100%;\r\n @media screen and (max-width: 528px) {\r\n position: absolute;\r\n right: 0;\r\n }\r\n}\r\n\r\n.aside-group {\r\n width: var(--sb-aside-width);\r\n background: #f2f2f2;\r\n border: 2px solid #e9e9e9;\r\n border-top: none;\r\n user-select: none;\r\n\r\n &::v-deep .pps-context-menu-area {\r\n width: 100%;\r\n padding: 8px;\r\n }\r\n &::v-deep .k-aside-inner {\r\n flex-grow: 1;\r\n }\r\n\r\n .member-title {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n padding: 8px;\r\n\r\n .btn-area {\r\n display: flex;\r\n // justify-content: space-between;\r\n }\r\n\r\n .icon-btn {\r\n width: 25px;\r\n height: 25px;\r\n font-weight: bold;\r\n margin: 0;\r\n background: rgb(255, 255, 255);\r\n\r\n & + .icon-btn {\r\n margin-left: 10px;\r\n }\r\n }\r\n\r\n .leave {\r\n color: rgb(247, 76, 108);\r\n }\r\n }\r\n .member-list {\r\n display: flex;\r\n flex-grow: 1;\r\n padding: 0;\r\n margin: 0;\r\n flex-direction: column;\r\n\r\n .member-item {\r\n display: flex;\r\n cursor: pointer;\r\n &:hover {\r\n background: var(--sb-reply-bg);\r\n }\r\n }\r\n }\r\n .user-item {\r\n display: flex;\r\n // flex-grow: 1;\r\n width: 100%;\r\n\r\n .user-name {\r\n margin-left: 5px;\r\n flex: 1;\r\n min-width: 0;\r\n // width: fit-content;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n .user-role {\r\n // margin-left: auto;\r\n font-size: 11px;\r\n padding: 2px;\r\n line-height: 1rem;\r\n border-radius: 4px;\r\n white-space: nowrap;\r\n flex-shrink: 0;\r\n }\r\n .admin {\r\n background: var(--sb-admin-bg);\r\n color: var(--sb-admin-color);\r\n }\r\n .lord {\r\n background: var(--sb-lord-bg);\r\n color: var(--sb-lord-color);\r\n }\r\n .super-admin {\r\n background: var(--sb-super-admin-bg);\r\n color: var(--sb-super-admin-color);\r\n }\r\n }\r\n}\r\n\r\n// 过渡\r\n.v-enter,\r\n.v-leave-to {\r\n width: 0;\r\n @media screen and (max-width: 768px) {\r\n right: -250px;\r\n }\r\n}\r\n.v-enter-active,\r\n.v-leave-active {\r\n transition: 0.3s ease-in-out;\r\n}\r\n.v-enter-to,\r\n.v-leave {\r\n width: var(--sb-aside-width);\r\n @media screen and (max-width: 768px) {\r\n right: 0px;\r\n }\r\n}\r\n</style>\r\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./right.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./right.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./right.vue?vue&type=template&id=c379eb52&scoped=true\"\nimport script from \"./right.vue?vue&type=script&lang=js\"\nexport * from \"./right.vue?vue&type=script&lang=js\"\nimport style0 from \"./right.vue?vue&type=style&index=0&id=c379eb52&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c379eb52\",\n null\n \n)\n\nexport default component.exports","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"k-chat-main chat-empty\"},[(_vm.getCurrentMsg)?[_c('div',{ref:\"chatBox\",staticClass:\"k-chat-box pps-scrollbar\"},[(_vm.isTalkWithBot)?_c('el-alert',{attrs:{\"title\":\"温馨提示!\",\"center\":\"\",\"show-icon\":\"\",\"close-text\":\"知道了\"}},[_vm._v(\" 输入 \"),_c('strong',{staticClass:\"danger-text\"},[_vm._v(\"/help\")]),_vm._v(\" 查看所有bot指令 \")]):_vm._e(),_vm._l((_vm.messageList),function(item){return _c('k-sb-message',{key:item.id,attrs:{\"message\":item,\"chatTarget\":_vm.chatTarget,\"isSelf\":_vm.isSelfFn(item.role),\"memberList\":_vm.memberList},on:{\"replyMsg\":_vm.replyMsgFn,\"handleMenuAction\":_vm.handleMenuAction}})})],2),_c('div',{staticClass:\"k-chat-input-box\"},[_c('div',{ref:\"input\",staticClass:\"k-chat-input\",attrs:{\"contenteditable\":_vm.messagingEnabled,\"placeholder\":_vm.messagingPlaceholder},on:{\"input\":_vm.inputFn,\"click\":_vm.saveRange,\"keyup\":_vm.saveRange,\"keypress\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\"))return null;return _vm.sendMessageFn.apply(null, arguments)},\"blur\":function($event){_vm.lastRange = null},\"paste\":_vm.handlePaste}}),_c('div',{staticClass:\"operation\"},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.replyMsg.name),expression:\"replyMsg.name\"}],staticClass:\"reply-chat-wrapper\"},[_c('span',{staticClass:\"content\"},[_vm._v(_vm._s(_vm.replyMsg.name)+\":\"+_vm._s(_vm.replyMsg.content))]),_c('i',{staticClass:\"el-icon-circle-close\",on:{\"click\":_vm.cancelReplyMsgFn}})]),_c('pps-button',{staticClass:\"k-chat-send-btn\",attrs:{\"disabled\":!_vm.messagingEnabled,\"theme\":\"confirm\"},on:{\"click\":_vm.sendMessageFn}},[_vm._v(\" 发送 \")])],1)])]:_c('el-empty',{staticStyle:{\"height\":\"100%\"},attrs:{\"description\":\"\",\"image\":_vm.LOGO}})],2)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"k-sb-message\",class:{ 'k-sb-message-self': _vm.isSelf }},[_c('div',{staticClass:\"message\"},[_c('pps-context-menu',{attrs:{\"menus\":_vm.getUserMenuItems()},on:{\"select\":_vm.avatarContextMenuFn}},[_c('div',{staticStyle:{\"width\":\"36px\"},attrs:{\"slot\":\"content\"},slot:\"content\"},[_c('pps-avatar',{staticStyle:{\"user-select\":\"none\"},attrs:{\"size\":\"36\",\"src\":_vm.getUserAvatarFn(_vm.message.role)},on:{\"click\":function($event){return _vm.viewUserProfile()}}})],1)]),_c('div',{staticClass:\"container\"},[_c('div',{staticClass:\"nickname_wrapper\"},[(_vm.chatTarget.isGroup)?_c('span',{staticClass:\"groupRole\",class:_vm.getGroupSenderRole.role},[_vm._v(\" \"+_vm._s(_vm.getRole)+\" \")]):_vm._e(),_c('span',{staticClass:\"nickname\"},[_vm._v(_vm._s(_vm.getUserNickname))]),_c('span',{directives:[{name:\"trans-time\",rawName:\"v-trans-time\",value:(_vm.message.date),expression:\"message.date\"}],staticClass:\"date\"})]),_c('pps-context-menu',{attrs:{\"menus\":_vm.getTextMenus},on:{\"select\":_vm.testContextMenuFn}},[_c('div',{staticClass:\"content\",attrs:{\"slot\":\"content\"},slot:\"content\"},[_c('pre',[_vm._v(_vm._s(_vm.message.content || '\\u00A0'))])])]),(_vm.message.replyMsg?.name)?_c('div',{staticClass:\"reply\"},[_vm._v(\" \"+_vm._s(_vm.message.replyMsg.name)+\":\"+_vm._s(_vm.message.replyMsg.content)+\" \")]):_vm._e()],1)],1)])\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\r\n <div class=\"k-sb-message\" :class=\"{ 'k-sb-message-self': isSelf }\">\r\n <div class=\"message\">\r\n <!-- 头像 -->\r\n <pps-context-menu @select=\"avatarContextMenuFn\" :menus=\"getUserMenuItems()\">\r\n <div style=\"width: 36px\" slot=\"content\">\r\n <pps-avatar\r\n size=\"36\"\r\n @click=\"viewUserProfile()\"\r\n :src=\"getUserAvatarFn(message.role)\"\r\n style=\"user-select: none\"\r\n ></pps-avatar>\r\n </div>\r\n </pps-context-menu>\r\n <!-- 气泡 -->\r\n <div class=\"container\">\r\n <div class=\"nickname_wrapper\">\r\n <span v-if=\"chatTarget.isGroup\" :class=\"getGroupSenderRole.role\" class=\"groupRole\">\r\n {{ getRole }}\r\n </span>\r\n <span class=\"nickname\">{{ getUserNickname }}</span>\r\n <span class=\"date\" v-trans-time=\"message.date\"></span>\r\n </div>\r\n <pps-context-menu @select=\"testContextMenuFn\" :menus=\"getTextMenus\">\r\n <div class=\"content\" slot=\"content\">\r\n <pre>{{ message.content || '\\u00A0' }}</pre>\r\n </div>\r\n </pps-context-menu>\r\n <div v-if=\"message.replyMsg?.name\" class=\"reply\">\r\n {{ message.replyMsg.name }}:{{ message.replyMsg.content }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { tranRoleMixin } from '@/mixin/index';\r\nimport { getVisibleMenuItems } from '@/utils/sandBox/permissionService';\r\nimport Administrators from '@/utils/sandBox/administrators';\r\nimport User from '@/utils/sandBox/user';\r\nimport Group from '@/utils/sandBox/group';\r\nimport { mapGetters, mapActions } from 'vuex';\r\nexport default {\r\n name: 'k-sb-message',\r\n data() {\r\n return {\r\n admin: new Administrators()\r\n };\r\n },\r\n mixins: [tranRoleMixin],\r\n props: {\r\n message: {\r\n type: Object,\r\n default() {\r\n return {};\r\n }\r\n },\r\n isSelf: {\r\n type: Boolean,\r\n default: false\r\n },\r\n avatar: {\r\n type: String,\r\n default: ''\r\n }\r\n },\r\n methods: {\r\n ...mapActions('sandBox', ['send']),\r\n getUserAvatarFn(role) {\r\n if (role === 'self') {\r\n return this.getCurrentUser.avatar;\r\n } else if (role === 'friend') {\r\n return this.admin.getUserById(this.message.sender).avatar;\r\n } else {\r\n return this.admin.getUserById(this.message.role).avatar;\r\n }\r\n },\r\n deleteMsgFn(user) {\r\n if (this.message.isGroup) {\r\n // 群聊\r\n const res = user.deleteGroupMessage({ id: this.chatTarget.id, msgId: this.message.id });\r\n if (res) {\r\n this.$message.success('删除成功');\r\n this.send({\r\n event: 'on_message_delete',\r\n time: Date.now(),\r\n type: 1,\r\n userId: user.id,\r\n messageId: this.message.id,\r\n operatorId: user.id,\r\n groupId: this.chatTarget.id\r\n });\r\n } else this.$message.error('删除失败!');\r\n } else {\r\n // 私聊\r\n console.log(this.message.receiver, this.message.id);\r\n const res = user.deleteFriendMessage(this.message.receiver, this.message.id);\r\n if (res) {\r\n this.$message.success('删除成功');\r\n this.send({\r\n event: 'on_message_delete',\r\n time: Date.now(),\r\n type: 0,\r\n userId: user.id,\r\n messageId: this.message.id\r\n });\r\n } else this.$message.error('删除失败!');\r\n }\r\n },\r\n testContextMenuFn({ task }) {\r\n const user = new User(this.getCurrentUser);\r\n if (task === 0) {\r\n // 撤回\r\n this.deleteMsgFn(user);\r\n } else if (task === 1) {\r\n // 回复\r\n this.$emit('replyMsg', this.message);\r\n }\r\n },\r\n getUserMenuItems() {\r\n if (this.chatTarget.isGroup) {\r\n const curUer = this.memberList.find(({ id }) => id === this.getCurrentUser.id);\r\n const targetUser = this.memberList.find(({ id }) => id === this.message.role);\r\n const group = new Group({ id: this.chatTarget.id });\r\n return getVisibleMenuItems(curUer, targetUser, group);\r\n }\r\n return [];\r\n },\r\n viewUserProfile() {\r\n const targetUser = this.admin.getUserById(this.message.role);\r\n this.$emit('handleMenuAction', {\r\n targetUser,\r\n actionType: 'VIEW_PROFILE'\r\n });\r\n }\r\n },\r\n computed: {\r\n ...mapGetters('sandBox', ['getCurrentUser', 'getCurrentMsg']),\r\n getUserNickname() {\r\n let nickname;\r\n if (this.message.role === 'self') {\r\n nickname = this.getCurrentUser.name;\r\n } else if (this.message.role === 'friend') {\r\n nickname = this.admin.getUserById(this.message.sender).name;\r\n } else {\r\n nickname = this.admin.getUserById(this.message.role).name;\r\n }\r\n return nickname || 'u3';\r\n },\r\n getTextMenus() {\r\n if (this.isSelf) {\r\n return [\r\n { label: '回复消息', task: 1 },\r\n { label: '删除消息', task: 0 }\r\n ];\r\n } else {\r\n return [{ label: '回复消息', task: 1 }];\r\n }\r\n },\r\n getGroupSenderRole() {\r\n const fail = { role: 'expellee', id: '未知' };\r\n if (this.chatTarget.isGroup) {\r\n const role = this.memberList.find(({ id }) => id === this.message.role);\r\n return role || fail;\r\n }\r\n return fail;\r\n },\r\n getRole() {\r\n return this.tranRoleFn(this.getGroupSenderRole.role);\r\n }\r\n },\r\n mounted() {}\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.k-sb-message {\r\n display: flex;\r\n padding: 10px 10px;\r\n box-sizing: border-box;\r\n &::selection {\r\n background: var(--theme-hover-color);\r\n }\r\n .message {\r\n display: flex;\r\n flex-direction: row;\r\n width: 75%;\r\n gap: 8px;\r\n\r\n .container {\r\n width: calc(100% - 44px);\r\n .nickname_wrapper {\r\n color: #7a7a7a;\r\n user-select: none;\r\n display: flex;\r\n align-items: center;\r\n flex-direction: row;\r\n gap: 5px;\r\n\r\n span {\r\n display: inline-flex;\r\n align-items: flex-end;\r\n height: 1.2em;\r\n white-space: nowrap;\r\n }\r\n .nickname {\r\n font-size: 12px;\r\n // color: #000;\r\n font-weight: bold;\r\n }\r\n .date {\r\n font-size: 11px;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .groupRole {\r\n font-size: 11px;\r\n padding: 2px;\r\n line-height: 1.2em;\r\n border-radius: 4px;\r\n }\r\n .admin {\r\n background: var(--sb-admin-bg);\r\n color: var(--sb-admin-color);\r\n }\r\n .lord {\r\n background: var(--sb-lord-bg);\r\n color: var(--sb-lord-color);\r\n }\r\n .super-admin {\r\n background: var(--sb-super-admin-bg);\r\n color: var(--sb-super-admin-color);\r\n }\r\n .expellee {\r\n background: var(--sb-reply-bg);\r\n color: var(--sb-reply-color);\r\n }\r\n }\r\n .pps-context-menu-area {\r\n width: 100%;\r\n }\r\n .content {\r\n max-width: fit-content;\r\n width: 100%;\r\n flex-shrink: 1;\r\n background: #fff;\r\n padding: 8px;\r\n border-radius: 8px;\r\n margin-top: 4px;\r\n\r\n pre {\r\n white-space: pre-wrap;\r\n word-wrap: break-word;\r\n }\r\n }\r\n .reply {\r\n font-size: 12px;\r\n border-radius: 4px;\r\n padding: 6px 8px;\r\n margin-top: 6px;\r\n background: var(--sb-reply-bg);\r\n color: var(--sb-reply-color);\r\n user-select: none;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n }\r\n & + .k-sb-message {\r\n margin-top: 8px;\r\n }\r\n }\r\n}\r\n.k-sb-message-self {\r\n justify-content: flex-end;\r\n .message {\r\n flex-direction: row-reverse;\r\n\r\n .container {\r\n .nickname_wrapper {\r\n text-align: end;\r\n flex-direction: row-reverse;\r\n }\r\n .content {\r\n color: #fff;\r\n background: var(--theme-color);\r\n margin-left: auto;\r\n }\r\n }\r\n }\r\n}\r\n</style>\r\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./message.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./message.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./message.vue?vue&type=template&id=5cbc5b36&scoped=true\"\nimport script from \"./message.vue?vue&type=script&lang=js\"\nexport * from \"./message.vue?vue&type=script&lang=js\"\nimport style0 from \"./message.vue?vue&type=style&index=0&id=5cbc5b36&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5cbc5b36\",\n null\n \n)\n\nexport default component.exports","<template>\r\n <div class=\"k-chat-main chat-empty\">\r\n <template v-if=\"getCurrentMsg\">\r\n <!-- 聊天内容 -->\r\n <div ref=\"chatBox\" class=\"k-chat-box pps-scrollbar\">\r\n <el-alert v-if=\"isTalkWithBot\" title=\"温馨提示!\" center show-icon close-text=\"知道了\">\r\n 输入\r\n <strong class=\"danger-text\">/help</strong>\r\n 查看所有bot指令\r\n </el-alert>\r\n <k-sb-message\r\n v-for=\"item in messageList\"\r\n :message=\"item\"\r\n :chatTarget=\"chatTarget\"\r\n :isSelf=\"isSelfFn(item.role)\"\r\n :key=\"item.id\"\r\n :memberList=\"memberList\"\r\n @replyMsg=\"replyMsgFn\"\r\n @handleMenuAction=\"handleMenuAction\"\r\n ></k-sb-message>\r\n </div>\r\n <!-- 输入框 -->\r\n <div class=\"k-chat-input-box\">\r\n <div\r\n ref=\"input\"\r\n class=\"k-chat-input\"\r\n @input=\"inputFn\"\r\n @click=\"saveRange\"\r\n @keyup=\"saveRange\"\r\n @keypress.enter=\"sendMessageFn\"\r\n @blur=\"lastRange = null\"\r\n @paste=\"handlePaste\"\r\n :contenteditable=\"messagingEnabled\"\r\n :placeholder=\"messagingPlaceholder\"\r\n ></div>\r\n <div class=\"operation\">\r\n <div v-show=\"replyMsg.name\" class=\"reply-chat-wrapper\">\r\n <span class=\"content\">{{ replyMsg.name }}:{{ replyMsg.content }}</span>\r\n <i @click=\"cancelReplyMsgFn\" class=\"el-icon-circle-close\"></i>\r\n </div>\r\n <pps-button\r\n :disabled=\"!messagingEnabled\"\r\n @click=\"sendMessageFn\"\r\n theme=\"confirm\"\r\n class=\"k-chat-send-btn\"\r\n >\r\n 发送\r\n </pps-button>\r\n </div>\r\n </div>\r\n </template>\r\n <el-empty v-else description=\"\" style=\"height: 100%\" :image=\"LOGO\"></el-empty>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport LOGO from '@/assets/favicon-gray.svg';\r\nimport { mapGetters, mapActions, mapMutations } from 'vuex';\r\nimport User from '@/utils/sandBox/user';\r\nimport Administrators from '@/utils/sandBox/administrators';\r\nimport kSbMessage from './message.vue';\r\n\r\nexport default {\r\n name: 'k-chat-main',\r\n components: { kSbMessage },\r\n data() {\r\n return {\r\n muteStatusIntervalId: null,\r\n LOGO,\r\n message: '',\r\n lastRange: null,\r\n replyMsg: { name: null, content: null },\r\n admin: new Administrators(),\r\n isComposing: false, // 处理中文输入法\r\n cursorPosition: null, // 保存光标位置\r\n inputObserver: null // DOM变化观察器\r\n };\r\n },\r\n\r\n computed: {\r\n ...mapGetters('sandBox', [\r\n 'getCurrentUser',\r\n 'getAllUser',\r\n 'getCurrentMsg',\r\n 'getMemberMuteStatue'\r\n ]),\r\n messagingEnabled() {\r\n if (this.chatTarget.isGroup) {\r\n const curMember = new User(this.getCurrentUser);\r\n const isAdmin = curMember._isAdmin(this.chatTarget.id);\r\n if (isAdmin) return true;\r\n const isGroupMute = this.getCurrentMsg.isMute;\r\n const isMute = this.getMemberMuteStatue(this.chatTarget.id, curMember.id);\r\n if (isMute) this.checkMuteStatus();\r\n return !(isGroupMute || isMute);\r\n }\r\n return true;\r\n },\r\n messagingPlaceholder() {\r\n return this.messagingEnabled ? '请输入消息...' : '禁言中...';\r\n },\r\n messageList() {\r\n const cmsg = this.getCurrentMsg;\r\n if (!cmsg) return [];\r\n let messageList;\r\n if (Array.isArray(cmsg)) {\r\n messageList = cmsg;\r\n } else {\r\n messageList = cmsg.messages;\r\n }\r\n return messageList;\r\n },\r\n isTalkWithBot() {\r\n return true;\r\n }\r\n },\r\n\r\n methods: {\r\n ...mapActions('sandBox', ['send', 'updateMemberMuteStatue']),\r\n ...mapMutations('sandBox', { clearMuteExpire: 'UNMUTE_MEMBER' }),\r\n // 轮询群成员禁言状态\r\n checkMuteStatus() {\r\n const gid = this.getCurrentMsg.id;\r\n const mid = this.getCurrentUser.id;\r\n this.muteStatusIntervalId = setInterval(() => {\r\n const isMute = this.getMemberMuteStatue(gid, mid);\r\n if (!isMute) {\r\n this.clearMuteExpire({ gid, mid });\r\n clearInterval(this.muteStatusIntervalId);\r\n }\r\n }, 2000);\r\n },\r\n // 输入处理方法\r\n inputFn(e) {\r\n if (this.isComposing) return; // 中文输入法输入过程中不处理\r\n\r\n this.saveRange(); // 保存当前光标位置\r\n this.updateMessage();\r\n },\r\n // 更新消息内容\r\n updateMessage() {\r\n this.$nextTick(() => {\r\n const input = this.$refs.input;\r\n if (input) {\r\n this.message = this.getTextContent(input);\r\n }\r\n });\r\n },\r\n // 获取纯文本内容(保留mention标签)\r\n getTextContent(element) {\r\n let content = '';\r\n const childNodes = element.childNodes;\r\n\r\n for (let i = 0; i < childNodes.length; i++) {\r\n const node = childNodes[i];\r\n if (node.nodeType === Node.TEXT_NODE) {\r\n content += node.textContent;\r\n } else if (node.nodeType === Node.ELEMENT_NODE) {\r\n if (node.tagName === 'BUTTON' && node.className.includes('pps-button')) {\r\n // mention标签\r\n content += node.textContent;\r\n } else if (node.tagName === 'BR') {\r\n content += '\\n';\r\n } else {\r\n content += node.textContent;\r\n }\r\n }\r\n }\r\n\r\n return content;\r\n },\r\n // 设置输入框内容(不会影响光标位置)\r\n setInputContent(content, maintainCursor = true) {\r\n const input = this.$refs.input;\r\n if (!input) return;\r\n\r\n let savedRange = null;\r\n if (maintainCursor) {\r\n savedRange = this.saveCurrentRange();\r\n }\r\n\r\n // 直接设置innerHTML\r\n input.innerHTML = content;\r\n\r\n if (maintainCursor && savedRange) {\r\n this.$nextTick(() => {\r\n this.restoreRange(savedRange);\r\n });\r\n }\r\n },\r\n // 保存当前光标位置\r\n saveCurrentRange() {\r\n const selection = window.getSelection();\r\n if (selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const input = this.$refs.input;\r\n\r\n if (input && input.contains(range.commonAncestorContainer)) {\r\n return {\r\n startContainer: range.startContainer,\r\n startOffset: range.startOffset,\r\n endContainer: range.endContainer,\r\n endOffset: range.endOffset\r\n };\r\n }\r\n }\r\n return null;\r\n },\r\n // 恢复光标位置\r\n restoreRange(savedRange) {\r\n if (!savedRange) return;\r\n\r\n try {\r\n const selection = window.getSelection();\r\n const range = document.createRange();\r\n\r\n range.setStart(savedRange.startContainer, savedRange.startOffset);\r\n range.setEnd(savedRange.endContainer, savedRange.endOffset);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n this.lastRange = range;\r\n } catch (error) {\r\n console.warn('Failed to restore cursor position:', error);\r\n this.focusAtEnd();\r\n }\r\n },\r\n // 光标移到末尾\r\n focusAtEnd() {\r\n const input = this.$refs.input;\r\n if (!input) return;\r\n\r\n input.focus();\r\n const range = document.createRange();\r\n const selection = window.getSelection();\r\n\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n this.lastRange = range;\r\n },\r\n // 改进的saveRange方法\r\n saveRange() {\r\n const selection = window.getSelection();\r\n if (selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const input = this.$refs.input;\r\n\r\n if (input && input.contains(range.commonAncestorContainer)) {\r\n this.lastRange = range.cloneRange();\r\n }\r\n }\r\n },\r\n // 处理粘贴事件\r\n handlePaste(e) {\r\n e.preventDefault();\r\n\r\n const text = (e.clipboardData || window.clipboardData).getData('text/plain');\r\n const cleanText = text.replace(/\\r?\\n/g, ' '); // 将换行替换为空格\r\n\r\n this.insertTextAtCursor(cleanText);\r\n },\r\n // 在光标位置插入文本\r\n insertTextAtCursor(text) {\r\n const selection = window.getSelection();\r\n const input = this.$refs.input;\r\n\r\n if (!input) return;\r\n\r\n input.focus();\r\n\r\n let range = null;\r\n if (this.lastRange && this.isRangeInNode(this.lastRange, input)) {\r\n range = this.lastRange;\r\n } else {\r\n range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n }\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n\r\n // 插入文本\r\n const textNode = document.createTextNode(text);\r\n range.deleteContents();\r\n range.insertNode(textNode);\r\n\r\n // 移动光标到插入文本后\r\n const newRange = document.createRange();\r\n newRange.setStartAfter(textNode);\r\n newRange.collapse(true);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n\r\n this.lastRange = newRange;\r\n this.updateMessage();\r\n },\r\n // 改进的mention功能\r\n mentionMember(username) {\r\n const input = this.$refs.input;\r\n if (!input) return;\r\n\r\n input.focus();\r\n\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n\r\n let range = null;\r\n\r\n // 如果 lastRange 有效,就用它,否则插到末尾\r\n if (this.lastRange && this.isRangeInNode(this.lastRange, input)) {\r\n range = this.lastRange;\r\n } else {\r\n range = document.createRange();\r\n range.selectNodeContents(input);\r\n range.collapse(false);\r\n }\r\n\r\n selection.addRange(range);\r\n\r\n // 创建 mention 节点\r\n const mentionNode = document.createElement('button');\r\n mentionNode.textContent = `@${username}`;\r\n mentionNode.contentEditable = 'false';\r\n mentionNode.className = 'pps-button-text pps-button';\r\n mentionNode.style.cssText = 'margin: 0 2px; pointer-events: none;';\r\n\r\n range.deleteContents();\r\n range.insertNode(mentionNode);\r\n\r\n // 插入空格\r\n const space = document.createTextNode('\\u00A0');\r\n mentionNode.parentNode.insertBefore(space, mentionNode.nextSibling);\r\n\r\n // 将光标移动到空格后\r\n const newRange = document.createRange();\r\n newRange.setStartAfter(space);\r\n newRange.collapse(true);\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(newRange);\r\n\r\n this.lastRange = newRange;\r\n this.updateMessage();\r\n },\r\n // 清空输入框\r\n clearInput() {\r\n const input = this.$refs.input;\r\n if (input) {\r\n input.innerHTML = '';\r\n this.message = '';\r\n this.lastRange = null;\r\n input.focus();\r\n }\r\n },\r\n // 处理中文输入法\r\n handleCompositionStart() {\r\n this.isComposing = true;\r\n },\r\n handleCompositionEnd() {\r\n this.isComposing = false;\r\n this.updateMessage();\r\n },\r\n // 发送消息改进\r\n sendMessageFn(e) {\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n if (this.isComposing) return; // 中文输入法输入过程中不发送\r\n }\r\n\r\n if (!this.message.trim()) return;\r\n\r\n const u = new User(this.getCurrentUser);\r\n if (this.chatTarget.isGroup) {\r\n const res = u.sendMessageToGroup({\r\n id: this.chatTarget.id,\r\n content: this.message,\r\n replyMsg: this.replyMsg\r\n });\r\n\r\n const msg = res.data.message;\r\n const roleMap = {\r\n lord: 'owner',\r\n member: 'member',\r\n admin: 'admin',\r\n 'super-admin': 'owner'\r\n };\r\n const role = u.groups.find((item) => item.id === res.data.gid).role;\r\n\r\n this.send({\r\n event: 'on_message',\r\n time: msg.date,\r\n type: 1,\r\n messageId: msg.id,\r\n message: msg.content,\r\n messageAlt: msg.content,\r\n userId: msg.role,\r\n groupId: res.data.gid,\r\n sender: {\r\n nickname: u.name,\r\n role: roleMap[role]\r\n }\r\n });\r\n } else {\r\n const res = u.sendMessageToFriend({\r\n id: this.chatTarget.id,\r\n content: this.message,\r\n replyMsg: this.replyMsg\r\n });\r\n if (this.chatTarget.id === 'user-super-admin') this.sendMsgToBot(res, u);\r\n }\r\n\r\n this.clearInput();\r\n this.cancelReplyMsgFn();\r\n this.scrollToBottom(true);\r\n },\r\n // 其他原有方法保持不变...\r\n sendMsgToBot(msg, sender) {\r\n const msg_data = msg.data.message;\r\n this.send({\r\n event: 'on_message',\r\n time: msg_data.date,\r\n type: 0,\r\n messageId: msg_data.id,\r\n message: msg_data.content,\r\n messageAlt: msg_data.content,\r\n userId: msg.data.sender,\r\n sender: {\r\n nickname: sender.name\r\n }\r\n });\r\n },\r\n async setGroupAdminFn() {\r\n const { value: mid } = await this.$prompt('请输入群成员id', '设置群管理员', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消'\r\n });\r\n const res = new User(this.getCurrentUser).setGroupAdmin({\r\n gid: this.chatTarget.id,\r\n mid\r\n });\r\n console.log(res);\r\n },\r\n isSelfFn(sender) {\r\n if (sender === 'self') {\r\n return true;\r\n } else if (sender === 'friend') {\r\n return false;\r\n } else {\r\n return sender === this.getCurrentUser.id;\r\n }\r\n },\r\n isRangeInNode(range, node) {\r\n if (!range || !node) return false;\r\n const container = range.commonAncestorContainer;\r\n return node.contains(container);\r\n },\r\n replyMsgFn(msg) {\r\n let name;\r\n if (this.chatTarget.isGroup) {\r\n name = this.admin.getUserById(msg.role).name;\r\n } else {\r\n name = this.admin.getUserById(msg.sender).name;\r\n }\r\n this.replyMsg = { name, content: msg.content };\r\n this.$refs.input.focus();\r\n },\r\n handleMenuAction(action) {\r\n this.$emit('handleMenuAction', action);\r\n },\r\n cancelReplyMsgFn() {\r\n this.replyMsg = { name: null, content: null };\r\n },\r\n scrollToBottom(smooth = false) {\r\n const container = this.$refs.chatBox;\r\n if (!container) return;\r\n this.$nextTick(() => {\r\n if (smooth) {\r\n container.scrollTo({\r\n top: container.scrollHeight,\r\n behavior: 'smooth'\r\n });\r\n } else {\r\n container.scrollTop = container.scrollHeight;\r\n }\r\n });\r\n },\r\n // 更新占位符显示\r\n updatePlaceholder() {\r\n const input = this.$refs.input;\r\n if (!input) return;\r\n\r\n if (input.textContent.trim() === '') {\r\n input.setAttribute('data-placeholder', this.messagingPlaceholder);\r\n } else {\r\n input.removeAttribute('data-placeholder');\r\n }\r\n }\r\n },\r\n\r\n watch: {\r\n getCurrentMsg(val) {\r\n this.cancelReplyMsgFn();\r\n if (this.$refs.input) {\r\n this.clearInput();\r\n }\r\n },\r\n messagingEnabled(val) {\r\n if (!val) {\r\n this.clearInput();\r\n }\r\n }\r\n },\r\n\r\n props: {\r\n chatTarget: {\r\n type: Object,\r\n default() {\r\n return null;\r\n }\r\n },\r\n memberList: {\r\n type: Array,\r\n default() {\r\n return [];\r\n }\r\n }\r\n },\r\n\r\n created() {},\r\n mounted() {\r\n const input = this.$refs.input;\r\n if (input) {\r\n input.focus();\r\n\r\n // 添加中文输入法事件监听\r\n input.addEventListener('compositionstart', this.handleCompositionStart);\r\n input.addEventListener('compositionend', this.handleCompositionEnd);\r\n\r\n // 添加占位符功能\r\n this.updatePlaceholder();\r\n }\r\n\r\n this.$nextTick(() => {\r\n this.scrollToBottom();\r\n });\r\n },\r\n\r\n beforeDestroy() {\r\n const input = this.$refs.input;\r\n if (input) {\r\n input.removeEventListener('compositionstart', this.handleCompositionStart);\r\n input.removeEventListener('compositionend', this.handleCompositionEnd);\r\n }\r\n if (this.muteStatusIntervalId) clearInterval(this.muteStatusIntervalId);\r\n },\r\n\r\n updated() {\r\n this.scrollToBottom();\r\n this.updatePlaceholder();\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.k-chat-main {\r\n display: flex;\r\n flex-direction: column;\r\n background: #f2f2f2;\r\n width: 100%;\r\n // min-width: 300px;\r\n height: 100%;\r\n\r\n .k-chat-box {\r\n position: relative;\r\n height: 100%;\r\n flex: 1;\r\n flex-basis: 0;\r\n overflow-y: auto;\r\n overflow-x: hidden;\r\n\r\n .el-alert {\r\n position: sticky;\r\n top: 8px;\r\n z-index: 2;\r\n background: #f0e8fd;\r\n color: var(--theme-color);\r\n border: 1px solid var(--theme-color);\r\n\r\n &::v-deep .el-alert__content {\r\n span,\r\n i,\r\n p {\r\n // color: #5d87ff;\r\n color: var(--theme-color);\r\n }\r\n }\r\n }\r\n }\r\n\r\n .k-chat-input-box {\r\n padding: 10px;\r\n position: relative;\r\n height: 150px;\r\n background: #f2f2f2;\r\n border-top: 2px solid #e9e9e9;\r\n border-bottom: 2px solid #e9e9e9;\r\n box-sizing: border-box;\r\n\r\n .k-chat-input {\r\n height: 70%;\r\n overflow: auto;\r\n outline: none;\r\n overflow-wrap: break-word;\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n font-weight: normal;\r\n font-style: normal;\r\n background: transparent;\r\n position: relative;\r\n\r\n &::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n // 占位符样式\r\n &[data-placeholder]:empty::before {\r\n content: attr(data-placeholder);\r\n color: #999;\r\n pointer-events: none;\r\n position: absolute;\r\n }\r\n\r\n // mention按钮样式\r\n .pps-button {\r\n display: inline-block;\r\n margin: 0 2px;\r\n padding: 2px 6px;\r\n border-radius: 3px;\r\n background: #e1f5fe;\r\n color: #0277bd;\r\n border: none;\r\n font-size: inherit;\r\n cursor: default;\r\n pointer-events: none;\r\n\r\n &:focus {\r\n outline: none;\r\n }\r\n }\r\n }\r\n\r\n .operation {\r\n display: flex;\r\n justify-content: space-between;\r\n\r\n .k-chat-send-btn {\r\n margin-left: auto;\r\n }\r\n\r\n .reply-chat-wrapper {\r\n display: flex;\r\n align-items: center;\r\n font-size: 12px;\r\n border-radius: 4px;\r\n padding: 6px 8px;\r\n background: var(--sb-reply-bg);\r\n color: var(--sb-reply-color);\r\n\r\n .content {\r\n max-width: 15em;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n }\r\n\r\n .el-icon-circle-close {\r\n width: 1em;\r\n margin-left: 5px;\r\n cursor: pointer;\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n.chat-empty {\r\n height: 100%;\r\n}\r\n</style>\r\n","import mod from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./chat.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../../node_modules/thread-loader/dist/cjs.js!../../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./chat.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./chat.vue?vue&type=template&id=8226c1b8&scoped=true\"\nimport script from \"./chat.vue?vue&type=script&lang=js\"\nexport * from \"./chat.vue?vue&type=script&lang=js\"\nimport style0 from \"./chat.vue?vue&type=style&index=0&id=8226c1b8&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"8226c1b8\",\n null\n \n)\n\nexport default component.exports","<template>\r\n <k-container v-loading=\"0\" direction=\"horizontal\" class=\"k-sb-container\">\r\n <!-- 好友、群聊列表 -->\r\n <sb-left-aside\r\n ref=\"leftAsideRef\"\r\n :updateChatTarget=\"updateChatTargetFn\"\r\n :updateCollapseMsg=\"updateCollapseMsgFn\"\r\n @switchMsg=\"switchMsgCallback\"\r\n @handleMenuAction=\"handleMenuAction\"\r\n ></sb-left-aside>\r\n <k-container v-show=\"show.isShowChatBox\" direction=\"vertical\" class=\"k-sb-main\">\r\n <!-- 聊天窗口页头 -->\r\n <header class=\"k-chat-header\" v-show=\"show.isShowChatBox\">\r\n <gray-button\r\n class=\"icon-btn\"\r\n @click.native=\"collapseMsghandler()\"\r\n v-show=\"!show.isCollapseMsg\"\r\n >\r\n <el-tooltip effect=\"dark\" content=\"展开消息列表\" placement=\"right\">\r\n <pps-icon icon=\"pps-icon-side-hide\"></pps-icon>\r\n </el-tooltip>\r\n </gray-button>\r\n <div class=\"k-chat-header-content\">\r\n <h1 class=\"k-chat-header-title\">{{ chatTarget.name }}{{ getGroupMemberLength }}</h1>\r\n </div>\r\n <gray-button\r\n @click.native=\"collapseRighthandler()\"\r\n v-show=\"chatTarget.isGroup\"\r\n class=\"showGroupInfo\"\r\n >\r\n <i class=\"el-icon-more\"></i>\r\n </gray-button>\r\n </header>\r\n <!-- 聊天窗口 -->\r\n <k-container direction=\"horizontal\" class=\"k-chat-main\">\r\n <sb-chat-main\r\n ref=\"chatMainRef\"\r\n :chatTarget=\"chatTarget\"\r\n :memberList=\"getMemberList\"\r\n @handleMenuAction=\"handleMenuAction\"\r\n ></sb-chat-main>\r\n <!-- 右侧、群聊成员 -->\r\n <sb-right-aside\r\n v-if=\"chatTarget.isGroup\"\r\n v-show=\"show.isCollapseRight\"\r\n :chatTarget=\"chatTarget\"\r\n :memberList=\"getMemberList\"\r\n @handleMenuAction=\"handleMenuAction\"\r\n ></sb-right-aside>\r\n <!-- 遮罩层 -->\r\n <div\r\n v-if=\"chatTarget.isGroup\"\r\n v-show=\"isShowRightMask\"\r\n @click=\"collapseRighthandler()\"\r\n class=\"mask\"\r\n ></div>\r\n </k-container>\r\n </k-container>\r\n </k-container>\r\n</template>\r\n\r\n<script>\r\nimport { mapGetters, mapActions, mapState } from 'vuex';\r\nimport User from '@/utils/sandBox/user';\r\nimport Administrators from '@/utils/sandBox/administrators';\r\nimport Group from '@/utils/sandBox/group';\r\nimport kContainer from '@/components/layout/container';\r\nimport sbLeftAside from './aside/left.vue';\r\nimport sbRightAside from './aside/right.vue';\r\nimport sbChatMain from './main/chat.vue';\r\nimport grayButton from './ui/grayButton.vue';\r\nimport wsBus from '@/utils/sandBox/wsBus';\r\nexport default {\r\n name: 'sandBox',\r\n components: { kContainer, sbLeftAside, sbRightAside, sbChatMain, grayButton },\r\n data() {\r\n return {\r\n show: {\r\n isShowUsers: true,\r\n isShowGroups: true,\r\n isShowChatBox: true,\r\n isCollapseMsg: true,\r\n isCollapseRight: true\r\n },\r\n screen: { width: 0, height: 0 },\r\n admin: new Administrators(),\r\n chatTarget: {\r\n id: '',\r\n isGroup: false,\r\n name: ''\r\n }\r\n };\r\n },\r\n methods: {\r\n ...mapActions('sandBox', ['initWebSocket', 'send', 'close']),\r\n test() {\r\n const admin = new Administrators();\r\n // this.$store.commit('sandBox/CLEAR_USERS'); // 清空用户\r\n // this.$store.commit('sandBox/CLEAR_GROUPS'); // 清空群组\r\n const jack = admin.createUser({ id: 1, name: 'jack', age: 18, sex: '男' });\r\n const tom = admin.createUser({ id: 2, name: 'tom', age: 28, sex: '男' });\r\n const lucy = admin.createUser({ id: 3, name: 'lucy', age: 17, sex: '女' });\r\n const mary = new User({ id: 4, name: 'mary', age: 19, sex: '女' });\r\n const someone = new User({ id: '21022102cz', name: '只陌予', age: 22, sex: '女' });\r\n admin.createGroup({\r\n id: 11,\r\n name: 'group1',\r\n members: ['user-1', 'user-2', 'user-3', 'user-4'],\r\n lord: 'user-1'\r\n });\r\n admin.createGroup({ id: 22, name: 'group2', members: ['user-3', jack, tom], lord: 'user-2' });\r\n admin.createGroup({\r\n id: 33,\r\n name: 'group3',\r\n members: ['user-1', 'user-2', lucy, someone],\r\n lord: 'user-3'\r\n });\r\n if (mary.addFriend('user-2')) console.log('mary添加tom成功');\r\n if (jack.addFriend('user-3')) console.log('jack添加tom成功');\r\n mary.addFriend('user-1');\r\n tom.addFriend('user-1');\r\n // lucy.removeGroupById(33);\r\n // jack.addGroupById({ groupId: 33 });\r\n // lucy.leaveGroupById(22);\r\n // console.log(admin.getAllUser());\r\n // lucy.kickMemberById({ groupId: 11, expellee: 1 });\r\n // mary.leaveGroupById(22);\r\n jack.sendMessageToFriend({ id: 'user-2', content: '你好' });\r\n jack.sendMessageToFriend({ id: 'user-3', content: '你好' });\r\n jack.sendMessageToFriend({ id: 'user-4', content: '你好' });\r\n // admin.removeUserById('user-1');\r\n // lucy.sendMessageToFriend({ id: 1, content: 'hi' });\r\n // jack.removeFriendById(3);\r\n lucy.inviteUserToGroup({ groupId: 'group-33', invitee: 'user-4', role: 'admin' });\r\n // lucy.deleteGroupMessage({ id: 33, msgId: 'DoRpJ4CDs2LiZlWZVylFG' });\r\n // mary.unmuteMemberById(33, 2);\r\n // mary.handleMuteGroupById(33, false)\r\n // tom.sendMessageToGroup({ id: 'group-33', content: '大家好!我是tom' });\r\n // jack.sendMessageToGroup({ id: 'group-33', content: '大家好!我是jack' });\r\n // mary.sendMessageToGroup({ id: 'group-33', content: '大家好!我是mary' });\r\n // admin.removeGroupById('group-33');\r\n // console.log(this.$store.getters['sandBox/getCurrentUser']);\r\n // this.$store.commit('sandBox/SWITCH_USER', 'user-4')\r\n },\r\n createUser({ id, name, age, sex }) {\r\n // eslint-disable-next-line no-new\r\n new User({ id, name, age, sex });\r\n },\r\n collapseMsghandler() {\r\n this.$refs.leftAsideRef.collapseMsghandler(true);\r\n this.show.isCollapseRight = false;\r\n },\r\n collapseRighthandler() {\r\n this.show.isCollapseRight = !this.show.isCollapseRight;\r\n },\r\n updateChatTargetFn(id, isGroup, name) {\r\n // console.log('chage', id, isGroup);\r\n this.chatTarget.id = id;\r\n this.chatTarget.isGroup = isGroup;\r\n this.chatTarget.name = name;\r\n },\r\n updateCollapseMsgFn(state) {\r\n this.show.isCollapseMsg = state;\r\n },\r\n switchMsgCallback(params) {\r\n // console.log(params);\r\n },\r\n handleMenuAction(action) {\r\n const { actionType, currentUser, targetUser, groupId } = action;\r\n const actionMap = {\r\n VIEW_PROFILE: this.viewUserProfile,\r\n ADD_FRIEND: this.addFriend,\r\n REMOVE_FRIEND: this.removeFriend,\r\n AT_USER: this.mentionUser,\r\n REMOVE_USER: this.kickMember,\r\n MUTE_USER: this.muteMember,\r\n UNMUTE_USER: this.unmuteMember,\r\n REVOKE_ADMIN: this.revokeAdmin,\r\n SET_ADMIN: this.setAdmin,\r\n MUTE_GROUP: this.handleMuteGroup,\r\n REMOVE_GROUP: this.removeGroup,\r\n LEAVE_GROUP: this.leaveGroup,\r\n INVITE_FRIEND: this.inviteFriend\r\n };\r\n if (actionMap[actionType]) {\r\n actionMap[actionType](targetUser, groupId, currentUser);\r\n }\r\n },\r\n viewUserProfile(targetUser, groupId, currentUser) {\r\n this.$refs.leftAsideRef.showUserDetailFn(targetUser);\r\n },\r\n mentionUser(targetUser, groupId, currentUser) {\r\n if (this.messagingEnabled) this.$refs.chatMainRef.mentionMember(targetUser.name);\r\n else this.$message.info('禁言中,请解禁后再试!');\r\n },\r\n addFriend(targetUser, groupId, currentUser) {\r\n const user = new User(this.getCurrentUser);\r\n const res = user.addFriend(targetUser.id);\r\n if (res) {\r\n this.$message.success('添加成功!');\r\n this.send({\r\n event: 'on_friend_increase',\r\n time: Date.now(),\r\n type: 0,\r\n userId: user.id\r\n });\r\n } else this.$message.error('添加失败!');\r\n },\r\n removeFriend(targetUser, groupId, currentUser) {\r\n const user = new User(this.getCurrentUser);\r\n const res = user.removeFriendById(targetUser.id);\r\n if (res) {\r\n this.send({\r\n event: 'on_friend_decrease',\r\n time: Date.now(),\r\n type: 0,\r\n userId: user.id\r\n });\r\n }\r\n },\r\n removeGroup(targetUser, groupId, currentUser) {\r\n const user = new User(targetUser);\r\n const res = user.removeGroupById(groupId);\r\n if (!res) {\r\n this.$dialog({ title: '警告', content: '群聊删除失败!' });\r\n }\r\n },\r\n leaveGroup(targetUser, groupId, currentUser) {\r\n const user = new User(targetUser);\r\n const res = user.leaveGroupById(groupId);\r\n if (!res) {\r\n this.$message.error('群聊退出失败!');\r\n } else {\r\n this.$message.success('已退出群聊!');\r\n this.send({\r\n event: 'on_group_decrease',\r\n time: Date.now(),\r\n type: 1,\r\n userId: targetUser.id,\r\n operatorId: targetUser.id,\r\n groupId\r\n });\r\n }\r\n },\r\n inviteFriend(targetUser, groupId, currentUser) {\r\n const curUser = new User(this.getCurrentUser);\r\n const res = curUser.inviteUserToGroup({\r\n groupId,\r\n invitee: targetUser.id\r\n });\r\n if (res) {\r\n this.send({\r\n event: 'on_group_increase',\r\n time: Date.now(),\r\n type: 1,\r\n userId: targetUser.id,\r\n operatorId: curUser.id,\r\n groupId\r\n });\r\n } else {\r\n this.$message.error('邀请失败!');\r\n }\r\n },\r\n muteMember(targetUser, groupId, duration) {\r\n if (duration === 0) return this.unmuteMember(targetUser, groupId);\r\n const user = new User(this.getCurrentUser);\r\n const res = user.muteMemberById(groupId, targetUser.id, duration);\r\n if (res) {\r\n this.send({\r\n event: 'on_group_ban',\r\n userId: targetUser.id,\r\n operatorId: user.id,\r\n groupId,\r\n duration\r\n });\r\n } else {\r\n this.botSendGroupMsg({ groupId, message: '管理员无法禁言!' });\r\n }\r\n },\r\n unmuteMember(targetUser, groupId, currentUser) {\r\n const user = new User(this.getCurrentUser);\r\n const res = user.unmuteMemberById(groupId, targetUser.id);\r\n if (res) {\r\n this.send({\r\n event: 'on_group_ban',\r\n userId: targetUser.id,\r\n operatorId: user.id,\r\n groupId,\r\n duration: 0\r\n });\r\n }\r\n },\r\n handleMuteGroup(action, groupId, status) {\r\n console.log(action, groupId, status);\r\n const isMute = action ?? status;\r\n const user = new User(this.getCurrentUser);\r\n const res = user.handleMuteGroupById(groupId, isMute);\r\n if (res) {\r\n this.send({\r\n event: 'on_group_whole_ban',\r\n type: 1,\r\n operatorId: user.id,\r\n operation: status ? 'set' : 'unset',\r\n groupId,\r\n time: Date.now()\r\n });\r\n }\r\n },\r\n kickMember(targetUser, groupId, currentUser) {\r\n const user = new User(this.getCurrentUser);\r\n const res = user.kickMemberById({ groupId, expellee: targetUser.id });\r\n if (res) {\r\n this.$message.success('已移出群聊!');\r\n this.send({\r\n event: 'on_group_decrease',\r\n time: Date.now(),\r\n type: 1,\r\n userId: targetUser.id,\r\n operatorId: user.id,\r\n groupId\r\n });\r\n } else {\r\n this.$message.error('移除失败!');\r\n }\r\n },\r\n setAdmin(targetUser, groupId, currentUser) {\r\n const res = new User(this.getCurrentUser).setGroupAdmin({\r\n gid: groupId,\r\n mid: targetUser.id\r\n });\r\n if (res) {\r\n this.send({\r\n event: 'on_group_admin',\r\n time: Date.now(),\r\n type: 1,\r\n userId: targetUser.id,\r\n operation: 'set',\r\n groupId\r\n });\r\n }\r\n },\r\n revokeAdmin(targetUser, groupId, currentUser) {\r\n const res = new User(this.getCurrentUser).revokeGroupAdmin(groupId, targetUser.id);\r\n if (res) {\r\n this.send({\r\n event: 'on_group_admin',\r\n time: Date.now(),\r\n type: 1,\r\n userId: targetUser.id,\r\n operation: 'unset',\r\n groupId\r\n });\r\n }\r\n },\r\n receiveWsMsg(msg) {\r\n const actionsMap = {\r\n send_private_msg: this.botSendPrivateMsg,\r\n send_group_msg: this.botSendGroupMsg,\r\n on_data_error: this.t\r\n };\r\n\r\n if (actionsMap[msg.action]) {\r\n actionsMap[msg.action](msg);\r\n } else if (msg.action === 'set_group_whole_ban') {\r\n this.handleMuteGroup(msg.enable, msg.groupId);\r\n } else if (msg.action === 'set_group_ban') {\r\n console.log(msg.userId);\r\n const user = new User({ id: msg.userId });\r\n this.muteMember(user, msg.groupId, msg.time);\r\n }\r\n },\r\n t(d) {\r\n // const t = JSON.parse(d.error);\r\n // console.log(t);\r\n },\r\n botSendPrivateMsg(msg) {\r\n const user = new User({ numId: 'super-admin' });\r\n user.sendMessageToFriend({\r\n id: msg.userId,\r\n content: msg.message,\r\n replyMsg: null\r\n });\r\n },\r\n botSendGroupMsg(msg) {\r\n const user = new User({ numId: 'super-admin' });\r\n user.sendMessageToGroup({\r\n id: msg.groupId,\r\n content: msg.message,\r\n replyMsg: null\r\n });\r\n },\r\n\r\n // 控制ws是否长链\r\n initSandboxWsAliveFn() {\r\n if (!this.isKeepSandboxWsAlive) {\r\n this.close();\r\n }\r\n }\r\n },\r\n computed: {\r\n ...mapGetters('sandBox', ['getCurrentUser', 'getCurrentMsg']),\r\n ...mapGetters('layoutOption', ['getIsNarrowScreen']),\r\n ...mapState('sandBox', ['isKeepSandboxWsAlive']),\r\n getMemberList() {\r\n if (this.chatTarget.isGroup && this.getCurrentMsg) {\r\n const group = this.admin.getGroupById(this.chatTarget.id);\r\n return group ? new Group({ id: group.id }).getAllMember() : [];\r\n }\r\n return [];\r\n },\r\n getGroupMemberLength() {\r\n return this.chatTarget.isGroup ? `(${this.getMemberList.length})` : null;\r\n },\r\n messagingEnabled() {\r\n if (this.chatTarget.isGroup) {\r\n const curMember = new User(this.getCurrentUser);\r\n const isAdmin = curMember._isAdmin(this.chatTarget.id);\r\n if (isAdmin) return true;\r\n const isGroupMute = this.getCurrentMsg.isMute;\r\n const isMute = this.getCurrentMsg.muteMembers.includes(curMember.id);\r\n return !(isGroupMute || isMute);\r\n }\r\n return true;\r\n },\r\n isShowRightMask() {\r\n return this.getIsNarrowScreen && this.show.isCollapseRight;\r\n },\r\n isShowRightAside() {\r\n return this.show.isCollapseRight;\r\n }\r\n },\r\n watch: {\r\n getIsNarrowScreen: {\r\n handler(val) {\r\n if (val) {\r\n this.show.isCollapseRight = false;\r\n } else {\r\n this.show.isCollapseRight = true;\r\n }\r\n },\r\n immediate: true\r\n },\r\n getCurrentMsg: {\r\n handler(val) {\r\n if (val === null) {\r\n this.chatTarget = { id: '', isGroup: false };\r\n }\r\n },\r\n deep: true\r\n }\r\n },\r\n created() {\r\n this.$store.commit('sandBox/SWITCH_USER');\r\n this.$store.commit('sandBox/SWITCH_CHAT');\r\n\r\n // 初始化ws连接\r\n this.initWebSocket();\r\n wsBus.$on('onmessage', this.receiveWsMsg);\r\n },\r\n mounted() {\r\n // this.show.isCollapseRight = !this.getIsNarrowScreen;\r\n },\r\n beforeDestroy() {\r\n wsBus.$off('onmessage', this.receiveWsMsg);\r\n this.initSandboxWsAliveFn();\r\n }\r\n};\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n.k-container ::v-deep aside,\r\n.k-container ::v-deep section,\r\n.k-container ::v-deep header,\r\n.k-container ::v-deep div {\r\n box-sizing: border-box;\r\n}\r\n.k-sb-container {\r\n --sb-header-height: 60px;\r\n .k-sb-main {\r\n // height: 100%;\r\n flex: 1;\r\n min-width: 0;\r\n .k-chat-main {\r\n position: relative;\r\n flex-grow: 1;\r\n min-width: 0;\r\n\r\n .mask {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: #000;\r\n opacity: 0.5;\r\n z-index: 3;\r\n }\r\n }\r\n }\r\n}\r\n.k-sb-container ::v-deep .k-chat-header {\r\n height: var(--sb-header-height);\r\n}\r\n.k-chat-header {\r\n display: flex;\r\n align-items: center;\r\n border-bottom: 2px solid #e9e9e9;\r\n background-color: #f2f2f2;\r\n\r\n .icon-btn {\r\n margin-left: 10px;\r\n }\r\n .showGroupInfo {\r\n margin-left: auto;\r\n margin-right: 10px;\r\n }\r\n}\r\n.k-chat-header-content {\r\n margin-inline-start: 10px;\r\n .k-chat-header-title {\r\n font-size: 16px;\r\n font-style: normal;\r\n }\r\n}\r\n.aside-group,\r\n.aside-users {\r\n transition: all 0.3s ease;\r\n}\r\n</style>\r\n","import mod from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!../../../node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./index.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./index.vue?vue&type=template&id=050404f6&scoped=true\"\nimport script from \"./index.vue?vue&type=script&lang=js\"\nexport * from \"./index.vue?vue&type=script&lang=js\"\nimport style0 from \"./index.vue?vue&type=style&index=0&id=050404f6&prod&lang=scss&scoped=true\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"050404f6\",\n null\n \n)\n\nexport default component.exports","export const userFullScreen = {\r\n methods: {\r\n toggleFullscreen() {\r\n this.isFullscreen() ? this.exit() : this.enter(document.documentElement);\r\n },\r\n isFullscreen() {\r\n return (\r\n !!document.fullscreenElement ||\r\n !!document.webkitFullscreenElement ||\r\n !!document.mozFullScreenElement ||\r\n !!document.msFullscreenElement ||\r\n null\r\n );\r\n },\r\n enter(element) {\r\n if (element.requestFullscreen) {\r\n element.requestFullscreen();\r\n } else if (element.webkitRequestFullscreen) {\r\n // Safari\r\n element.webkitRequestFullscreen();\r\n } else if (element.mozRequestFullScreen) {\r\n // Firefox\r\n element.mozRequestFullScreen();\r\n } else if (element.msRequestFullscreen) {\r\n // IE/Edge\r\n element.msRequestFullscreen();\r\n }\r\n },\r\n exit() {\r\n if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n } else if (document.webkitExitFullscreen) {\r\n // Safari\r\n document.webkitExitFullscreen();\r\n } else if (document.mozCancelFullScreen) {\r\n // Firefox\r\n document.mozCancelFullScreen();\r\n } else if (document.msExitFullscreen) {\r\n // IE/Edge\r\n document.msExitFullscreen();\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const tranRoleMixin = {\r\n props: {\r\n chatTarget: {\r\n type: Object,\r\n default() {\r\n return null;\r\n }\r\n },\r\n memberList: {\r\n type: Array,\r\n default() {\r\n return [];\r\n }\r\n }\r\n },\r\n methods: {\r\n tranRoleFn(role) {\r\n const roleMap = {\r\n lord: '群主',\r\n admin: '管理员',\r\n 'super-admin': 'bot',\r\n expellee: '已退群'\r\n };\r\n return roleMap[role] || '';\r\n },\r\n avatarContextMenuFn(menu) {\r\n const { uid, task, key } = menu;\r\n if (task) {\r\n const user = this.admin.getUserById(uid);\r\n this.$emit('handleMenuAction', {\r\n targetUser: user,\r\n actionType: key,\r\n groupId: this.chatTarget.id\r\n });\r\n }\r\n }\r\n }\r\n};\r\n\r\n// const permissionList = {}\r\n"],"names":["render","_vm","this","_c","_self","ref","staticClass","_t","staticRenderFns","name","component","class","direction","props","type","String","default","computed","style","flexDirection","mode","data","activeIndex","defaultActive","provide","root","activeColor","activeShape","Array","backgroundColor","textColor","router","Boolean","methods","changeRouteFn","path","$router","push","rootMenu","watch","val","beforeCreate","$bus","Vue","mounted","$on","beforeDestroy","$off","attrs","tips","title","className","active","itemStyle","height","minHeight","justifyContent","align","on","onmouseenterFn","onMouseLeaveFn","handleClickFn","includes","directives","rawName","value","expression","background","_e","circleStyle","inject","$el","handleTooltipFn","$emit","index","isShow","$refs","tooltip","showPopper","activeArr","split","indexArr","color","borderLeftColor","border","filter","beforeMount","icon","width","updateChatTargetFn","updateCollapseMsgFn","switchMsgCallback","handleMenuAction","show","isShowChatBox","isCollapseMsg","nativeOn","$event","collapseMsghandler","_v","_s","chatTarget","getGroupMemberLength","isGroup","collapseRighthandler","getMemberList","isCollapseRight","isShowRightMask","Group","constructor","numId","id","lord","avatar","self","admins","members","mount","store","commit","getAllMember","map","role","user","getters","getMemberById","find","member","getAllMessage","addMember","uid","gid","removeMember","urlAlphabet","nanoid","size","bytes","crypto","getRandomValues","Uint8Array","scopedUrlAlphabet","ROLE_SELF","ROLE_FRIEND","User","age","sex","order","state","sandBox","registeredUsersCount","avatar_code","groups","friends","hasUser","addFriend","getAllFriend","getAllGroups","g_list","all_groups","getGroupById","groupId","hasGroup","some","fid","friend","hasFriend","friendItem","sendMessageToFriend","content","receiveAddFriend","frdMsg","Reflect","has","console","log","removeFriendById","res","deleteFriendMessage","delRes1","createGroup","normalizeMembers","_memberNormalize","group","forEach","async","mid","getUserById","removeGroupById","isLord","isSuper","addGroupById","errorLogFn","hasMember","inviteUserToGroup","invitee","normalizeInvitee","hasSelf","leaveGroupById","kickMemberById","expellee","exp","m","_isAdmin","ad","replyMsg","msgId","timestamp","Date","now","message","receiver","date","msgOption","sender","receiveFriendMessage","status","sendMessageToGroup","groupMsg","hasMute","isMute","muteMembers","deleteGroupMessage","hasMessage","messages","isMyMessage","handleMuteGroupById","muteMemberById","duration","unmuteMemberById","setGroupAdmin","revokeGroupAdmin","getFriendMessageById","friendId","allMsg","friendMsg","getGroupMessageById","memberHandle","Object","isAdmin","error","Administrators","getAllUser","removeUserById","u","clearUSer","getAllGroup","__memberNormalize","scopedSlots","_u","key","fn","length","getCurrentUser","_l","switchUserFn","label","task","contextMenuFn","menu","item","slot","showUserDetailFn","showFriendListFn","showGroupListFn","proxy","createUser","ADD_USER_IMG","messageList","selectMsgFn","showMessageList","isTransparent","toggleMsgTabFn","getIsNarrowScreen","$set","cancelCreateUserFn","createUserFn","model","callback","$$v","bulkCreateUsers","removeUser","removeUserFn","emitTabUpdate","closeAddObjDialogFn","searchDialog","input","tabs","searchFn","staticStyle","tabPrefix","switchSearchTabFn","tableData","scope","row","isAdded","addFriendFn","createGroupFn","getFriendListExceptSuper","handleSelectionChange","friendList","closeUserInfoFn","selectFreindLIst","removeFriendFn","groupList","selcetGroupList","userDetailDate","removeGroupFn","leaveGroupFn","userInfo","changeTabFn","tab","refInFor","current","left","x","top","y","Number","offsetLeft","offsetTop","formatTimestamp","ts","inputDate","year","getFullYear","month","getMonth","getDate","isToday","toLocaleTimeString","hour","minute","padZero","n","components","kSbAside","kContainer","kMenu","kMenuItem","kTab","grayButton","users","admin","REMOVE_USER","messageMode","checkList","updateChatTarget","Function","updateCollapseMsg","$store","msgMenuRef","adder","hasData","$dialog","then","action","catch","newUser","userListWithSuper","g","userList","f","targetUser","actionType","currentUser","deleteFriendMsgFn","curUser","chat","selectNewMsgFn","msg","assign","mapGetters","chatList","lastMessage","at","undefined","list","friend_list","group_list","created","sortedMemberList","viewUserProfile","getUserMenuItems","avatarContextMenuFn","tranRoleFn","isShowFriendList","isShowMuteBtn","muteGroup","apply","arguments","isMuteAll","muteBtnClass","isInvited","inviteFriendFn","ROLE_LEVEL","MENU_ITEMS","VIEW_PROFILE","roles","AT_USER","excludeSelf","ADD_FRIEND","friendRelation","REMOVE_FRIEND","MUTE_USER","minTargetLevel","maxTargetLevel","requireNotMuted","UNMUTE_USER","requireMuted","SET_ADMIN","requireNotAdmin","REVOKE_ADMIN","requireAdmin","getVisibleMenuItems","targetLevel","isFriend","isMemberFriend","isMuted","isMemberMuted","isMemberAdmin","entries","toLowerCase","replace","role_m","role_g","mixins","tranRoleMixin","curUer","memberList","isEnter","rolePriorityMap","Map","getPriority","get","sort","a","b","getGroupMessage","getCurrentMsg","isTalkWithBot","isSelfFn","replyMsgFn","messagingEnabled","messagingPlaceholder","inputFn","saveRange","indexOf","_k","keyCode","sendMessageFn","lastRange","handlePaste","cancelReplyMsgFn","LOGO","isSelf","getUserAvatarFn","getGroupSenderRole","getRole","getUserNickname","getTextMenus","testContextMenuFn","mapActions","deleteMsgFn","$message","success","send","event","time","userId","messageId","operatorId","nickname","fail","kSbMessage","muteStatusIntervalId","isComposing","cursorPosition","inputObserver","curMember","isGroupMute","getMemberMuteStatue","checkMuteStatus","cmsg","isArray","mapMutations","clearMuteExpire","setInterval","clearInterval","e","updateMessage","$nextTick","getTextContent","element","childNodes","i","node","nodeType","Node","TEXT_NODE","textContent","ELEMENT_NODE","tagName","setInputContent","maintainCursor","savedRange","saveCurrentRange","innerHTML","restoreRange","selection","window","getSelection","rangeCount","range","getRangeAt","contains","commonAncestorContainer","startContainer","startOffset","endContainer","endOffset","document","createRange","setStart","setEnd","removeAllRanges","addRange","warn","focusAtEnd","focus","selectNodeContents","collapse","cloneRange","preventDefault","text","clipboardData","getData","cleanText","insertTextAtCursor","isRangeInNode","textNode","createTextNode","deleteContents","insertNode","newRange","setStartAfter","mentionMember","username","mentionNode","createElement","contentEditable","cssText","space","parentNode","insertBefore","nextSibling","clearInput","handleCompositionStart","handleCompositionEnd","trim","roleMap","messageAlt","sendMsgToBot","scrollToBottom","msg_data","setGroupAdminFn","$prompt","confirmButtonText","cancelButtonText","container","smooth","chatBox","scrollTo","scrollHeight","behavior","scrollTop","updatePlaceholder","setAttribute","removeAttribute","addEventListener","removeEventListener","updated","sbLeftAside","sbRightAside","sbChatMain","isShowUsers","isShowGroups","screen","test","jack","tom","lucy","mary","someone","leftAsideRef","params","actionMap","removeFriend","mentionUser","kickMember","muteMember","unmuteMember","revokeAdmin","setAdmin","MUTE_GROUP","handleMuteGroup","REMOVE_GROUP","removeGroup","LEAVE_GROUP","leaveGroup","INVITE_FRIEND","inviteFriend","chatMainRef","info","botSendGroupMsg","operation","receiveWsMsg","actionsMap","send_private_msg","botSendPrivateMsg","send_group_msg","on_data_error","t","enable","d","initSandboxWsAliveFn","isKeepSandboxWsAlive","close","mapState","isShowRightAside","handler","immediate","deep","initWebSocket","wsBus","userFullScreen","toggleFullscreen","isFullscreen","exit","enter","documentElement","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","requestFullscreen","webkitRequestFullscreen","mozRequestFullScreen","msRequestFullscreen","exitFullscreen","webkitExitFullscreen","mozCancelFullScreen","msExitFullscreen"],"sourceRoot":""}