feat: 电子药箱小程序 - 4Tab药品管理

- 电子药箱: 药品库存管理 + 手动录入 + 今日用药打卡
- 药品百科: 搜索 + 分类筛选 + 20种药品静态数据
- 惠教中心: 4条药品使用指南课程
- 我的: 家庭成员信息管理
- 自定义TabBar + navigation-bar组件
- SVG药品分类插图
This commit is contained in:
陈誉午
2026-07-29 11:20:52 +08:00
commit 994b267f5c
683 changed files with 43849 additions and 0 deletions
+289
View File
@@ -0,0 +1,289 @@
import { request } from "../../utils/request";
import { LoginRes } from "../../components/login/login.d";
import { appId, BASE_URL } from "../../env";
import { wxLogin, wxRequest } from "../../utils/wx-api";
// package-live/login/login.ts
const app = getApp<IAppOption>();
const defaultAvatarUrl =
'https://oss.rsjk.org.cn/ruo-shan/image/425663f8-55eb-4aa9-b3dc-dcae6a963b71.png'
Page({
/**
* 页面的初始数据
*/
data: {
showPopup: false,
avatarUrl: defaultAvatarUrl,
nickname: '',
userId: null,
activityId: null,
show: null,
msg: ''
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options: any) {
if (options) {
this.setData({
userId: options.userId,
activityId: options.activityId,
show: options.show,
msg: options.msg
})
if (options.show) {
this.setData({
avatarUrl: wx.getStorageSync('avatarUrl') || defaultAvatarUrl,
nickname: wx.getStorageSync('userName') || '',
})
}
}
},
goBack() {
const pages = getCurrentPages();
if (pages.length > 1) {
wx.navigateBack({
delta: 1,
});
return;
}
wx.switchTab({
url: "/pages/tab-bar/medicine-box/index",
});
},
async handOpen() {
try {
wx.showLoading({ title: "登录中" });
const loginRes = await wxLogin();
if (!loginRes.code) throw new Error(loginRes.errMsg);
let loginResult: LoginRes;
const reqData: Record<string, any> = {
state: loginRes.code,
};
loginResult = await wxRequest<LoginRes>({
url: `${BASE_URL}/api/auth/app-auth?appId=${appId}&code=${loginRes.code}`,
method: "POST",
data: reqData,
});
if (loginResult?.statusCode !== 200) {
throw new Error(loginResult?.data?.msg || "登录失败");
}
// 判断方式 1:仅判断是否存在(当前逻辑)
if (loginResult.data.avatarUrl !== defaultAvatarUrl) {
const storageData = {
openId: loginResult.data.openId,
userId: loginResult.data.mpUserId,
mbuId: loginResult.data.id,
unionId: loginResult.data.unionId,
userName: loginResult.data.nickName,
avatarUrl: loginResult.data.avatarUrl,
};
Object.entries(storageData).forEach(([key, value]) => {
wx.setStorageSync(key, value);
});
app.globalData.isLogin = true;
wx.showToast({
title: "登录成功",
duration: 2000,
});
// 跳转到直播页面
const { userId, activityId } = this.data;
wx.redirectTo({
url: `/package-live/wxroom/index?userId=${userId}&activityId=${activityId}`
})
} else {
wx.hideToast()
this.setData({
showPopup: true
})
}
} catch (err: any) {
app.globalData.isLogin = false;
wx.showToast({
title: `登录失败:${err.message || err.errMsg}`,
icon: "none",
});
} finally {
setTimeout(() => wx.hideToast(), 3000);
}
},
closePopup() {
this.setData({
showPopup: false
})
},
// 获取头像
onChooseAvatar(e: any) {
const { avatarUrl } = e.detail;
this.setData({
avatarUrl
});
},
// 获取昵称(微信系统填入后失焦触发 bindblur)
onNicknameInput(e: any) {
const { value } = e.detail;
this.setData({
nickname: value
});
},
// 提交登录
async submitLogin() {
const { avatarUrl, nickname } = this.data;
if (!avatarUrl) {
wx.showToast({
title: '请选择头像',
icon: 'none'
});
return;
}
if (!nickname) {
wx.showToast({
title: '请选择昵称',
icon: 'none'
});
return;
}
try {
wx.showLoading({ title: "登录中" });
const loginRes = await wxLogin();
if (!loginRes.code) throw new Error(loginRes.errMsg);
let loginResult: LoginRes;
const reqData: Record<string, any> = {
state: loginRes.code,
avatarUrl,
nickName: nickname
};
loginResult = await wxRequest<LoginRes>({
url: `${BASE_URL}/api/auth/app-auth?appId=${appId}&code=${loginRes.code}`,
method: "POST",
data: reqData,
});
if (loginResult?.statusCode !== 200) {
throw new Error(loginResult?.data?.msg || "登录失败");
}
const storageData = {
openId: loginResult.data.openId,
userId: loginResult.data.mpUserId,
mbuId: loginResult.data.id,
unionId: loginResult.data.unionId,
userName: loginResult.data.nickName,
avatarUrl: loginResult.data.avatarUrl,
};
Object.entries(storageData).forEach(([key, value]) => {
wx.setStorageSync(key, value);
});
app.globalData.isLogin = true;
wx.showToast({
title: "登录成功",
duration: 2000,
});
// 跳转到直播页面
const { userId, activityId } = this.data;
wx.redirectTo({
url: `/package-live/wxroom/index?userId=${userId}&activityId=${activityId}`
})
} catch (err: any) {
app.globalData.isLogin = false;
wx.showToast({
title: `登录失败:${err.message || err.errMsg}`,
icon: "none",
});
} finally {
setTimeout(() => wx.hideToast(), 3000);
}
// 关闭弹窗
this.closePopup();
},
async refresh() {
const { userId, activityId } = this.data;
const params = userId ? { mpUserId: wx.getStorageSync("userId"), userId } : { mpUserId: wx.getStorageSync("userId") };
const dataRes = await request<any>({
options: {
url: "/app/saas/refresh",
method: "GET",
data: params
},
isLoading: false,
});
if (dataRes.pass) {
wx.redirectTo({
url: `/package-live/wxroom/index?userId=${userId}&activityId=${activityId}`
})
}
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})