diff --git a/server/like-common/src/main/java/com/mdd/common/plugin/storage/engine/QiniuStorage.java b/server/like-common/src/main/java/com/mdd/common/plugin/storage/engine/QiniuStorage.java index 092052eb..f3a677d1 100644 --- a/server/like-common/src/main/java/com/mdd/common/plugin/storage/engine/QiniuStorage.java +++ b/server/like-common/src/main/java/com/mdd/common/plugin/storage/engine/QiniuStorage.java @@ -90,7 +90,6 @@ public class QiniuStorage { try { String accessKey = this.config.getOrDefault("access_key", ""); String secretKey = this.config.getOrDefault("secret_key", ""); - String bucket = this.config.getOrDefault("bucket", ""); String domain = this.config.getOrDefault("domain", ""); Auth auth = Auth.create(accessKey, secretKey); diff --git a/server/like-common/src/main/java/com/mdd/common/service/EnrollmentService.java b/server/like-common/src/main/java/com/mdd/common/service/EnrollmentService.java index b1d72bca..9035979d 100644 --- a/server/like-common/src/main/java/com/mdd/common/service/EnrollmentService.java +++ b/server/like-common/src/main/java/com/mdd/common/service/EnrollmentService.java @@ -14,8 +14,11 @@ import com.mdd.common.entity.Class; import com.mdd.common.entity.admin.Admin; import com.mdd.common.mapper.*; import com.mdd.common.mapper.admin.AdminMapper; +import com.mdd.common.util.ConfigUtils; import com.mdd.common.util.TimeUtils; import com.mdd.common.vo.student.StudentInfoListedVo; +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.collections4.map.SingletonMap; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -348,4 +351,14 @@ public class EnrollmentService { .lt("pre_registration_time", endTime) ); } + + public Map getAliyunUrl() { + Map aliyunConfig = ConfigUtils.getMap("storage", "aliyun"); + if (MapUtils.isNotEmpty(aliyunConfig)) { + String url = MapUtils.getString(aliyunConfig, "domain", ""); + return new SingletonMap<>("aliyunUrl", url); + } + + return Collections.emptyMap(); + } } diff --git a/server/like-front/src/main/java/com/mdd/front/controller/enrollment/EnrollmentController.java b/server/like-front/src/main/java/com/mdd/front/controller/enrollment/EnrollmentController.java index 895b5253..0a3be381 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/enrollment/EnrollmentController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/enrollment/EnrollmentController.java @@ -65,4 +65,10 @@ public class EnrollmentController { public AjaxResult> buildEnrollmentTrend(@RequestParam("teacherId") Integer teacherId, @RequestParam("rangeType") String rangeType) { return AjaxResult.success(enrollmentService.buildEnrollmentTrend(teacherId, rangeType)); } + + @GetMapping("/getAliyunUrl") + @ApiOperation(value = "获取阿里云的url") + public AjaxResult> getAliyunUrl() { + return AjaxResult.success(enrollmentService.getAliyunUrl()); + } } diff --git a/uniapp/src/App.vue b/uniapp/src/App.vue index 1858ce26..c90462a2 100644 --- a/uniapp/src/App.vue +++ b/uniapp/src/App.vue @@ -4,6 +4,8 @@ import { useAppStore } from './stores/app' import { useUserStore } from './stores/user' import { useThemeStore } from './stores/theme' import { useRoute, useRouter } from 'uniapp-router-next' +import { initAppConfig } from './utils/configUtils' +import { initTabBarIcons } from './utils/tabbarUtils' const appStore = useAppStore() const { getUser } = useUserStore() const { getTheme } = useThemeStore() @@ -44,10 +46,15 @@ const getConfig = async () => { onLaunch(async () => { getTheme() getConfig() + // 初始化应用配置,包括阿里云图片URL等 + await initAppConfig() //#ifdef H5 setH5WebIcon() //#endif await getUser() + + // 初始化tabbar图标 + initTabBarIcons() }) diff --git a/uniapp/src/pages/index/index.vue b/uniapp/src/pages/index/index.vue index c80237f5..020f55d8 100644 --- a/uniapp/src/pages/index/index.vue +++ b/uniapp/src/pages/index/index.vue @@ -8,7 +8,7 @@ @@ -17,7 +17,7 @@ 祝您招生顺利,业绩长虹! @@ -112,6 +112,8 @@ import { computed, reactive, ref } from 'vue' import { useAppStore } from '@/stores/app' import { useUserStore } from '@/stores/user' import { storeToRefs } from 'pinia' +import { getAliyunImageUrl } from '@/utils/imageUtils' +import { ensureStorageConfig } from '@/utils/configUtils' // #ifdef MP import MpPrivacyPopup from './component/mp-privacy-popup.vue' @@ -207,6 +209,16 @@ const goToLogin = () => { }) } +// 初始化图片源 +const schoolLogoSrc = ref(getAliyunImageUrl('static/yubaoming/school_logo.png')) +const homeImageSrc = ref(getAliyunImageUrl('static/yubaoming/home.png')) + +const initImageSources = async () => { + await ensureStorageConfig() + schoolLogoSrc.value = getAliyunImageUrl('static/yubaoming/school_logo.png') + homeImageSrc.value = getAliyunImageUrl('static/yubaoming/home.png') +} + const shareQrcode = () => { uni.switchTab({ url: '/pages/user/user' @@ -217,6 +229,7 @@ const shareQrcode = () => { } onLoad(() => { + initImageSources() getData() }) diff --git a/uniapp/src/pages/my_recruitment/my_recruitment.vue b/uniapp/src/pages/my_recruitment/my_recruitment.vue index 921cbd10..2d32b6a1 100644 --- a/uniapp/src/pages/my_recruitment/my_recruitment.vue +++ b/uniapp/src/pages/my_recruitment/my_recruitment.vue @@ -9,7 +9,7 @@ 我的招生 @@ -19,7 +19,7 @@ @@ -68,11 +68,23 @@ import { ref, shallowRef } from 'vue' import { onLoad } from '@dcloudio/uni-app' import { getPreRegistrationList } from '@/api/app' +import { getAliyunImageUrl } from '@/utils/imageUtils' +import { ensureStorageConfig } from '@/utils/configUtils' const list = ref([]) const paging = shallowRef() -const queryList = async (pageNo, pageSize) => { +// 初始化图片源 +const recruitmentBgImageSrc = ref(getAliyunImageUrl('static/yubaoming/recruitment_3.png')) +const studentImageSrc = ref(getAliyunImageUrl('static/yubaoming/student.png')) + +const initImageSources = async () => { + await ensureStorageConfig() + recruitmentBgImageSrc.value = getAliyunImageUrl('static/yubaoming/recruitment_3.png') + studentImageSrc.value = getAliyunImageUrl('static/yubaoming/student.png') +} + +const queryList = async (pageNo: number, pageSize: number) => { console.log('=== queryList 开始执行 ===', pageNo, pageSize) try { const params = { @@ -101,6 +113,7 @@ const goBack = () => { } onLoad(() => { + initImageSources() queryList(1, 10) }) diff --git a/uniapp/src/pages/news_detail/news_detail.vue b/uniapp/src/pages/news_detail/news_detail.vue index 1afc3519..bcaa7b8d 100644 --- a/uniapp/src/pages/news_detail/news_detail.vue +++ b/uniapp/src/pages/news_detail/news_detail.vue @@ -13,7 +13,7 @@ {{ newsData.create_time }} {{ newsData.click }} @@ -48,9 +48,11 @@ import { ref } from 'vue' import { onLoad } from '@dcloudio/uni-app' import { getArticleDetail, addCollect, cancelCollect } from '@/api/news' +import { getAliyunImageUrl } from '@/utils/imageUtils' const newsData = ref({}) let newsId = '' +const visitIconSrc = getAliyunImageUrl('static/images/icon/icon_visit.png') const getData = async (id) => { newsData.value = await getArticleDetail({ id }) diff --git a/uniapp/src/pages/payment_result/payment_result.vue b/uniapp/src/pages/payment_result/payment_result.vue index f4df222c..d443b9c6 100644 --- a/uniapp/src/pages/payment_result/payment_result.vue +++ b/uniapp/src/pages/payment_result/payment_result.vue @@ -86,17 +86,18 @@ import { PageStatusEnum } from '@/enums/appEnums' import { onLoad } from '@dcloudio/uni-app' import { computed, reactive, ref } from 'vue' import { useRouter } from 'uniapp-router-next' +import { getAliyunImageUrl } from '@/utils/imageUtils' const router = useRouter() const mapStatus = { succeed: { text: '支付成功', - image: '/static/images/payment/icon_succeed.png' + image: getAliyunImageUrl('static/images/payment/icon_succeed.png') }, waiting: { text: '等待支付', - image: '/static/images/payment/icon_waiting.png' + image: getAliyunImageUrl('static/images/payment/icon_waiting.png') } } const status = ref(PageStatusEnum['LOADING']) diff --git a/uniapp/src/pages/pre_registration/pre_registration.vue b/uniapp/src/pages/pre_registration/pre_registration.vue index c005842c..f8042c9d 100644 --- a/uniapp/src/pages/pre_registration/pre_registration.vue +++ b/uniapp/src/pages/pre_registration/pre_registration.vue @@ -232,9 +232,9 @@ const submitBtnStyle = { boxShadow: '0 8rpx 24rpx rgba(59, 130, 246, 0.3)' } -const getTeacherData = async (params: { teacherId?: string; invitationCode?: string }) => { +const getTeacherData = async (teacherId: string) => { try { - const res = await getTeacherInfo(params) + const res = await getTeacherInfo({ teacherId: Number(teacherId) }) if (res.code === 1 && res.data) { formData.teacher = res.data.teacherName formData.recruitmentTeacherId = res.data.teacherId @@ -344,7 +344,7 @@ const validateForm = () => { const submit = async () => { console.log('========== 开始提交 ==========') console.log('当前表单数据:', JSON.parse(JSON.stringify(formData))) - + if (!validateForm()) { console.log('表单验证失败') return @@ -430,16 +430,8 @@ onMounted(() => { }) onLoad((options: any) => { - if (options.scene) { - getTeacherData({ invitationCode: decodeURIComponent(options.scene) }) - return - } - if (options.invitationCode) { - getTeacherData({ invitationCode: options.invitationCode }) - return - } if (options.teacherId) { - getTeacherData({ teacherId: options.teacherId }) + getTeacherData(options.teacherId) } }) diff --git a/uniapp/src/pages/user/user.vue b/uniapp/src/pages/user/user.vue index f1c8230d..22be7c9e 100644 --- a/uniapp/src/pages/user/user.vue +++ b/uniapp/src/pages/user/user.vue @@ -3,7 +3,7 @@ @@ -98,7 +98,7 @@ @@ -106,7 +106,7 @@ @@ -114,7 +114,7 @@ @@ -122,7 +122,7 @@ @@ -137,7 +137,7 @@ @@ -148,7 +148,7 @@ @@ -209,6 +209,8 @@ import { computed, reactive, ref } from 'vue' import { getEnrollmentStatistical, getTeacherQrcodeImage, getTeacherInfo } from '@/api/app' import { TOKEN_KEY } from '@/enums/constantEnums' import cache from '@/utils/cache' +import { getAliyunImageUrl, loadImageWithFallback } from '@/utils/imageUtils' +import { ensureStorageConfig } from '@/utils/configUtils' const qrcodeUrl = ref('') const showQrcodeModal = ref(false) @@ -230,6 +232,14 @@ const btnStyle = { const userStore = useUserStore() const { userInfo, isLogin } = storeToRefs(userStore) +// 初始化图片源 +const bannerImageSrc = ref(getAliyunImageUrl('static/yubaoming/top_banner.png')) + +const initImageSources = async () => { + await ensureStorageConfig() + bannerImageSrc.value = getAliyunImageUrl('static/yubaoming/top_banner.png') +} + // 计算进度百分比 const progressPercent = computed(() => { const target = 50 @@ -437,6 +447,7 @@ const logout = () => { } onShow(async () => { + await initImageSources() console.log('=== onShow 开始执行 ===') console.log('初始登录状态:', isLogin.value) console.log('缓存中的token:', cache.get(TOKEN_KEY)) diff --git a/uniapp/src/static/yubaoming/banner.jpg b/uniapp/src/static/yubaoming/banner.jpg deleted file mode 100644 index 73969452..00000000 Binary files a/uniapp/src/static/yubaoming/banner.jpg and /dev/null differ diff --git a/uniapp/src/static/yubaoming/home.png b/uniapp/src/static/yubaoming/home.png deleted file mode 100644 index 894d4916..00000000 Binary files a/uniapp/src/static/yubaoming/home.png and /dev/null differ diff --git a/uniapp/src/static/yubaoming/recruitment_3.png b/uniapp/src/static/yubaoming/recruitment_3.png deleted file mode 100644 index eb9395ca..00000000 Binary files a/uniapp/src/static/yubaoming/recruitment_3.png and /dev/null differ diff --git a/uniapp/src/static/yubaoming/student.png b/uniapp/src/static/yubaoming/student.png deleted file mode 100644 index e0eff6f4..00000000 Binary files a/uniapp/src/static/yubaoming/student.png and /dev/null differ diff --git a/uniapp/src/utils/configUtils.ts b/uniapp/src/utils/configUtils.ts new file mode 100644 index 00000000..b5a22682 --- /dev/null +++ b/uniapp/src/utils/configUtils.ts @@ -0,0 +1,97 @@ +/** + * 全局配置工具类 + * 用于处理应用配置,包括阿里云图片URL等 + */ + +import { getAliyunImageUrl } from './imageUtils' +import { getAliyunUrl } from '@/api/app' + +function getDefaultStorageConfig() { + return { + aliyunBaseUrl: '' + } +} + +async function fetchAndCacheStorageConfig() { + const configResponse = await getAliyunUrl() + // 兼容两种返回: + // 1) 拦截器已解包:{ aliyunUrl: '...' } + // 2) 未解包原始结构:{ code: 1, data: { aliyunUrl: '...' } } + const serverConfig = + configResponse && typeof configResponse === 'object' && 'aliyunUrl' in configResponse + ? configResponse + : configResponse?.code === 1 + ? configResponse.data || {} + : {} + + const storageConfig = { + aliyunBaseUrl: (serverConfig as any).aliyunUrl || '' + } + uni.setStorageSync('storageConfig', storageConfig) + return storageConfig +} + +/** + * 初始化应用配置 + * 从服务器获取配置信息并缓存 + */ +export async function initAppConfig() { + try { + const config = await fetchAndCacheStorageConfig() + console.log('应用配置初始化成功', config) + } catch (error) { + console.error('应用配置初始化失败:', error) + uni.setStorageSync('storageConfig', getDefaultStorageConfig()) + } +} + +/** + * 确保阿里云配置可用;若本地无配置则主动请求一次 + */ +export async function ensureStorageConfig() { + const config = uni.getStorageSync('storageConfig') || {} + if (config.aliyunBaseUrl) { + return config + } + try { + return await fetchAndCacheStorageConfig() + } catch (error) { + console.error('确保存储配置失败:', error) + const defaultConfig = getDefaultStorageConfig() + uni.setStorageSync('storageConfig', defaultConfig) + return defaultConfig + } +} + +/** + * 获取tabbar图标路径 + * @param iconType 图标类型 ('home' | 'user') + * @param isActive 是否为选中状态 + * @returns 图标的路径 + */ +export function getTabBarIconPath(iconType: 'home' | 'user', isActive: boolean = false): string { + // 从配置中获取阿里云基础URL + const config = uni.getStorageSync('storageConfig') || {} + const baseUrl = config.aliyunBaseUrl || '' + + // 定义本地路径映射 + const localPaths = { + home: { + normal: 'static/images/tabbar/home.png', + active: 'static/yubaoming/home_icon_active.png' + }, + user: { + normal: 'static/images/tabbar/user.png', + active: 'static/yubaoming/my_icon_active.png' + } + } + + // 如果配置了阿里云基础URL,则使用阿里云路径 + if (baseUrl) { + const imagePath = isActive ? localPaths[iconType].active : localPaths[iconType].normal + return getAliyunImageUrl(imagePath) + } + + // 否则返回本地路径 + return isActive ? localPaths[iconType].active : localPaths[iconType].normal +} diff --git a/uniapp/src/utils/imageUtils.ts b/uniapp/src/utils/imageUtils.ts new file mode 100644 index 00000000..8afd75be --- /dev/null +++ b/uniapp/src/utils/imageUtils.ts @@ -0,0 +1,72 @@ +/** + * 图片处理工具类 + * 用于统一处理从阿里云或其他存储服务获取图片的逻辑 + */ + +import request from '@/utils/request' + +/** + * 获取阿里云存储的图片URL + * @param imageKey 图片在阿里云上的key + * @returns 图片的完整URL + */ +export function getAliyunImageUrl(imageKey: string): string { + // 从配置中获取阿里云基础URL,如果配置不存在则返回原路径 + const config = uni.getStorageSync('storageConfig') || {} + const baseUrl = config.aliyunBaseUrl || config.baseUrl || '' + + if (baseUrl && imageKey) { + // 确保URL格式正确 + const normalizedBaseUrl = baseUrl.endsWith('/') ? baseUrl : baseUrl + '/' + return normalizedBaseUrl + imageKey + } + + // 如果没有配置,则返回原始图片路径(本地路径) + return imageKey +} + +/** + * 通过API获取图片URL + * @param teacherId 教师ID + * @returns 二维码图片的URL + */ +export async function getTeacherQrCodeUrl(teacherId: number): Promise { + try { + const response = await request.get( + { url: `frontapi/teacher/qrcode?id=${teacherId}` }, + { urlPrefix: '', isTransformResponse: false } + ) + + if (response && response.code === 1 && response.data) { + return response.data + } + + console.error('获取教师二维码URL失败:', response) + return '' + } catch (error) { + console.error('获取教师二维码URL异常:', error) + return '' + } +} + +/** + * 通用图片加载错误处理 + * 当阿里云图片加载失败时,回退到本地图片 + * @param imageUrl 阿里云图片URL + * @param localImagePath 本地图片路径 + * @returns Promise 确定使用的图片路径 + */ +export async function loadImageWithFallback( + imageUrl: string, + localImagePath: string +): Promise { + if (!imageUrl) return localImagePath + + return new Promise((resolve) => { + // 尝试加载网络图片 + const image = new Image() + image.onload = () => resolve(imageUrl) + image.onerror = () => resolve(localImagePath) + image.src = imageUrl + }) +} diff --git a/uniapp/src/utils/tabbarUtils.ts b/uniapp/src/utils/tabbarUtils.ts new file mode 100644 index 00000000..d389af7b --- /dev/null +++ b/uniapp/src/utils/tabbarUtils.ts @@ -0,0 +1,59 @@ +/** + * TabBar工具类 + * 用于动态更新tabbar图标 + */ + +import { getTabBarIconPath } from './configUtils' +import { ensureStorageConfig } from './configUtils' + +/** + * 动态设置tabbar图标 + * @param index tabbar索引 + * @param iconType 图标类型 + * @param isActive 是否为选中状态 + */ +export function setTabBarIcon(index: number, iconType: 'home' | 'user', isActive: boolean = false) { + try { + // 获取阿里云图标路径 + const iconPath = getTabBarIconPath(iconType, isActive) + + // 设置tabbar图标 + if (isActive) { + uni.setTabBarItem({ + index, + selectedIconPath: iconPath + }) + } else { + uni.setTabBarItem({ + index, + iconPath + }) + } + } catch (error) { + console.error(`设置tabbar图标失败:`, error) + } +} + +/** + * 更新所有tabbar图标 + */ +export function updateAllTabBarIcons() { + // 更新首页tabbar图标 (索引0) + setTabBarIcon(0, 'home', false) + setTabBarIcon(0, 'home', true) + + // 更新个人中心tabbar图标 (索引1) + setTabBarIcon(1, 'user', false) + setTabBarIcon(1, 'user', true) +} + +/** + * 初始化tabbar图标 + */ +export function initTabBarIcons() { + // 延迟执行,确保配置已加载 + setTimeout(async () => { + await ensureStorageConfig() + updateAllTabBarIcons() + }, 1000) +}