@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
# EditorConfig is awesome: https://EditorConfig.org |
||||
|
||||
# top-most EditorConfig file |
||||
root = true |
||||
|
||||
[*] |
||||
indent_style = space |
||||
indent_size = 2 |
||||
end_of_line = lf |
||||
charset = utf-8 |
||||
trim_trailing_whitespace = true |
||||
insert_final_newline = true |
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
node_modules |
||||
src/images/.svn |
||||
miniprogram_npm |
||||
.idea |
||||
.DS_Store |
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
{ |
||||
"emmet_language_server": { |
||||
"init_options": { |
||||
"preferences": { |
||||
"css.intUnit": "rpx", |
||||
"css.floatUnitr": "rpx" |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
{ |
||||
"$schema":"https://json.schemastore.org/prettierrc.json", |
||||
"printWidth": 120, |
||||
"tabWidth": 2, |
||||
"useTabs": false, |
||||
"semi": true, |
||||
"singleQuote": false, |
||||
"bracketSpacing": true, |
||||
"trailingComma": "all", |
||||
"arrowParens": "always", |
||||
"endOfLine": "auto", |
||||
"htmlWhitespaceSensitivity": "ignore", |
||||
"singleAttributePerLine": false, |
||||
"overrides": [ |
||||
{ |
||||
"files": "*.wxml", |
||||
"options": { "parser": "html" } |
||||
}, |
||||
{ |
||||
"files": "*.wxss", |
||||
"options": { "parser": "css" } |
||||
}, |
||||
{ |
||||
"files": "*.wxs", |
||||
"options": { "parser": "babel" } |
||||
} |
||||
] |
||||
} |
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
{ |
||||
"path-autocomplete.pathMappings": { |
||||
"@": "${folder}/src", |
||||
"/": "${folder}/src", |
||||
}, |
||||
"emmet.preferences": { |
||||
"css.intUnit": "rpx", |
||||
"css.floatUnit": "rpx" |
||||
}, |
||||
} |
@ -0,0 +1,26 @@
@@ -0,0 +1,26 @@
|
||||
1. user 打开小程序进入 身份认证页面 |
||||
2. 判断图片是否涂抹 |
||||
3. 图像识别模糊 可以反向确认 通过ocr识别接口 接入ocr同时识别不到 姓名,年龄等字样,及判断该病历已被涂抹 |
||||
|
||||
<!--占位图像--> |
||||
https://pic1.zhimg.com/50/v2-dcfbab1219ae4f7a7a6db168bb1580a2_720w.jpg?source=2c26e567 |
||||
|
||||
images svn 地址 |
||||
svn://39.106.86.127:28386/projects/takeda/proj_src/shop/frontend/web/wt |
||||
|
||||
(/images/)(\S\*(?=["|'])) |
||||
{{imageUrl}}$2?t={{Timestamp}} |
||||
|
||||
ui问题 |
||||
|
||||
1. 首页绑定医生弹窗需要重新切图 |
||||
2. 播放语音条图片没切 |
||||
|
||||
showModel颜色统一 |
||||
|
||||
```ts |
||||
wx.showModal({ |
||||
confirmColor: "#00B4C5", |
||||
cancelColor: "#141515", |
||||
}); |
||||
``` |
@ -0,0 +1,5 @@
@@ -0,0 +1,5 @@
|
||||
cd ./src/images/; |
||||
svn add . --no-ignore --force; |
||||
svn ci -m "版本更新"; |
||||
cd ..; |
||||
cd ..; |
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
# Change to the src/images directory, or exit if the directory doesn't exist |
||||
Set-Location -Path ./src/images/ -ErrorAction Stop |
||||
|
||||
# Add all files to svn, including ignored files and forced additions |
||||
svn add . --no-ignore --force |
||||
|
||||
# Commit the changes with a message |
||||
svn ci -m "版本更新" |
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash |
||||
cd ./src/images/ || exit |
||||
svn add . --no-ignore --force |
||||
svn ci -m "版本更新" |
@ -0,0 +1,28 @@
@@ -0,0 +1,28 @@
|
||||
// eslint.config.mjs
|
||||
import antfu from '@antfu/eslint-config' |
||||
import prettierConfig from 'eslint-config-prettier' |
||||
|
||||
export default antfu( |
||||
{ |
||||
env: { |
||||
es6: true, |
||||
}, |
||||
stylistic: false, |
||||
parserOptions: { project: ['./tsconfig.json'] }, |
||||
globals: { |
||||
wx: true, |
||||
App: true, |
||||
Page: true, |
||||
getCurrentPages: true, |
||||
getApp: true, |
||||
Component: true, |
||||
requirePlugin: true, |
||||
requireMiniProgram: true, |
||||
}, |
||||
rules: { |
||||
'eslint-comments/no-unlimited-disable': 'off', |
||||
'ts/no-require-imports': 'off', |
||||
}, |
||||
}, |
||||
prettierConfig, |
||||
) |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
{ |
||||
"name": "wutian", |
||||
"version": "1.0.0", |
||||
"description": "", |
||||
"author": "", |
||||
"license": "", |
||||
"keywords": [], |
||||
"scripts": { |
||||
"lint:fix": "eslint . --fix" |
||||
}, |
||||
"dependencies": { |
||||
"@vant/weapp": "^1.11.6", |
||||
"dayjs": "^1.11.13", |
||||
"miniprogram-licia": "^1.39.2", |
||||
"typescript": "^5.3.3" |
||||
}, |
||||
"devDependencies": { |
||||
"@antfu/eslint-config": "^3.7.3", |
||||
"eslint": "^9.12.0", |
||||
"eslint-config-prettier": "^9.1.0", |
||||
"miniprogram-api-typings": "^4.0.1", |
||||
"prettier": "^3.3.3" |
||||
} |
||||
} |
@ -0,0 +1,56 @@
@@ -0,0 +1,56 @@
|
||||
{ |
||||
"description": "项目配置文件", |
||||
"miniprogramRoot": "src/", |
||||
"compileType": "miniprogram", |
||||
"setting": { |
||||
"useCompilerPlugins": [ |
||||
"typescript", |
||||
"sass" |
||||
], |
||||
"babelSetting": { |
||||
"ignore": [], |
||||
"disablePlugins": [], |
||||
"outputPath": "" |
||||
}, |
||||
"coverView": false, |
||||
"postcss": false, |
||||
"minified": false, |
||||
"enhance": true, |
||||
"showShadowRootInWxmlPanel": false, |
||||
"packNpmManually": true, |
||||
"packNpmRelationList": [ |
||||
{ |
||||
"packageJsonPath": "package.json", |
||||
"miniprogramNpmDistDir": "./src" |
||||
} |
||||
], |
||||
"ignoreUploadUnusedFiles": true, |
||||
"compileHotReLoad": false, |
||||
"skylineRenderEnable": true, |
||||
"es6": true |
||||
}, |
||||
"simulatorType": "wechat", |
||||
"simulatorPluginLibVersion": {}, |
||||
"condition": {}, |
||||
"srcMiniprogramRoot": "src/", |
||||
"editorSetting": { |
||||
"tabIndent": "insertSpaces", |
||||
"tabSize": 2 |
||||
}, |
||||
"libVersion": "2.32.3", |
||||
"packOptions": { |
||||
"ignore": [ |
||||
{ |
||||
"value": "src/images/*", |
||||
"type": "glob" |
||||
} |
||||
], |
||||
"include": [ |
||||
{ |
||||
"value": "/echart/components/ec-canvas/echarts.js", |
||||
"type": "file" |
||||
} |
||||
] |
||||
}, |
||||
"appid": "wxaae50c206446a964" |
||||
} |
@ -0,0 +1,225 @@
@@ -0,0 +1,225 @@
|
||||
{ |
||||
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", |
||||
"projectname": "wutian-miniprogram", |
||||
"setting": { |
||||
"compileHotReLoad": true, |
||||
"urlCheck": true |
||||
}, |
||||
"condition": { |
||||
"miniprogram": { |
||||
"list": [ |
||||
{ |
||||
"name": "注销", |
||||
"pathName": "module1/pages/loginOut/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "module1/pages/doctorHome/index", |
||||
"pathName": "module1/pages/doctorHome/index", |
||||
"query": "id=100", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "医生认证-选择医生", |
||||
"pathName": "module1/pages/setInfoDoctor/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "学习窗", |
||||
"pathName": "module1/pages/chatRoom/index", |
||||
"query": "id=4", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "病历详情", |
||||
"pathName": "module1/pages/casesDetail/index", |
||||
"query": "id=25", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "邀约码", |
||||
"pathName": "pages/start/index", |
||||
"query": "scene=doctorId%3D2%26inviteChan%3D1", |
||||
"launchMode": "default", |
||||
"scene": 1047 |
||||
}, |
||||
{ |
||||
"name": "指派医生", |
||||
"pathName": "module1/pages/setDoctor/index", |
||||
"query": "id=5", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "医生审核详情", |
||||
"pathName": "module1/pages/auditDoctorDetail/index", |
||||
"query": "id=5", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "医生认证结果页", |
||||
"pathName": "module1/pages/setInfoResult/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "选择医院", |
||||
"pathName": "module1/pages/sHostipal/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "学习窗信息", |
||||
"pathName": "module1/pages/chatRoomInfo/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "学习窗列表", |
||||
"pathName": "pages/chatRoomList/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "病历反馈", |
||||
"pathName": "module1/pages/casesFeedback/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "录入病历结果", |
||||
"pathName": "module1/pages/entryCasesResult/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "录入病历", |
||||
"pathName": "module1/pages/entryCases/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "病历", |
||||
"pathName": "pages/cases/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "组织架构4", |
||||
"pathName": "module1/pages/org4/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "组织架构3", |
||||
"pathName": "module1/pages/org3/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "医院活跃排行榜", |
||||
"pathName": "module1/pages/doctorRankList/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "更换手机号", |
||||
"pathName": "module1/pages/changePhone/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "个人信息", |
||||
"pathName": "module1/pages/userInfo/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "我的", |
||||
"pathName": "pages/my/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "首页", |
||||
"pathName": "pages/home/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "医生审核列表", |
||||
"pathName": "module1/pages/auditDoctorList/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "创建医院结果页", |
||||
"pathName": "module1/pages/cHostipalResult/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "创建医院", |
||||
"pathName": "module1/pages/cHostipal/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "医生认证", |
||||
"pathName": "module1/pages/setInfo/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "邀约下级医生", |
||||
"pathName": "module1/pages/invite/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "注册隐私协议", |
||||
"pathName": "module1/pages/loginProtool/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
}, |
||||
{ |
||||
"name": "登录", |
||||
"pathName": "module1/pages/login/index", |
||||
"query": "", |
||||
"launchMode": "default", |
||||
"scene": null |
||||
} |
||||
] |
||||
} |
||||
}, |
||||
"libVersion": "3.6.3" |
||||
} |
@ -0,0 +1,39 @@
@@ -0,0 +1,39 @@
|
||||
{ |
||||
"$schema": "https://dldir1.qq.com/WechatWebDev/editor-extension/wx-json/app.schema.json", |
||||
"pages": ["pages/home/index"], |
||||
"preloadRule": {}, |
||||
"window": { |
||||
"backgroundTextStyle": "light", |
||||
"navigationBarBackgroundColor": "#fff", |
||||
"navigationBarTitleText": "Weixin", |
||||
"navigationBarTextStyle": "black", |
||||
"navigationStyle": "custom" |
||||
}, |
||||
"tabBar": { |
||||
"custom": true, |
||||
"list": [ |
||||
{ |
||||
"pagePath": "pages/home/index", |
||||
"text": "首页" |
||||
}, |
||||
{ |
||||
"pagePath": "pages/my/index", |
||||
"text": "我的" |
||||
} |
||||
] |
||||
}, |
||||
"resolveAlias": { |
||||
"@/*": "/*" |
||||
}, |
||||
"rendererOptions": { |
||||
"skyline": { |
||||
"defaultDisplayBlock": true, |
||||
"disableABTest": true, |
||||
"sdkVersionBegin": "3.0.0", |
||||
"sdkVersionEnd": "15.255.255" |
||||
} |
||||
}, |
||||
"componentFramework": "glass-easel", |
||||
"sitemapLocation": "sitemap.json", |
||||
"lazyCodeLoading": "requiredComponents" |
||||
} |
@ -0,0 +1,125 @@
@@ -0,0 +1,125 @@
|
||||
import component from "@/utils/component"; |
||||
import relativeTime from "@/utils/dayjs/relativeTime.js"; |
||||
import page from "@/utils/page"; |
||||
import { request } from "@/utils/request"; |
||||
import { parseScene } from "./utils/util"; |
||||
|
||||
wx.WebIM = require("@/utils/webIM/WebIM.js").default; |
||||
|
||||
const dayjs = require("dayjs"); |
||||
const licia = require("miniprogram-licia"); |
||||
|
||||
require("/utils/dayjs/day-zh-cn.js"); |
||||
|
||||
dayjs.locale("zh-cn"); // 全局使用
|
||||
dayjs.extend(relativeTime); |
||||
|
||||
App<IAppOption>({ |
||||
globalData: { |
||||
// 测试号 wx2b0bb13edf717c1d
|
||||
// dev
|
||||
// appid:wxaae50c206446a964
|
||||
url: "https://m.takeda.hbraas.com", |
||||
upFileUrl: "https://m.takeda.hbraas.com/", |
||||
imageUrl: "https://m.takeda.hbraas.com/wt/", |
||||
// pro
|
||||
// appid:wx1e025040096c7e1d
|
||||
// url: 'https://m.raredheart.hbsaas.com',
|
||||
// upFileUrl: 'https://m.raredheart.hbsaas.com/',
|
||||
// imageUrl: 'https://m.raredheart.hbsaas.com/wt/',
|
||||
|
||||
loginState: "", |
||||
isLogin: 0, |
||||
doctorId: null, |
||||
|
||||
scene: null, |
||||
|
||||
needDeal: "", |
||||
caseNav: "0", |
||||
}, |
||||
onLaunch() { |
||||
Page = page as WechatMiniprogram.Page.Constructor; |
||||
Component = component as WechatMiniprogram.Component.Constructor; |
||||
|
||||
wx.ajax = licia.curry(request)({ gUrl: this.globalData.url }); |
||||
|
||||
wx.login({ |
||||
success: (res) => { |
||||
wx.ajax({ |
||||
method: "GET", |
||||
url: "?r=takeda/user/init-login", |
||||
data: { |
||||
code: res.code, |
||||
}, |
||||
}).then((res) => { |
||||
this.globalData.loginState = res.loginState; |
||||
this.globalData.isLogin = res.isLogin; |
||||
this.globalData.doctorId = res.doctorId; |
||||
}); |
||||
}, |
||||
}); |
||||
|
||||
wx.setInnerAudioOption({ |
||||
obeyMuteSwitch: false, |
||||
mixWithOther: false, |
||||
}); |
||||
}, |
||||
onShow(options) { |
||||
if (options.query.scene) { |
||||
this.globalData.scene = parseScene(options.query.scene); |
||||
} |
||||
// this.startLogin();
|
||||
}, |
||||
waitLogin(waitLoginState = false) { |
||||
let time: number; |
||||
return new Promise((resolve, reject) => { |
||||
time = setInterval(() => { |
||||
if (this.globalData.loginState) { |
||||
clearInterval(time); |
||||
if (waitLoginState) { |
||||
resolve(true); |
||||
} else if (this.globalData.isLogin === 0) { |
||||
reject(new Error("未登录")); |
||||
wx.reLaunch({ url: "/module1/pages/login/index" }); |
||||
} else if (this.globalData.doctorId === null) { |
||||
this.getApplyDoctor().then((applyDoctorInfo) => { |
||||
if (applyDoctorInfo.AuditStatus === 0) { |
||||
wx.reLaunch({ url: "/module1/pages/setInfoResult/index" }); |
||||
reject(new Error("还在审核中")); |
||||
} else { |
||||
wx.reLaunch({ url: "/module1/pages/setInfo/index" }); |
||||
reject(new Error("还不是医生")); |
||||
} |
||||
}); |
||||
} else { |
||||
resolve(true); |
||||
} |
||||
} |
||||
}, 500); |
||||
}); |
||||
}, |
||||
getApplyDoctor() { |
||||
return wx.ajax({ |
||||
method: "GET", |
||||
url: "?r=takeda/reg/get-apply-doctor", |
||||
}); |
||||
}, |
||||
getUserInfo(self: WechatMiniprogram.Page.Instance<any, any>, callback?: (res: any) => void) { |
||||
wx.ajax({ |
||||
method: "GET", |
||||
url: "?r=takeda/account/info", |
||||
data: {}, |
||||
}).then((res) => { |
||||
self.setData({ |
||||
userInfo: res, |
||||
}); |
||||
callback?.(res); |
||||
}); |
||||
}, |
||||
getMenuInfo(self) { |
||||
const menuButtonInfo = wx.getMenuButtonBoundingClientRect(); |
||||
self.setData({ |
||||
menuButtonInfo, |
||||
}); |
||||
}, |
||||
}); |
@ -0,0 +1,20 @@
@@ -0,0 +1,20 @@
|
||||
const app = getApp(); |
||||
|
||||
Component({ |
||||
properties: { |
||||
pagination: { |
||||
type: Object, |
||||
value() { |
||||
return {}; |
||||
}, |
||||
}, |
||||
}, |
||||
data: { |
||||
imageUrl: app.globalData.imageUrl, |
||||
}, |
||||
methods: { |
||||
handleTouchmove() { |
||||
return false; |
||||
}, |
||||
}, |
||||
}); |
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": { |
||||
"van-divider": "@vant/weapp/divider/index" |
||||
} |
||||
} |
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
/* components/pagination/index.wxss */ |
||||
.none { |
||||
display: block; |
||||
margin: 30rpx auto; |
||||
width: 80%; |
||||
} |
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
<image class="none" src="{{imageUrl}}none.png?t={{Timestamp}}" wx:if="{{pagination.count==0}}"></image> |
||||
<van-divider contentPosition="center" wx:elif="{{pagination.page<pagination.pages}}"> |
||||
<van-loading /> |
||||
加载中... |
||||
</van-divider> |
||||
<van-divider contentPosition="center" wx:elif="{{pagination.page>=pagination.pages}}">没有更多了</van-divider> |
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
{ |
||||
"component": true, |
||||
"usingComponents": {} |
||||
} |
@ -0,0 +1,130 @@
@@ -0,0 +1,130 @@
|
||||
.tabbar { |
||||
padding: 0 0 calc(env(safe-area-inset-bottom) + 12rpx); |
||||
display: flex; |
||||
justify-content: space-between; |
||||
background-color: #fff; |
||||
box-shadow: 0rpx 3rpx 27rpx 0rpx rgba(40, 48, 49, 0.1); |
||||
.custom { |
||||
flex-shrink: 0; |
||||
position: relative; |
||||
width: 94rpx; |
||||
height: 64rpx; |
||||
.add { |
||||
position: absolute; |
||||
top: -42rpx; |
||||
width: 94rpx; |
||||
height: 94rpx; |
||||
} |
||||
.popup-tip { |
||||
padding: 20rpx 34rpx 28rpx; |
||||
position: absolute; |
||||
top: -60rpx; |
||||
left: 50%; |
||||
transform: translate(-50%, -100%); |
||||
border-radius: 16rpx; |
||||
background: linear-gradient(90deg, #00b4c5 0%, #54e2b4 100%); |
||||
box-shadow: 0 4rpx 11rpx rgba(0, 0, 0, 0.08); |
||||
.close { |
||||
position: absolute; |
||||
top: -10rpx; |
||||
right: -10rpx; |
||||
width: 40rpx; |
||||
height: 40rpx; |
||||
} |
||||
.content { |
||||
text-align: center; |
||||
font-size: 32rpx; |
||||
color: #fff; |
||||
white-space: nowrap; |
||||
line-height: 48rpx; |
||||
.plus { |
||||
color: #fff; |
||||
font-size: 48rpx; |
||||
font-weight: bold; |
||||
} |
||||
} |
||||
.pt-footer { |
||||
margin-top: 16rpx; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
gap: 24rpx; |
||||
white-space: nowrap; |
||||
.ok { |
||||
padding: 16rpx 42rpx; |
||||
font-size: 24rpx; |
||||
color: #00b4c5; |
||||
font-size: 32rpx; |
||||
line-height: 32rpx; |
||||
border-radius: 120rpx; |
||||
background: #fff; |
||||
} |
||||
} |
||||
&::after { |
||||
position: absolute; |
||||
content: ""; |
||||
bottom: -10rpx; |
||||
left: 50%; |
||||
transform: translateX(-50%); |
||||
width: 0; |
||||
height: 0; |
||||
border-style: solid; |
||||
border-width: 12rpx 12rpx 0 12rpx; |
||||
border-color: #56cabb transparent transparent transparent; |
||||
} |
||||
} |
||||
} |
||||
.tab-item { |
||||
position: relative; |
||||
padding-top: 10rpx; |
||||
flex: 1; |
||||
display: flex; |
||||
flex-direction: column; |
||||
justify-content: center; |
||||
align-items: center; |
||||
|
||||
.icon-wrap { |
||||
position: relative; |
||||
width: 48rpx; |
||||
height: 48rpx; |
||||
.icon { |
||||
display: block; |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
.icon-active { |
||||
display: none; |
||||
width: 100%; |
||||
height: 100%; |
||||
} |
||||
.dot { |
||||
position: absolute; |
||||
top: 0; |
||||
right: 0; |
||||
width: 16rpx; |
||||
height: 16rpx; |
||||
border-radius: 50%; |
||||
background-color: #ed4f39; |
||||
} |
||||
} |
||||
.name { |
||||
margin-top: 8rpx; |
||||
font-size: 22rpx; |
||||
color: rgba(20, 21, 21, 1); |
||||
line-height: 21rpx; |
||||
} |
||||
&.active { |
||||
.icon-wrap { |
||||
.icon { |
||||
display: none; |
||||
} |
||||
.icon-active { |
||||
display: block; |
||||
} |
||||
} |
||||
.name { |
||||
color: rgba(0, 180, 197, 1); |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
const _app = getApp<IAppOption>(); |
||||
|
||||
// pages/story/a.ts
|
||||
Component({ |
||||
/** |
||||
* 组件的属性列表 |
||||
*/ |
||||
properties: {}, |
||||
|
||||
/** |
||||
* 组件的初始数据 |
||||
*/ |
||||
data: { |
||||
showEntryCase: false, |
||||
active: 0, |
||||
notice: false, |
||||
tabbar: [ |
||||
{ |
||||
path: "/pages/home/index", |
||||
name: "首页", |
||||
icon: "tab1.png", |
||||
iconActive: "tab-active1.png", |
||||
activeIndex: 1, |
||||
}, |
||||
{ |
||||
path: "/pages/cases/index", |
||||
name: "病历", |
||||
icon: "tab2.png", |
||||
iconActive: "tab-active2.png", |
||||
activeIndex: 2, |
||||
}, |
||||
{ |
||||
custom: true, |
||||
path: "/module1/pages/entryCases/index", |
||||
}, |
||||
{ |
||||
path: "/pages/chatRoomList/index", |
||||
name: "学习窗", |
||||
icon: "tab3.png", |
||||
iconActive: "tab-active3.png", |
||||
activeIndex: 3, |
||||
}, |
||||
{ |
||||
path: "/pages/my/index", |
||||
name: "我的", |
||||
icon: "tab4.png", |
||||
iconActive: "tab-active4.png", |
||||
activeIndex: 4, |
||||
}, |
||||
], |
||||
userInfo: {}, |
||||
}, |
||||
/** |
||||
* 组件的方法列表 |
||||
*/ |
||||
methods: { |
||||
handleTab(e: any) { |
||||
const { index } = e.currentTarget.dataset; |
||||
const tab = this.data.tabbar[index]; |
||||
if (tab.custom) { |
||||
this.handleClsoeCaseTip(); |
||||
wx.navigateTo({ |
||||
url: tab.path, |
||||
}); |
||||
} else { |
||||
wx.switchTab({ |
||||
url: tab.path, |
||||
}); |
||||
} |
||||
}, |
||||
}, |
||||
}); |
||||
|
||||
export {}; |
@ -0,0 +1,33 @@
@@ -0,0 +1,33 @@
|
||||
<view class="tabbar"> |
||||
<block wx:for="{{tabbar}}" wx:key="index"> |
||||
<view class="custom" wx:if="{{item.custom && userInfo.DoctorLevel<3}}" bind:tap="handleTab" data-index="{{index}}"> |
||||
<image class="add" src="{{imageUrl}}tabbar/add.png?t={{Timestamp}}"></image> |
||||
<view class="popup-tip" wx:if="{{showEntryCase}}"> |
||||
<image class="close" catch:tap="handleClsoeCaseTip" src="{{imageUrl}}icon-close-white.png?t={{Timestamp}}"></image> |
||||
<view class="content"> |
||||
点击 |
||||
<text class="plus">+</text> |
||||
,可录入病历 |
||||
<view></view> |
||||
邀约合作医生一起讨论哦 |
||||
</view> |
||||
<view class="pt-footer"> |
||||
<view class="ok">去录入</view> |
||||
</view> |
||||
</view> |
||||
</view> |
||||
<view |
||||
class="tab-item {{active===item.activeIndex && 'active'}}" |
||||
wx:elif="{{!item.custom}}" |
||||
bind:tap="handleTab" |
||||
data-index="{{index}}" |
||||
> |
||||
<view class="icon-wrap"> |
||||
<view class="dot" wx:if="{{notice && index===3}}"></view> |
||||
<image class="icon" src="{{imageUrl}}tabbar/{{item.icon}}?t={{Timestamp}}"></image> |
||||
<image class="icon-active" src="{{imageUrl}}tabbar/{{item.iconActive}}?t={{Timestamp}}"></image> |
||||
</view> |
||||
<view class="name">{{item.name}}</view> |
||||
</view> |
||||
</block> |
||||
</view> |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 1.9 KiB |
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
{ |
||||
"usingComponents": {} |
||||
} |
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
const _app = getApp<IAppOption>(); |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
}); |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
<!--pages/story/index.wxml--> |
||||
<text>pages/story/index.wxml</text> |
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
{ |
||||
"usingComponents": {} |
||||
} |
@ -0,0 +1,6 @@
@@ -0,0 +1,6 @@
|
||||
const _app = getApp<IAppOption>(); |
||||
|
||||
Page({ |
||||
data: {}, |
||||
onLoad() {}, |
||||
}); |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
<!--pages/story/index.wxml--> |
||||
<text>pages/story/index.wxml</text> |
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
{ |
||||
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html", |
||||
"rules": [{ |
||||
"action": "allow", |
||||
"page": "*" |
||||
}] |
||||
} |
@ -0,0 +1,58 @@
@@ -0,0 +1,58 @@
|
||||
/** |
||||
* 使用方法: |
||||
* 1、app.js 引入此文件:const page = require('xx/xx/page); |
||||
* 2、app.js onLaunch 的时候 Page = page |
||||
*/ |
||||
|
||||
const originalComponent = Component; |
||||
|
||||
function component( |
||||
config: WechatMiniprogram.Component.Instance< |
||||
WechatMiniprogram.Component.DataOption, |
||||
WechatMiniprogram.Component.PropertyOption, |
||||
WechatMiniprogram.Component.MethodOption, |
||||
WechatMiniprogram.Component.BehaviorOption |
||||
>, |
||||
) { |
||||
if (config?.lifetimes?.attached) { |
||||
const originalOnAttached = config.lifetimes.attached; |
||||
config.lifetimes.attached = function (options) { |
||||
setImageParams(this); |
||||
getApp().getMenuInfo(this); |
||||
|
||||
if (originalOnAttached) { |
||||
originalOnAttached.call(this, options); |
||||
} |
||||
}; |
||||
} else { |
||||
const originalOnAttached = config.attached; |
||||
config.attached = function (options) { |
||||
setImageParams(this); |
||||
getApp().getMenuInfo(this); |
||||
|
||||
if (originalOnAttached) { |
||||
originalOnAttached.call(this, options); |
||||
} |
||||
}; |
||||
} |
||||
|
||||
return originalComponent(config); |
||||
} |
||||
|
||||
function setImageParams( |
||||
currPage: WechatMiniprogram.Component.Instance< |
||||
WechatMiniprogram.Component.DataOption, |
||||
WechatMiniprogram.Component.PropertyOption, |
||||
WechatMiniprogram.Component.MethodOption, |
||||
WechatMiniprogram.Component.BehaviorOption |
||||
>, |
||||
) { |
||||
const date = new Date(); |
||||
const Timestamp = date.getTime(); |
||||
currPage.setData({ |
||||
imageUrl: getApp().globalData.imageUrl, |
||||
Timestamp, |
||||
}); |
||||
} |
||||
|
||||
export default component; |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
|
||||
!function(e,_){"object"==typeof exports&&"undefined"!=typeof module?module.exports=_(require("dayjs")):"function"==typeof define&&define.amd?define(["dayjs"],_):(e="undefined"!=typeof globalThis?globalThis:e||self).dayjs_locale_zh_cn=_(e.dayjs)}(this,(function(e){"use strict";function _(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var t=_(e),d={name:"zh-cn",weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),ordinal:function(e,_){return"W"===_?e+"周":e+"日"},weekStart:1,yearStart:4,formats:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},relativeTime:{future:"%s内",past:"%s前",s:"几秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},meridiem:function(e,_){var t=100*e+_;return t<600?"凌晨":t<900?"早上":t<1100?"上午":t<1300?"中午":t<1800?"下午":"晚上"}};return t.default.locale(d,null,!0),d})); |
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
import { PluginFunc, ConfigType } from 'dayjs' |
||||
|
||||
declare interface RelativeTimeThreshold { |
||||
l: string |
||||
r?: number |
||||
d?: string |
||||
} |
||||
|
||||
declare interface RelativeTimeOptions { |
||||
rounding?: (num: number) => number |
||||
thresholds?: RelativeTimeThreshold[] |
||||
} |
||||
|
||||
declare const plugin: PluginFunc<RelativeTimeOptions> |
||||
export = plugin |
||||
|
||||
declare module 'dayjs' { |
||||
interface Dayjs { |
||||
fromNow(withoutSuffix?: boolean): string |
||||
from(compared: ConfigType, withoutSuffix?: boolean): string |
||||
toNow(withoutSuffix?: boolean): string |
||||
to(compared: ConfigType, withoutSuffix?: boolean): string |
||||
} |
||||
} |
@ -0,0 +1 @@
@@ -0,0 +1 @@
|
||||
!function(r,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(r="undefined"!=typeof globalThis?globalThis:r||self).dayjs_plugin_relativeTime=e()}(this,(function(){"use strict";return function(r,e,t){r=r||{};var n=e.prototype,o={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function i(r,e,t,o){return n.fromToBase(r,e,t,o)}t.en.relativeTime=o,n.fromToBase=function(e,n,i,d,u){for(var f,a,s,l=i.$locale().relativeTime||o,h=r.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],m=h.length,c=0;c<m;c+=1){var y=h[c];y.d&&(f=d?t(e).diff(i,y.d,!0):i.diff(e,y.d,!0));var p=(r.rounding||Math.round)(Math.abs(f));if(s=f>0,p<=y.r||!y.r){p<=1&&c>0&&(y=h[c-1]);var v=l[y.l];u&&(p=u(""+p)),a="string"==typeof v?v.replace("%d",p):v(p,n,y.l,s);break}}if(n)return a;var M=s?l.future:l.past;return"function"==typeof M?M(a):M.replace("%s",a)},n.to=function(r,e){return i(r,e,this,!0)},n.from=function(r,e){return i(r,e,this)};var d=function(r){return r.$u?t.utc():t()};n.toNow=function(r){return this.to(d(this),r)},n.fromNow=function(r){return this.from(d(this),r)}}})); |
@ -0,0 +1,54 @@
@@ -0,0 +1,54 @@
|
||||
/** |
||||
* 使用方法: |
||||
* 1、app.js 引入此文件:const page = require('xx/xx/page); |
||||
* 2、app.js onLaunch 的时候 Page = page |
||||
*/ |
||||
|
||||
const originalPage = Page |
||||
|
||||
function page(config: WechatMiniprogram.Page.Instance<WechatMiniprogram.IAnyObject, WechatMiniprogram.IAnyObject>) { |
||||
const originalOnLoad = config.onLoad |
||||
config.onLoad = function (options) { |
||||
setImageParams(this) |
||||
getApp().getMenuInfo(this) |
||||
|
||||
if (originalOnLoad) { |
||||
originalOnLoad.call(this, options) |
||||
} |
||||
} |
||||
|
||||
const originalOnShareAppMessage = config.onShareAppMessage |
||||
config.onShareAppMessage = function (options) { |
||||
if (originalOnShareAppMessage) { |
||||
return originalOnShareAppMessage.call(this, options) |
||||
} else { |
||||
// const date = new Date();
|
||||
// const Timestamp = date.getTime();
|
||||
|
||||
// const pages = getCurrentPages();
|
||||
// const currentPage = pages[pages.length - 1];
|
||||
// const url = currentPage.route;
|
||||
|
||||
return { |
||||
title: '武田', |
||||
path: '/pages/start/index', |
||||
// imageUrl: `${getApp().globalData.imageUrl}1/1.png?t=${Timestamp}`,
|
||||
} |
||||
} |
||||
} |
||||
|
||||
return originalPage(config) |
||||
} |
||||
|
||||
function setImageParams( |
||||
currPage: WechatMiniprogram.Page.Instance<WechatMiniprogram.IAnyObject, WechatMiniprogram.IAnyObject>, |
||||
) { |
||||
const date = new Date() |
||||
const Timestamp = date.getTime() |
||||
currPage.setData({ |
||||
imageUrl: getApp().globalData.imageUrl, |
||||
Timestamp, |
||||
}) |
||||
} |
||||
|
||||
export default page |
@ -0,0 +1,71 @@
@@ -0,0 +1,71 @@
|
||||
interface IGlobalParams { |
||||
gUrl: string |
||||
} |
||||
|
||||
export const request = function ( |
||||
{ gUrl }: IGlobalParams, |
||||
{ url, method, data, header, showMsg = true, loading = false, isJSON = false, ...options }: IAgaxParams, |
||||
): Promise<any> { |
||||
return new Promise((resolve, reject) => { |
||||
if (loading) { |
||||
wx.showLoading({ |
||||
title: '加载中...', |
||||
mask: true, |
||||
}) |
||||
} |
||||
wx.request({ |
||||
header: { |
||||
loginState: getApp().globalData.loginState, |
||||
...header, |
||||
}, |
||||
url: gUrl + url, |
||||
method, |
||||
data: { |
||||
loginState: getApp().globalData.loginState, |
||||
...(data as object), |
||||
}, |
||||
...options, |
||||
success(res: any) { |
||||
const { code, data } = res.data |
||||
if (isJSON) { |
||||
resolve(res.data) |
||||
} else if (code === 0) { |
||||
resolve(data) |
||||
} else if (showMsg) { |
||||
const msg = errPicker(res.data) |
||||
if (loading) { |
||||
setTimeout(() => { |
||||
wx.showToast({ |
||||
title: msg, |
||||
icon: 'none', |
||||
}) |
||||
}, 30) |
||||
} else { |
||||
wx.showToast({ |
||||
title: msg, |
||||
icon: 'none', |
||||
}) |
||||
reject(res) |
||||
} |
||||
} else { |
||||
reject(res) |
||||
} |
||||
}, |
||||
fail(err) { |
||||
reject(err) |
||||
}, |
||||
complete() { |
||||
if (loading) { |
||||
wx.hideLoading() |
||||
} |
||||
}, |
||||
}) |
||||
}) |
||||
} |
||||
|
||||
function errPicker(err: any) { |
||||
if (typeof err === 'string') { |
||||
return err |
||||
} |
||||
return err.data || err.msg || err.errMsg || (err.detail && err.detail.errMsg) || '未知错误' |
||||
} |
@ -0,0 +1,64 @@
@@ -0,0 +1,64 @@
|
||||
export const formatTime = (date: Date) => { |
||||
const year = date.getFullYear(); |
||||
const month = date.getMonth() + 1; |
||||
const day = date.getDate(); |
||||
const hour = date.getHours(); |
||||
const minute = date.getMinutes(); |
||||
const second = date.getSeconds(); |
||||
|
||||
return `${[year, month, day].map(formatNumber).join("/")} ${[hour, minute, second].map(formatNumber).join(":")}`; |
||||
}; |
||||
|
||||
export const formatNumber = (n: number) => { |
||||
const s = n.toString(); |
||||
return s[1] ? s : `0${s}`; |
||||
}; |
||||
|
||||
/** |
||||
* 获取当前页面路径 |
||||
* @returns string |
||||
*/ |
||||
export const getCurrentPageUrl = function () { |
||||
const pages = getCurrentPages(); |
||||
const currentPage = pages[pages.length - 1]; |
||||
const url = `/${currentPage.route}`; |
||||
return url; |
||||
}; |
||||
|
||||
/** |
||||
* 获取当前页面路径 & 参数 |
||||
* @returns string |
||||
*/ |
||||
export const getCurrentPageUrlWithArgs = function () { |
||||
const pages = getCurrentPages(); |
||||
const currentPage = pages[pages.length - 1]; |
||||
const url = currentPage.route; |
||||
const options = currentPage.options; |
||||
let urlWithArgs = `/${url}?`; |
||||
for (const key in options) { |
||||
const value = options[key]; |
||||
urlWithArgs += `${key}=${value}&`; |
||||
} |
||||
urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1); |
||||
return urlWithArgs; |
||||
}; |
||||
|
||||
const parseUrlArgsToArray = (urlArgs) => { |
||||
urlArgs = urlArgs.split("&"); |
||||
const results = {}; |
||||
urlArgs.forEach((arg) => { |
||||
arg = arg.split("="); |
||||
if (arg[0] && arg[1]) { |
||||
results[arg[0]] = arg[1]; |
||||
} |
||||
}); |
||||
return results; |
||||
}; |
||||
|
||||
export const parseScene = (scene) => { |
||||
if (scene) { |
||||
return parseUrlArgsToArray(decodeURIComponent(scene)); |
||||
} else { |
||||
return null; |
||||
} |
||||
}; |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
function include(value, arr) { |
||||
for (var i = 0; i < arr.length; i++) { |
||||
if (arr[i] === value) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
module.exports = { |
||||
include: include, |
||||
}; |
@ -0,0 +1,37 @@
@@ -0,0 +1,37 @@
|
||||
var dispCbs = []; |
||||
var dispIns = []; |
||||
|
||||
function Dispatcher() { |
||||
dispIns.push(this); |
||||
dispCbs.push({}); |
||||
} |
||||
|
||||
Dispatcher.prototype = { |
||||
on(type, cb) { |
||||
let cbtypes = dispCbs[dispIns.indexOf(this)]; |
||||
let cbs = cbtypes[type] = cbtypes[type] || []; |
||||
if (!~cbs.indexOf(cb)) { |
||||
cbs.push(cb); |
||||
} |
||||
}, |
||||
|
||||
off(type, cb) { |
||||
let cbtypes = dispCbs[dispIns.indexOf(this)]; |
||||
let cbs = cbtypes[type] = cbtypes[type] || []; |
||||
let curTypeCbIdx = cbs.indexOf(cb); |
||||
if (~curTypeCbIdx) { |
||||
cbs.splice(curTypeCbIdx, 1); |
||||
} |
||||
}, |
||||
|
||||
fire(type, ...args) { |
||||
let cbtypes = dispCbs[dispIns.indexOf(this)]; |
||||
let cbs = cbtypes[type] = cbtypes[type] || []; |
||||
|
||||
for (let i = 0; i < cbs.length; i++) { |
||||
cbs[i].apply(null, args); |
||||
} |
||||
} |
||||
|
||||
}; |
||||
module.exports = Dispatcher; |
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
var obsCbs = obsCbs || []; |
||||
var obsObjs = obsObjs || []; |
||||
var cloneObjs = cloneObjs || []; |
||||
|
||||
function newOne(obj){ |
||||
obsObjs.push(obj); |
||||
obsCbs.push([]); |
||||
cloneObjs.push(Object.assign({}, obj)); |
||||
} |
||||
|
||||
module.exports = { |
||||
del(obj, cb){ |
||||
let curObjIdx = obsObjs.indexOf(obj); |
||||
if(~curObjIdx){ |
||||
let cbs = obsCbs[curObjIdx]; |
||||
let curCbIdx = cbs.indexOf(cb); |
||||
if(~curCbIdx){ |
||||
cbs.splice(curCbIdx, 1); |
||||
if(!cbs.length){ |
||||
obsObjs.splice(curObjIdx, 1); |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
add(obj, cb){ |
||||
let curIdx = obsObjs.indexOf(obj); |
||||
if(!~curIdx){ |
||||
curIdx = obsObjs.length; |
||||
newOne(obj); |
||||
} |
||||
let cbs = obsCbs[curIdx]; |
||||
cbs.push(cb); |
||||
for(let key in obj){ |
||||
Object.defineProperty(obj, key, { |
||||
set: function(val){ |
||||
cloneObjs[curIdx][key] = val; |
||||
for(let i = 0; i < cbs.length; i++){ |
||||
cbs[i].apply(obj, [val, key]); |
||||
} |
||||
}, |
||||
get: function(){ |
||||
return cloneObjs[curIdx][key]; |
||||
} |
||||
}); |
||||
} |
||||
return obj; |
||||
}, |
||||
}; |
@ -0,0 +1,266 @@
@@ -0,0 +1,266 @@
|
||||
import websdk from "@/sdk/Easemob-chat-4.3.1"; |
||||
import config from "./WebIMConfig"; |
||||
|
||||
console.group = console.group || {}; |
||||
console.groupEnd = console.groupEnd || {}; |
||||
|
||||
const window = {}; |
||||
const WebIM = window.WebIM = websdk; |
||||
WebIM.message = websdk.message |
||||
window.WebIM.config = config; |
||||
//var DOMParser = window.DOMParser = xmldom.DOMParser;
|
||||
//let document = window.document = new DOMParser().parseFromString("<?xml version='1.0'?>\n", "text/xml");
|
||||
|
||||
WebIM.isDebug = function (option) { |
||||
if (option) { |
||||
WebIM.config.isDebug = option.isDebug |
||||
openDebug(WebIM.config.isDebug) |
||||
} |
||||
|
||||
function openDebug(value) { |
||||
function ts() { |
||||
const d = new Date(); |
||||
const Hours = d.getHours(); // 获取当前小时数(0-23)
|
||||
const Minutes = d.getMinutes(); // 获取当前分钟数(0-59)
|
||||
const Seconds = d.getSeconds(); // 获取当前秒数(0-59)
|
||||
return `${Hours < 10 ? `0${ Hours}` : Hours }:${ Minutes < 10 ? `0${ Minutes}` : Minutes }:${ Seconds < 10 ? `0${ Seconds}` : Seconds } `; |
||||
} |
||||
|
||||
|
||||
// if (value) {
|
||||
// Strophe.Strophe.Connection.prototype.rawOutput = function(data){
|
||||
// try{
|
||||
// console.group("%csend # " + ts(), "color: blue; font-size: large");
|
||||
// console.log("%c" + data, "color: blue");
|
||||
// console.groupEnd();
|
||||
// }
|
||||
// catch(e){
|
||||
// console.log(e);
|
||||
// }
|
||||
// };
|
||||
// }else{
|
||||
// Strophe.Strophe.Connection.prototype.rawOutput = function(){};
|
||||
// }
|
||||
|
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Set autoSignIn as true (autoSignInName and autoSignInPwd are configured below), |
||||
* You can auto signed in each time when you refresh the page in dev model. |
||||
*/ |
||||
WebIM.config.autoSignIn = false; |
||||
if (WebIM.config.autoSignIn) { |
||||
WebIM.config.autoSignInName = "lwz2"; |
||||
WebIM.config.autoSignInPwd = "1"; |
||||
} |
||||
|
||||
|
||||
// var stropheConn = new window.Strophe.Connection("ws://im-api.easemob.com/ws/", {
|
||||
// inactivity: 30,
|
||||
// maxRetries: 5,
|
||||
// pollingTime: 4500
|
||||
// });
|
||||
//
|
||||
// stropheConn.connect(
|
||||
// '$t$' + 'YWMtmbQEBKKIEeaGmMtXyg5n1wAAAVlkQvGO2WOJGlMCEJKM4VV9GCMnb_XLCXU',
|
||||
// function() {
|
||||
// console.log(arguments, 'ggogogo');
|
||||
// }, stropheConn.wait, stropheConn.hold);
|
||||
WebIM.parseEmoji = function (msg) { |
||||
if (typeof WebIM.Emoji === "undefined" || typeof WebIM.Emoji.map === "undefined") { |
||||
return msg; |
||||
} |
||||
const emoji = WebIM.Emoji; |
||||
var reg = null; |
||||
const msgList = []; |
||||
const objList = []; |
||||
for (const face in emoji.map) { |
||||
if (emoji.map.hasOwnProperty(face)) { |
||||
while (msg.includes(face)) { |
||||
msg = msg.replace(face, `^${ emoji.map[face] }^`); |
||||
} |
||||
} |
||||
} |
||||
const ary = msg.split("^"); |
||||
var reg = /^e.*g$/; |
||||
for (var i = 0; i < ary.length; i++) { |
||||
if (ary[i] != "") { |
||||
msgList.push(ary[i]); |
||||
} |
||||
} |
||||
for (var i = 0; i < msgList.length; i++) { |
||||
if (reg.test(msgList[i])) { |
||||
var obj = {}; |
||||
obj.data = msgList[i]; |
||||
obj.type = "emoji"; |
||||
objList.push(obj); |
||||
} |
||||
else { |
||||
var obj = {}; |
||||
obj.data = msgList[i]; |
||||
obj.type = "txt"; |
||||
objList.push(obj); |
||||
} |
||||
} |
||||
return objList; |
||||
}; |
||||
|
||||
WebIM.time = function () { |
||||
const date = new Date(); |
||||
const Hours = date.getHours(); |
||||
const Minutes = date.getMinutes(); |
||||
const Seconds = date.getSeconds(); |
||||
const time = `${date.getFullYear() }-${ date.getMonth() + 1 }-${ date.getDate() } ${ |
||||
Hours < 10 ? `0${ Hours}` : Hours }:${ Minutes < 10 ? `0${ Minutes}` : Minutes }:${ Seconds < 10 ? `0${ Seconds}` : Seconds}`;
|
||||
return time; |
||||
}; |
||||
|
||||
WebIM.Emoji = { |
||||
path: "../../../../../images/faces/", |
||||
map: { |
||||
"[):]": "ee_1.png", |
||||
"[:D]": "ee_2.png", |
||||
"[;)]": "ee_3.png", |
||||
"[:-o]": "ee_4.png", |
||||
"[:p]": "ee_5.png", |
||||
"[(H)]": "ee_6.png", |
||||
"[:@]": "ee_7.png", |
||||
"[:s]": "ee_8.png", |
||||
"[:$]": "ee_9.png", |
||||
"[:(]": "ee_10.png", |
||||
"[:'(]": "ee_11.png", |
||||
"[<o)]": "ee_12.png", |
||||
"[(a)]": "ee_13.png", |
||||
"[8o|]": "ee_14.png", |
||||
"[8-|]": "ee_15.png", |
||||
"[+o(]": "ee_16.png", |
||||
"[|-)]": "ee_17.png", |
||||
"[:|]": "ee_18.png", |
||||
"[*-)]": "ee_19.png", |
||||
"[:-#]": "ee_20.png", |
||||
"[^o)]": "ee_21.png", |
||||
"[:-*]": "ee_22.png", |
||||
"[8-)]": "ee_23.png", |
||||
"[del]": "btn_del.png", |
||||
"[(|)]": "ee_24.png", |
||||
"[(u)]": "ee_25.png", |
||||
"[(S)]": "ee_26.png", |
||||
"[(*)]": "ee_27.png", |
||||
"[(#)]": "ee_28.png", |
||||
"[(R)]": "ee_29.png", |
||||
"[({)]": "ee_30.png", |
||||
"[(})]": "ee_31.png", |
||||
"[(k)]": "ee_32.png", |
||||
"[(F)]": "ee_33.png", |
||||
"[(W)]": "ee_34.png", |
||||
"[(D)]": "ee_35.png" |
||||
} |
||||
}; |
||||
|
||||
WebIM.EmojiObj = { |
||||
// 相对 emoji.js 路径
|
||||
path: "../../../../../images/faces/", |
||||
map1: { |
||||
"[):]": "ee_1.png", |
||||
"[:D]": "ee_2.png", |
||||
"[;)]": "ee_3.png", |
||||
"[:-o]": "ee_4.png", |
||||
"[:p]": "ee_5.png", |
||||
"[(H)]": "ee_6.png", |
||||
"[:@]": "ee_7.png" |
||||
}, |
||||
map2: { |
||||
"[:s]": "ee_8.png", |
||||
"[:$]": "ee_9.png", |
||||
"[:(]": "ee_10.png", |
||||
"[:'(]": "ee_11.png", |
||||
"[<o)]": "ee_12.png", |
||||
"[(a)]": "ee_13.png", |
||||
"[8o|]": "ee_14.png" |
||||
}, |
||||
map3: { |
||||
"[8-|]": "ee_15.png", |
||||
"[+o(]": "ee_16.png", |
||||
"[|-)]": "ee_17.png", |
||||
"[:|]": "ee_18.png", |
||||
"[*-)]": "ee_19.png", |
||||
"[:-#]": "ee_20.png", |
||||
"[del]": "del.png" |
||||
}, |
||||
map4: { |
||||
"[^o)]": "ee_21.png", |
||||
"[:-*]": "ee_22.png", |
||||
"[8-)]": "ee_23.png", |
||||
"[(|)]": "ee_24.png", |
||||
"[(u)]": "ee_25.png", |
||||
"[(S)]": "ee_26.png", |
||||
"[(*)]": "ee_27.png" |
||||
}, |
||||
map5: { |
||||
"[(#)]": "ee_28.png", |
||||
"[(R)]": "ee_29.png", |
||||
"[({)]": "ee_30.png", |
||||
"[(})]": "ee_31.png", |
||||
"[(k)]": "ee_32.png", |
||||
"[(F)]": "ee_33.png", |
||||
"[(W)]": "ee_34.png", |
||||
"[(D)]": "ee_35.png" |
||||
}, |
||||
map6: { |
||||
"[del]": "del.png" |
||||
} |
||||
}; |
||||
|
||||
|
||||
WebIM.conn = new WebIM.connection({ |
||||
appKey: WebIM.config.appkey, |
||||
isMultiLoginSessions: WebIM.config.isMultiLoginSessions, |
||||
https: true, //typeof WebIM.config.https === "boolean" ? WebIM.config.https : location.protocol === "https:",
|
||||
url: WebIM.config.socketServer, |
||||
apiUrl: WebIM.config.apiURL, |
||||
isAutoLogin: false, |
||||
heartBeatWait: 30000, //WebIM.config.heartBeatWait,
|
||||
autoReconnectNumMax: WebIM.config.autoReconnectNumMax, |
||||
autoReconnectInterval: WebIM.config.autoReconnectInterval, |
||||
isDebug: WebIM.config.isDebug, |
||||
deviceId: WebIM.config.deviceId |
||||
}); |
||||
|
||||
// async response
|
||||
// WebIM.conn.listen({
|
||||
// onOpened: () => dispatch({type: Types.ON_OPEND})
|
||||
// })
|
||||
Math.uuid = function (len, radix) { |
||||
const CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); |
||||
const chars = CHARS; const uuid = []; let i; |
||||
radix = radix || chars.length; |
||||
|
||||
if (len) { |
||||
// Compact form
|
||||
for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]; |
||||
} else { |
||||
// rfc4122, version 4 form
|
||||
let r; |
||||
|
||||
// rfc4122 requires these characters
|
||||
uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; |
||||
uuid[14] = '4'; |
||||
|
||||
// Fill in random data. At i==19 set the high bits of clock sequence
|
||||
// as
|
||||
// per rfc4122, sec. 4.1.5
|
||||
for (i = 0; i < 36; i++) { |
||||
if (!uuid[i]) { |
||||
r = 0 | Math.random() * 16; |
||||
uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; |
||||
} |
||||
} |
||||
} |
||||
|
||||
return uuid.join(''); |
||||
}; |
||||
// export default WebIM;
|
||||
module.exports = { |
||||
"default": WebIM |
||||
}; |
@ -0,0 +1,88 @@
@@ -0,0 +1,88 @@
|
||||
/** |
||||
* git do not control webim.config.js |
||||
* everyone should copy webim.config.js to webim.config.js |
||||
* and have their own configs. |
||||
* In this way , others won't be influenced by this config while git pull. |
||||
* |
||||
*/ |
||||
|
||||
// for react native
|
||||
const location = { |
||||
protocol: "https", |
||||
}; |
||||
|
||||
const config = { |
||||
/* |
||||
* socket server |
||||
*/ |
||||
// socketServer: "wss://im-api.easemob.com/ws/", //小程序2.0sdk线上环境 请使用2.0版本sdk
|
||||
// socketServer: "wss://im-api-hsb.easemob.com/ws/", //小程序2.0sdk沙箱环境 请使用2.0版本sdk
|
||||
// socketServer: 'wss://im-api-new-hsb.easemob.com/websocket', //小程序沙箱环境
|
||||
socketServer: "wss://im-api-wechat.easemob.com/websocket", //小程序线上环境
|
||||
// socketServer: 'wss://hk-wx.easemob.com/websocket',
|
||||
/* |
||||
* Backend REST API URL |
||||
*/ |
||||
// apiURL: (location.protocol === 'https:' ? 'https:' : 'http:') + '//a1.easemob.com',
|
||||
apiURL: "https://a1.easemob.com", // 线上环境
|
||||
// apiURL: "https://a1-hsb.easemob.com", // 沙箱环境
|
||||
// apiURL: 'https://hk-test.easemob.com',
|
||||
/* |
||||
* Application AppKey |
||||
*/ |
||||
appkey: "1110180510146396#dream", |
||||
/* |
||||
* Whether to use HTTPS '1177161227178308#xcx' |
||||
* @parameter {Boolean} true or false |
||||
*/ |
||||
https: false, |
||||
/* |
||||
* isMultiLoginSessions |
||||
* true: A visitor can sign in to multiple webpages and receive messages at all the webpages. |
||||
* false: A visitor can sign in to only one webpage and receive messages at the webpage. |
||||
*/ |
||||
isMultiLoginSessions: false, |
||||
/** |
||||
* Whether to use window.doQuery() |
||||
* @parameter {boolean} true or false |
||||
*/ |
||||
isWindowSDK: false, |
||||
/** |
||||
* isSandBox=true: xmppURL: 'im-api.sandbox.easemob.com', apiURL: '//a1.sdb.easemob.com', |
||||
* isSandBox=false: xmppURL: 'im-api.easemob.com', apiURL: '//a1.easemob.com', |
||||
* @parameter {boolean} true or false |
||||
*/ |
||||
isSandBox: false, |
||||
/** |
||||
* Whether to console.log in strophe.log() |
||||
* @parameter {boolean} true or false |
||||
*/ |
||||
isDebug: true, |
||||
/** |
||||
* will auto connect the xmpp server autoReconnectNumMax times in background when client is offline. |
||||
* won't auto connect if autoReconnectNumMax=0. |
||||
*/ |
||||
autoReconnectNumMax: 5, |
||||
/** |
||||
* the interval secons between each atuo reconnectting. |
||||
* works only if autoReconnectMaxNum >= 2. |
||||
*/ |
||||
autoReconnectInterval: 2, |
||||
/** |
||||
* webrtc supports WebKit and https only |
||||
*/ |
||||
isWebRTC: false, |
||||
/* |
||||
* Set to auto sign-in |
||||
*/ |
||||
isAutoLogin: true, |
||||
|
||||
heartBeatWait: 30000, |
||||
|
||||
/* |
||||
* 需要替换成自己的声网 appId,此 appId 有限量,仅供参考使用,同时获取声网 token 的接口仅能供此 appId 使用,换成自己的 appId 后需要自己去实现 app server 获取声网token。 |
||||
*/ |
||||
AgoraAppId: "15cb0d28b87b425ea613fc46f7c9f974", |
||||
}; |
||||
|
||||
export default config; |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
var Dispatcher = require("./Dispatcher"); |
||||
module.exports = new Dispatcher(); |
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
{ |
||||
"compilerOptions": { |
||||
"target": "ES2020", |
||||
"lib": ["ES2020"], |
||||
"experimentalDecorators": true, |
||||
"baseUrl": ".", |
||||
"module": "CommonJS", |
||||
"paths": { |
||||
"@vant/weapp/*": ["path/to/node_modules/@vant/weapp/dist/*"], |
||||
"@/*": ["src/*"] |
||||
}, |
||||
"typeRoots": ["./typings"], |
||||
"types": ["miniprogram-api-typings"], |
||||
"allowJs": true, |
||||
"strict": true, |
||||
"strictNullChecks": true, |
||||
"strictPropertyInitialization": true, |
||||
"alwaysStrict": true, |
||||
"noFallthroughCasesInSwitch": true, |
||||
"noImplicitAny": false, |
||||
"noImplicitReturns": true, |
||||
"noImplicitThis": true, |
||||
"noUnusedLocals": true, |
||||
"noUnusedParameters": true, |
||||
"allowSyntheticDefaultImports": true, |
||||
"esModuleInterop": true |
||||
}, |
||||
"include": ["./**/*.ts"], |
||||
"exclude": ["node_modules"] |
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
interface IAppOption { |
||||
globalData: { |
||||
userInfo?: IUserInfo; |
||||
url: string; |
||||
upFileUrl: string; |
||||
imageUrl: string; |
||||
loginState: string; |
||||
isLogin: number; |
||||
doctorId: null | number; |
||||
scene: null | { [key: string]: any }; |
||||
|
||||
needDeal: "" | "1"; |
||||
caseNav: "0" | "1" | "2" | "3"; |
||||
}; |
||||
userInfoReadyCallback?: WechatMiniprogram.GetUserInfoSuccessCallback; |
||||
waitLogin: (waitLoginState?: boolean) => Promise<any>; |
||||
getMenuInfo: (arg0: WechatMiniprogram.Page.Instance<any, any>) => void; |
||||
getUserInfo: (arg0: WechatMiniprogram.Page.Instance<any, any>, arg1?: (arg0: any) => void) => void; |
||||
getApplyDoctor: () => Promise<any>; |
||||
} |
||||
|
||||
interface IAgaxParams extends WechatMiniprogram.RequestOption { |
||||
showMsg?: boolean; |
||||
loading?: boolean; |
||||
isJSON?: boolean; |
||||
} |
||||
|
||||
declare namespace WechatMiniprogram { |
||||
export interface Wx { |
||||
ajax: (arg0: IAgaxParams) => Promise<any>; |
||||
WebIM; |
||||
} |
||||
} |
||||
|
||||
interface IUserInfo { |
||||
UserId: string; |
||||
IsDoctor: number; |
||||
DoctorId: number; |
||||
Name: string; |
||||
Img: string; |
||||
Telephone: string; |
||||
HospitalId: string; |
||||
TitleType: number; |
||||
OtherTitle: string; |
||||
DoctorLevel: number; |
||||
Introduce: string; |
||||
Department: IDepartment[]; |
||||
DepartmentId: string[]; |
||||
Specialty: ISpecialty[]; |
||||
SpecialtyId: string[]; |
||||
HospitalName: string; |
||||
HospitalClassification: string; |
||||
HospitalLevel: string; |
||||
ProvinceName: string; |
||||
CityName: string; |
||||
CountyName: string; |
||||
Address: string; |
||||
HospitalClassificationName: string; |
||||
HospitalLevelName: string; |
||||
} |
||||
|
||||
interface IDepartment { |
||||
DepartmentId: string; |
||||
DepartmentName: string; |
||||
DoctorId: string; |
||||
} |
||||
|
||||
interface ISpecialty { |
||||
SpecialtyId: string; |
||||
SpecialtyName: string; |
||||
DepartmentId: string; |
||||
DoctorId: string; |
||||
} |