hookehuyr

feat(organization): 添加组织相关API并实现助力功能

实现组织搜索、查询已助力和助力功能API
替换原家庭相关接口为组织接口
移除mock数据,使用真实API调用
添加错误处理和状态管理
/*
* @Date: 2025-09-18 17:42:18
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-09-18 17:46:03
* @FilePath: /lls_program/src/api/organization.js
* @Description: 文件描述
*/
import { fn, fetch } from './fn';
const Api = {
SEARCH_INSTITUTION: '/srv/?a=institution&t=search_by_passphrase',
GET_SUPPORTED_INSTITUTION: '/srv/?a=institution&t=get_supported',
SUPPORT_INSTITUTION: '/srv/?a=institution&t=support',
}
/**
* @description: 根据助力码搜索单位
* @param {*} params
* @param {string} params.passphrase - 助力码
* @returns {Object} response - 响应对象
* @returns {string} response.code - 响应状态码
* @returns {string} response.msg - 响应消息
* @returns {Object} response.data - 响应数据
* @returns {number} response.data.id - 单位ID
* @returns {string} response.data.name - 单位名称
* @returns {string} response.data.avatar_url - 单位头像
*/
export const searchInstitutionAPI = (params) => fn(fetch.get(Api.SEARCH_INSTITUTION, params));
/**
* @description: 查询我助力的单位
* @param {*} params
* @returns {Object} response - 响应对象
* @returns {string} response.code - 响应状态码
* @returns {string} response.msg - 响应消息
* @returns {Object} response.data - 响应数据
* @returns {number} response.data.id - 单位ID
* @returns {string} response.data.name - 单位名称
* @returns {string} response.data.avatar_url - 单位头像
*/
export const getSupportedInstitutionAPI = (params) => fn(fetch.get(Api.GET_SUPPORTED_INSTITUTION, params));
/**
* @description: 助力单位
* @param {*} params
* @param {number} params.family_id - 家庭ID
* @returns {Object} response - 响应对象
* @returns {string} response.code - 响应状态码
* @returns {string} response.msg - 响应消息
* @returns {Object} response.data - 响应数据
*/
export const supportInstitutionAPI = (params) => fn(fetch.post(Api.SUPPORT_INSTITUTION, params));
......@@ -91,7 +91,7 @@ import { ref, computed, nextTick, onMounted, watch } from 'vue';
import Taro from '@tarojs/taro';
import { My, Check, IconFont } from '@nutui/icons-vue-taro';
// 获取接口信息
import { searchFamilyByPassphraseAPI, joinFamilyAPI } from '@/api/family';
import { searchInstitutionAPI, getSupportedInstitutionAPI, supportInstitutionAPI } from '@/api/organization';
// 导入主题颜色
import { THEME_COLORS } from '@/utils/config';
// 默认幼儿园Logo
......@@ -105,75 +105,84 @@ const focusedIndex = ref(-1);
const matchedKindergarten = ref(null);
const isAlreadyJoined = ref(false);
// Mock 幼儿园数据
const mockKindergartenData = {
'1234': {
id: 1,
name: '阳光幼儿园',
address: '北京市朝阳区阳光街123号',
logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg'
},
'5678': {
id: 2,
name: '彩虹幼儿园',
address: '北京市海淀区彩虹路456号',
logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg'
}
};
// Mock 已参与助力榜的数据(模拟用户已经参与的幼儿园)
const mockJoinedKindergarten = {
id: 1,
name: '阳光幼儿园',
address: '北京市朝阳区阳光街123号',
logo: 'https://cdn.ipadbiz.cn/mlaj/images/icon_1.jpeg'
};
// 页面加载时检查是否已参与助力榜
onMounted(() => {
checkExistingJoinStatus();
});
// 检查现有参与状态
const checkExistingJoinStatus = () => {
// 模拟检查用户是否已经参与助力榜
// 实际应该调用API检查
const hasJoined = true; // 模拟已参与状态
if (hasJoined && mockJoinedKindergarten) {
matchedKindergarten.value = mockJoinedKindergarten;
isAlreadyJoined.value = true;
// 清空输入框,因为已经参与了
mottoChars.value = ['', '', '', ''];
/**
* 检查现有参与状态
*/
const checkExistingJoinStatus = async () => {
try {
const response = await getSupportedInstitutionAPI();
if (response.code && response.data) {
// 用户已经助力了某个单位
matchedKindergarten.value = {
id: response.data.id,
name: response.data.name,
address: '', // API返回中没有地址字段,使用空字符串
logo: response.data.avatar_url
};
isAlreadyJoined.value = true;
// 清空输入框,因为已经参与了
mottoChars.value = ['', '', '', ''];
} else {
// 用户还没有助力任何单位
matchedKindergarten.value = null;
isAlreadyJoined.value = false;
}
} catch (error) {
console.error('检查助力状态失败:', error);
// 出错时重置状态
matchedKindergarten.value = null;
isAlreadyJoined.value = false;
}
};
// 检查并匹配幼儿园
const checkAndMatchKindergarten = () => {
/**
* 检查并匹配单位
*/
const checkAndMatchKindergarten = async () => {
const motto = mottoChars.value.join('');
if (motto.length === 4) {
// 输入完成,查找匹配的幼儿园
const kindergarten = mockKindergartenData[motto];
if (kindergarten) {
// 检查是否要更换幼儿园
if (isAlreadyJoined.value && matchedKindergarten.value && kindergarten.id !== matchedKindergarten.value.id) {
// 用户要更换幼儿园,显示确认提示
showChangeConfirmation(kindergarten);
return;
}
try {
// 调用API搜索单位
const response = await searchInstitutionAPI({ passphrase: motto });
if (response.code && response.data) {
const institution = {
id: response.data.id,
name: response.data.name,
address: '', // API返回中没有地址字段,使用空字符串
logo: response.data.avatar_url
};
// 检查是否要更换单位
if (isAlreadyJoined.value && matchedKindergarten.value && institution.id !== matchedKindergarten.value.id) {
// 用户要更换单位,显示确认提示
showChangeConfirmation(institution);
return;
}
matchedKindergarten.value = kindergarten;
// 如果之前已经参与,保持已参与状态;否则设为未参与
if (!isAlreadyJoined.value) {
matchedKindergarten.value = institution;
// 如果之前已经参与,保持已参与状态;否则设为未参与
if (!isAlreadyJoined.value) {
isAlreadyJoined.value = false;
}
} else {
// 没有找到匹配的单位
matchedKindergarten.value = null;
isAlreadyJoined.value = false;
}
} else {
} catch (error) {
console.error('搜索单位失败:', error);
matchedKindergarten.value = null;
isAlreadyJoined.value = false;
}
} else {
// 输入未完成,如果之前已参与,保持显示已参与的幼儿园
// 输入未完成,如果之前已参与,保持显示已参与的单位
if (!isAlreadyJoined.value) {
matchedKindergarten.value = null;
}
......@@ -254,57 +263,50 @@ const handleBlur = (index) => {
const isComplete = computed(() => {
return mottoChars.value.every((char) => char) && matchedKindergarten.value;
});
const handleConfirmJoin = async () => {
if (!isComplete.value) return;
// 如果已经参与助力榜,检查是否是更换操作
if (isAlreadyJoined.value) {
// 检查当前匹配的幼儿园是否与之前参与的不同
const currentMotto = mottoChars.value.join('');
const currentKindergarten = mockKindergartenData[currentMotto];
if (currentKindergarten && mockJoinedKindergarten && currentKindergarten.id === mockJoinedKindergarten.id) {
// 相同的幼儿园,提示已参与
Taro.showToast({
title: '您已经参与该助力榜',
icon: 'none'
});
return;
}
}
/**
* 处理确认加入
*/
const handleConfirmJoin = async () => {
if (!matchedKindergarten.value) return;
try {
// 这里应该调用加入助力榜的API
// 暂时使用模拟逻辑
console.log('加入助力榜:', {
kindergarten: matchedKindergarten.value,
motto: mottoChars.value.join('')
// 调用助力API
const response = await supportInstitutionAPI({
family_id: matchedKindergarten.value.id
});
// 模拟API调用成功
isAlreadyJoined.value = true;
// 更新已参与的幼儿园信息
mockJoinedKindergarten.id = matchedKindergarten.value.id;
mockJoinedKindergarten.name = matchedKindergarten.value.name;
mockJoinedKindergarten.address = matchedKindergarten.value.address;
mockJoinedKindergarten.logo = matchedKindergarten.value.logo;
if (response.code) {
// 助力成功
isAlreadyJoined.value = true;
Taro.showToast({
title: '加入成功',
icon: 'success'
});
// 显示成功提示
Taro.showToast({
title: '助力成功!',
icon: 'success',
duration: 2000
});
setTimeout(() => {
// 返回上一页
Taro.navigateBack({
delta: 1
// 延迟跳转到排行榜页面
setTimeout(() => {
Taro.navigateBack({
delta: 1
});
}, 2000);
} else {
// 助力失败
Taro.showToast({
title: response.message || '助力失败,请重试',
icon: 'none',
duration: 2000
});
}, 1500);
}
} catch (error) {
console.error('加入助力榜失败:', error);
console.error('助力操作失败:', error);
Taro.showToast({
title: '加入失败,请重试',
icon: 'none'
title: '网络错误,请重试',
icon: 'none',
duration: 2000
});
}
};
......