Member.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. <template>
  2. <div class="hello">
  3. <el-button type="text" class="add-member" @click="dialogFormVisible = true">{{$t('add_member')}}</el-button>
  4. <el-button
  5. type="text"
  6. class="add-member"
  7. @click="dialogFormTeamVisible = true"
  8. >{{$t('add_team')}}</el-button>
  9. <!-- 单个成员列表 -->
  10. <el-table align="left" v-if="members.length>0" :data="members" height="200" style="width: 100%">
  11. <el-table-column prop="username" :label="$t('member_username')" width="100"></el-table-column>
  12. <el-table-column prop="name" :label="$t('name')"></el-table-column>
  13. <el-table-column prop="addtime" :label="$t('add_time')" width="100"></el-table-column>
  14. <el-table-column prop="member_group" :label="$t('authority')"></el-table-column>
  15. <el-table-column prop :label="$t('operation')">
  16. <template slot-scope="scope">
  17. <el-button
  18. @click="delete_member(scope.row.item_member_id)"
  19. type="text"
  20. size="small"
  21. >{{$t('delete')}}</el-button>
  22. </template>
  23. </el-table-column>
  24. </el-table>
  25. <!-- 团队列表 -->
  26. <el-table
  27. align="left"
  28. v-if="teamItems.length>0"
  29. :data="teamItems"
  30. height="200"
  31. style="width: 100%"
  32. >
  33. <el-table-column prop="team_name" :label="$t('team_name')"></el-table-column>
  34. <el-table-column prop="addtime" :label="$t('add_time')"></el-table-column>
  35. <el-table-column prop :label="$t('operation')">
  36. <template slot-scope="scope">
  37. <el-button
  38. @click="getTeamItemMember(scope.row.team_id)"
  39. type="text"
  40. size="small"
  41. >{{$t('member_authority')}}</el-button>
  42. <el-button @click="deleteTeam(scope.row.id)" type="text" size="small">{{$t('delete')}}</el-button>
  43. </template>
  44. </el-table-column>
  45. </el-table>
  46. <!-- 添加单个成员弹窗 -->
  47. <el-dialog
  48. :visible.sync="dialogFormVisible"
  49. :modal="false"
  50. top="10vh"
  51. :close-on-click-modal="false"
  52. >
  53. <el-form>
  54. <el-form-item label>
  55. <el-select
  56. v-model="MyForm.username"
  57. multiple
  58. filterable
  59. reserve-keyword
  60. placeholder
  61. :loading="loading"
  62. >
  63. <el-option
  64. v-for="item in memberOptions"
  65. :key="item.value"
  66. :label="item.label"
  67. :value="item.value"
  68. ></el-option>
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item label class="readonly-checkbox">
  72. <el-checkbox v-model="MyForm.is_readonly">{{$t('readonly')}}</el-checkbox>
  73. </el-form-item>
  74. <el-form-item label>
  75. <el-select v-model="MyForm.cat_id" :placeholder="$t('all_cat2')">
  76. <el-option
  77. v-for="item in catalogs"
  78. :key="item.cat_id"
  79. :label="item.cat_name"
  80. :value="item.cat_id"
  81. ></el-option>
  82. </el-select>
  83. </el-form-item>
  84. </el-form>
  85. <p class="tips">{{$t('member_authority_tips')}}</p>
  86. <div slot="footer" class="dialog-footer">
  87. <el-button @click="dialogFormVisible = false">{{$t('cancel')}}</el-button>
  88. <el-button type="primary" @click="MyFormSubmit">{{$t('confirm')}}</el-button>
  89. </div>
  90. </el-dialog>
  91. <!-- 添加团队弹窗 -->
  92. <el-dialog
  93. :visible.sync="dialogFormTeamVisible"
  94. :modal="false"
  95. top="10vh"
  96. :close-on-click-modal="false"
  97. >
  98. <el-form>
  99. <el-form-item label="选择团队">
  100. <el-select class v-model="MyForm2.team_id">
  101. <el-option
  102. v-for="team in teams "
  103. :key="team.team_name"
  104. :label="team.team_name"
  105. :value="team.id"
  106. ></el-option>
  107. </el-select>
  108. </el-form-item>
  109. <router-link to="/team/index" target="_blank">{{$t('go_to_new_an_team')}}</router-link>
  110. </el-form>
  111. <div slot="footer" class="dialog-footer">
  112. <el-button @click="dialogFormTeamVisible = false">{{$t('cancel')}}</el-button>
  113. <el-button type="primary" @click="addTeam">{{$t('confirm')}}</el-button>
  114. </div>
  115. </el-dialog>
  116. <!-- 成员权限弹窗 -->
  117. <el-dialog
  118. :visible.sync="dialogFormTeamMemberVisible"
  119. :modal="false"
  120. top="10vh"
  121. :title="$t('adjust_member_authority')"
  122. width="90%"
  123. :close-on-click-modal="false"
  124. >
  125. <el-table
  126. align="left"
  127. :empty-text="$t('team_member_empty_tips')"
  128. :data="teamItemMembers"
  129. style="width: 100%"
  130. >
  131. <el-table-column prop="member_username" :label="$t('username')"></el-table-column>
  132. <el-table-column prop="member_group_id" :label="$t('authority')" width="130">
  133. <template slot-scope="scope">
  134. <el-select
  135. size="mini"
  136. v-model="scope.row.member_group_id"
  137. @change="changeTeamItemMemberGroup($event,scope.row.id)"
  138. :placeholder="$t('please_choose')"
  139. >
  140. <el-option
  141. v-for="item in authorityOptions"
  142. :key="item.value"
  143. :label="item.label"
  144. :value="item.value"
  145. ></el-option>
  146. </el-select>
  147. </template>
  148. </el-table-column>
  149. <el-table-column prop="cat_id" :label="$t('catalog')" width="130">
  150. <template slot-scope="scope">
  151. <el-select
  152. size="mini"
  153. v-model="scope.row.cat_id"
  154. @change="changeTeamItemMemberCat($event,scope.row.id)"
  155. :placeholder="$t('please_choose')"
  156. >
  157. <el-option
  158. v-for="item in catalogs"
  159. :key="item.cat_id"
  160. :label="item.cat_name"
  161. :value="item.cat_id"
  162. ></el-option>
  163. </el-select>
  164. </template>
  165. </el-table-column>
  166. <el-table-column prop="addtime" :label="$t('add_time')"></el-table-column>
  167. </el-table>
  168. <br />
  169. <p class="tips">{{$t('team_member_authority_tips')}}</p>
  170. <div slot="footer" class="dialog-footer">
  171. <el-button @click="dialogFormTeamMemberVisible = false">{{$t('close')}}</el-button>
  172. </div>
  173. </el-dialog>
  174. </div>
  175. </template>
  176. <script>
  177. export default {
  178. name: 'Login',
  179. components: {},
  180. data() {
  181. return {
  182. MyForm: {
  183. username: '',
  184. is_readonly: false
  185. },
  186. MyForm2: {
  187. team_id: ''
  188. },
  189. members: [],
  190. dialogFormVisible: false,
  191. dialogFormTeamVisible: false,
  192. dialogFormTeamMemberVisible: false,
  193. teams: [],
  194. teamItems: [],
  195. teamItemMembers: [],
  196. authorityOptions: [
  197. {
  198. label: '编辑',
  199. value: '1'
  200. },
  201. {
  202. label: '只读',
  203. value: '0'
  204. }
  205. ],
  206. memberOptions: []
  207. }
  208. },
  209. methods: {
  210. get_members() {
  211. var that = this
  212. var url = DocConfig.server + '/api/member/getList'
  213. var params = new URLSearchParams()
  214. params.append('item_id', that.$route.params.item_id)
  215. that.axios.post(url, params).then(function(response) {
  216. if (response.data.error_code === 0) {
  217. var Info = response.data.data
  218. that.members = Info
  219. that.getAllUser()
  220. } else {
  221. that.$alert(response.data.error_message)
  222. }
  223. })
  224. },
  225. get_teams() {
  226. var that = this
  227. var url = DocConfig.server + '/api/team/getList'
  228. var params = new URLSearchParams()
  229. that.axios.post(url, params).then(function(response) {
  230. if (response.data.error_code === 0) {
  231. var Info = response.data.data
  232. that.teams = Info
  233. } else {
  234. that.$alert(response.data.error_message)
  235. }
  236. })
  237. },
  238. getTeamItem() {
  239. var that = this
  240. var url = DocConfig.server + '/api/teamItem/getList'
  241. var params = new URLSearchParams()
  242. params.append('item_id', that.$route.params.item_id)
  243. that.axios.post(url, params).then(function(response) {
  244. if (response.data.error_code === 0) {
  245. var Info = response.data.data
  246. that.teamItems = Info
  247. } else {
  248. that.$alert(response.data.error_message)
  249. }
  250. })
  251. },
  252. getTeamItemMember(team_id) {
  253. var that = this
  254. this.dialogFormTeamMemberVisible = true
  255. var url = DocConfig.server + '/api/teamItemMember/getList'
  256. var params = new URLSearchParams()
  257. params.append('item_id', that.$route.params.item_id)
  258. params.append('team_id', team_id)
  259. that.axios.post(url, params).then(function(response) {
  260. if (response.data.error_code === 0) {
  261. var Info = response.data.data
  262. that.teamItemMembers = Info
  263. } else {
  264. that.$alert(response.data.error_message)
  265. }
  266. })
  267. },
  268. MyFormSubmit() {
  269. var that = this
  270. var url = DocConfig.server + '/api/member/save'
  271. var params = new URLSearchParams()
  272. params.append('item_id', that.$route.params.item_id)
  273. params.append('username', this.MyForm.username)
  274. params.append('cat_id', this.MyForm.cat_id)
  275. var member_group_id = 1
  276. if (this.MyForm.is_readonly) {
  277. member_group_id = 0
  278. }
  279. params.append('member_group_id', member_group_id)
  280. that.axios
  281. .post(url, params)
  282. .then(function(response) {
  283. if (response.data.error_code === 0) {
  284. that.dialogFormVisible = false
  285. that.get_members()
  286. that.MyForm.username = ''
  287. that.MyForm.is_readonly = false
  288. } else {
  289. that.$alert(response.data.error_message)
  290. }
  291. })
  292. .catch(function(error) {
  293. console.log(error)
  294. })
  295. },
  296. addTeam() {
  297. var that = this
  298. var url = DocConfig.server + '/api/teamItem/save'
  299. var params = new URLSearchParams()
  300. params.append('item_id', that.$route.params.item_id)
  301. params.append('team_id', this.MyForm2.team_id)
  302. that.axios.post(url, params).then(function(response) {
  303. if (response.data.error_code === 0) {
  304. that.dialogFormTeamVisible = false
  305. that.getTeamItem()
  306. that.MyForm.team_id = ''
  307. } else {
  308. that.$alert(response.data.error_message)
  309. }
  310. })
  311. },
  312. delete_member(item_member_id) {
  313. var that = this
  314. var url = DocConfig.server + '/api/member/delete'
  315. this.$confirm(that.$t('confirm_delete'), ' ', {
  316. confirmButtonText: that.$t('confirm'),
  317. cancelButtonText: that.$t('cancel'),
  318. type: 'warning'
  319. }).then(() => {
  320. var params = new URLSearchParams()
  321. params.append('item_id', that.$route.params.item_id)
  322. params.append('item_member_id', item_member_id)
  323. that.axios.post(url, params).then(function(response) {
  324. if (response.data.error_code === 0) {
  325. that.get_members()
  326. } else {
  327. that.$alert(response.data.error_message)
  328. }
  329. })
  330. })
  331. },
  332. deleteTeam(id) {
  333. var that = this
  334. var url = DocConfig.server + '/api/teamItem/delete'
  335. this.$confirm(that.$t('confirm_delete'), ' ', {
  336. confirmButtonText: that.$t('confirm'),
  337. cancelButtonText: that.$t('cancel'),
  338. type: 'warning'
  339. }).then(() => {
  340. var params = new URLSearchParams()
  341. params.append('id', id)
  342. that.axios.post(url, params).then(function(response) {
  343. if (response.data.error_code === 0) {
  344. that.getTeamItem()
  345. } else {
  346. that.$alert(response.data.error_message)
  347. }
  348. })
  349. })
  350. },
  351. changeTeamItemMemberGroup(member_group_id, id) {
  352. var that = this
  353. var url = DocConfig.server + '/api/teamItemMember/save'
  354. var params = new URLSearchParams()
  355. params.append('member_group_id', member_group_id)
  356. params.append('id', id)
  357. that.axios.post(url, params).then(function(response) {
  358. if (response.data.error_code === 0) {
  359. that.$message(that.$t('auth_success'))
  360. } else {
  361. that.$alert(response.data.error_message)
  362. }
  363. })
  364. },
  365. getAllUser(queryString, cb) {
  366. var that = this
  367. var url = DocConfig.server + '/api/user/allUser'
  368. var params = new URLSearchParams()
  369. if (!queryString) {
  370. queryString = ''
  371. }
  372. params.append('username', queryString)
  373. that.axios.post(url, params).then(response => {
  374. if (response.data.error_code === 0) {
  375. var Info = response.data.data
  376. var newInfo = []
  377. // 过滤掉已经是成员的用户
  378. for (var i = 0; i < Info.length; i++) {
  379. let isMember = that.isMember(Info[i]['value'])
  380. if (!isMember) {
  381. newInfo.push(Info[i])
  382. }
  383. }
  384. that.memberOptions = []
  385. for (let index = 0; index < newInfo.length; index++) {
  386. that.memberOptions.push({
  387. value: newInfo[index].value,
  388. label: newInfo[index].value,
  389. key: newInfo[index].value
  390. })
  391. }
  392. cb(Info)
  393. } else {
  394. that.$alert(response.data.error_message)
  395. }
  396. })
  397. },
  398. // 判断某个用户是否已经是会员
  399. isMember(username) {
  400. let list = this.members
  401. for (var i = 0; i < list.length; i++) {
  402. if (list[i]['username'] == username) {
  403. return true
  404. }
  405. }
  406. return false
  407. },
  408. get_catalog() {
  409. var that = this
  410. var url = DocConfig.server + '/api/catalog/catListGroup'
  411. var params = new URLSearchParams()
  412. params.append('item_id', that.$route.params.item_id)
  413. that.axios.post(url, params).then(function(response) {
  414. if (response.data.error_code === 0) {
  415. var Info = response.data.data
  416. Info.unshift({
  417. cat_id: '0',
  418. cat_name: that.$t('all_cat')
  419. })
  420. that.catalogs = Info
  421. } else {
  422. that.$alert(response.data.error_message)
  423. }
  424. })
  425. },
  426. changeTeamItemMemberCat(cat_id, id) {
  427. var that = this
  428. var url = DocConfig.server + '/api/teamItemMember/save'
  429. var params = new URLSearchParams()
  430. params.append('cat_id', cat_id)
  431. params.append('id', id)
  432. that.axios.post(url, params).then(function(response) {
  433. if (response.data.error_code === 0) {
  434. that.$message(that.$t('cat_success'))
  435. } else {
  436. that.$alert(response.data.error_message)
  437. }
  438. })
  439. }
  440. },
  441. mounted() {
  442. this.get_members()
  443. this.get_teams()
  444. this.getTeamItem()
  445. this.getAllUser()
  446. this.get_catalog()
  447. }
  448. }
  449. </script>
  450. <!-- Add "scoped" attribute to limit CSS to this component only -->
  451. <style scoped>
  452. .hello {
  453. text-align: left;
  454. }
  455. .add-member {
  456. margin-left: 10px;
  457. }
  458. .tips {
  459. font-size: 12px;
  460. margin-bottom: 0px;
  461. margin-top: 0px;
  462. }
  463. </style>