submit.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. <template>
  2. <CommonRoot>
  3. <FlexCol :gap="20" :padding="30">
  4. <!--注册-->
  5. <FlexCol v-if="step === 'register'">
  6. <DynamicForm
  7. ref="registerFormRef"
  8. :model="registerFormModel"
  9. :options="registerFormDefine"
  10. />
  11. <Height :height="20" />
  12. <Button block type="primary" @click="registerSubmit" :loading="registerFormLoading">提交</Button>
  13. </FlexCol>
  14. <!--认领-->
  15. <FlexCol v-else-if="step === 'add'">
  16. <Alert
  17. type="info"
  18. message="您已经是志愿者,请填写以下信息,认领当前村社"
  19. />
  20. <DynamicForm
  21. ref="addFormRef"
  22. :model="addFormModel"
  23. :options="addFormDefine"
  24. />
  25. <Height :height="20" />
  26. <Button block type="primary" @click="addSubmit" :loading="addFormLoading">提交</Button>
  27. </FlexCol>
  28. <!--注册完成-->
  29. <Result
  30. v-else-if="step === 'finished'"
  31. status="success"
  32. :title="finishedMode === 'claim' ? '认领申请已提交' : '注册志愿者成功'"
  33. :description="finishedMode === 'claim'
  34. ? '请等待管理员审核认领申请,审核通过后即可采编该村社文化资源'
  35. : '请等待管理员审核,在此期间,可以在社区中先逛逛,学习如何采编村社文化资源信息吧'"
  36. >
  37. <Height :size="20" />
  38. <Button type="primary" @click="back()">进入首页</Button>
  39. </Result>
  40. <!--错误-->
  41. <Result
  42. v-else-if="step === 'error'"
  43. status="error"
  44. title="分享链接参数有误"
  45. description="请联系管理员,或稍后重试"
  46. />
  47. <!--登录-->
  48. <FlexCol v-else center :height="400">
  49. <Icon icon="smile-filling" color="primary" :size="156" />
  50. <Height :height="20" />
  51. <Text :fontSize="26" color="primary" text="欢迎注册,加入志愿者队伍,点亮村社" />
  52. <Height :size="40" />
  53. <!-- #ifdef MP-WEIXIN -->
  54. <Button type="primary" block text="微信登录" @click="loginWechat" />
  55. <Height :size="20" />
  56. <!-- #endif -->
  57. <!-- #ifndef MP-WEIXIN -->
  58. <Result status="warning" title="提示" desc="当前环境不支持微信登录" />
  59. <!-- #endif -->
  60. </FlexCol>
  61. </FlexCol>
  62. </CommonRoot>
  63. </template>
  64. <script setup lang="ts">
  65. import Button from '@/components/basic/Button.vue';
  66. import Result from '@/components/feedback/Result.vue';
  67. import FlexCol from '@/components/layout/FlexCol.vue';
  68. import Height from '@/components/layout/space/Height.vue';
  69. import Icon from '@/components/basic/Icon.vue';
  70. import Text from '@/components/basic/Text.vue';
  71. import CommonRoot from '@/components/dialog/CommonRoot.vue';
  72. import DynamicForm from '@/components/dynamic/DynamicForm.vue';
  73. import { useAppInit } from '@/common/composeabe/AppInit';
  74. import { UserApi } from '@/api/auth/UserApi';
  75. import { useAuthStore } from '@/store/auth';
  76. import { back } from '@/components/utils/PageAction';
  77. import { closeToast, toast } from '@/components/dialog/CommonRoot';
  78. import { showError } from '@/common/composeabe/ErrorDisplay';
  79. import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
  80. import { onMounted, ref } from 'vue';
  81. import VillageApi, { VillageClaimInfo, VolunteerInfo } from '@/api/inhert/VillageApi';
  82. import type { IDynamicFormOptions, IDynamicFormRef } from '@/components/dynamic';
  83. import { waitTimeOut } from '@imengyu/imengyu-utils';
  84. import { fillClaimFromVolunteer, getClaimVillageForm } from './form/claim';
  85. import { getVolunteerForm } from './form/volunteer';
  86. import Alert from '@/components/feedback/Alert.vue';
  87. import { useUserTools } from '@/common/composeabe/UserTools';
  88. /**
  89. * 点亮村社页面
  90. */
  91. const authStore = useAuthStore();
  92. const { init } = useAppInit();
  93. const { getIsVolunteer } = useUserTools();
  94. const { querys } = useLoadQuerys({
  95. villageId: 0,
  96. regionId: 0,
  97. unit: '',
  98. });
  99. const step = ref<'register' |'add'|'finished'|'error'>('register');
  100. const finishedMode = ref<'register' | 'claim'>('register');
  101. onMounted(async () => {
  102. if (!querys.value.villageId) {
  103. step.value = 'error';
  104. return;
  105. }
  106. //如果已登录,则尝试获取志愿者信息,有注册志愿者,则显示认领当前村社表单
  107. if (authStore.isLogged) {
  108. try {
  109. const volunteerInfo = await VillageApi.getVolunteerInfo();
  110. if (volunteerInfo) {
  111. step.value = 'add';
  112. addFormDefine.value = getClaimVillageForm({ formRef: addFormRef });
  113. const model = new VillageClaimInfo();
  114. model.villageId = querys.value.villageId;
  115. fillClaimFromVolunteer(model, volunteerInfo);
  116. addFormModel.value = model;
  117. return;
  118. }
  119. } catch {
  120. }
  121. }
  122. await waitTimeOut(1000);
  123. registerFormDefine.value = getVolunteerForm({
  124. canSetCatalog: false,
  125. villageId: querys.value.villageId,
  126. onlyPassword: false,
  127. isNew: ref(true),
  128. formRef: registerFormRef,
  129. });
  130. registerFormModel.value.regionId = querys.value.regionId;
  131. registerFormModel.value.unit = querys.value.unit;
  132. });
  133. async function loginWechat() {
  134. toast({
  135. type: 'loading',
  136. content: '登录中...',
  137. })
  138. try {
  139. const res = await Promise.all([
  140. uni.login({ provider: 'weixin' }),
  141. uni.getUserProfile({ desc: '用于完善会员资料' }),
  142. ]);
  143. await authStore.loginWechart(res[0].code, res[1]);
  144. toast({
  145. type: 'success',
  146. content: '登录成功',
  147. });
  148. step.value = 'register';
  149. } catch(e) {
  150. showError(e);
  151. } finally {
  152. closeToast();
  153. }
  154. }
  155. const registerFormLoading = ref(false);
  156. const registerFormRef = ref<IDynamicFormRef>();
  157. const registerFormModel = ref<VolunteerInfo>(new VolunteerInfo());
  158. const registerFormDefine = ref<IDynamicFormOptions>();
  159. async function registerSubmit() {
  160. if (!registerFormRef.value || !registerFormModel.value)
  161. return;
  162. try {
  163. await registerFormRef.value.validate();
  164. } catch (e) {
  165. toast({ content: '有必填项未填写,请检查' });
  166. return;
  167. }
  168. try {
  169. registerFormLoading.value = true;
  170. registerFormModel.value!.villageId = querys.value.villageId;
  171. const loginRes = await VillageApi.shareAddVolunteer(registerFormModel.value as VolunteerInfo);
  172. await authStore.loginResultHandle(loginRes, UserApi.LOGIN_TYPE_USER);
  173. toast({ content: '注册成功' });
  174. finishedMode.value = 'register';
  175. step.value = 'finished';
  176. } catch (e) {
  177. showError(e);
  178. } finally {
  179. registerFormLoading.value = false;
  180. }
  181. await init();
  182. }
  183. const addFormLoading = ref(false);
  184. const addFormRef = ref<IDynamicFormRef>();
  185. const addFormModel = ref<VillageClaimInfo>(new VillageClaimInfo());
  186. const addFormDefine = ref<IDynamicFormOptions>();
  187. async function addSubmit() {
  188. if (!addFormRef.value || !addFormModel.value)
  189. return;
  190. try {
  191. await addFormRef.value.validate();
  192. } catch (e) {
  193. toast({ content: '有必填项未填写,请检查' });
  194. return;
  195. }
  196. try {
  197. addFormLoading.value = true;
  198. addFormModel.value.villageId = querys.value.villageId;
  199. await VillageApi.claimVallage(addFormModel.value as VillageClaimInfo);
  200. toast({ content: '提交成功' });
  201. finishedMode.value = 'claim';
  202. step.value = 'finished';
  203. } catch (e) {
  204. showError(e);
  205. } finally {
  206. addFormLoading.value = false;
  207. }
  208. }
  209. </script>