Browse Source

init

master
kola-web 5 days ago
commit
2c70def742
  1. 9
      .editorconfig
  2. 6
      .gitignore
  3. 28
      .prettierrc
  4. 10
      babel.config.json
  5. 28
      eslint.config.mjs
  6. 29
      package.json
  7. 3845
      pnpm-lock.yaml
  8. 76
      project.config.json
  9. 22
      project.private.config.json
  10. 82
      src/api/request.ts
  11. 36
      src/app.json
  12. 21
      src/app.scss
  13. 185
      src/app.ts
  14. 6
      src/components/navbar/index.json
  15. 0
      src/components/navbar/index.scss
  16. 42
      src/components/navbar/index.ts
  17. 17
      src/components/navbar/index.wxml
  18. 3
      src/pages/index/index.json
  19. 3
      src/pages/index/index.scss
  20. 12
      src/pages/index/index.ts
  21. 3
      src/pages/index/index.wxml
  22. 3
      src/pages/login/index.json
  23. 3
      src/pages/login/index.scss
  24. 16
      src/pages/login/index.ts
  25. 3
      src/pages/login/index.wxml
  26. 3
      src/pages/my/index.json
  27. 3
      src/pages/my/index.scss
  28. 17
      src/pages/my/index.ts
  29. 3
      src/pages/my/index.wxml
  30. 4
      src/pages/start/index.json
  31. 7
      src/pages/start/index.scss
  32. 40
      src/pages/start/index.ts
  33. 3
      src/pages/start/index.wxml
  34. 9
      src/sitemap.json
  35. 2
      src/utils/dayjs/day-zh-cn.js
  36. 1
      src/utils/dayjs/relativeTime.js
  37. 89
      src/utils/page.ts
  38. 26
      src/utils/util.ts
  39. 35
      tsconfig.json
  40. 37
      typings/index.d.ts

9
.editorconfig

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

6
.gitignore vendored

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
.svn
.vscode
node_modules
.idea
.DS_Store
miniprogram_npm

28
.prettierrc

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
{
"$schema": "http://json.schemastore.org/prettierrc",
"printWidth": 120,
"tabWidth": 2,
"useTabs": false,
"semi": false,
"singleQuote": true,
"bracketSpacing": true,
"trailingComma": "all",
"arrowParens": "always",
"endOfLine": "lf",
"htmlWhitespaceSensitivity": "ignore",
"singleAttributePerLine": false,
"overrides": [
{
"files": "*.wxml",
"options": { "parser": "html" }
},
{
"files": "*.wxss",
"options": { "parser": "css" }
},
{
"files": "*.wxs",
"options": { "parser": "babel" }
}
]
}

10
babel.config.json

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
{
"plugins": [
[
"@babel/plugin-transform-react-jsx",
{
"runtime": "automatic"
}
]
]
}

28
eslint.config.mjs

@ -0,0 +1,28 @@ @@ -0,0 +1,28 @@
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',
eqeqeq: 'off',
},
},
prettierConfig,
)

29
package.json

@ -0,0 +1,29 @@ @@ -0,0 +1,29 @@
{
"name": "school-miniprogram",
"version": "1.0.0",
"description": "",
"author": "",
"license": "",
"keywords": [],
"scripts": {
"beforeCompile": "babel src/pages --out-dir src/pages --only **/*.jsx",
"lint:fix": "eslint . --fix"
},
"dependencies": {
"@vant/weapp": "^1.11.2",
"dayjs": "^1.11.10",
"miniprogram-licia": "^1.39.2",
"mp-html": "^2.4.2"
},
"devDependencies": {
"@antfu/eslint-config": "^3.2.0",
"@babel/cli": "^7.23.4",
"@babel/core": "^7.23.6",
"@babel/plugin-transform-react-jsx": "^7.23.4",
"eslint": "^9.9.1",
"eslint-config-prettier": "^9.1.0",
"miniprogram-api-typings": "^3.12.3",
"prettier": "^3.3.3",
"typescript": "^5.8.3"
}
}

3845
pnpm-lock.yaml

File diff suppressed because it is too large Load Diff

76
project.config.json

@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
{
"description": "项目配置文件,详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
"miniprogramRoot": "src/",
"compileType": "miniprogram",
"setting": {
"useCompilerPlugins": [
"typescript",
"sass"
],
"urlCheck": true,
"coverView": true,
"es6": true,
"postcss": true,
"lazyloadPlaceholderEnable": false,
"preloadBackgroundData": false,
"minified": true,
"autoAudits": false,
"uglifyFileName": false,
"uploadWithSourceMap": true,
"enhance": true,
"useMultiFrameRuntime": true,
"showShadowRootInWxmlPanel": true,
"packNpmManually": true,
"packNpmRelationList": [
{
"packageJsonPath": "package.json",
"miniprogramNpmDistDir": "./src"
}
],
"minifyWXSS": true,
"useStaticServer": true,
"showES6CompileOption": false,
"checkInvalidKey": true,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"disableUseStrict": false,
"minifyWXML": true,
"localPlugins": false,
"condition": false,
"ignoreUploadUnusedFiles": true,
"compileWorklet": false,
"swc": false,
"disableSWC": true
},
"simulatorType": "wechat",
"simulatorPluginLibVersion": {},
"condition": {},
"srcMiniprogramRoot": "src/",
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 2
},
"packOptions": {
"ignore": [
{
"value": "/images/*.*",
"type": "glob"
},
{
"value": "/images/**/*.*",
"type": "glob"
}
],
"include": []
},
"appid": "wx2b0bb13edf717c1d",
"scripts": {
"beforeCompile": "pnpm run beforeCompile",
"beforePreview": "pnpm run beforeCompile",
"beforeUpload": "pnpm run beforeCompile"
},
"libVersion": "3.5.8"
}

22
project.private.config.json

@ -0,0 +1,22 @@ @@ -0,0 +1,22 @@
{
"libVersion": "3.5.8",
"condition": {},
"projectname": "school-miniprogram",
"setting": {
"urlCheck": true,
"coverView": true,
"lazyloadPlaceholderEnable": false,
"skylineRenderEnable": false,
"preloadBackgroundData": false,
"autoAudits": false,
"useApiHook": true,
"showShadowRootInWxmlPanel": true,
"useStaticServer": true,
"useLanDebug": false,
"showES6CompileOption": false,
"compileHotReLoad": true,
"checkInvalidKey": true,
"ignoreDevUnusedFiles": true,
"bigPackageSizeSupport": false
}
}

82
src/api/request.ts

@ -0,0 +1,82 @@ @@ -0,0 +1,82 @@
interface IGlobalParams {
gUrl: string
version?: string
}
export const request = function (
{ gUrl }: IGlobalParams,
{
url,
method,
data,
header,
showMsg = true,
loading = false,
loadingText = '加载中...',
isJSON = false,
...options
}: IAgaxParams,
): Promise<any> {
return new Promise((resolve, reject) => {
if (loading) {
wx.showLoading({
title: loadingText,
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): string {
if (typeof err === 'string') {
return err
}
return err.data || err.msg || err.errMsg || (err.detail && err.detail.errMsg) || '未知错误'
}

36
src/app.json

@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
{
"pages": [
"pages/start/index",
"pages/index/index",
"pages/login/index",
"pages/my/index"
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "校园小程序",
"navigationBarTextStyle": "black"
},
"tabBar": {
"custom": true,
"list": [
{
"pagePath": "pages/index/index",
"text": "首页"
},
{
"pagePath": "pages/my/index",
"text": "我的"
}
]
},
"sitemapLocation": "sitemap.json",
"resolveAlias": {
"@/*": "/*"
},
"usingComponents": {
"navbar": "/components/navbar/index"
},
"requiredPrivateInfos": [],
"permission": {}
}

21
src/app.scss

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
.clearfix:after {
content: '020';
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
zoom: 1;
}
.scroll::-webkit-scrollbar {
width: 0;
height: 0;
color: transparent;
}
view {
word-break: break-all;
}

185
src/app.ts

@ -0,0 +1,185 @@ @@ -0,0 +1,185 @@
import page from '@/utils/page'
import { request } from './api/request'
import { parseScene } from './utils/util'
const dayjs = require('dayjs')
const licia = require('miniprogram-licia')
require('/utils/dayjs/day-zh-cn.js')
const relativeTime = require('/utils/dayjs/relativeTime.js')
dayjs.locale('zh-cn')
dayjs.extend(relativeTime)
App<IAppOption>({
globalData: {
url: '',
upFileUrl: '',
imageUrl: '',
Timestamp: new Date().getTime(),
waitBindDoctorId: '',
scene: {},
loginState: '',
initLoginInfo: {},
userInfo: {},
},
onLaunch() {
this.autoUpdate()
Page = page as WechatMiniprogram.Page.Constructor
wx.ajax = licia.curry(request)({ gUrl: this.globalData.url })
},
onShow(options: Record<string, any> & { query?: Record<string, string> }) {
if (options.query?.scene) {
this.globalData.scene = parseScene(options.query!.scene) as any
}
this.startLogin()
},
startLogin(callback?: () => void) {
wx.login({
success: (res) => {
wx.ajax({
method: 'GET',
url: '?r=wtx/user/init-login',
data: {
code: res.code,
},
}).then((res: any) => {
this.globalData.loginState = res.loginState
this.globalData.initLoginInfo = res
if (callback) {
callback()
}
})
},
})
},
updateLoginInfo(callback?: () => void) {
wx.ajax({
method: 'GET',
url: '?r=wtx/user/init-info',
data: {},
}).then((res: any) => {
this.globalData.initLoginInfo = res
if (callback) {
callback()
}
})
},
waitLogin({ type }: { type?: 0 | 1 | 2 | 'any' } = { type: 'any' }) {
return new Promise<void>((resolve) => {
const checkLogin = () => {
if (this.globalData.loginState) {
if (this.checkLoginType(type ?? 'any')) {
resolve()
}
return
}
setTimeout(() => {
checkLogin()
}, 500)
}
checkLogin()
})
},
checkLoginType(type: 0 | 1 | 2 | 'any') {
const { loginType, isLogin, isReg } = this.globalData.initLoginInfo
if (type === 'any') {
return true
}
if (isLogin !== 1) {
if (type === 0) {
return true
}
wx.reLaunch({
url: '/pages/index/index',
})
return false
}
if (isReg !== 1) {
const typePageUrl: Record<number, string> = {
1: '/pages/login/index',
2: '/pages/login/index',
}
wx.reLaunch({
url: typePageUrl[loginType as 1 | 2],
})
return false
}
if (loginType !== type) {
wx.reLaunch({
url: '/pages/index/index',
})
return false
}
return true
},
getUserInfo(type: 0 | 1 | 2 = 0) {
const url: Record<number, string> = {
0: '?r=wtx/user/userinfo',
1: '?r=wtx/account/info',
2: '?r=wtx/doctor/account/info',
}
return wx.ajax({
method: 'GET',
url: url[type],
})
},
autoUpdate() {
const self = this
if (wx.canIUse('getUpdateManager')) {
const updateManager = wx.getUpdateManager()
updateManager.onCheckForUpdate((res) => {
if (res.hasUpdate) {
wx.showModal({
title: '更新提示',
content: '检测到新版本,是否下载新版本并重启小程序?',
success(res) {
if (res.confirm) {
self.downLoadAndUpdate(updateManager)
} else if (res.cancel) {
wx.showModal({
title: '温馨提示~',
content: '本次版本更新涉及到新的功能添加,旧版本无法正常访问的哦~',
showCancel: false,
confirmText: '确定更新',
success(res) {
if (res.confirm) {
self.downLoadAndUpdate(updateManager)
}
},
})
}
},
})
}
})
} else {
wx.showModal({
title: '提示',
content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。',
})
}
},
downLoadAndUpdate(updateManager: WechatMiniprogram.UpdateManager) {
updateManager.onUpdateReady(() => {
wx.hideLoading()
updateManager.applyUpdate()
})
updateManager.onUpdateFailed(() => {
wx.showModal({
title: '新版本更新失败',
content: '您可删除当前小程序,重新打开尝试',
})
})
},
})

6
src/components/navbar/index.json

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
{
"component": true,
"usingComponents": {
"van-nav-bar": "@vant/weapp/nav-bar/index"
}
}

0
src/components/navbar/index.scss

42
src/components/navbar/index.ts

@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
const app = getApp<IAppOption>()
Component({
options: {
multipleSlots: true,
},
properties: {
title: String,
fixed: Boolean,
placeholder: Boolean,
leftText: String,
rightText: String,
customStyle: String,
leftArrow: Boolean,
border: {
type: Boolean,
value: false,
},
zIndex: {
type: Number,
value: 1,
},
back: {
type: Boolean,
value: true,
},
},
data: {
imageUrl: app.globalData.imageUrl,
Timestamp: app.globalData.Timestamp,
},
methods: {
onClickLeft() {
if (this.data.back) {
this.triggerEvent('clickLeft', {}, {})
}
},
onClickRight() {
this.triggerEvent('clickRight', {}, {})
},
},
})

17
src/components/navbar/index.wxml

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
<van-nav-bar
title="{{title}}"
fixed="{{fixed}}"
placeholder="{{placeholder}}"
leftText="{{leftText}}"
rightText="{{rightText}}"
customStyle="{{customStyle}}"
leftArrow="{{leftArrow}}"
border="{{border}}"
zIndex="{{zIndex}}"
bind:click-left="onClickLeft"
bind:click-right="onClickRight"
>
<slot name="left" slot="left"></slot>
<slot name="title" slot="title"></slot>
<slot name="right" slot="right"></slot>
</van-nav-bar>

3
src/pages/index/index.json

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
{
"usingComponents": {}
}

3
src/pages/index/index.scss

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
.page {
padding: 20rpx;
}

12
src/pages/index/index.ts

@ -0,0 +1,12 @@ @@ -0,0 +1,12 @@
const app = getApp<IAppOption>()
Page({
data: {
title: '首页',
},
onLoad() {
app.waitLogin()
},
})
export {}

3
src/pages/index/index.wxml

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
<view class="page">
<text>{{title}}</text>
</view>

3
src/pages/login/index.json

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
{
"usingComponents": {}
}

3
src/pages/login/index.scss

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
.page {
padding: 20rpx;
}

16
src/pages/login/index.ts

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
const app = getApp<IAppOption>()
Page({
data: {},
onLoad() {},
handleGetUserInfo() {
wx.getUserProfile({
desc: '用于完善用户资料',
success: (res) => {
app.globalData.userInfo = res.userInfo
},
})
},
})
export {}

3
src/pages/login/index.wxml

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
<view class="page">
<text>登录页</text>
</view>

3
src/pages/my/index.json

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
{
"usingComponents": {}
}

3
src/pages/my/index.scss

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
.page {
padding: 20rpx;
}

17
src/pages/my/index.ts

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
const app = getApp<IAppOption>()
Page({
data: {
userInfo: {},
},
onLoad() {
app.waitLogin()
},
onShow() {
this.setData({
userInfo: app.globalData.userInfo,
})
},
})
export {}

3
src/pages/my/index.wxml

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
<view class="page">
<text>我的</text>
</view>

4
src/pages/start/index.json

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
{
"navigationStyle": "custom",
"usingComponents": {}
}

7
src/pages/start/index.scss

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
.page {
width: 100vw;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}

40
src/pages/start/index.ts

@ -0,0 +1,40 @@ @@ -0,0 +1,40 @@
import { parseScene } from '@/utils/util'
const app = getApp<IAppOption>()
Page({
data: {},
onLoad(options) {
if (options.scene) {
const params = parseScene(options.scene)
if (params) {
app.globalData.waitBindDoctorId = (params as any).doctorId
}
}
app.waitLogin().then(() => {
const initLoginInfo = app.globalData.initLoginInfo || {}
if (initLoginInfo.isLogin === 0) {
wx.reLaunch({
url: '/pages/index/index',
})
}
if (initLoginInfo.loginType === 1) {
if (initLoginInfo.isReg === 1) {
wx.reLaunch({
url: '/pages/index/index',
})
return
}
wx.reLaunch({
url: '/pages/index/index',
})
}
if (initLoginInfo.loginType === 2) {
wx.reLaunch({
url: '/pages/index/index',
})
}
})
},
})
export {}

3
src/pages/start/index.wxml

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
<view class="page">
<text>启动页</text>
</view>

9
src/sitemap.json

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
{
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
"rules": [
{
"action": "allow",
"page": "*"
}
]
}

2
src/utils/dayjs/day-zh-cn.js

@ -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}));

1
src/utils/dayjs/relativeTime.js

@ -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)}}}));

89
src/utils/page.ts

@ -0,0 +1,89 @@ @@ -0,0 +1,89 @@
const originalPage = Page
const noSharePath: string[] = []
function page(config: WechatMiniprogram.Page.Instance<WechatMiniprogram.IAnyObject, WechatMiniprogram.IAnyObject>) {
const originalOnLoad = config.onLoad
config.onLoad = function (options) {
setImageParams(this)
setNavBar(this)
if (originalOnLoad) {
originalOnLoad.call(this, options)
}
}
const originalOnPageScroll = config.onPageScroll
config.onPageScroll = function (options): void {
const scrollTop = options?.scrollTop
let background = 'transparent'
if (Number(scrollTop) > 20) {
background = '#ffffff'
}
this.setData({
background,
})
if (originalOnPageScroll) {
originalOnPageScroll.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]
let url = currentPage.route
const opts = currentPage.options
let urlWithArgs = `${url}?`
for (const key in opts) {
const value = opts[key]
urlWithArgs += `${key}=${value}&`
}
urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length - 1)
const isNoShare = noSharePath.some((path) => url.includes(path))
let imageUrl = ''
if (isNoShare) {
urlWithArgs = 'pages/start/index'
imageUrl = `${getApp().globalData.imageUrl}share.png?t=${Timestamp}`
}
return {
title: '校园小程序',
path: urlWithArgs,
imageUrl,
}
}
}
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,
})
}
function setNavBar(
currPage: WechatMiniprogram.Page.Instance<WechatMiniprogram.IAnyObject, WechatMiniprogram.IAnyObject>,
) {
currPage.setData({
background: 'transparent',
pageTop: wx.getMenuButtonBoundingClientRect().bottom,
})
}
export default page

26
src/utils/util.ts

@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
export const getCurrentPageUrl = function () {
const pages = getCurrentPages()
const currentPage = pages[pages.length - 1]
const url = `/${currentPage.route}`
return url
}
export const parseUrlArgsToArray = (urlArgs: string) => {
const pairs = urlArgs.split('&')
const results: Record<string, string> = {}
pairs.forEach((pair) => {
const [key, value] = pair.split('=')
if (key && value) {
results[key] = value
}
})
return results
}
export const parseScene = (scene: string) => {
if (scene) {
return parseUrlArgsToArray(decodeURIComponent(scene))
} else {
return null
}
}

35
tsconfig.json

@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
{
"compilerOptions": {
"target": "ES5",
"jsx": "react-jsx",
"lib": ["ESNext"],
"moduleDetection": "force",
"experimentalDecorators": true,
"baseUrl": "",
"module": "CommonJS",
"paths": {
"@vant/weapp/*": ["node_modules/@vant/weapp/dist/*"],
"@/*": ["src/*"]
},
"typeRoots": ["./typings", "./node_modules"],
"types": ["miniprogram-api-typings"],
"allowJs": false,
"strict": true,
"strictNullChecks": true,
"strictPropertyInitialization": true,
"alwaysStrict": true,
"noFallthroughCasesInSwitch": true,
"noImplicitAny": false,
"noImplicitReturns": true,
"noImplicitThis": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"inlineSourceMap": true,
"inlineSources": true,
"removeComments": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"pretty": true
},
"exclude": ["node_modules", "miniprogram_npm", "src/miniprogram_npm"]
}

37
typings/index.d.ts vendored

@ -0,0 +1,37 @@ @@ -0,0 +1,37 @@
interface IAppOption {
globalData: {
url?: string
upFileUrl: string
imageUrl: string
Timestamp: number
waitBindDoctorId: string
loginState: string
initLoginInfo: Partial<{
isLogin: 0 | 1
isReg: 0 | 1
loginType: 1 | 2
}>
[propName: string]: any
}
getUserInfo: (type?: 0 | 1 | 2) => Promise<any>
startLogin: (callback?: () => void) => void
waitLogin: (params?: { type?: 0 | 1 | 2 | 'any' }) => Promise<void>
checkLoginType: (type: 0 | 1 | 2 | 'any') => boolean
[propName: string]: any
}
interface IAgaxParams extends WechatMiniprogram.RequestOption {
showMsg?: boolean
loading?: boolean
loadingText?: string
isJSON?: boolean
}
declare namespace WechatMiniprogram {
export interface Wx {
ajax: (params: IAgaxParams) => Promise<any>
}
}
Loading…
Cancel
Save