185 changed files with 6037 additions and 2117 deletions
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
1. 本项目是一个基于微信小程序的药品查询应用 |
||||
2. 使用原生微信小程序+typescript+scss |
||||
3. figma设计稿的宽度是375px,1px=2rpx |
||||
4. 小程序的scss单位是rpx |
||||
5. 导航栏使用自定义导航栏,使用自定义组件 /components/navbar |
||||
6. 除了onLoad比寻存在外,其他生命周期函数,无须额外定义 |
||||
7. onLoad函数中需要隐去getApp().waitLogin(),页面使用的接口需要在登录后调用 |
||||
8. 生命周期函数和事件处理函数不应使用箭头函数 |
||||
9. getApp()应提取到全局变量中,避免重复调用 |
||||
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
--- |
||||
name: wm-skill |
||||
description: 本地微信小程序开发专家指南,重点关注性能、代码大小和原生兼容性。用于用原生typescript+scss开发微信小程序。 |
||||
--- |
||||
|
||||
# 角色:微信小程序专家(原生 JS) |
||||
|
||||
## 核心原则 |
||||
- 你是一名专注于原生微信小程序开发(JavaScript)的高级开发者。 |
||||
- 优先级:性能、代码大小和原生兼容性。 |
||||
- 禁止使用:Taro、Uni-app 或任何跨平台框架。 |
||||
|
||||
## 技术规范 |
||||
- **逻辑:** 使用 ES6+ TypeScript。 |
||||
- **状态管理:** 使用 `this.setData()`。为了性能,始终使用 **数据路径** 进行部分更新(例如:`this.setData({ 'list[0].text': 'new' })`)。 |
||||
- **视图(WXML):** 在 `wx:for` 中始终包含 `wx:key`。使用 `bind:tap`(冒泡)或 `catch:tap`(非冒泡)。 |
||||
- **样式(SCSS):** 对所有响应式布局使用 `rpx`。遵循 BEM 命名约定。 |
||||
- **组件:** 优先使用 `Component()` 而不是 `Page()`,以获得可重用逻辑和更好的 `setData` 性能。 |
||||
|
||||
## 错误预防 |
||||
- **iOS 日期:** 在传递给 `new Date()` 之前,始终将 `-` 替换为 `/`(例如:`str.replace(/-/g, '/')`)。 |
||||
- **导航:** 对标签页使用 `wx.switchTab`。监控页面栈限制(10)。 |
||||
- **原生组件:** 使用 `<cover-view>` 覆盖在 `<canvas>`、`<video>` 或 `<map>` 上。 |
||||
@ -1,7 +0,0 @@
@@ -1,7 +0,0 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"van-popup": "@vant/weapp/popup/index", |
||||
"van-cascader": "@vant/weapp/cascader/index" |
||||
} |
||||
} |
||||
@ -1,76 +0,0 @@
@@ -1,76 +0,0 @@
|
||||
const app = getApp<IAppOption>() |
||||
|
||||
Component({ |
||||
properties: { |
||||
level: { |
||||
type: Number, |
||||
value: 3, |
||||
}, |
||||
value: { |
||||
type: String, |
||||
value: '', |
||||
}, |
||||
}, |
||||
|
||||
data: { |
||||
imageUrl: app.globalData.imageUrl, |
||||
Timestamp: app.globalData.Timestamp, |
||||
|
||||
show: false, |
||||
options: [], |
||||
fieldNames: { |
||||
text: 'label', |
||||
value: 'value', |
||||
children: 'children', |
||||
}, |
||||
}, |
||||
lifetimes: { |
||||
attached() { |
||||
this.getArea() |
||||
}, |
||||
}, |
||||
methods: { |
||||
handleShow() { |
||||
this.setData({ |
||||
show: true, |
||||
}) |
||||
}, |
||||
getArea() { |
||||
const { level } = this.data |
||||
wx.ajax({ |
||||
method: 'GET', |
||||
url: '/js/area.json', |
||||
data: {}, |
||||
isJSON: true, |
||||
}).then((res) => { |
||||
if (level === 1) { |
||||
res.forEach((item: any) => { |
||||
delete item.children |
||||
}) |
||||
} |
||||
if (level === 2) { |
||||
res.forEach((item: any) => { |
||||
item.children.forEach((child: any) => { |
||||
delete child.children |
||||
}) |
||||
}) |
||||
} |
||||
this.setData({ |
||||
options: res, |
||||
}) |
||||
}) |
||||
}, |
||||
onFinish(e: any) { |
||||
this.triggerEvent('change', e.detail.selectedOptions) |
||||
this.setData({ |
||||
show: false, |
||||
}) |
||||
}, |
||||
onClose() { |
||||
this.setData({ |
||||
show: false, |
||||
}) |
||||
this.triggerEvent('cancel') |
||||
}, |
||||
}, |
||||
}) |
||||
@ -1,13 +0,0 @@
@@ -1,13 +0,0 @@
|
||||
<van-popup show="{{ show }}" round position="bottom"> |
||||
<van-cascader |
||||
wx:if="{{ show }}" |
||||
value="{{ value }}" |
||||
title="请选择所在地区" |
||||
fieldNames="{{fieldNames}}" |
||||
options="{{ options }}" |
||||
bind:close="onClose" |
||||
bind:finish="onFinish" |
||||
/> |
||||
</van-popup> |
||||
|
||||
<slot bind:tap="handleShow"></slot> |
||||
@ -1,6 +1,7 @@
@@ -1,6 +1,7 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"van-popup": "@vant/weapp/popup/index" |
||||
"van-popup": "@vant/weapp/popup/index", |
||||
"uploadFile": "/components/uploadFile/index" |
||||
} |
||||
} |
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,15 @@
@@ -1,16 +1,15 @@
|
||||
/* custom-tab-bar/index.wxss */ |
||||
|
||||
|
||||
.tab-item { |
||||
.icon { |
||||
width: 50rpx; |
||||
height: 50rpx; |
||||
width: 40rpx; |
||||
height: 40rpx; |
||||
} |
||||
.name { |
||||
font-size: 24rpx; |
||||
color: #010105; |
||||
color: #6a605c; |
||||
&.active { |
||||
color: rgba(28, 107, 255, 1); |
||||
color: #ff8a4c; |
||||
} |
||||
} |
||||
} |
||||
|
||||
@ -1,14 +1,9 @@
@@ -1,14 +1,9 @@
|
||||
<van-tabbar active="{{ active }}" active-color="rgba(28, 107, 255, 1)" bind:change="onChange" inactive-color="#010105"> |
||||
<van-tabbar active="{{ active }}" active-color="#F23A2F" bind:change="onChange" inactive-color="#010105" placeholder> |
||||
<block wx:for="{{list}}" wx:key="*this"> |
||||
<van-tabbar-item |
||||
class="tab-item" |
||||
wx:if="{{ index != 3 || !anyWhere}}" |
||||
bind:tap="handleNav" |
||||
data-index="{{index}}" |
||||
icon="{{imageUrl}}tabbar/{{active==index ? item.iconActive : item.icon}}.png?t={{Timestamp}}" |
||||
> |
||||
<van-tabbar-item class="tab-item" wx:if="{{ index != 3 || !anyWhere}}" bind:tap="handleNav" data-index="{{index}}"> |
||||
<image class="icon" slot="icon" src="/images/tabbar/{{item.icon}}.png?t={{Timestamp}}"></image> |
||||
<image class="icon" slot="icon-active" src="/images/tabbar/{{item.iconActive}}.png?t={{Timestamp}}"></image> |
||||
<view class="name {{index==active && 'active'}}">{{item.text}}</view> |
||||
<view class="hot"></view> |
||||
</van-tabbar-item> |
||||
</block> |
||||
</van-tabbar> |
||||
|
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"doctor-tab-bar": "/doctor/components/doctor-tab-bar/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,91 @@
@@ -0,0 +1,91 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-title { |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
text-align: center; |
||||
} |
||||
|
||||
.page { |
||||
.page-header { |
||||
position: sticky; |
||||
left: 0; |
||||
top: 0; |
||||
z-index: 1; |
||||
background-color: #fff; |
||||
.tabs { |
||||
display: flex; |
||||
align-items: start; |
||||
.tab { |
||||
padding: 24rpx 30rpx; |
||||
font-size: 28rpx; |
||||
color: #342317; |
||||
line-height: 48rpx; |
||||
&.active { |
||||
position: relative; |
||||
color: #ff8a4c; |
||||
&::after { |
||||
position: absolute; |
||||
bottom: 0; |
||||
left: 50%; |
||||
transform: translateX(-50%); |
||||
content: ''; |
||||
width: 32rpx; |
||||
height: 6rpx; |
||||
background: #ff8a4c; |
||||
border-radius: 1998rpx 1998rpx 1998rpx 1998rpx; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.banner { |
||||
padding: 32rpx 40rpx 0; |
||||
height: 204rpx; |
||||
.s-img { |
||||
display: block; |
||||
width: 100%; |
||||
height: 204rpx; |
||||
border-radius: 24rpx; |
||||
} |
||||
} |
||||
.list { |
||||
margin: 32rpx 40rpx 0; |
||||
padding: 0 32rpx; |
||||
border-radius: 24rpx; |
||||
background-color: #fff; |
||||
.card { |
||||
padding: 32rpx 0; |
||||
display: flex; |
||||
gap: 24rpx; |
||||
border-bottom: 1px solid rgba(239, 239, 239, 0.8); |
||||
.photo { |
||||
flex-shrink: 0; |
||||
width: 212rpx; |
||||
height: 140rpx; |
||||
} |
||||
.wrap { |
||||
flex: 1; |
||||
overflow: hidden; |
||||
.title { |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
line-height: 40rpx; |
||||
font-weight: bold; |
||||
} |
||||
.content { |
||||
margin-top: 24rpx; |
||||
font-size: 28rpx; |
||||
color: #b7b7b7; |
||||
white-space: nowrap; |
||||
overflow: hidden; |
||||
text-overflow: ellipsis; |
||||
} |
||||
} |
||||
&:last-of-type{ |
||||
border-bottom: none; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
const _app = getApp<IAppOption>(); |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
}); |
||||
|
||||
export {} |
||||
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
<navbar fixed custom-style="background:#fff"> |
||||
<view slot="title" class="page-title">教育</view> |
||||
</navbar> |
||||
|
||||
<view class="page" style="padding-top: {{pageTop}}px;"> |
||||
<view class="page-header" style="top:{{pageTop}}px"> |
||||
<view class="tabs"> |
||||
<view class="tab active">学习专栏</view> |
||||
<view class="tab">社区热帖</view> |
||||
<view class="tab">行业热点</view> |
||||
<view class="tab">中国药店</view> |
||||
</view> |
||||
</view> |
||||
<swiper class="banner"> |
||||
<swiper-item class="swiper-item"> |
||||
<image class="s-img" src="/images/cache/bg2.png"></image> |
||||
</swiper-item> |
||||
</swiper> |
||||
<view class="list"> |
||||
<view class="card" wx:for="{{10}}" wx:key="index"> |
||||
<image class="photo" src="/images/cache/p{{index%5+1}}.png"></image> |
||||
<view class="wrap"> |
||||
<view class="title">从强降糖到防事件,那些糖尿病指南走过的路</view> |
||||
<view class="content">眼睛是心灵的窗户,但对于糖尿病患者来说,这扇窗显得十分脆弱d</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
||||
<doctor-tab-bar active="{{ 2 }}"></doctor-tab-bar> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"login":"/components/login/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-title { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
} |
||||
|
||||
.page { |
||||
padding: 48rpx 32rpx; |
||||
.input { |
||||
padding: 32rpx; |
||||
font-size: 32rpx; |
||||
border-radius: 24rpx; |
||||
background-color: #fff; |
||||
} |
||||
.place-input { |
||||
color: #b5b8bb; |
||||
} |
||||
.btn { |
||||
margin-top: 160rpx; |
||||
height: 96rpx; |
||||
font-size: 32rpx; |
||||
color: #ffffff; |
||||
line-height: 96rpx; |
||||
text-align: center; |
||||
background: linear-gradient( 90deg, #FECE55 0%, #FF8A4C 100%); |
||||
border-radius: 120rpx 120rpx 120rpx 120rpx; |
||||
} |
||||
} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
<navbar fixed custom-style="background:#fff"> |
||||
<view slot="left" class="page-title"> |
||||
<van-icon class="back" slot="left" name="arrow-left" bind:tap="handleBack" /> |
||||
资料姓名 |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view class="page" style="padding-top: {{pageTop+28}}px;"> |
||||
<input class="input" placeholder-class="place-input" type="text" placeholder="请输入新昵称" /> |
||||
<view class="btn">确认</view> |
||||
</view> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"login":"/components/login/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-title { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
} |
||||
|
||||
.page { |
||||
padding: 48rpx 32rpx; |
||||
.container { |
||||
width: 100%; |
||||
.form { |
||||
padding: 0 32rpx; |
||||
background: #ffffff; |
||||
border-radius: 24rpx; |
||||
.row { |
||||
display: flex; |
||||
align-items: center; |
||||
border-bottom: 1px solid #eef5f5; |
||||
&:last-of-type { |
||||
border: none; |
||||
} |
||||
.input { |
||||
flex: 1; |
||||
padding: 32rpx 0; |
||||
height: 40rpx; |
||||
font-size: 28rpx; |
||||
} |
||||
.place-input { |
||||
color: #b5b8bb; |
||||
} |
||||
.code { |
||||
font-size: 32rpx; |
||||
color: #FF8A4C; |
||||
} |
||||
} |
||||
} |
||||
.submit { |
||||
margin-top: 160rpx; |
||||
height: 96rpx; |
||||
font-size: 32rpx; |
||||
color: #ffffff; |
||||
line-height: 96rpx; |
||||
text-align: center; |
||||
background: linear-gradient( 90deg, #FECE55 0%, #FF8A4C 100%); |
||||
border-radius: 120rpx 120rpx 120rpx 120rpx; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,78 @@
@@ -0,0 +1,78 @@
|
||||
const app = getApp<IAppOption>(); |
||||
let timer = null as null | number; |
||||
|
||||
Page({ |
||||
data: { |
||||
mobile: "", |
||||
code: "", |
||||
|
||||
codeText: "发送验证码", |
||||
}, |
||||
onLoad() {}, |
||||
getCode() { |
||||
if (timer) return; |
||||
const mobile = this.data.mobile; |
||||
if (!mobile) { |
||||
wx.showToast({ |
||||
title: "手机号不能为空", |
||||
icon: "none", |
||||
}); |
||||
return; |
||||
} |
||||
// 验证手机号
|
||||
if (!/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/.test(mobile)) { |
||||
wx.showToast({ |
||||
title: "手机号格式不正确", |
||||
icon: "none", |
||||
}); |
||||
return; |
||||
} |
||||
wx.ajax({ |
||||
method: "POST", |
||||
url: "?r=zd/login/send-verify-code", |
||||
data: { |
||||
mobile, |
||||
}, |
||||
}).then((res) => { |
||||
console.log(res); |
||||
wx.showToast({ |
||||
icon: "none", |
||||
title: "验证码已发送~", |
||||
}); |
||||
let time = 60; |
||||
timer = setInterval(() => { |
||||
time--; |
||||
this.setData({ |
||||
codeText: time + "s后重新发送", |
||||
}); |
||||
if (time <= 0) { |
||||
clearInterval(timer as number); |
||||
timer = null; |
||||
this.setData({ |
||||
codeText: "发送验证码", |
||||
}); |
||||
} |
||||
}, 1000); |
||||
}); |
||||
}, |
||||
handleSubmit() { |
||||
const { mobile, code } = this.data; |
||||
const { registrationSource, registChannel, regBusinessId } = app.globalData; |
||||
wx.ajax({ |
||||
method: "POST", |
||||
url: "?r=zd/account/update-telephone", |
||||
data: { |
||||
mobile, |
||||
code, |
||||
registrationSource, |
||||
registChannel, |
||||
regBusinessId, |
||||
}, |
||||
}).then((_res) => { |
||||
wx.navigateBack(); |
||||
}); |
||||
}, |
||||
handleBack() { |
||||
wx.navigateBack(); |
||||
}, |
||||
}); |
||||
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
<navbar fixed custom-style="background:#fff"> |
||||
<view slot="left" class="page-title"> |
||||
<van-icon class="back" slot="left" name="arrow-left" bind:tap="handleBack" /> |
||||
修改手机号 |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view class="page" style="padding-top: {{pageTop+28}}px;"> |
||||
<view class="container"> |
||||
<view class="form"> |
||||
<view class="row"> |
||||
<input |
||||
type="number" |
||||
model:value="{{mobile}}" |
||||
class="input" |
||||
placeholder-class="place-input" |
||||
placeholder="请输入手机号" |
||||
/> |
||||
</view> |
||||
<view class="row"> |
||||
<input |
||||
type="number" |
||||
model:value="{{code}}" |
||||
class="input" |
||||
placeholder-class="place-input" |
||||
placeholder="请输入验证码" |
||||
/> |
||||
<view class="code" bind:tap="getCode">{{codeText}}</view> |
||||
</view> |
||||
</view> |
||||
<view class="submit" bind:tap="handleSubmit">修改手机号</view> |
||||
</view> |
||||
</view> |
||||
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
{ |
||||
"navigationBarTitleText": "地推端", |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"navbar": "../../../components/navbar/index", |
||||
"doctor-tab-bar": "/doctor/components/doctor-tab-bar/index", |
||||
"ec-canvas": "/components/ec-canvas/ec-canvas" |
||||
} |
||||
} |
||||
@ -0,0 +1,329 @@
@@ -0,0 +1,329 @@
|
||||
page { |
||||
background: #f8fafa; |
||||
} |
||||
.page-switch { |
||||
color: #fff; |
||||
text-align: right; |
||||
font-family: 'Alibaba PuHuiTi 2.0'; |
||||
font-size: 44rpx; |
||||
font-style: normal; |
||||
font-weight: 700; |
||||
line-height: 52rpx; |
||||
.arrow { |
||||
font-size: 28rpx; |
||||
} |
||||
} |
||||
|
||||
.page { |
||||
min-height: 60vh; |
||||
.user { |
||||
margin: 48rpx 0 0 32rpx; |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: start; |
||||
gap: 20rpx; |
||||
.avatar { |
||||
flex-shrink: 0; |
||||
width: 102rpx; |
||||
height: 102rpx; |
||||
border-radius: 50%; |
||||
border: 1px solid #fff; |
||||
} |
||||
.wrap { |
||||
padding-top: 8rpx; |
||||
flex: 1; |
||||
.name { |
||||
font-size: 36rpx; |
||||
color: #ffffff; |
||||
.label { |
||||
margin-top: 8rpx; |
||||
padding: 0 12rpx; |
||||
display: inline-block; |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
border-radius: 6rpx; |
||||
background: linear-gradient(84deg, #fece55 0%, #ffb700 100%); |
||||
} |
||||
} |
||||
.site { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
} |
||||
} |
||||
.code { |
||||
padding: 16rpx 28rpx; |
||||
border: 1px solid #fff; |
||||
border-radius: 24rpx 0 0 24rpx; |
||||
border-right: none; |
||||
background: linear-gradient(180deg, #f57b3d 0%, #ffa64d 100%); |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 8rpx; |
||||
.icon { |
||||
display: block; |
||||
width: 52rpx; |
||||
height: 52rpx; |
||||
} |
||||
.arrow { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
} |
||||
} |
||||
} |
||||
.stat-data { |
||||
margin: 32rpx 32rpx 0; |
||||
padding: 32rpx; |
||||
background: linear-gradient(180deg, #ffeede 0%, #ffffff 12.04%, #ffffff 100%); |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
border: 1px solid #ffffff; |
||||
.s-header { |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.title { |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
font-weight: bold; |
||||
} |
||||
.tip { |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
} |
||||
.card { |
||||
margin-top: 32rpx; |
||||
border: 1px solid #f5f4f3; |
||||
border-radius: 16rpx; |
||||
overflow: hidden; |
||||
.row2 { |
||||
display: flex; |
||||
background: linear-gradient(90deg, #ff8a4c 0%, #fece55 100%); |
||||
border-radius: 16rpx 16rpx 0 0; |
||||
.col { |
||||
flex: 1; |
||||
padding: 28rpx 34rpx; |
||||
.name { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #ffffff; |
||||
line-height: 48rpx; |
||||
} |
||||
} |
||||
.line { |
||||
width: 1px; |
||||
background-color: rgba(238, 245, 245, 0.35); |
||||
} |
||||
} |
||||
.row3 { |
||||
background-color: #fff; |
||||
display: flex; |
||||
.col { |
||||
position: relative; |
||||
padding: 28rpx 34rpx; |
||||
flex: 1; |
||||
.name { |
||||
font-size: 24rpx; |
||||
color: #b7b7b7; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #342317; |
||||
line-height: 48rpx; |
||||
} |
||||
.line { |
||||
position: absolute; |
||||
left: 20rpx; |
||||
bottom: 0; |
||||
width: 168rpx; |
||||
height: 1px; |
||||
background-color: #f5f4f3; |
||||
} |
||||
&:nth-of-type(2) { |
||||
borer: 1px solid #f2f6f8; |
||||
border-right: none; |
||||
border-left: none; |
||||
background-color: #f9f9f9; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.chat-data { |
||||
margin: 32rpx 32rpx; |
||||
padding: 32rpx; |
||||
background: linear-gradient(180deg, #fff6ed 0%, #ffffff 7.03%, #ffffff 100%); |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
border: 1px solid #ffffff; |
||||
.c-header { |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.title { |
||||
font-size: 36rpx; |
||||
color: #342317; |
||||
font-weight: bold; |
||||
} |
||||
.switch-btns { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 24rpx; |
||||
.btn { |
||||
width: 148rpx; |
||||
height: 56rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
background: #ffffff; |
||||
font-size: 28rpx; |
||||
color: #342317; |
||||
border-radius: 1748rpx 1748rpx 1748rpx 1748rpx; |
||||
border: 1px solid rgba(175, 171, 169, 0.2); |
||||
&.active { |
||||
background-color: #ff8a4c; |
||||
color: #fff; |
||||
border-color: #ff8a4c; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.c-options { |
||||
margin-top: 28rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.name { |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
font-weight: bold; |
||||
} |
||||
.picker { |
||||
color: #ffa64d; |
||||
font-size: 28rpx; |
||||
.p-content { |
||||
display: flex; |
||||
align-items: center; |
||||
.content { |
||||
color: #6a605c; |
||||
} |
||||
.icon { |
||||
padding: 20rpx 10rpx; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.card { |
||||
margin-top: 32rpx; |
||||
border: 1px solid #f5f4f3; |
||||
border-radius: 16rpx; |
||||
overflow: hidden; |
||||
.row2 { |
||||
display: flex; |
||||
background: linear-gradient(90deg, #ff8a4c 0%, #fece55 100%); |
||||
border-radius: 16rpx 16rpx 0 0; |
||||
.col { |
||||
flex: 1; |
||||
padding: 28rpx 34rpx; |
||||
.name { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #ffffff; |
||||
line-height: 48rpx; |
||||
} |
||||
} |
||||
.line { |
||||
width: 1px; |
||||
background-color: rgba(238, 245, 245, 0.35); |
||||
} |
||||
} |
||||
.row3 { |
||||
background-color: #fff; |
||||
display: flex; |
||||
.col { |
||||
position: relative; |
||||
padding: 28rpx 34rpx; |
||||
flex: 1; |
||||
.name { |
||||
font-size: 24rpx; |
||||
color: #b7b7b7; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #342317; |
||||
line-height: 48rpx; |
||||
} |
||||
.line { |
||||
position: absolute; |
||||
left: 20rpx; |
||||
bottom: 0; |
||||
width: 168rpx; |
||||
height: 1px; |
||||
background-color: #f5f4f3; |
||||
} |
||||
&:nth-of-type(2) { |
||||
borer: 1px solid #f2f6f8; |
||||
border-right: none; |
||||
border-left: none; |
||||
background-color: #f9f9f9; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.chart-range { |
||||
margin-top: 40rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.picker { |
||||
.p-content { |
||||
padding: 8rpx 38rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 18rpx; |
||||
border-radius: 12rpx 12rpx 12rpx 12rpx; |
||||
border: 1px solid #f2f6f8; |
||||
.content { |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
.icon { |
||||
width: 32rpx; |
||||
height: 32rpx; |
||||
} |
||||
} |
||||
} |
||||
.line { |
||||
width: 24rpx; |
||||
height: 1px; |
||||
background-color: #f2f6f8; |
||||
} |
||||
} |
||||
.chart-container { |
||||
margin-top: 16rpx; |
||||
padding: 15rpx 30rpx; |
||||
width: 100%; |
||||
height: 546rpx; |
||||
box-sizing: border-box; |
||||
} |
||||
.more { |
||||
padding: 20rpx 0 0; |
||||
font-size: 28rpx; |
||||
color: #FF8A4C; |
||||
text-align: center; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,142 @@
@@ -0,0 +1,142 @@
|
||||
import { color } from 'echarts' |
||||
|
||||
const echarts = require('../../../components/ec-canvas/echarts.js') |
||||
|
||||
Page({ |
||||
data: {}, |
||||
ecDataTrendComponent1_1: null as any, |
||||
async onLoad() { |
||||
const app = getApp<IAppOption>() |
||||
app.waitLogin().then(() => { |
||||
const list = [ |
||||
{ StatMonth: '2026-01', MonthInvitePCount: 1 }, |
||||
{ StatMonth: '2026-02', MonthInvitePCount: 2 }, |
||||
] |
||||
this.initChartBar(list) |
||||
}) |
||||
}, |
||||
initChartBar(list: any[]) { |
||||
return new Promise((reslove) => { |
||||
this.ecDataTrendComponent1_1 = this.selectComponent('#chart1_1') |
||||
this.ecDataTrendComponent1_1.init((canvas, width, height, dpr) => { |
||||
const chart = echarts.init(canvas, null, { |
||||
width, |
||||
height, |
||||
devicePixelRatio: dpr, // new
|
||||
}) |
||||
canvas.setChart(chart) |
||||
const x: string[] = [] |
||||
const y1: string[] = [] |
||||
list.forEach((item) => { |
||||
x.push(item.StatMonth) |
||||
y1.push(item.MonthInvitePCount) |
||||
}) |
||||
|
||||
const option = { |
||||
legend: { |
||||
top: 0, |
||||
right: 0, |
||||
itemWidth: 8, |
||||
itemHeight: 8, |
||||
icon: 'rect', |
||||
lineStyle: { |
||||
width: '0', |
||||
}, |
||||
textStyle: { |
||||
color: '#B5B8BB', |
||||
fontSize: '12', |
||||
}, |
||||
}, |
||||
grid: { |
||||
top: '10%', |
||||
left: '3%', |
||||
right: '4%', |
||||
bottom: '0', |
||||
containLabel: true, |
||||
}, |
||||
xAxis: [ |
||||
{ |
||||
type: 'category', |
||||
axisTick: { |
||||
show: false, |
||||
}, |
||||
axisLabel: { |
||||
fontSize: 10, |
||||
color: '#B5B8BB', |
||||
}, |
||||
axisLine: { |
||||
show: false, |
||||
}, |
||||
data: x, |
||||
}, |
||||
], |
||||
yAxis: [ |
||||
{ |
||||
type: 'value', |
||||
minInterval: 1, |
||||
splitLine: { |
||||
lineStyle: { |
||||
type: 'dashed', |
||||
}, |
||||
}, |
||||
axisLabel: { |
||||
fontSize: 10, |
||||
color: '#B5B8BB', |
||||
formatter(value) { |
||||
return Math.abs(value) |
||||
}, |
||||
}, |
||||
}, |
||||
], |
||||
series: [ |
||||
{ |
||||
name: '入组患者数', |
||||
type: 'bar', |
||||
stack: 'a', |
||||
color: '#FF5722', |
||||
barWidth: 12, |
||||
data: y1, |
||||
}, |
||||
{ |
||||
name: '跳转患者数', |
||||
type: 'bar', |
||||
stack: 'a', |
||||
color: '#FF8A4C', |
||||
barWidth: 12, |
||||
data: y1, |
||||
}, |
||||
{ |
||||
name: '邀约患者数', |
||||
type: 'bar', |
||||
stack: 'a', |
||||
width: 4, |
||||
color: '#FFA64D', |
||||
barWidth: 12, |
||||
data: y1, |
||||
}, |
||||
], |
||||
dataZoom: { |
||||
type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。
|
||||
startValue: x.length - 6, |
||||
endValue: x.length - 1, |
||||
filterMode: 'none', |
||||
}, |
||||
} |
||||
|
||||
chart.setOption(option) |
||||
reslove(chart) |
||||
return chart |
||||
}) |
||||
}) |
||||
}, |
||||
handleInvite() { |
||||
wx.navigateTo({ |
||||
url: '/doctor/pages/invite/index', |
||||
}) |
||||
}, |
||||
handleStat() { |
||||
wx.navigateTo({ |
||||
url: '/doctor/pages/stat/index', |
||||
}) |
||||
}, |
||||
}) |
||||
@ -0,0 +1,203 @@
@@ -0,0 +1,203 @@
|
||||
<navbar fixed custom-style="background: {{background}};"> |
||||
<view class="page-switch" slot="left" style="color: {{background=='transparent'?'#fff':'#4A8DFF'}};"> |
||||
特诺雅 |
||||
<van-icon class="arrow" name="arrow-down" /> |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view |
||||
class="page" |
||||
style="background:url('/images/bg7.png') no-repeat top center/100% 602rpx; padding-top: {{pageTop+20}}px" |
||||
> |
||||
<view class="user"> |
||||
<image class="avatar" src="/images/cache/a1.png"></image> |
||||
<view class="wrap"> |
||||
<view class="name"> |
||||
刘平安 |
||||
<view class="label">药师</view> |
||||
</view> |
||||
<div class="site">康泰大药房(人民路店)</div> |
||||
</view> |
||||
<view class="code" bind:tap="handleInvite"> |
||||
<image class="icon" src="/images/icon7.png"></image> |
||||
<van-icon class="arrow" name="arrow" /> |
||||
</view> |
||||
</view> |
||||
<view class="stat-data"> |
||||
<view class="s-header"> |
||||
<view class="title">累计邀约</view> |
||||
<view class="tip">截止昨日数据</view> |
||||
</view> |
||||
<view class="card"> |
||||
<view class="row2"> |
||||
<view class="col"> |
||||
<view class="name">邀约患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">跳转患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">300</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view class="chat-data"> |
||||
<view class="c-header"> |
||||
<view class="title">邀约患者统计</view> |
||||
<view class="switch-btns"> |
||||
<view class="btn">月统计</view> |
||||
<view class="btn active">日统计</view> |
||||
</view> |
||||
</view> |
||||
<view class="c-options"> |
||||
<view class="name">日统计</view> |
||||
<picker class="picker"> |
||||
<view class="p-content"> |
||||
<van-icon class="icon" name="arrow-left" /> |
||||
<view class="content">2025/02/26</view> |
||||
<van-icon class="icon" name="arrow" /> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
<view class="card"> |
||||
<view class="row2"> |
||||
<view class="col"> |
||||
<view class="name">邀约患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">跳转患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">300</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view class="chart-range"> |
||||
<picker class="picker" mode="date" end="{{end}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon13.png"></image> |
||||
</view> |
||||
</picker> |
||||
<view class="line"></view> |
||||
<picker class="picker" mode="date" start="{{satrt}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
<view class="chart-container"> |
||||
<ec-canvas id="chart1_1" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas> |
||||
</view> |
||||
<view class="more" bind:tap="handleStat"> |
||||
查看明细 |
||||
<van-icon name="arrow" /> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
||||
<doctor-tab-bar active="{{ 0 }}"></doctor-tab-bar> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"login":"/components/login/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,101 @@
@@ -0,0 +1,101 @@
|
||||
.page-title { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
font-size: 36rpx; |
||||
color: #ffffff; |
||||
} |
||||
|
||||
.page { |
||||
height: 100vh; |
||||
box-sizing: border-box; |
||||
.page-container { |
||||
margin: 0 40rpx; |
||||
padding: 32rpx 48rpx; |
||||
height: 960rpx; |
||||
box-sizing: border-box; |
||||
.user { |
||||
display: flex; |
||||
gap: 24rpx; |
||||
height: 200rpx; |
||||
.avatar { |
||||
width: 126rpx; |
||||
height: 126rpx; |
||||
border: 1px solid #fff; |
||||
border-radius: 50%; |
||||
} |
||||
.wrap { |
||||
padding-top: 16rpx; |
||||
.nickname { |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
font-weight: bold; |
||||
} |
||||
.label { |
||||
display: inline-block; |
||||
margin-top: 8rpx; |
||||
padding: 0 12rpx; |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
border-radius: 6rpx; |
||||
background: linear-gradient(86deg, #fcd675 0%, #ffb700 100%); |
||||
} |
||||
} |
||||
} |
||||
.title { |
||||
font-size: 40rpx; |
||||
color: #342317; |
||||
text-align: center; |
||||
} |
||||
.brand { |
||||
margin-top: 12rpx; |
||||
.name { |
||||
font-size: 44rpx; |
||||
color: #ff8a4c; |
||||
font-weight: bold; |
||||
text-align: center; |
||||
} |
||||
.bg { |
||||
margin: -12rpx auto 0; |
||||
width: 140rpx; |
||||
height: 16rpx; |
||||
background: linear-gradient(90deg, #fdd260 0%, rgba(253, 210, 96, 0.07) 100%); |
||||
border-radius: 0rpx 0rpx 0rpx 0rpx; |
||||
} |
||||
} |
||||
.code-wrap { |
||||
margin: 64rpx auto 0; |
||||
padding: 10rpx; |
||||
width: 328rpx; |
||||
height: 328rpx; |
||||
border-radius: 50%; |
||||
border: 10rpx solid rgba(255, 166, 77, 0.13); |
||||
.code { |
||||
display: block; |
||||
border-radius: 50%; |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
} |
||||
.tip { |
||||
margin: 52rpx auto 0; |
||||
width: 340rpx; |
||||
height: 76rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
gap: 10rpx; |
||||
font-size: 40rpx; |
||||
color: #ffffff; |
||||
background: #ff8a4c; |
||||
border-radius: 92rpx 92rpx 92rpx 92rpx; |
||||
.dot { |
||||
width: 10rpx; |
||||
height: 10rpx; |
||||
border-radius: 50%; |
||||
background-color: #fff; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
<navbar fixed custom-style="background:transparent"> |
||||
<view slot="left" class="page-title"> |
||||
<van-icon class="back" slot="left" name="arrow-left" bind:tap="handleBack" /> |
||||
专属邀约码 |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view |
||||
class="page" |
||||
style="background: url('/images/bg8.png') no-repeat top center/100% 100vh;padding-top: {{pageTop+87}}px;" |
||||
> |
||||
<view class="page-container" style="background: url('/images/bg9.png') no-repeat top center/100% 964rpx"> |
||||
<view class="user"> |
||||
<image class="avatar" src="/images/cache/a1.png" mode="aspectFill"></image> |
||||
<view class="wrap"> |
||||
<view class="nickname">刘平安</view> |
||||
<view class="label">药师</view> |
||||
</view> |
||||
</view> |
||||
<view class="title">邀请您加入健康管理项目</view> |
||||
<view class="brand"> |
||||
<view class="name">特诺雅</view> |
||||
<view class="bg"></view> |
||||
</view> |
||||
<view class="code-wrap"> |
||||
<image class="code" src="/images/cache/c1.png" show-menu-by-longpress></image> |
||||
</view> |
||||
<view class="tip"> |
||||
<view class="dot"></view> |
||||
扫码立即加入 |
||||
<view class="dot"></view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
{ |
||||
"navigationBarTitleText": "登录", |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"van-divider": "@vant/weapp/divider/index", |
||||
"van-icon": "@vant/weapp/icon/index", |
||||
"navbar": "/components/navbar/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,139 @@
@@ -0,0 +1,139 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-order { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
.item { |
||||
width: 72rpx; |
||||
height: 72rpx; |
||||
font-size: 30rpx; |
||||
color: #342317; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
background: #ffffff; |
||||
border-radius: 50%; |
||||
&.active{ |
||||
color: #fff; |
||||
background-color: #FF8A4C; |
||||
} |
||||
} |
||||
} |
||||
.page { |
||||
min-height: 100vh; |
||||
padding: 460rpx 0 80rpx 0; |
||||
box-sizing: border-box; |
||||
.page-title { |
||||
margin: 0 40rpx; |
||||
width: 614rpx; |
||||
height: 184rpx; |
||||
} |
||||
.container { |
||||
padding: 0 40rpx; |
||||
.content { |
||||
margin-top: 40rpx; |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
line-height: 48rpx; |
||||
.link { |
||||
color: #ff8a4c; |
||||
} |
||||
} |
||||
} |
||||
.phone { |
||||
margin: 54rpx 40rpx 0; |
||||
padding: 30rpx 20rpx; |
||||
border-radius: 64rpx; |
||||
background: linear-gradient(90deg, #fece55 0%, #ff8a4c 100%); |
||||
font-size: 32rpx; |
||||
color: rgba(255, 255, 255, 1); |
||||
line-height: 1; |
||||
&::after { |
||||
border: none; |
||||
outline: none; |
||||
} |
||||
} |
||||
.divider { |
||||
margin: 48rpx auto 0; |
||||
width: 338rpx; |
||||
} |
||||
.tel-code { |
||||
margin: 32rpx auto 0; |
||||
width: 278rpx; |
||||
height: 52rpx; |
||||
display: flex; |
||||
justify-content: center; |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
} |
||||
.form { |
||||
margin: 42rpx 40rpx 0; |
||||
padding: 48rpx 32rpx; |
||||
border-radius: 24rpx; |
||||
background-color: #fff; |
||||
.row { |
||||
margin-bottom: 32rpx; |
||||
display: flex; |
||||
justify-content: space-between; |
||||
border-radius: 12rpx; |
||||
background: #f7f7f7; |
||||
.input { |
||||
flex: 1; |
||||
padding: 22rpx 32rpx; |
||||
height: 40rpx; |
||||
font-size: 32rpx; |
||||
color: #000; |
||||
} |
||||
.input-placeholade { |
||||
color: #b7b7b7; |
||||
} |
||||
.code { |
||||
margin-left: 24rpx; |
||||
flex-shrink: 0; |
||||
width: 262rpx; |
||||
border-radius: 24rpx; |
||||
font-size: 32rpx; |
||||
color: #ff8a4c; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
} |
||||
} |
||||
.submit { |
||||
margin-top: 32px; |
||||
padding: 30rpx 20rpx; |
||||
background: linear-gradient(90deg, #fece55 0%, #ff8a4c 100%); |
||||
border-radius: 64rpx; |
||||
font-size: 32rpx; |
||||
color: #ffffff; |
||||
text-align: center; |
||||
line-height: 1; |
||||
} |
||||
} |
||||
.check { |
||||
margin: 68rpx 50rpx 0; |
||||
display: flex; |
||||
line-height: 60rpx; |
||||
color: #b7b7b7; |
||||
.icon { |
||||
margin-top: 14rpx; |
||||
margin-right: 10rpx; |
||||
flex-shrink: 0; |
||||
width: 32rpx; |
||||
height: 32rpx; |
||||
} |
||||
.link { |
||||
color: #ff8a4c; |
||||
} |
||||
} |
||||
.partient { |
||||
margin-top: 58rpx; |
||||
font-size: 32rpx; |
||||
color: rgba(161, 164, 172, 1); |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
} |
||||
} |
||||
@ -0,0 +1,154 @@
@@ -0,0 +1,154 @@
|
||||
const app = getApp<IAppOption>() |
||||
let timer = null as null | number |
||||
|
||||
Page({ |
||||
data: { |
||||
mobile: '', |
||||
code: '', |
||||
codeText: '发送验证码', |
||||
back: false, |
||||
showForm: false, |
||||
check: false, |
||||
}, |
||||
onLoad(option) { |
||||
if (option.back) { |
||||
this.setData({ |
||||
back: true, |
||||
}) |
||||
} |
||||
}, |
||||
getCode() { |
||||
if (timer) return |
||||
const mobile = this.data.mobile |
||||
if (!mobile) { |
||||
wx.showToast({ |
||||
title: '手机号不能为空', |
||||
icon: 'none', |
||||
}) |
||||
return |
||||
} |
||||
// 验证手机号
|
||||
if (!/^1[3-9,]\d{9}$/.test(mobile)) { |
||||
wx.showToast({ |
||||
title: '手机号格式不正确', |
||||
icon: 'none', |
||||
}) |
||||
return |
||||
} |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/login/send-verify-code', |
||||
data: { |
||||
mobile, |
||||
}, |
||||
}).then((_res) => { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '验证码已发送~', |
||||
}) |
||||
let time = 60 |
||||
timer = setInterval(() => { |
||||
time-- |
||||
this.setData({ |
||||
codeText: `${time}s后重新发送`, |
||||
}) |
||||
if (time <= 0) { |
||||
clearInterval(timer as number) |
||||
timer = null |
||||
this.setData({ |
||||
codeText: '发送验证码', |
||||
}) |
||||
} |
||||
}, 1000) |
||||
}) |
||||
}, |
||||
handleSubmit() { |
||||
if (!this.data.mobile) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请输入手机号', |
||||
}) |
||||
return |
||||
} |
||||
if (!this.data.code) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请输入验证码', |
||||
}) |
||||
return |
||||
} |
||||
if (!this.data.check) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请同意用户协议', |
||||
}) |
||||
return |
||||
} |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/doctor/login/reg-login', |
||||
data: { |
||||
mobile: this.data.mobile, |
||||
code: this.data.code, |
||||
}, |
||||
}).then((_res) => { |
||||
this.submitCallback() |
||||
}) |
||||
}, |
||||
handleWxSubmit(e: WechatMiniprogram.CustomEvent) { |
||||
if (!this.data.check) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请同意用户协议', |
||||
}) |
||||
return |
||||
} |
||||
wx.navigateTo({ |
||||
url: '/doctor/pages/loginForm/index', |
||||
}) |
||||
return |
||||
const { iv, encryptedData } = e.detail |
||||
if (iv && encryptedData) { |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/doctor/login/wx-reg-login', |
||||
data: { |
||||
iv: encodeURIComponent(iv), |
||||
encryptedData: encodeURIComponent(encryptedData), |
||||
}, |
||||
}).then((_res) => { |
||||
this.submitCallback() |
||||
}) |
||||
} |
||||
}, |
||||
submitCallback() { |
||||
app.globalData.loginType = 2 |
||||
app.globalData.isLogin = true |
||||
wx.reLaunch({ |
||||
url: '/doctor/pages/d_home/index', |
||||
}) |
||||
}, |
||||
handlePatient() { |
||||
wx.redirectTo({ |
||||
url: '/pages/login/index', |
||||
}) |
||||
}, |
||||
handleTelCode() { |
||||
this.setData({ |
||||
showForm: !this.data.showForm, |
||||
}) |
||||
}, |
||||
handleLink() { |
||||
wx.navigateTo({ |
||||
url: '/doc/pages/doc1/index', |
||||
}) |
||||
}, |
||||
handleCheck() { |
||||
this.setData({ |
||||
check: !this.data.check, |
||||
}) |
||||
}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
}) |
||||
@ -0,0 +1,60 @@
@@ -0,0 +1,60 @@
|
||||
<navbar fixed custom-style="background:transparent" back> |
||||
<view class="page-order" slot="left"> |
||||
<view class="item active">1</view> |
||||
<view class="item">2</view> |
||||
</view> |
||||
</navbar> |
||||
<view |
||||
class="page" |
||||
style="background: url('/images/bg4.png') no-repeat top center / 100% 710rpx;padding-top: {{pageTop+80}}px;" |
||||
> |
||||
<image class="page-title" src="/images/content2.png"></image> |
||||
<view class="container"> |
||||
<view class="content"> |
||||
在您加入华观健康之前,请您阅读并充分理解 |
||||
<text class="link" bind:tap="handleLink">《个人信息及隐私保护政策》</text> |
||||
了解您的权益及相关数据处理方法,我们将严格按照法律法规及 |
||||
<text class="link" bind:tap="handleLink">《个人信息及隐私保护政策》</text> |
||||
的相关规定保证您的个人信息不受侵犯。 |
||||
</view> |
||||
</view> |
||||
<button wx:if="{{check}}" class="phone" open-type="getPhoneNumber" bindgetphonenumber="handleWxSubmit"> |
||||
手机号快捷登录 |
||||
</button> |
||||
<button wx:else class="phone" bind:tap="handleWxSubmit">手机号快捷登录</button> |
||||
<view class="divider"> |
||||
<van-divider contentPosition="center" textColor="rgba(183,183,183, 0.5)">或者</van-divider> |
||||
</view> |
||||
<view class="tel-code" bind:tap="handleTelCode">使用手机号验证码</view> |
||||
<view class="form" wx:if="{{showForm}}"> |
||||
<view class="row"> |
||||
<input |
||||
type="number" |
||||
model:value="{{mobile}}" |
||||
class="input" |
||||
placeholder-class="input-placeholade" |
||||
placeholder="请输入手机号" |
||||
/> |
||||
</view> |
||||
<view class="row"> |
||||
<input |
||||
type="number" |
||||
model:value="{{code}}" |
||||
class="input" |
||||
placeholder-class="input-placeholade" |
||||
placeholder="请输入验证码" |
||||
/> |
||||
<view class="code" bind:tap="getCode">{{codeText}}</view> |
||||
</view> |
||||
<view class="submit" bind:tap="handleSubmit">立即加入</view> |
||||
</view> |
||||
<view class="check"> |
||||
<image wx:if="{{check}}" class="icon" src="/images/icon18.png" bind:tap="handleCheck"></image> |
||||
<image wx:else class="icon" src="/images/icon12.png" bind:tap="handleCheck"></image> |
||||
<view class="p"> |
||||
我特此同意依照此 |
||||
<text class="link" bind:tap="handleLink">《隐私协议保护政策》</text> |
||||
规定收集我的个人敏感信息 |
||||
</view> |
||||
</view> |
||||
</view> |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
{ |
||||
"navigationBarTitleText": "登录", |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"van-divider": "@vant/weapp/divider/index", |
||||
"van-icon": "@vant/weapp/icon/index", |
||||
"navbar": "/components/navbar/index", |
||||
"van-popup": "@vant/weapp/popup/index", |
||||
"pickerArea": "/components/pickerArea/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,163 @@
@@ -0,0 +1,163 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-order { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
.item { |
||||
width: 72rpx; |
||||
height: 72rpx; |
||||
font-size: 30rpx; |
||||
color: #342317; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
background: #ffffff; |
||||
border-radius: 50%; |
||||
&.active { |
||||
color: #fff; |
||||
background-color: #ff8a4c; |
||||
} |
||||
} |
||||
} |
||||
.page { |
||||
min-height: 100vh; |
||||
padding: 460rpx 0 80rpx 0; |
||||
box-sizing: border-box; |
||||
.page-title { |
||||
margin: 0 40rpx; |
||||
width: 614rpx; |
||||
height: 184rpx; |
||||
} |
||||
.phone { |
||||
margin: 54rpx 40rpx 0; |
||||
padding: 30rpx 20rpx; |
||||
border-radius: 64rpx; |
||||
background: linear-gradient(90deg, #fece55 0%, #ff8a4c 100%); |
||||
font-size: 32rpx; |
||||
color: rgba(255, 255, 255, 1); |
||||
line-height: 1; |
||||
&::after { |
||||
border: none; |
||||
outline: none; |
||||
} |
||||
} |
||||
.form { |
||||
margin: 102rpx 40rpx 0; |
||||
.row { |
||||
margin-bottom: 40rpx; |
||||
padding: 0 32rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
border-radius: 12rpx; |
||||
background-color: #fff; |
||||
.label { |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
} |
||||
.picker, |
||||
.wrap { |
||||
flex: 1; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.input { |
||||
flex: 1; |
||||
padding: 22rpx; |
||||
font-size: 32rpx; |
||||
line-height: 1; |
||||
color: #000; |
||||
} |
||||
.place-input { |
||||
color: #b7b7b7; |
||||
} |
||||
.icon { |
||||
width: 48rpx; |
||||
height: 48rpx; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
.popup { |
||||
.p-header { |
||||
background-color: #fff; |
||||
box-shadow: 0rpx 4rpx 24rpx 0rpx rgba(0, 0, 0, 0.1); |
||||
.title { |
||||
padding: 48rpx 0 32rpx; |
||||
font-size: 36rpx; |
||||
color: #342317; |
||||
font-weight: bold; |
||||
text-align: center; |
||||
} |
||||
.search { |
||||
margin: 0 32rpx; |
||||
padding: 0 20rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
background: #f8fafa; |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
gap: 8rpx; |
||||
.icon { |
||||
width: 44rpx; |
||||
height: 44rpx; |
||||
} |
||||
.input { |
||||
height: 80rpx; |
||||
font-size: 32rpx; |
||||
line-height: 40rpx; |
||||
color: #1a2020; |
||||
} |
||||
.place-input { |
||||
color: #b7b7b7; |
||||
} |
||||
} |
||||
.options { |
||||
display: flex; |
||||
align-items: center; |
||||
.o-item { |
||||
flex: 1; |
||||
padding: 24rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
gap: 8rpx; |
||||
.content { |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
} |
||||
.icon { |
||||
width: 48rpx; |
||||
height: 48rpx; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.p-list { |
||||
padding: 16rpx 32rpx; |
||||
min-height: 30vh; |
||||
max-height: 50vh; |
||||
overflow-y: auto; |
||||
overflow-x: hidden; |
||||
.l-item { |
||||
padding: 32rpx 0; |
||||
.name { |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
line-height: 40rpx; |
||||
} |
||||
.site { |
||||
margin-top: 16rpx; |
||||
font-size: 28rpx; |
||||
color: #b7b7b7; |
||||
line-height: 40rpx; |
||||
border-bottom: 1px solid rgba(245, 244, 243, 0.4); |
||||
&:last-of-type { |
||||
border-bottom: none; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,165 @@
@@ -0,0 +1,165 @@
|
||||
const app = getApp<IAppOption>() |
||||
let timer = null as null | number |
||||
|
||||
Page({ |
||||
data: { |
||||
mobile: '', |
||||
code: '', |
||||
codeText: '发送验证码', |
||||
back: false, |
||||
showForm: false, |
||||
check: false, |
||||
show: false, |
||||
}, |
||||
onLoad(option) { |
||||
if (option.back) { |
||||
this.setData({ |
||||
back: true, |
||||
}) |
||||
} |
||||
}, |
||||
getCode() { |
||||
if (timer) return |
||||
const mobile = this.data.mobile |
||||
if (!mobile) { |
||||
wx.showToast({ |
||||
title: '手机号不能为空', |
||||
icon: 'none', |
||||
}) |
||||
return |
||||
} |
||||
// 验证手机号
|
||||
if (!/^1[3-9,]\d{9}$/.test(mobile)) { |
||||
wx.showToast({ |
||||
title: '手机号格式不正确', |
||||
icon: 'none', |
||||
}) |
||||
return |
||||
} |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/login/send-verify-code', |
||||
data: { |
||||
mobile, |
||||
}, |
||||
}).then((_res) => { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '验证码已发送~', |
||||
}) |
||||
let time = 60 |
||||
timer = setInterval(() => { |
||||
time-- |
||||
this.setData({ |
||||
codeText: `${time}s后重新发送`, |
||||
}) |
||||
if (time <= 0) { |
||||
clearInterval(timer as number) |
||||
timer = null |
||||
this.setData({ |
||||
codeText: '发送验证码', |
||||
}) |
||||
} |
||||
}, 1000) |
||||
}) |
||||
}, |
||||
handleSubmit() { |
||||
if (!this.data.mobile) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请输入手机号', |
||||
}) |
||||
return |
||||
} |
||||
if (!this.data.code) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请输入验证码', |
||||
}) |
||||
return |
||||
} |
||||
if (!this.data.check) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请同意用户协议', |
||||
}) |
||||
return |
||||
} |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/doctor/login/reg-login', |
||||
data: { |
||||
mobile: this.data.mobile, |
||||
code: this.data.code, |
||||
}, |
||||
}).then((_res) => { |
||||
this.submitCallback() |
||||
}) |
||||
}, |
||||
handleWxSubmit(e: WechatMiniprogram.CustomEvent) { |
||||
wx.redirectTo({ |
||||
url: '/doctor/pages/home/index', |
||||
}) |
||||
return |
||||
if (!this.data.check) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请同意用户协议', |
||||
}) |
||||
return |
||||
} |
||||
const { iv, encryptedData } = e.detail |
||||
if (iv && encryptedData) { |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/doctor/login/wx-reg-login', |
||||
data: { |
||||
iv: encodeURIComponent(iv), |
||||
encryptedData: encodeURIComponent(encryptedData), |
||||
}, |
||||
}).then((_res) => { |
||||
this.submitCallback() |
||||
}) |
||||
} |
||||
}, |
||||
submitCallback() { |
||||
app.globalData.loginType = 2 |
||||
app.globalData.isLogin = true |
||||
wx.reLaunch({ |
||||
url: '/doctor/pages/d_home/index', |
||||
}) |
||||
}, |
||||
handlePatient() { |
||||
wx.redirectTo({ |
||||
url: '/pages/login/index', |
||||
}) |
||||
}, |
||||
handleTelCode() { |
||||
this.setData({ |
||||
showForm: !this.data.showForm, |
||||
}) |
||||
}, |
||||
handleLink() { |
||||
wx.navigateTo({ |
||||
url: '/doc/pages/doc1/index', |
||||
}) |
||||
}, |
||||
handleCheck() { |
||||
this.setData({ |
||||
check: !this.data.check, |
||||
}) |
||||
}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
handleDrug() { |
||||
this.setData({ |
||||
show: true, |
||||
}) |
||||
}, |
||||
onClose() { |
||||
this.setData({ |
||||
show: false, |
||||
}) |
||||
}, |
||||
}) |
||||
@ -0,0 +1,65 @@
@@ -0,0 +1,65 @@
|
||||
<navbar fixed custom-style="background:transparent" back> |
||||
<view class="page-order" slot="left"> |
||||
<view class="item active">1</view> |
||||
<view class="item active">2</view> |
||||
</view> |
||||
</navbar> |
||||
<view |
||||
class="page" |
||||
style="background: url('/images/bg4.png') no-repeat top center / 100% 710rpx;padding-top: {{pageTop+80}}px;" |
||||
> |
||||
<image class="page-title" src="/images/content2.png"></image> |
||||
<view class="form"> |
||||
<view class="row"> |
||||
<view class="label">您的身份</view> |
||||
<view class="wrap"> |
||||
<input type="text" class="input" placeholder-class="place-input" placeholder="请输入姓名" /> |
||||
</view> |
||||
</view> |
||||
<view class="row"> |
||||
<view class="label">所属药店</view> |
||||
<view class="wrap" bind:tap="handleDrug"> |
||||
<input disabled type="text" class="input" placeholder-class="place-input" placeholder="选择所属药店" /> |
||||
<image class="icon" src="/images/icon2.png"></image> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<button class="phone" bind:tap="handleWxSubmit">注册</button> |
||||
</view> |
||||
|
||||
<van-popup show="{{ show }}" title="选择所属药店" position="bottom" round closeable bind:close="onClose"> |
||||
<view class="popup"> |
||||
<view class="p-header"> |
||||
<view class="title">选择所属药店</view> |
||||
<view class="search"> |
||||
<image class="icon" src="/images/icon1.png"></image> |
||||
<input |
||||
type="text" |
||||
placeholder="搜索药店名/药师姓名" |
||||
class="input" |
||||
placeholder-class="place-input" |
||||
confirm-type="search" |
||||
bindconfirm="handleSearch" |
||||
/> |
||||
</view> |
||||
<pickerArea bindchange="handleChange"> |
||||
<view class="options"> |
||||
<view class="o-item"> |
||||
<view class="content">请选择省份</view> |
||||
<image class="icon" src="/images/icon2.png"></image> |
||||
</view> |
||||
<view class="o-item"> |
||||
<view class="content">请选择省份</view> |
||||
<image class="icon" src="/images/icon2.png"></image> |
||||
</view> |
||||
</view> |
||||
</pickerArea> |
||||
</view> |
||||
<view class="p-list"> |
||||
<view class="l-item"> |
||||
<view class="name">北京同仁堂昌平东关药店(医保定点)</view> |
||||
<view class="site">北京市昌平区府学路3号一层101号(昌平东关地铁站A西北口步行180米)</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</van-popup> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationBarTitleText": "地推端", |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"navbar": "../../../components/navbar/index", |
||||
"doctor-tab-bar": "/doctor/components/doctor-tab-bar/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,99 @@
@@ -0,0 +1,99 @@
|
||||
page { |
||||
background: #f8fafa; |
||||
} |
||||
|
||||
.page { |
||||
min-height: 60vh; |
||||
.user { |
||||
position: relative; |
||||
margin: 100rpx 32rpx 0; |
||||
padding: 112rpx 32rpx 32rpx; |
||||
background: linear-gradient(to bottom, rgba(255, 255, 255, 0.72) 0%, #ffffff 100%); |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
border: 2rpx solid #ffffff; |
||||
backdrop-filter: blur(16rpx); |
||||
.avatar { |
||||
position: absolute; |
||||
top: 0; |
||||
left: 50%; |
||||
transform: translate(-50%, -50%); |
||||
.a-img { |
||||
width: 186rpx; |
||||
height: 186rpx; |
||||
border-radius: 50%; |
||||
border: 1px solid #fff; |
||||
} |
||||
.edit { |
||||
position: absolute; |
||||
bottom: 16rpx; |
||||
right: 16rpx; |
||||
width: 34rpx; |
||||
height: 34rpx; |
||||
border-radius: 50%; |
||||
border: 1px solid #fff; |
||||
background-color: #ff8a4c; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
.icon { |
||||
width: 20rpx; |
||||
height: 20rpx; |
||||
} |
||||
} |
||||
} |
||||
.name { |
||||
font-size: 40rpx; |
||||
color: #342317; |
||||
font-weight: bold; |
||||
text-align: center; |
||||
} |
||||
.phone { |
||||
margin-top: 12rpx; |
||||
font-size: 32rpx; |
||||
color: #b5b8bb; |
||||
text-align: center; |
||||
} |
||||
} |
||||
.list { |
||||
margin: 32rpx 32rpx 0; |
||||
border-radius: 24rpx; |
||||
background-color: #fff; |
||||
.list-item { |
||||
padding: 34rpx 32rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
gap: 24rpx; |
||||
.icon { |
||||
flex-shrink: 0; |
||||
width: 44rpx; |
||||
height: 44rpx; |
||||
} |
||||
.title { |
||||
flex: 1; |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
line-height: 48rpx; |
||||
.content { |
||||
font-size: 28rpx; |
||||
color: #9b9998; |
||||
} |
||||
} |
||||
.arrow { |
||||
font-size: 36rpx; |
||||
color: #958b86; |
||||
} |
||||
} |
||||
} |
||||
.exit { |
||||
margin: 64rpx 32rpx 0; |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
height: 96rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
background-color: #fff; |
||||
border-radius: 24rpx; |
||||
} |
||||
} |
||||
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleNickname() { |
||||
wx.navigateTo({ |
||||
url: '/doctor/pages/changeNickname/index', |
||||
}) |
||||
}, |
||||
handleTel() { |
||||
wx.navigateTo({ |
||||
url: '/doctor/pages/changeTel/index', |
||||
}) |
||||
}, |
||||
handleInvite() { |
||||
wx.navigateTo({ |
||||
url: '/doctor/pages/invite/index', |
||||
}) |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,41 @@
@@ -0,0 +1,41 @@
|
||||
<navbar fixed custom-style="background: transparent;"></navbar> |
||||
|
||||
<view |
||||
class="page" |
||||
style="background:url('/images/bg7.png') no-repeat top center/100% 602rpx; padding-top: {{pageTop+20}}px" |
||||
> |
||||
<view class="user"> |
||||
<view class="avatar"> |
||||
<image class="a-img" src="/images/cache/a1.png"></image> |
||||
<view class="edit"> |
||||
<image class="icon" src="/images/icon3.png"></image> |
||||
</view> |
||||
</view> |
||||
<view class="name">刘平安</view> |
||||
<view class="phone">康泰大药房(人民路店)</view> |
||||
</view> |
||||
<view class="list"> |
||||
<view class="list-item" bind:tap="handleNickname"> |
||||
<image class="icon" src="/images/icon14.png"></image> |
||||
<view class="title">修改姓名</view> |
||||
<van-icon class="arrow" name="arrow" /> |
||||
</view> |
||||
<view class="list-item" bind:tap="handleTel"> |
||||
<image class="icon" src="/images/icon15.png"></image> |
||||
<view class="title">修改手机号</view> |
||||
<van-icon class="arrow" name="arrow" /> |
||||
</view> |
||||
<view class="list-item" bind:tap="handleInvite"> |
||||
<image class="icon" src="/images/icon16.png"></image> |
||||
<view class="title">我的邀约码</view> |
||||
<van-icon class="arrow" name="arrow" /> |
||||
</view> |
||||
<view class="list-item"> |
||||
<image class="icon" src="/images/icon17.png"></image> |
||||
<view class="title">我的邀约人 <text class="content">(王建设 12345678901)</text></view> |
||||
</view> |
||||
</view> |
||||
<view class="exit">退出登录</view> |
||||
</view> |
||||
|
||||
<doctor-tab-bar active="{{ 2 }}"></doctor-tab-bar> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"navbar": "../../../components/navbar/index", |
||||
"doctor-tab-bar": "/doctor/components/doctor-tab-bar/index", |
||||
"popup":"/components/popup/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,285 @@
@@ -0,0 +1,285 @@
|
||||
page { |
||||
background-color: #f7f7f7; |
||||
} |
||||
.page-switch { |
||||
color: #ff8a4c; |
||||
text-align: right; |
||||
font-size: 40rpx; |
||||
font-style: normal; |
||||
font-weight: 700; |
||||
line-height: 52rpx; |
||||
.arrow { |
||||
font-size: 28rpx; |
||||
color: #b7b7b7; |
||||
} |
||||
} |
||||
|
||||
.page { |
||||
.page-header { |
||||
padding-bottom: 32rpx; |
||||
background: linear-gradient(0, #ffffff 0%, #fff1ea 100%); |
||||
box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(26, 32, 32, 0.04); |
||||
.search { |
||||
margin: 0 32rpx; |
||||
padding: 0 20rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
background: #ffffff; |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
gap: 8rpx; |
||||
border: 1px solid rgba(245, 244, 243, 0.47); |
||||
.icon { |
||||
width: 44rpx; |
||||
height: 44rpx; |
||||
} |
||||
.input { |
||||
height: 80rpx; |
||||
font-size: 32rpx; |
||||
line-height: 40rpx; |
||||
color: #1a2020; |
||||
} |
||||
.place-input { |
||||
color: #b7b7b7; |
||||
} |
||||
} |
||||
.row { |
||||
margin: 24rpx 32rpx 0; |
||||
display: grid; |
||||
grid-template-columns: repeat(2, 1fr); |
||||
gap: 22rpx; |
||||
.col { |
||||
padding: 10rpx 16rpx 10rpx 24rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
background-color: #f7f7f7; |
||||
border-radius: 12rpx; |
||||
.label { |
||||
flex-shrink: 0; |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
} |
||||
.content { |
||||
flex: 1; |
||||
font-size: 32rpx; |
||||
color: #b5b8bb; |
||||
overflow: hidden; |
||||
text-overflow: ellipsis; |
||||
white-space: nowrap; |
||||
} |
||||
.icon { |
||||
flex-shrink: 0; |
||||
width: 44rpx; |
||||
height: 44rpx; |
||||
} |
||||
} |
||||
.total { |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
text-align: right; |
||||
.num { |
||||
color: #ff8a4c; |
||||
} |
||||
} |
||||
} |
||||
.range { |
||||
margin: 22rpx 32rpx 0; |
||||
padding: 0 16rpx 0 24rpx; |
||||
background-color: #f7f7f7; |
||||
border-radius: 12rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.label { |
||||
flex-shrink: 0; |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
} |
||||
.picker { |
||||
flex: 1; |
||||
.date { |
||||
padding: 10rpx 0; |
||||
text-align: center; |
||||
font-size: 32rpx; |
||||
color: #b5b8bb; |
||||
line-height: 44rpx; |
||||
} |
||||
} |
||||
.line { |
||||
margin: 0 10rpx; |
||||
width: 24rpx; |
||||
height: 1px; |
||||
background-color: rgba(181, 184, 187, 0.25); |
||||
} |
||||
.icon { |
||||
width: 44rpx; |
||||
height: 44rpx; |
||||
} |
||||
} |
||||
} |
||||
.card { |
||||
margin: 32rpx; |
||||
padding: 32rpx; |
||||
background: linear-gradient(0deg, #fff6ed 0%, #ffffff 21.63%, #ffffff 100%); |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
border: 2rpx solid #ffffff; |
||||
.user { |
||||
display: flex; |
||||
.avatar { |
||||
flex-shrink: 0; |
||||
width: 116rpx; |
||||
height: 116rpx; |
||||
border-radius: 50%; |
||||
} |
||||
.wrap { |
||||
padding-top: 8rpx; |
||||
padding-left: 24rpx; |
||||
.info { |
||||
.name { |
||||
padding-right: 12rpx; |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
} |
||||
.tel { |
||||
font-size: 28rpx; |
||||
color: #342317; |
||||
} |
||||
} |
||||
.site { |
||||
margin-top: 8rpx; |
||||
font-size: 28rpx; |
||||
color: #342317; |
||||
} |
||||
.date { |
||||
margin-top: 8rpx; |
||||
font-size: 28rpx; |
||||
color: #b7b7b7; |
||||
} |
||||
} |
||||
} |
||||
.container { |
||||
margin-top: 32rpx; |
||||
padding-bottom: 32rpx; |
||||
border-radius: 12rpx; |
||||
background-color: rgba(247, 247, 247, 0.6); |
||||
.c-item { |
||||
display: flex; |
||||
.aside { |
||||
display: flex; |
||||
flex-direction: column; |
||||
align-items: flex-end; |
||||
.line-top { |
||||
flex-shrink: 0; |
||||
margin-right: 9rpx; |
||||
height: 32rpx; |
||||
border-right: 1px dashed #d9d9d9; |
||||
} |
||||
.step { |
||||
margin: -6rpx 0; |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 12rpx; |
||||
.name { |
||||
padding: 0 0 0 12rpx; |
||||
font-size: 28rpx; |
||||
color: #b7b7b7; |
||||
} |
||||
.order { |
||||
flex-shrink: 0; |
||||
width: 20rpx; |
||||
height: 20rpx; |
||||
background: rgba(217, 217, 217, 0.26); |
||||
border-radius: 50%; |
||||
&::after { |
||||
margin: 4rpx auto; |
||||
content: ''; |
||||
display: block; |
||||
width: 12rpx; |
||||
height: 12rpx; |
||||
border-radius: 50%; |
||||
background: #d9d9d9; |
||||
} |
||||
} |
||||
} |
||||
.line-bottom { |
||||
flex: 1; |
||||
margin-right: 9rpx; |
||||
height: 32rpx; |
||||
border-right: 1px dashed #d9d9d9; |
||||
} |
||||
} |
||||
.wrap { |
||||
flex: 1; |
||||
margin: 0 16rpx; |
||||
padding-top: 24rpx; |
||||
padding-bottom: 32rpx; |
||||
border-bottom: 1px solid #efefef; |
||||
.date { |
||||
font-size: 32rpx; |
||||
color: #342317; |
||||
} |
||||
.status { |
||||
margin-top: 28rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 32rpx; |
||||
font-size: 32rpx; |
||||
.s1 { |
||||
color: #4a8dff; |
||||
} |
||||
.s2 { |
||||
color: #e86854; |
||||
} |
||||
.btn1 { |
||||
color: #ff8a4c; |
||||
text-decoration: underline; |
||||
text-underline-offset: 4rpx; |
||||
} |
||||
.btn2 { |
||||
width: 160rpx; |
||||
height: 48rpx; |
||||
background: #ff8a4c; |
||||
border-radius: 88rpx 88rpx 88rpx 88rpx; |
||||
text-align: center; |
||||
line-height: 48rpx; |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
} |
||||
} |
||||
.remark { |
||||
margin-top: 16rpx; |
||||
font-size: 32rpx; |
||||
color: #e86854; |
||||
} |
||||
} |
||||
&.active { |
||||
.aside { |
||||
.step { |
||||
.name { |
||||
color: #ff8a4c; |
||||
background: linear-gradient(to right, rgba(255, 138, 76, 0.16) 0%, transparent 100%); |
||||
} |
||||
.order { |
||||
background: rgba(255, 138, 76, 0.18); |
||||
&::after { |
||||
background: #ff8a4c; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
&:first-of-type { |
||||
.line-top { |
||||
border-right: none; |
||||
} |
||||
} |
||||
&:last-of-type { |
||||
.wrap { |
||||
padding-bottom: 0; |
||||
border-bottom: none; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: { |
||||
popupShow: false, |
||||
popupType: 'popup1', |
||||
popupParams: {}, |
||||
}, |
||||
onLoad() {}, |
||||
handleUpload() { |
||||
this.setData({ |
||||
popupShow: true, |
||||
popupType: 'popup1', |
||||
}) |
||||
}, |
||||
handlePopupOk() { |
||||
this.setData({ |
||||
popupShow: false, |
||||
}) |
||||
}, |
||||
handlePopupCancel() { |
||||
this.setData({ |
||||
popupShow: false, |
||||
}) |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,125 @@
@@ -0,0 +1,125 @@
|
||||
<navbar fixed custom-style="background: {{background}};"> |
||||
<view class="page-switch" slot="left"> |
||||
特诺雅 |
||||
<van-icon class="arrow" name="arrow-down" /> |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view class="page"> |
||||
<view class="page-header" style="padding-top: {{pageTop+20}}px"> |
||||
<view class="search"> |
||||
<image class="icon" src="/images/icon1.png"></image> |
||||
<input |
||||
type="text" |
||||
placeholder="搜索药店名/药师姓名" |
||||
class="input" |
||||
placeholder-class="place-input" |
||||
confirm-type="search" |
||||
bindconfirm="handleSearch" |
||||
/> |
||||
</view> |
||||
<view class="row"> |
||||
<picker mode="region"> |
||||
<view class="col"> |
||||
<view class="label">跳转:</view> |
||||
<view class="content">全部</view> |
||||
<image class="icon" src="/images/icon2.png"></image> |
||||
</view> |
||||
</picker> |
||||
<picker mode="region"> |
||||
<view class="col"> |
||||
<view class="label">入组:</view> |
||||
<view class="content">全部</view> |
||||
<image class="icon" src="/images/icon2.png"></image> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
<view class="range"> |
||||
<view class="label">时间筛选:</view> |
||||
<picker class="picker" mode="date"> |
||||
<view class="date">开始时间</view> |
||||
</picker> |
||||
<view class="line"></view> |
||||
<picker class="picker" mode="date"> |
||||
<view class="date">开始时间</view> |
||||
</picker> |
||||
<image class="icon" src="/images/icon2.png"></image> |
||||
</view> |
||||
<view class="row"> |
||||
<picker mode="region"> |
||||
<view class="col"> |
||||
<view class="label">时间类型:</view> |
||||
<view class="content">全部</view> |
||||
<image class="icon" src="/images/icon2.png"></image> |
||||
</view> |
||||
</picker> |
||||
<view class="total"> |
||||
已邀约总人数: |
||||
<text class="num">28人</text> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view class="page-container"> |
||||
<view class="card"> |
||||
<view class="user"> |
||||
<image class="avatar" src="/images/cache/a2.png"></image> |
||||
<view class="wrap"> |
||||
<view class="info"> |
||||
<text class="name">张患者</text> |
||||
<text class="tel">13800138000</text> |
||||
</view> |
||||
<view class="site">康泰大药房(人民路店)</view> |
||||
<view class="date">绑定时间:2026/01/10 16:27:35</view> |
||||
</view> |
||||
</view> |
||||
<view class="container"> |
||||
<view class="c-item"> |
||||
<view class="aside"> |
||||
<view class="line-top"></view> |
||||
<view class="step"> |
||||
<view class="name">未跳转</view> |
||||
<view class="order"></view> |
||||
</view> |
||||
<view class="line-bottom"></view> |
||||
</view> |
||||
<view class="wrap"> |
||||
<view class="date">2026/01/10 16:27:35</view> |
||||
<view class="status"> |
||||
<view class="s1">审核中</view> |
||||
<view class="btn1">查看提交材料</view> |
||||
</view> |
||||
<view class="remark">材料信息不全</view> |
||||
</view> |
||||
</view> |
||||
<view class="c-item active"> |
||||
<view class="aside"> |
||||
<view class="line-top"></view> |
||||
<view class="step"> |
||||
<view class="name">未跳转</view> |
||||
<view class="order"></view> |
||||
</view> |
||||
<view class="line-bottom"></view> |
||||
</view> |
||||
<view class="wrap"> |
||||
<view class="date">2026/01/10 16:27:35</view> |
||||
<view class="status"> |
||||
<view class="s2">驳回</view> |
||||
<view class="btn2" bind:tap="handleUpload">重新提交</view> |
||||
</view> |
||||
<view class="remark">材料信息不全</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
||||
<doctor-tab-bar active="{{ 1 }}"></doctor-tab-bar> |
||||
|
||||
<popup |
||||
show="{{popupShow}}" |
||||
type="{{popupType}}" |
||||
params="{{popupParams}}" |
||||
bind:ok="handlePopupOk" |
||||
bind:cancel="handlePopupCancel" |
||||
></popup> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"login":"/components/login/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,199 @@
@@ -0,0 +1,199 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-title { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
font-size: 36rpx; |
||||
color: #1A2020; |
||||
} |
||||
|
||||
.page { |
||||
.page-header { |
||||
position: sticky; |
||||
left: 0; |
||||
top: 0; |
||||
padding: 32rpx; |
||||
background-color: #fff; |
||||
.chart-range { |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
gap: 16rpx; |
||||
.picker { |
||||
flex: 1; |
||||
.p-content { |
||||
padding: 8rpx 38rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 18rpx; |
||||
border-radius: 12rpx 12rpx 12rpx 12rpx; |
||||
border: 1px solid #f2f6f8; |
||||
.content { |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
.icon { |
||||
width: 32rpx; |
||||
height: 32rpx; |
||||
} |
||||
} |
||||
} |
||||
.line { |
||||
width: 24rpx; |
||||
height: 1px; |
||||
background-color: #f2f6f8; |
||||
} |
||||
} |
||||
} |
||||
.stat-card { |
||||
margin: 24rpx 32rpx 0; |
||||
padding: 32rpx 0; |
||||
background-color: #fff; |
||||
border-radius: 24rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.col { |
||||
flex: 1; |
||||
text-align: center; |
||||
.num { |
||||
font-size: 48rpx; |
||||
color: #FF8A4C; |
||||
font-weight: bold; |
||||
line-height: 56rpx; |
||||
.sub { |
||||
font-size: 24rpx; |
||||
color: #b5b8bb; |
||||
font-weight: normal; |
||||
} |
||||
} |
||||
.title { |
||||
margin-top: 6rpx; |
||||
font-size: 24rpx; |
||||
color: #1a2020; |
||||
line-height: 36rpx; |
||||
} |
||||
} |
||||
} |
||||
.stat-list { |
||||
margin: 0 32rpx 0; |
||||
.module { |
||||
display: flex; |
||||
gap: 10rpx; |
||||
.aside { |
||||
display: flex; |
||||
align-items: center; |
||||
flex-direction: column; |
||||
gap: 14rpx; |
||||
.line-top { |
||||
flex-shrink: 0; |
||||
height: 40rpx; |
||||
width: 0; |
||||
border-right: 1px dashed #FF8A4C; |
||||
} |
||||
.dot { |
||||
flex-shrink: 0; |
||||
width: 24rpx; |
||||
height: 24rpx; |
||||
background: rgba(255,138,76,0.18); |
||||
border-radius: 50%; |
||||
&::after { |
||||
margin: 4rpx auto; |
||||
content: ''; |
||||
display: block; |
||||
width: 16rpx; |
||||
height: 16rpx; |
||||
border-radius: 50%; |
||||
background-color: #FF8A4C; |
||||
} |
||||
} |
||||
.line-bottom { |
||||
flex: 1; |
||||
height: 40rpx; |
||||
width: 0; |
||||
border-right: 1px dashed #FF8A4C; |
||||
} |
||||
} |
||||
.m-container { |
||||
padding-top: 46rpx; |
||||
.date { |
||||
font-size: 32rpx; |
||||
color: #4a5555; |
||||
} |
||||
.card { |
||||
margin-top: 24rpx; |
||||
border: 1px solid #f2f6f8; |
||||
border-radius: 16rpx; |
||||
overflow: hidden; |
||||
.row2 { |
||||
display: flex; |
||||
background: linear-gradient( 90deg, #FF8A4C 0%, #FECE55 100%); |
||||
border-radius: 16rpx 16rpx 0 0; |
||||
.col { |
||||
flex: 1; |
||||
padding: 28rpx 34rpx; |
||||
.name { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #ffffff; |
||||
line-height: 48rpx; |
||||
} |
||||
} |
||||
.line { |
||||
width: 1px; |
||||
background-color: rgba(238, 245, 245, 0.35); |
||||
} |
||||
} |
||||
.row3 { |
||||
display: flex; |
||||
.col { |
||||
position: relative; |
||||
padding: 28rpx 34rpx; |
||||
flex: 1; |
||||
background-color: #fff; |
||||
.name { |
||||
font-size: 24rpx; |
||||
color: #b5b8bb; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #1a2020; |
||||
line-height: 48rpx; |
||||
} |
||||
.line { |
||||
position: absolute; |
||||
left: 20rpx; |
||||
bottom: 0; |
||||
width: 168rpx; |
||||
height: 1px; |
||||
background-color: rgba(242, 246, 248, 0.47); |
||||
} |
||||
&:nth-of-type(2) { |
||||
borer: 1px solid #eef5f5; |
||||
border-right: none; |
||||
border-left: none; |
||||
background-color: #f8fafa; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
&:first-of-type { |
||||
.aside { |
||||
.line-top { |
||||
opacity: 0; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,125 @@
@@ -0,0 +1,125 @@
|
||||
<navbar fixed custom-style="background:#fff"> |
||||
<view slot="left" class="page-title"> |
||||
<van-icon class="back" slot="left" name="arrow-left" bind:tap="handleBack" /> |
||||
专属邀约码 |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view class="page" style="padding-top: {{pageTop}}px;"> |
||||
<view class="page-header" style="top:{{pageTop}}px"> |
||||
<view class="chart-range"> |
||||
<picker class="picker" mode="date" end="{{end}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon13.png"></image> |
||||
</view> |
||||
</picker> |
||||
<view class="line"></view> |
||||
<picker class="picker" mode="date" start="{{satrt}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon13.png"></image> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
</view> |
||||
<view class="stat-card"> |
||||
<view class="col"> |
||||
<view class="num"> |
||||
1893 |
||||
<text class="sub">人</text> |
||||
</view> |
||||
<view class="title">邀约患者总数</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="num"> |
||||
1893 |
||||
<text class="sub">人</text> |
||||
</view> |
||||
<view class="title">跳转患者数</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="num"> |
||||
1893 |
||||
<text class="sub">人</text> |
||||
</view> |
||||
<view class="title">跳转患者数</view> |
||||
</view> |
||||
</view> |
||||
<view class="stat-list"> |
||||
<view class="module"> |
||||
<view class="aside"> |
||||
<view class="line-top"></view> |
||||
<view class="dot"></view> |
||||
<view class="line-bottom"></view> |
||||
</view> |
||||
<view class="m-container"> |
||||
<view class="date">2025/02/26</view> |
||||
<view class="card"> |
||||
<view class="row2"> |
||||
<view class="col"> |
||||
<view class="name">邀约患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">跳转患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">300</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
/* custom-tab-bar/index.wxss */ |
||||
|
||||
.tab-item { |
||||
.icon { |
||||
width: 40rpx; |
||||
height: 40rpx; |
||||
} |
||||
.name { |
||||
font-size: 24rpx; |
||||
color: #4a5555; |
||||
&.active { |
||||
color: #4a8dff; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,47 @@
@@ -0,0 +1,47 @@
|
||||
const app = getApp() |
||||
|
||||
Component({ |
||||
properties: { |
||||
active: { |
||||
type: Number, |
||||
value: 0, |
||||
}, |
||||
}, |
||||
data: { |
||||
imageUrl: app.globalData.imageUrl, |
||||
isChild: 0, |
||||
active: 0, |
||||
list: [ |
||||
{ |
||||
pagePath: '/ground/pages/home/index', |
||||
text: '首页', |
||||
icon: 'tab1', |
||||
iconActive: 'tab1-active', |
||||
}, |
||||
{ |
||||
pagePath: '/ground/pages/pharmacist/index', |
||||
text: '药师管理', |
||||
icon: 'tab2', |
||||
iconActive: 'tab2-active', |
||||
}, |
||||
{ |
||||
pagePath: '/ground/pages/my/index', |
||||
text: '我的', |
||||
icon: 'tab3', |
||||
iconActive: 'tab3-active', |
||||
}, |
||||
], |
||||
}, |
||||
observers: {}, |
||||
methods: { |
||||
onChange() {}, |
||||
handleNav(e) { |
||||
const { index } = e.currentTarget.dataset |
||||
const { list } = this.data |
||||
const { pagePath } = list[index] |
||||
wx.reLaunch({ |
||||
url: pagePath, |
||||
}) |
||||
}, |
||||
}, |
||||
}) |
||||
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
<van-tabbar active="{{ active }}" active-color="#F23A2F" bind:change="onChange" inactive-color="#010105" placeholder> |
||||
<block wx:for="{{list}}" wx:key="*this"> |
||||
<van-tabbar-item class="tab-item" wx:if="{{ index != 3 || !anyWhere}}" bind:tap="handleNav" data-index="{{index}}"> |
||||
<image class="icon" slot="icon" src="/images/tabbar/{{item.icon}}.png?t={{Timestamp}}"></image> |
||||
<image class="icon" slot="icon-active" src="/images/tabbar/{{item.iconActive}}.png?t={{Timestamp}}"></image> |
||||
<view class="name {{index==active && 'active'}}">{{item.text}}</view> |
||||
</van-tabbar-item> |
||||
</block> |
||||
</van-tabbar> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"login":"/components/login/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-title { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
} |
||||
|
||||
.page { |
||||
padding: 48rpx 32rpx; |
||||
.input { |
||||
padding: 32rpx; |
||||
font-size: 32rpx; |
||||
border-radius: 24rpx; |
||||
background-color: #fff; |
||||
} |
||||
.place-input { |
||||
color: #b5b8bb; |
||||
} |
||||
.btn { |
||||
margin-top: 160rpx; |
||||
height: 96rpx; |
||||
font-size: 32rpx; |
||||
color: #ffffff; |
||||
line-height: 96rpx; |
||||
text-align: center; |
||||
background: linear-gradient(268deg, #5393ff 0%, #3edec9 100%); |
||||
border-radius: 120rpx 120rpx 120rpx 120rpx; |
||||
} |
||||
} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
<navbar fixed custom-style="background:#fff"> |
||||
<view slot="left" class="page-title"> |
||||
<van-icon class="back" slot="left" name="arrow-left" bind:tap="handleBack" /> |
||||
资料姓名 |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view class="page" style="padding-top: {{pageTop+28}}px;"> |
||||
<input class="input" placeholder-class="place-input" type="text" placeholder="请输入新昵称" /> |
||||
<view class="btn">确认</view> |
||||
</view> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"login":"/components/login/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,53 @@
@@ -0,0 +1,53 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-title { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
} |
||||
|
||||
.page { |
||||
padding: 48rpx 32rpx; |
||||
.container { |
||||
width: 100%; |
||||
.form { |
||||
padding: 0 32rpx; |
||||
background: #ffffff; |
||||
border-radius: 24rpx; |
||||
.row { |
||||
display: flex; |
||||
align-items: center; |
||||
border-bottom: 1px solid #eef5f5; |
||||
&:last-of-type { |
||||
border: none; |
||||
} |
||||
.input { |
||||
flex: 1; |
||||
padding: 32rpx 0; |
||||
height: 40rpx; |
||||
font-size: 28rpx; |
||||
} |
||||
.place-input { |
||||
color: #b5b8bb; |
||||
} |
||||
.code { |
||||
font-size: 32rpx; |
||||
color: #4a8dff; |
||||
} |
||||
} |
||||
} |
||||
.submit { |
||||
margin-top: 160rpx; |
||||
height: 96rpx; |
||||
font-size: 32rpx; |
||||
color: #ffffff; |
||||
line-height: 96rpx; |
||||
text-align: center; |
||||
background: linear-gradient(268deg, #5393ff 0%, #3edec9 100%); |
||||
border-radius: 120rpx 120rpx 120rpx 120rpx; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,78 @@
@@ -0,0 +1,78 @@
|
||||
const app = getApp<IAppOption>(); |
||||
let timer = null as null | number; |
||||
|
||||
Page({ |
||||
data: { |
||||
mobile: "", |
||||
code: "", |
||||
|
||||
codeText: "发送验证码", |
||||
}, |
||||
onLoad() {}, |
||||
getCode() { |
||||
if (timer) return; |
||||
const mobile = this.data.mobile; |
||||
if (!mobile) { |
||||
wx.showToast({ |
||||
title: "手机号不能为空", |
||||
icon: "none", |
||||
}); |
||||
return; |
||||
} |
||||
// 验证手机号
|
||||
if (!/^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/.test(mobile)) { |
||||
wx.showToast({ |
||||
title: "手机号格式不正确", |
||||
icon: "none", |
||||
}); |
||||
return; |
||||
} |
||||
wx.ajax({ |
||||
method: "POST", |
||||
url: "?r=zd/login/send-verify-code", |
||||
data: { |
||||
mobile, |
||||
}, |
||||
}).then((res) => { |
||||
console.log(res); |
||||
wx.showToast({ |
||||
icon: "none", |
||||
title: "验证码已发送~", |
||||
}); |
||||
let time = 60; |
||||
timer = setInterval(() => { |
||||
time--; |
||||
this.setData({ |
||||
codeText: time + "s后重新发送", |
||||
}); |
||||
if (time <= 0) { |
||||
clearInterval(timer as number); |
||||
timer = null; |
||||
this.setData({ |
||||
codeText: "发送验证码", |
||||
}); |
||||
} |
||||
}, 1000); |
||||
}); |
||||
}, |
||||
handleSubmit() { |
||||
const { mobile, code } = this.data; |
||||
const { registrationSource, registChannel, regBusinessId } = app.globalData; |
||||
wx.ajax({ |
||||
method: "POST", |
||||
url: "?r=zd/account/update-telephone", |
||||
data: { |
||||
mobile, |
||||
code, |
||||
registrationSource, |
||||
registChannel, |
||||
regBusinessId, |
||||
}, |
||||
}).then((_res) => { |
||||
wx.navigateBack(); |
||||
}); |
||||
}, |
||||
handleBack() { |
||||
wx.navigateBack(); |
||||
}, |
||||
}); |
||||
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
<navbar fixed custom-style="background:#fff"> |
||||
<view slot="left" class="page-title"> |
||||
<van-icon class="back" slot="left" name="arrow-left" bind:tap="handleBack" /> |
||||
修改手机号 |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view class="page" style="padding-top: {{pageTop+28}}px;"> |
||||
<view class="container"> |
||||
<view class="form"> |
||||
<view class="row"> |
||||
<input |
||||
type="number" |
||||
model:value="{{mobile}}" |
||||
class="input" |
||||
placeholder-class="place-input" |
||||
placeholder="请输入手机号" |
||||
/> |
||||
</view> |
||||
<view class="row"> |
||||
<input |
||||
type="number" |
||||
model:value="{{code}}" |
||||
class="input" |
||||
placeholder-class="place-input" |
||||
placeholder="请输入验证码" |
||||
/> |
||||
<view class="code" bind:tap="getCode">{{codeText}}</view> |
||||
</view> |
||||
</view> |
||||
<view class="submit" bind:tap="handleSubmit">修改手机号</view> |
||||
</view> |
||||
</view> |
||||
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
{ |
||||
"navigationBarTitleText": "地推端", |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"navbar": "../../../components/navbar/index", |
||||
"ground-tab-bar": "/ground/components/ground-tab-bar/index", |
||||
"ec-canvas": "/components/ec-canvas/ec-canvas" |
||||
} |
||||
} |
||||
@ -0,0 +1,345 @@
@@ -0,0 +1,345 @@
|
||||
page { |
||||
background: #f8fafa; |
||||
} |
||||
.page-switch { |
||||
color: #fff; |
||||
text-align: right; |
||||
font-family: 'Alibaba PuHuiTi 2.0'; |
||||
font-size: 44rpx; |
||||
font-style: normal; |
||||
font-weight: 700; |
||||
line-height: 52rpx; |
||||
.arrow { |
||||
font-size: 28rpx; |
||||
} |
||||
} |
||||
|
||||
.page { |
||||
min-height: 60vh; |
||||
.user { |
||||
margin: 48rpx 0 0 32rpx; |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: start; |
||||
gap: 20rpx; |
||||
.avatar { |
||||
flex-shrink: 0; |
||||
width: 102rpx; |
||||
height: 102rpx; |
||||
border-radius: 50%; |
||||
border: 1px solid #fff; |
||||
} |
||||
.wrap { |
||||
padding-top: 8rpx; |
||||
flex: 1; |
||||
.name { |
||||
font-size: 36rpx; |
||||
color: #ffffff; |
||||
} |
||||
.label { |
||||
margin-top: 8rpx; |
||||
padding: 0 12rpx; |
||||
display: inline-block; |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
border-radius: 6rpx; |
||||
background: linear-gradient(86deg, #fcd675 0%, #ffb700 100%); |
||||
} |
||||
} |
||||
.code { |
||||
padding: 16rpx 28rpx; |
||||
border: 1px solid #fff; |
||||
border-radius: 24rpx 0 0 24rpx; |
||||
border-right: none; |
||||
background: linear-gradient(193deg, #4a8dff 0%, #3bddc9 100%); |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 8rpx; |
||||
.icon { |
||||
display: block; |
||||
width: 52rpx; |
||||
height: 52rpx; |
||||
} |
||||
.arrow { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
} |
||||
} |
||||
} |
||||
.stat-data { |
||||
margin: 32rpx 32rpx 0; |
||||
padding: 32rpx; |
||||
background: linear-gradient(180deg, #e6efff 0%, #ffffff 8.19%, #ffffff 100%); |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
border: 1px solid #ffffff; |
||||
.s-header { |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.title { |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
font-weight: bold; |
||||
} |
||||
.tip { |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
} |
||||
.row1 { |
||||
margin-top: 32rpx; |
||||
display: flex; |
||||
background: linear-gradient(265deg, #5393ff 0%, #3edec9 100%); |
||||
border-radius: 16rpx; |
||||
.col { |
||||
flex: 1; |
||||
padding: 28rpx 0; |
||||
text-align: center; |
||||
.name { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 60rpx; |
||||
color: #ffffff; |
||||
} |
||||
} |
||||
.line { |
||||
margin: 28rpx 0; |
||||
width: 1px; |
||||
background-color: rgba(238, 245, 245, 0.35); |
||||
} |
||||
} |
||||
.card { |
||||
margin-top: 32rpx; |
||||
border: 1px solid #f2f6f8; |
||||
border-radius: 16rpx; |
||||
overflow: hidden; |
||||
.row2 { |
||||
display: flex; |
||||
background: linear-gradient(265deg, #5393ff 0%, #3edec9 100%); |
||||
border-radius: 16rpx 16rpx 0 0; |
||||
.col { |
||||
flex: 1; |
||||
padding: 28rpx 34rpx; |
||||
.name { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #ffffff; |
||||
line-height: 48rpx; |
||||
} |
||||
} |
||||
.line { |
||||
width: 1px; |
||||
background-color: rgba(238, 245, 245, 0.35); |
||||
} |
||||
} |
||||
.row3 { |
||||
display: flex; |
||||
.col { |
||||
position: relative; |
||||
padding: 28rpx 34rpx; |
||||
flex: 1; |
||||
.name { |
||||
font-size: 24rpx; |
||||
color: #b5b8bb; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #1a2020; |
||||
line-height: 48rpx; |
||||
} |
||||
.line { |
||||
position: absolute; |
||||
left: 20rpx; |
||||
bottom: 0; |
||||
width: 168rpx; |
||||
height: 1px; |
||||
background-color: rgba(242, 246, 248, 0.47); |
||||
} |
||||
&:nth-of-type(2) { |
||||
borer: 1px solid #f2f6f8; |
||||
border-right: none; |
||||
border-left: none; |
||||
background-color: #f2f6f8; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.chat-data { |
||||
margin: 32rpx 32rpx; |
||||
padding: 32rpx; |
||||
background: linear-gradient(180deg, #e6efff 0%, #ffffff 8.19%, #ffffff 100%); |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
border: 1px solid #ffffff; |
||||
.c-header { |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.title { |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
font-weight: bold; |
||||
} |
||||
.switch-btns { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 24rpx; |
||||
.btn { |
||||
width: 148rpx; |
||||
height: 56rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
background: #ffffff; |
||||
border-radius: 1748rpx 1748rpx 1748rpx 1748rpx; |
||||
border: 1px solid #edf2f2; |
||||
&.active { |
||||
background-color: #4a8dff; |
||||
color: #fff; |
||||
border-color: #4a8dff; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.c-options { |
||||
margin-top: 28rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.name { |
||||
font-size: 32rpx; |
||||
color: #1a2020; |
||||
font-weight: bold; |
||||
} |
||||
.picker { |
||||
color: #4a8dff; |
||||
font-size: 28rpx; |
||||
.p-content { |
||||
display: flex; |
||||
align-items: center; |
||||
.content { |
||||
color: #4a5555; |
||||
} |
||||
.icon { |
||||
padding: 20rpx 10rpx; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.card { |
||||
margin-top: 32rpx; |
||||
border: 1px solid #f2f6f8; |
||||
border-radius: 16rpx; |
||||
.row2 { |
||||
display: flex; |
||||
background: linear-gradient(265deg, #5393ff 0%, #3edec9 100%); |
||||
border-radius: 16rpx 16rpx 0 0; |
||||
.col { |
||||
flex: 1; |
||||
padding: 28rpx 34rpx; |
||||
.name { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #ffffff; |
||||
line-height: 48rpx; |
||||
} |
||||
} |
||||
.line { |
||||
width: 1px; |
||||
background-color: rgba(238, 245, 245, 0.35); |
||||
} |
||||
} |
||||
.row3 { |
||||
display: flex; |
||||
.col { |
||||
position: relative; |
||||
padding: 28rpx 34rpx; |
||||
flex: 1; |
||||
.name { |
||||
font-size: 24rpx; |
||||
color: #b5b8bb; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #1a2020; |
||||
line-height: 48rpx; |
||||
} |
||||
.line { |
||||
position: absolute; |
||||
left: 20rpx; |
||||
bottom: 0; |
||||
width: 168rpx; |
||||
height: 1px; |
||||
background-color: rgba(242, 246, 248, 0.47); |
||||
} |
||||
&:nth-of-type(2) { |
||||
borer: 1px solid #f2f6f8; |
||||
border-right: none; |
||||
border-left: none; |
||||
background-color: #f2f6f8; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.chart-range { |
||||
margin-top: 40rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.picker { |
||||
.p-content { |
||||
padding: 8rpx 38rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 18rpx; |
||||
border-radius: 12rpx 12rpx 12rpx 12rpx; |
||||
border: 1px solid #f2f6f8; |
||||
.content { |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
.icon { |
||||
width: 32rpx; |
||||
height: 32rpx; |
||||
} |
||||
} |
||||
} |
||||
.line { |
||||
width: 24rpx; |
||||
height: 1px; |
||||
background-color: #f2f6f8; |
||||
} |
||||
} |
||||
.chart-container { |
||||
margin-top: 16rpx; |
||||
padding: 15rpx 30rpx; |
||||
width: 100%; |
||||
height: 546rpx; |
||||
box-sizing: border-box; |
||||
} |
||||
.more { |
||||
padding: 20rpx 0 0; |
||||
font-size: 28rpx; |
||||
color: #4a8dff; |
||||
text-align: center; |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,252 @@
@@ -0,0 +1,252 @@
|
||||
import { color } from 'echarts' |
||||
|
||||
const echarts = require('../../../components/ec-canvas/echarts.js') |
||||
|
||||
Page({ |
||||
data: {}, |
||||
ecDataTrendComponent1_1: null as any, |
||||
ecDataTrendComponent2_1: null as any, |
||||
ecDataTrendComponent3_1: null as any, |
||||
async onLoad() { |
||||
const app = getApp<IAppOption>() |
||||
app.waitLogin().then(() => { |
||||
const list = [ |
||||
{ StatMonth: '2026-01', MonthInvitePCount: 1 }, |
||||
{ StatMonth: '2026-02', MonthInvitePCount: 2 }, |
||||
] |
||||
this.initChartBar(list) |
||||
this.initChartLine(list, '#chart2_1', this.ecDataTrendComponent2_1) |
||||
this.initChartLine(list, '#chart3_1', this.ecDataTrendComponent3_1) |
||||
}) |
||||
}, |
||||
initChartBar(list: any[]) { |
||||
return new Promise((reslove) => { |
||||
this.ecDataTrendComponent1_1 = this.selectComponent('#chart1_1') |
||||
this.ecDataTrendComponent1_1.init((canvas, width, height, dpr) => { |
||||
const chart = echarts.init(canvas, null, { |
||||
width, |
||||
height, |
||||
devicePixelRatio: dpr, // new
|
||||
}) |
||||
canvas.setChart(chart) |
||||
const x: string[] = [] |
||||
const y1: string[] = [] |
||||
list.forEach((item) => { |
||||
x.push(item.StatMonth) |
||||
y1.push(item.MonthInvitePCount) |
||||
}) |
||||
|
||||
const option = { |
||||
legend: { |
||||
top: 0, |
||||
right: 0, |
||||
itemWidth: 8, |
||||
itemHeight: 8, |
||||
icon: 'rect', |
||||
lineStyle: { |
||||
width: '0', |
||||
}, |
||||
textStyle: { |
||||
color: '#B5B8BB', |
||||
fontSize: '12', |
||||
}, |
||||
}, |
||||
grid: { |
||||
top: '10%', |
||||
left: '3%', |
||||
right: '4%', |
||||
bottom: '0', |
||||
containLabel: true, |
||||
}, |
||||
xAxis: [ |
||||
{ |
||||
type: 'category', |
||||
axisTick: { |
||||
show: false, |
||||
}, |
||||
axisLabel: { |
||||
fontSize: 10, |
||||
color: '#B5B8BB', |
||||
}, |
||||
axisLine: { |
||||
show: false, |
||||
}, |
||||
data: x, |
||||
}, |
||||
], |
||||
yAxis: [ |
||||
{ |
||||
type: 'value', |
||||
minInterval: 1, |
||||
splitLine: { |
||||
lineStyle: { |
||||
type: 'dashed', |
||||
}, |
||||
}, |
||||
axisLabel: { |
||||
fontSize: 10, |
||||
color: '#B5B8BB', |
||||
formatter(value) { |
||||
return Math.abs(value) |
||||
}, |
||||
}, |
||||
}, |
||||
], |
||||
series: [ |
||||
{ |
||||
name: '邀约患者数', |
||||
type: 'bar', |
||||
stack: 'a', |
||||
width: 4, |
||||
color: '#FED877', |
||||
barWidth: 12, |
||||
data: y1, |
||||
}, |
||||
{ |
||||
name: '跳转患者数', |
||||
type: 'bar', |
||||
stack: 'a', |
||||
color: '#4A8DFF', |
||||
barWidth: 12, |
||||
data: y1, |
||||
}, |
||||
{ |
||||
name: '入组患者数', |
||||
type: 'bar', |
||||
stack: 'a', |
||||
color: '#3ADDC8', |
||||
barWidth: 12, |
||||
data: y1, |
||||
}, |
||||
], |
||||
dataZoom: { |
||||
type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。
|
||||
startValue: x.length - 6, |
||||
endValue: x.length - 1, |
||||
filterMode: 'none', |
||||
}, |
||||
} |
||||
|
||||
chart.setOption(option) |
||||
reslove(chart) |
||||
return chart |
||||
}) |
||||
}) |
||||
}, |
||||
initChartLine(list: any[], name: string, componentName: string) { |
||||
return new Promise((reslove) => { |
||||
this[componentName] = this.selectComponent(name) |
||||
this[componentName].init((canvas, width, height, dpr) => { |
||||
const chart = echarts.init(canvas, null, { |
||||
width, |
||||
height, |
||||
devicePixelRatio: dpr, // new
|
||||
}) |
||||
canvas.setChart(chart) |
||||
const x: string[] = [] |
||||
const y1: string[] = [] |
||||
list.forEach((item) => { |
||||
x.push(item.StatMonth) |
||||
y1.push(item.MonthInvitePCount) |
||||
}) |
||||
|
||||
const option = { |
||||
legend: { |
||||
top: 0, |
||||
right: 0, |
||||
itemWidth: 8, |
||||
itemHeight: 8, |
||||
icon: 'rect', |
||||
lineStyle: { |
||||
width: '0', |
||||
}, |
||||
textStyle: { |
||||
color: '#B5B8BB', |
||||
fontSize: '12', |
||||
}, |
||||
data: [], |
||||
}, |
||||
grid: { |
||||
top: '10%', |
||||
left: '3%', |
||||
right: '4%', |
||||
bottom: '0', |
||||
containLabel: true, |
||||
}, |
||||
xAxis: [ |
||||
{ |
||||
type: 'category', |
||||
axisTick: { |
||||
show: false, |
||||
}, |
||||
axisLabel: { |
||||
fontSize: 10, |
||||
color: '#B5B8BB', |
||||
}, |
||||
axisLine: { |
||||
show: false, |
||||
}, |
||||
data: x, |
||||
}, |
||||
], |
||||
yAxis: [ |
||||
{ |
||||
type: 'value', |
||||
minInterval: 1, |
||||
splitLine: { |
||||
lineStyle: { |
||||
type: 'dashed', |
||||
}, |
||||
}, |
||||
axisLabel: { |
||||
fontSize: 10, |
||||
color: '#B5B8BB', |
||||
formatter(value) { |
||||
return Math.abs(value) |
||||
}, |
||||
}, |
||||
}, |
||||
], |
||||
series: [ |
||||
{ |
||||
name: '邀约患者数', |
||||
type: 'line', |
||||
stack: 'a', |
||||
width: 4, |
||||
color: '#FED877', |
||||
barWidth: 12, |
||||
data: y1, |
||||
smooth: 0.5, |
||||
label: { |
||||
show: true, |
||||
position: 'top', |
||||
fontSize: 12, |
||||
color: '#B5B8BB', |
||||
}, |
||||
}, |
||||
], |
||||
dataZoom: { |
||||
type: 'inside', // 有type这个属性,滚动条在最下面,也可以不行,写y:36,这表示距离顶端36px,一般就是在图上面。
|
||||
startValue: x.length - 6, |
||||
endValue: x.length - 1, |
||||
filterMode: 'none', |
||||
}, |
||||
} |
||||
|
||||
chart.setOption(option) |
||||
reslove(chart) |
||||
return chart |
||||
}) |
||||
}) |
||||
}, |
||||
handleInvite() { |
||||
wx.navigateTo({ |
||||
url: '/ground/pages/invite/index', |
||||
}) |
||||
}, |
||||
handleInfo() { |
||||
wx.navigateTo({ |
||||
url: '/ground/pages/stat/index', |
||||
}) |
||||
}, |
||||
}) |
||||
@ -0,0 +1,273 @@
@@ -0,0 +1,273 @@
|
||||
<navbar fixed custom-style="background: {{background}};"> |
||||
<view class="page-switch" slot="left" style="color: {{background=='transparent'?'#fff':'#4A8DFF'}};"> |
||||
特诺雅 |
||||
<van-icon class="arrow" name="arrow-down" /> |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view |
||||
class="page" |
||||
style="background:url('/images/bg1.png') no-repeat top center/100% 602rpx; padding-top: {{pageTop+20}}px" |
||||
> |
||||
<view class="user"> |
||||
<image class="avatar" src="/images/cache/a1.png"></image> |
||||
<view class="wrap"> |
||||
<view class="name">刘平安</view> |
||||
<view class="label">邀约专员</view> |
||||
</view> |
||||
<view class="code" bind:tap="handleInvite"> |
||||
<image class="icon" src="/images/icon7.png"></image> |
||||
<van-icon class="arrow" name="arrow" /> |
||||
</view> |
||||
</view> |
||||
<view class="stat-data"> |
||||
<view class="s-header"> |
||||
<view class="title">累计邀约</view> |
||||
<view class="tip">截止昨日数据</view> |
||||
</view> |
||||
<view class="row1"> |
||||
<view class="col"> |
||||
<view class="name">药店数</view> |
||||
<view class="num">400</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">药店数</view> |
||||
<view class="num">400</view> |
||||
</view> |
||||
</view> |
||||
<view class="card"> |
||||
<view class="row2"> |
||||
<view class="col"> |
||||
<view class="name">邀约患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">跳转患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">300</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view class="chat-data"> |
||||
<view class="c-header"> |
||||
<view class="title">邀约患者统计</view> |
||||
<view class="switch-btns"> |
||||
<view class="btn">月统计</view> |
||||
<view class="btn active">日统计</view> |
||||
</view> |
||||
</view> |
||||
<view class="c-options"> |
||||
<view class="name">日统计</view> |
||||
<picker class="picker"> |
||||
<view class="p-content"> |
||||
<van-icon class="icon" name="arrow-left" /> |
||||
<view class="content">2025/02/26</view> |
||||
<van-icon class="icon" name="arrow" /> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
<view class="card"> |
||||
<view class="row2"> |
||||
<view class="col"> |
||||
<view class="name">邀约患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">跳转患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">300</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view class="chart-range"> |
||||
<picker class="picker" mode="date" end="{{end}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
<view class="line"></view> |
||||
<picker class="picker" mode="date" start="{{satrt}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
<view class="chart-container"> |
||||
<ec-canvas id="chart1_1" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas> |
||||
</view> |
||||
<view class="more"> |
||||
查看明细 |
||||
<van-icon name="arrow" /> |
||||
</view> |
||||
</view> |
||||
<view class="chat-data"> |
||||
<view class="c-header"> |
||||
<view class="title">邀约药师数统计</view> |
||||
<view class="switch-btns"> |
||||
<view class="btn">月统计</view> |
||||
<view class="btn active">日统计</view> |
||||
</view> |
||||
</view> |
||||
<view class="chart-range"> |
||||
<picker class="picker" mode="date" end="{{end}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
<view class="line"></view> |
||||
<picker class="picker" mode="date" start="{{satrt}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
<view class="chart-container"> |
||||
<ec-canvas id="chart2_1" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas> |
||||
</view> |
||||
<view class="more"> |
||||
查看明细 |
||||
<van-icon name="arrow" /> |
||||
</view> |
||||
</view> |
||||
<view class="chat-data"> |
||||
<view class="c-header"> |
||||
<view class="title">邀约药店统计</view> |
||||
<view class="switch-btns"> |
||||
<view class="btn">月统计</view> |
||||
<view class="btn active">日统计</view> |
||||
</view> |
||||
</view> |
||||
<view class="chart-range"> |
||||
<picker class="picker" mode="date" end="{{end}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
<view class="line"></view> |
||||
<picker class="picker" mode="date" start="{{satrt}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
<view class="chart-container"> |
||||
<ec-canvas id="chart3_1" canvas-id="mychart-bar" ec="{{ ec }}"></ec-canvas> |
||||
</view> |
||||
<view class="more" bind:tap="handleInfo"> |
||||
查看明细 |
||||
<van-icon name="arrow" /> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
||||
<ground-tab-bar active="{{ 0 }}"></ground-tab-bar> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"login":"/components/login/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,101 @@
@@ -0,0 +1,101 @@
|
||||
.page-title { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
font-size: 36rpx; |
||||
color: #ffffff; |
||||
} |
||||
|
||||
.page { |
||||
height: 100vh; |
||||
box-sizing: border-box; |
||||
.page-container { |
||||
margin: 0 40rpx; |
||||
padding: 32rpx 48rpx; |
||||
height: 960rpx; |
||||
box-sizing: border-box; |
||||
.user { |
||||
display: flex; |
||||
gap: 24rpx; |
||||
height: 200rpx; |
||||
.avatar { |
||||
width: 126rpx; |
||||
height: 126rpx; |
||||
border: 1px solid #fff; |
||||
border-radius: 50%; |
||||
} |
||||
.wrap { |
||||
padding-top: 16rpx; |
||||
.nickname { |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
font-weight: bold; |
||||
} |
||||
.label { |
||||
display: inline-block; |
||||
margin-top: 8rpx; |
||||
padding: 0 12rpx; |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
border-radius: 6rpx; |
||||
background: linear-gradient(86deg, #fcd675 0%, #ffb700 100%); |
||||
} |
||||
} |
||||
} |
||||
.title { |
||||
font-size: 40rpx; |
||||
color: #4a8dff; |
||||
text-align: center; |
||||
} |
||||
.brand { |
||||
margin-top: 12rpx; |
||||
.name { |
||||
font-size: 44rpx; |
||||
color: #4a8dff; |
||||
font-weight: bold; |
||||
text-align: center; |
||||
} |
||||
.bg { |
||||
margin: -12rpx auto 0; |
||||
width: 140rpx; |
||||
height: 16rpx; |
||||
background: linear-gradient(90deg, #fdd260 0%, rgba(253, 210, 96, 0.07) 100%); |
||||
border-radius: 0rpx 0rpx 0rpx 0rpx; |
||||
} |
||||
} |
||||
.code-wrap { |
||||
margin: 64rpx auto 0; |
||||
padding: 10rpx; |
||||
width: 328rpx; |
||||
height: 328rpx; |
||||
border-radius: 50%; |
||||
border: 10rpx solid #ecf3ff; |
||||
.code { |
||||
display: block; |
||||
border-radius: 50%; |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
} |
||||
.tip { |
||||
margin: 52rpx auto 0; |
||||
width: 340rpx; |
||||
height: 76rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
gap: 10rpx; |
||||
font-size: 40rpx; |
||||
color: #ffffff; |
||||
background: linear-gradient(265deg, #5393ff 0%, #3edec9 100%); |
||||
border-radius: 92rpx 92rpx 92rpx 92rpx; |
||||
.dot{ |
||||
width: 10rpx; |
||||
height: 10rpx; |
||||
border-radius: 50%; |
||||
background-color: #fff; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
<navbar fixed custom-style="background:transparent"> |
||||
<view slot="left" class="page-title"> |
||||
<van-icon class="back" slot="left" name="arrow-left" bind:tap="handleBack" /> |
||||
专属邀约码 |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view |
||||
class="page" |
||||
style="background: url('/images/bg5.png') no-repeat top center/100% 100vh;padding-top: {{pageTop+87}}px;" |
||||
> |
||||
<view class="page-container" style="background: url('/images/bg6.png') no-repeat top center/100% 964rpx"> |
||||
<view class="user"> |
||||
<image class="avatar" src="/images/cache/a1.png" mode="aspectFill"></image> |
||||
<view class="wrap"> |
||||
<view class="nickname">刘平安</view> |
||||
<view class="label">邀约专员</view> |
||||
</view> |
||||
</view> |
||||
<view class="title">邀请您加入健康管理项目</view> |
||||
<view class="brand"> |
||||
<view class="name">特诺雅</view> |
||||
<view class="bg"></view> |
||||
</view> |
||||
<view class="code-wrap"> |
||||
<image class="code" src="/images/cache/c1.png" show-menu-by-longpress></image> |
||||
</view> |
||||
<view class="tip"> |
||||
<view class="dot"></view> |
||||
扫码立即加入 |
||||
<view class="dot"></view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
{ |
||||
"navigationBarTitleText": "登录", |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"van-divider": "@vant/weapp/divider/index", |
||||
"van-icon": "@vant/weapp/icon/index", |
||||
"navbar": "/components/navbar/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,119 @@
@@ -0,0 +1,119 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page { |
||||
min-height: 100vh; |
||||
padding: 460rpx 0 80rpx 0; |
||||
box-sizing: border-box; |
||||
.page-title { |
||||
margin: 0 40rpx; |
||||
width: 614rpx; |
||||
height: 184rpx; |
||||
} |
||||
.container { |
||||
padding: 0 40rpx; |
||||
.content { |
||||
margin-top: 40rpx; |
||||
font-size: 32rpx; |
||||
color: #1a2020; |
||||
line-height: 48rpx; |
||||
.link { |
||||
color: #4a8dff; |
||||
} |
||||
} |
||||
} |
||||
.phone { |
||||
margin: 54rpx 40rpx 0; |
||||
padding: 24rpx 20rpx; |
||||
border-radius: 64rpx; |
||||
background: linear-gradient(268deg, #5393ff 0%, #3edec9 100%); |
||||
font-size: 32rpx; |
||||
color: rgba(255, 255, 255, 1); |
||||
line-height: 1; |
||||
&::after { |
||||
border: none; |
||||
outline: none; |
||||
} |
||||
} |
||||
.divider { |
||||
margin: 48rpx auto 0; |
||||
width: 338rpx; |
||||
} |
||||
.tel-code { |
||||
margin: 32rpx auto 0; |
||||
width: 278rpx; |
||||
height: 52rpx; |
||||
display: flex; |
||||
justify-content: center; |
||||
font-size: 32rpx; |
||||
color: #1a2020; |
||||
} |
||||
.form { |
||||
margin: 42rpx 40rpx 0; |
||||
padding: 48rpx 32rpx; |
||||
border-radius: 24rpx; |
||||
background-color: #fff; |
||||
.row { |
||||
margin-bottom: 32rpx; |
||||
display: flex; |
||||
justify-content: space-between; |
||||
border-radius: 12rpx; |
||||
background: #f8fafa; |
||||
.input { |
||||
flex: 1; |
||||
padding: 22rpx 32rpx; |
||||
height: 40rpx; |
||||
font-size: 32rpx; |
||||
color: #000; |
||||
} |
||||
.input-placeholade { |
||||
color: #94a3a3; |
||||
} |
||||
.code { |
||||
margin-left: 24rpx; |
||||
flex-shrink: 0; |
||||
width: 262rpx; |
||||
border-radius: 24rpx; |
||||
font-size: 32rpx; |
||||
color: #4a8dff; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
} |
||||
} |
||||
.submit { |
||||
margin-top: 32px; |
||||
padding: 24rpx 20rpx; |
||||
background: linear-gradient(268deg, #5393ff 0%, #3edec9 100%); |
||||
border-radius: 64rpx; |
||||
font-size: 32rpx; |
||||
color: #ffffff; |
||||
text-align: center; |
||||
line-height: 1; |
||||
} |
||||
} |
||||
.check { |
||||
margin: 68rpx 50rpx 0; |
||||
display: flex; |
||||
line-height: 60rpx; |
||||
color: rgba(32, 33, 33, 1); |
||||
.icon { |
||||
margin-top: 14rpx; |
||||
margin-right: 10rpx; |
||||
flex-shrink: 0; |
||||
width: 32rpx; |
||||
height: 32rpx; |
||||
} |
||||
.link { |
||||
color: #4a8dff; |
||||
} |
||||
} |
||||
.partient { |
||||
margin-top: 58rpx; |
||||
font-size: 32rpx; |
||||
color: rgba(161, 164, 172, 1); |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
} |
||||
} |
||||
@ -0,0 +1,154 @@
@@ -0,0 +1,154 @@
|
||||
const app = getApp<IAppOption>() |
||||
let timer = null as null | number |
||||
|
||||
Page({ |
||||
data: { |
||||
mobile: '', |
||||
code: '', |
||||
codeText: '发送验证码', |
||||
back: false, |
||||
showForm: false, |
||||
check: false, |
||||
}, |
||||
onLoad(option) { |
||||
if (option.back) { |
||||
this.setData({ |
||||
back: true, |
||||
}) |
||||
} |
||||
}, |
||||
getCode() { |
||||
if (timer) return |
||||
const mobile = this.data.mobile |
||||
if (!mobile) { |
||||
wx.showToast({ |
||||
title: '手机号不能为空', |
||||
icon: 'none', |
||||
}) |
||||
return |
||||
} |
||||
// 验证手机号
|
||||
if (!/^1[3-9,]\d{9}$/.test(mobile)) { |
||||
wx.showToast({ |
||||
title: '手机号格式不正确', |
||||
icon: 'none', |
||||
}) |
||||
return |
||||
} |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/login/send-verify-code', |
||||
data: { |
||||
mobile, |
||||
}, |
||||
}).then((_res) => { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '验证码已发送~', |
||||
}) |
||||
let time = 60 |
||||
timer = setInterval(() => { |
||||
time-- |
||||
this.setData({ |
||||
codeText: `${time}s后重新发送`, |
||||
}) |
||||
if (time <= 0) { |
||||
clearInterval(timer as number) |
||||
timer = null |
||||
this.setData({ |
||||
codeText: '发送验证码', |
||||
}) |
||||
} |
||||
}, 1000) |
||||
}) |
||||
}, |
||||
handleSubmit() { |
||||
if (!this.data.mobile) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请输入手机号', |
||||
}) |
||||
return |
||||
} |
||||
if (!this.data.code) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请输入验证码', |
||||
}) |
||||
return |
||||
} |
||||
if (!this.data.check) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请同意用户协议', |
||||
}) |
||||
return |
||||
} |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/doctor/login/reg-login', |
||||
data: { |
||||
mobile: this.data.mobile, |
||||
code: this.data.code, |
||||
}, |
||||
}).then((_res) => { |
||||
this.submitCallback() |
||||
}) |
||||
}, |
||||
handleWxSubmit(e: WechatMiniprogram.CustomEvent) { |
||||
if (!this.data.check) { |
||||
wx.showToast({ |
||||
icon: 'none', |
||||
title: '请同意用户协议', |
||||
}) |
||||
return |
||||
} |
||||
wx.reLaunch({ |
||||
url: '/ground/pages/home/index', |
||||
}) |
||||
return |
||||
const { iv, encryptedData } = e.detail |
||||
if (iv && encryptedData) { |
||||
wx.ajax({ |
||||
method: 'POST', |
||||
url: '?r=zd/doctor/login/wx-reg-login', |
||||
data: { |
||||
iv: encodeURIComponent(iv), |
||||
encryptedData: encodeURIComponent(encryptedData), |
||||
}, |
||||
}).then((_res) => { |
||||
this.submitCallback() |
||||
}) |
||||
} |
||||
}, |
||||
submitCallback() { |
||||
app.globalData.loginType = 2 |
||||
app.globalData.isLogin = true |
||||
wx.reLaunch({ |
||||
url: '/doctor/pages/d_home/index', |
||||
}) |
||||
}, |
||||
handlePatient() { |
||||
wx.redirectTo({ |
||||
url: '/pages/login/index', |
||||
}) |
||||
}, |
||||
handleTelCode() { |
||||
this.setData({ |
||||
showForm: !this.data.showForm, |
||||
}) |
||||
}, |
||||
handleLink() { |
||||
wx.navigateTo({ |
||||
url: '/doc/pages/doc1/index', |
||||
}) |
||||
}, |
||||
handleCheck() { |
||||
this.setData({ |
||||
check: !this.data.check, |
||||
}) |
||||
}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
}) |
||||
@ -0,0 +1,55 @@
@@ -0,0 +1,55 @@
|
||||
<navbar fixed custom-style="background:transparent" back></navbar> |
||||
<view |
||||
class="page" |
||||
style="background: url('/images/bg4.png') no-repeat top center / 100% 710rpx;padding-top: {{pageTop+80}}px;" |
||||
> |
||||
<image class="page-title" src="/images/content1.png"></image> |
||||
<view class="container"> |
||||
<view class="content"> |
||||
在您加入华观健康之前,请您阅读并充分理解 |
||||
<text class="link" bind:tap="handleLink">《个人信息及隐私保护政策》</text> |
||||
了解您的权益及相关数据处理方法,我们将严格按照法律法规及 |
||||
<text class="link" bind:tap="handleLink">《个人信息及隐私保护政策》</text> |
||||
的相关规定保证您的个人信息不受侵犯。 |
||||
</view> |
||||
</view> |
||||
<button wx:if="{{check}}" class="phone" open-type="getPhoneNumber" bindgetphonenumber="handleWxSubmit"> |
||||
手机号快捷登录 |
||||
</button> |
||||
<button wx:else class="phone" bind:tap="handleWxSubmit">手机号快捷登录</button> |
||||
<view class="divider"> |
||||
<van-divider contentPosition="center" textColor="rgba(148,163,163,0.5)">或者</van-divider> |
||||
</view> |
||||
<view class="tel-code" bind:tap="handleTelCode">使用手机号验证码</view> |
||||
<view class="form" wx:if="{{showForm}}"> |
||||
<view class="row"> |
||||
<input |
||||
type="number" |
||||
model:value="{{mobile}}" |
||||
class="input" |
||||
placeholder-class="input-placeholade" |
||||
placeholder="请输入手机号" |
||||
/> |
||||
</view> |
||||
<view class="row"> |
||||
<input |
||||
type="number" |
||||
model:value="{{code}}" |
||||
class="input" |
||||
placeholder-class="input-placeholade" |
||||
placeholder="请输入验证码" |
||||
/> |
||||
<view class="code" bind:tap="getCode">{{codeText}}</view> |
||||
</view> |
||||
<view class="submit" bind:tap="handleSubmit">立即加入</view> |
||||
</view> |
||||
<view class="check"> |
||||
<image wx:if="{{check}}" class="icon" src="/images/icon11.png" bind:tap="handleCheck"></image> |
||||
<image wx:else class="icon" src="/images/icon12.png" bind:tap="handleCheck"></image> |
||||
<view class="p"> |
||||
我特此同意依照此 |
||||
<text class="link" bind:tap="handleLink">《隐私协议保护政策》</text> |
||||
规定收集我的个人敏感信息 |
||||
</view> |
||||
</view> |
||||
</view> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationBarTitleText": "地推端", |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"navbar": "../../../components/navbar/index", |
||||
"ground-tab-bar": "/ground/components/ground-tab-bar/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,95 @@
@@ -0,0 +1,95 @@
|
||||
page { |
||||
background: #F8FAFA; |
||||
} |
||||
|
||||
.page { |
||||
min-height: 60vh; |
||||
.user { |
||||
position: relative; |
||||
margin: 100rpx 32rpx 0; |
||||
padding: 112rpx 32rpx 32rpx; |
||||
background: linear-gradient(0deg, rgba(255, 255, 255, 0.42) 0%, #ffffff 100%); |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
border: 2rpx solid #ffffff; |
||||
backdrop-filter: blur(16rpx); |
||||
.avatar { |
||||
position: absolute; |
||||
top: 0; |
||||
left: 50%; |
||||
transform: translate(-50%, -50%); |
||||
.a-img { |
||||
width: 186rpx; |
||||
height: 186rpx; |
||||
border-radius: 50%; |
||||
border: 1px solid #fff; |
||||
} |
||||
.edit { |
||||
position: absolute; |
||||
bottom: 16rpx; |
||||
right: 16rpx; |
||||
width: 34rpx; |
||||
height: 34rpx; |
||||
border-radius: 50%; |
||||
border: 1px solid #fff; |
||||
background-color: #4a8dff; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
.icon { |
||||
width: 20rpx; |
||||
height: 20rpx; |
||||
} |
||||
} |
||||
} |
||||
.name { |
||||
font-size: 40rpx; |
||||
color: #1a2020; |
||||
font-weight: bold; |
||||
text-align: center; |
||||
} |
||||
.phone { |
||||
margin-top: 12rpx; |
||||
font-size: 32rpx; |
||||
color: #b5b8bb; |
||||
text-align: center; |
||||
} |
||||
} |
||||
.list { |
||||
margin: 32rpx 32rpx 0; |
||||
border-radius: 24rpx; |
||||
background-color: #fff; |
||||
.list-item { |
||||
padding: 34rpx 32rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
gap: 24rpx; |
||||
.icon { |
||||
flex-shrink: 0; |
||||
width: 44rpx; |
||||
height: 44rpx; |
||||
} |
||||
.title { |
||||
flex: 1; |
||||
font-size: 32rpx; |
||||
color: #1a2020; |
||||
line-height: 48rpx; |
||||
} |
||||
.arrow { |
||||
font-size: 36rpx; |
||||
color: #94a3a3; |
||||
} |
||||
} |
||||
} |
||||
.exit { |
||||
margin: 64rpx 32rpx 0; |
||||
font-size: 32rpx; |
||||
color: #1a2020; |
||||
height: 96rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
background-color: #fff; |
||||
border-radius: 24rpx; |
||||
} |
||||
} |
||||
@ -0,0 +1,23 @@
@@ -0,0 +1,23 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleNickname() { |
||||
wx.navigateTo({ |
||||
url: '/ground/pages/changeNickname/index', |
||||
}) |
||||
}, |
||||
handleTel() { |
||||
wx.navigateTo({ |
||||
url: '/ground/pages/changeTel/index', |
||||
}) |
||||
}, |
||||
handleInvite() { |
||||
wx.navigateTo({ |
||||
url: '/ground/pages/stat/index', |
||||
}) |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,37 @@
@@ -0,0 +1,37 @@
|
||||
<navbar fixed custom-style="background: transparent;"></navbar> |
||||
|
||||
<view |
||||
class="page" |
||||
style="background:url('/images/bg1.png') no-repeat top center/100% 602rpx; padding-top: {{pageTop+20}}px" |
||||
> |
||||
<view class="user"> |
||||
<view class="avatar"> |
||||
<image class="a-img" src="/images/cache/a1.png"></image> |
||||
<view class="edit"> |
||||
<image class="icon" src="/images/icon3.png"></image> |
||||
</view> |
||||
</view> |
||||
<view class="name">刘平安</view> |
||||
<view class="phone">13800138000</view> |
||||
</view> |
||||
<view class="list"> |
||||
<view class="list-item" bind:tap="handleNickname"> |
||||
<image class="icon" src="/images/icon4.png"></image> |
||||
<view class="title">修改姓名</view> |
||||
<van-icon class="arrow" name="arrow" /> |
||||
</view> |
||||
<view class="list-item" bind:tap="handleTel"> |
||||
<image class="icon" src="/images/icon5.png"></image> |
||||
<view class="title">修改手机号</view> |
||||
<van-icon class="arrow" name="arrow" /> |
||||
</view> |
||||
<view class="list-item" bind:tap="handleInvite"> |
||||
<image class="icon" src="/images/icon6.png"></image> |
||||
<view class="title">我的邀约码</view> |
||||
<van-icon class="arrow" name="arrow" /> |
||||
</view> |
||||
</view> |
||||
<view class="exit">退出登录</view> |
||||
</view> |
||||
|
||||
<ground-tab-bar active="{{ 2 }}"></ground-tab-bar> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationBarTitleText": "地推端", |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"navbar": "../../../components/navbar/index", |
||||
"ground-tab-bar": "/ground/components/ground-tab-bar/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,172 @@
@@ -0,0 +1,172 @@
|
||||
page { |
||||
background: #f8fafa; |
||||
} |
||||
.page-switch { |
||||
color: #4a8dff; |
||||
font-size: 40rpx; |
||||
font-weight: 700; |
||||
line-height: 44rpx; |
||||
.arrow { |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
} |
||||
|
||||
.page { |
||||
min-height: 60vh; |
||||
.page-header { |
||||
padding: 16rpx 32rpx; |
||||
background-color: #fff; |
||||
box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(26, 32, 32, 0.04); |
||||
.search { |
||||
padding: 0 24rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
background: #f8fafa; |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
gap: 8rpx; |
||||
.icon { |
||||
width: 48rpx; |
||||
height: 48rpx; |
||||
} |
||||
.input { |
||||
height: 80rpx; |
||||
font-size: 32rpx; |
||||
color: #1a2020; |
||||
} |
||||
.place-input { |
||||
color: #b5b8bb; |
||||
} |
||||
} |
||||
.options { |
||||
margin-top: 8rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.date { |
||||
padding: 24rpx 22rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
font-size: 32rpx; |
||||
color: #1a2020; |
||||
.icon { |
||||
width: 48rpx; |
||||
height: 48rpx; |
||||
} |
||||
} |
||||
.total { |
||||
font-size: 32rpx; |
||||
color: #1a2020; |
||||
.num { |
||||
color: #4a8dff; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
.page-container { |
||||
padding: 32rpx; |
||||
|
||||
.pharmacist-card { |
||||
margin-bottom: 32rpx; |
||||
padding: 32rpx 32rpx 0; |
||||
background: linear-gradient(0deg, #ffffff 0%, #ffffff 73.04%, #eff5ff 100%); |
||||
border-radius: 24rpx 24rpx 24rpx 24rpx; |
||||
border: 2rpx solid #ffffff; |
||||
|
||||
/* 药师基本信息 */ |
||||
.user { |
||||
display: flex; |
||||
gap: 20rpx; |
||||
.avatar { |
||||
flex-shrink: 0; |
||||
width: 116rpx; |
||||
height: 116rpx; |
||||
border-radius: 50%; |
||||
} |
||||
.wrap { |
||||
.pharmacist-info { |
||||
margin-bottom: 12rpx; |
||||
|
||||
.pharmacist-name { |
||||
font-weight: 600; |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
margin-right: 12rpx; |
||||
} |
||||
|
||||
.pharmacist-phone { |
||||
font-family: 'PingFang SC'; |
||||
font-size: 32rpx; |
||||
color: #b5b8bb; |
||||
line-height: 36rpx; |
||||
} |
||||
} |
||||
.pharmacy-info { |
||||
.pharmacy-name { |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/* 数据统计 */ |
||||
.data-stats { |
||||
margin-top: 24rpx; |
||||
padding: 32rpx 10rpx; |
||||
display: flex; |
||||
justify-content: space-between; |
||||
border-bottom: 1px solid #fff; |
||||
background-color: #f8fafa; |
||||
|
||||
.stat-item { |
||||
flex: 1; |
||||
text-align: center; |
||||
|
||||
.stat-value { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: baseline; |
||||
|
||||
.stat-number { |
||||
font-weight: 600; |
||||
font-size: 48rpx; |
||||
color: #4a8dff; |
||||
} |
||||
|
||||
.stat-unit { |
||||
font-size: 24rpx; |
||||
color: #b5b8bb; |
||||
margin-left: 8rpx; |
||||
} |
||||
} |
||||
|
||||
.stat-label { |
||||
margin-top: 12rpx; |
||||
font-size: 24rpx; |
||||
color: #1a2020; |
||||
display: block; |
||||
} |
||||
} |
||||
} |
||||
|
||||
.card-footer { |
||||
display: flex; |
||||
justify-content: space-between; |
||||
align-items: center; |
||||
|
||||
.bind-time { |
||||
padding: 24rpx 0; |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
|
||||
.detail-btn { |
||||
padding: 24rpx 0; |
||||
font-size: 28rpx; |
||||
color: #4a8dff; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleInfo() { |
||||
wx.navigateTo({ |
||||
url: '/ground/pages/stat/index', |
||||
}) |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,84 @@
@@ -0,0 +1,84 @@
|
||||
<navbar fixed custom-style="background: #fff;"> |
||||
<view class="page-switch" slot="left"> |
||||
特诺雅 |
||||
<van-icon class="arrow" name="arrow-down" /> |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view class="page" style="padding-top:{{pageTop}}px"> |
||||
<view class="page-header"> |
||||
<view class="search"> |
||||
<image class="icon" src="/images/icon1.png"></image> |
||||
<input |
||||
type="text" |
||||
placeholder="搜索药店名/药师姓名" |
||||
class="input" |
||||
placeholder-class="place-input" |
||||
confirm-type="search" |
||||
bindconfirm="handleSearch" |
||||
/> |
||||
</view> |
||||
<view class="options"> |
||||
<picker class="picker" mode="date"> |
||||
<view class="date"> |
||||
时间筛选 |
||||
<image class="icon" src="/images/icon2.png"></image> |
||||
</view> |
||||
</picker> |
||||
<view class="total"> |
||||
已邀约总人数: |
||||
<text class="num">28</text> |
||||
人 |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view class="page-container"> |
||||
<!-- 药师信息卡片 --> |
||||
<view class="pharmacist-card"> |
||||
<!-- 药师基本信息 --> |
||||
<view class="user"> |
||||
<image class="avatar" src="/images/cache/a2.png"></image> |
||||
<view class="wrap"> |
||||
<view class="pharmacist-info"> |
||||
<text class="pharmacist-name">张药师</text> |
||||
<text class="pharmacist-phone">13800138000</text> |
||||
</view> |
||||
<view class="pharmacy-info"> |
||||
<text class="pharmacy-name">康泰大药房(人民路店)</text> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<!-- 数据统计 --> |
||||
<view class="data-stats"> |
||||
<view class="stat-item"> |
||||
<view class="stat-value"> |
||||
<text class="stat-number">750</text> |
||||
<text class="stat-unit">人</text> |
||||
</view> |
||||
<text class="stat-label">邀约患者总数</text> |
||||
</view> |
||||
<view class="stat-item"> |
||||
<view class="stat-value"> |
||||
<text class="stat-number">700</text> |
||||
<text class="stat-unit">人</text> |
||||
</view> |
||||
<text class="stat-label">跳转患者数</text> |
||||
</view> |
||||
<view class="stat-item"> |
||||
<view class="stat-value"> |
||||
<text class="stat-number">700</text> |
||||
<text class="stat-unit">人</text> |
||||
</view> |
||||
<text class="stat-label">入组患者数</text> |
||||
</view> |
||||
</view> |
||||
|
||||
<view class="card-footer"> |
||||
<text class="bind-time">绑定时间:2026-01-10</text> |
||||
<view class="detail-btn" bind:tap="handleInfo">数据详情</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
||||
<ground-tab-bar active="{{ 1 }}"></ground-tab-bar> |
||||
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
{ |
||||
"navigationStyle": "custom", |
||||
"usingComponents": { |
||||
"popup": "/components/popup/index", |
||||
"navbar": "/components/navbar/index", |
||||
"login":"/components/login/index" |
||||
} |
||||
} |
||||
@ -0,0 +1,199 @@
@@ -0,0 +1,199 @@
|
||||
page { |
||||
background-color: #f8fafa; |
||||
} |
||||
.page-title { |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 22rpx; |
||||
font-size: 36rpx; |
||||
color: #1a2020; |
||||
} |
||||
|
||||
.page { |
||||
.page-header { |
||||
position: sticky; |
||||
left: 0; |
||||
top: 0; |
||||
padding: 32rpx; |
||||
background-color: #fff; |
||||
.chart-range { |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
gap: 16rpx; |
||||
.picker { |
||||
flex: 1; |
||||
.p-content { |
||||
padding: 8rpx 38rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
gap: 18rpx; |
||||
border-radius: 12rpx 12rpx 12rpx 12rpx; |
||||
border: 1px solid #f2f6f8; |
||||
.content { |
||||
font-size: 28rpx; |
||||
color: #b5b8bb; |
||||
} |
||||
.icon { |
||||
width: 32rpx; |
||||
height: 32rpx; |
||||
} |
||||
} |
||||
} |
||||
.line { |
||||
width: 24rpx; |
||||
height: 1px; |
||||
background-color: #f2f6f8; |
||||
} |
||||
} |
||||
} |
||||
.stat-card { |
||||
margin: 24rpx 32rpx 0; |
||||
padding: 32rpx 0; |
||||
background-color: #fff; |
||||
border-radius: 24rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: space-between; |
||||
.col { |
||||
flex: 1; |
||||
text-align: center; |
||||
.num { |
||||
font-size: 48rpx; |
||||
color: #4a8dff; |
||||
font-weight: bold; |
||||
line-height: 56rpx; |
||||
.sub { |
||||
font-size: 24rpx; |
||||
color: #b5b8bb; |
||||
font-weight: normal; |
||||
} |
||||
} |
||||
.title { |
||||
margin-top: 6rpx; |
||||
font-size: 24rpx; |
||||
color: #1a2020; |
||||
line-height: 36rpx; |
||||
} |
||||
} |
||||
} |
||||
.stat-list { |
||||
margin: 0 32rpx 0; |
||||
.module { |
||||
display: flex; |
||||
gap: 10rpx; |
||||
.aside { |
||||
display: flex; |
||||
align-items: center; |
||||
flex-direction: column; |
||||
gap: 14rpx; |
||||
.line-top { |
||||
flex-shrink: 0; |
||||
height: 40rpx; |
||||
width: 0; |
||||
border-right: 1px dashed #4a8dff; |
||||
} |
||||
.dot { |
||||
flex-shrink: 0; |
||||
width: 24rpx; |
||||
height: 24rpx; |
||||
background-color: rgba(74, 141, 255, 0.18); |
||||
border-radius: 50%; |
||||
&::after { |
||||
margin: 4rpx auto; |
||||
content: ''; |
||||
display: block; |
||||
width: 16rpx; |
||||
height: 16rpx; |
||||
border-radius: 50%; |
||||
background-color: #4a8dff; |
||||
} |
||||
} |
||||
.line-bottom { |
||||
flex: 1; |
||||
height: 40rpx; |
||||
width: 0; |
||||
border-right: 1px dashed #4a8dff; |
||||
} |
||||
} |
||||
.m-container { |
||||
padding-top: 46rpx; |
||||
.date { |
||||
font-size: 32rpx; |
||||
color: #4a5555; |
||||
} |
||||
.card { |
||||
margin-top: 24rpx; |
||||
border: 1px solid #f2f6f8; |
||||
border-radius: 16rpx; |
||||
overflow: hidden; |
||||
.row2 { |
||||
display: flex; |
||||
background: linear-gradient(265deg, #5393ff 0%, #3edec9 100%); |
||||
border-radius: 16rpx 16rpx 0 0; |
||||
.col { |
||||
flex: 1; |
||||
padding: 28rpx 34rpx; |
||||
.name { |
||||
font-size: 28rpx; |
||||
color: #ffffff; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #ffffff; |
||||
line-height: 48rpx; |
||||
} |
||||
} |
||||
.line { |
||||
width: 1px; |
||||
background-color: rgba(238, 245, 245, 0.35); |
||||
} |
||||
} |
||||
.row3 { |
||||
display: flex; |
||||
.col { |
||||
position: relative; |
||||
padding: 28rpx 34rpx; |
||||
flex: 1; |
||||
background-color: #fff; |
||||
.name { |
||||
font-size: 24rpx; |
||||
color: #b5b8bb; |
||||
line-height: 36rpx; |
||||
} |
||||
.num { |
||||
margin-top: 8rpx; |
||||
font-size: 40rpx; |
||||
color: #1a2020; |
||||
line-height: 48rpx; |
||||
} |
||||
.line { |
||||
position: absolute; |
||||
left: 20rpx; |
||||
bottom: 0; |
||||
width: 168rpx; |
||||
height: 1px; |
||||
background-color: rgba(242, 246, 248, 0.47); |
||||
} |
||||
&:nth-of-type(2) { |
||||
borer: 1px solid #eef5f5; |
||||
border-right: none; |
||||
border-left: none; |
||||
background-color: #f8fafa; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
&:first-of-type { |
||||
.aside { |
||||
.line-top { |
||||
opacity: 0; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,11 @@
@@ -0,0 +1,11 @@
|
||||
const _app = getApp<IAppOption>() |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
handleBack() { |
||||
wx.navigateBack() |
||||
}, |
||||
}) |
||||
|
||||
export {} |
||||
@ -0,0 +1,125 @@
@@ -0,0 +1,125 @@
|
||||
<navbar fixed custom-style="background:#fff"> |
||||
<view slot="left" class="page-title"> |
||||
<van-icon class="back" slot="left" name="arrow-left" bind:tap="handleBack" /> |
||||
专属邀约码 |
||||
</view> |
||||
</navbar> |
||||
|
||||
<view class="page" style="padding-top: {{pageTop}}px;"> |
||||
<view class="page-header" style="top:{{pageTop}}px"> |
||||
<view class="chart-range"> |
||||
<picker class="picker" mode="date" end="{{end}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
<view class="line"></view> |
||||
<picker class="picker" mode="date" start="{{satrt}}"> |
||||
<view class="p-content"> |
||||
<view class="content">2025/02/26</view> |
||||
<image class="icon" src="/images/icon8.png"></image> |
||||
</view> |
||||
</picker> |
||||
</view> |
||||
</view> |
||||
<view class="stat-card"> |
||||
<view class="col"> |
||||
<view class="num"> |
||||
1893 |
||||
<text class="sub">人</text> |
||||
</view> |
||||
<view class="title">邀约患者总数</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="num"> |
||||
1893 |
||||
<text class="sub">人</text> |
||||
</view> |
||||
<view class="title">跳转患者数</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="num"> |
||||
1893 |
||||
<text class="sub">人</text> |
||||
</view> |
||||
<view class="title">跳转患者数</view> |
||||
</view> |
||||
</view> |
||||
<view class="stat-list"> |
||||
<view class="module"> |
||||
<view class="aside"> |
||||
<view class="line-top"></view> |
||||
<view class="dot"></view> |
||||
<view class="line-bottom"></view> |
||||
</view> |
||||
<view class="m-container"> |
||||
<view class="date">2025/02/26</view> |
||||
<view class="card"> |
||||
<view class="row2"> |
||||
<view class="col"> |
||||
<view class="name">邀约患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">跳转患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
<view class="line"></view> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">750</view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">入组患者数</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">斑块状银屑病</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">300</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">溃疡性结肠炎</view> |
||||
<view class="num">280</view> |
||||
<view class="line"></view> |
||||
</view> |
||||
</view> |
||||
<view class="row3"> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">300</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
<view class="col"> |
||||
<view class="name">克罗恩病</view> |
||||
<view class="num">280</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
|
After Width: | Height: | Size: 499 KiB |
|
After Width: | Height: | Size: 698 KiB |
|
After Width: | Height: | Size: 675 KiB |
|
After Width: | Height: | Size: 685 KiB |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue