userInfo.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <template>
  2. <div class="user-info-page">
  3. <custom-header name="个人信息填写" :isClose="true"></custom-header>
  4. <div class="form-content">
  5. <el-form
  6. ref="formRef"
  7. :model="formData"
  8. :rules="rules"
  9. label-position="top"
  10. class="user-form"
  11. size="large"
  12. >
  13. <el-form-item label="姓名" prop="name">
  14. <el-input v-model="formData.name" placeholder="请输入姓名" clearable />
  15. </el-form-item>
  16. <el-form-item label="手机号" prop="phone">
  17. <el-input
  18. v-model="formData.phone"
  19. placeholder="请输入手机号"
  20. clearable
  21. maxlength="11"
  22. />
  23. </el-form-item>
  24. <el-form-item label="角色类型" prop="roleType">
  25. <div class="role-type-grid">
  26. <div
  27. v-for="role in roleList"
  28. :key="role.code"
  29. class="role-btn"
  30. :class="{ active: formData.roleType.includes(role.code) }"
  31. @click="selectRole(role.code)"
  32. >
  33. {{ role.name }}
  34. </div>
  35. </div>
  36. </el-form-item>
  37. </el-form>
  38. </div>
  39. <div class="custom-bottom-fixed-btns">
  40. <div class="bottom-btn primary-btn" @click="handleConfirm">确认加入</div>
  41. </div>
  42. </div>
  43. </template>
  44. <script setup>
  45. import customHeader from "@/components/customHeader.vue";
  46. import { ref, reactive, onMounted } from "vue";
  47. import { useRouter, useRoute } from "vue-router";
  48. import { ElMessage } from "element-plus";
  49. const router = useRouter();
  50. const route = useRoute();
  51. const formRef = ref(null);
  52. // 表单数据
  53. const formData = reactive({
  54. name: "",
  55. phone: "",
  56. roleType: [],
  57. });
  58. // 角色列表
  59. const roleList = ref([]);
  60. //获取角色列表
  61. const getRoleList = async () => {
  62. const { data } = await VE_API.mine.listDutyList();
  63. if (data && data.length > 0) {
  64. roleList.value = data;
  65. // 默认选中第一个角色
  66. formData.roleType = [data[0].code];
  67. }
  68. };
  69. // 表单验证规则
  70. const rules = reactive({
  71. name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
  72. phone: [
  73. { required: true, message: "请输入手机号", trigger: "blur" },
  74. {
  75. pattern: /^1[3-9]\d{9}$/,
  76. message: "请输入正确的手机号码",
  77. trigger: ["blur", "change"],
  78. },
  79. ],
  80. roleType: [
  81. {
  82. validator: (_, value, callback) => {
  83. if (Array.isArray(value) && value.length > 0) {
  84. callback();
  85. } else {
  86. callback(new Error("请选择角色类型"));
  87. }
  88. },
  89. trigger: "change",
  90. },
  91. ],
  92. });
  93. // 选择角色(多选)
  94. const selectRole = (value) => {
  95. const idx = formData.roleType.indexOf(value);
  96. if (idx > -1) {
  97. // 已选中则取消选择
  98. formData.roleType.splice(idx, 1);
  99. } else {
  100. formData.roleType.push(value);
  101. }
  102. };
  103. const storeId = ref(null);
  104. // 确认加入
  105. const handleConfirm = () => {
  106. if (!formRef.value) return;
  107. formRef.value.validate(async (valid) => {
  108. if (valid) {
  109. const { code, msg } = await VE_API.mine.inviteManager({ ...formData, role: 3, storeId: storeId.value,miniUserId: localStorage.getItem("MINI_USER_ID")});
  110. if (code === 0) {
  111. ElMessage.success("加入成功");
  112. setTimeout(() => {
  113. router.replace('/home');
  114. }, 2000);
  115. } else {
  116. ElMessage.error(msg);
  117. }
  118. } else {
  119. // 校验失败,Element Plus 会自动显示错误信息
  120. return false;
  121. }
  122. });
  123. };
  124. onMounted(() => {
  125. getRoleList();
  126. if (route.query.miniJson) {
  127. const data = JSON.parse(route.query.miniJson);
  128. storeId.value = JSON.parse(data.paramsPage).storeId;
  129. }
  130. });
  131. </script>
  132. <style lang="scss" scoped>
  133. .user-info-page {
  134. width: 100%;
  135. min-height: 100vh;
  136. background: #f5f5f5;
  137. padding-bottom: 80px;
  138. .form-content {
  139. padding: 20px 12px;
  140. background: #fff;
  141. margin: 12px;
  142. border-radius: 12px;
  143. .user-form {
  144. ::v-deep {
  145. .el-form-item {
  146. margin-bottom: 24px;
  147. &:last-child {
  148. margin-bottom: 0;
  149. }
  150. .el-form-item__label {
  151. font-size: 14px;
  152. color: #1d2129;
  153. font-weight: 500;
  154. padding-bottom: 8px;
  155. }
  156. .el-input__wrapper {
  157. border-radius: 8px;
  158. box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15) inset;
  159. background: #fff;
  160. &:hover {
  161. box-shadow: 0 0 0 1px rgba(33, 153, 248, 0.5) inset;
  162. }
  163. &.is-focus {
  164. box-shadow: 0 0 0 1px #2199f8 inset;
  165. }
  166. .el-input__inner {
  167. color: #1d2129;
  168. font-size: 14px;
  169. &::placeholder {
  170. color: #86909c;
  171. }
  172. }
  173. }
  174. }
  175. }
  176. }
  177. .role-type-grid {
  178. display: flex;
  179. flex-wrap: wrap;
  180. gap: 10px;
  181. width: 100%;
  182. .role-btn {
  183. width: calc(50% - 10px);
  184. text-align: center;
  185. border-radius: 8px;
  186. font-size: 14px;
  187. color: #86909c;
  188. background: #fff;
  189. border: 1px solid rgba(153, 153, 153, 0.3);
  190. padding: 4px 0;
  191. &.active {
  192. background: #2199f8;
  193. color: #fff;
  194. border-color: #2199f8;
  195. }
  196. }
  197. }
  198. }
  199. }
  200. .custom-bottom-fixed-btns {
  201. .bottom-btn {
  202. width: 100%;
  203. padding: 13px 0;
  204. font-size: 16px;
  205. &.primary-btn {
  206. background: #2199f8;
  207. color: #fff;
  208. }
  209. }
  210. }
  211. </style>