| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- <template>
- <CommonDialog v-model:show="show" title="加入村社" :showDivider="false" :showCloseButton="false">
- <FlexCol gap="gap.lg" padding="padding.md" width="600rpx">
-
- <template v-if="step === 'chooseType'">
- <FlexCol gap="gap.md">
- <Text text="加入村社后,您即可为村社做贡献。请完善身份信息,解锁更多村社专属功能" fontConfig="contentSpeicalText" />
- <Height :height="10" />
- <BackgroundBox
- v-for="(item, k) in typeChoices"
- :key="k"
- backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxMid.png"
- :backgroundCutBorder="32"
- :backgroundCutBorderSize="36"
- :padding="24"
- direction="row"
- >
- <Touchable direction="row" gap="gap.md"center @click="handleChooseType(item.value)">
- <Image :src="item.image" :radius="20" width="100" height="100" mode="aspectFill" />
- <Width :width="20" />
- <Text text="我是" fontConfig="lightImportantTitle" />
- <Text :text="item.label" fontConfig="lightGoldTitle" />
- </Touchable>
- </BackgroundBox>
- </FlexCol>
- </template>
- <template v-else-if="step === 'chooseIdentity'">
- <FlexCol gap="gap.md">
- <Text textAlign="center" text="请选择你的村民身份" fontConfig="contentSpeicalText" />
- <Height :height="10" />
- <BackgroundBox
- v-for="(item, k) in identityChoices"
- :key="k"
- backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxMid.png"
- :backgroundCutBorder="32"
- :backgroundCutBorderSize="36"
- :padding="24"
- direction="row"
- >
- <Touchable direction="row" gap="gap.md"center @click="handleChooseIdentity(item.value)">
- <Image :src="item.image" :radius="20" width="100" height="100" mode="aspectFill" />
- <Width :width="20" />
- <Text :text="item.label" fontConfig="lightGoldTitle" />
- </Touchable>
- </BackgroundBox>
- </FlexCol>
- </template>
- <template v-else-if="step === 'form'">
- <Text textAlign="center" text="请完善身份信息,解锁更多村社专属功能" fontConfig="contentSpeicalText" />
- <Height :height="10" />
-
- <ProvideVar :vars="{
- FieldBackgroundColor: 'transparent',
- }">
- <BackgroundBox
- backgroundImage="https://xy.wenlvti.net/app_static/images/village/BoxMid.png"
- :backgroundCutBorder="32"
- :backgroundCutBorderSize="36"
- :padding="24"
- >
- <DynamicForm
- ref="addFormRef"
- :model="addFormModel"
- :options="addFormDefine"
- />
- </BackgroundBox>
- </ProvideVar>
- <Height :height="20" />
- <FlexRow justify="space-around" gap="gap.md">
- <FrameButton text="返回" @click="step = 'chooseType'" width="220rpx" />
- <FrameButton primary text="提交" @click="addSubmit" :loading="addFormLoading" width="220rpx" />
- </FlexRow>
- </template>
- <template v-else-if="step === 'finished'">
- <Result
- status="success"
- title="提交成功"
- description="等待管理员审核,通过后即可为村社做贡献,您可以先逛逛学习吧"
- />
- <FlexRow justify="space-around" gap="gap.md">
- <FrameButton primary text="完成" @click="show = false" width="220rpx" />
- </FlexRow>
- </template>
- </FlexCol>
- </CommonDialog>
- </template>
- <script setup lang="ts">
- import { ref } from 'vue';
- import { toast } from '@/components/dialog/CommonRoot';
- import { showError } from '@/common/composeabe/ErrorDisplay';
- import VillageApi, { VillageClaimInfo } from '@/api/inhert/VillageApi';
- import CommonDialog from '@/common/components/CommonDialog.vue';
- import FrameButton from '@/common/components/FrameButton.vue';
- import Image from '@/components/basic/Image.vue';
- import Text from '@/components/basic/Text.vue';
- import DynamicForm from '@/components/dynamic/DynamicForm.vue';
- import FlexCol from '@/components/layout/FlexCol.vue';
- import FlexRow from '@/components/layout/FlexRow.vue';
- import Height from '@/components/layout/space/Height.vue';
- import BackgroundBox from '@/components/display/block/BackgroundBox.vue';
- import Touchable from '@/components/feedback/Touchable.vue';
- import type { RadioValueProps } from '@/components/dynamic/wrappers/RadioValue';
- import type { RuleItem } from 'async-validator';
- import type { FieldProps } from '@/components/form/Field.vue';
- import type { IDynamicFormOptions, IDynamicFormRef } from '@/components/dynamic';
- import Result from '@/components/feedback/Result.vue';
- import Width from '@/components/layout/space/Width.vue';
- import ProvideVar from '@/components/theme/ProvideVar.vue';
- const show = ref(false);
- const props = defineProps<{
- villageId: number;
- }>();
- const emit = defineEmits(['apply']);
- const step = ref('chooseType');
- const typeChoices = ref([
- {
- label: '志愿者',
- value: 'volunteer',
- image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeExternal.png',
- },
- {
- label: '管理人员',
- value: 'staff',
- image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeLocal.png',
- },
- {
- label: '村民',
- value: 'villager',
- image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeWork.png',
- },
- ]);
- function handleChooseType(type: string) {
- step.value = 'chooseIdentity';
- addFormModel.value.type = type;
- }
- const identityChoices = ref([
- {
- label: '在村劳作',
- value: 1,
- image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeWork.png',
- },
- {
- label: '社区居民',
- value: 2,
- image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeLocal.png',
- },
- {
- label: '在外游子',
- value: 3,
- image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeOut.png',
- },
- {
- label: '退休人员',
- value: 4,
- image: 'https://xy.wenlvti.net/app_static/images/home/volunteer/IconTypeOld.png',
- },
- ]);
- function handleChooseIdentity(identity: number) {
- step.value = 'form';
- addFormModel.value.identity = identity;
- }
- const addFormLoading = ref(false);
- const addFormRef = ref<IDynamicFormRef>();
- const addFormModel = ref<VillageClaimInfo>(new VillageClaimInfo());
- const addFormDefine : IDynamicFormOptions = {
- formAdditionaProps: {},
- formItems: [
- {
- label: '真实姓名',
- name: 'name',
- type: 'text',
- additionalProps: { placeholder: '请输入真实姓名' },
- rules: [{ required: true, message: '请输入真实姓名' }],
- },
- {
- label: '联系方式',
- name: 'mobile',
- type: 'text',
- additionalProps: { placeholder: '请输入手机号' },
- rules: [{ required: true, message: '请输入联系方式' }],
- },
- {
- label: '性别',
- name: 'sex',
- type: 'radio-value',
- defaultValue: 3,
- additionalProps: {
- options: [
- { text: '男', value: 1 },
- { text: '女', value: 2 },
- { text: '未知', value: 3 },
- ],
- } as RadioValueProps,
- },
- {
- label: '居住地址',
- name: 'address',
- type: 'text',
- additionalProps: { placeholder: '请输入居住地址(选填)' },
- },
- {
- label: '工作单位',
- name: 'unit',
- type: 'text',
- additionalProps: { placeholder: '请输入工作单位(选填)' },
- show: { callback: () => addFormModel.value.type === 'staff' },
- rules: [{
- required: true,
- message: '请输入工作单位',
- }] as RuleItem[],
- },
- {
- label: '职位',
- name: 'job',
- type: 'text',
- additionalProps: { placeholder: '请输入职位' },
- show: { callback: () => addFormModel.value.type === 'staff' },
- rules: [{
- required: true,
- message: '请输入职位',
- }] as RuleItem[],
- },
- {
- label: '申请理由',
- name: 'claimReason',
- type: 'textarea',
- additionalProps: {
- placeholder: '请说明认领该村社的原因(选填),可以加快管理员审核速度',
- showWordLimit: true,
- maxLength: 200,
- } as FieldProps,
- },
- ]
- }
- async function addSubmit() {
- if (!addFormRef.value || !addFormModel.value)
- return;
- try {
- await addFormRef.value.validate();
- } catch (e) {
- toast({ content: '有必填项未填写,请检查' });
- return;
- }
- try {
- addFormLoading.value = true;
- addFormModel.value.villageId = props.villageId;
- await VillageApi.claimVallage(addFormModel.value as VillageClaimInfo);
- toast({ content: '提交成功' });
- show.value = false;
- } catch (e) {
- showError(e);
- } finally {
- addFormLoading.value = false;
- }
- }
- defineExpose({
- show: () => {
- show.value = true;
- step.value = 'chooseType';
- addFormModel.value = new VillageClaimInfo();
- addFormModel.value.type = 'villager';
- addFormModel.value.villageId = props.villageId;
- },
- });
- </script>
|