member.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <template>
  2. <view class="content">
  3. <view class="title">成员管理</view>
  4. <view class="list">
  5. <uni-collapse>
  6. <uni-collapse-item
  7. v-for="member in memberList"
  8. :key="member.user_id"
  9. :title="member.User.CName"
  10. >
  11. <uni-card>
  12. <view>工号:{{ member.User.UserName }}</view>
  13. <view>联系方式:{{ member.User.Mobile }}</view>
  14. <view
  15. slot="actions"
  16. class="actions"
  17. v-if="notManager(member)"
  18. @click="deleteMember(member)"
  19. >
  20. <view>移除</view>
  21. </view>
  22. </uni-card>
  23. </uni-collapse-item>
  24. </uni-collapse>
  25. <view class="add">
  26. <uni-forms
  27. label-position="top"
  28. class="form"
  29. ref="form"
  30. :modelValue="formData"
  31. :rules="rules"
  32. >
  33. <uni-forms-item label="添加成员" name="member">
  34. <uni-data-picker
  35. ref="member"
  36. class="depSelect"
  37. :localdata="depUserTree"
  38. @change="changeMember"
  39. />
  40. </uni-forms-item>
  41. </uni-forms>
  42. <button class="button" @click="onAddMember">添加</button>
  43. </view>
  44. </view>
  45. </view>
  46. </template>
  47. <script>
  48. import { mapState } from "vuex";
  49. import { queryMember, deleteMember, addMember } from "@/services/project";
  50. export default {
  51. data() {
  52. return {
  53. memberList: [],
  54. formData: {
  55. member: "",
  56. },
  57. rules: {
  58. member: {
  59. rules: [{ required: true, errorMessage: "请选择成员" }],
  60. },
  61. },
  62. };
  63. },
  64. computed: {
  65. ...mapState(["currentProject", "depUserTree"]),
  66. },
  67. onLoad() {
  68. this.init();
  69. },
  70. methods: {
  71. async init() {
  72. let res;
  73. res = await queryMember({ project_code_id: this.currentProject.id });
  74. this.memberList = res.data;
  75. },
  76. notManager(member) {
  77. return (
  78. member.user_id != this.currentProject.author &&
  79. member.user_id != this.currentProject.LeaderId &&
  80. member.user_id != this.currentProject.wty_manager_id &&
  81. member.user_id != this.currentProject.opt_manager_id
  82. );
  83. },
  84. deleteMember(member) {
  85. uni.showModal({
  86. title: "移除成员",
  87. content: "是否确认从项目中移除该成员",
  88. confirmText: "移除",
  89. confirmColor: "#ff7875",
  90. success: async (res) => {
  91. if (res.confirm) {
  92. await deleteMember({
  93. project_code_id: this.currentProject.id,
  94. user_id: member.user_id,
  95. });
  96. uni.showToast({
  97. title: "删除成功",
  98. });
  99. setTimeout(() => {
  100. uni.hideToast();
  101. this.init();
  102. }, 1800);
  103. }
  104. },
  105. });
  106. },
  107. changeMember(e) {
  108. if (e.detail.value.length > 0)
  109. this.formData.member = e.detail.value[e.detail.value.length - 1].value;
  110. else this.formData.member = "";
  111. },
  112. onAddMember() {
  113. this.$refs.form.validate(async (err) => {
  114. if (!err) {
  115. const member_id = this.formData.member.split("-")[1];
  116. let payload = {
  117. project_code_id: this.currentProject.id,
  118. user_id: Number(member_id),
  119. };
  120. await addMember(payload);
  121. uni.showToast({
  122. title: "添加成功",
  123. });
  124. setTimeout(() => {
  125. uni.hideToast();
  126. this.init();
  127. this.$refs.member.clear();
  128. this.formData.member = "";
  129. }, 1800);
  130. }
  131. });
  132. },
  133. },
  134. };
  135. </script>
  136. <style lang="less">
  137. .content {
  138. display: flex;
  139. flex-wrap: wrap;
  140. }
  141. .title {
  142. width: 100%;
  143. padding: 0 20px 20px 20px;
  144. font: 24px bold;
  145. }
  146. .list {
  147. margin: 0 5% 20px 5%;
  148. width: 100%;
  149. display: flex;
  150. flex-wrap: wrap;
  151. justify-content: center;
  152. }
  153. .actions {
  154. font-size: 14px;
  155. border-top: 1px solid gray;
  156. padding: 4px 10px 4px 0px;
  157. display: flex;
  158. justify-content: flex-end;
  159. }
  160. .add {
  161. width: 90%;
  162. margin-top: 20px;
  163. display: flex;
  164. flex-wrap: wrap;
  165. justify-content: flex-end;
  166. }
  167. .form {
  168. width: 100%;
  169. }
  170. .depSelect {
  171. background: #fff;
  172. }
  173. .button {
  174. width: 60px;
  175. height: 40px;
  176. font-size: 14px;
  177. background: #1890ff;
  178. color: #fff;
  179. margin: 0;
  180. }
  181. ::v-deep {
  182. .uni-collapse-item__title-text {
  183. font-size: 16px;
  184. }
  185. }
  186. </style>