| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 |
- import { sendSmsCode } from '@/api/auth'
- import { getAreaChildren, getServiceTypes } from '@/api/fulfiller'
- export default {
- data() {
- return {
- formData: {
- mobile: '',
- code: '',
- name: '',
- gender: 1, // 1男 2女
- birthday: '',
- password: '',
- serviceType: [],
- city: '',
- station: '',
- stationId: null
- },
- showPwd: false,
- isAgreed: false,
- serviceTypes: [],
- // 验证码倒计时
- countDown: 0,
- timer: null,
- // 日期选择器相关
- showPicker: false,
- years: [],
- months: [],
- days: [],
- pickerValue: [0, 0, 0],
- tempYear: 0,
- tempMonth: 0,
- tempDay: 0,
- // 城市选择器相关(从后端加载)
- showCityPicker: false,
- selectStep: 0,
- selectedPathway: [],
- currentList: [],
- selectedCityId: null,
- // 站点选择器相关(从后端加载)
- showStationPicker: false,
- stationList: [],
- // 协议弹窗
- showPrivacy: false,
- privacyTitle: '',
- privacyContent: ''
- }
- },
- created() {
- this.initDateData();
- this.loadServiceTypes();
- },
- beforeDestroy() {
- if (this.timer) clearInterval(this.timer);
- },
- methods: {
- initDateData() {
- const now = new Date();
- const currentYear = now.getFullYear();
- // 初始化年份 (1980 - 2030)
- for (let i = 1980; i <= currentYear + 5; i++) {
- this.years.push(i);
- }
- // 初始化月份
- for (let i = 1; i <= 12; i++) {
- this.months.push(i);
- }
- // 初始化日期 (默认31天, 实际应动态计算, 这里简化处理或在change中联动)
- for (let i = 1; i <= 31; i++) {
- this.days.push(i);
- }
- },
- // 打开选择器
- openPicker() {
- // 解析当前选中日期或默认日期
- const dateStr = this.formData.birthday || '2000-01-01';
- const [y, m, d] = dateStr.split('-').map(Number);
- // 查找索引
- const yIndex = this.years.indexOf(y);
- const mIndex = this.months.indexOf(m);
- const dIndex = this.days.indexOf(d);
- this.pickerValue = [
- yIndex > -1 ? yIndex : 0,
- mIndex > -1 ? mIndex : 0,
- dIndex > -1 ? dIndex : 0
- ];
- this.tempYear = this.years[this.pickerValue[0]];
- this.tempMonth = this.months[this.pickerValue[1]];
- this.tempDay = this.days[this.pickerValue[2]];
- this.showPicker = true;
- },
- closePicker() {
- this.showPicker = false;
- },
- onPickerChange(e) {
- const val = e.detail.value;
- this.tempYear = this.years[val[0]];
- this.tempMonth = this.months[val[1]];
- this.tempDay = this.days[val[2]];
- },
- confirmPicker() {
- // 格式化日期
- const mStr = this.tempMonth < 10 ? '0' + this.tempMonth : this.tempMonth;
- const dStr = this.tempDay < 10 ? '0' + this.tempDay : this.tempDay;
- this.formData.birthday = `${this.tempYear}-${mStr}-${dStr}`;
- this.closePicker();
- },
- async loadServiceTypes() {
- try {
- const res = await getServiceTypes();
- this.serviceTypes = (res.data || []).map(item => ({
- id: item.id,
- name: item.name
- }));
- } catch (err) {
- console.error('加载服务类型失败:', err);
- this.serviceTypes = [];
- }
- },
- toggleService(item) {
- const idx = this.formData.serviceType.indexOf(item.id);
- if (idx > -1) {
- this.formData.serviceType.splice(idx, 1);
- } else {
- this.formData.serviceType.push(item.id);
- }
- },
- // 验证码
- async getVerifyCode() {
- if (this.countDown > 0) return;
- if (!this.formData.mobile || this.formData.mobile.length !== 11) {
- uni.showToast({ title: '请输入正确的手机号', icon: 'none' });
- return;
- }
- try {
- const res = await sendSmsCode(this.formData.mobile);
- this.countDown = 60;
- this.timer = setInterval(() => {
- this.countDown--;
- if (this.countDown <= 0) clearInterval(this.timer);
- }, 1000);
- // TODO 【生产环境必须删除】开发模式自动填入验证码
- const devCode = res.data;
- if (devCode) {
- this.formData.code = devCode;
- uni.showToast({ title: '验证码: ' + devCode, icon: 'none', duration: 3000 });
- } else {
- uni.showToast({ title: '验证码已发送', icon: 'none' });
- }
- } catch (err) {
- console.error('发送验证码失败:', err);
- }
- },
- // 城市选择器 logic(从后端加载)
- async openCityPicker() {
- this.showCityPicker = true;
- if (this.selectedPathway.length === 0) {
- await this.resetCityPicker();
- }
- },
- async resetCityPicker() {
- this.selectStep = 0;
- this.selectedPathway = [];
- await this.loadAreaChildren(0);
- },
- closeCityPicker() {
- this.showCityPicker = false;
- },
- async loadAreaChildren(parentId) {
- try {
- const res = await getAreaChildren(parentId);
- // 城市选择器只显示 城市(0) 和 区域(1),不显示站点(2)
- this.currentList = (res.data || [])
- .filter(item => item.type !== 2)
- .map(item => ({
- id: item.id,
- name: item.name,
- type: item.type,
- parentId: item.parentId
- }));
- } catch (err) {
- console.error('加载区域数据失败:', err);
- this.currentList = [];
- }
- },
- async selectCityItem(item) {
- this.selectedPathway[this.selectStep] = item;
- // type: 0=城市, 1=区域
- // 城市级(0)继续加载子级区域
- if (item.type === 0) {
- this.selectStep++;
- this.selectedPathway = this.selectedPathway.slice(0, this.selectStep);
- await this.loadAreaChildren(item.id);
- // 如果已无子级区域,自动确认
- if (this.currentList.length === 0) {
- this.selectedCityId = item.id;
- this.confirmCity();
- }
- } else {
- // 区域级(1)选完即确认,站点由站点选择器单独加载
- this.selectedCityId = item.id;
- this.confirmCity();
- }
- },
- async jumpToStep(step) {
- this.selectStep = step;
- if (step === 0) {
- await this.loadAreaChildren(0);
- } else {
- const parent = this.selectedPathway[step - 1];
- if (parent) {
- await this.loadAreaChildren(parent.id);
- }
- }
- },
- confirmCity() {
- const fullPath = this.selectedPathway.map(i => i.name).join(' ');
- this.formData.city = fullPath;
- // 重置已选站点
- this.formData.station = '';
- this.formData.stationId = null;
- // 选完城市/区域后加载该区域下的站点(type=2)
- const lastSelected = this.selectedPathway[this.selectedPathway.length - 1];
- if (lastSelected) {
- this.loadStations(lastSelected.id);
- }
- this.closeCityPicker();
- },
- // 站点选择器(从后端加载,只取type=2的站点)
- async loadStations(parentId) {
- try {
- const res = await getAreaChildren(parentId);
- this.stationList = (res.data || [])
- .filter(item => item.type === 2)
- .map(item => ({
- id: item.id,
- name: item.name
- }));
- } catch (err) {
- console.error('加载站点数据失败:', err);
- this.stationList = [];
- }
- },
- openStationPicker() {
- if (this.stationList.length === 0) {
- uni.showToast({ title: '请先选择工作城市', icon: 'none' });
- return;
- }
- this.showStationPicker = true;
- },
- closeStationPicker() {
- this.showStationPicker = false;
- },
- selectStation(item) {
- this.formData.station = item.name;
- this.formData.stationId = item.id;
- this.closeStationPicker();
- },
- openPrivacy() {
- this.privacyTitle = '宠宝履约者说明';
- this.privacyContent = '1. 履约职责\n作为宠宝履约者,您需要按照平台标准完成宠物接送、喂遛或洗护服务,确保宠物安全与健康。\n\n2. 结算方式\n服务费用将根据订单类型和距离计算,定期结算至您的账户。具体结算周期请查看钱包说明。\n\n3. 行为规范\n请在这个过程中保持专业,穿着整洁,礼貌待人。严禁虐待宠物,违反者将承担法律责任。';
- this.showPrivacy = true;
- },
- goToAuth() {
- if (!this.isAgreed) {
- uni.showToast({ title: '请勾选协议', icon: 'none' });
- return;
- }
- if (!this.formData.mobile || this.formData.mobile.length !== 11) {
- uni.showToast({ title: '请输入正确的手机号', icon: 'none' });
- return;
- }
- if (!this.formData.name) {
- uni.showToast({ title: '请输入姓名', icon: 'none' });
- return;
- }
- if (this.formData.serviceType.length === 0) {
- uni.showToast({ title: '请选择服务类型', icon: 'none' });
- return;
- }
- // 暂存表单数据到本地,供后续页面组装提交
- uni.setStorageSync('recruit_form_data', JSON.stringify(this.formData));
- // 传递选中的服务类型对象(id+name)给后续页面
- const selectedServices = this.serviceTypes.filter(s => this.formData.serviceType.includes(s.id));
- const services = JSON.stringify(selectedServices);
- uni.navigateTo({
- url: `/pages/recruit/auth?services=${encodeURIComponent(services)}`
- });
- }
- }
- }
|