初始化仓库

This commit is contained in:
2024-09-19 12:51:35 +08:00
commit d648a18935
175 changed files with 29732 additions and 0 deletions

116
.gitignore vendored Normal file
View File

@@ -0,0 +1,116 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*

16
.hbuilderx/launch.json Normal file
View File

@@ -0,0 +1,16 @@
{ // launch.json 配置了启动调试时相关设置configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtype项可配置值为local或remote, local代表前端连本地云函数remote代表前端连云端云函数
"version": "0.0",
"configurations": [{
"default" :
{
"launchtype" : "local"
},
"mp-weixin" :
{
"launchtype" : "local"
},
"type" : "uniCloud"
}
]
}

5
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,5 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/xiaokang-client-master.iml" filepath="$PROJECT_DIR$/.idea/xiaokang-client-master.iml" />
</modules>
</component>
</project>

12
.idea/xiaokang-client-master.iml generated Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

123
App.vue Normal file
View File

@@ -0,0 +1,123 @@
<script>
import {
getVersion
} from './request/api/api'
export default {
// //初始化状态-如果登录过,保持登录状态
onLaunch: async function() {
// console.log('App Launch')
const version = 4 // 如果当前版本和后台返回的版本一致,那就是审核中,审核通过后 后台设置加1如果后台的比本地的大 那就是生产版本
const res = await getVersion()
const val = Number(res.data.data.value)
// const accountInfo = uni.getAccountInfoSync();
// if (accountInfo.miniProgram.envVersion === 'develop') {
// // 跳转预留好的页面-调试使用中
// // wx.navigateTo() // 开发时,可以注释本行,方便自己预览
// // console.log(accountInfo,'aaaaaaaaaaaaaaaa');
// uni.navigateTo({
// url:'/pages/home/index',
// success() {
// // console.log(accountInfo,'aaaaaaaaaaaaaaaa');
// }
// })
// }
// 生产
const isShow = val <= version;
// 测试
// const isShow = accountInfo.miniProgram.envVersion != 'develop';
// 存储当前版本,也可以使用globalData
uni.setStorageSync('isShow_envVersion', isShow)
// 获取小程序更新机制兼容
if (uni.canIUse('getUpdateManager')) {
const updateManager = uni.getUpdateManager()
// 检查是否有新版本发布
updateManager.onCheckForUpdate(function(res) {
if (res.hasUpdate) {
//小程序有新版本,则静默下载新版本,做好更新准备
updateManager.onUpdateReady(function() {
uni.showModal({
title: '更新提示',
content: '新版本已经准备好,是否重启应用?',
success: function(res) {
if (res.confirm) {
//新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate()
} else if (res.cancel) {
//如果需要强制更新,则给出二次弹窗,如果不需要,则这里的代码都可以删掉了
uni.showModal({
title: '温馨提示',
content: '我们已经做了新的优化,请及时更新哦~',
showCancel: false, //隐藏取消按钮也可显示取消会走res.cancel然后从新开始提示
success: function(res) {
//第二次提示后,强制更新
if (res.confirm) {
// 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
updateManager.applyUpdate()
} else if (res.cancel) {
//重新回到版本更新提示
autoUpdate()
}
}
})
}
}
})
})
// 新的版本下载失败
updateManager.onUpdateFailed(function() {
uni.showModal({
title: '温馨提示',
content: '新版本已经上线,请您删除当前小程序,重新搜索打开',
})
})
}
})
} else {
// 提示用户在最新版本的客户端上体验
uni.showModal({
title: '温馨提示',
content: '当前微信版本过低,可能无法使用该功能,请升级到最新版本后重试。'
})
}
},
onShow: function(e) {
// console.log('App Show')
// this.$store.dispatch('initLogin')
// 解析scene里面的参数
if (e === undefined)
return {};
const scene = decodeURIComponent(e.query.scene)
if (scene) {
const scene = decodeURIComponent(e.query.scene).split('STORE_QR_CODE_')
uni.setStorageSync('stores_id', scene[1])
const st_id = decodeURIComponent(e.query.scene).split('&')
const doctors_id = decodeURIComponent(e.query.scene).split('=')
uni.setStorageSync('doctors_id', st_id[0].split('su_id=')[1])
uni.setStorageSync('st_id', doctors_id[2])
console.log(scene, '2222');
// console.log(scene[1], '4444');
}
// const scene = decodeURIComponent(e.query.scene).split('STORE_QR_CODE_')
// console.log(scene, '11111');
},
onHide: function() {
// console.log('App Hide')
// this.$store.dispatch('closeWebSocket')
},
onUnload:function() {
// uni.removeStorageSync('token')
}
}
</script>
<style lang="scss">
/* 注意要写在第一行同时给style标签加入lang="scss"属性 */
@import "uview-ui/index.scss";
@import url("static/iconfont/index.css");
</style>

31
README.md Normal file
View File

@@ -0,0 +1,31 @@
### 3 分钟了解如何进入开发
欢迎使用云效 Codeup通过阅读以下内容你可以快速熟悉 Codeup ,并立即开始今天的工作。
### 提交**文件**
首先,你需要了解在 Codeup 中如何提交代码文件,跟着文档「[__提交第一行代码__](https://help.aliyun.com/document_detail/153708.html)」一起操作试试看吧。
### 开启代码检测
开发过程中为了更好的管理你的代码资产Codeup 内置了「[__代码检测服务__](https://help.aliyun.com/document_detail/434321.html),可设置提交或合并请求的变更自动触发扫描,并及时提供结果反馈。
![](https://img.alicdn.com/tfs/TB1nRDatoz1gK0jSZLeXXb9kVXa-1122-380.png "")
![](https://img.alicdn.com/tfs/TB1PrPatXY7gK0jSZKzXXaikpXa-1122-709.png "")
### 发起代码评审
功能开发完毕后,通常你需要发起「[__代码合并和评审__](https://help.aliyun.com/document_detail/153872.html)」Codeup 支持多人协作的代码评审服务,你可以通过「[__保护分支__](https://help.aliyun.com/document_detail/153873.html)」策略及「[__合并请求设置__](https://help.aliyun.com/document_detail/153874.html)」对合并过程进行流程化管控,同时提供 WebIDE 在线代码评审及冲突解决能力,让你的评审过程更加流畅。
![](https://img.alicdn.com/tfs/TB1XHrctkP2gK0jSZPxXXacQpXa-1432-887.png "")
![](https://img.alicdn.com/tfs/TB1V3fctoY1gK0jSZFMXXaWcVXa-1432-600.png "")
### 查看代码贡献
代码库提供了图形化报表帮助企业查看团队的代码提交和代码行贡献情况,此外还支持查看提交评审率、千行代码评论数等指标以衡量成员的代码评审活动参与度。
### 成员协作
是时候邀请成员一起编写卓越的代码工程了,请点击右上角「成员」邀请你的小伙伴开始协作吧!
### 更多
Git 使用教学、高级功能指引等更多说明,参见[__Codeup帮助文档__](https://help.aliyun.com/document_detail/153784.html)。

1022
common/common.js Normal file

File diff suppressed because it is too large Load Diff

917
common/getPingYin.js Normal file

File diff suppressed because one or more lines are too long

12
common/messageType.js Normal file
View File

@@ -0,0 +1,12 @@
export const messageType = {
"desc": '病情描述信息',
"text_a": '基本健康信息',
"images": '图片信息',
"record": "就诊记录",
"system": "系统信息",
"end": "系统信息",
"text": "文本信息",
"voice": "语音信息",
"img": "图片信息",
"video": "视频信息",
}

27
common/share.js Normal file
View File

@@ -0,0 +1,27 @@
export default {
data() {
return {
// 默认的全局分享内容
share: {
title: '惠联康',
path: '/pages/home/home', // 全局分享的路径,比如 首页
}
}
},
onShareAppMessage(res) {
return {
title: this.share.title,
path: this.share.path,
}
},
onShareTimeline() {
let that = this;
var url = "/pages/home/home"
return {
title: '惠联康',
path: url,
query: "", //你的参数拼接,注意:不需要加?
imageUrl: '' //你分享的封面
};
},
}

212
common/utils.js Normal file
View File

@@ -0,0 +1,212 @@
import $store from '@/store/index.js';
import pinyin from './getPingYin.js';
class utils {
constructor(arg) {
}
//返回上一页
back(delta = 1) {
uni.navigateBack({
delta: delta
})
}
//获取好友备注,没有返回昵称
getNickName(friend_id, nickname) {
var friendIds = uni.getStorageSync("friendIds");
if (friendIds.length) {
let petName = nickname;
friendIds.forEach((item) => {
if (friend_id == item.friend_id) {
if (item.pet_name != undefined) {
petName = item.pet_name;
}
}
})
return petName;
} else {
return nickname;
}
}
getGroupById(id) {
let groups = uni.getStorageSync("groupList");
let info = [];
if (groups && groups.length) {
groups.forEach((item) => {
if (id == item._id) {
info = item;
}
})
}
return info;
}
getGroupAvatarList(id) {
var avatarList = [];
if (id) {
let groups = this.getGroupById(id);
if (groups.group_users != undefined && groups.group_users.length) {
groups.group_users.forEach((item) => {
avatarList.push(item.avatar)
})
}
}
return avatarList;
}
getFriendInfoById(id) {
let friends = $store.state.user.friendList;
let info = [];
if (friends.length) {
friends.forEach((item) => {
if (id == item._id) {
info = item;
}
})
}
return info;
}
//获取缓存头像
getImageCache(url) {
return url;
let key = `images_cache`;
let list = uni.getStorageSync(key);
list = list ? list : [];
let index = list.findIndex(item => item.url === url)
if (index !== -1) {
return list[index]['cache'];
} else {
var cache = {
url: url,
cache: url,
};
uni.downloadFile({
url: url,
success: (res) => {
if (res.statusCode === 200) {
cache.cache = res.tempFilePath;
list.push(cache);
uni.setStorageSync(key, list);
}
},
fail: (e) => {
}
});
return cache.cache;
}
}
//好友列表按首字母排序
sortFriendList(data) {
var friendList = data;
var letter = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z", "#"
];
var indexData = [];
letter.forEach((letterItem, letterIndex) => {
var letterData = {
letter: letterItem,
data: []
}
friendList.forEach((friendListItem, friendListIndex) => {
var firstLetter = friendListItem.nickname.substr(0, 1);
var p = /[a-z]/i;
var b = p.test(firstLetter);
if (b) {
var firstWord = firstLetter.toUpperCase();
} else {
var firstWord = pinyin.initial(firstLetter);
}
var p2 = /[A-Z]/i;
var b2 = p2.test(firstWord);
if (!b2 && letterItem === "#") {
letterData.data.push(friendListItem);
}
if (b2 && letterItem === firstWord) {
letterData.data.push(friendListItem);
}
})
if (letterData.data.length > 0) {
indexData.push(letterData);
}
})
return indexData;
}
//格式化时间
formatChatTime(time) {
time = this.dateFormat("YY-mm-dd HH:MM:SS", new Date(time));
var date = time.toString();
var year = date.split("-")[0];
var month = date.split("-")[1];
var day = date.split("-")[2];
var d1 = new Date(year + '/' + month + '/' + day.split(" ")[0]);
var d3 = new Date(date.replace(/-/g, "/"));
var dd = new Date();
var y = dd.getFullYear();
var m = dd.getMonth() + 1;
var d = dd.getDate();
var d2 = new Date(y + '/' + m + '/' + d);
var iday = parseInt(d2 - d1) / 1000 / 60 / 60 / 24;
var hours = d3.getHours();
var minutes = d3.getMinutes();
if (minutes < 10) {
minutes = '0' + minutes;
}
if (hours < 10) {
hours = '0' + hours;
}
if (iday == 0) {
if (hours >= 12) {
return "下午 " + hours + ":" + minutes;
} else {
return "上午 " + hours + ":" + minutes;;
}
} else if (iday == 1) {
var dt = "";
if (hours >= 12) {
dt = "下午 " + hours + ":" + minutes;
} else {
dt = "上午 " + hours + ":" + minutes;;
}
return "昨天 " + dt;
} else if (iday == 2) {
var dt = "";
if (hours >= 12) {
dt = "下午 " + hours + ":" + minutes;
} else {
dt = "上午 " + hours + ":" + minutes;;
}
return "前天 " + dt;
} else {
return year + '/' + month + "/" + d1.getDate()
}
}
dateFormat(fmt, date) {
let ret;
const opt = {
"Y+": date.getFullYear().toString(), // 年
"m+": (date.getMonth() + 1).toString(), // 月
"d+": date.getDate().toString(), // 日
"H+": date.getHours().toString(), // 时
"M+": date.getMinutes().toString(), // 分
"S+": date.getSeconds().toString() // 秒
};
for (let k in opt) {
ret = new RegExp("(" + k + ")").exec(fmt);
if (ret) {
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
};
};
return fmt;
}
}
export default utils

View File

@@ -0,0 +1,307 @@
<template>
<view class="u-dropdown" :style="dropDownShow ? '' :'overflow:hidden'">
<view class="u-dropdown__menu" :style="{
height: $u.addUnit(height)
}" :class="{
'u-border-bottom': borderBottom
}">
<view class="u-dropdown__menu__item" v-for="(item, index) in menuList" :key="index"
@tap.stop="menuClick(index)">
<view class="u-flex">
<text class="u-dropdown__menu__item__text" :style="{
color: item.disabled ? '#c0c4cc' : (index === current || highlightIndex == index) ? activeColor : inactiveColor,
fontSize: $u.addUnit(titleSize)
}">{{item.title}}</text>
<view class="u-dropdown__menu__item__arrow" :class="{
'u-dropdown__menu__item__arrow--rotate': index === current
}">
<u-icon :custom-style="{display: 'flex'}" :name="menuIcon" :size="$u.addUnit(menuIconSize)"
:color="index === current || highlightIndex == index ? activeColor : '#c0c4cc'"></u-icon>
</view>
</view>
</view>
</view>
<view class="u-dropdown__content" :style="[contentStyle, {
transition: `opacity ${duration / 1000}s linear`,
top: $u.addUnit(height),
height: contentHeight + 'px'
}]" @tap="maskClick" @touchmove.stop.prevent>
<view @tap.stop.prevent class="u-dropdown__content__popup" :style="[popupStyle]">
<slot></slot>
</view>
<view class="u-dropdown__content__mask"></view>
</view>
</view>
</template>
<script>
/**
* dropdown 下拉菜单
* @description 该组件一般用于向下展开菜单,同时可切换多个选项卡的场景
* @tutorial http://uviewui.com/components/dropdown.html
* @property {String} active-color 标题和选项卡选中的颜色(默认#2979ff
* @property {String} inactive-color 标题和选项卡未选中的颜色(默认#606266
* @property {Boolean} close-on-click-mask 点击遮罩是否关闭菜单默认true
* @property {Boolean} close-on-click-self 点击当前激活项标题是否关闭菜单默认true
* @property {String | Number} duration 选项卡展开和收起的过渡时间单位ms默认300
* @property {String | Number} height 标题菜单的高度单位任意默认80
* @property {String | Number} border-radius 菜单展开内容下方的圆角值单位任意默认0
* @property {Boolean} border-bottom 标题菜单是否显示下边框默认false
* @property {String | Number} title-size 标题的字体大小单位任意数值默认为rpx单位默认28
* @event {Function} open 下拉菜单被打开时触发
* @event {Function} close 下拉菜单被关闭时触发
* @example <u-dropdown></u-dropdown>
*/
export default {
name: 'u-dropdown',
props: {
// 菜单标题和选项的激活态颜色
activeColor: {
type: String,
default: '#2979ff'
},
// 菜单标题和选项的未激活态颜色
inactiveColor: {
type: String,
default: '#606266'
},
// 点击遮罩是否关闭菜单
closeOnClickMask: {
type: Boolean,
default: true
},
// 点击当前激活项标题是否关闭菜单
closeOnClickSelf: {
type: Boolean,
default: true
},
// 过渡时间
duration: {
type: [Number, String],
default: 300
},
// 标题菜单的高度单位任意数值默认为rpx单位
height: {
type: [Number, String],
default: 80
},
// 是否显示下边框
borderBottom: {
type: Boolean,
default: false
},
// 标题的字体大小
titleSize: {
type: [Number, String],
default: 28
},
// 下拉出来的内容部分的圆角值
borderRadius: {
type: [Number, String],
default: 0
},
// 菜单右侧的icon图标
menuIcon: {
type: String,
default: 'arrow-down'
},
// 菜单右侧图标的大小
menuIconSize: {
type: [Number, String],
default: 26
}
},
data() {
return {
showDropdown: true, // 是否打开下来菜单,
menuList: [], // 显示的菜单
active: false, // 下拉菜单的状态
// 当前是第几个菜单处于激活状态小程序中此处不能写成false或者""否则后续将current赋值为0
// 无能的TX没有使用===而是使用==判断,导致程序认为前后二者没有变化,从而不会触发视图更新
current: 99999,
// 外层内容的样式,初始时处于底层,且透明
contentStyle: {
zIndex: -1,
opacity: 0
},
// 让某个菜单保持高亮的状态
highlightIndex: 99999,
contentHeight: 0,
dropDownShow: false
}
},
computed: {
// 下拉出来部分的样式
popupStyle() {
let style = {};
// 进行Y轴位移展开状态时恢复原位。收齐状态时往上位移100%,进行隐藏
style.transform = `translateY(${this.active ? 0 : '-100%'})`
style['transition-duration'] = this.duration / 1000 + 's';
style.borderRadius = `0 0 ${this.$u.addUnit(this.borderRadius)} ${this.$u.addUnit(this.borderRadius)}`;
return style;
}
},
created() {
// 引用所有子组件(u-dropdown-item)的this不能在data中声明变量否则在微信小程序会造成循环引用而报错
this.children = [];
},
mounted() {
this.getContentHeight();
},
methods: {
init() {
// 当某个子组件内容变化时触发父组件的init父组件再让每一个子组件重新初始化一遍
// 以保证数据的正确性
this.menuList = [];
this.children.map(child => {
child.init();
})
},
// 点击菜单
menuClick(index) {
// 判断是否被禁用
if (this.menuList[index].disabled) return;
// 如果点击时的索引和当前激活项索引相同,意味着点击了激活项,需要收起下拉菜单
if (index === this.current && this.closeOnClickSelf) {
this.close();
// 等动画结束后,再移除下拉菜单中的内容,否则直接移除,也就没有下拉菜单收起的效果了
setTimeout(() => {
this.children[index].active = false;
}, this.duration)
return;
}
this.open(index);
},
// 打开下拉菜单
open(index) {
this.dropDownShow = true
// 重置高亮索引,否则会造成多个菜单同时高亮
// this.highlightIndex = 9999;
// 展开时,设置下拉内容的样式
this.contentStyle = {
zIndex: 11,
}
// 标记展开状态以及当前展开项的索引
this.active = true;
this.current = index;
// 历遍所有的子元素将索引匹配的项标记为激活状态因为子元素是通过v-if控制切换的
// 之所以不是因display: none是因为nvue没有display这个属性
this.children.map((val, idx) => {
val.active = index == idx ? true : false;
})
this.$emit('open', this.current);
},
// 设置下拉菜单处于收起状态
close() {
this.dropDownShow = false
this.$emit('close', this.current);
// 设置为收起状态同时current归位设置为空字符串
this.active = false;
this.current = 99999;
// 下拉内容的样式进行调整不透明度设置为0
this.contentStyle = {
zIndex: -1,
opacity: 0
}
},
// 点击遮罩
maskClick() {
// 如果不允许点击遮罩,直接返回
if (!this.closeOnClickMask) return;
this.close();
},
// 外部手动设置某个菜单高亮
highlight(index = undefined) {
this.highlightIndex = index !== undefined ? index : 99999;
},
// 获取下拉菜单内容的高度
getContentHeight() {
// 这里的原理为因为dropdown组件是相对定位的它的下拉出来的内容必须给定一个高度
// 才能让遮罩占满菜单一下,直到屏幕底部的高度
// this.$u.sys()为uView封装的获取设备信息的方法
let windowHeight = this.$u.sys().windowHeight;
this.$uGetRect('.u-dropdown__menu').then(res => {
// 这里获取的是dropdown的尺寸在H5上uniapp获取尺寸是有bug的(以前提出修复过后来又出现了此bug目前hx2.8.11版本)
// H5端bug表现为元素尺寸的top值为导航栏底部到到元素的上边沿的距离但是元素的bottom值确是导航栏顶部到元素底部的距离
// 二者是互相矛盾的本质原因是H5端导航栏非原生uni的开发者大意造成
// 这里取菜单栏的botton值合理的不能用res.top否则页面会造成滚动
this.contentHeight = windowHeight - res.bottom;
})
}
}
}
</script>
<style scoped lang="scss">
// 定义混入指令用于在非nvue环境下的flex定义因为nvue没有display属性会报错
@mixin vue-flex($direction: row) {
/* #ifndef APP-NVUE */
display: flex;
flex-direction: $direction;
/* #endif */
}
.u-dropdown {
flex: 1;
width: 100%;
position: relative;
&__menu {
@include vue-flex;
position: relative;
z-index: 11;
height: 80rpx;
&__item {
flex: 1;
@include vue-flex;
justify-content: center;
align-items: center;
&__text {
font-size: 28rpx;
color: $u-content-color;
}
&__arrow {
margin-left: 6rpx;
transition: transform .3s;
align-items: center;
@include vue-flex;
&--rotate {
transform: rotate(180deg);
}
}
}
}
&__content {
position: absolute;
z-index: 8;
width: 100%;
left: 0px;
bottom: 0;
overflow: hidden;
&__mask {
position: absolute;
z-index: 9;
background: rgba(0, 0, 0, .3);
width: 100%;
left: 0;
top: 0;
bottom: 0;
}
&__popup {
position: relative;
z-index: 10;
transition: all 0.3s;
transform: translate3D(0, -100%, 0);
overflow: hidden;
}
}
}
</style>

View File

@@ -0,0 +1,459 @@
<template>
<view
class="u-input"
:class="{
'u-input--border': border,
'u-input--error': validateState
}"
:style="{
padding: `0 ${border ? 20 : 34}rpx`,
borderColor: borderColor,
textAlign: inputAlign,
borderRadius:borderRadius
}"
@tap.stop="inputClick"
>
<view
class="u-input__prefix-icon"
v-if="prefixIcon || $slots.prefix"
>
<slot name="prefix">
<u-icon
:name="prefixIcon"
:size="prefixIconSize"
:customStyle="prefixIconStyle"
:color="prefixIconColor"
></u-icon>
</slot>
</view>
<textarea
v-if="type == 'textarea'"
class="u-input__input u-input__textarea"
:style="[getStyle]"
:value="defaultValue"
:placeholder="placeholder"
:placeholderStyle="placeholderStyle"
:disabled="disabled"
:maxlength="inputMaxlength"
:fixed="fixed"
:focus="focus"
:autoHeight="autoHeight"
:selection-end="uSelectionEnd"
:selection-start="uSelectionStart"
:cursor-spacing="getCursorSpacing"
:show-confirm-bar="showConfirmbar"
@input="handleInput"
@blur="handleBlur"
@focus="onFocus"
@confirm="onConfirm"
/>
<input
v-else
class="u-input__input"
:type="type == 'password' ? 'text' : type"
:style="[getStyle]"
:value="defaultValue"
:password="type == 'password' && !showPassword"
:placeholder="placeholder"
:placeholderStyle="placeholderStyle"
:disabled="disabled || type === 'select'"
:maxlength="inputMaxlength"
:focus="focus"
:confirmType="confirmType"
:cursor-spacing="getCursorSpacing"
:selection-end="uSelectionEnd"
:selection-start="uSelectionStart"
:show-confirm-bar="showConfirmbar"
@focus="onFocus"
@blur="handleBlur"
@input="handleInput"
@confirm="onConfirm"
/>
<view class="u-input__right-icon u-flex">
<view class="u-input__right-icon__clear u-input__right-icon__item" @tap="onClear" v-if="clearable && value != '' && focused">
<u-icon size="32" name="close-circle-fill" color="#c0c4cc"/>
</view>
<view class="u-input__right-icon__clear u-input__right-icon__item" v-if="passwordIcon && type == 'password'">
<u-icon size="32" :name="!showPassword ? 'eye' : 'eye-fill'" color="#c0c4cc" @click="showPassword = !showPassword"/>
</view>
<view class="u-input__right-icon--select u-input__right-icon__item" v-if="type == 'select'" :class="{
'u-input__right-icon--select--reverse': selectOpen
}">
<u-icon name="arrow-down-fill" size="26" color="#c0c4cc"></u-icon>
</view>
</view>
</view>
</template>
<script>
/**
* input 输入框
* @description 此组件为一个输入框默认没有边框和样式是专门为配合表单组件u-form而设计的利用它可以快速实现表单验证输入内容下拉选择等功能。
* @tutorial http://uviewui.com/components/input.html
* @property {String} type 模式选择,见官网说明
* @property {Boolean} clearable 是否显示右侧的清除图标(默认true)
* @property {} v-model 用于双向绑定输入框的值
* @property {String} input-align 输入框文字的对齐方式(默认left)
* @property {String} placeholder placeholder显示值(默认 '请输入内容')
* @property {Boolean} disabled 是否禁用输入框(默认false)
* @property {String Number} maxlength 输入框的最大可输入长度(默认140)
* @property {String Number} selection-start 光标起始位置自动聚焦时有效需与selection-end搭配使用默认-1
* @property {String Number} maxlength 光标结束位置自动聚焦时有效需与selection-start搭配使用默认-1
* @property {String Number} cursor-spacing 指定光标与键盘的距离单位px(默认0)
* @property {String} placeholderStyle placeholder的样式字符串形式如"color: red;"(默认 "color: #c0c4cc;")
* @property {String} confirm-type 设置键盘右下角按钮的文字仅在type为text时生效(默认done)
* @property {Object} custom-style 自定义输入框的样式,对象形式
* @property {Boolean} focus 是否自动获得焦点(默认false)
* @property {Boolean} fixed 如果type为textarea且在一个"position:fixed"的区域需要指明为true(默认false)
* @property {Boolean} password-icon type为password时是否显示右侧的密码查看图标(默认true)
* @property {Boolean} border 是否显示边框(默认false)
* @property {String} border-color 输入框的边框颜色(默认#dcdfe6)
* @property {Boolean} auto-height 是否自动增高输入区域type为textarea时有效(默认true)
* @property {String Number} height 高度单位rpx(text类型时为70textarea时为100)
* @example <u-input v-model="value" :type="type" :border="border" />
*/
export default {
name: 'u-input',
props: {
value: {
type: [String, Number],
default: ''
},
// 输入框的类型textareatextnumber
type: {
type: String,
default: 'text'
},
inputAlign: {
type: String,
default: 'left'
},
placeholder: {
type: String,
default: '请输入内容'
},
disabled: {
type: Boolean,
default: false
},
maxlength: {
type: [Number, String],
default: 140
},
placeholderStyle: {
type: String,
default: 'color: #c0c4cc;'
},
confirmType: {
type: String,
default: 'done'
},
// 输入框的自定义样式
customStyle: {
type: Object,
default() {
return {};
}
},
// 图标的自定义样式
prefixIconStyle: {
type: Object,
default() {
return {};
}
},
// 如果 textarea 是在一个 position:fixed 的区域,需要显示指定属性 fixed 为 true
fixed: {
type: Boolean,
default: false
},
// 是否自动获得焦点
focus: {
type: Boolean,
default: false
},
// 密码类型时,是否显示右侧的密码图标
passwordIcon: {
type: Boolean,
default: true
},
// input|textarea是否显示边框
border: {
type: Boolean,
default: false
},
// 输入框的边框颜色
borderColor: {
type: String,
default: '#dcdfe6'
},
autoHeight: {
type: Boolean,
default: true
},
// type=select时旋转右侧的图标标识当前处于打开还是关闭select的状态
// open-打开close-关闭
selectOpen: {
type: Boolean,
default: false
},
// 高度单位rpx
height: {
type: [Number, String],
default: ''
},
// 是否可清空
clearable: {
type: Boolean,
default: true
},
// 指定光标与键盘的距离,单位 px
cursorSpacing: {
type: [Number, String],
default: 0
},
// 光标起始位置自动聚焦时有效需与selection-end搭配使用
selectionStart: {
type: [Number, String],
default: -1
},
// 光标结束位置自动聚焦时有效需与selection-start搭配使用
selectionEnd: {
type: [Number, String],
default: -1
},
// 是否自动去除两端的空格
trim: {
type: Boolean,
default: true
},
// 是否显示键盘上方带有”完成“按钮那一栏
showConfirmbar:{
type:Boolean,
default:true
},
// 左边图标名称
prefixIcon:{
type:String,
default:''
},
// 左边图标大小
prefixIconSize:{
type:[String,Number],
default:'30rpx'
},
// 左边图标颜色
prefixIconColor:{
type:String,
default:''
},
// 边框圆角
borderRadius:{
type:String,
default:'6rpx'
},
},
data() {
return {
defaultValue: this.value,
inputHeight: 70, // input的高度
textareaHeight: 100, // textarea的高度
validateState: false, // 当前input的验证状态用于错误时边框是否改为红色
focused: false, // 当前是否处于获得焦点的状态
showPassword: false, // 是否预览密码
lastValue: '', // 用于头条小程序,判断@input中前后的值是否发生了变化因为头条中文下按下键没有输入内容也会触发@input时间
};
},
watch: {
value(nVal, oVal) {
this.defaultValue = nVal;
// 当值发生变化且为select类型时(此时input被设置为disabled不会触发@input事件),模拟触发@input事件
if(nVal != oVal && this.type == 'select') this.handleInput({
detail: {
value: nVal
}
})
},
},
computed: {
// 因为uniapp的input组件的maxlength组件必须要数值这里转为数值给用户可以传入字符串数值
inputMaxlength() {
return Number(this.maxlength);
},
getStyle() {
let style = {};
// 如果没有自定义高度就根据type为input还是textare来分配一个默认的高度
style.minHeight = this.height ? this.height + 'rpx' : this.type == 'textarea' ?
this.textareaHeight + 'rpx' : this.inputHeight + 'rpx';
style = Object.assign(style, this.customStyle);
return style;
},
//
getCursorSpacing() {
return Number(this.cursorSpacing);
},
// 光标起始位置
uSelectionStart() {
return String(this.selectionStart);
},
// 光标结束位置
uSelectionEnd() {
return String(this.selectionEnd);
}
},
created() {
// 监听u-form-item发出的错误事件将输入框边框变红色
this.$on('on-form-item-error', this.onFormItemError);
},
methods: {
/**
* 派发 (向上查找) (一个)
* @param componentName // 需要找的组件的名称
* @param eventName // 事件名称
* @param params // 需要传递的参数
*/
dispatch(componentName, eventName, params) {
let parent = this.$parent || this.$root;//$parent 找到最近的父节点 $root 根节点
let name = parent.$options.name; // 获取当前组件实例的name
// 如果当前有节点 && 当前没名称 且 当前名称等于需要传进来的名称的时候就去查找当前的节点
// 循环出当前名称的一样的组件实例
while (parent && (!name||name!==componentName)) {
parent = parent.$parent;
if (parent) {
name = parent.$options.name;
}
}
// 有节点表示当前找到了name一样的实例
if (parent) {
parent.$emit.apply(parent,[eventName].concat(params))
}
},
/**
* change 事件
* @param event
*/
handleInput(event) {
let value = event.detail.value;
// 判断是否去除空格
if(this.trim) value = this.$u.trim(value);
// vue 原生的方法 return 出去
this.$emit('input', value);
// 当前model 赋值
this.defaultValue = value;
// 过一个生命周期再发送事件给u-form-item否则this.$emit('input')更新了父组件的值,但是微信小程序上
// 尚未更新到u-form-item导致获取的值为空从而校验混论
// 这里不能延时时间太短或者使用this.$nextTick否则在头条上会造成混乱
setTimeout(() => {
// 头条小程序由于自身bug导致中文下每按下一个键(尚未完成输入),都会触发一次@input导致错误这里进行判断处理
// #ifdef MP-TOUTIAO
if(this.$u.trim(value) == this.lastValue) return ;
this.lastValue = value;
// #endif
// 将当前的值发送到 u-form-item 进行校验
this.dispatch('u-form-item', 'on-form-change', value);
}, 40)
},
/**
* blur 事件
* @param event
*/
handleBlur(event) {
// 最开始使用的是监听图标@touchstart事件自从hx2.8.4后,此方法在微信小程序出错
// 这里改为监听点击事件,手点击清除图标时,同时也发生了@blur事件导致图标消失而无法点击这里做一个延时
setTimeout(() => {
this.focused = false;
}, 100)
// vue 原生的方法 return 出去
this.$emit('blur', event.detail.value);
setTimeout(() => {
// 头条小程序由于自身bug导致中文下每按下一个键(尚未完成输入),都会触发一次@input导致错误这里进行判断处理
// #ifdef MP-TOUTIAO
if(this.$u.trim(value) == this.lastValue) return ;
this.lastValue = value;
// #endif
// 将当前的值发送到 u-form-item 进行校验
this.dispatch('u-form-item', 'on-form-blur', event.detail.value);
}, 40)
},
onFormItemError(status) {
this.validateState = status;
},
onFocus(event) {
this.focused = true;
this.$emit('focus');
},
onConfirm(e) {
this.$emit('confirm', e.detail.value);
},
onClear(event) {
this.$emit('input', '');
},
inputClick() {
this.$emit('click');
}
}
};
</script>
<style lang="scss" scoped>
@mixin vue-flex($direction: row) {
/* #ifndef APP-NVUE */
display: flex;
flex-direction: $direction;
/* #endif */
}
.u-input {
position: relative;
flex: 1;
background-color: #f9fafb;
@include vue-flex;
&__prefix-icon{
display: flex;
justify-content: center;
align-items: center;
margin-right: 20rpx;
}
&__input {
//height: $u-form-item-height;
font-size: 28rpx;
color: $u-main-color;
flex: 1;
}
&__textarea {
width: auto;
font-size: 28rpx;
color: $u-main-color;
padding: 10rpx 0;
line-height: normal;
flex: 1;
}
&--border {
border-radius: 6rpx;
border-radius: 4px;
border: 1px solid $u-form-item-border-color;
}
&--error {
border-color: $u-type-error!important;
}
&__right-icon {
&__item {
margin-left: 10rpx;
}
&--select {
transition: transform .4s;
&--reverse {
transform: rotate(-180deg);
}
}
}
}
</style>

View File

@@ -0,0 +1,277 @@
<template>
<view class="u-radio" :style="[radioStyle]">
<view class="u-radio__icon-wrap" @tap="toggle" :class="[iconClass]" :style="[iconStyle]">
<u-icon class="u-radio__icon-wrap__icon" name="checkbox-mark" :size="elIconSize" :color="iconColor" />
</view>
<view class="u-radio__label" @tap="onClickLabel" :style="{
fontSize: $u.addUnit(labelSize)
}">
<slot />
</view>
</view>
</template>
<script>
/**
* radio 单选框
* @description 单选框用于有一个选择用户只能选择其中一个的场景。搭配u-radio-group使用
* @tutorial https://www.uviewui.com/components/radio.html
* @property {String Number} icon-size 图标大小单位rpx默认24
* @property {String Number} label-size label字体大小单位rpx默认28
* @property {String Number} name radio组件的标示符
* @property {String} shape 形状见上方说明默认circle
* @property {Boolean} disabled 是否禁用默认false
* @property {Boolean} label-disabled 点击文本是否可以操作radio默认true
* @property {String} active-color 选中时的颜色如设置parent的active-color将失效
* @event {Function} change 某个radio状态发生变化时触发(选中状态)
* @example <u-radio :label-disabled="false">门掩黄昏,无计留春住</u-radio>
*/
export default {
name: "d-radio",
props: {
// radio的名称
name: {
type: [String, Number],
default: ''
},
// 形状square为方形circle为原型
shape: {
type: String,
default: ''
},
// 是否禁用
disabled: {
type: [String, Boolean],
default: ''
},
// 是否禁止点击提示语选中复选框
labelDisabled: {
type: [String, Boolean],
default: ''
},
// 选中状态下的颜色如设置此值将会覆盖parent的activeColor值
activeColor: {
type: String,
default: ''
},
// 图标的大小单位rpx
iconSize: {
type: [String, Number],
default: ''
},
// label的字体大小rpx单位
labelSize: {
type: [String, Number],
default: ''
},
},
data() {
return {
// 父组件的默认值因为头条小程序不支持在computed中使用this.parent.shape的形式
// 故只能使用如此方法
parentData: {
iconSize: null,
labelDisabled: null,
disabled: null,
shape: null,
activeColor: null,
size: null,
width: null,
height: null,
value: null,
wrap: null
}
};
},
created() {
this.parent = false;
// 支付宝小程序不支持provide/inject所以使用这个方法获取整个父组件在created定义避免循环引用
this.updateParentData();
this.parent.children.push(this);
},
computed: {
// 是否禁用如果父组件u-raios-group禁用的话将会忽略子组件的配置
elDisabled() {
return this.disabled !== '' ? this.disabled : this.parentData.disabled !== null ? this.parentData
.disabled : false;
},
// 是否禁用label点击
elLabelDisabled() {
return this.labelDisabled !== '' ? this.labelDisabled : this.parentData.labelDisabled !== null ? this
.parentData.labelDisabled : false;
},
// 组件尺寸对应size的值默认值为34rpx
elSize() {
return this.size ? this.size : (this.parentData.size ? this.parentData.size : 34);
},
// 组件的勾选图标的尺寸默认20
elIconSize() {
return this.iconSize ? this.iconSize : (this.parentData.iconSize ? this.parentData.iconSize : 20);
},
// 组件选中激活时的颜色
elActiveColor() {
return this.activeColor ? this.activeColor : (this.parentData.activeColor ? this.parentData.activeColor :
'primary');
},
// 组件的形状
elShape() {
return this.shape ? this.shape : (this.parentData.shape ? this.parentData.shape : 'circle');
},
// 设置radio的状态要求radio的name等于parent的value时才为选中状态
iconStyle() {
let style = {};
if (this.elActiveColor && this.parentData.value == this.name && !this.elDisabled) {
style.borderColor = this.elActiveColor;
style.backgroundColor = this.elActiveColor;
}
style.width = this.$u.addUnit(this.elSize);
style.height = this.$u.addUnit(this.elSize);
return style;
},
iconColor() {
return this.name == this.parentData.value ? '#ffffff' : 'transparent';
},
iconClass() {
let classes = [];
classes.push('u-radio__icon-wrap--' + this.elShape);
if (this.name == this.parentData.value) classes.push('u-radio__icon-wrap--checked');
if (this.elDisabled) classes.push('u-radio__icon-wrap--disabled');
if (this.name == this.parentData.value && this.elDisabled) classes.push(
'u-radio__icon-wrap--disabled--checked');
// 支付宝小程序无法动态绑定一个数组类名,否则解析出来的结果会带有",",而导致失效
return classes.join(' ');
},
radioStyle() {
let style = {};
if (this.parentData.width) {
style.width = this.$u.addUnit(this.parentData.width);
// #ifdef MP
// 各家小程序因为它们特殊的编译结构使用float布局
style.float = 'left';
// #endif
// #ifndef MP
// H5和APP使用flex布局
style.flex = `0 0 ${this.$u.addUnit(this.parentData.width)}`;
// #endif
}
if (this.parentData.wrap) {
style.width = '100%';
// #ifndef MP
// H5和APP使用flex布局将宽度设置100%,即可自动换行
style.flex = '0 0 100%';
// #endif
}
return style;
}
},
methods: {
updateParentData() {
this.getParentData('u-radio-group');
},
onClickLabel() {
if (!this.elLabelDisabled && !this.elDisabled) {
this.setRadioCheckedStatus();
}
},
toggle() {
if (!this.elDisabled) {
this.setRadioCheckedStatus();
}
},
emitEvent() {
// u-radio的name不等于父组件的v-model的值时(意味着未选中),才发出事件,避免多次点击触发事件
if (this.parentData.value != this.name) this.$emit('change', this.name);
},
// 改变组件选中状态
// 这里的改变的依据是更改本组件的parentData.value值为本组件的name值同时通过父组件遍历所有u-radio实例
// 将本组件外的其他u-radio的parentData.value都设置为空(由computed计算后都被取消选中状态),因而只剩下一个为选中状态
setRadioCheckedStatus() {
this.emitEvent();
if (this.parent) {
this.parent.setValue(this.name);
this.parentData.value = this.name;
}
}
}
};
</script>
<style lang="scss" scoped>
// 定义混入指令用于在非nvue环境下的flex定义因为nvue没有display属性会报错
@mixin vue-flex($direction: row) {
/* #ifndef APP-NVUE */
display: flex;
flex-direction: $direction;
/* #endif */
}
.u-radio {
/* #ifndef APP-NVUE */
display: inline-flex;
/* #endif */
align-items: center;
overflow: hidden;
user-select: none;
line-height: 1.8;
&__icon-wrap {
color: $u-content-color;
@include vue-flex;
flex: none;
align-items: center;
justify-content: center;
box-sizing: border-box;
width: 42rpx;
height: 42rpx;
color: transparent;
text-align: center;
transition-property: color, border-color, background-color;
font-size: 20px;
border: 1px solid #c8c9cc;
transition-duration: 0.2s;
/* #ifdef MP-TOUTIAO */
// 头条小程序兼容性问题需要设置行高为0否则图标偏下
&__icon {
line-height: 0;
}
/* #endif */
&--circle {
border-radius: 100%;
}
&--square {
border-radius: 3px;
}
&--checked {
color: #fff;
background-color: #2979ff;
border-color: #2979ff;
}
&--disabled {
background-color: #ebedf0;
border-color: #c8c9cc;
}
&--disabled--checked {
color: #c8c9cc !important;
}
}
&__label {
word-wrap: break-word;
margin-left: 10rpx;
margin-right: 24rpx;
color: $u-content-color;
font-size: 30rpx;
&--disabled {
color: #c8c9cc;
}
}
}
</style>

20
index.html Normal file
View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>

49
main.js Normal file
View File

@@ -0,0 +1,49 @@
import App from './App'
import store from './store';
// #ifndef VUE3
import Vue from 'vue'
// main.js
import uView from "uview-ui";
import share from '@/common/share.js'
Vue.mixin(share)
Vue.use(uView);
//防抖函数
import common from './common/common.js'
Vue.prototype.$noMultipleClicks = common.noMultipleClicks;
//时间戳的处理
Vue.filter("formatDate", function(value) {
var date = new Date(value * 1000); //时间戳为10位需*1000时间戳为13位的话不需乘1000
var year = date.getFullYear();
var month = ("0" + (date.getMonth() + 1)).slice(-2);
var sdate = ("0" + date.getDate()).slice(-2);
var hour = ("0" + date.getHours()).slice(-2);
var minute = ("0" + date.getMinutes()).slice(-2);
var second = ("0" + date.getSeconds()).slice(-2);
// 拼接
var time = year + "-" + month + "-" + sdate + ' ' + hour + ':' + minute + ':' + second
return time;
})
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
store,
...App
})
app.$mount()
// #endif
// #ifdef VUE3
import {
createSSRApp
} from 'vue'
export function createApp() {
const app = createSSRApp(App)
return {
app
}
}
// #endif

95
manifest.json Normal file
View File

@@ -0,0 +1,95 @@
{
"name" : "xiaokang-cline",
"appid" : "__UNI__0F46058",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
/* 5+App */
"app-plus" : {
/* */
"safearea" : {
"bottom" : {
"offset" : "auto"
}
},
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {
"OAuth" : {}
},
/* */
"distribute" : {
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios */
"ios" : {},
/* SDK */
"sdkConfigs" : {
"oauth" : {
"weixin" : {
"appid" : "wx1827f5e740008b16",
"UniversalLinks" : ""
}
}
}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "wx1eb90a487ca945d2",
"setting" : {
"urlCheck" : false,
"es6" : true,
"postcss" : true,
"minified" : true
},
"usingComponents" : true,
/**/
"optimization" : {
"subPackages" : true
},
"permission" : {}
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "2"
}

11
package-lock.json generated Normal file
View File

@@ -0,0 +1,11 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"uview-ui": {
"version": "1.8.8",
"resolved": "https://registry.npmmirror.com/uview-ui/-/uview-ui-1.8.8.tgz",
"integrity": "sha512-Osal3yzXiHor0In9OPTZuXTaqTbDglMZ9RGK/MPYDoQQs+y0hrBCUD0Xp5T70C8i2lLu2X6Z11zJhmsQWMR7Jg=="
}
}
}

5
package.json Normal file
View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"uview-ui": "^1.8.8"
}
}

466
pages.json Normal file
View File

@@ -0,0 +1,466 @@
{
"easycom": {
// 下载安装方式
// "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
// npm安装方式
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
},
"pages": [ //pages数组中第一项表示应用启动页参考https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/home/home",
"style": {
// "navigationBarTitleText": "custom"
"navigationStyle": "default",
"navigationBarBackgroundColor": "#298DFF",
"navigationBarTextStyle": "white"
}
}, {
"path": "pages/home/index",
"style": {
"navigationBarTitleText": "萧康互联网医院",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#298DFF",
"navigationBarTextStyle": "white"
},
"needLogin": false
},
{
"path": "pages/home/index-list",
"style": {
"navigationBarTitleText": "萧康互联网医院"
}
},
{
"path": "pages/home/home-banner",
"style": {
"navigationBarTitleText": "萧康互联网医院"
}
},
{
"path": "pages/login/login",
"style": {
"navigationBarTitleText": "授权登录",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#EAF2FF"
}
}, {
"path": "pages/cate/cate",
"style": {
"navigationBarTitleText": "商城"
}
// "needLogin": true
},
{
"path": "pages/cate/index",
"style": {
"navigationBarTitleText": "健康资讯"
}
// "needLogin": true
},
{
"path": "pages/cate/info-detail",
"style": {
"navigationBarTitleText": "文章详情"
}
// "needLogin": true
},
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "消息"
}
// "needLogin": true
},
{
"path": "pages/index/system",
"style": {
"navigationBarTitleText": "系统消息"
}
// "needLogin": true
},
{
"path": "pages/index/order-info",
"style": {
"navigationBarTitleText": "产品订单"
}
},
{
"path": "pages/index/doctor-info",
"style": {
"navigationBarTitleText": "医生消息"
}
},
{
"path": "pages/mine/mine",
"style": {
"navigationBarTitleText": "我的",
"navigationBarBackgroundColor": "#4175EE",
"navigationBarTextStyle": "white"
}
// "needLogin": true
},
{
"path": "pages/login/logon",
"style": {
"navigationBarTitleText": "注册",
"enablePullDownRefresh": false
}
},
{
"path": "pages/Inquiries/Inquiries",
"style": {
"navigationBarTitleText": "医生列表",
"enablePullDownRefresh": false
}
// "needLogin": true
}
],
"subPackages": [{
"root": "subPackages",
"pages": [{
"path": "doctor/doctor-detail",
"style": {
"navigationBarTitleText": "医生详情",
"enablePullDownRefresh": false
}
},
{
"path": "doctor/doctor-info",
"style": {
"navigationBarTitleText": "医生简介",
"enablePullDownRefresh": false
}
},
{
"path": "doctor/doctor-evaluation",
"style": {
"navigationBarTitleText": "患者评价",
"enablePullDownRefresh": false
}
},
{
"path": "doctor/doctor-picture",
"style": {
"navigationBarTitleText": "图文问诊",
"enablePullDownRefresh": false
}
},
{
"path": "doctor/appraise",
"style": {
"navigationBarTitleText": "评价",
"enablePullDownRefresh": false
}
},
{
"path": "doctor/doctor-userinfo",
"style": {
"navigationBarTitleText": "选择就诊人",
"enablePullDownRefresh": false
}
},
{
"path": "doctor/doctor_newsinfo",
"style": {
"navigationBarTitleText": "医生消息",
"enablePullDownRefresh": false
}
}
]
}, {
"root": "subPackages",
"pages": [{
"path": "my/myinfo-add",
"style": {
"navigationBarTitleText": "添加就诊人",
"enablePullDownRefresh": false
}
},
{
"path": "my/myrecord-detail",
"style": {
"navigationBarTitleText": "处方详情",
"enablePullDownRefresh": false
}
},
{
"path": "my/record-pay",
"style": {
"navigationBarTitleText": "预约购药",
"enablePullDownRefresh": false
}
},
{
"path": "my/unpaid-order",
"style": {
"navigationBarTitleText": "订单详情",
"enablePullDownRefresh": false
}
}, {
"path": "my/myreport",
"style": {
"navigationBarTitleText": "检查报告",
"enablePullDownRefresh": false
}
},
{
"path": "my/myinfo",
"style": {
"navigationBarTitleText": "就诊人管理",
"enablePullDownRefresh": false
}
},
{
"path": "my/my_online",
"style": {
"navigationBarTitleText": "线上复诊",
"enablePullDownRefresh": false
}
}, {
"path": "my/mystore",
"style": {
"navigationStyle": "default",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#1777FF",
"navigationBarTextStyle": "white"
}
}, {
"path": "my/mycollection",
"style": {
"navigationBarTitleText": "个人资料",
"enablePullDownRefresh": false
}
},
{
"path": "my/myabout",
"style": {
"navigationBarTitleText": "关于",
"enablePullDownRefresh": false
}
},
{
"path": "my/myorder",
"style": {
"navigationBarTitleText": "问诊记录",
"enablePullDownRefresh": false
}
},
{
"path": "my/myrecord",
"style": {
"navigationBarTitleText": "处方记录",
"enablePullDownRefresh": true
}
}, {
"path": "my/myappiont",
"style": {
"navigationBarTitleText": "挂号记录",
"enablePullDownRefresh": true
}
},
{
"path": "my/myinfo-edit",
"style": {
"navigationBarTitleText": "编辑信息",
"enablePullDownRefresh": false
}
},
{
"path": "my/my-drug/drug-list",
"style": {
"navigationBarTitleText": "产品订单",
"enablePullDownRefresh": true,
"onReachBottomDistance": 50
}
},
{
"path": "my/my-drug/drug-info",
"style": {
"navigationBarTitleText": "订单详情",
"enablePullDownRefresh": false
}
},
{
"path": "my/my-drug/to-next",
"style": {
"navigationBarTitleText": "订单详情",
"enablePullDownRefresh": false
}
}
]
}, {
"root": "subPackages",
"pages": [{
"path": "register/register",
"style": {
"navigationBarTitleText": "确认挂号信息"
}
}, {
"path": "register/register-success",
"style": {
"navigationBarTitleText": "确认挂号信息"
}
}, {
"path": "register/register-info",
"style": {
"navigationBarTitleText": "挂号详情",
"navigationStyle": "custom"
}
}]
}, {
"root": "subPackages",
"pages": [{
"path": "shop/orders",
"style": {
"navigationBarTitleText": "商城订单",
"enablePullDownRefresh": true
}
}, {
"path": "shop/search-home",
"style": {
"navigationBarTitleText": "萧康诊所门店"
}
},
{
"path": "shop/search-list",
"style": {
"navigationBarTitleText": "萧康诊所门店"
}
},
{
"path": "shop/orders-detail",
"style": {
"navigationBarTitleText": "商品详情"
}
},
{
"path": "shop/shop-cate",
"style": {
"navigationBarTitleText": "购物车"
}
},
{
"path": "shop/shop-pay",
"style": {
"navigationBarTitleText": "订单详情"
}
},
{
"path": "shop/paied",
"style": {
"navigationBarTitleText": "确认付款信息"
}
},
{
"path": "shop/paied-detail",
"style": {
"navigationBarTitleText": "订单详情"
}
},
{
"path": "shop/written",
"style": {
"navigationBarTitleText": "买家留言"
}
},
{
"path": "shop/after-sales",
"style": {
"navigationBarTitleText": "申请售后"
}
},
{
"path": "shop/logistics",
"style": {
"navigationBarTitleText": "物流详情"
}
}
]
},
{
"root": "subPackages",
"pages": [{
"path": "setup/filed",
"style": {
"navigationBarTitleText": "设置"
}
},
{
"path": "setup/choose-area",
"style": {
"navigationBarTitleText": "管理地址"
}
},
{
"path": "setup/area-list",
"style": {
"navigationBarTitleText": "地址管理"
}
},
{
"path": "setup/fw-serve",
"style": {
"navigationBarTitleText": "服务协议"
}
},
{
"path": "setup/ys-serve",
"style": {
"navigationBarTitleText": "隐私政策"
}
},
{
"path": "setup/zz-serve",
"style": {
"navigationBarTitleText": "资质证照"
}
},
{
"path": "setup/customer-service",
"style": {
"navigationBarTitleText": "客服中心"
}
}
]
}
],
"tabBar": {
"fontSize": "18px",
"height": "60px",
"spacing": "4px",
"backgroundColor": "#fff",
"selectedColor": "#1575FC",
"list": [{
"pagePath": "pages/home/home",
"text": "首页",
"iconPath": "static/home/02.png",
"selectedIconPath": "static/home/01.png"
},
{
"pagePath": "pages/cate/index",
"text": "资讯",
"iconPath": "static/home/03.png",
"selectedIconPath": "static/home/04.png"
},
{
"pagePath": "pages/index/index",
"text": "消息",
"iconPath": "static/home/05.png",
"selectedIconPath": "static/home/06.png"
},
{
"pagePath": "pages/mine/mine",
"text": "我的",
"iconPath": "static/home/07.png",
"selectedIconPath": "static/home/08.png"
}
]
},
"globalStyle": {
"navigationBarTextStyle": "black",
// "navigationBarTitleText": "萧康互联网医院",
"navigationBarBackgroundColor": "#F8FAFC",
"backgroundColor": "#F8F8F8"
},
"uniIdRouter": {}
}

View File

@@ -0,0 +1,651 @@
<template>
<view class="container safe-area-inset-bottom">
<!-- 搜索医生 -->
<view class="search">
<u-search placeholder="请输入关键字" bg-color="#F5f5f5" color="#999" border-color="#F5f5f5" :show-action="false"
maxlength="21" height="66" :clearabled="true" shape="round" v-model="keyword" @blur="toSearch"
@search="toSearch">
</u-search>
</view>
<!-- 下拉菜单 -->
<view class="drop_down">
<d-dropdown ref="uDropdown" :close-on-click-mask="dropdownMask" transfer @open="open" @close="close"
menu-icon="arrow-down-fill" menu-icon-size="15rpx">
<u-dropdown-item :title="titles"></u-dropdown-item>
<u-dropdown-item v-model="value1" title="排序" :options="options2" @change="change"></u-dropdown-item>
<u-dropdown-item title="筛选">
<view class="slot-content">
<view class="u-text-center u-content-color u-m-t-20 u-m-b-20">
<view class="content_title">
医生职称
</view>
<view class="content_btn">
<text :class="text_choose==1?'text_choose':''" @click="chooseTexts(1)">主任医师</text>
<text :class="text_choose==2?'text_choose':''" @click="chooseTexts(2)">副主任医师</text>
<text :class="text_choose==3?'text_choose':''" @click="chooseTexts(3)">主治医师</text>
</view>
</view>
<view class="bottom_btn">
<view class="bottom_btn_first">
<!-- <u-button :hair-line='false' :plain="true">重置</u-button> -->
<text @click="chooseNone">重置</text>
</view>
<u-button type="primary" @click="closeDropdown" class="bottom_btn_last">确定</u-button>
</view>
</view>
</u-dropdown-item>
</d-dropdown>
</view>
<!-- 选择坐诊医生 -->
<view class="doctor_list">选择坐诊医生</view>
<!-- 列表 -->
<view class="list" v-for="(item,index) in doctorList" :key="item.id" @click="goLookDoctor(item.id)">
<!-- 图片部分 -->
<view class="list_info">
<view class="list_left">
<image :src="item.avatar || '/static/mine/avatar_1.png'" mode="医生头像"></image>
<!-- 医生 -->
<view class="list_title">
<view class="titles_name">
<text class="doctor_name">{{item.name}}</text>
<text class="doctors">{{item.title}}</text>
</view>
<!-- 职称 -->
<view class="list_yard">
{{item.store}} &nbsp; {{item.depart}}
</view>
</view>
</view>
<view class="list_right">挂号</view>
</view>
<!-- 文字部分 -->
<view class="card">
<!-- 擅长 -->
<view class="list_going">
擅长{{item.good_at}}
</view>
<!-- 接诊率 -->
<view class="list_nums">
<view class="txt">问诊量 <text>{{item.inquiry_num }}</text></view>
<view class="txt">接诊率 <text>{{item.accept_percent}}</text></view>
<!-- <view class="txt">综合评分 <text>{{item.overall_score}}</text></view> -->
</view>
</view>
</view>
<!-- 浮层 -->
<view class="floor" v-if="show">
<u-popup v-model="show" mode="bottom" :mask="false">
<view class="contents">
<view class="confrim-btn">
<text class="left"></text>
<view class="right">
<text class="title">选择科室</text>
<text class="btn" @click="onclosed">取消</text>
</view>
</view>
<!-- 左右 -->
<view class="contents_scroll">
<scroll-view scroll-y="true" @touchmove.stop>
<view class="contents_scroll_left">
<view class="box" :class="{active:actived==index}" @click="changeStyle(index)"
v-for="(item,index) in officeList" :key="item.id">
{{item.name}}
</view>
</view>
</scroll-view>
<view class="contents_scroll_right">
<view v-for="(item,index) in officeList" :key="item.id">
<scroll-view scroll-y="true" @touchmove.stop v-if="index==actived">
<view class="lists" v-for="(item1,index) in item.child" :key="item1.id"
@click="getDepart(item1.id,item1.name)">
{{item1.name}}
<text class="iconfont icon-jiantou1"></text>
</view>
</scroll-view>
</view>
</view>
</view>
</view>
</u-popup>
</view>
<u-toast ref="uToast" />
</view>
</template>
<script>
import {
doctorList,
getOfficeList
} from '../../request/api/api.js'
import {
dDropdown
} from '@/components/d-dropdown/d-dropdown'
export default {
components: {
dDropdown
},
data() {
return {
dropdownMask: true,
show: false,
keyword: "",
value1: 1,
value2: 2,
options2: [{
label: '综合排序',
value: 1,
},
{
label: '问诊量',
value: 2,
},
{
label: '患者评价',
value: 3,
}
],
actived: 0, // 样式
doctorList: [], // 医生列表
text_choosed: "",
text_choose: "",
doctorID: "", // 医生id
officeList: {}, // 科室
depart_id: "", // 科室id
sort: "", // 排序
titles: "科室",
type: "",
}
},
onLoad(e) {
this.type = e.type
// console.log(e, 'idd');
},
methods: {
closeDropdown() {
this.$refs.uDropdown.close();
this.getList()
},
open(index) {
// 展开某个下来菜单时,先关闭原来的其他菜单的高亮
// 同时内部会自动给当前展开项进行高亮
// this.$refs.uDropdown.highlight();
if (index == 0) {
this.show = true
}
},
close(index) {
// 关闭的时候,给当前项加上高亮
// 当然您也可以通过监听dropdown-item的@change事件进行处理
this.$refs.uDropdown.highlight(index);
},
onclosed() {
// console.log(1);
this.show = false
this.$refs.uDropdown.close();
this.depart_id = 0
},
/*切换需要*/
changeStyle(index) {
this.actived = index
},
// 排序
change(e) {
// console.log(e,'options2');
this.sort = e
this.getList()
},
// 筛选
chooseNone() {
this.text_choose = ""
this.getList();
},
chooseTexts(e) {
this.text_choose = e
},
getSearch(e, val) {
this.depart_id = e
this.titles = val
this.getList()
},
getDepart(e, names) {
// console.log(names,'depart_id');
this.depart_id = e
this.titles = names
this.getList()
setTimeout(() => {
this.show = false
this.$refs.uDropdown.close();
}, 100)
},
// 医生id
goLookDoctor(id) {
uni.navigateTo({
url: '/subPackages/doctor/doctor-detail?id=' + id
})
},
// 医生列表
getList() {
doctorList({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
keyword: this.keyword,
title_id: this.text_choose,
sort: this.sort,
depart_id: this.depart_id,
}
}).then((res) => {
// console.log(res, 'res');
if (res.data.errcode == 0) {
this.doctorList = res.data.data.list
}
})
},
// 科室列表
getOfflist() {
getOfficeList({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
}
}).then((res) => {
// console.log(res, 'ks');
if (res.data.errcode == 0) {
this.officeList = res.data.data
} else if (res.data.errcode != 0) {
// uni.showToast({
// title: res.data.msg,
// duration: 1500,
// mask: false,
// icon: "error"
// })
this.$refs.uToast.show({
title: res.data.msg,
type: 'default',
icon: false
})
}
})
},
// 搜索
toSearch() {
this.getList()
},
},
mounted() {
this.getList();
this.getOfflist();
}
}
</script>
<style lang="scss" scoped>
.container {
max-height: 100%;
width: 100vw;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
.search {
width: 686rpx;
height: 98rpx;
margin: 0 auto;
padding: 16rpx 0;
.u-search {
width: 686rpx;
height: 66rpx;
margin: 0 auto;
}
}
.drop_down {
background-color: #fff;
border-bottom: 2rpx solid #F1F5F9;
position: -webkit-sticky;
position: sticky;
top: var(--window-top);
z-index: 99;
.u-dropdown-item {
.slot-content {
width: 750rpx;
padding: 1rpx 0 0rpx 1rpx;
background-color: #fff;
z-index: 20;
.u-text-center {
display: flex;
flex-direction: column;
padding: 10rpx 20rpx;
text-align: left;
.content_title {
width: 112rpx;
height: 40rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #1E293B;
line-height: 33rpx;
margin-left: 32rpx;
}
.content_btn {
height: 120rpx;
display: flex;
align-items: center;
text {
width: 160rpx;
height: 56rpx;
text-align: center;
line-height: 56rpx;
background: #F7F8FA;
border-radius: 64rpx;
margin: 0 20rpx 0 22rpx;
}
.text_choose {
width: 160rpx;
height: 56rpx;
text-align: center;
line-height: 56rpx;
border-radius: 64rpx;
margin: 0 20rpx 0 22rpx;
background: rgba(83, 109, 254, 0.1);
color: #4175EE;
}
}
}
.bottom_btn {
width: 740rpx;
height: 86rpx;
display: flex;
margin: 0 auto 10rpx;
justify-content: space-around;
align-items: center;
.bottom_btn_first {
width: 375rpx;
height: 86rpx;
display: flex;
justify-content: space-around;
align-items: center;
background: #fff;
color: #4175EE;
border-radius: 0;
border: 1rpx solid #4175EE;
}
.bottom_btn_last {
width: 375rpx;
height: 86rpx;
line-height: 86rpx;
text-align: center;
background: #4175EE;
color: #fff;
border-radius: 0;
border: 1rpx solid #4175EE;
}
}
}
}
}
.doctor_list {
width: 670rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
margin: 30rpx auto 34rpx;
}
.list {
width: 710rpx;
background: linear-gradient(180deg, #E2F1FF 0%, #FBFDFF 24%, #FFFFFF 100%);
margin: 32rpx auto 52rpx;
border-radius: 16rpx;
padding: 22rpx 32rpx;
margin: 32rpx auto 52rpx;
box-shadow: 0px 0px 18px 0px rgba(0, 0, 0, 0.08);
.list_info {
display: flex;
justify-content: space-between;
.list_left {
height: 96rpx;
display: flex;
align-items: center;
justify-content: space-around;
image {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
margin: 0 16rpx 0 0;
vertical-align: middle;
}
.list_title {
display: flex;
flex-direction: column;
.titles_name {
margin: 16rpx 0;
.doctor_name {
height: 40rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
line-height: 40rpx;
margin-right: 16rpx;
}
.doctors {
height: 40rpx;
font-size: 20rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #333333;
line-height: 30rpx;
}
}
.list_yard {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #666666;
}
}
}
.list_right {
width: 104rpx;
height: 50rpx;
line-height: 50rpx;
text-align: center;
background: #4175EE;
border-radius: 26rpx 26rpx 26rpx 26rpx;
font-size: 24rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
}
}
.card {
.list_nums {
height: 34rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #666666;
margin: 18rpx 0 24rpx;
display: flex;
align-items: center;
.txt {
margin-right: 30rpx;
text {
font-size: 28rpx;
color: #FEA54C;
margin: 0 10rpx;
}
}
}
.list_going {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
line-height: 44rpx;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
margin: 16rpx auto;
}
.list_price {
display: flex;
align-items: center;
.picture {
width: 140rpx;
height: 60rpx;
line-height: 58rpx;
text-align: center;
border-radius: 4rpx 4rpx 4rpx 4rpx;
border: 2rpx solid #4175EE;
font-size: 24rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #4175EE;
margin: 0 30rpx 0 0;
}
}
}
}
.floor {
width: 100vw;
height: 100vh;
.contents {
width: 100vw;
height: 100vh;
.confrim-btn {
width: 100%;
height: 9%;
display: flex;
justify-content: flex-end;
align-items: center;
.right {
width: 486rpx;
display: flex;
align-items: center;
justify-content: space-between;
.title {
width: 144rpx;
height: 50rpx;
font-size: 36rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #0F172A;
}
.btn {
width: 82rpx;
height: 42rpx;
font-size: 34rpx;
border: 0;
background-color: #fff;
color: #969799;
}
}
}
.contents_scroll {
width: 100%;
height: 91%;
display: flex;
.contents_scroll_left {
width: 264rpx;
background: #F8FAFC;
text-align: center;
.box {
width: 264rpx;
background: #F8FAFC;
line-height: 104rpx;
font-size: 30rpx;
font-family: PingFang SC-Semibold, PingFang SC;
font-weight: 600;
color: #475569;
}
.active {
background: #FFFFFF;
color: #4175EE;
}
}
.contents_scroll_right {
width: 486rpx;
background-color: #fff;
.lists {
width: 486rpx;
height: 104rpx;
padding: 32rpx 0 32rpx 40rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #1E293B;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 54rpx 0 74rpx;
}
}
}
}
}
}
</style>

541
pages/cate/cate.vue Normal file
View File

@@ -0,0 +1,541 @@
<template>
<view class="container safe-area-inset-bottom">
<!-- 搜索 -->
<view class="search">
<u-search placeholder="输入药品名称" bg-color="#F5f5f5" color="#DDDDDD" border-color="#F5f5f5"
:show-action="false" maxlength="21" height="66" :clearabled="true" shape="round" v-model="keyword"
@search="toSearch">
</u-search>
</view>
<!-- 商品 -->
<!-- //药品分类左 -->
<view class="goods">
<view class="goods_left" @touchmove.stop>
<scroll-view scroll-y scroll-with-animation class="u-menu-scroll-view" :scroll-top="scrollTop"
:scroll-into-view="itemId">
<view v-for="(item,index) in drugCategoryLists" :key="item.id" class="u-tab-item"
:class="[num == item.id ? 'u-item-active' : '']" @tap.stop="changeStyle(item.id)"
@click="handleCategory1(item.id,index)">
<text class="u-line-1">{{item.category_name}}</text>
</view>
</scroll-view>
</view>
<!-- //药品分类右 -->
<view class="goods_right">
<view class="_btn">
<scroll-view scroll-x style="white-space: nowrap;" @touchmove.stop>
<!-- <view v-for="item in drugCategoryLists" > -->
<view v-for="(item1,index) in drugCategoryLists[selectIndex].subs"
:class="current==item1.id?'btns_active' : 'btns'" @click="handleCategory2(item1.id)">
{{item1.category_name}}
</view>
<!-- </view> -->
</scroll-view>
</view>
<!-- 药品 -->
<view class="second">
<!-- 商品列表 -->
<view class="list" v-for="(item,index) in drugLists" @click="toDetail(item.id)">
<text class="cf">{{item.is_otc=='0'?'处方药':'非处方药'}}</text>
<view class="img">
<image :src="item.image" mode=""></image>
</view>
<view class="it">
<view class="it_name">{{item.drug_name}}</view>
<view class="it_info">{{item.small_info}}</view>
<view class="it_price">
<text>{{item.drugstore_drug.price}}</text>
<image src="/static/home/gwc.png" mode=""
@tap.stop="toCartImg(item.drugstore_drug.drug_id)"></image>
</view>
</view>
</view>
</view>
</view>
</view>
<!-- 选择数量 -->
<u-popup v-model="show" mode="bottom" border-radius="28" length="55%" :safe-area-inset-bottom="true"
:closeable="true">
<view class="popup" v-for="(item,index) in drugLists" :key="item.id" v-if="item.id==drug_id">
<view class="good">
<image :src="item.image" mode=""></image>
<view class="good_">
<text>{{item.drug_name}}</text>
<text class="price">{{item.drugstore_drug.price}}</text>
</view>
</view>
<view class="good_num">
<text>购买数量</text>
<uni-number-box :min="1" :max="9" @change="changeValue()"></uni-number-box>
</view>
<view class="btn">
<view class="to_btn" @click="toCart">
加入购物车
</view>
<view class="to_pay" @click="tocartPay">
立即购买
</view>
</view>
</view>
</u-popup>
</view>
</template>
<script>
import {
drugCategorys,
drugLists,
addCart
} from '../../request/api/api'
export default {
data() {
return {
keyword: "",
scrollTop: 0, //tab标题的滚动条位置
oldScrollTop: 0, // tab标题的滚动条旧位置
current: 1, // 预设当前项的值
num: 0,
itemId: '', // 栏目右边scroll-view用于滚动的id
drugCategoryLists: [], //药品分类
category_first: 0, //药品分类一级id
category_second: 0,
drugLists: [],
selectIndex: 0,
drug_id: '',
qty: '',
// list: [{
// id: 1
// }, {
// id: 1
// }, {
// id: 1
// }, {
// id: 1
// }, {
// id: 1
// }, {
// id: 1
// }, {
// id: 1
// }, {
// id: 1
// }],
// tabbar: JSON.parse(uni.getStorageSync('categroy')), // 渲染的数据,放在最后供你们测试
arr: [], // 储存距离顶部高度的数组
scrollRightTop: 0, // 右边栏目scroll-view的滚动条高度
show: false
}
},
methods: {
// 搜索
toSearch() {
this.getList()
},
changeValue(value) {
this.qty = value
// console.log('返回数值:', value);
},
/*切换需要*/
changeStyle(id) {
this.num = id
},
// 详情
toDetail(e) {
uni.navigateTo({
url: '/subPackages/shop/orders-detail?id=' + e
})
},
// 加入购物车
toCart() {
this.addToCart()
uni.navigateTo({
url: '/subPackages/shop/shop-cate?id=' + this.drug_id
})
},
//图标加入购物车
toCartImg(e) {
// this.show = true
// let id=e
this.drug_id = e
if (this.drug_id) {
this.show = true
}
console.log(e, 666);
},
// 立即购买
tocartPay() {
uni.navigateTo({
url: '/subPackages/shop/shop-pay?id=' + this.drug_id
// url: '/subPackages/shop/shop-pay?id='+this.drug_id+'&&qty='+this.qty
})
},
//点击药品一级分类
handleCategory1(e, index) {
console.log('handleCategory1')
this.num = e
this.category_first = e - 1
this.selectIndex = index
if (this.selectIndex == 0) {
this.category_second = 0
} else {
this.category_second = 7
}
this.getDrugList()
console.log(e);
},
//点击药品二级分类
handleCategory2(e) {
console.log('handleCategory2', this.selectIndex, this.current)
this.current = e
this.category_second = e - 3
this.getDrugList()
console.log(e);
},
//获取药品分类
getList() {
drugCategorys({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
}
}).then((res) => {
// console.log(res, 'list');
if (res.data.code == 0) {
console.log(res.data.data[0]);
this.drugCategoryLists = res.data.data
this.category_first = res.data.data.map(x => x.id)
this.num = res.data.data[0].id //初始选中
this.current = res.data.data[0].subs[0].id //初始选中2
// console.log(this.category_first);
}
})
},
getDrugList() {
drugLists({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
category_first: this.category_first,
category_second: this.category_second,
}
}).then((res) => {
// console.log(res, 'list');
if (res.data.code == 0) {
this.drugLists = res.data.data
console.log(res.data)
}
})
},
//加入购物车
addToCart() {
addCart({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
drug_id: this.drug_id,
change_qty: this.qty
// id:this.id
}
}).then((res) => {
// console.log(res, 'list');
if (res.data.code == 0) {
console.log(res);
}
})
},
},
mounted() {
this.getList();
this.getDrugList()
},
}
</script>
<style lang="scss" scoped>
.container {
background: #F6F9FB;
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
.search {
width: 750rpx;
background-color: #fff;
height: 98rpx;
margin: 0 auto;
padding: 16rpx 30rpx;
.u-search {
width: 686rpx;
height: 66rpx;
margin: 0 auto;
}
}
.popup {
padding: 56rpx 36rpx 30rpx 60rpx;
.good {
width: 100%;
height: 200rpx;
display: flex;
align-items: center;
image {
width: 180rpx;
height: 180rpx;
margin-right: 22rpx;
}
.good_ {
flex: 1;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
display: flex;
flex-direction: column;
.price {
font-size: 40rpx;
color: #F93030;
margin-top: 20rpx;
}
}
}
.good_num {
display: flex;
justify-content: space-between;
align-items: center;
margin: 70rpx 0;
text {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
}
}
.btn {
font-size: 30rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
display: flex;
align-items: center;
.to_btn {
width: 280rpx;
height: 70rpx;
background: #D0E4FF;
border-radius: 64rpx;
line-height: 70rpx;
text-align: center;
color: #1777FF;
margin-right: 40rpx;
}
.to_pay {
width: 280rpx;
height: 70rpx;
line-height: 70rpx;
text-align: center;
background: #1777FF;
border-radius: 64rpx;
color: #FFFFFF;
}
}
}
.goods {
width: 750rpx;
min-height: calc(100vh - 98rpx);
display: flex;
.goods_left {
width: 184rpx;
background: #fff;
margin-right: 16rpx;
.u-tab-item {
width: 184rpx;
height: 100rpx;
text-align: center;
line-height: 100rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: bold;
color: #9EA7B1;
}
.u-item-active {
width: 184rpx;
height: 100rpx;
text-align: center;
line-height: 100rpx;
background: #F6F9FB;
border-left: 4rpx solid #4175EE;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
}
}
.goods_right {
width: 530rpx;
background: #F6F9FB;
._btn {
width: 530rpx;
height: 100rpx;
line-height: 100rpx;
.btns {
display: inline-block;
line-height: 54rpx;
height: 54rpx;
padding: 2rpx 20rpx;
text-align: center;
background: #DFDFDF;
font-size: 24rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #666666;
margin-right: 20rpx;
border-radius: 8rpx;
}
.btns_active {
display: inline-block;
line-height: 54rpx;
height: 54rpx;
padding: 2rpx 20rpx;
text-align: center;
font-size: 24rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
margin-right: 20rpx;
border-radius: 8rpx;
background: #DEE8F6;
color: #4175EE;
}
}
.second {
width: 530rpx;
.list {
display: flex;
justify-content: space-around;
align-items: center;
padding: 0 15rpx;
width: 530rpx;
height: 248rpx;
background: #FFFFFF;
margin: 0rpx auto 20rpx;
position: relative;
.cf {
position: absolute;
left: 0;
top: 0;
display: inline-block;
width: 100rpx;
height: 40rpx;
line-height: 40rpx;
text-align: center;
border-radius: 8rpx;
background: #D0E4FF;
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #4175EE;
}
.img {
width: 140rpx;
height: 180rpx;
margin-right: 10rpx;
image {
width: 100%;
height: 100%;
border-radius: 8rpx;
}
}
.it {
flex: 1;
font-family: PingFang SC-Bold, PingFang SC;
.it_name {
font-size: 28rpx;
font-weight: bold;
color: #232323;
}
.it_info {
padding-left: 10rpx;
font-size: 24rpx;
font-weight: 400;
color: #666666;
margin: 20rpx 0 48rpx 0;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
}
.it_price {
display: flex;
align-items: center;
justify-content: space-between;
text {
font-size: 36rpx;
font-weight: bold;
color: #F93030;
}
image {
width: 44rpx;
height: 44rpx;
border-radius: 50%;
background: #4491E9;
vertical-align: middle;
}
}
}
}
}
}
}
}
</style>

250
pages/cate/index.vue Normal file
View File

@@ -0,0 +1,250 @@
<template>
<view class="container safe-area-inset-bottom">
<!-- 搜索 -->
<view class="search">
<u-search placeholder="输入文章标题" bg-color="#F5f5f5" color="#DDDDDD" border-color="#F5f5f5"
:show-action="false" maxlength="21" height="66" :clearabled="true" shape="round" v-model="keyword"
@search="toSearch">
</u-search>
</view>
<!-- 商品 -->
<!-- //药品分类左 -->
<view class="goods">
<view class="goods_left" @touchmove.stop>
<scroll-view scroll-y scroll-with-animation class="u-menu-scroll-view" :scroll-top="scrollTop"
:scroll-into-view="itemId">
<view v-for="(item,index) in categoryLists" :key="item.id" class="u-tab-item"
:class="[num == item.id ? 'u-item-active' : '']" @tap.stop="changeStyle(item.id)"
@click="handleCategory1(item.id,index)">
<text class="u-line-1">{{item.name}}</text>
</view>
</scroll-view>
</view>
<!-- //药品分类右 -->
<view class="goods_right">
<!-- 药品 -->
<view class="second">
<!-- 商品列表 -->
<view class="list" v-for="(item,index) in infoList" @click="toDetail(item.id)" :key="item.id">
<view class="list_">
<image :src="item.cover||'/static/xx/cp.png'" mode=""></image>
<view class="list_title">
{{item.title}}
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import {
categoriesList,
articleList,
addCart
} from '../../request/api/api'
export default {
data() {
return {
keyword: "",
scrollTop: 0, //tab标题的滚动条位置
oldScrollTop: 0, // tab标题的滚动条旧位置
current: 1, // 预设当前项的值
num: 1,
itemId: '', // 栏目右边scroll-view用于滚动的id
categoryLists: [], //分类
cid: 1, //分类一级id
infoList: [],
selectIndex: 0,
arr: [], // 储存距离顶部高度的数组
scrollRightTop: 0, // 右边栏目scroll-view的滚动条高度
show: false
}
},
onLoad(op) {
},
methods: {
// 搜索
toSearch() {
this.getList()
},
/*切换需要*/
changeStyle(id) {
this.num = id
},
// 详情
toDetail(e) {
uni.navigateTo({
url: '/pages/cate/info-detail?id=' + e
})
},
//点击药品一级分类e
handleCategory1(e, index) {
this.num = e
this.cid = e
this.getArticleList()
},
//获取药品分类
getList() {
categoriesList({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
}
}).then((res) => {
// console.log(res, 'list');
if (res.data.errcode == 0) {
// console.log(res, 'res');
this.categoryLists = res.data.data.list
this.cid = res.data.data.map(x => x.id)
this.num = res.data.data[0].id //初始选中
// this.current = res.data.data[0].subs[0].id //初始选中2
}
})
this.getArticleList()
},
// 文章列表
getArticleList() {
articleList({
method: "get",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
cid: this.cid
}
}).then((res) => {
// console.log(res, 'list');
if (res.data.errcode == 0) {
this.infoList = res.data.data.list
// console.log(res, 'list')
}
})
}
},
mounted() {
// this.getList();
},
onShow() {
this.getList();
}
}
</script>
<style lang="scss" scoped>
.container {
background: #F6F9FB;
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
.search {
width: 750rpx;
background-color: #fff;
height: 98rpx;
margin: 0 auto;
padding: 16rpx 30rpx;
.u-search {
width: 686rpx;
height: 66rpx;
margin: 0 auto;
}
}
.goods {
width: 750rpx;
min-height: calc(100vh - 98rpx);
display: flex;
.goods_left {
width: 184rpx;
background: #fff;
margin-right: 16rpx;
.u-tab-item {
width: 184rpx;
height: 100rpx;
text-align: center;
line-height: 100rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: bold;
color: #9EA7B1;
}
.u-item-active {
width: 184rpx;
height: 100rpx;
text-align: center;
line-height: 100rpx;
background: #F6F9FB;
border-left: 4rpx solid #4175EE;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
}
}
.goods_right {
width: 530rpx;
background: #F6F9FB;
.second {
width: 530rpx;
text-align: center;
margin-top: 20rpx;
.list {
.list_ {
width: 500rpx;
height: 246rpx;
background: #FFFFFF;
border-radius: 12rpx 12rpx 0rpx 0rpx;
position: relative;
margin: 10rpx auto;
image {
width: 100%;
height: 100%;
border-radius: 8rpx;
}
.list_title {
width: 100%;
position: absolute;
left: 0%;
bottom: 0;
height: 92rpx;
font-size: 22rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #FFFFFF;
background: rgba(0, 0, 0, 0.4);
display: flex;
align-items: center;
padding: 0 34rpx;
}
}
}
}
}
}
}
</style>

View File

@@ -0,0 +1,99 @@
<template>
<view class="container safe-area-inset-bottom">
<view class="_html" v-if="content">
<u-parse :html="content"></u-parse>
</view>
<view class="img" v-if="!content">
<image :src="infoList.cover" mode=""></image>
</view>
<button type="default" open-type="contact" class="btn">
<u-icon name="kefu-ermai" color="#fff" size="36" style="margin-right: 8rpx;"></u-icon>
咨询客服
</button>
</view>
</template>
<script>
import {
articleInfo
} from '../../request/api/api';
export default {
data() {
return {
infoList: "",
id: "",
content: "",
}
},
onLoad(op) {
this.id = op.id
},
methods: {
//获取药品分类
getInfo() {
articleInfo({
method: "get",
data: {
id: this.id,
store_id: uni.getStorageSync('store_id') || '11001',
}
}).then((res) => {
// console.log(res, 'list');
if (res.data.errcode == 0) {
this.infoList = res.data.data
this.content = res.data.data.content
}
})
},
},
mounted() {
this.getInfo()
},
}
</script>
<style lang="scss" scoped>
.container {
background: #F6F9FB;
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
._html{
padding: 20rpx 32rpx 120rpx;
}
.img {
width: 100vw;
height: 100vh;
image {
width: 100%;
height: 100%;
}
}
.btn {
width: 686rpx;
height: 86rpx;
background: #569afe;
border-radius: 68rpx;
color: #fff;
position: fixed;
bottom: env(safe-area-inset-bottom);
left: 4%;
margin: 10rpx auto;
line-height: 86rpx;
display: flex;
align-items: center;
justify-content: center;
z-index: 9999;
}
}
</style>

View File

@@ -0,0 +1,21 @@
<template>
<web-view :src="url"></web-view>
</template>
<script>
export default {
data() {
return {
url: ''
}
},
onLoad(e) {
this.url = decodeURIComponent(e.id)
console.log(this.url,'aaaaaaaaaaaa')
// 传入需要跳转的链接 使用web-view标签进行跳转
}
}
</script>
<style>
</style>

1025
pages/home/home.vue Normal file

File diff suppressed because it is too large Load Diff

381
pages/home/index-list.vue Normal file
View File

@@ -0,0 +1,381 @@
<template>
<view class="container safe-area-inset-bottom" @click="onclick">
<view class="imgs">
<image class="img"
:src="id==1?'https://p3.maiyaole.com/img/971/971752/org_org.jpg?v=1':'https://p2.maiyaole.com/img/item/202210/24/202210241042513.jpg'"
mode=""></image>
<text class="cf">{{drugDetailsList.is_otc=='0'?'处方药':'非处方药'}}</text>
</view>
<view class="card">
<view class="name">
{{id==1?'【日康】对乙酰氨基酚片0.3g*12片*2板/盒':'同仁堂 六味地黄丸(浓缩丸) 200丸/瓶'}}
</view>
<view class="info">
<view class="price">{{id==1?'34':'22'}}</view>
<!-- <text>已售:120</text> -->
<text>已售{{id==2?'100+':'100+'}}</text>
</view>
<view class="goods">药品说明</view>
<view class="infos">功能主治:{{id==1?'清热解毒,咽喉肿痛,牙痛':'滋阴补肾。用于阴肾亏损,头晕耳鸣,腰膝酸软,骨蒸潮热,盗汗遗精'}}</view>
<view class="infos">常见用法:口服一次2支,一日3次;小儿酌减或遵医嘱</view>
<view class="infos">有效期:24个月</view>
<view class="infos">贮存条件:密封,避光,置阴凉处</view>
</view>
<!-- 门店 -->
<view class="card">
<view class="store">
<text>药房</text>
萧康
</view>
<view class="store">
<text>运费</text>
运费3元·满30元包运费
</view>
<view class="store">
<text>服务</text>
正品保证 隐私发货 不支持无理由退款1
</view>
</view>
<!-- 详情介绍 -->
<view class="detail">
<view class="tit">{{id==2?'清热解毒,咽喉肿痛,牙痛':'滋阴补肾。用于阴肾亏损,头晕耳鸣,腰膝酸软,骨蒸潮热,盗汗遗精'}}</view>
<image
:src="id==2?'https://p3.maiyaole.com/img/971/971752/org_org.jpg?v=1':'https://p2.maiyaole.com/img/item/202210/24/202210241042513.jpg'"
mode=""></image>
</view>
<!-- 选择数量 -->
<u-popup v-model="show" mode="bottom" border-radius="28" length="50%" :safe-area-inset-bottom="true"
:closeable="true">
<view class="popup">
<view class="good">
<image
:src="id==2?'https://p3.maiyaole.com/img/971/971752/org_org.jpg?v=1':'https://p2.maiyaole.com/img/item/202210/24/202210241042513.jpg'"
mode=""></image>
<view class="good_">
<text>1</text>
<text class="price">34</text>
</view>
</view>
<view class="good_num">
<text>购买数量</text>
<uni-number-box :min="0" :max="9" @change="changeValue()"></uni-number-box>
</view>
<view class="btn" @click="saveToCart()">
保存
</view>
</view>
</u-popup>
<!-- 底部 -->
<view class="footer">
<view class="box">
<image src="/static/shop/home.png" mode=""></image>
<text>首页</text>
</view>
<view class="box" @click="toShop">
<u-badge type="error" :count="gwcNum" size="mini" :offset="[0,16]"></u-badge>
<image :src="gwcNum==0&&'/static/shop/gwc.png' || gwcNum>0&&'/static/shop/gwc_l.png'" mode=""></image>
<text :class="gwcNum>0?'active':''">购物车</text>
</view>
<view class="to_btns" @click="toAdd(drugDetailsList.drug_store_relation.drug_id)">
加入购物车
</view>
<view class="to_btn" @click="toPay">
立即购买
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
id: '',
}
},
onLoad(e) {
this.id = e.id
},
methods: {
onclick() {
uni.navigateBack({
break: 2
})
}
},
mounted() {
}
}
</script>
<style lang="scss" scoped>
.container {
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
background: #F5F5F5;
.imgs {
position: relative;
.img {
width: 100%;
height: 564rpx;
vertical-align: middle;
}
.cf {
position: absolute;
right: 20rpx;
bottom: 0;
display: inline-block;
width: 100rpx;
height: 40rpx;
line-height: 40rpx;
text-align: center;
border-radius: 8rpx;
background: #D0E4FF;
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #4175EE;
}
}
.popup {
padding: 76rpx 36rpx 0rpx;
.good {
width: 100%;
height: 200rpx;
display: flex;
align-items: center;
image {
width: 180rpx;
height: 180rpx;
margin-right: 22rpx;
}
.good_ {
flex: 1;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
display: flex;
flex-direction: column;
.price {
font-size: 40rpx;
color: #F93030;
margin-top: 20rpx;
}
}
}
.good_num {
display: flex;
justify-content: space-between;
align-items: center;
margin: 70rpx 0;
text {
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
}
}
.btn {
margin: 0 auto;
width: 528rpx;
height: 86rpx;
line-height: 80rpx;
text-align: center;
background: #1777FF;
border-radius: 64rpx;
font-size: 32rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #FFFFFF;
}
}
.card {
width: 750rpx;
background: #FFFFFF;
padding: 20rpx 40rpx;
margin: 28rpx 0;
background: #fff;
.name {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
line-height: 48rpx;
}
.info {
font-size: 24rpx;
font-weight: 400;
color: #666666;
margin: 12rpx 0;
display: flex;
align-items: center;
justify-content: space-between;
margin: 28rpx 0 32rpx;
.price {
font-size: 40rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #F93030;
line-height: 36rpx;
}
text {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 36rpx;
}
}
.goods {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 36rpx;
}
.infos {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
line-height: 36rpx;
margin: 10rpx 0;
}
.store {
font-family: PingFang SC-Regular, PingFang SC;
font-size: 24rpx;
font-weight: 400;
color: #232323;
line-height: 36rpx;
margin: 18rpx 0;
text {
font-size: 24rpx;
font-weight: 400;
color: #999999;
line-height: 36rpx;
margin-right: 28rpx;
}
}
}
.detail {
width: 750rpx;
background: #FFFFFF;
padding: 32rpx 40rpx;
.tit {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
line-height: 36rpx;
}
image {
width: 670rpx;
height: 184rpx;
}
}
.footer {
width: 750rpx;
height: 104rpx;
background: #fff;
position: fixed;
left: 0;
bottom: env(safe-area-inset-bottom);
display: flex;
align-items: center;
padding: 0 18rpx;
.box {
width: 100rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 84rpx;
margin: 0rpx 8rpx;
font-size: 22rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #666666;
position: relative;
image {
width: 63rpx;
height: 88rpx;
}
.active {
color: #4175EE;
}
}
.to_btn {
width: 240rpx;
height: 76rpx;
text-align: center;
line-height: 74rpx;
background: #4175EE;
border-radius: 44rpx 44rpx 44rpx 44rpx;
font-size: 32rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #FFFFFF;
}
.to_btns {
width: 240rpx;
height: 76rpx;
line-height: 76rpx;
text-align: center;
background: #CBE0FF;
border-radius: 44rpx 44rpx 44rpx 44rpx;
font-size: 32rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #4175EE;
margin-right: 10rpx;
}
}
}
</style>

619
pages/home/index.vue Normal file
View File

@@ -0,0 +1,619 @@
<template>
<view class="content safe-area-inset-bottom">
<view class="head" @click="gologin">
<!-- 门店 -->
<view class="store">
{{info.name || ''}}
<text class="iconfont icon-mendian"></text>
</view>
<!-- 定位 -->
<view class="area">
<view class="place">
<text class="iconfont icon-dizhi"></text>
{{info.position || ''}}
</view>
<!-- <view class="place">
<text class="iconfont icon-saoyisao" style="font-size: 30rpx;"></text>
扫一扫
</view> -->
</view>
</view>
<!-- 图片展示 -->
<view class="section" @click="gologin">
<u-swiper :list="list" :img-mode="aspectFill" :height="300" :interval="4000"></u-swiper>
<!-- <image class="banner" mode="aspectFill" src="/static/home/banner.png"></image> -->
</view>
<!-- 导航栏 -->
<view class="nav" v-if="isShow_envVersion==false">
<view class="nav_service" @click="gologin">
<view class="nav_service_img">
<image src="../../static/home/bg1.png" mode=""></image>
</view>
<view class="nav_service_title">
到店挂号
</view>
</view>
<view class="nav_service" @click="gologin">
<view class="nav_service_img">
<image src="../../static/home/bg2.png" mode=""></image>
</view>
<view class="nav_service_title">
线上复诊
</view>
</view>
</view>
<view class="doctor_list" v-if="isShow_envVersion==false" @click="gologin">
医生列表
<view class="info">
更多 <text class="iconfont icon-jiantou1"></text>
</view>
</view>
<view class="doctor_list" v-if="isShow_envVersion" @click="gologin">
商品列表
<view class="info">
更多 <text class="iconfont icon-jiantou1"></text>
</view>
</view>
<!-- 医生列表 -->
<view class="list" @click="gologin" v-if="isShow_envVersion">
<!-- 图片部分 -->
<view class="list_info">
<view class="list_left">
<image src="https://p3.maiyaole.com/img/971/971752/org_org.jpg?v=1" mode=""></image>
<view class="it">
<view class="it_name">日康对乙酰氨基酚片0.3g*12*2/</view>
<view class="it_info">清热解毒,咽喉肿痛,牙痛</view>
<view class="it_price">
<text>34.00</text>
<text class="num">x1</text>
</view>
</view>
</view>
</view>
</view>
<view class="list" @click="gologin" v-if="isShow_envVersion">
<!-- 图片部分 -->
<view class="list_info">
<view class="list_left">
<image src="https://p2.maiyaole.com/img/item/202210/24/202210241042513.jpg" mode=""></image>
<view class="it">
<view class="it_name">同仁堂 六味地黄丸(浓缩丸) 200/</view>
<view class="it_info">滋阴补肾用于阴肾亏损头晕耳鸣腰膝酸软骨蒸潮热盗汗遗精</view>
<view class="it_price">
<text>22.00</text>
<text class="num">x1</text>
</view>
</view>
</view>
</view>
</view>
<view class="" v-if="isShow_envVersion==false">
<view class="lists" @click="gologin" v-for="(item,index) in doctorList" :key="item.id">
<!-- 图片部分 -->
<view class="list_infos">
<view class="list_lefts">
<image :src="item.avatar || '/static/mine/avatar_1.png'" mode="医生头像"></image>
<!-- 医生 -->
<view class="list_title">
<view class="titles_name">
<text class="doctor_name">{{item.name}}</text>
<text class="doctors">{{item.title}}</text>
</view>
<!-- 职称 -->
<view class="list_yard">
{{item.store}} &nbsp; {{item.depart}}
</view>
</view>
</view>
</view>
<!-- 文字部分 -->
<view class="cards">
<!-- 擅长 -->
<view class="list_going">
擅长{{item.good_at}}
</view>
<!-- 接诊率 -->
<view class="list_nums">
<view class="txt">问诊量 <text>{{item.inquiry_num }}</text></view>
<view class="txt">接诊率 <text>{{item.accept_percent}}</text></view>
<!-- <view class="txt">综合评分 <text>{{item.overall_score}}</text></view> -->
</view>
</view>
</view>
</view>
</view>
</template>
<script>
import {
doctorList,
getBanner,
getOpen
} from '../../request/api/api'
export default {
data() {
return {
show: true,
doctorList: [],
list: [
// '/static/home/banner.png',
// '/static/home/banner.png',
// '/static/home/banner.png'
],
info:[],
isShow_envVersion: true
}
},
onLoad() {
setInterval(() => {
this.isShow_envVersion = uni.getStorageSync('isShow_envVersion')
}, 500)
},
created() {
},
methods: {
gologin() {
uni.removeStorageSync('token')
uni.removeStorageSync('userinfo')
uni.removeStorageSync('token_h5')
uni.removeStorageSync('user_id')
uni.navigateTo({
url: '/pages/login/login?type=' + 2
})
},
getShow() {
getOpen({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
}
}).then((res) => {
// console.log(res, 'open');
this.show = res.data.data.open_issue
})
},
// 医生列表
getList() {
doctorList({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || '11001',
}
}).then((res) => {
// console.log(res, 'list');
if (res.data.errcode == 0) {
this.doctorList = (res.data.data.list).slice(0, 3)
}
})
this.getBannered()
},
// 门店详情--轮播图
getBannered() {
getBanner({
method: "post",
data: {
store_id: uni.getStorageSync('stores_id') || '11001',
}
}).then((res) => {
console.log(res, 'info');
if (res.data.errcode == 0) {
this.info = res.data.data
this.list = (res.data.data.nav).map((item) => {
return item.pic
})
}
})
},
},
mounted() {
this.getShow()
this.getList()
}
}
</script>
<style lang="scss" scoped>
.content {
background-color: #fff;
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
.lists {
width: 710rpx;
background: linear-gradient(180deg, #E2F1FF 0%, #FBFDFF 54%, #FFFFFF 100%);
border-radius: 16rpx;
padding: 12rpx 30rpx 22rpx;
margin: 32rpx auto 52rpx;
box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.08);
.list_infos {
display: flex;
justify-content: space-between;
.list_lefts {
height: 96rpx;
display: flex;
align-items: center;
justify-content: space-around;
image {
width: 96rpx;
height: 96rpx;
border-radius: 50%;
margin: 0 16rpx 0 0;
vertical-align: middle;
}
.list_title {
display: flex;
flex-direction: column;
.titles_name {
margin: 16rpx 0;
.doctor_name {
height: 40rpx;
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
line-height: 40rpx;
margin-right: 16rpx;
}
.doctors {
height: 40rpx;
font-size: 20rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
line-height: 40rpx;
}
}
.list_yard {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #666666;
}
}
}
.list_rights {
width: 88rpx;
height: 50rpx;
line-height: 50rpx;
text-align: center;
background: #4175EE;
border-radius: 26rpx 26rpx 26rpx 26rpx;
font-size: 24rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
}
}
.cards {
.list_nums {
height: 34rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #666666;
margin: 18rpx 0 24rpx;
display: flex;
align-items: center;
.txt {
margin-right: 30rpx;
text {
font-size: 28rpx;
color: #FEA54C;
margin: 0 10rpx;
}
}
}
.list_going {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
line-height: 44rpx;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
margin: 16rpx auto;
}
.list_prices {
display: flex;
align-items: center;
.picture {
width: 140rpx;
height: 60rpx;
line-height: 58rpx;
text-align: center;
border-radius: 4rpx 4rpx 4rpx 4rpx;
border: 2rpx solid #4175EE;
font-size: 24rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #4175EE;
margin: 0 30rpx 0 0;
}
}
}
}
.head {
width: 750rpx;
height: 390rpx;
padding: 20rpx;
background: linear-gradient(180deg, #298DFF 0%, #9ECBFF 70%, #FFFFFF 100%);
.search {
width: 710rpx;
margin: 20rpx auto 0;
}
.store {
width: 700rpx;
height: 78rpx;
line-height: 78rpx;
font-size: 28rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
margin: 0rpx auto 0rpx;
.iconfont {
font-size: 30rpx;
color: #fff;
margin-left: 12rpx;
}
}
.area {
width: 700rpx;
height: 64rpx;
display: flex;
justify-content: space-between;
align-items: center;
margin: 0rpx auto;
.place {
font-size: 26rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #FFFFFF;
.iconfont {
font-size: 25rpx;
color: #FFFFFF;
margin-right: 10rpx;
}
}
}
}
.section {
width: 710rpx;
margin: -170rpx auto 30rpx;
height: 300rpx;
.banner {
width: 100%;
height: 100%;
}
}
.nav {
width: 710rpx;
background: #FFFFFF;
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin: 30rpx auto;
.nav_service {
width: 348rpx;
height: 178rpx;
display: flex;
align-items: center;
justify-content: space-around;
background: url('/static/home/bg01.png') no-repeat;
background-size: 100% 100%;
.nav_service_img {
width: 116rpx;
height: 116rpx;
vertical-align: middle;
image {
width: 100%;
height: 100%;
}
}
.nav_service_title {
font-size: 40rpx;
font-family: PingFang SC-Heavy, PingFang SC;
font-weight: 800;
color: #FFFFFF;
}
}
.nav_service:last-child {
background: url('/static/home/bg02.png') no-repeat;
background-size: 100% 100%;
}
}
.doctor_list {
width: 710rpx;
font-size: 36rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
margin: 44rpx auto 24rpx;
display: flex;
justify-content: space-between;
align-items: center;
.info {
font-size: 28rpx;
font-weight: 500;
color: #666666;
}
}
.list {
width: 710rpx;
background: linear-gradient(180deg, #E2F1FF 0%, #FBFDFF 54%, #FFFFFF 100%);
border-radius: 16rpx;
padding: 30rpx;
margin: 32rpx auto 52rpx;
box-shadow: 0px 0px 16px 0px rgba(0, 0, 0, 0.08);
.list_left {
display: flex;
justify-content: space-around;
margin-bottom: 22rpx;
image {
width: 200rpx;
height: 200rpx;
margin-right: 20rpx;
}
.it {
width: 450rpx;
font-family: PingFang SC-Regular, PingFang SC;
.it_name {
height: 80rpx;
font-size: 28rpx;
font-weight: bold;
color: #232323;
}
.it_info {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
font-size: 24rpx;
font-weight: 400;
color: #999999;
margin: 12rpx 0 34rpx 0;
}
.it_price {
display: flex;
justify-content: space-between;
align-items: center;
text {
font-size: 28rpx;
font-weight: bold;
color: #232323;
}
.num {
font-size: 28rpx;
font-weight: 400;
color: #232323;
}
}
}
}
.card {
.list_nums {
height: 34rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #666666;
margin: 18rpx 0 24rpx;
display: flex;
align-items: center;
.txt {
margin-right: 30rpx;
text {
font-size: 28rpx;
color: #FEA54C;
margin: 0 10rpx;
}
}
}
.list_going {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
line-height: 44rpx;
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
margin: 16rpx auto;
}
.list_price {
display: flex;
align-items: center;
.picture {
width: 140rpx;
height: 60rpx;
line-height: 58rpx;
text-align: center;
border-radius: 4rpx 4rpx 4rpx 4rpx;
border: 2rpx solid #4175EE;
font-size: 24rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #4175EE;
margin: 0 30rpx 0 0;
}
}
}
}
}
</style>

146
pages/index/doctor-info.vue Normal file
View File

@@ -0,0 +1,146 @@
<template>
<view class="content safe-area-inset-bottom">
<!-- 描述 -->
<view class="card" v-for="item in list" :key="item.id" @click="toInfo(item.id)">
<image :src="item.content['avatar']||'/static/mine/avatar_1.png'" mode=""></image>
<view class="info">
<view class="infos_title">
<text class="infos">{{item.content['doctor']}}医生</text>
<text class="time">{{item.notice_at}}</text>
</view>
<view class="preview">
<view class="pre_">
{{item.content['content']}}
</view>
<view class="text">查看详情</view>
</view>
</view>
</view>
<!-- 为空 -->
<view class="empty">
<u-empty text="暂无医生消息" mode="list" v-if="list.length==0"></u-empty>
</view>
</view>
</template>
<script>
import {
getseesionDoctorList
} from '../../request/api/api'
export default {
data() {
return {
list: [],
}
},
onLoad() {
},
methods: {
goInfo() {
getseesionDoctorList({
method: "get",
data: {
store_id: uni.getStorageSync('store_id') || 11001
}
}).then((res) => {
this.list = res.data.data.list
})
},
toInfo(e) {
uni.navigateTo({
url: '/subPackages/doctor/doctor_newsinfo?id=' + e
})
}
},
mounted() {
this.goInfo()
}
}
</script>
<style lang="scss" scoped>
.content {
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
background: #F5F5F5;
.empty {
width: 100vw;
max-height: 100vh;
margin: 0 auto;
padding: 300rpx 0;
}
.card {
width: 100%;
height: 136rpx;
padding: 28rpx 40rpx;
background: #FFFFFF;
margin-top: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
image {
width: 80rpx;
height: 80rpx;
margin-right: 16rpx;
vertical-align: middle;
border-radius: 50%;
background: #1777FF;
}
.info {
width: 82%;
.infos_title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8rpx;
.infos {
font-size: 28rpx;
font-weight: bold;
color: #232323;
line-height: 42rpx;
}
.time {
font-size: 22rpx;
font-weight: 400;
color: #999999;
}
}
.preview {
margin-top: 16rpx;
display: flex;
justify-content: space-between;
font-size: 24rpx;
font-weight: 400;
color: #999999;
.pre_ {
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
}
.text {
text-align: right;
min-width: 160rpx;
max-width: 200rpx;
color: #1777FF;
}
}
}
}
}
</style>

310
pages/index/index.vue Normal file
View File

@@ -0,0 +1,310 @@
<template>
<view class="content safe-area-inset-bottom">
<!-- 标题 -->
<view class="title">
<text>全部消息</text>
<view class="clear" @click="getClearInfo">
<text class="iconfont icon-qingchu"></text>
清除未读
</view>
</view>
<!-- 消息列表 -->
<view class="list" @click="goSystem">
<!-- 头像 -->
<view class="avator">
<view class="img">
<image src="/static/xx/xt.png" mode=""></image>
</view>
<u-badge size="default" v-if="system.num>=0" :count="system.num" :is-dot="system.num==0?true:false"
type="error" :offset="system.num>0?[-4,-8]:[0,0]"></u-badge>
</view>
<!-- 描述 -->
<view class="info">
<view class="infos_title">
<text class="infos">系统消息</text>
<text class="time">{{system.time}}</text>
</view>
<view class="preview" v-if="system.num >0">
您有{{system.num}}条未读信息
</view>
<view class="preview" v-if="system.num==undefined">
暂无新消息
</view>
</view>
</view>
<view class="list" @click="goOrder">
<!-- 头像 -->
<view class="avator">
<view class="img">
<image src="/static/xx/cp.png" mode=""></image>
</view>
<u-badge size="default" v-if="order.num>=0" :count="order.num" :is-dot="order.num==0?true:false"
type="error" :offset="order.num>0?[-4,-8]:[0,0]"></u-badge>
</view>
<!-- 描述 -->
<view class="info">
<view class="infos_title">
<text class="infos">产品订单</text>
<text class="time">{{order.time}}</text>
</view>
<view class="preview" v-if="order.num>0">
您有{{order.num}}条未读信息
</view>
<view class="preview" v-if="order.num==undefined">
暂无新消息
</view>
</view>
</view>
<view class="list" @click="goDoctor">
<!-- 头像 -->
<view class="avator">
<view class="img">
<image src="/static/xx/ysxx.png" mode=""></image>
</view>
<u-badge size="default" v-if="doctor.num>=0" :count="doctor.num" :is-dot="doctor.num==0?true:false"
type="error" :offset="doctor.num>0?[-4,-8]:[0,0]"></u-badge>
</view>
<!-- 描述 -->
<view class="info">
<view class="infos_title">
<text class="infos">医生消息</text>
<text class="time">{{doctor.time}}</text>
</view>
<view class="preview" v-if="doctor.num>0">
您有{{doctor.num}}条新的消息
</view>
<view class="preview" v-if="doctor.num==undefined">
暂无新消息
</view>
</view>
</view>
</view>
</template>
<script>
import {
getseesionInfo,
getseesionRead
} from '../../request/api/api'
export default {
data() {
return {
order: [],
system: [],
doctor:[],
type: ""
}
},
onLoad() {
},
methods: {
// 清除未读信息
getClearInfo() {
getseesionRead({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || 11001,
type: "all"
}
}).then((res) => {
// console.log(res, 'res');
uni.showToast({
title: '清除成功',
duration: 2000,
icon: "success"
});
this.getInfo()
})
},
// 系统信息
goSystem() {
uni.navigateTo({
url: '/pages/index/system'
})
getseesionRead({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || 11001,
type: "system"
}
}).then((res) => {
// console.log(res, 'res');
})
},
// 详情
goOrder() {
uni.navigateTo({
url: '/pages/index/order-info'
})
getseesionRead({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || 11001,
type: "order"
}
}).then((res) => {
// console.log(res, 'res');
})
},
goDoctor() {
uni.navigateTo({
url: '/pages/index/doctor-info'
})
getseesionRead({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || 11001,
type: "doctor_news"
}
}).then((res) => {
// console.log(res, 'res');
})
},
//
getInfo() {
getseesionInfo({
method: "get",
data: {
store_id: uni.getStorageSync('store_id') || 11001,
}
}).then((res) => {
// console.log(res, 'info');
this.order = res.data.data.order
this.system = res.data.data.system
this.doctor=res.data.data.doctor_news
})
}
},
mounted() {
this.getInfo()
},
onShow() {
this.order = []
this.system = []
this.doctor=[]
this.getInfo()
}
}
</script>
<style lang="scss" scoped>
.content {
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
background: #F5F5F5;
.title {
padding: 32rpx;
display: flex;
align-items: center;
justify-content: space-between;
text {
height: 50rpx;
font-size: 36rpx;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #0F172A;
}
.clear {
height: 40rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #536DFE;
line-height: 33rpx;
.iconfont {
color: #536DFE;
margin-right: 8rpx;
vertical-align: text-top;
}
}
}
.list {
width: 750rpx;
display: flex;
padding: 32rpx 38rpx;
justify-content: space-between;
background: #fff;
.avator {
position: relative;
.img {
width: 84rpx;
height: 84rpx;
line-height: 84rpx;
text-align: center;
border-radius: 50%;
background: #E6EAFF;
image {
width: 100%;
height: 100%;
}
}
}
.info {
width: 570rpx;
height: 94rpx;
font-family: PingFang SC-Medium, PingFang SC;
.infos_title {
width: 570rpx;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8rpx;
.doctor {
.name {
height: 42rpx;
font-size: 32rpx;
font-weight: 500;
color: #1E293B;
}
.infos {
height: 42rpx;
font-size: 28rpx;
font-weight: 500;
color: #475569;
}
}
.time {
font-size: 24rpx;
font-weight: 400;
color: #94A3B8;
}
}
.preview {
width: 570rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #475569;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
}
}
}
}
</style>

127
pages/index/order-info.vue Normal file
View File

@@ -0,0 +1,127 @@
<template>
<view class="content safe-area-inset-bottom">
<!-- 描述 -->
<view class="card" v-for="item in list" :key="item.id">
<image src="/static/xx/cpdd.png" mode=""></image>
<view class="info">
<view class="infos_title">
<text class="infos">订单</text>
<text class="time">{{item.notice_at}}</text>
</view>
<view class="preview">
{{item.content}}
</view>
</view>
</view>
<!-- 为空 -->
<view class="empty">
<u-empty text="暂无产品订单信息" mode="list" v-if="list.length==0"></u-empty>
</view>
</view>
</template>
<script>
import {
getseesionOrder
} from '../../request/api/api'
export default {
data() {
return {
list: [],
}
},
onLoad() {
},
methods: {
goInfo() {
getseesionOrder({
method: "get",
data: {
store_id: uni.getStorageSync('store_id') || 11001
}
}).then((res) => {
// console.log(res, 'res');
this.list = res.data.data.list
})
}
},
mounted() {
this.goInfo()
}
}
</script>
<style lang="scss" scoped>
.content {
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
background: #F5F5F5;
.empty {
width: 100vw;
max-height: 100vh;
margin: 0 auto;
padding: 300rpx 0;
}
.card {
width: 750rpx;
height: 136rpx;
padding: 28rpx 40rpx;
background: #FFFFFF;
margin-bottom: 20rpx;
font-family: PingFang SC-Medium, PingFang SC;
display: flex;
align-items: center;
image {
width: 80rpx;
height: 80rpx;
margin-right: 16rpx;
vertical-align: middle;
border-radius: 50%;
background: #1777FF;
}
.info {
flex: 1;
.infos_title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8rpx;
.infos {
font-size: 28rpx;
font-weight: bold;
color: #232323;
line-height: 42rpx;
}
.time {
font-size: 22rpx;
font-weight: 400;
color: #999999;
}
}
.preview {
font-size: 24rpx;
font-weight: 400;
color: #999999;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
margin-top: 16rpx;
}
}
}
}
</style>

122
pages/index/system.vue Normal file
View File

@@ -0,0 +1,122 @@
<template>
<view class="content safe-area-inset-bottom">
<!-- 描述 -->
<view class="info" v-for="item in list" :key="item.id" @click="next(item.base_type,item.id,item.data)">
<view class="infos_title">
<text class="infos">系统消息</text>
<text class="time">{{item.notice_at}}</text>
</view>
<view class="preview">
{{item.content}}
</view>
</view>
<!-- 为空 -->
<view class="empty">
<u-empty text="暂无系统消息" mode="list" v-if="list.length==0"></u-empty>
</view>
</view>
</template>
<script>
import {
getseesionSystem
} from '../../request/api/api'
export default {
data() {
return {
list: []
}
},
onLoad() {
},
methods: {
goInfo() {
getseesionSystem({
method: "get",
data: {
store_id: uni.getStorageSync('store_id') || 11001
}
}).then((res) => {
// console.log(res, 'res');
this.list = res.data.data.list
})
},
next(type,id,data){
// if(type==7&&id){
// uni.navigateTo({
// url: '/subPackages/my/my-drug/drug-info?id=' + id
// })
// }
if(type==4&&data){
uni.navigateTo({
url: "/subPackages/my/myrecord-detail?no=" + data
})
}
}
},
mounted() {
this.goInfo()
}
}
</script>
<style lang="scss" scoped>
.content {
width: 750rpx;
max-height: 100%;
min-height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
background: #F5F5F5;
.empty {
width: 100vw;
max-height: 100vh;
margin: 0 auto;
padding: 300rpx 0;
}
.info {
width: 750rpx;
padding: 32rpx 40rpx;
height: 156rpx;
background: #FFFFFF;
font-family: PingFang SC-Medium, PingFang SC;
margin-bottom: 20rpx;
.infos_title {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 8rpx;
.infos {
font-size: 28rpx;
font-weight: bold;
color: #232323;
line-height: 42rpx;
}
.time {
font-size: 22rpx;
font-weight: 400;
color: #999999;
}
}
.preview {
font-size: 24rpx;
font-weight: 400;
color: #999999;
display: -webkit-box;
-webkit-line-clamp: 1;
-webkit-box-orient: vertical;
text-overflow: ellipsis;
overflow: hidden;
margin-top: 16rpx;
}
}
}
</style>

386
pages/login/login.vue Normal file
View File

@@ -0,0 +1,386 @@
<template>
<view class="container safe-area-inset-bottom">
<view class="none">
<!-- 授权登录 -->
<view class="conter">
<view class="title">
欢迎登录
</view>
<image src="@/static/empty/login.png" mode="aspectFit"></image>
<button class="btn" :class="form['check']?'':'bg'" :disabled="!form['check']" open-type="getPhoneNumber"
@getphonenumber="getPhoneNumber">手机号一键注册</button>
<view class="word">
<u-icon size="35" :color="form['check']?'#2979FF':'#E5E5E5'" name="checkmark-circle-fill"
@click="form['check']=!form['check']"></u-icon>
<view class="agreement">
我已阅读并同意
<text @click="getInfo(1)">用户服务协议</text>
<text @click="getInfo(2)">隐私政策</text>
</view>
</view>
<view class="text" @click="back">取消登录</view>
<!-- <view class="footer" @click="toLogon">
输入其他手机号码注册
</view> -->
</view>
</view>
<u-popup v-model="show" :safe-area-inset-bottom="true" mode="bottom" height="88%" border-radius="20"
:closeable="true">
<view class="agreen">
<u-parse :html="content"></u-parse>
</view>
</u-popup>
<u-toast ref="uToast" />
</view>
</template>
<script>
import {
getAgreem,
getLogin,
getsLogin
} from '../../request/api/api.js'
export default {
data() {
return {
code: "",
form: {
check: false
},
encryptedData: "",
iv: "",
session_key: "",
show: false,
content: ``,
type: 1,
id: 1,
isShow_envVersion: uni.getStorageSync('isShow_envVersion')
}
},
onLoad(e) {
this.type = e.type
this.id = e.id
uni.removeStorageSync('token')
uni.removeStorageSync('userinfo')
},
created() {
},
methods: {
back() {
uni.navigateBack({ delta: 1 })
},
getPhoneNumber(e) {
uni.showLoading({
title: "加载中"
});
if (!this.form['check']) {
uni.showToast({
icon: "error",
title: '请勾选协议'
})
return
}
if (e.detail.errMsg && e.detail.errMsg == 'getPhoneNumber:fail user deny') {
// uni.showToast({
// icon: "error",
// title: '未获取手机号码'
// })
this.$refs.uToast.show({
title: '未获取手机号码',
type: 'default',
icon: false
})
return
}
this.encryptedData = e.detail.encryptedData; //需要解密的内容
this.iv = e.detail.iv; //偏移量
this.code = e.detail.code
// console.log(e);
let data = {
iv: this.iv,
encryptedData: this.encryptedData,
code: this.code,
store_id: '11001'
}
getLogin({
method: 'post',
data: data
}).then((res) => {
// console.log(res, 'login');
if (res.data.errcode == 0) {
if (this.type == 1) {
uni.navigateTo({
url: "/pages/home/index-list?id=" + this.id,
fail: (e) => {
// console.log(e);
},
success() {
uni.showToast({
title: '登陆成功',
duration: 2000
});
uni.hideLoading();
}
})
return
}
// 进入h5 token是登录返回的platform_token user_id是萧康的用户id
uni.setStorageSync('token_h5', res.data.data.plate_token)
// setTimeout(() => {
// this.getH5();
// }, 100)
uni.reLaunch({
url: "/pages/home/home",
fail: (e) => {
// console.log(e);
},
success() {
uni.showToast({
title: '登陆成功',
duration: 2000
});
uni.hideLoading();
}
})
} else {
uni.showToast({
icon: "error",
title: res.data.msg
})
}
})
},
toLogon() {
uni.navigateTo({
url: '/pages/login/logon',
fail: function(res) {
// console.log(res);
}
})
},
// 协议
getInfo(e) {
this.show = true
getAgreem({
method: "post",
data: {
end: 1,
store_id: uni.getStorageSync('store_id') || '11001',
}
}).then((res) => {
// console.log(res);
if (e == 1) {
this.content = res.data.data[0].content
} else {
this.content = res.data.data[1].content
}
})
},
getToLogin() {
uni.login({
provider: 'weixin',
success: (loginRes) => {
this.code = loginRes.code
// console.log(loginRes.code);
getsLogin({
method: "post",
data: {
code: this.code,
status: 1
}
}).then((res) => {
// console.log(res, "res");
if (res.data.errcode == 0) {
uni.setStorageSync('token', res.data.data.token) //存储token
uni.setStorageSync('user_id', res.data.data.data.user.id)
uni.setStorageSync('userinfo', res.data.data.data['user'])
} else if (res.data.errcode != 0) {
// uni.showToast({
// icon: "error",
// title: res.data.msg
// })
this.$refs.uToast.show({
title: res.data.msg,
type: 'default',
icon: false
})
}
})
}
})
},
// subScriptionMessage() {
// },
// getH5() {
// // 进入token
// uni.request({
// url: 'https://hy.api.ctkj88.com/platform/v1/user/login',
// header: {
// "authorization": uni.getStorageSync(
// "token_h5"),
// "Content-Type": "application/x-www-form-urlencoded"
// },
// method: 'POST',
// timeout: 10000,
// data: {
// user_id: uni.getStorageSync('user_id')
// },
// success: (res) => {
// // console.log(res, 'h5-token');
// // uni.setStorageSync('platform_id', res.data.data.platform_id)
// uni.setStorageSync('token_platform_id', res.data.data.token)
// },
// fail(res) {
// // console.log(res, 'fail-h5');
// }
// })
// }
},
mounted() {
const token = uni.getStorageSync('token')
const user_id = uni.getStorageSync('user_id')
const userInfo = uni.getStorageSync('userinfo')
const token_h5 = uni.getStorageSync('token_h5')
if (token && user_id && userInfo && token_h5) {
uni.reLaunch({
url: "/pages/home/home",
})
} else {
uni.removeStorageSync('token')
uni.removeStorageSync('user_id')
this.getToLogin();
}
}
}
</script>
<style lang="scss" scoped>
.text {
margin-top: 20rpx;
color: #666;
}
.container {
width: 100vw;
height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
.none {
width: 750rpx;
padding-top: 100rpx;
background: linear-gradient(180deg, #EAF2FF 0%, #FFFFFF 100%);
.conter {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin: 0rpx auto 380rpx;
image {
width: 431rpx;
height: 339rpx;
vertical-align: middle;
margin-bottom: 110rpx;
}
.title {
font-size: 48rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
margin-bottom: 114rpx;
}
.word {
display: flex;
flex-direction: row;
color: #475569;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
margin-top: 34rpx;
.agreement {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6C7380;
margin-left: 16rpx;
text {
color: #2979FF;
size: 24rpx;
}
}
}
.footer {
width: 710rpx;
height: 90rpx;
line-height: 90rpx;
position: fixed;
bottom: 60rpx;
left: 0;
text-align: center;
font-size: 26rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #232323;
margin: 0 auto;
}
.btn {
width: 648rpx;
height: 88rpx;
background: #4175EE;
line-height: 88rpx;
font-size: 32rpx;
text-align: center;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 400;
color: #FFFFFF;
border-radius: 64rpx;
}
.bg {
width: 648rpx;
height: 88rpx;
background: #8ABAFF;
line-height: 88rpx;
font-size: 32rpx;
text-align: center;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 400;
color: #FFFFFF;
border-radius: 64rpx;
}
}
}
.agreen {
padding: 60rpx 50rpx 20rpx;
}
}
</style>

343
pages/login/logon.vue Normal file
View File

@@ -0,0 +1,343 @@
<template>
<view class="container safe-area-inset-bottom">
<view class="title">
欢迎注册新账号
</view>
<view class="box">
<view class="info">
<view class="pwd">
<d-input :maxlength="11" height="96" v-model="form['mobile']"
:prefixIcon="require('../../static/choose/act.png')" borderRadius="96rpx" prefixIconSize="40rpx"
placeholder="请输入手机号" @blur="check" @input="is_d=false" :placeholder-style="{fontSize:'32rpx'}"
:custom-style="{fontSize:'32rpx',paddingLeft:'60rpx'}" />
</view>
<view class="pwd">
<u-field v-model="code" placeholder="请填写验证码" :placeholder-style="{fontSize:'32rpx'}">
<u-button size="mini" slot="right" @click="getCode">{{codeText}}</u-button>
</u-field>
<u-verification-code ref="uCode" @change="codeChange" class="code">
</u-verification-code>
</view>
<view class="flex-row" style="margin-top: 88rpx;">
<u-icon size="35" :color="form['check']?'#2979FF':'#F3F4F5'" name="checkmark-circle-fill"
@click="form['check']=!form['check']"></u-icon>
<view class="agreement">
我已阅读并同意
<text @click="getInfo(1)">用户服务协议</text>
<text @click="getInfo(2)">隐私权政策</text>
</view>
</view>
<view class="btn" :class="form['check']?'':'bg'">
<u-button :throttle-time="20" shape="circle" @click="register" :disabled="!form['check']">
立即注册</u-button>
</view>
</view>
</view>
<u-popup v-model="show" :safe-area-inset-bottom="true" mode="bottom" height="68%" border-radius="20"
:closeable="true">
<view class="agreen">
<u-parse :html="content"></u-parse>
</view>
</u-popup>
<u-toast ref="uToast" />
</view>
</template>
<script>
import {
getAgreem,
getCodes,
getsLogin
} from '../../request/api/api';
export default {
data() {
return {
form: {
check: false
},
is_d: false,
statusBarHeight: this.$statusBarHeight,
navbarHeight: this.$navbarHeight,
mobile: '',
code: '',
codeText: '',
time: "",
};
},
onLoad(e) {
},
methods: {
check() {
this.getCode()
},
getCode() {
if (this.form['mobile'] == '') {
// uni.showToast({
// title: '手机号不能为空',
// duration: 2000,
// icon: 'error'
// });
this.$refs.uToast.show({
title: '手机号不能为空',
type: 'default',
icon: false
})
return
}
if (!/^1[345678]\d{9}$/.test(this.form['mobile'])) {
// uni.showToast({
// title: '请输入正确的手机号',
// duration: 2000,
// icon: 'error'
// });
this.$refs.uToast.show({
title:'请输入正确的手机号',
type: 'default',
icon: false
})
return
}
let data = {
mobile: this.form['mobile'],
store_id: '11001'
}
getCodes({
method: 'post',
data: data
}).then((res) => {
// console.log(res, 'code');
if (res.data.errcode == 0) {
uni.setStorageSync('smsCode', res.data.data.smsCode)
}
if (this.$refs.uCode.canGetCode) {
// 模拟向后端请求验证码
uni.showLoading({
title: '正在获取验证码'
})
setTimeout(() => {
uni.hideLoading();
// 通知验证码组件内部开始倒计时
this.$refs.uCode.start();
}, 1000);
} else {
this.$u.toast('倒计时结束后再发送');
}
})
},
register() {
if (this.form['pwd'] == []) {
uni.showToast({
title: '请输入验证码',
duration: 2000,
icon: 'error'
});
return
}
if (!this.form['check']) {
uni.showToast({
title: '请勾选协议',
duration: 2000,
icon: 'error'
});
return
}
uni.showLoading({
title: "加载中"
});
uni.removeStorageSync('token')
let data = {
mobile: this.form['mobile'],
smsCode: this.code,
store_id: '11001',
status: 3
}
getsLogin({
method: "post",
data: data
}).then(res => {
// console.log(res,'ress');
if (res.data.errcode == 0) {
uni.setStorageSync('token', res.data.data.token)
uni.reLaunch({
url: "/pages/home/home",
fail: (e) => {
// console.log(e);
},
success() {
uni.showToast({
title: '登陆成功',
duration: 2000
});
uni.hideLoading();
}
})
} else {
uni.showToast({
icon: "error",
title: '登陆失败'
})
}
uni.hideLoading();
}).catch(() => {
uni.hideLoading();
})
},
// 协议
getInfo(e) {
this.show = true
getAgreem({
method: "post",
data: {
end: 1,
store_id: '11001'
}
}).then((res) => {
console.log(res);
if (e == 1) {
this.content = res.data.data[0].content
} else {
this.content = res.data.data[1].content
}
})
},
checkboxChange(val) {
console.log(val);
},
codeChange(text) {
this.codeText = text;
},
}
};
</script>
<style lang="scss" scoped>
.container {
width: 100vw;
height: 100vh;
padding-bottom: env(safe-area-inset-bottom);
}
.title {
width: 750rpx;
padding-top: 100rpx;
text-align: center;
font-size: 48rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #0D111A;
background: linear-gradient(180deg, #EAF2FF 0%, #FFFFFF 100%);
margin-bottom: 60rpx;
}
.flex-row {
display: flex;
flex-direction: row;
margin-bottom: 34rpx;
.agreement {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6C7380;
margin-left: 16rpx;
text {
color: #2979FF;
size: 24rpx;
}
}
}
.box {
box-sizing: border-box;
padding: 0 52rpx;
}
.code {
font-size: 32rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #1777FF;
background: #F9FAFB;
}
.agreement {
font-size: 24rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6C7380;
margin-left: 16rpx;
}
.pwd {
width: 646rpx;
height: 96rpx;
background: #F9FAFB;
border-radius: 48rpx 48rpx 48rpx 48rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #CCCCCC;
margin: 0rpx 0 30rpx;
::v-deep button {
color: #1777FF;
border: 0;
}
}
.hint {
margin-top: 80rpx;
font-size: 28rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6C7380;
}
.btn {
::v-deep button {
width: 648rpx;
height: 100rpx;
line-height: 100rpx;
background: #4175EE;
border: 0;
font-size: 32rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #FFFFFF;
}
}
.bg {
::v-deep button {
width: 648rpx;
height: 100rpx;
line-height: 100rpx;
background: #8ABAFF;
border: 0;
font-size: 32rpx;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #FFFFFF;
}
.agreen {
padding: 60rpx 50rpx 20rpx;
}
}
</style>

337
pages/mine/mine.vue Normal file
View File

@@ -0,0 +1,337 @@
<template>
<view class="container safe-area-inset-bottom">
<!-- 头部 -->
<view class="head">
<view class="head_img">
<image :src="infoList.user.avatarurl || '/static/mine/mr_tx.png' " mode=""></image>
</view>
<view class="head_info">
<view class="head_name">
{{infoList.user.nickname || '微信用户'}}
</view>
<view class="head_id" @click="toInfo">
个人主页
<text class="iconfont icon-jiantou1"></text>
</view>
</view>
<view class="head_icon" @click="toSet">
<text class="iconfont icon-bg-setup"></text>
</view>
</view>
<!-- 我的订单 -->
<view class="card_order">
<view class="title">
产品订单
<view class="all" @click="toAll(0)">
查看全部 <text class="iconfont icon-jiantou1"></text>
</view>
</view>
<view class="info">
<view class="item" @click="toAll(1)" style="position: relative;">
<image src="/static/mine/dfk.png" mode=""></image>
<text>待付款</text>
<u-badge type="error" :count="infoList.ProductOrder.unpay" :offset="[-2,20]"></u-badge>
</view>
<view class="item" @click="toAll(2)" style="position: relative;">
<image src="/static/mine/dfh.png" mode=""></image>
<text>待发货</text>
<u-badge type="error" :count="infoList.ProductOrder.wait_send" :offset="[-2,20]"></u-badge>
</view>
<view class="item" @click="toAll(3)" style="position: relative;">
<image src="/static/mine/dsh.png" mode=""></image>
<text>待收货</text>
<u-badge type="error" :count="infoList.ProductOrder.wait_accept" :offset="[-2,20]"></u-badge>
</view>
<view class="item" @click="toAll(4)">
<image src="/static/mine/tk.png" mode=""></image>
<text>已完成</text>
</view>
</view>
</view>
<!-- 我的记录 -->
<view class="card" v-if="isShow_envVersion==false">
<view class="title">
我的记录
</view>
<!-- 列表 -->
<view class="list">
<!-- <navigator url="../../subPackages/my/myorder" class="infos">
<image src="@/static/mine/01.png" mode=""></image>
<text>问诊记录</text>
</navigator> -->
<navigator url="../../subPackages/my/myrecord" class="infos">
<image src="@/static/mine/02.png" mode=""></image>
<text>处方记录</text>
</navigator>
<navigator url="../../subPackages/my/myappiont" class="infos">
<image src="@/static/mine/03.png" mode=""></image>
<text>挂号记录</text>
</navigator>
</view>
</view>
<!-- 常用工具 -->
<view class="card">
<view class="title">
常用工具
</view>
<!-- 列表 -->
<view class="list">
<navigator class="infos" url="../../subPackages/my/myinfo" v-if="isShow_envVersion==false">
<image src="@/static/mine/jzr.png" mode=""></image>
<text>就诊人管理</text>
</navigator>
<navigator url="../../subPackages/setup/area-list" class="infos">
<image src="@/static/mine/gy.png" mode=""></image>
<text>收货地址</text>
</navigator>
<navigator url="../../subPackages/setup/customer-service" class="infos">
<image src="@/static/mine/kfzx.png" mode=""></image>
<text>客服中心</text>
</navigator>
</view>
</view>
</view>
</template>
<script>
import {
getuserInfo
} from '../../request/api/api'
export default {
data() {
return {
infoList: [],
isShow_envVersion:uni.getStorageSync('isShow_envVersion')
}
},
onLoad() {
},
methods: {
toInfo() {
uni.navigateTo({
url: '/subPackages/my/mycollection'
})
},
toAll(e) {
uni.navigateTo({
url: '/subPackages/my/my-drug/drug-list?index=' + e
})
},
toSet() {
uni.navigateTo({
url: '/subPackages/setup/filed'
})
},
// 用户信息
getInfo() {
getuserInfo({
method: "post",
data: {
store_id: uni.getStorageSync('store_id') || 11001
}
}).then((res) => {
// console.log(res, 'ingo');
if (res.data.errcode == 0) {
this.infoList = res.data.data
}
})
},
},
mounted() {
this.getInfo();
},
onShow() {
this.getInfo();
}
}
</script>
<style lang="scss" scoped>
.container {
max-height: 100%;
width: 100vw;
min-height: 100vh;
width: 100vw;
height: 100vh;
background: #F8FAFC;
padding-bottom: env(safe-area-inset-bottom);
.head {
width: 750rpx;
height: 168rpx;
background: #4175EE;
display: flex;
justify-content: space-around;
align-items: center;
padding: 40rpx;
.head_img {
width: 116rpx;
height: 116rpx;
margin-right: 30rpx;
image {
width: 116rpx;
height: 116rpx;
border-radius: 50%;
vertical-align: middle;
}
}
.head_info {
width: 500rpx;
.head_name {
font-size: 28rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #FFFFFF;
}
.head_id {
font-size: 24rpx;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #FFFFFF;
margin-top: 12rpx;
.iconfont {
font-size: 24rpx;
color: #fff;
margin-left: 12rpx;
}
}
}
.head_icon {
.iconfont {
font-size: 52rpx;
color: #fff;
}
}
}
.card_order {
width: 750rpx;
background: #FFFFFF;
border-radius: 8rpx;
border: 2rpx solid #FFFFFF;
padding: 32rpx 54rpx;
.title {
font-size: 28rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
margin-bottom: 40rpx;
display: flex;
align-items: center;
justify-content: space-between;
.all {
font-size: 24rpx;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #999999;
.iconfont {
font-size: 24rpx;
color: #999999;
margin-left: 8rpx;
}
}
}
.info {
width: 646rpx;
display: flex;
justify-content: space-around;
align-items: center;
margin: 0 auto;
.item {
width: 120rpx;
display: flex;
flex-direction: column;
align-items: center;
image {
width: 80rpx;
height: 80rpx;
margin-bottom: 24rpx;
}
text {
font-size: 28rpx;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #232323;
}
}
}
}
.card {
width: 710rpx;
height: 268rpx;
background-color: #fff;
border-radius: 8rpx;
margin: 20rpx auto;
padding: 32rpx;
display: flex;
flex-direction: column;
justify-content: center;
.title {
font-size: 32rpx;
font-family: PingFang SC-Bold, PingFang SC;
font-weight: bold;
color: #232323;
word-spacing: 2rpx;
margin-bottom: 14rpx;
}
.list {
width: 626rpx;
display: flex;
align-items: center;
margin: 0 auto;
.infos {
width: 140rpx;
display: flex;
flex-direction: column;
align-items: center;
margin-right: 60rpx;
image {
width: 80rpx;
height: 80rpx;
vertical-align: middle;
margin-bottom: 12rpx;
}
text {
font-size: 28rpx;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #232323;
}
}
}
}
}
</style>

496
request/api/api.js Normal file
View File

@@ -0,0 +1,496 @@
import http from './request'
// 登录 授权 其他手机号授权
export async function getsLogin(params) {
let data = await http('/oldApi/v1/user/login', params)
return data
}
// 登录 手机号授权
export async function getLogin(params) {
let data = await http('/oldApi/v1/user/phone-number', params)
return data
}
// 登录 手机号登录发送短信
export async function getCodes(params) {
let data = await http('/oldApi/v1/user/send-code', params)
return data
}
// 登录
export async function getLogon(params) {
let data = await http('/oldApi/v1/user/phone-number', params)
return data
}
// 用户 协议
export async function getAgreem(params) {
let data = await http('/oldApi/v1/user/agreement', params)
return data
}
// 首页 门店 门店切换
export async function storeChange(params) {
let data = await http('/oldApi/v1/store/store-change', params)
return data
}
// 首页 门店 用户所有门店
export async function storeList(params) {
let data = await http('/oldApi/v1/store/list', params)
return data
}
// 首页 门店 门店信息
export async function storeInfo(params) {
let data = await http('/oldApi/v1/store/info', params)
return data
}
// 医生列表
export async function doctorList(params) {
let data = await http('/oldApi/v1/doctor/all-list', params)
return data
}
// 医生详情
export async function doctorDetail(params) {
let data = await http('/oldApi/v1/doctor/detail', params)
return data
}
// 科室列表
export async function getOfficeList(params) {
let data = await http('/oldApi/v1/doctor/office-list', params)
return data
}
// 医生 评价列表
export async function commentList(params) {
let data = await http('/oldApi/v1/doctor/comment-list', params)
return data
}
// 医生 评价列表顶部
export async function commentListTop(params) {
let data = await http('/oldApi/v1/doctor/top', params)
return data
}
// 医生 挂号信息
export async function registerList(params) {
let data = await http('/oldApi/v1/register/doc-register-info', params)
return data
}
// 就诊人列表
export async function userList(params) {
let data = await http('/oldApi/v1/patient/list', params)
return data
}
// 就诊人关系
export async function userRelation(params) {
let data = await http('/oldApi/v1/patient/relation', params)
return data
}
// 编辑就诊人信息
export async function userInfo(params) {
let data = await http('/oldApi/v1/patient/edit-patient', params)
return data
}
// 就诊人保存
export async function userAdd(params) {
let data = await http('/oldApi/v1/patient/save', params)
return data
}
// 就诊人详情
export async function userDetail(params) {
let data = await http('/oldApi/v1/patient/info', params)
return data
}
// 就诊人 切换默认接诊人
export async function userPatientChoose(params) {
let data = await http('/oldApi/v1/patient/change-patient', params)
return data
}
// 就诊人 - 健康信息
export async function userEidtPatient(params) {
let data = await http('/oldApi/v1/patient/health-info', params)
return data
}
// 挂号
export async function registe(params) {
let data = await http('/oldApi/v1/register/register', params)
return data
}
// 挂号详情
export async function registeInfo(params) {
let data = await http('/oldApi/v1/register/register-detail', params)
return data
}
// 支付挂号
export async function registePay(params) {
let data = await http('/oldApi/v1/register/pay', params)
return data
}
// 取消挂号
export async function registeUnpay(params) {
let data = await http('/oldApi/v1/register/cancel', params)
return data
}
// 挂号退款
export async function registeCancle(params) {
let data = await http('/oldApi/v1/register/refund', params)
return data
}
// 挂号列表
export async function registeList(params) {
let data = await http('/oldApi/v1/register/list', params)
return data
}
// 设置 服务协议
export async function service(params) {
let data = await http('/oldApi/v1/other/service', params)
return data
}
// 设置 客服热线
export async function serviceOnline(params) {
let data = await http('/oldApi/v1/other/service-line', params)
return data
}
// 设置 隐私保护政策
export async function servicePolicy(params) {
let data = await http('/oldApi/v1/other/policy', params)
return data
}
// 我的 添加收货地址
export async function getaddressAdd(params) {
let data = await http('/oldApi/v1/my/save-address', params)
return data
}
// 我的 收货地址列表
export async function getaddressList(params) {
let data = await http('/oldApi/v1/my/address-list', params)
return data
}
// 我的 修改收货地址
export async function getaddressEdit(params) {
let data = await http('/oldApi/v1/my/edit-address', params)
return data
}
// 我的 修改默认地址
export async function getDefault(params) {
let data = await http('/oldApi/v1/my/update-default', params)
return data
}
// 我的 删除收货地址
export async function getaddressDel(params) {
let data = await http('/oldApi/v1/my/del-address', params)
return data
}
// 我的 更新收货地址
// export async function getaddressNew(params) {
// let data = await http('/oldApi/v1/product-order/address-update', params)
// return data
// }
// 我的 用户信息
export async function getuserInfo(params) {
let data = await http('/oldApi/v1/user/info', params)
return data
}
// 我的 编辑信息
export async function getEditUser(params) {
let data = await http('/oldApi/v1/user/edit-info', params)
return data
}
// 我的 处方记录
export async function getPrescript(params) {
let data = await http('/oldApi/v1/my/prescription-list', params)
return data
}
// 我的 处方详情
export async function getPrescriptInfo(params) {
let data = await http('/oldApi/v1/my/prescription-detail', params)
return data
}
// 我的 处方支付
export async function getPrescriptPay(params) {
let data = await http('/oldApi/v1/product-order/pay', params)
return data
}
// 我的 处方-产品订单信息
export async function getProductInfo(params) {
let data = await http('/oldApi/v1/product-order/appoint-medicine', params)
return data
}
// 消息
// 消息首页 http://xiaokang.com/member/v1/system-notice/index?store_id=11001
export async function getseesionInfo(params) {
let data = await http('/oldApi/v1/system-notice/index', params)
return data
}
// 消息-订单消息 http://xiaokang.com/member/v1/system-notice/order?store_id=11001
export async function getseesionOrder(params) {
let data = await http('/oldApi/v1/system-notice/order', params)
return data
}
// 消息-系统消息 http://xiaokang.com/member/v1/system-notice/system?store_id=11001
export async function getseesionSystem(params) {
let data = await http('/oldApi/v1/system-notice/system', params)
return data
}
// 消息-已读消息 http://xiaokang.com/member/v1/system-notice/read
export async function getseesionRead(params) {
let data = await http('/oldApi/v1/system-notice/read', params)
return data
}
// 消息-医生信息列表
export async function getseesionDoctorList(params) {
let data = await http('/oldApi/v1/system-notice/doctor-news', params)
return data
}
// 消息-医生信息详情
export async function getseesionDoctor(params) {
let data = await http('/oldApi/v1/system-notice/new-info', params)
return data
}
// 开关 https://zjxk.api.ctkj88.com/member/v1/store/issue
export async function getOpen(params) {
let data = await http('/oldApi/v1/store/issue', params)
return data
}
// 中间页 product-order/online-to-local
export async function getToNext(params) {
let data = await http('/oldApi/v1/product-order/online-to-local', params)
return data
}
// 煎法 https://hy.api.ctkj88.com/member/v1/prescrip-order/use-way
export async function getUseWay(params) {
let data = await http('/oldApi/v1/prescrip-order/use-way', params)
return data
}
// 代煎费提示 https://app.xiaokang88.com/member/v1/product-order/decoct-service
export async function getUseWayPay(params) {
let data = await http('/oldApi/v1/product-order/decoct-service', params)
return data
}
// 更新配送方式 http://xiaokang.com/member/v1/product-order/update-delivery
export async function getDelivery(params) {
let data = await http('/oldApi/v1/product-order/update-delivery', params)
return data
}
// 更新代煎服务费用 http://xiaokang.com/member/v1/product-order/update-decoct-service
export async function getUpdateUseWay(params) {
let data = await http('/oldApi/v1/product-order/update-decoct-service', params)
return data
}
//资讯列表 /v1/info/article-list
export async function articleList(params) {
let data = await http('/oldApi/v1/info/article-list', params)
return data
}
//分类列表 /v1/info/categories
export async function categoriesList(params) {
let data = await http('/oldApi/v1/info/categories', params)
return data
}
//资讯详情 /v1/info/article-info
export async function articleInfo(params) {
let data = await http('/oldApi/v1/info/article-info', params)
return data
}
// v1/product-order/list
export async function getOrdlist(params) {
let data = await http('/oldApi/v1/product-order/list', params)
return data
}
// v1/product-order/list
export async function getToken(params) {
let data = await http('/oldApi/v1/user/login-platform', params)
return data
}
// v1/product-order/list
export async function getBanner(params) {
let data = await http('/oldApi/v1/store/detail', params)
return data
}
// 商城相关
// 药品分类
export async function drugCategorys(params) {
let data = await http('/newApi/drug/drugCategory', params)
return data
}
//药品列表
export async function drugLists(params) {
let data = await http('/newApi/drug/drugLists', params)
return data
}
//药品详情
export async function drugDetails(params) {
let data = await http('/newApi/drug/drugDetail', params)
return data
}
//药品运费ee
export async function drugFee(params) {
let data = await http('/newApi/express/feeInfo', params)
return data
}
//加入购物车
export async function addCart(params) {
let data = await http('/newApi/cart/cartAdd', params)
return data
}
//购物车列表
export async function CartList(params) {
let data = await http('/newApi/cart/cartLists', params)
return data
}
//订单预览
export async function OrderPreview(params) {
let data = await http('/newApi/order/preview', params)
return data
}
//支付接口
export async function PayList(params) {
let data = await http('/newApi/order/submit', params)
return data
}
//获取支付配置
// export async function getPayConfig(params) {
// let data = await http('/newApi/order/getPay', params)
// return data
// }
export async function getPayConfig(params) {
let data = await http('/oldApi/v1/product-order/pay', params)
return data
}
// getOrdlist 获取订单列表 https://zjxk.app.ctkj88.com/member/order/lists
// export async function getOrdlist(params) {
// let data = await http('/newApi/order/lists', params)
// return data
// }
// 取消订单 https://app.xiaokang88.com/member/v1/product-order/cancel
export async function getCancle(params) {
let data = await http('/oldApi/v1/product-order/cancel', params)
return data
}
// 订单详情 https://zjxk.app.ctkj88.com/member/order/detail
// export async function getOrdDetail(params) {
// let data = await http('/newApi/order/detail', params)
// return data
// }
// 更换 订单详情 https://app.xiaokang88.com/member/v1/product-order/info
export async function getOrdDetail(params) {
let data = await http('/oldApi/v1/product-order/info', params)
return data
}
// 申请退款原因 https://app.xiaokang88.com/member/v1/product-order/refund-reason
export async function getRefundReson(params) {
let data = await http('/oldApi/v1/product-order/refund-reason', params)
return data
}
// 申请退款信息 https://app.xiaokang88.com/member/v1/product-order/refund-base
export async function infoRefundBase(params) {
let data = await http('/oldApi/v1/product-order/refund-base', params)
return data
}
//申请退款提交 http://xiaokang.com/member/v1/product-order/refund
export async function postRefundBased(params) {
let data = await http('/oldApi/v1/product-order/refund', params)
return data
}
//物流详情
// export async function getLogistics(params) {
// let data = await http('/newApi/order/expressDetail', params)
// return data
// }
export async function getLogistics(params) {
let data = await http('/oldApi/v1/product-order/express', params)
return data
}
//确认收货 https://zjxk.app.ctkj88.com/member/order/confirm
// https://zjxk.app.ctkj88.com/member/order/confirm
export async function confirmAccept(params) {
let data = await http('/newApi/order/confirm', params)
return data
}
//清空购物车
export async function clearAll(params) {
let data = await http('/newApi/cart/clearAll', params)
return data
}
export async function getVersion(params) {
let data = await http('/v1/other/xcx-version?store_id=11001', params)
return data
}

4
request/api/config.js Normal file
View File

@@ -0,0 +1,4 @@
// module.exports = {
// base_url: "http://zjxk.api.ctkj88.com/member",
// base_url2:"https://xiaokang.shop.nbxlmy.com/member"
// }

6
request/api/im.js Normal file
View File

@@ -0,0 +1,6 @@
import http from './request'
// 发信息
// export async function sendMsg(params) {
// let data = await http('/v1/im/message-send', params)
// return data
// }

52
request/api/request.js Normal file
View File

@@ -0,0 +1,52 @@
function request(url, params) {
let baseURL = "https://app.xiaokang88.com/member"
if (url.split('/').indexOf('newApi') !== -1) {
baseURL = "https://shop.xiaokang88.com/member"
}
url = url.replace('/oldApi', '');
url = url.replace('/newApi', '');
// promise导出
return new Promise((resolve, reject) => {
uni.request({
// 基地址 + 传过来的地址
url: baseURL + url,
timeout: 8000, // 8秒超时时间单位ms
// 展开传过来的数据 请求方式 所需数据 wxfc279dcf921a38f7
// store_id: '11001'
...params,
// 请求头
header: {
"authorization": 'Bearer ' + uni.getStorageSync("token"),
"Content-Type": "application/x-www-form-urlencoded"
},
// 成功钩子
success(res) {
if (res.data.errcode === 401) {
uni.reLaunch({ url: '/pages/login/login' })
}
resolve(res)
},
// 失败钩子
fail(err) {
reject(err)
uni.showToast({
title: "请求失败",
duration: 1500,
mask: false,
icon:"error"
})
},
// 成功失败都会执行的钩子
complete() {
// 成功或者失败停止下拉刷新
uni.stopPullDownRefresh()
}
})
})
}
// 导出
export default request

BIN
static/choose/act.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

BIN
static/choose/choosed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1019 B

BIN
static/choose/pwd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/empty/adduser.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
static/empty/gwc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
static/empty/kong.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
static/empty/login.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
static/empty/order.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
static/empty/orders.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
static/empty/txyc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
static/empty/wddz.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
static/empty/wlyc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
static/empty/yhq.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
static/group/xkyard.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
static/home/01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 996 B

BIN
static/home/02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
static/home/03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 790 B

BIN
static/home/04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 782 B

BIN
static/home/05.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
static/home/06.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
static/home/07.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
static/home/08.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
static/home/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

BIN
static/home/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

BIN
static/home/bg01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
static/home/bg02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
static/home/bg1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
static/home/bg2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
static/home/delect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 870 B

BIN
static/home/gwc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 859 B

Binary file not shown.

Binary file not shown.

Binary file not shown.

443
static/iconfont/index.css Normal file
View File

@@ -0,0 +1,443 @@
@font-face {
font-family: 'iconfont'; /* Project id 3754703 */
src: url('//at.alicdn.com/t/c/font_3754703_s8i9p0pooz.woff2?t=1677828748078') format('woff2'),
url('//at.alicdn.com/t/c/font_3754703_s8i9p0pooz.woff?t=1677828748078') format('woff'),
url('//at.alicdn.com/t/c/font_3754703_s8i9p0pooz.ttf?t=1677828748078') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-bianji:before {
content: "\e6ab";
}
.icon-yonghuguanli:before {
content: "\e628";
}
.icon-guanliyuan:before {
content: "\e624";
}
.icon-qiehuan:before {
content: "\e688";
}
.icon-bg-setup:before {
content: "\e644";
}
.icon-daifahuo:before {
content: "\e706";
}
.icon-mendian:before {
content: "\e682";
}
.icon-shouye-shouye:before {
content: "\e623";
}
.icon-saying:before {
content: "\e631";
}
.icon-shangchuantupian:before {
content: "\e622";
}
.icon-shezhixitongshezhigongnengshezhishuxing:before {
content: "\e795";
}
.icon-shensufuwu:before {
content: "\e605";
}
.icon-guahao:before {
content: "\fb2c";
}
.icon-zhuanzhang:before {
content: "\e60e";
}
.icon-paiduiquhao:before {
content: "\e6d6";
}
.icon-yh-shipin:before {
content: "\e66b";
}
.icon-xiaoche:before {
content: "\100de";
}
.icon-ys-xuanzhong:before {
content: "\e627";
}
.icon-yh-zaixianwenzhen2:before {
content: "\100e0";
}
.icon-jiantou9:before {
content: "\e60b";
}
.icon-jiantou:before {
content: "\e6b6";
}
.icon-jiantou2:before {
content: "\e6b7";
}
.icon-guanbi:before {
content: "\e6de";
}
.icon-jia:before {
content: "\e6e6";
}
.icon-31erweima:before {
content: "\e601";
}
.icon-wenjian:before {
content: "\e793";
}
.icon-24gf-tags:before {
content: "\e885";
}
.icon-chufang:before {
content: "\e65d";
}
.icon-shoucang1:before {
content: "\e609";
}
.icon-hl_xiangshang:before {
content: "\e60c";
}
.icon-hl_xiangxia:before {
content: "\e60d";
}
.icon-wode_shezhi:before {
content: "\e611";
}
.icon-31tishi:before {
content: "\e602";
}
.icon-jiahao:before {
content: "\e726";
}
.icon-shouhuodizhi:before {
content: "\e64f";
}
.icon-icon_collect:before {
content: "\e603";
}
.icon-tel:before {
content: "\e61e";
}
.icon-mass:before {
content: "\e61b";
}
.icon-lingdang-xianxing:before {
content: "\e8c0";
}
.icon-lvzhou_duanxinxiangqing:before {
content: "\e625";
}
.icon-huiyuan:before {
content: "\e632";
}
.icon-shanchu:before {
content: "\e61a";
}
.icon-yanjing_yincang:before {
content: "\eb45";
}
.icon-jieshao:before {
content: "\e72f";
}
.icon-24gf-photoAlbum:before {
content: "\e9f4";
}
.icon-xiajiantou-tianchong:before {
content: "\e73a";
}
.icon-chufang1:before {
content: "\e675";
}
.icon-yuyin:before {
content: "\e8c1";
}
.icon-shouye:before {
content: "\e731";
}
.icon-dizhi:before {
content: "\e618";
}
.icon-duihua:before {
content: "\e72a";
}
.icon-shipintonghua:before {
content: "\e6db";
}
.icon-tuichu:before {
content: "\e7ed";
}
.icon-shijian:before {
content: "\e613";
}
.icon-gerenzhongxin:before {
content: "\e6a4";
}
.icon-jiankang-xianxing2-0:before {
content: "\e685";
}
.icon-guanbi1:before {
content: "\ec4a";
}
.icon-yuyin1:before {
content: "\e66c";
}
.icon-fill_jianjie:before {
content: "\e686";
}
.icon-yishengchufang:before {
content: "\e68d";
}
.icon-yisheng:before {
content: "\e749";
}
.icon-shoucang2:before {
content: "\e60f";
}
.icon-wode_erweima:before {
content: "\e651";
}
.icon-guahao1:before {
content: "\e604";
}
.icon-wode_guanyu:before {
content: "\e614";
}
.icon-wode_yiguanzhu:before {
content: "\e659";
}
.icon-wode1:before {
content: "\e606";
}
.icon-wode4:before {
content: "\e607";
}
.icon-wode3:before {
content: "\e608";
}
.icon-wode2:before {
content: "\e615";
}
.icon-kefu:before {
content: "\e616";
}
.icon-yiyuan:before {
content: "\e71c";
}
.icon-qingchu:before {
content: "\e61f";
}
.icon-dunpai-:before {
content: "\e684";
}
.icon-lingdang:before {
content: "\e8c2";
}
.icon-emichenggong:before {
content: "\e63d";
}
.icon-31qichejinrong:before {
content: "\e617";
}
.icon-qiche:before {
content: "\e657";
}
.icon-iconfontzhizuobiaozhun49:before {
content: "\e630";
}
.icon-icon-:before {
content: "\e708";
}
.icon-qiche1:before {
content: "\ec6d";
}
.icon-qiche2:before {
content: "\e619";
}
.icon-zhongbiaoshijian:before {
content: "\e61c";
}
.icon-quxiao:before {
content: "\e642";
}
.icon-xianshi_quxiao:before {
content: "\e620";
}
.icon-cancel-test:before {
content: "\e61d";
}
.icon-quxiao1:before {
content: "\e621";
}
.icon-jingshi:before {
content: "\e600";
}
.icon-qianqianqian:before {
content: "\e656";
}
.icon-yh-tupian:before {
content: "\e6e5";
}
.icon-qiandai:before {
content: "\e626";
}
.icon-tuihuobaozhang:before {
content: "\e6d0";
}
.icon-biyanjing:before {
content: "\e901";
}
.icon-saoyisao:before {
content: "\e610";
}
.icon-yaoshizixun:before {
content: "\e637";
}
.icon-xueshengtijianshuju:before {
content: "\e612";
}
.icon-ys-mima:before {
content: "\e62f";
}
.icon-yh-zaixianwenzhen1:before {
content: "\e687";
}
.icon-qianzibi:before {
content: "\e660";
}
.icon-xiangji:before {
content: "\e8bc";
}
.icon-yanjing:before {
content: "\e8bf";
}
.icon-ys-shoujihao:before {
content: "\e60a";
}
.icon-tijian-shi:before {
content: "\e6ed";
}
.icon-menu_yhsz:before {
content: "\e64e";
}
.icon-jiantou1:before {
content: "\e6b5";
}
.icon-yh-shipinwenzhen1:before {
content: "\e6c6";
}
.icon-yh-shipinwenzhen2-copy:before {
content: "\100df";
}

BIN
static/image/cf1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
static/image/dx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
static/image/fswz.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
static/image/hzxq.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
static/image/sp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
static/image/spdh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
static/image/zp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
static/mine/01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
static/mine/02.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
static/mine/03.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

BIN
static/mine/04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
static/mine/05.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

BIN
static/mine/avatar_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

BIN
static/mine/dfh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/mine/dfk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 971 B

BIN
static/mine/dsh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
static/mine/gy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/mine/jzr.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
static/mine/kfzx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
static/mine/mr_tx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
static/mine/shop_no.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
static/mine/tk.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
static/mine/zy_mr.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
static/share.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
static/shop/gwc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/shop/gwc_l.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Some files were not shown because too many files have changed in this diff Show More