From 04756d85147a249adf8f2b9cdf9b1a52c3f9b954 Mon Sep 17 00:00:00 2001
From: zjk <852185829@qq.com>
Date: 星期三, 14 十月 2026 10:01:41 +0800
Subject: [PATCH] feat(contact): 新增联系我们页动态获取联系方式功能
---
doc/design/用户端_首页与导航_20261012.md | 2
hugray-server/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ContactInfoVo.java | 42 ++++++++++++++
hugray-user-miniapp/pages/contact/index.vue | 45 +++++++++++++--
hugray-server/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysContactInfoController.java | 52 +++++++++++++++++
hugray-user-miniapp/api/index.js | 10 +++
5 files changed, 144 insertions(+), 7 deletions(-)
diff --git "a/doc/design/\347\224\250\346\210\267\347\253\257_\351\246\226\351\241\265\344\270\216\345\257\274\350\210\252_20261012.md" "b/doc/design/\347\224\250\346\210\267\347\253\257_\351\246\226\351\241\265\344\270\216\345\257\274\350\210\252_20261012.md"
index 9827380..f770a86 100644
--- "a/doc/design/\347\224\250\346\210\267\347\253\257_\351\246\226\351\241\265\344\270\216\345\257\274\350\210\252_20261012.md"
+++ "b/doc/design/\347\224\250\346\210\267\347\253\257_\351\246\226\351\241\265\344\270\216\345\257\274\350\210\252_20261012.md"
@@ -317,7 +317,7 @@
| 联系方式列表 | x20,列表项纵向间距 44 | `.info-list`(`padding: 140rpx 40rpx 0`) |
| 单行信息 | 标签列宽 110pt,右侧数值 | `.info-label` 16pt 600 `#1F2937`;`.info-value` 15pt `#6B7280`;固定标签列宽保证各行数值纵向对齐 |
| 平台客服按钮 | h30 R15,**pen 标准「微信按钮 WeChat」** 渐变(90°)`#07C160→#05A352` + 投影 `#07C16040` | `<button open-type="contact">`(微信客服会话)+ 内嵌 `/static/wechat-icon.png` + 白字 13pt 600;`::after { border: none }` 重置小程序默认边框 |
-| 热线文案 | `城市招商热线` / `合伙人招募` 均 `400-451-666` | 客服接口未就绪,先以文件内常量 `CITY_INVEST_HOTLINE` / `PARTNER_RECRUIT_HOTLINE` 维护,接口就绪后替换 |
+| 热线文案 | `城市招商热线` / `合伙人招募` 取自平台设置 | 进入页面调 `getContactInfo()`(`GET /miniapp/system/contact-info`)回填 `cityHotline` / `partnerRecruit`;后端未配置或请求失败时回退文件内常量 `CITY_INVEST_HOTLINE` / `PARTNER_RECRUIT_HOTLINE`(`400-451-666`)。未登录(无 token)时跳过请求直接用兜底常量,避免在公开页触发 401 跳登录 |
| 返回行为 | `uni.navigateBack()` | 无上级页面(如直接进入)时兜底 `uni.switchTab('/pages/profile/index')` |
### 9.7 选择地址页(`pages/address/list.vue`)
diff --git a/hugray-server/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysContactInfoController.java b/hugray-server/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysContactInfoController.java
new file mode 100644
index 0000000..541a8dc
--- /dev/null
+++ b/hugray-server/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysContactInfoController.java
@@ -0,0 +1,52 @@
+package com.ruoyi.system.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.domain.SysPlatformSetting;
+import com.ruoyi.system.domain.vo.ContactInfoVo;
+import com.ruoyi.system.service.ISysPlatformSettingService;
+
+/**
+ * C端「联系我们」联系方式 查询接口
+ *
+ * 数据源自平台设置单行表 sys_platform_setting(由管理后台「平台设置」维护),
+ * 此处只读暴露其中的联系方式(招商热线 / 合伙人招募)供小程序「联系我们」页回填。
+ *
+ * 网关路由 /miniapp/system/** 经 StripPrefix=2 剥掉前两段后转发到本服务,
+ * 故外部实际路径为 /miniapp/system/contact-info;与后台 /system/platform 不冲突。
+ *
+ * 未配置权限注解:这是 C 端只读接口,由网关统一鉴权,不走后台菜单权限体系。
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/contact-info")
+public class SysContactInfoController
+{
+ @Autowired
+ private ISysPlatformSettingService platformSettingService;
+
+ /**
+ * 查询联系方式(招商热线 / 合伙人招募)
+ *
+ * 平台设置从未保存过时(表无行)返回两个字段均为 null 的对象,
+ * 由小程序端回退到默认文案,不做 500 处理。
+ *
+ * @return 联系方式(cityHotline / partnerRecruit)
+ */
+ @GetMapping
+ public R<ContactInfoVo> getContactInfo()
+ {
+ ContactInfoVo vo = new ContactInfoVo();
+ SysPlatformSetting setting = platformSettingService.selectPlatformSetting();
+ if (setting != null)
+ {
+ vo.setCityHotline(setting.getCityHotline());
+ vo.setPartnerRecruit(setting.getPartnerRecruit());
+ }
+ return R.ok(vo);
+ }
+}
diff --git a/hugray-server/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ContactInfoVo.java b/hugray-server/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ContactInfoVo.java
new file mode 100644
index 0000000..312b339
--- /dev/null
+++ b/hugray-server/ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/ContactInfoVo.java
@@ -0,0 +1,42 @@
+package com.ruoyi.system.domain.vo;
+
+import java.io.Serializable;
+
+/**
+ * C端「联系我们」联系方式 出参
+ *
+ * 只暴露联系方式两项,不返回平台设置中的其它内部参数(如订单取消时长、售后天数等),
+ * 避免把仅后端使用的配置泄露给小程序端。
+ *
+ * @author ruoyi
+ */
+public class ContactInfoVo implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 城市招商热线(取自平台设置 city_hotline;未配置为 null) */
+ private String cityHotline;
+
+ /** 合伙人招募(取自平台设置 partner_recruit;未配置为 null) */
+ private String partnerRecruit;
+
+ public String getCityHotline()
+ {
+ return cityHotline;
+ }
+
+ public void setCityHotline(String cityHotline)
+ {
+ this.cityHotline = cityHotline;
+ }
+
+ public String getPartnerRecruit()
+ {
+ return partnerRecruit;
+ }
+
+ public void setPartnerRecruit(String partnerRecruit)
+ {
+ this.partnerRecruit = partnerRecruit;
+ }
+}
diff --git a/hugray-user-miniapp/api/index.js b/hugray-user-miniapp/api/index.js
index 3f4851e..8683ba6 100644
--- a/hugray-user-miniapp/api/index.js
+++ b/hugray-user-miniapp/api/index.js
@@ -241,6 +241,16 @@
return del('/miniapp/account/user/addresses/' + id)
}
+// ======================== 系统信息 ========================
+
+/**
+ * 查询联系方式(「联系我们」页回填用)
+ * 返回 data 含 { cityHotline, partnerRecruit },未配置时对应字段为 null
+ */
+export function getContactInfo() {
+ return get('/miniapp/system/contact-info')
+}
+
// ======================== 订单相关 ========================
/**
diff --git a/hugray-user-miniapp/pages/contact/index.vue b/hugray-user-miniapp/pages/contact/index.vue
index 65f0bfa..600d865 100644
--- a/hugray-user-miniapp/pages/contact/index.vue
+++ b/hugray-user-miniapp/pages/contact/index.vue
@@ -18,7 +18,7 @@
<!-- 联系方式列表:热线为纯展示文案,平台客服为绿色胶囊按钮 -->
<view class="info-list">
- <view v-for="item in CONTACT_LIST" :key="item.key" class="info-row">
+ <view v-for="item in contactList" :key="item.key" class="info-row">
<text class="info-label">{{ item.label }}</text>
<!-- 有 value 渲染文案,否则渲染「联系客服」按钮 -->
<text v-if="item.value" class="info-value">{{ item.value }}</text>
@@ -32,19 +32,52 @@
</template>
<script setup>
+import { ref } from 'vue'
+import { onLoad } from '@dcloudio/uni-app'
+import { getToken } from '@/utils/request.js'
+import { getContactInfo } from '@/api/index.js'
+
/** 状态栏高度:自定义导航栏下用于顶部留白 */
const statusBarHeight = uni.getSystemInfoSync().statusBarHeight || 0
-/** 招商 / 合伙人热线:客服接口未就绪,先以常量维护(接口就绪后替换) */
-const CITY_INVEST_HOTLINE = '400-451-666'
-const PARTNER_RECRUIT_HOTLINE = '400-451-666'
+/** 招商 / 合伙人热线兜底文案:后端未配置或请求失败时使用 */
+const CITY_INVEST_HOTLINE = '-'
+const PARTNER_RECRUIT_HOTLINE = '-'
/** 联系方式列表:value 为空表示该项渲染为客服按钮 */
-const CONTACT_LIST = [
+const contactList = ref([
{ key: 'invest', label: '城市招商热线', value: CITY_INVEST_HOTLINE },
{ key: 'partner', label: '合伙人招募', value: PARTNER_RECRUIT_HOTLINE },
{ key: 'service', label: '平台客服' }
-]
+])
+
+/** 单项回填:后端有值才覆盖,为空则保留兜底文案 */
+const applyHotline = (key, value) => {
+ if (!value) return
+ const item = contactList.value.find((it) => it.key === key)
+ if (item) item.value = value
+}
+
+/**
+ * 拉取平台联系方式并回填
+ * 未登录(无 token)时跳过请求,直接使用兜底文案,避免在此页触发 401 跳登录;
+ * 请求失败仅记录日志,不影响页面正常展示
+ */
+const loadContactInfo = async () => {
+ if (!getToken()) return
+ try {
+ const res = await getContactInfo()
+ const data = res.data || {}
+ applyHotline('invest', data.cityHotline)
+ applyHotline('partner', data.partnerRecruit)
+ } catch (e) {
+ console.error('[CONTACT_INFO] 获取联系方式失败,使用默认文案', e)
+ }
+}
+
+onLoad(() => {
+ loadContactInfo()
+})
/** 返回上一页:无上级页面(如直接进入)时回到个人中心 */
const handleBack = () => {
--
Gitblit v1.7.1