Browse Source

UI stash

master
kola-web 2 weeks ago
parent
commit
e3b7003c00
  1. 148
      .agents/skills/figma-design-to-code/SKILL.md
  2. 148
      .trae/skills/figma-design-to-code/SKILL.md
  3. 16
      eslint.config.mjs
  4. 10
      skills-lock.json
  5. 7
      src/app.ts
  6. 4
      src/components/pickerArea/index.wxml
  7. 20
      src/components/uploadFile/index.js
  8. 91
      src/components/uploadFile/index.scss
  9. 4
      src/doctor/pages/article/index.scss
  10. 1
      src/doctor/pages/article/index.wxml
  11. 3
      src/doctor/pages/articleList/index.scss
  12. 76
      src/doctor/pages/home/index.scss
  13. 31
      src/doctor/pages/home/index.wxml
  14. 2
      src/doctor/pages/invite/index.scss
  15. 2
      src/doctor/pages/patientList/index.scss
  16. 17
      src/doctor/pages/patientList/index.wxml
  17. 2
      src/doctor/pages/stat/index.scss
  18. 70
      src/ground/pages/home/index.scss
  19. 11
      src/ground/pages/home/index.wxml
  20. 2
      src/ground/pages/invite/index.scss
  21. 53
      src/ground/pages/pharmacist/index.scss
  22. 21
      src/ground/pages/pharmacist/index.wxml
  23. 2
      src/ground/pages/stat/index.scss
  24. 41
      src/pages/index/index.scss
  25. 2
      src/pages/index/index.ts
  26. 14
      src/pages/index/index.wxml
  27. 5
      src/pages/start/index.json
  28. 29
      src/pages/start/index.scss
  29. 7
      src/pages/start/index.ts
  30. 12
      src/pages/start/index.wxml

148
.agents/skills/figma-design-to-code/SKILL.md

@ -0,0 +1,148 @@
---
name: figma-design-to-code
description: >-
Implement integration-ready UI code from a Figma selection or a provided nodeId using TemPad Dev MCP as the only source of design evidence (code snapshot, structure, assets, tokens, codegen config). Detect the target repo stack and conventions first, then translate TemPad Dev’s Tailwind-like JSX/Vue IR into project-native code without adding new dependencies. Never guess key styles or measurements. If required evidence is missing/contradictory or assets cannot be handled under repo policy, stop or ship a safe base with explicit warnings and omissions.
---
# TemPad Dev: Figma Design to Code
This skill requires TemPad Dev MCP. If `tempad-dev:*` tools are unavailable/inactive/unauthorized, stop and tell the user to install TemPad Dev MCP and ensure it is activated in the TemPad Dev panel in the Figma design file.
TemPad Dev outputs Tailwind-like IR in either JSX or Vue. Treat MCP outputs as design facts. Never guess key styles.
## Evidence rules
Priority order:
1. `tempad-dev:get_code` (authoritative: explicit values, layout intent, warnings, assets, tokens, codegen, lang)
2. `tempad-dev:get_structure` (hierarchy, overlap, bounds clarification)
Never invent: colors, typography (size/weight/line-height/letter-spacing), spacing, radius, borders, shadows, gradients, opacity/overlays, blur.
Do not output `data-hint-*` attributes.
Treat advanced/rare style output as high-confidence evidence from TemPad codegen. Preserve it unless it directly conflicts with repo constraints.
## Workflow
### 1) Detect repo conventions
From the repo (do not assume), identify what is needed to integrate cleanly:
- Framework/runtime and file conventions (React/Vue, TS/JS, SFC conventions, naming)
- Styling integration rules (utility allowed? class sorting? linting? extraction patterns?)
- Token/theme system (CSS variables, token files, naming, dark mode/modes)
- Asset policy (public folder vs imports, icon pipeline, hashing, directory rules)
- Existing primitives/components (buttons, inputs, typography, layout wrappers), import path conventions
Only if the repo actually uses Tailwind (or Tailwind-compat tooling), also detect Tailwind version and conventions that affect class syntax/formatting.
If uncertain, ask up to 3 minimal questions; otherwise proceed and warn where inferred.
### 2) Fetch baseline design snapshot
Call `tempad-dev:get_code` with:
- `resolveTokens: false`
- pass `nodeId` only if user provided one; otherwise rely on the tool’s default behavior (current selection)
- `preferredLang`: choose what matches the repo (jsx or vue)
Important: `get_code.lang` is the language actually used by MCP after considering TemPad Dev plugin/config priority. A plugin may override `preferredLang`. Use returned `lang` plus `codegen` facts to interpret the IR correctly, then translate to the repo’s required output.
Record as design facts:
- `code`, `lang`
- `warnings`
- `assets` (if present)
- `tokens` (if present)
- `codegen` (e.g. scale, length units, rootRem, and other normalization settings)
### 3) Resolve warnings and uncertainty
If warnings indicate missing/partial/uncertain evidence, act immediately:
- `depth-cap`: call `get_code` once per listed subtree root `nodeId` and stitch results before implementing.
- If warning data indicates overflow (for example `cappedNodeOverflow=true`), treat evidence as incomplete and stop full implementation. Ask for narrower scope or user-prioritized subtrees.
- output budget exceeded error: pass a smaller subtree `nodeId` to narrow scope, then retry `get_code`.
- Always report current consumption, limit, and overage from the error text when asking for scope changes (for example `current ~7800 tokens / 31240 bytes; limit ~6000 tokens / 24000 bytes; over by ~1800 tokens / 7240 bytes`).
- Layout/overlap uncertainty: call `get_structure` to resolve contradictions.
- If contradictions remain after structure (or cannot be narrowed), stop.
Retry policy:
- Retry once only for transient transport/connectivity failures (e.g. timeout/disconnect/no active extension after reconnect/activation).
- Do not blind-retry deterministic errors (`depth-cap`, budget exceeded, invalid selection, node not visible). Change scope or inputs first.
### 4) Assets handling (only if `assets` exists)
Follow repo asset policy first:
- Download bytes via TemPad-provided `asset.url`, save into repo at policy-correct path, reference with repo conventions.
- If policy forbids storing assets, you may reference TemPad URLs but must warn output depends on the local TemPad asset server.
- Do not read image/SVG bytes into LLM context for analysis. Treat assets as files to download/reference, not text evidence to parse.
Never download assets from the public internet. Only TemPad-provided `asset.url`.
### 5) Tokens mapping (only if `tokens` exists)
Token evidence shape:
- `tokens` is a record keyed by canonical CSS variable names (e.g. `--...`).
- Each token’s value is either a string or a record keyed by `Collection:Mode` strings whose values are strings.
- Any value string may reference other variables; preserve references.
Mapping goal: integrate with repo tokens when safe; otherwise keep explicit values from `get_code`.
Rules:
1. Prefer existing repo tokens when you can justify equivalence using value equivalence (including references) plus semantic alignment in the repo.
Token naming can be supporting evidence, but do not map solely because names look similar.
2. Add new tokens only if the repo already has an established token workflow and this change is expected.
3. If mode selection or mapping remains ambiguous, keep explicit values and warn.
Hints may be used only for reasoning about mode selection when present; never output hint attributes.
### 6) Implement repo-native code
Translate TemPad Dev IR into the repo’s conventions:
- Utility-first repo (Tailwind/UnoCSS): keep utility classes; adjust ordering/formatting to match repo rules. If Tailwind is used, respect the repo’s Tailwind version/config before changing class syntax.
- Non-utility repo: translate utilities into the repo’s styling approach (CSS Modules/scoped CSS/Sass/CSS-in-JS) while preserving explicit values.
Constraints:
- Do not introduce new frameworks or styling systems.
- New runtime/build dependencies require user confirmation unless the user explicitly says no confirmation is needed.
- Implement base state only unless variants/states are provable from repo conventions or evidence.
- Preserve high-fidelity style details from `get_code` (including pseudo-elements/pseudo-classes, uncommon style properties, filters/masks/blend/backdrop effects, and non-default compositing details). Do not simplify them away unless required by repo constraints.
Component extraction and primitives:
- Extract only when repetition + repo patterns justify it.
- Prefer existing repo primitives/components when they match intended semantics and do not require guessing styles.
### 7) Semantics and accessibility minimums
Only apply when the IR would otherwise require plain container semantics (e.g. clickable `div`) and you are not already using an appropriate repo primitive/component:
- Use native elements where appropriate (`button`, `a`, `input/label`).
- Ensure keyboard interaction and focusability.
- Add accessible names when needed (`aria-label`, `alt`).
Assume the repo’s existing CSS reset/normalize. Do not add new reset libraries or global CSS unless the repo already has a defined pattern for it.
### 8) Exit and wrap-up
Stop (do not ship code) when:
- TemPad Dev MCP is unavailable/unauthorized, or target cannot be read
- Evidence is contradictory and cannot be resolved via structure or narrower scope
- Required assets cannot be retrieved/stored under repo policy
Otherwise, ship the best-evidence base implementation and end with:
- Evidence caveats: any `warnings`, omissions, or inferred repo conventions
- Assets: stored vs TemPad URLs, and any policy-driven constraints
- Tokens: mapped vs explicit values, and any ambiguity
- Dependencies: whether any were added (and whether user confirmation was obtained)
- If stopped: next required info (max 3 items)

148
.trae/skills/figma-design-to-code/SKILL.md

@ -0,0 +1,148 @@
---
name: figma-design-to-code
description: >-
Implement integration-ready UI code from a Figma selection or a provided nodeId using TemPad Dev MCP as the only source of design evidence (code snapshot, structure, assets, tokens, codegen config). Detect the target repo stack and conventions first, then translate TemPad Dev’s Tailwind-like JSX/Vue IR into project-native code without adding new dependencies. Never guess key styles or measurements. If required evidence is missing/contradictory or assets cannot be handled under repo policy, stop or ship a safe base with explicit warnings and omissions.
---
# TemPad Dev: Figma Design to Code
This skill requires TemPad Dev MCP. If `tempad-dev:*` tools are unavailable/inactive/unauthorized, stop and tell the user to install TemPad Dev MCP and ensure it is activated in the TemPad Dev panel in the Figma design file.
TemPad Dev outputs Tailwind-like IR in either JSX or Vue. Treat MCP outputs as design facts. Never guess key styles.
## Evidence rules
Priority order:
1. `tempad-dev:get_code` (authoritative: explicit values, layout intent, warnings, assets, tokens, codegen, lang)
2. `tempad-dev:get_structure` (hierarchy, overlap, bounds clarification)
Never invent: colors, typography (size/weight/line-height/letter-spacing), spacing, radius, borders, shadows, gradients, opacity/overlays, blur.
Do not output `data-hint-*` attributes.
Treat advanced/rare style output as high-confidence evidence from TemPad codegen. Preserve it unless it directly conflicts with repo constraints.
## Workflow
### 1) Detect repo conventions
From the repo (do not assume), identify what is needed to integrate cleanly:
- Framework/runtime and file conventions (React/Vue, TS/JS, SFC conventions, naming)
- Styling integration rules (utility allowed? class sorting? linting? extraction patterns?)
- Token/theme system (CSS variables, token files, naming, dark mode/modes)
- Asset policy (public folder vs imports, icon pipeline, hashing, directory rules)
- Existing primitives/components (buttons, inputs, typography, layout wrappers), import path conventions
Only if the repo actually uses Tailwind (or Tailwind-compat tooling), also detect Tailwind version and conventions that affect class syntax/formatting.
If uncertain, ask up to 3 minimal questions; otherwise proceed and warn where inferred.
### 2) Fetch baseline design snapshot
Call `tempad-dev:get_code` with:
- `resolveTokens: false`
- pass `nodeId` only if user provided one; otherwise rely on the tool’s default behavior (current selection)
- `preferredLang`: choose what matches the repo (jsx or vue)
Important: `get_code.lang` is the language actually used by MCP after considering TemPad Dev plugin/config priority. A plugin may override `preferredLang`. Use returned `lang` plus `codegen` facts to interpret the IR correctly, then translate to the repo’s required output.
Record as design facts:
- `code`, `lang`
- `warnings`
- `assets` (if present)
- `tokens` (if present)
- `codegen` (e.g. scale, length units, rootRem, and other normalization settings)
### 3) Resolve warnings and uncertainty
If warnings indicate missing/partial/uncertain evidence, act immediately:
- `depth-cap`: call `get_code` once per listed subtree root `nodeId` and stitch results before implementing.
- If warning data indicates overflow (for example `cappedNodeOverflow=true`), treat evidence as incomplete and stop full implementation. Ask for narrower scope or user-prioritized subtrees.
- output budget exceeded error: pass a smaller subtree `nodeId` to narrow scope, then retry `get_code`.
- Always report current consumption, limit, and overage from the error text when asking for scope changes (for example `current ~7800 tokens / 31240 bytes; limit ~6000 tokens / 24000 bytes; over by ~1800 tokens / 7240 bytes`).
- Layout/overlap uncertainty: call `get_structure` to resolve contradictions.
- If contradictions remain after structure (or cannot be narrowed), stop.
Retry policy:
- Retry once only for transient transport/connectivity failures (e.g. timeout/disconnect/no active extension after reconnect/activation).
- Do not blind-retry deterministic errors (`depth-cap`, budget exceeded, invalid selection, node not visible). Change scope or inputs first.
### 4) Assets handling (only if `assets` exists)
Follow repo asset policy first:
- Download bytes via TemPad-provided `asset.url`, save into repo at policy-correct path, reference with repo conventions.
- If policy forbids storing assets, you may reference TemPad URLs but must warn output depends on the local TemPad asset server.
- Do not read image/SVG bytes into LLM context for analysis. Treat assets as files to download/reference, not text evidence to parse.
Never download assets from the public internet. Only TemPad-provided `asset.url`.
### 5) Tokens mapping (only if `tokens` exists)
Token evidence shape:
- `tokens` is a record keyed by canonical CSS variable names (e.g. `--...`).
- Each token’s value is either a string or a record keyed by `Collection:Mode` strings whose values are strings.
- Any value string may reference other variables; preserve references.
Mapping goal: integrate with repo tokens when safe; otherwise keep explicit values from `get_code`.
Rules:
1. Prefer existing repo tokens when you can justify equivalence using value equivalence (including references) plus semantic alignment in the repo.
Token naming can be supporting evidence, but do not map solely because names look similar.
2. Add new tokens only if the repo already has an established token workflow and this change is expected.
3. If mode selection or mapping remains ambiguous, keep explicit values and warn.
Hints may be used only for reasoning about mode selection when present; never output hint attributes.
### 6) Implement repo-native code
Translate TemPad Dev IR into the repo’s conventions:
- Utility-first repo (Tailwind/UnoCSS): keep utility classes; adjust ordering/formatting to match repo rules. If Tailwind is used, respect the repo’s Tailwind version/config before changing class syntax.
- Non-utility repo: translate utilities into the repo’s styling approach (CSS Modules/scoped CSS/Sass/CSS-in-JS) while preserving explicit values.
Constraints:
- Do not introduce new frameworks or styling systems.
- New runtime/build dependencies require user confirmation unless the user explicitly says no confirmation is needed.
- Implement base state only unless variants/states are provable from repo conventions or evidence.
- Preserve high-fidelity style details from `get_code` (including pseudo-elements/pseudo-classes, uncommon style properties, filters/masks/blend/backdrop effects, and non-default compositing details). Do not simplify them away unless required by repo constraints.
Component extraction and primitives:
- Extract only when repetition + repo patterns justify it.
- Prefer existing repo primitives/components when they match intended semantics and do not require guessing styles.
### 7) Semantics and accessibility minimums
Only apply when the IR would otherwise require plain container semantics (e.g. clickable `div`) and you are not already using an appropriate repo primitive/component:
- Use native elements where appropriate (`button`, `a`, `input/label`).
- Ensure keyboard interaction and focusability.
- Add accessible names when needed (`aria-label`, `alt`).
Assume the repo’s existing CSS reset/normalize. Do not add new reset libraries or global CSS unless the repo already has a defined pattern for it.
### 8) Exit and wrap-up
Stop (do not ship code) when:
- TemPad Dev MCP is unavailable/unauthorized, or target cannot be read
- Evidence is contradictory and cannot be resolved via structure or narrower scope
- Required assets cannot be retrieved/stored under repo policy
Otherwise, ship the best-evidence base implementation and end with:
- Evidence caveats: any `warnings`, omissions, or inferred repo conventions
- Assets: stored vs TemPad URLs, and any policy-driven constraints
- Tokens: mapped vs explicit values, and any ambiguity
- Dependencies: whether any were added (and whether user confirmation was obtained)
- If stopped: next required info (max 3 items)

16
eslint.config.mjs

@ -10,14 +10,14 @@ export default antfu(
stylistic: false, stylistic: false,
parserOptions: { project: ['./tsconfig.json'] }, parserOptions: { project: ['./tsconfig.json'] },
globals: { globals: {
wx: true, wx: 'readonly',
App: true, App: 'readonly',
Page: true, Page: 'readonly',
getCurrentPages: true, getCurrentPages: 'readonly',
getApp: true, getApp: 'readonly',
Component: true, Component: 'readonly',
requirePlugin: true, requirePlugin: 'readonly',
requireMiniProgram: true, requireMiniProgram: 'readonly',
}, },
rules: { rules: {
'eslint-comments/no-unlimited-disable': 'off', 'eslint-comments/no-unlimited-disable': 'off',

10
skills-lock.json

@ -0,0 +1,10 @@
{
"version": 1,
"skills": {
"figma-design-to-code": {
"source": "ecomfe/tempad-dev",
"sourceType": "github",
"computedHash": "3c4e79fb7fe6095d2fa1a27698e9c701547c595a67c48b3ce38716c6ed48803c"
}
}
}

7
src/app.ts

@ -30,11 +30,10 @@ App<IAppOption>({
imageUrl: 'https://app.yd.hbraas.com/images/', imageUrl: 'https://app.yd.hbraas.com/images/',
// pro // pro
// appid:wx96104303877e3fd9 老的正式环境,已弃用
// appid:wxfc95e2961d481f58 // appid:wxfc95e2961d481f58
// url: 'https://m.hbgene.hbsaas.com', // url: 'https://app.yd.hbsaas.com',
// upFileUrl: 'https://m.hbgene.hbsaas.com/', // upFileUrl: 'https://app.yd.hbsaas.com/',
// imageUrl: 'https://m.hbgene.hbsaas.com/GeneB/', // imageUrl: 'https://app.yd.hbsaas.com/images/',
Timestamp: new Date().getTime(), Timestamp: new Date().getTime(),

4
src/components/pickerArea/index.wxml

@ -9,11 +9,11 @@
<view class="area"> <view class="area">
<view class="item" bind:tap="handleProvince"> <view class="item" bind:tap="handleProvince">
<view class="content">{{ProvinceName || '请选择省份'}}</view> <view class="content">{{ProvinceName || '请选择省份'}}</view>
<image class="icon" src="{{imageUrl}}icon6.png?t={{Timestamp}}"></image> <image class="icon" src="{{imageUrl}}icon2.png?t={{Timestamp}}"></image>
</view> </view>
<view class="item" bind:tap="handleCity"> <view class="item" bind:tap="handleCity">
<view class="content">{{CityName || '请选择城市'}}</view> <view class="content">{{CityName || '请选择城市'}}</view>
<image class="icon" src="{{imageUrl}}icon6.png?t={{Timestamp}}"></image> <image class="icon" src="{{imageUrl}}icon2.png?t={{Timestamp}}"></image>
</view> </view>
<view class="btn" bind:tap="handleShare">确定</view> <view class="btn" bind:tap="handleShare">确定</view>
</view> </view>

20
src/components/uploadFile/index.js

@ -86,7 +86,7 @@ Component({
}) })
wx.previewMedia({ wx.previewMedia({
current: index, current: index,
sources: sources, sources,
}) })
} else if (params.fileType !== 'audio') { } else if (params.fileType !== 'audio') {
wx.downloadFile({ wx.downloadFile({
@ -120,7 +120,7 @@ Component({
icon: 'none', icon: 'none',
}) })
wx.downloadFile({ wx.downloadFile({
url: item.fileUrl, url: item.url || item.fileUrl,
success(res) { success(res) {
if (item.type === 'image') { if (item.type === 'image') {
wx.saveImageToPhotosAlbum({ wx.saveImageToPhotosAlbum({
@ -164,7 +164,7 @@ Component({
wx.uploadFile({ wx.uploadFile({
filePath: item.tempFilePath, filePath: item.tempFilePath,
name: 'file', name: 'file',
url: url, url,
success: (res) => { success: (res) => {
let data = JSON.parse(res.data) let data = JSON.parse(res.data)
let expandJson = { let expandJson = {
@ -191,11 +191,11 @@ Component({
}) })
}, },
GetExtensionFileName(pathfilename) { GetExtensionFileName(pathfilename) {
var reg = /(\\+)/g let reg = /(\\+)/g
var pString = pathfilename.replace(reg, '#') //用正则表达式来将\或\\替换成# let pString = pathfilename.replace(reg, '#') //用正则表达式来将\或\\替换成#
var arr = pString.split('#') // 以“#”为分隔符,将字符分解为数组 例如 D Program Files bg.png let arr = pString.split('#') // 以“#”为分隔符,将字符分解为数组 例如 D Program Files bg.png
var lastString = arr[arr.length - 1] //取最后一个字符 let lastString = arr[arr.length - 1] //取最后一个字符
var arr2 = lastString.split('.') // 再以"."作为分隔符 let arr2 = lastString.split('.') // 再以"."作为分隔符
return arr2[arr2.length - 1] //将后缀名返回出来 return arr2[arr2.length - 1] //将后缀名返回出来
}, },
upFile(data) { upFile(data) {
@ -246,7 +246,7 @@ Component({
} }
wx.chooseMedia({ wx.chooseMedia({
mediaType: ['image', 'video'], mediaType: ['image', 'video'],
count: count, count,
sourceType: ['album', 'camera'], sourceType: ['album', 'camera'],
sizeType: ['original'], sizeType: ['original'],
success: (res) => { success: (res) => {
@ -267,7 +267,7 @@ Component({
count = maxNum - fileList.length count = maxNum - fileList.length
} }
wx.chooseMessageFile({ wx.chooseMessageFile({
count: count, count,
type: 'file', type: 'file',
extension: ['doc', 'docx', 'pdf', 'xlsx', 'xls', 'ppt', 'pptx'], extension: ['doc', 'docx', 'pdf', 'xlsx', 'xls', 'ppt', 'pptx'],
success: (res) => { success: (res) => {

91
src/components/uploadFile/index.scss

@ -1,91 +0,0 @@
/* components/uploadFile/index.wxss */
.upload-list {
display: grid;
grid-template-columns: repeat(3, minmax(160rpx, 200rpx));
gap: 18rpx;
.item {
height: 180rpx;
position: relative;
line-height: 0;
background-color: rgba(247, 247, 250, 1);
border-radius: 12rpx;
display: flex;
align-items: center;
justify-content: center;
.item_mask {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
display: flex;
justify-content: center;
align-items: center;
.item_mask_icon {
border-radius: 100%;
overflow: hidden;
background: #fff;
font-size: 0;
}
}
.image {
width: 100%;
height: 100%;
border-radius: 12rpx;
}
.sub-image {
width: 104rpx;
height: 104rpx;
}
.clear {
position: absolute;
right: 0;
top: 0;
width: 36rpx;
height: 36rpx;
z-index: 9;
}
}
.btn {
width: 188rpx;
height: 188rpx;
border-radius: 12rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: rgba(247, 247, 250, 1);
.name {
margin-top: 12rpx;
font-size: 28rpx;
color: rgba(207, 209, 213, 1);
}
}
}
.popup {
padding: 102rpx 48rpx calc(102rpx + env(safe-area-inset-bottom));
display: flex;
align-items: center;
gap: 30rpx;
justify-content: space-between;
background-color: rgba(247, 247, 250, 1);
.item {
padding: 32rpx;
flex: 1;
border-radius: 36rpx;
background-color: #fff;
text-align: center;
.title {
margin-top: 16rpx;
font-size: 32rpx;
color: rgba(1, 1, 5, 1);
}
.icon {
width: 136rpx;
height: 136rpx;
}
}
}

4
src/doctor/pages/article/index.scss

@ -26,7 +26,7 @@ page {
.content { .content {
margin-top: 32rpx; margin-top: 32rpx;
font-size: 32rpx; font-size: 32rpx;
color: #afaba9; color: #8F8D8C;
} }
.page-footer { .page-footer {
position: fixed; position: fixed;
@ -51,7 +51,7 @@ page {
} }
.num { .num {
font-size: 32rpx; font-size: 32rpx;
color: #b7b7b7; color: #8F8D8C;
} }
} }
} }

1
src/doctor/pages/article/index.wxml

@ -16,6 +16,7 @@
</view> </view>
<view class="o-item"> <view class="o-item">
<image class="icon" src="{{imageUrl}}icon23.png?t={{Timestamp}}"></image> <image class="icon" src="{{imageUrl}}icon23.png?t={{Timestamp}}"></image>
<!-- <image class="icon" src="{{imageUrl}}icon25.png?t={{Timestamp}}"></image> -->
<text class="num">123</text> <text class="num">123</text>
</view> </view>
</view> </view>

3
src/doctor/pages/articleList/index.scss

@ -22,9 +22,12 @@ page {
font-size: 28rpx; font-size: 28rpx;
color: #342317; color: #342317;
line-height: 48rpx; line-height: 48rpx;
min-width: 25vw;
box-sizing: border-box;
&.active { &.active {
position: relative; position: relative;
color: #ff8a4c; color: #ff8a4c;
font-size: 32rpx;
&::after { &::after {
position: absolute; position: absolute;
bottom: 0; bottom: 0;

76
src/doctor/pages/home/index.scss

@ -20,7 +20,6 @@ page {
margin: 48rpx 0 0 32rpx; margin: 48rpx 0 0 32rpx;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: start;
gap: 20rpx; gap: 20rpx;
.avatar { .avatar {
flex-shrink: 0; flex-shrink: 0;
@ -35,13 +34,16 @@ page {
.name { .name {
font-size: 36rpx; font-size: 36rpx;
color: #ffffff; color: #ffffff;
display: flex;
align-items: center;
gap: 12rpx;
.label { .label {
margin-top: 8rpx; margin-top: 8rpx;
padding: 0 12rpx; padding: 4rpx 12rpx;
display: inline-block; display: inline-block;
font-size: 28rpx; font-size: 28rpx;
color: #ffffff; color: #ffffff;
line-height: 36rpx; line-height: 1;
border-radius: 6rpx; border-radius: 6rpx;
background: linear-gradient(84deg, #fece55 0%, #ffb700 100%); background: linear-gradient(84deg, #fece55 0%, #ffb700 100%);
} }
@ -57,22 +59,66 @@ page {
} }
} }
.code { .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 { .icon {
display: block; display: block;
width: 52rpx; width: 152rpx;
height: 52rpx; height: 84rpx;
} }
.arrow { }
}
.todo-data {
margin: 32rpx;
padding: 32rpx;
background: linear-gradient(180deg, #ffeede 0%, #ffffff 27.84%, #ffffff 100%);
border-radius: 24rpx 24rpx 24rpx 24rpx;
border: 2rpx solid #ffffff;
.t-header {
display: flex;
align-items: center;
justify-content: space-between;
.title {
font-size: 36rpx;
color: #342317;
font-weight: bold;
}
.tip {
font-size: 28rpx;
color: #b7b7b7;
}
}
.row {
margin: 32rpx 0 0;
padding: 24rpx;
background: linear-gradient(90deg, #ff8a4c 0%, #fece55 100%);
border-radius: 16rpx 16rpx 16rpx 16rpx;
display: flex;
justify-content: space-between;
align-items: center;
.col {
flex: 1;
border-right: 1px solid rgba(245, 244, 243, 0.47);
display: flex;
flex-direction: column;
align-items: center;
&:last-child {
border-right: none;
}
.name {
min-width: 4em;
font-size: 28rpx; font-size: 28rpx;
color: #ffffff; color: #ffffff;
line-height: 36rpx;
white-space: pre-line;
text-align: left;
}
.num {
width: 100%;
margin-top: 8rpx;
font-size: 44rpx;
color: #ffffff;
line-height: 48rpx;
text-align: left;
}
} }
} }
} }
@ -183,7 +229,7 @@ page {
} }
} }
.chat-data { .chat-data {
margin: 32rpx 32rpx; margin: 32rpx 32rpx 0;
padding: 32rpx; padding: 32rpx;
background: linear-gradient(180deg, #fff6ed 0%, #ffffff 7.03%, #ffffff 100%); background: linear-gradient(180deg, #fff6ed 0%, #ffffff 7.03%, #ffffff 100%);
border-radius: 24rpx 24rpx 24rpx 24rpx; border-radius: 24rpx 24rpx 24rpx 24rpx;

31
src/doctor/pages/home/index.wxml

@ -1,7 +1,7 @@
<navbar fixed custom-style="background: {{background}};"> <navbar fixed custom-style="background: {{background}};">
<view class="page-switch" slot="left" style="color: {{background=='transparent'?'#fff':'#FF8A4C'}};"> <view class="page-switch" slot="left" style="color: {{background=='transparent'?'#fff':'#FF8A4C'}};">
特诺雅 特诺雅
<text style="font-size: 0.5em; vertical-align: top">®</text> <text style="font-size: 0.5em; vertical-align: super">®</text>
<van-icon class="arrow" name="arrow-down" /> <van-icon class="arrow" name="arrow-down" />
</view> </view>
</navbar> </navbar>
@ -21,8 +21,33 @@
<view class="date">入组时间:2026/02/03</view> <view class="date">入组时间:2026/02/03</view>
</view> </view>
<view class="code" bind:tap="handleInvite"> <view class="code" bind:tap="handleInvite">
<image class="icon" src="{{imageUrl}}icon7.png?t={{Timestamp}}"></image> <image class="icon" src="{{imageUrl}}icon24.png?t={{Timestamp}}"></image>
<van-icon class="arrow" name="arrow" /> </view>
</view>
<view class="todo-data">
<view class="t-header">
<view class="title">待处理事项</view>
<view class="tip">实时数据</view>
</view>
<view class="row">
<view class="col">
<view class="col-center">
<view class="name">待处理\n患者数</view>
<view class="num">25</view>
</view>
</view>
<view class="col">
<view class="col-center">
<view class="name">跳转证明\n待上传</view>
<view class="num">25</view>
</view>
</view>
<view class="col">
<view class="col-center">
<view class="name">入组证明\n待上传</view>
<view class="num">25</view>
</view>
</view>
</view> </view>
</view> </view>
<view class="stat-data"> <view class="stat-data">

2
src/doctor/pages/invite/index.scss

@ -57,7 +57,7 @@
text-align: center; text-align: center;
} }
.bg { .bg {
margin: -12rpx auto 0; margin: -14rpx auto 0;
width: 140rpx; width: 140rpx;
height: 16rpx; height: 16rpx;
background: linear-gradient(90deg, #fdd260 0%, rgba(253, 210, 96, 0.07) 100%); background: linear-gradient(90deg, #fdd260 0%, rgba(253, 210, 96, 0.07) 100%);

2
src/doctor/pages/patientList/index.scss

@ -124,7 +124,7 @@ page {
.card { .card {
margin: 32rpx; margin: 32rpx;
padding: 32rpx; padding: 32rpx;
background: linear-gradient(0deg, #fff6ed 0%, #ffffff 21.63%, #ffffff 100%); background: linear-gradient(180deg, #fff6ed 0%, #ffffff 21.63%, #ffffff 100%);
border-radius: 24rpx 24rpx 24rpx 24rpx; border-radius: 24rpx 24rpx 24rpx 24rpx;
border: 2rpx solid #ffffff; border: 2rpx solid #ffffff;
.user { .user {

17
src/doctor/pages/patientList/index.wxml

@ -1,6 +1,7 @@
<navbar fixed custom-style="background: transparent;"> <navbar fixed custom-style="background: transparent;">
<view class="page-switch" slot="left"> <view class="page-switch" slot="left">
特诺雅<text style="font-size:0.5em;vertical-align: top;">®</text> 特诺雅
<text style="font-size: 0.5em; vertical-align: super">®</text>
<van-icon class="arrow" name="arrow-down" /> <van-icon class="arrow" name="arrow-down" />
</view> </view>
</navbar> </navbar>
@ -60,7 +61,7 @@
</view> </view>
</view> </view>
<view class="page-container"> <view class="page-container">
<view class="card" wx:for="{{6}}" wx:key="index"> <view class="card">
<view class="user"> <view class="user">
<image class="avatar" src="{{imageUrl}}cache/a2.png?t={{Timestamp}}"></image> <image class="avatar" src="{{imageUrl}}cache/a2.png?t={{Timestamp}}"></image>
<view class="wrap"> <view class="wrap">
@ -105,7 +106,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="card" wx:if="{{false}}"> <view class="card">
<view class="user"> <view class="user">
<image class="avatar" src="{{imageUrl}}cache/a2.png?t={{Timestamp}}"></image> <image class="avatar" src="{{imageUrl}}cache/a2.png?t={{Timestamp}}"></image>
<view class="wrap"> <view class="wrap">
@ -131,7 +132,7 @@
<view class="date">2026/01/10 16:27:35</view> <view class="date">2026/01/10 16:27:35</view>
<view class="status"> <view class="status">
<view class="s2">驳回</view> <view class="s2">驳回</view>
<view class="btn2">重新提交</view> <view class="btn2" bind:tap="handleUpload">重新提交</view>
</view> </view>
<view class="remark">材料信息不全</view> <view class="remark">材料信息不全</view>
</view> </view>
@ -151,7 +152,7 @@
</view> </view>
</view> </view>
</view> </view>
<view class="card" wx:if="{{false}}"> <view class="card">
<view class="user"> <view class="user">
<image class="avatar" src="{{imageUrl}}cache/a2.png?t={{Timestamp}}"></image> <image class="avatar" src="{{imageUrl}}cache/a2.png?t={{Timestamp}}"></image>
<view class="wrap"> <view class="wrap">
@ -186,13 +187,17 @@
<view class="aside"> <view class="aside">
<view class="line-top"></view> <view class="line-top"></view>
<view class="step"> <view class="step">
<view class="name">未跳转</view> <view class="name">已入组</view>
<view class="order"></view> <view class="order"></view>
</view> </view>
<view class="line-bottom"></view> <view class="line-bottom"></view>
</view> </view>
<view class="wrap"> <view class="wrap">
<view class="date">2026/01/10 16:27:35</view> <view class="date">2026/01/10 16:27:35</view>
<view class="status">
<view class="s1">审核通过</view>
<view class="btn1">查看提交材料</view>
</view>
</view> </view>
</view> </view>
</view> </view>

2
src/doctor/pages/stat/index.scss

@ -117,7 +117,7 @@ page {
} }
} }
.m-container { .m-container {
padding-top: 46rpx; padding-top: 44rpx;
.date { .date {
font-size: 32rpx; font-size: 32rpx;
color: #4a5555; color: #4a5555;

70
src/ground/pages/home/index.scss

@ -20,7 +20,7 @@ page {
margin: 48rpx 0 0 32rpx; margin: 48rpx 0 0 32rpx;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: start; align-items: center;
gap: 20rpx; gap: 20rpx;
.avatar { .avatar {
flex-shrink: 0; flex-shrink: 0;
@ -30,7 +30,6 @@ page {
border: 1px solid #fff; border: 1px solid #fff;
} }
.wrap { .wrap {
padding-top: 8rpx;
flex: 1; flex: 1;
.name { .name {
font-size: 36rpx; font-size: 36rpx;
@ -38,32 +37,20 @@ page {
} }
.label { .label {
margin-top: 8rpx; margin-top: 8rpx;
padding: 0 12rpx; padding: 4rpx 12rpx;
display: inline-block; display: inline-block;
font-size: 28rpx; font-size: 28rpx;
color: #ffffff; color: #ffffff;
line-height: 36rpx; line-height: 1;
border-radius: 6rpx; border-radius: 6rpx;
background: linear-gradient(86deg, #fcd675 0%, #ffb700 100%); background: linear-gradient(86deg, #fcd675 0%, #ffb700 100%);
} }
} }
.code { .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 { .icon {
display: block; display: block;
width: 52rpx; width: 152rpx;
height: 52rpx; height: 84rpx;
}
.arrow {
font-size: 28rpx;
color: #ffffff;
} }
} }
} }
@ -136,7 +123,8 @@ page {
border-radius: 16rpx 16rpx 0 0; border-radius: 16rpx 16rpx 0 0;
.col { .col {
flex: 1; flex: 1;
padding: 28rpx 34rpx; padding: 28rpx 0;
text-indent: 1em;
.name { .name {
font-size: 28rpx; font-size: 28rpx;
color: #ffffff; color: #ffffff;
@ -196,46 +184,46 @@ page {
} }
} }
} }
.chat-data { .chat-switch-btns {
margin: 32rpx 32rpx; margin: 24rpx 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;
.c-header {
display: flex;
align-items: center;
justify-content: space-between;
.title {
font-size: 36rpx;
color: #1a2020;
font-weight: bold;
}
.switch-btns {
flex: 1;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 24rpx; gap: 24rpx;
padding: 12rpx;
background: linear-gradient(180deg, #eff5ff 0%, #ffffff 100%);
border-radius: 96rpx 96rpx 96rpx 96rpx;
border: 2rpx solid #ffffff;
.btn { .btn {
flex: 1; flex: 1;
width: 148rpx; width: 148rpx;
height: 56rpx; height: 72rpx;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: #ffffff;
border-radius: 1748rpx 1748rpx 1748rpx 1748rpx; border-radius: 1748rpx 1748rpx 1748rpx 1748rpx;
border: 1px solid #edf2f2;
&.active { &.active {
background-color: #4a8dff; background-color: #4a8dff;
color: #fff; color: #fff;
border-color: #4a8dff;
} }
} }
} }
.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;
}
} }
.c-options { .c-options {
margin-top: 28rpx;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;

11
src/ground/pages/home/index.wxml

@ -1,7 +1,7 @@
<navbar fixed custom-style="background: {{background}};"> <navbar fixed custom-style="background: {{background}};">
<view class="page-switch" slot="left" style="color: {{background=='transparent'?'#fff':'#4A8DFF'}};"> <view class="page-switch" slot="left" style="color: {{background=='transparent'?'#fff':'#4A8DFF'}};">
特诺雅 特诺雅
<text style="font-size: 0.5em; vertical-align: top">®</text> <text style="font-size: 0.5em; vertical-align: super">®</text>
<van-icon class="arrow" name="arrow-down" /> <van-icon class="arrow" name="arrow-down" />
</view> </view>
</navbar> </navbar>
@ -18,7 +18,6 @@
</view> </view>
<view class="code" bind:tap="handleInvite"> <view class="code" bind:tap="handleInvite">
<image class="icon" src="{{imageUrl}}icon7.png?t={{Timestamp}}"></image> <image class="icon" src="{{imageUrl}}icon7.png?t={{Timestamp}}"></image>
<van-icon class="arrow" name="arrow" />
</view> </view>
</view> </view>
<view class="stat-data"> <view class="stat-data">
@ -110,13 +109,13 @@
</view> </view>
</view> </view>
</view> </view>
<view class="chat-data"> <view class="chat-switch-btns">
<view class="c-header">
<!-- <view class="title">邀约患者统计</view> -->
<view class="switch-btns">
<view class="btn">月统计</view> <view class="btn">月统计</view>
<view class="btn active">日统计</view> <view class="btn active">日统计</view>
</view> </view>
<view class="chat-data">
<view class="c-header">
<!-- <view class="title">邀约患者统计</view> -->
</view> </view>
<view class="c-options"> <view class="c-options">
<view class="name" bind:tap="handleFold" data-key="fold2"> <view class="name" bind:tap="handleFold" data-key="fold2">

2
src/ground/pages/invite/index.scss

@ -57,7 +57,7 @@
text-align: center; text-align: center;
} }
.bg { .bg {
margin: -12rpx auto 0; margin: -14rpx auto 0;
width: 140rpx; width: 140rpx;
height: 16rpx; height: 16rpx;
background: linear-gradient(90deg, #fdd260 0%, rgba(253, 210, 96, 0.07) 100%); background: linear-gradient(90deg, #fdd260 0%, rgba(253, 210, 96, 0.07) 100%);

53
src/ground/pages/pharmacist/index.scss

@ -38,36 +38,61 @@ page {
color: #b5b8bb; color: #b5b8bb;
} }
} }
.options { .range {
margin-top: 8rpx; margin: 32rpx 0 0;
border-radius: 12rpx;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
.date { .label {
padding: 24rpx 22rpx; flex-shrink: 0;
font-size: 32rpx;
color: #342317;
}
.r-wrap {
flex: 1;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between;
background-color: #f8fafa;
border-radius: 12rpx;
.picker {
flex: 1;
.date {
padding: 10rpx 0;
text-align: center;
font-size: 32rpx; font-size: 32rpx;
color: #1a2020; color: #b5b8bb;
line-height: 44rpx;
}
}
.line {
margin: 0 10rpx;
width: 24rpx;
height: 1px;
background-color: rgba(181, 184, 187, 0.25);
}
.icon { .icon {
width: 48rpx; margin-right: 16rpx;
height: 48rpx; width: 44rpx;
height: 44rpx;
}
} }
} }
}
.page-container {
padding: 32rpx;
.total { .total {
text-align: right;
font-size: 32rpx; font-size: 32rpx;
color: #1a2020; color: #1a2020;
.num { .num {
color: #4a8dff; color: #4a8dff;
} }
} }
}
}
.page-container {
padding: 32rpx;
.pharmacist-card { .pharmacist-card {
margin-bottom: 32rpx; margin-top: 32rpx;
padding: 32rpx 32rpx 0; padding: 32rpx 32rpx 0;
background: linear-gradient(0deg, #ffffff 0%, #ffffff 73.04%, #eff5ff 100%); background: linear-gradient(0deg, #ffffff 0%, #ffffff 73.04%, #eff5ff 100%);
border-radius: 24rpx 24rpx 24rpx 24rpx; border-radius: 24rpx 24rpx 24rpx 24rpx;
@ -76,6 +101,7 @@ page {
/* 药师基本信息 */ /* 药师基本信息 */
.user { .user {
display: flex; display: flex;
align-items: center;
gap: 20rpx; gap: 20rpx;
.avatar { .avatar {
flex-shrink: 0; flex-shrink: 0;
@ -118,6 +144,7 @@ page {
justify-content: space-between; justify-content: space-between;
border-bottom: 1px solid #fff; border-bottom: 1px solid #fff;
background-color: #f8fafa; background-color: #f8fafa;
border-radius: 24rpx;
.stat-item { .stat-item {
flex: 1; flex: 1;

21
src/ground/pages/pharmacist/index.wxml

@ -1,7 +1,7 @@
<navbar fixed custom-style="background: #fff;"> <navbar fixed custom-style="background: #fff;">
<view class="page-switch" slot="left"> <view class="page-switch" slot="left">
特诺雅 特诺雅
<text style="font-size: 0.5em; vertical-align: top">®</text> <text style="font-size: 0.5em; vertical-align: super">®</text>
<van-icon class="arrow" name="arrow-down" /> <van-icon class="arrow" name="arrow-down" />
</view> </view>
</navbar> </navbar>
@ -19,21 +19,26 @@
bindconfirm="handleSearch" bindconfirm="handleSearch"
/> />
</view> </view>
<view class="options"> <view class="range">
<view class="label">时间筛选:</view>
<view class="r-wrap">
<picker class="picker" mode="date"> <picker class="picker" mode="date">
<view class="date"> <view class="date">开始时间</view>
时间筛选 </picker>
<view class="line"></view>
<picker class="picker" mode="date">
<view class="date">开始时间</view>
</picker>
<image class="icon" src="{{imageUrl}}icon2.png?t={{Timestamp}}"></image> <image class="icon" src="{{imageUrl}}icon2.png?t={{Timestamp}}"></image>
</view> </view>
</picker> </view>
</view>
<view class="page-container">
<view class="total"> <view class="total">
已邀约总人数: 已邀约总人数:
<text class="num">28</text> <text class="num">28</text>
</view> </view>
</view>
</view>
<view class="page-container">
<!-- 药师信息卡片 --> <!-- 药师信息卡片 -->
<view class="pharmacist-card" wx:for="{{10}}" wx:key="index"> <view class="pharmacist-card" wx:for="{{10}}" wx:key="index">
<!-- 药师基本信息 --> <!-- 药师基本信息 -->

2
src/ground/pages/stat/index.scss

@ -118,7 +118,7 @@ page {
} }
} }
.m-container { .m-container {
padding-top: 46rpx; padding-top: 42rpx;
.date { .date {
font-size: 32rpx; font-size: 32rpx;
color: #4a5555; color: #4a5555;

41
src/pages/index/index.scss

@ -1,3 +1,6 @@
page {
background-color: #f8fafa;
}
.page-title { .page-title {
font-weight: 900; font-weight: 900;
font-size: 44rpx; font-size: 44rpx;
@ -31,7 +34,7 @@
filter: blur(16.5px); filter: blur(16.5px);
} }
.prompt-title { .prompt-title {
margin-top: 104rpx; margin-top: 84rpx;
display: block; display: block;
font-weight: 600; font-weight: 600;
font-size: 36rpx; font-size: 36rpx;
@ -113,6 +116,42 @@
} }
} }
} }
.complete {
margin-top: 48rpx;
padding: 104rpx 40rpx 58rpx;
background: #ffffff;
border-radius: 24rpx 24rpx 24rpx 24rpx;
border: 1rpx solid #edf2f2;
.bg {
margin: 0 auto;
display: block;
width: 514rpx;
height: 370rpx;
}
.title {
margin-top: -30rpx;
text-align: center;
font-size: 36rpx;
color: #1a2020;
font-weight: bold;
}
.content {
margin-top: 20rpx;
font-size: 36rpx;
color: #94a3a3;
text-align: center;
}
.jump {
margin-top: 72rpx;
height: 96rpx;
font-size: 36rpx;
color: #ffffff;
text-align: center;
line-height: 96rpx;
background: #00b2a9;
border-radius: 102rpx 102rpx 102rpx 102rpx;
}
}
.work { .work {
position: fixed; position: fixed;
bottom: 120rpx; bottom: 120rpx;

2
src/pages/index/index.ts

@ -23,7 +23,7 @@ Page({
}, },
// 生命周期函数:页面加载 // 生命周期函数:页面加载
onLoad(options) { onLoad() {
const app = getApp<IAppOption>() const app = getApp<IAppOption>()
app.waitLogin().then(() => { app.waitLogin().then(() => {
// 登录后调用页面所需的接口 // 登录后调用页面所需的接口

14
src/pages/index/index.wxml

@ -12,7 +12,12 @@
</swiper-item> </swiper-item>
</swiper> </swiper>
<view class="blur"></view> <view class="blur"></view>
<view class="prompt-title">请确认您是特诺雅<text style="font-size:0.5em;vertical-align: top;">®</text>的已处方患者</view> <block wx:if="{{true}}">
<view class="prompt-title">
请确认您是特诺雅
<text style="font-size: 0.5em; vertical-align: super">®</text>
的已处方患者
</view>
<view class="prompt-desc">本品为注射针剂,需遵医嘱使用,请根据您的处方选择您的适应症</view> <view class="prompt-desc">本品为注射针剂,需遵医嘱使用,请根据您的处方选择您的适应症</view>
<view class="options"> <view class="options">
<button <button
@ -38,6 +43,13 @@
<text class="link">《用户与隐私保护协议》</text> <text class="link">《用户与隐私保护协议》</text>
</view> </view>
</view> </view>
</block>
<view class="complete" wx:else>
<image class="bg" src="{{imageUrl}}bg10.png?t={{Timestamp}}"></image>
<view class="title">您已参加此项目</view>
<view class="content">您选择适应症:斑块状银屑病</view>
<view class="jump" bind:tap="handleWxSubmit">去腾讯药箱看看</view>
</view>
<view class="work" bind:tap="handleWork"> <view class="work" bind:tap="handleWork">
我是工作人员 我是工作人员
<image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image> <image class="icon" src="{{imageUrl}}icon9.png?t={{Timestamp}}"></image>

5
src/pages/start/index.json

@ -1,4 +1,7 @@
{ {
"navigationStyle": "custom", "navigationStyle": "custom",
"usingComponents": {} "usingComponents": {
"popup": "/components/popup/index",
"navbar": "/components/navbar/index"
}
} }

29
src/pages/start/index.scss

@ -1,4 +1,29 @@
.page{ page {
background-color: #f8fafa;
}
.page-title {
font-weight: 900;
font-size: 44rpx;
line-height: 52rpx;
color: #00b2a9;
}
.page {
.page-banner {
width: 100vw; width: 100vw;
height: 100vh; height: 1108rpx;
display: block;
}
.page-options {
margin-top: 68rpx;
display: flex;
align-items: center;
.o-item {
flex: 1;
border-right: 1px solid rgba(148, 163, 163, 0.29);
text-align: center;
font-size: 32rpx;
color: #94a3a3;
}
}
} }

7
src/pages/start/index.ts

@ -8,15 +8,16 @@ Page({
const { doctorId } = parseScene(options.scene) as { doctorId: string } const { doctorId } = parseScene(options.scene) as { doctorId: string }
app.globalData.waitBindDoctorId = doctorId app.globalData.waitBindDoctorId = doctorId
} }
// app.waitLogin().then(() => { // app.waitLogin().then(() => {
// const initLoginInfo = app.globalData.initLoginInfo || {} // const initLoginInfo = app.globalData.initLoginInfo || {}
// wx.reLaunch({ // wx.reLaunch({
// url: '/pages/index/index', // url: '/pages/index/index',
// }) // })
// }) // })
wx.reLaunch({ // wx.reLaunch({
url: '/pages/index/index', // url: '/pages/index/index',
}) // })
}, },
}) })

12
src/pages/start/index.wxml

@ -1 +1,11 @@
<image src="{{imageUrl}}start1.png?t={{Timestamp}}" mode="aspectFill" class="page"></image> <navbar fixed custom-style="background:transparent" back>
<view slot="left" class="page-title">华观健康</view>
</navbar>
<view class="page" style="background: url('/images/bg11.png') no-repeat top center/100% 1624rpx;padding-top: {{pageTop+24}}px;">
<image class="page-banner" src="/images/start1.png"></image>
<view class="page-options">
<view class="o-item">我是药店工作人员</view>
<view class="o-item">我是地推人员</view>
</view>
</view>

Loading…
Cancel
Save