groupManage.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. <template>
  2. <div class='container'>
  3. <div class='handle-box'>
  4. <el-form :inline='true'>
  5. <el-form-item>
  6. <el-button type='primary' @click='dialogVisible = true' v-if="hasAuth('sys:user:save')">新增
  7. </el-button>
  8. </el-form-item>
  9. </el-form>
  10. </div>
  11. <el-table
  12. ref='crowdTable'
  13. :data='tableData'
  14. tooltip-effect='dark'
  15. style='width: 100%'
  16. border
  17. stripe>
  18. <el-table-column
  19. type='index'
  20. label='序号'
  21. width='50'>
  22. </el-table-column>
  23. <el-table-column
  24. prop='name'
  25. label='群组名称'
  26. :show-overflow-tooltip='true'>
  27. </el-table-column>
  28. <el-table-column
  29. prop='description'
  30. label='群组描述'
  31. :show-overflow-tooltip='true'>
  32. </el-table-column>
  33. <el-table-column
  34. prop='maxusers'
  35. width='100'
  36. align='center'
  37. label='最大人数'>
  38. </el-table-column>
  39. <el-table-column
  40. prop='affiliations_count'
  41. width='100'
  42. align='center'
  43. label='目前人数'>
  44. <template slot-scope='scope'>
  45. {{ scope.row.affiliations_count - 1 }}
  46. </template>
  47. </el-table-column>
  48. <el-table-column
  49. prop='created'
  50. label='创建时间'>
  51. <template slot-scope='scope'>
  52. {{ $moment(new Date(scope.row.created)).format('yyyy-MM-DD HH:mm:ss') }}
  53. </template>
  54. </el-table-column>
  55. <el-table-column
  56. prop='icon'
  57. fixed='right'
  58. width='220px'
  59. label='操作'>
  60. <template slot-scope='scope'>
  61. <span>
  62. <el-button type='text' @click='editHandle(scope.row)'>编辑</el-button>
  63. <el-divider direction='vertical'></el-divider>
  64. </span>
  65. <template>
  66. <el-popconfirm title='确定删除这条数据吗?' @confirm='delHandle(scope.row.id)'>
  67. <el-button type='text' slot='reference'>删除</el-button>
  68. </el-popconfirm>
  69. </template>
  70. <span>
  71. <el-divider direction='vertical'></el-divider>
  72. <el-button type='text' @click='showManageMember(scope.row)'>管理成员</el-button>
  73. </span>
  74. <span>
  75. <el-divider direction='vertical'></el-divider>
  76. <el-button type='text' @click='showQRCode(scope.row)'>二维码</el-button>
  77. </span>
  78. </template>
  79. </el-table-column>
  80. </el-table>
  81. <el-pagination
  82. @size-change='handleSizeChange'
  83. @current-change='handleCurrentChange'
  84. layout='total, sizes, prev, pager, next, jumper'
  85. :page-sizes='[5, 10, 15, 20]'
  86. :current-page='paging.current'
  87. :page-size='paging.size'
  88. :total='paging.total'>
  89. </el-pagination>
  90. <!--新增对话框-->
  91. <el-dialog
  92. title='提示'
  93. :visible.sync='dialogVisible'
  94. width='60%'
  95. :before-close='handleClose'>
  96. <el-form :model='gourpForm' :rules='gourpFormRules' ref='gourpForm'>
  97. <el-row>
  98. <el-col :span='12'>
  99. <el-form-item label='群组名称:' prop='groupname' label-width='100px'>
  100. <el-input v-model='gourpForm.groupname' autocomplete='off' placeholder='请输入群组名称'></el-input>
  101. </el-form-item>
  102. </el-col>
  103. <el-col :span='12'>
  104. <el-form-item label='是否公开:' prop='ispublic' label-width='100px'>
  105. <el-select :disabled='gourpForm.id' v-model='gourpForm.ispublic' placeholder='请选择是否公开'>
  106. <el-option
  107. v-for='item in ispublicList'
  108. :key='item.value'
  109. :label='item.label'
  110. :value='item.value'>
  111. </el-option>
  112. </el-select>
  113. <p class='form-tips'>提示:无特殊需求选择不公开</p>
  114. </el-form-item>
  115. </el-col>
  116. </el-row>
  117. <el-row>
  118. <el-col :span='24'>
  119. <el-form-item label='群组描述:' prop='desc' label-width='100px'>
  120. <el-input type='textarea' rows='3' v-model='gourpForm.desc' autocomplete='off'
  121. placeholder='请输入群组描述'></el-input>
  122. </el-form-item>
  123. </el-col>
  124. </el-row>
  125. <el-row>
  126. <el-col :span='12'>
  127. <el-form-item label='最大数量:' prop='maxusers' label-width='100px'>
  128. <el-input type='number' v-model='gourpForm.maxusers' autocomplete='off'
  129. placeholder='请输入群组人员最大数量'></el-input>
  130. <p class='form-tips'>提示:无特殊需求填200</p>
  131. </el-form-item>
  132. </el-col>
  133. <el-col :span='12'>
  134. <el-form-item label='是否批准:' prop='approval' label-width='100px'>
  135. <el-select :disabled='gourpForm.id' v-model='gourpForm.approval' placeholder='请选择是否需要批准进群'>
  136. <el-option
  137. v-for='item in approvalList'
  138. :key='item.value'
  139. :label='item.label'
  140. :value='item.value'>
  141. </el-option>
  142. </el-select>
  143. <p class='form-tips'>提示:若无特殊需求请使用默认的需要批准配置</p>
  144. </el-form-item>
  145. </el-col>
  146. </el-row>
  147. </el-form>
  148. <div slot='footer' class='dialog-footer'>
  149. <el-button @click="resetForm('gourpForm')">取 消</el-button>
  150. <el-button type='primary' @click="submitForm('gourpForm')">确 定</el-button>
  151. </div>
  152. </el-dialog>
  153. <ManageMember ref='manageMember'></ManageMember>
  154. <QrCode ref='qrCode'></QrCode>
  155. </div>
  156. </template>
  157. <script>
  158. import axios from 'axios';//加载表格数据的时候用原生axios防止loading组件显示两次
  159. import { Loading } from 'element-ui';
  160. import ManageMember from './components/manageMember';
  161. import QrCode from './components/qrCode';
  162. let loading;
  163. let options = {};
  164. export default {
  165. name: 'groupManage',
  166. components: { ManageMember, QrCode },
  167. data() {
  168. return {
  169. dialogVisible: false,
  170. gourpForm: {
  171. groupname: '',
  172. desc: '',
  173. ispublic: false,
  174. maxusers: 200,
  175. approval: true,
  176. owner: 'admin',
  177. members: []
  178. },
  179. ispublicList: [{
  180. label: '公开',
  181. value: true
  182. }, {
  183. label: '不公开',
  184. value: false
  185. }],
  186. approvalList: [{
  187. label: '不需要',
  188. value: false
  189. }, {
  190. label: '需要',
  191. value: true
  192. }],
  193. gourpFormRules: {
  194. groupname: [
  195. { required: true, message: '请输入群组名称', trigger: 'blur' }
  196. ],
  197. desc: [
  198. { required: true, message: '请输入群组描述', trigger: 'blur' }
  199. ],
  200. ispublic: [
  201. { required: true, message: '请选择是否公开', trigger: 'blur' }
  202. ],
  203. maxusers: [
  204. { required: true, message: '请输入最大人数', trigger: 'blur' }
  205. ],
  206. approval: [
  207. { required: true, message: '请选择是否需要审核', trigger: 'blur' }
  208. ]
  209. },
  210. tableData: [],
  211. tableDataAll: [],
  212. page: {
  213. cursor: '',//上次查询返回的游标,下次查询会查询本次查询后续的数据
  214. limit: 100//请求数据的大小
  215. },
  216. paging: {
  217. size: 10,
  218. total: 0,
  219. current: 1
  220. }
  221. };
  222. },
  223. mounted() {
  224. this.loadData();
  225. },
  226. methods: {
  227. //加载群组列表
  228. loadData() {
  229. //不使用全局的加载loading组件,等到群组详情查询完成了再关闭
  230. loading = Loading.service(options);
  231. let _this = this;
  232. axios.get('/api/easemob/queryGroupPage', { params: _this.page }).then(res => {
  233. //拿到群组数据
  234. let groupList = res.data.data.data;
  235. if (groupList.length <= 0) {
  236. //关闭转loading
  237. loading.close();
  238. return;
  239. }
  240. //再拿到所有群的groupid集合 并转成字符串
  241. let groupIds = groupList.map(t => {
  242. return t.groupid;
  243. }).join(',');
  244. //再查询群组详情
  245. _this.loadDataDetails(groupIds);
  246. });
  247. },
  248. //加载群组详情
  249. loadDataDetails(groupIds) {
  250. let _this = this;
  251. axios.get('/api/easemob/queryGroupDetails/' + groupIds, {}).then(res => {
  252. //把数据加入到表格数据中
  253. _this.tableDataAll = [];
  254. _this.tableDataAll.push(...res.data.data.data);
  255. //设置真正的表格数据
  256. _this.tableData = _this.tableDataAll.slice((_this.paging.current - 1) * _this.paging.size, _this.paging.current * _this.paging.size);
  257. //回写数据条数
  258. _this.paging.total = _this.tableDataAll.length;
  259. //关闭转loading
  260. loading.close();
  261. });
  262. },
  263. handleClose() {
  264. this.resetForm('gourpForm');
  265. },
  266. resetForm(formName) {
  267. this.$refs[formName].resetFields();
  268. this.dialogVisible = false;
  269. this.gourpForm = {
  270. groupname: '',
  271. desc: '',
  272. ispublic: false,
  273. maxusers: 200,
  274. approval: true,
  275. owner: 'admin',
  276. members: []
  277. };
  278. },
  279. submitForm(formName) {
  280. let _this = this;
  281. //如果id不为空,封装修改参数
  282. if (_this.gourpForm.id) {
  283. _this.gourpForm.editParams = {
  284. id: _this.gourpForm.id,
  285. groupname: _this.gourpForm.groupname,
  286. description: _this.gourpForm.desc,
  287. maxusers: _this.gourpForm.maxusers
  288. };
  289. }
  290. _this.$refs[formName].validate((valid) => {
  291. if (valid) {
  292. _this.$axios.post('/api/easemob/' + (_this.gourpForm.id ? 'updateGroup' : 'createGroup'), _this.gourpForm.id ? _this.gourpForm.editParams : _this.gourpForm).then(res => {
  293. if (res.data.data.data) {
  294. _this.$notify({
  295. showClose: true,
  296. message: '恭喜你,操作成功',
  297. type: 'success'
  298. });
  299. _this.loadData();
  300. } else {
  301. _this.$notify({
  302. showClose: true,
  303. message: res.data.data.error_description ? res.data.data.error_description : '操作失败',
  304. type: 'error'
  305. });
  306. }
  307. _this.resetForm(formName);
  308. });
  309. } else {
  310. return false;
  311. }
  312. });
  313. },
  314. editHandle(row) {
  315. this.gourpForm = {
  316. id: row.id,
  317. groupname: row.name,
  318. desc: row.description,
  319. ispublic: row.public,
  320. maxusers: row.maxusers,
  321. approval: row.membersonly,
  322. owner: 'admin',
  323. members: []
  324. };
  325. this.dialogVisible = true;
  326. },
  327. delHandle(id) {
  328. let _this = this;
  329. _this.$axios.delete('/api/easemob/deleteGroup/' + id).then(res => {
  330. if (res.data.data.data) {
  331. _this.$notify({
  332. showClose: true,
  333. message: '恭喜你,操作成功',
  334. type: 'success'
  335. });
  336. _this.loadData();
  337. } else {
  338. _this.$notify({
  339. showClose: true,
  340. message: res.data.data.error_description ? res.data.data.error_description : '操作失败',
  341. type: 'error'
  342. });
  343. }
  344. });
  345. },
  346. handleSizeChange(val) {
  347. this.paging.size = val;
  348. this.loadData();
  349. },
  350. handleCurrentChange(val) {
  351. this.paging.current = val;
  352. this.loadData();
  353. },
  354. showManageMember(row) {
  355. this.$refs['manageMember'].show(row);
  356. },
  357. showQRCode(row) {
  358. this.$refs['qrCode'].show(row, 'GROUP');
  359. }
  360. }
  361. };
  362. </script>
  363. <style scoped>
  364. .form-tips {
  365. color: #999999;
  366. font-size: 12px;
  367. }
  368. </style>