diff --git a/app.js b/app.js
index 16cf4d5..a2aa367 100644
--- a/app.js
+++ b/app.js
@@ -35,36 +35,6 @@ App({
})
})
- this.globalData.hospitalInfoReady = new Promise((resolve) => {
- API.resource.getHospitalInfo().then((data) => {
- this.globalData.hospitalInfo = data.data.hospitalInfo
- resolve(data.data.hospitalInfo)
- }).catch((err) => {
- console.error('获取医院信息失败', err)
- resolve([])
- })
- })
-
- this.globalData.hospitalRankingReady = new Promise((resolve) => {
- API.resource.getHospitalRanking().then((data) => {
- this.globalData.hospitalRanking = data.data.hospitalRanking
- resolve(data.data.hospitalRanking)
- }).catch((err) => {
- console.error('获取医院排名失败', err)
- resolve([])
- })
- })
-
- this.globalData.departmentRankingsReady = new Promise((resolve) => {
- API.resource.getDepartmentRankings().then((data) => {
- this.globalData.departmentRankings = data.data.departmentRankings
- resolve(data.data.departmentRankings)
- }).catch((err) => {
- console.error('获取科室排名失败', err)
- resolve([])
- })
- })
-
this.checkUpdate();
},
@@ -188,8 +158,5 @@ App({
chatSocket: null,
services: [],
agreement: null,
- hospitalInfo: [],
- hospitalRanking: [],
- departmentRankings: [],
}
})
\ No newline at end of file
diff --git a/app.json b/app.json
index d9d52d0..0d322d9 100644
--- a/app.json
+++ b/app.json
@@ -17,9 +17,8 @@
"pages/mine/addressedit",
"pages/mine/about",
"pages/mine/contact",
- "pages/hospital/contact",
- "pages/hospital/ranking",
- "pages/home/webview"
+ "pages/home/webview",
+ "pages/mine/business"
],
"window": {
"backgroundTextStyle": "light",
diff --git a/doc/PROJECT_GUIDE.md b/doc/PROJECT_GUIDE.md
index 897e195..d002857 100644
--- a/doc/PROJECT_GUIDE.md
+++ b/doc/PROJECT_GUIDE.md
@@ -49,8 +49,7 @@ doc/
| `pages/mine/mine` | 我的 |
| `pages/mine/about` | 关于 |
| `pages/mine/contact` | 联系我们 |
-| `pages/hospital/contact` | 医院联系 |
-| `pages/hospital/ranking` | 医院排行 |
+| `pages/mine/business` | 合作与入驻(商务合作 / 陪诊师入驻 / 陪诊师培训,入口自首页与「我的」页页脚) |
| `pages/home/webview` | 网页容器 |
## 约定
@@ -58,4 +57,4 @@ doc/
- **配色**:见 `doc/DESIGN.md`。色板令牌集中在 `app.wxss` 的 `page{}`,改配色只改这一处。
- **接口**:统一走 `utils/request.js`,基址 `https://api.huashengtec.com`(本地调试可改用文件内注释的 `127.0.0.1:9004`);请求自动携带 `appId=wxapp-escort` 与登录 token。
- **登录**:`app.js` 的 `onShow` 调 `wx.login` 换 token,存于 `globalData.user`。
-- **全局数据**:服务列表 / 协议 / 医院信息 / 排行在 `onLaunch` 预取,挂到 `globalData` 供各页取用。
\ No newline at end of file
+- **全局数据**:服务列表 / 协议在 `onLaunch` 预取,挂到 `globalData` 供各页取用。
\ No newline at end of file
diff --git a/pages/escort/guide.wxml b/pages/escort/guide.wxml
index e696ccb..e15e31d 100644
--- a/pages/escort/guide.wxml
+++ b/pages/escort/guide.wxml
@@ -9,7 +9,27 @@
-
+
+
+
+
+
+
+
+ 就诊前准备
+
+
+
+
+ {{ item }}
+
+
+
+
+
-
-
-
-
-
-
- 就诊前准备
-
-
-
-
- {{ item }}
-
-
-
-
diff --git a/pages/home/index.js b/pages/home/index.js
index 19779db..461ad1f 100644
--- a/pages/home/index.js
+++ b/pages/home/index.js
@@ -22,9 +22,6 @@ const SERVICE_ORDER = [1, 2, 7, 3, 4, 5, 8, 6]
// 计入"待服务订单"的订单状态:待确认 / 已确认 / 进行中
const PENDING_ORDER_STATUS = ['pending', 'confirmed', 'in_progress']
-// 人工客服电话
-const SERVICE_PHONE = '18618162956'
-
Page({
data: {
escortServices: [], // 陪诊服务(来自后端,按 SERVICE_ORDER 展示)
@@ -138,10 +135,11 @@ Page({
})
},
- // 页脚 B 端合作入口仍直接转服务电话
- goToContact() {
- wx.makePhoneCall({
- phoneNumber: SERVICE_PHONE
+ // 页脚三个 B 端入口:都进「合作与入驻」页,用 section 定位到各自的卡片
+ goToBusiness(e) {
+ const section = e.currentTarget.dataset.section || ''
+ wx.navigateTo({
+ url: `/pages/mine/business?section=${section}`
});
},
@@ -160,13 +158,6 @@ Page({
});
},
- // 介绍卡信任行:「实名专业陪诊师」→ 陪诊师公示页
- goToAttendants() {
- wx.navigateTo({
- url: '/pages/attendant/attendantlist'
- });
- },
-
// 点击陪诊服务,直达服务详情下单
goToServiceDetail(e) {
const id = e.currentTarget.dataset.id
diff --git a/pages/home/index.wxml b/pages/home/index.wxml
index f6deb41..f50f0da 100644
--- a/pages/home/index.wxml
+++ b/pages/home/index.wxml
@@ -81,15 +81,11 @@
做你和医生之间,最省心的那座桥。
+ "专业"是定性描述,故不称"可验证事实"。
+ 三项现状均纯展示不可点——「实名专业陪诊师」原先带 chevron 跳陪诊师公示页,
+ 现已摘掉入口,故连 chevron 一并去掉,否则会留一个点了没反应的点击暗示 -->
-
-
- 实名专业陪诊师
-
-
+ 实名专业陪诊师
熟悉医院流程
@@ -132,14 +128,15 @@
+ 三条都进「合作与入驻」页,各自用 section 定位到对应卡片。
+ 该页底部再转「联系我们」——咨询出口只保留一个,避免同一意图两个入口 -->
diff --git a/pages/home/index.wxss b/pages/home/index.wxss
index 78cfd8e..bc9dad4 100644
--- a/pages/home/index.wxss
+++ b/pages/home/index.wxss
@@ -214,24 +214,6 @@ page {
flex-shrink: 0;
}
-/* 信任行里唯一的可点项:「实名专业陪诊师」→ 陪诊师公示页。
- 用 padding 16rpx 把热区撑到 56rpx(28px),再配等量负外边距抵消,
- 信任行的行高与另两项保持完全不变 */
-.intro-trust-link {
- display: flex;
- align-items: center;
- padding: 16rpx 0;
- margin: -16rpx 0;
-}
-
-.intro-trust-link:active {
- opacity: 0.6;
-}
-
-.intro-trust-link .intro-trust-item {
- margin-right: 4rpx;
-}
-
/* ===== 通用区块 ===== */
.section {
margin-top: 56rpx;
diff --git a/pages/hospital/contact.js b/pages/hospital/contact.js
deleted file mode 100644
index 3a0d1c3..0000000
--- a/pages/hospital/contact.js
+++ /dev/null
@@ -1,57 +0,0 @@
-const app = getApp()
-
-Page({
- data: {
- hospitalInfo: [],
- loading: true,
- },
-
- onLoad(options) {
- this.loadhospitalInfo()
- },
-
- loadhospitalInfo() {
- const appData = app.globalData
- if (appData.hospitalInfo && appData.hospitalInfo.length > 0) {
- this.setData({
- hospitalInfo: appData.hospitalInfo,
- loading: false,
- })
- } else if (appData.hospitalInfoReady) {
- appData.hospitalInfoReady.then((data) => {
- this.setData({
- hospitalInfo: data || [],
- loading: false,
- })
- }).catch(() => {
- this.setData({
- hospitalInfo: [],
- loading: false,
- })
- })
- } else {
- this.setData({
- hospitalInfo: [],
- loading: false,
- })
- }
- },
-
- onCallPhone(e) {
- const phone = e.currentTarget.dataset.phone
- if (!phone) return
- wx.makePhoneCall({
- phoneNumber: phone,
- fail: (err) => {
- console.error('拨打电话失败', err)
- },
- })
- },
-
- onShareAppMessage() {
- return {
- title: '医院联系电话',
- path: '/pages/hospital/contact',
- }
- },
-})
diff --git a/pages/hospital/contact.json b/pages/hospital/contact.json
deleted file mode 100644
index 8835af0..0000000
--- a/pages/hospital/contact.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "usingComponents": {}
-}
\ No newline at end of file
diff --git a/pages/hospital/contact.wxml b/pages/hospital/contact.wxml
deleted file mode 100644
index 73b1676..0000000
--- a/pages/hospital/contact.wxml
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
- 加载中...
-
-
-
- 暂无医院信息
-
-
-
-
-
- {{item.name}}
-
-
- {{phone.number}}
-
-
-
-
-
-
diff --git a/pages/hospital/contact.wxss b/pages/hospital/contact.wxss
deleted file mode 100644
index 97836ac..0000000
--- a/pages/hospital/contact.wxss
+++ /dev/null
@@ -1,132 +0,0 @@
-page {
- background-color: #F5F7F6;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
-}
-
-.container {
- min-height: 100vh;
- padding-bottom: 32rpx;
-}
-
-/* 顶部导航栏 */
-.nav-bar {
- display: flex;
- align-items: center;
- padding: 120rpx 32rpx 20rpx 32rpx;
- background: #FFFFFF;
-}
-
-.nav-logo {
- display: flex;
- align-items: center;
-}
-
-.logo-icon {
- width: 56rpx;
- height: 56rpx;
- border-radius: 16rpx;
- background: #FFFFFF;
- padding: 4rpx;
-}
-
-.logo-text {
- font-size: 36rpx;
- font-weight: 700;
- color: #1F2937;
- margin-left: 16rpx;
-}
-
-/* Header区域 */
-.header {
- background: #FFFFFF;
- padding: 16rpx 24rpx 20rpx 24rpx;
- margin-bottom: 12rpx;
-}
-
-.title {
- display: block;
- font-size: 32rpx;
- font-weight: 700;
- color: #1F2937;
-}
-
-.subtitle {
- display: block;
- font-size: 24rpx;
- color: #6B8E7B;
- margin-top: 6rpx;
-}
-
-/* 加载和空状态 */
-.loading,
-.empty {
- text-align: center;
- padding: 80rpx 24rpx;
- color: #6B7280;
- font-size: 26rpx;
-}
-
-/* 列表区域 */
-.list {
- padding: 0 24rpx;
-}
-
-.item {
- display: flex;
- align-items: center;
- justify-content: space-between;
- background: #FFFFFF;
- border-radius: 20rpx;
- padding: 20rpx 24rpx;
- margin-bottom: 12rpx;
- box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.04);
-}
-
-.info {
- display: flex;
- flex-direction: column;
- flex: 1;
- overflow: hidden;
-}
-
-.name {
- font-size: 30rpx;
- font-weight: 600;
- color: #1F2937;
- line-height: 1.3;
- margin-bottom: 10rpx;
- word-wrap: break-word;
-}
-
-.phones {
- display: flex;
- flex-direction: row;
- flex-wrap: wrap;
- gap: 8rpx;
-}
-
-.phone-wrap {
- display: flex;
- align-items: center;
- gap: 8rpx;
- padding: 8rpx 14rpx;
- background: #FAFAFA;
- border-radius: 8rpx;
- width: fit-content;
-}
-
-.phone {
- font-size: 26rpx;
- color: #2D6A4F;
- line-height: 1.3;
- font-weight: 500;
-}
-
-.action {
- margin-left: 16rpx;
- flex-shrink: 0;
-}
-
-.icon {
- font-size: 36rpx;
-}
diff --git a/pages/hospital/ranking.js b/pages/hospital/ranking.js
deleted file mode 100644
index 6d94656..0000000
--- a/pages/hospital/ranking.js
+++ /dev/null
@@ -1,192 +0,0 @@
-// pages/hospital/ranking.js
-const app = getApp()
-
-Page({
- data: {
- activeTab: 'overall',
- searchKeyword: '',
- selectedDepartment: '',
- rankingYear: '',
- rankingNote: '',
- departmentList: [],
- allHospitals: [],
- filteredHospitals: [],
- currentDepartmentRanking: {
- top10: [],
- nominated: []
- },
- hospitalRankingData: null,
- departmentRankingsData: null
- },
-
- onLoad(options) {
- this.loadData()
- },
-
- onShow() {
- if (!this.data.hospitalRankingData || !this.data.departmentRankingsData) {
- this.loadData()
- }
- },
-
- async loadData() {
- try {
- const appData = app.globalData
-
- let hospitalRanking = appData.hospitalRanking
- let departmentRankings = appData.departmentRankings
-
- if (!hospitalRanking) {
- hospitalRanking = await appData.hospitalRankingReady
- }
- if (!departmentRankings) {
- departmentRankings = await appData.departmentRankingsReady
- }
-
- this.setData({
- hospitalRankingData: hospitalRanking,
- departmentRankingsData: departmentRankings
- })
-
- this.processHospitalRanking(hospitalRanking)
- this.processDepartmentRankings(departmentRankings)
- } catch (err) {
- console.error('加载排行榜数据失败', err)
- wx.showToast({
- title: '数据加载失败',
- icon: 'none'
- })
- }
- },
-
- processHospitalRanking(data) {
- if (!data || !data.rankings) return
-
- const gradeClassMap = {
- 'A+++++': 'grade-a5',
- 'A++++': 'grade-a4',
- 'A+++': 'grade-a3',
- 'A++': 'grade-a2',
- 'A+': 'grade-a1'
- }
-
- const hospitals = data.rankings.map(item => {
- const allDeps = (item.depart || [])
- .sort((a, b) => a.rank - b.rank)
- return {
- ...item,
- gradeClass: gradeClassMap[item.grade] || 'grade-a1',
- topDepartments: allDeps,
- expanded: false
- }
- })
-
- this.setData({
- rankingYear: data.year || '',
- rankingNote: data.note || '',
- allHospitals: hospitals,
- filteredHospitals: hospitals
- })
- },
-
- processDepartmentRankings(data) {
- if (!data || !data.departments) return
-
- const departments = Object.keys(data.departments)
- const firstDept = departments[0] || ''
-
- this.setData({
- departmentList: departments,
- selectedDepartment: firstDept
- })
-
- if (firstDept) {
- this.updateCurrentDepartmentRanking(firstDept)
- }
- },
-
- updateCurrentDepartmentRanking(deptName) {
- const data = this.data.departmentRankingsData
- if (!data || !data.departments || !data.departments[deptName]) {
- this.setData({
- currentDepartmentRanking: { top10: [], nominated: [] }
- })
- return
- }
-
- const deptData = data.departments[deptName]
- this.setData({
- currentDepartmentRanking: {
- top10: deptData.top10 || [],
- nominated: deptData.nominated || []
- }
- })
- },
-
- switchTab(e) {
- const tab = e.currentTarget.dataset.tab
- if (tab === this.data.activeTab) return
- this.setData({ activeTab: tab })
- },
-
- selectDepartment(e) {
- const dept = e.currentTarget.dataset.dept
- this.setData({ selectedDepartment: dept })
- this.updateCurrentDepartmentRanking(dept)
- },
-
- onSearchInput(e) {
- const keyword = e.detail.value
- this.setData({ searchKeyword: keyword })
- this.filterHospitals(keyword)
- },
-
- onSearch(e) {
- const keyword = e.detail.value
- this.filterHospitals(keyword)
- },
-
- clearSearch() {
- this.setData({ searchKeyword: '' })
- this.filterHospitals('')
- },
-
- filterHospitals(keyword) {
- let result = this.data.allHospitals
-
- if (keyword && keyword.trim()) {
- const lowerKeyword = keyword.trim().toLowerCase()
- result = result.filter(item => {
- const nameMatch = item.name && item.name.toLowerCase().includes(lowerKeyword)
- const deptMatch = item.depart && item.depart.some(d => d.name && d.name.toLowerCase().includes(lowerKeyword))
- return nameMatch || deptMatch
- })
- }
-
- this.setData({ filteredHospitals: result })
- },
-
- toggleHospital(e) {
- const name = e.currentTarget.dataset.name
- const hospitals = this.data.filteredHospitals.map(item => {
- if (item.name === name) {
- return { ...item, expanded: !item.expanded }
- }
- return item
- })
- this.setData({ filteredHospitals: hospitals })
- },
-
- onPullDownRefresh() {
- this.loadData().finally(() => {
- wx.stopPullDownRefresh()
- })
- },
-
- onShareAppMessage() {
- return {
- title: '复旦中国医院排行榜',
- path: '/pages/hospital/ranking'
- }
- }
-})
diff --git a/pages/hospital/ranking.json b/pages/hospital/ranking.json
deleted file mode 100644
index 45d0ecc..0000000
--- a/pages/hospital/ranking.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "usingComponents": {},
- "enablePullDownRefresh": true,
- "backgroundTextStyle": "dark",
- "navigationBarTitleText": "医院排行榜"
-}
diff --git a/pages/hospital/ranking.wxml b/pages/hospital/ranking.wxml
deleted file mode 100644
index b32064e..0000000
--- a/pages/hospital/ranking.wxml
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
-
-
- 综合榜
-
-
-
- 专科榜
-
-
-
-
-
-
-
-
-
-
- {{item.grade}}
-
-
-
-
- 专科排名详情
-
-
- {{dep.name}}
-
- 第{{dep.rank}}名
- {{dep.score}}分
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{item.rank}}
- {{item.rank}}
-
-
- {{item.name}}
- {{item.score}}分
-
-
-
-
-
-
- 获提名医院
-
- {{item}}
-
-
-
-
-
-
-
-
- 未找到匹配的医院
-
-
diff --git a/pages/hospital/ranking.wxss b/pages/hospital/ranking.wxss
deleted file mode 100644
index 19a4805..0000000
--- a/pages/hospital/ranking.wxss
+++ /dev/null
@@ -1,450 +0,0 @@
-/* pages/hospital/ranking.wxss */
-page {
- background-color: #F5F7F6;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
-}
-
-.container {
- min-height: 100vh;
- padding-bottom: 60rpx;
-}
-
-/* ========== 顶部标题 ========== */
-.header {
- padding: 32rpx 32rpx 16rpx 32rpx;
- text-align: center;
-}
-
-.header-title {
- font-size: 36rpx;
- font-weight: 700;
- color: #1F2937;
- display: block;
-}
-
-.header-note {
- font-size: 24rpx;
- color: #6B8E7B;
- margin-top: 8rpx;
- display: block;
-}
-
-/* ========== 搜索栏 ========== */
-.search-bar {
- padding: 16rpx 32rpx;
-}
-
-.search-input-wrap {
- display: flex;
- align-items: center;
- background: #FFFFFF;
- border-radius: 40rpx;
- padding: 16rpx 24rpx;
- box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.04);
-}
-
-.search-input {
- flex: 1;
- font-size: 28rpx;
- color: #1F2937;
- margin-left: 16rpx;
- margin-right: 16rpx;
-}
-
-.search-input::placeholder {
- color: #6B7280;
-}
-
-.search-clear {
- padding: 4rpx;
-}
-
-/* ========== Tab 切换 ========== */
-.tab-bar {
- display: flex;
- justify-content: center;
- padding: 0 32rpx;
- margin-top: 8rpx;
- border-bottom: 1rpx solid #F3F4F6;
-}
-
-.tab-item {
- position: relative;
- padding: 24rpx 48rpx;
- cursor: pointer;
-}
-
-.tab-text {
- font-size: 30rpx;
- color: #6B7280;
- font-weight: 500;
-}
-
-.tab-item.active .tab-text {
- color: #2D6A4F;
- font-weight: 700;
-}
-
-.tab-line {
- position: absolute;
- bottom: 0;
- left: 50%;
- transform: translateX(-50%);
- width: 48rpx;
- height: 4rpx;
- background: #2D6A4F;
- border-radius: 2rpx;
-}
-
-/* ========== 综合榜内容 ========== */
-.content {
- padding: 0 24rpx;
-}
-
-/* 医院列表 */
-.hospital-list {
- margin-top: 16rpx;
-}
-
-.hospital-card {
- position: relative;
- background: #FFFFFF;
- border-radius: 20rpx;
- margin-bottom: 16rpx;
- box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.04);
- overflow: hidden;
-}
-
-.hospital-rank-badge {
- position: absolute;
- top: 0;
- right: 0;
- z-index: 10;
-}
-
-.hospital-rank-badge .rank-grade {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- padding: 8rpx 16rpx;
- border-radius: 0 20rpx 0 12rpx;
- font-size: 22rpx;
- font-weight: 700;
- min-width: 80rpx;
- text-align: center;
-}
-
-.hospital-header {
- display: flex;
- align-items: center;
- padding: 24rpx 100rpx 24rpx 24rpx;
-}
-
-.rank-grade {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- padding: 8rpx 16rpx;
- border-radius: 12rpx;
- font-size: 24rpx;
- font-weight: 700;
- min-width: 80rpx;
- text-align: center;
-}
-
-.rank-grade.grade-a5 {
- background: linear-gradient(135deg, #FEF3C7 0%, #FDE68A 100%);
- color: #92400E;
-}
-
-.rank-grade.grade-a4 {
- background: linear-gradient(135deg, #DBEAFE 0%, #BFDBFE 100%);
- color: #1E40AF;
-}
-
-.rank-grade.grade-a3 {
- background: linear-gradient(135deg, #D1FAE5 0%, #A7F3D0 100%);
- color: #065F46;
-}
-
-.rank-grade.grade-a2 {
- background: linear-gradient(135deg, #E0E7FF 0%, #C7D2FE 100%);
- color: #3730A3;
-}
-
-.rank-grade.grade-a1 {
- background: linear-gradient(135deg, #F3E8FF 0%, #E9D5FF 100%);
- color: #6B21A8;
-}
-
-.hospital-info {
- flex: 1;
- min-width: 0;
-}
-
-.hospital-name {
- font-size: 32rpx;
- font-weight: 600;
- color: #1F2937;
- display: block;
-}
-
-.hospital-tags {
- display: flex;
- flex-wrap: wrap;
- margin-top: 8rpx;
- gap: 8rpx;
-}
-
-.tag {
- font-size: 24rpx;
- color: #2D6A4F;
- background: rgba(45, 106, 79, 0.08);
- padding: 4rpx 12rpx;
- border-radius: 8rpx;
-}
-
-.hospital-arrow {
- margin-left: 16rpx;
- transition: transform 0.3s;
-}
-
-.arrow-up {
- transform: rotate(180deg);
-}
-
-/* 医院详情展开 */
-.hospital-detail {
- padding: 0 24rpx 24rpx 24rpx;
- border-top: 1rpx solid #F3F4F6;
-}
-
-.detail-title {
- font-size: 26rpx;
- font-weight: 600;
- color: #374151;
- padding: 16rpx 0 12rpx 0;
-}
-
-.dept-grid {
- display: flex;
- flex-wrap: wrap;
- gap: 12rpx;
-}
-
-.dept-item {
- background: #F9FAFB;
- border-radius: 12rpx;
- padding: 12rpx 16rpx;
- flex: 1;
- min-width: 200rpx;
- max-width: calc(50% - 6rpx);
-}
-
-.dept-name {
- font-size: 24rpx;
- color: #4B5563;
- display: block;
-}
-
-.dept-rank {
- display: flex;
- justify-content: space-between;
- margin-top: 4rpx;
-}
-
-.rank-num {
- font-size: 22rpx;
- color: #2D6A4F;
- font-weight: 600;
-}
-
-.rank-score {
- font-size: 22rpx;
- color: #9CA3AF;
-}
-
-/* ========== 专科榜内容 ========== */
-.content:has(.dept-filter) {
- display: flex;
- padding: 0;
-}
-
-.dept-filter {
- width: 200rpx;
- background: #FFFFFF;
- border-right: 1rpx solid #F3F4F6;
-}
-
-.dept-sidebar {
- padding: 8rpx 0;
-}
-
-.sidebar-item {
- padding: 24rpx 16rpx;
- text-align: center;
- border-left: 4rpx solid transparent;
- transition: all 0.2s;
-}
-
-.sidebar-item.active {
- background: #F0FDF4;
- border-left-color: #2D6A4F;
-}
-
-.sidebar-text {
- font-size: 26rpx;
- color: #4B5563;
-}
-
-.sidebar-item.active .sidebar-text {
- color: #2D6A4F;
- font-weight: 600;
-}
-
-.dept-ranking-content {
- flex: 1;
- padding: 16rpx 24rpx 24rpx 24rpx;
- overflow-y: auto;
-}
-
-.dept-ranking-header {
- margin-bottom: 16rpx;
-}
-
-.dept-ranking-title {
- font-size: 32rpx;
- font-weight: 700;
- color: #1F2937;
- display: block;
-}
-
-.dept-ranking-subtitle {
- font-size: 24rpx;
- color: #6B8E7B;
- margin-top: 4rpx;
- display: block;
-}
-
-/* Top10 列表 */
-.top10-list {
- background: #FFFFFF;
- border-radius: 20rpx;
- box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.04);
- overflow: hidden;
-}
-
-.top10-item {
- display: flex;
- align-items: center;
- padding: 20rpx 24rpx;
- border-bottom: 1rpx solid #F3F4F6;
-}
-
-.top10-item:last-child {
- border-bottom: none;
-}
-
-.top10-item.top3 {
- background: linear-gradient(90deg, rgba(254, 243, 199, 0.3) 0%, rgba(255, 255, 255, 0) 100%);
-}
-
-.top10-rank {
- margin-right: 20rpx;
- min-width: 56rpx;
- text-align: center;
-}
-
-.rank-badge {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 48rpx;
- height: 48rpx;
- border-radius: 50%;
- font-size: 26rpx;
- font-weight: 700;
- color: #FFFFFF;
-}
-
-.top10-item:nth-child(1) .rank-badge {
- background: linear-gradient(135deg, #F59E0B 0%, #D97706 100%);
-}
-
-.top10-item:nth-child(2) .rank-badge {
- background: linear-gradient(135deg, #9CA3AF 0%, #6B7280 100%);
-}
-
-.top10-item:nth-child(3) .rank-badge {
- background: linear-gradient(135deg, #B45309 0%, #92400E 100%);
-}
-
-.rank-num {
- font-size: 28rpx;
- font-weight: 600;
- color: #6B7280;
-}
-
-.top10-info {
- flex: 1;
- min-width: 0;
-}
-
-.top10-name {
- font-size: 28rpx;
- color: #1F2937;
- font-weight: 500;
- display: block;
-}
-
-.top10-score {
- font-size: 24rpx;
- color: #6B7280;
- margin-top: 4rpx;
- display: block;
-}
-
-/* 获提名医院 */
-.nominated-section {
- margin-top: 24rpx;
- background: #FFFFFF;
- border-radius: 20rpx;
- padding: 20rpx 24rpx;
- box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.04);
-}
-
-.nominated-title {
- font-size: 26rpx;
- font-weight: 600;
- color: #374151;
- margin-bottom: 12rpx;
-}
-
-.nominated-list {
- display: flex;
- flex-wrap: wrap;
- gap: 12rpx;
-}
-
-.nominated-item {
- font-size: 24rpx;
- color: #4B5563;
- background: #F9FAFB;
- padding: 8rpx 16rpx;
- border-radius: 8rpx;
-}
-
-/* ========== 空状态 ========== */
-.empty-state {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- padding: 120rpx 32rpx;
-}
-
-.empty-text {
- font-size: 28rpx;
- color: #6B7280;
- margin-top: 24rpx;
-}
diff --git a/pages/mine/business.js b/pages/mine/business.js
new file mode 100644
index 0000000..443881f
--- /dev/null
+++ b/pages/mine/business.js
@@ -0,0 +1,87 @@
+// pages/mine/business.js
+
+// 商务合作 / 陪诊师入驻 / 陪诊师培训 三个方向共用本页:入口分别来自首页与
+// 「我的」页页脚,靠 ?section= 定位到对应卡片(对应 wxml 里 wx:for 的 id)。
+//
+// 规则口径只写两类内容:国家标准 GB/T 47801—2026《社会化陪同就医服务 基本要求》
+// 第 4.2 章(服务管理)、第 7 章(服务人员)已明确的要求,以及平台的通用流程。
+// 不写任何未公示的收费标准——费用与排期一律指向客服确认,避免出现未公示费项。
+//
+// 培训卡里的证书口径:发证主体是国家开放大学培训中心,不是本平台,故只陈述
+// 证书名称、颁发主体与证书性质(培训合格证明),不写"国家认可""全国通用"
+// "持证上岗"等评价性或承诺性表述——那类说法无法核实,且涉嫌虚假宣传。
+
+// 三个锚点白名单:?section= 来自页面路径,只接受这三张卡自己的 id
+const SECTION_IDS = ['sec-biz', 'sec-join', 'sec-train']
+
+Page({
+ data: {
+ // 三张卡的数据源:改文案只改这里,wxml 结构不动
+ sections: [{
+ id: 'sec-biz',
+ icon: 'user-business',
+ title: '商务合作',
+ points: [
+ '合作对象:医疗机构、社区、健康管理及养老服务机构,以及有员工就医协助需求的企业',
+ '合作方式:具体事项请联系客服沟通'
+ ],
+ note: '以上为通用说明,具体合作方案请联系客服沟通'
+ },
+ {
+ id: 'sec-join',
+ icon: 'user-add',
+ title: '陪诊师入驻',
+ points: [
+ '基本条件:持有效健康证明,遵守医院规定,不干预医务人员判断',
+ '上岗要求:完成岗前培训并考核通过,上岗后定期参加专项培训',
+ '职业素养:守时、有责任心,尊重服务对象,保护其隐私',
+ '入驻流程:联系客服沟通'
+ ],
+ note: '以上依据国家标准 GB/T 47801—2026《社会化陪同就医服务 基本要求》第 7 章,最终以资料核验结果为准'
+ },
+ {
+ id: 'sec-train',
+ icon: 'education',
+ title: '陪诊师培训',
+ points: [
+ '培训内容:操作、专业能力、安全应急、心理健康、人文素养',
+ '专业知识:挂号流程、科室分布、设备使用与应急常识',
+ '培训证书:国家开放大学培训中心《医疗陪诊顾问职业技能培训证书》(培训合格证明,非职业资格证书)',
+ '培训费用:980 元,报名请联系客服确认'
+ ],
+ note: '本页仅作说明,不办理报名与收费'
+ }
+ ]
+ },
+
+ // 从哪个入口进来就定位到哪张卡,避免点「陪诊师培训」却落在页首自己找
+ onLoad(options) {
+ const section = options && options.section
+ this.sectionId = SECTION_IDS.indexOf(section) > -1 ? section : ''
+ },
+
+ onReady() {
+ if (!this.sectionId) {
+ return
+ }
+ wx.pageScrollTo({
+ selector: `#${this.sectionId}`,
+ duration: 0
+ })
+ },
+
+ // 底部出口:合作咨询统一转联系我们页(热线、微信、邮箱都在那一页,
+ // 不在此页重复铺一遍联系方式,避免同一意图两个入口)
+ goToContact() {
+ wx.navigateTo({
+ url: '/pages/mine/contact'
+ })
+ },
+
+ onShareAppMessage() {
+ return {
+ title: '暖橙陪诊 · 合作与入驻',
+ path: '/pages/mine/business'
+ }
+ }
+})
diff --git a/pages/mine/business.json b/pages/mine/business.json
new file mode 100644
index 0000000..c7e4111
--- /dev/null
+++ b/pages/mine/business.json
@@ -0,0 +1,6 @@
+{
+ "navigationBarTitleText": "合作与入驻",
+ "usingComponents": {
+ "t-icon": "tdesign-miniprogram/icon/icon"
+ }
+}
diff --git a/pages/mine/business.wxml b/pages/mine/business.wxml
new file mode 100644
index 0000000..adce68c
--- /dev/null
+++ b/pages/mine/business.wxml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+ {{ point }}
+
+
+
+
+ {{ item.note }}
+
+
+
+
+
+ 具体事项,请直接联系我们
+
+
+
+
+
+
diff --git a/pages/mine/business.wxss b/pages/mine/business.wxss
new file mode 100644
index 0000000..317af81
--- /dev/null
+++ b/pages/mine/business.wxss
@@ -0,0 +1,165 @@
+/* pages/mine/business.wxss
+ 配色令牌来自 app.wxss(全站唯一来源),本页不留副本;
+ 卡片、卡头标识、圆点清单与陪诊指南页同一套语言,保证内页风格一致 */
+page {
+ background-color: var(--paper);
+}
+
+.page-bg {
+ min-height: 100vh;
+ background: var(--paper);
+}
+
+.container {
+ padding: 32rpx 32rpx 0;
+}
+
+/* ===== 头部:小色带 + 深墨标题 ===== */
+.page-header {
+ padding: 24rpx 0 8rpx;
+}
+
+.header-accent {
+ width: 64rpx;
+ height: 8rpx;
+ border-radius: 4rpx;
+ background: var(--brand-strong);
+}
+
+.header-title {
+ display: block;
+ margin-top: 20rpx;
+ font-size: 46rpx;
+ font-weight: 700;
+ color: var(--ink);
+ letter-spacing: 1rpx;
+}
+
+.header-subtitle {
+ display: block;
+ margin-top: 12rpx;
+ font-size: 26rpx;
+ color: var(--muted);
+ letter-spacing: 1rpx;
+}
+
+/* ===== 方向卡:白面走发丝边 + 中性紧阴影 ===== */
+.card {
+ margin-top: 32rpx;
+ padding: 28rpx 26rpx;
+ border-radius: 28rpx;
+ background: var(--white);
+ border: 2rpx solid var(--line);
+ box-shadow: var(--shadow-card);
+}
+
+.card-head {
+ display: flex;
+ align-items: center;
+ margin-bottom: 20rpx;
+}
+
+/* 卡头标识:浅橙衬底 + 2rpx 描边托形,不用实心橙(全页无实心大色块) */
+.card-mark {
+ width: 44rpx;
+ height: 44rpx;
+ border-radius: 12rpx;
+ background: var(--brand-soft);
+ border: 2rpx solid var(--brand-line);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-shrink: 0;
+}
+
+.card-title {
+ margin-left: 14rpx;
+ font-size: 32rpx;
+ font-weight: 700;
+ color: var(--ink);
+ letter-spacing: 1rpx;
+}
+
+/* ===== 规则条目:与陪诊指南页同一套圆点语言 ===== */
+.dot-item {
+ display: flex;
+ padding: 12rpx 0;
+}
+
+.dot {
+ width: 10rpx;
+ height: 10rpx;
+ border-radius: 50%;
+ background: var(--brand-strong);
+ margin: 16rpx 18rpx 0 4rpx;
+ flex-shrink: 0;
+}
+
+.dot-text {
+ flex: 1;
+ font-size: 28rpx;
+ color: var(--ink-2);
+ line-height: 1.7;
+}
+
+/* 尾注:与条目用发丝线切开,读到的是口径说明而非又一条规则 */
+.card-note {
+ display: block;
+ margin-top: 8rpx;
+ padding-top: 20rpx;
+ border-top: 2rpx solid var(--line);
+ font-size: 24rpx;
+ color: var(--muted);
+ line-height: 1.7;
+}
+
+/* ===== 底部出口:浅橙入口卡(同 about 页「联系我们」配方)=====
+ 靠 2rpx --brand-line 描边托形,不加阴影 */
+.contact-entry {
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: 48rpx;
+ padding: 28rpx 26rpx;
+ border-radius: 28rpx;
+ background: var(--brand-soft);
+ border: 2rpx solid var(--brand-line);
+ transition: transform 0.15s ease;
+}
+
+.contact-entry:active,
+.contact-entry-hover {
+ transform: scale(0.99);
+}
+
+/* chevron 绝对定位贴右缘:只作点击暗示,不参与居中计算,
+ 否则会把文字往左挤偏半个箭头宽 */
+.entry-arrow {
+ position: absolute;
+ right: 26rpx;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+/* 说明句:比主色文字小一号(26rpx)并转灰,退到背景层;
+ --muted 在浅橙底上 5.24:1,过 AA;26rpx 高于中文最小字号 24rpx */
+.entry-prefix {
+ font-size: 26rpx;
+ color: var(--muted);
+}
+
+/* 落在"联系我们"上,保留暖橙主色与字重,成为这行文字的指向;
+ --brand-ink 就是为「浅橙底上的文字」定义的令牌(浅橙底 5.96:1,过 AA)。
+ margin-left 是两段之间的唯一间隙来源(不靠空白字符),
+ 8rpx 约半个汉字宽,够断开语气又不至于把一句话读散 */
+.entry-title {
+ margin-left: 8rpx;
+ font-size: 30rpx;
+ font-weight: 700;
+ color: var(--brand-ink);
+}
+
+.footer-space {
+ height: 60rpx;
+}
diff --git a/pages/mine/mine.js b/pages/mine/mine.js
index 6ce4198..5916dea 100644
--- a/pages/mine/mine.js
+++ b/pages/mine/mine.js
@@ -188,10 +188,11 @@ Page({
})
},
- // 页脚 B 端合作链接:暂无独立页面,统一转接人工客服
- onFooterTap() {
- wx.makePhoneCall({
- phoneNumber: '18618162956'
+ // 页脚三个 B 端入口:都进「合作与入驻」页,用 section 定位到各自的卡片
+ onFooterTap(e) {
+ const section = e.currentTarget.dataset.section || ''
+ wx.navigateTo({
+ url: `/pages/mine/business?section=${section}`
})
},
diff --git a/pages/mine/mine.wxml b/pages/mine/mine.wxml
index f6a85f5..ba52c66 100644
--- a/pages/mine/mine.wxml
+++ b/pages/mine/mine.wxml
@@ -85,16 +85,17 @@