member.vue 4.7 KB

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