This commit is contained in:
曹辉 2023-04-03 14:55:17 +08:00
parent ba2249188b
commit 884a9a8f1d
83 changed files with 3467 additions and 2204 deletions

40
App.vue
View File

@ -19,45 +19,5 @@
height: 100%;
color: #000000;
padding: 30rpx 0 150rpx 0;
.cards {
width: 94%;
margin: 0 auto;
box-shadow: 0px 0px 30rpx 0px rgba(108, 99, 255, 0.16);
background-color: #fff;
display: flex;
justify-content: space-evenly;
flex-wrap: wrap;
padding: 40rpx 0 200rpx 0;
border-radius: 25rpx;
.item {
width: 43%;
height: 300rpx;
margin-bottom: 40rpx;
border-radius: 25rpx;
position: relative;
.title {
width: 70%;
text-align: center;
font-size: 46rpx;
color: #FCFCFC;
position: absolute;
top: 58%;
left: 50%;
transform: translateX(-50%);
}
image {
width: 100rpx;
height: 100rpx;
position: absolute;
top: 20%;
left: 50%;
transform: translateX(-50%);
}
}
}
}
</style>

View File

@ -1,12 +1,13 @@
import request from "../request.js"
export function userPassWord(data) {
export function updateNursePersonCheck(data) {
return request({
url: `/nurseApp/personLogin/userPassWord`,
url: `/nurseApplet/personCenter/updateNursePersonCheck`,
method: 'POST',
data,
})
}
export function updateHeadAvatarHead(userId, File) {
return request({
url: `/nurseApp/personLogin/updateHeadAvatarHead?userId=${userId}&File=${File}`,
@ -20,3 +21,18 @@ export function nursePerson(phonenumber, password) {
method: 'GET'
})
}
export function nurseAppLoginSysUser(data) {
return request({
url: `/nurseApp/personLogin/nurseAppLoginSysUser`,
method: 'POST',
data,
})
}
export function personNurseStationLists(pageNum,pageSize) {
return request({
url: `/nurseApp/personLogin/personNurseStationLists?pageNum=${pageNum}&pageSize=${pageSize}`,
method: 'get'
})
}

View File

@ -1,9 +1,19 @@
import request from "./request.js"
import request from "../request.js"
export function selectMission(nursePersonId, orderStatus, pageNum, pageSize,nurseItemName) {
//工单list
export function selectMission(nursePersonId, orderStatus, pageNum, pageSize, nurseItemName) {
return request({
url: `/nurseApp/personLogin/selectMission?nursePersonId=${nursePersonId}&orderStatus=${orderStatus}&pageNum=${pageNum}&pageSize=${pageSize}&nurseItemName=${nurseItemName}`,
method: 'GET'
})
}
//接单
export function receiveOrders(data) {
return request({
url: `/nurseApplet/personWorkOrder/receiveOrders`,
method: 'post',
data
})
}

View File

@ -2,5 +2,5 @@
var baseurl = "http://192.168.16.49:8080";
var baseurl = "http://192.168.16.30:8080";
export default baseurl

View File

@ -1,9 +0,0 @@
import request from "../request.js"
export function updatePassword(phonenumber, password) {
return request({
url: `/nurseApp/personLogin/updatePassword?phonenumber=${phonenumber}&stationPersonPassword=${password}`,
method: 'POST'
})
}

9
api/homepage/index.js Normal file
View File

@ -0,0 +1,9 @@
import request from "../request.js"
//
export function selectOrderByNursePersonCount(nurserStationPresonId) {
return request({
url: `/nurseApp/personLogin/selectOrderByNursePersonCount?nurserStationPresonId=${nurserStationPresonId}`,
method: 'GET'
})
}

View File

@ -1,7 +1,18 @@
import request from "../request.js"
export function nursePerson(phonenumber,password) {
//个人信息查询护理站人员的个人信息
export function nurseAppletPersonCenter(nursePersonId) {
return request({
url: `/nurseApp/personLogin/nursePerson?phonenumber=${phonenumber}&stationPersonPassword=${password}`,
url: `/nurseApplet/personCenter/nurseAppletPersonCenter?nursePersonId=${nursePersonId}`,
method: 'GET'
})
}
// 护理员App和小程序护理员修改状态
export function updateNursePersonWorkStatus(data) {
return request({
url: `/nurseApplet/personCenter/updateNursePersonWorkStatus`,
method: 'post',
data
})
}

View File

@ -1,16 +0,0 @@
import request from "../request.js"
export function nurseAppLoginSysUser(data) {
return request({
url: `/nurseApp/personLogin/nurseAppLoginSysUser`,
method: 'POST',
data,
})
}
export function personNurseStationLists(pageNum,pageSize) {
return request({
url: `/nurseApp/personLogin/personNurseStationLists?pageNum=${pageNum}&pageSize=${pageSize}`,
method: 'get'
})
}

View File

@ -1,9 +0,0 @@
import request from "./request.js"
export function appFileInfoByOneId() {
return request({
url: `/nurseApplet/uploadFile/appFileInfoByOneId`,
method: 'GET'
})
}

View File

@ -1,4 +1,4 @@
import request from "./request.js"
import request from "../request.js"
// 任务详情
@ -8,4 +8,3 @@ export function taskDetails(orderDetailsId) {
method: 'GET'
})
}

View File

@ -1,9 +1,10 @@
import request from "../request.js"
export function orderFallback(orderNo, taskReturnReason) {
export function orderFallback(data) {
return request({
url: `/nurseApp/personLogin/orderFallback?orderNo=${orderNo}&taskReturnReason=${taskReturnReason}`,
method: 'POST'
url: `/nurseApp/personLogin/orderFallback`,
method: 'POST',
data
})
}

View File

@ -1,128 +1,136 @@
{
"name" : "泉医到家护理员",
"appid" : "__UNI__9FA8ADB",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : 100,
"transformPx" : false,
/* 5+App特有相关 */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* 模块配置 */
"modules" : {
"Geolocation" : {},
"Maps" : {},
"Camera" : {}
},
/* 应用发布信息 */
"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" : {
"dSYMs" : false
},
/* SDK配置 */
"sdkConfigs" : {
"ad" : {},
"geolocation" : {
"amap" : {
"__platform__" : [ "ios", "android" ],
"appkey_ios" : "fa38860a5159a551b6819ea3092a68f3",
"appkey_android" : "fa38860a5159a551b6819ea3092a68f3"
}
},
"maps" : {
"amap" : {
"appkey_ios" : "fa38860a5159a551b6819ea3092a68f3",
"appkey_android" : "fa38860a5159a551b6819ea3092a68f3"
}
}
},
"icons" : {
"android" : {
"hdpi" : "",
"xhdpi" : "",
"xxhdpi" : "",
"xxxhdpi" : ""
},
"ios" : {
"appstore" : "",
"ipad" : {
"app" : "",
"app@2x" : "",
"notification" : "",
"notification@2x" : "",
"proapp@2x" : "",
"settings" : "",
"settings@2x" : "",
"spotlight" : "",
"spotlight@2x" : ""
},
"iphone" : {
"app@2x" : "",
"app@3x" : "",
"notification@2x" : "",
"notification@3x" : "",
"settings@2x" : "",
"settings@3x" : "",
"spotlight@2x" : "",
"spotlight@3x" : ""
}
}
}
}
},
/* 快应用特有相关 */
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
"appid" : "",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true,
"permission" : {}
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "2",
"locale" : "zh-Hans",
"fallbackLocale" : "zh-Hans"
"name": "泉医助手",
"appid": "__UNI__9FA8ADB",
"description": "",
"versionName": "1.0.0",
"versionCode": 100,
"transformPx": false,
/* 5+App特有相关 */
"app-plus": {
"usingComponents": true,
"nvueStyleCompiler": "uni-app",
"compilerVersion": 3,
"splashscreen": {
"alwaysShowBeforeRender": true,
"waiting": true,
"autoclose": true,
"delay": 0
},
/* 模块配置 */
"modules": {
"Geolocation": {},
"Maps": {},
"Camera": {}
},
/* 应用发布信息 */
"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": {
"dSYMs": false
},
/* SDK配置 */
"sdkConfigs": {
"ad": {},
"geolocation": {
"amap": {
"__platform__": ["ios", "android"],
"appkey_ios": "fa38860a5159a551b6819ea3092a68f3",
"appkey_android": "fa38860a5159a551b6819ea3092a68f3"
}
},
"maps": {
"amap": {
"appkey_ios": "fa38860a5159a551b6819ea3092a68f3",
"appkey_android": "fa38860a5159a551b6819ea3092a68f3"
}
}
},
"icons": {
"android": {
"hdpi": "",
"xhdpi": "",
"xxhdpi": "",
"xxxhdpi": ""
},
"ios": {
"appstore": "",
"ipad": {
"app": "",
"app@2x": "",
"notification": "",
"notification@2x": "",
"proapp@2x": "",
"settings": "",
"settings@2x": "",
"spotlight": "",
"spotlight@2x": ""
},
"iphone": {
"app@2x": "",
"app@3x": "",
"notification@2x": "",
"notification@3x": "",
"settings@2x": "",
"settings@3x": "",
"spotlight@2x": "",
"spotlight@3x": ""
}
}
}
}
},
/* 快应用特有相关 */
"quickapp": {},
/* 小程序特有相关 */
"mp-weixin": {
"appid": "wxa4f2b43d2ccb9908",
"setting": {
"urlCheck": false,
"postcss": true,
"minified": true
},
"usingComponents": true,
"permission": {
"scope.userLocation": {
"desc": "你的位置信息将用于完成工单信息"
}
},
"requiredPrivateInfos": ["getLocation"],
"lazyCodeLoading": "requiredComponents"
},
"mp-alipay": {
"usingComponents": true
},
"mp-baidu": {
"usingComponents": true
},
"mp-toutiao": {
"usingComponents": true
},
"uniStatistics": {
"enable": false
},
"vueVersion": "2",
"locale": "zh-Hans",
"fallbackLocale": "zh-Hans"
}

View File

@ -9,81 +9,60 @@
"navigationBarTitleText": "启动页",
"navigationStyle": "custom"
}
}, {
"path": "pages/login/login",
},{
"path": "pages/Modifyinformation/Modifyinformation",
"style": {
"navigationBarTitleText": "登录",
"navigationBarBackgroundColor": "#ffffff", //背景颜色
"navigationStyle": "custom"
}
},
{
"path": "pages/confirmCompletion/confirmCompletion",
"style": {
"navigationBarTitleText": "完成确认",
"navigationBarBackgroundColor": "#ffffff" //背景颜色
"navigationBarTitleText": "修改信息",
"enablePullDownRefresh": false
// "navigationBarTextStyle": "white"
}
}, {
"path": "pages/personal/personal",
"style": {
"navigationBarTitleText": "个人信息",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#4C7BC9",
"navigationBarTextStyle": "white"
"navigationStyle": "custom"
}
},{
"path": "pages/MyBenefits/MyBenefits",
"style": {
"navigationBarTitleText": "我的收益",
"enablePullDownRefresh": false
}
}, {
"path": "pages/Mymission/Mymission",
"style": {
"navigationBarTitleText": "我的工单",
"onReachBottomDistance": 20, //距离底部多远时触发 单位为px
"enablePullDownRefresh": true //设置参数为true
}
}, {
"path": "pages/forgotPassword/forgotPassword",
"path": "pages/taskDetails/taskDetails",
"style": {
"navigationBarTitleText": "忘记密码",
"navigationBarBackgroundColor": "#ffffff" //背景颜色
}
}, {
"path": "pages/register/register",
"style": {
"navigationBarTitleText": "注册账号",
"navigationBarBackgroundColor": "#ffffff" //背景颜色
"navigationBarTitleText": "工单信息",
"enablePullDownRefresh": false
}
}, {
"path": "pages/homepage/homepage",
"style": {
"navigationBarTitleText": "",
"navigationBarBackgroundColor": "#ffffff", //背景颜色
"navigationStyle": "custom"
}
},
{
}, {
"path": "pages/confirmCompletion/confirmCompletion",
"style": {
"navigationBarTitleText": "当前工单",
"enablePullDownRefresh": false
}
}, {
"path": "pages/taskReturn/taskReturn",
"style": {
"navigationBarTitleText": "任务退回",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#ffffff" //背景颜色
"navigationBarTitleText": "退回原因",
"enablePullDownRefresh": false
}
}, {
"path": "pages/Mymission/Mymission",
"path": "pages/login/login",
"style": {
"navigationBarTitleText": "我的任务",
"navigationBarBackgroundColor": "#ffffff", //背景颜色
"onReachBottomDistance": 20, //距离底部多远时触发 单位为px
"enablePullDownRefresh": true //设置参数为true
}
}, {
"path": "pages/taskDetails/taskDetails",
"style": {
"navigationBarTitleText": "任务详情",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#ffffff" //背景颜色
}
},
{
"path": "pages/Modifyinformation/Modifyinformation",
"style": {
"navigationBarTitleText": "修改信息",
"enablePullDownRefresh": false,
"navigationBarBackgroundColor": "#ffffff" //背景颜色
// "navigationBarTextStyle": "white"
"navigationBarTitleText": "登录"
}
}, {
"path": "pages/signature/signature",
@ -91,13 +70,12 @@
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "",
"navigationBarBackgroundColor": "#F8F8F8",
"navigationBarBackgroundColor": "#4271B9",
"backgroundColor": "#F8F8F8"
},
"uniIdRouter": {},

View File

@ -1,25 +1,19 @@
.app {
background-color: #F4F5F7;
.app {
width: 100%;
height: 100vh;
color: #000000;
padding: 3%;
font-size: 34rpx;
.title{
font-size: 28rpx;
margin: 20rpx 20rpx 0;
}
padding: 2%;
font-size: 30rpx;
.finish {
width: 217rpx;
width: 496rpx;
background: #4271B9;
border-radius: 5rpx;
color: #FFFFFF;
height: 68rpx;
line-height: 68rpx;
text-align: center;
position: absolute;
top: 70%;
left: 70%;
margin: 100rpx auto;
background: #4C7BC9;
border-radius: 26rpx;
}
.centercontent {
@ -29,8 +23,10 @@
border-radius: 20rpx;
margin: 0 auto;
padding-bottom: 10rpx;
.content {
line-height: 100rpx;
.name {
margin-left: 20rpx;
height: 100rpx;
@ -42,7 +38,10 @@
display: inline-block;
width: 20%;
}
text{
width: 80%;
font-size: 30rpx;
}
input {
position: absolute;
top: 50%;
@ -50,47 +49,121 @@
line-height: 100rpx;
display: inline-block;
width: 80%;
font-size: 34rpx;
font-size: 30rpx;
}
}
.nursetype {
padding-bottom: 20rpx;
border: none;line-height: 50rpx;margin: 20rpx 20rpx;
}
}
.Commodity {
line-height: 130rpx;
margin-left: 20rpx;
border-bottom: 1rpx solid #D8D4D4;
position: relative;
.picture {
position: absolute;
right: 10%;
top: 50%;
transform: translateY(-50%);
width: 110rpx;
height: 110rpx;
border-radius: 50%;
}
.pictureA {
position: absolute;
right: 2%;
top: 50%;
transform: translateY(-50%);
width: 18rpx;
height: 27rpx;
}
.head {
line-height: 140rpx;
margin-left: 5%;
display: inline-block;
padding-bottom: 20rpx;
line-height: 50rpx;
margin: 20rpx 20rpx;
border-bottom: 1rpx solid #D8D4D4;
.rate {
margin: 30rpx auto;
width: 650rpx;
height: 600rpx;
background: #FFFFFF;
border: 1px solid #E6E6E6;
border-radius: 5rpx;
color: #E6E6E6;
background: #FFFFFF;
.itemimgs {
display: inline-block;
width: 200rpx;
height: 200rpx;
margin: 0 0 10rpx 10rpx;
position: relative;
.delimg {
position: absolute;
top: 10rpx;
right: 10rpx;
width: 40rpx;
height: 40rpx;
z-index: 999;
}
.itemimg {
width: 200rpx;
height: 200rpx;
}
}
.item {
display: inline-block;
margin-bottom: 20rpx;
width: 200rpx;
margin: 0 0 0 2%;
height: 212rpx;
border: 1rpx dashed #E6E6E6;
border-radius: 5rpx;
position: relative;
.title {
width: 100%;
font-size: 30rpx;
color: #969394;
line-height: 70rpx;
text-align:center;
position: absolute;
top: 58%;
}
image {
position: absolute;
left: 50%;
top: 20%;
transform: translateX(-50%);
width: 89rpx;
height: 68rpx;
}
}
}
.upload {
margin: 30rpx auto;
width: 650rpx;
height: 600rpx;
background: #FFFFFF;
border: 1px solid #E6E6E6;
border-radius: 5rpx;
color: #E6E6E6;
position: relative;
view{
width: 50%;
position: absolute;
top:50%;
left: 50%;
transform: translate(-50%,-50%);
}
}
}
}
}
.Commodity {
background-color: #F4F5F7;
height: 330rpx;
position: relative;
view {
text-align: center;
position: absolute;
top: 240rpx;
font-size: 26rpx;
width: 100%;
text-align: center;
}
.picture {
border: 4px solid #6DD8FC;
position: absolute;
left: 50%;
top: 50rpx;
transform: translateX(-50%);
width: 160rpx;
height: 160rpx;
border-radius: 50%;
}
}
}

View File

@ -1,26 +1,47 @@
<template>
<view class="app">
<view class="centercontent">
<view class="Commodity" @tap="uploadImag()">
头像
<image class="picture" :src="img" mode=""></image>
<image class="pictureA" src="../../static/jiantou.png" mode=""></image>
<view class="Commodity" @tap="uploadImag">
<image class="picture" :src="myimg" mode=""></image>
<view class="">
点击编辑头像
</view>
</view>
<view class="centercontent" v-if="appPersonallist">
<view class="content">
<view class="name">
<span>姓名:</span>
<input type="text" maxlength="10" placeholder="请输入" v-model="appPersonallist.nickName" />
<span>姓名:</span>
<input type="text" maxlength="10" placeholder="请输入" v-model="appPersonallist.nickName" disabled />
</view>
<view class="name">
<span>性别:</span>
<text v-if='appPersonallist.sex'> {{appPersonallist.sex}}
</text>
</view>
<view class="name">
<span>年龄:</span>
<input type="text" maxlength="4" placeholder=" " v-model="appPersonallist.age" disabled />
</view>
<!-- <view class="name">
<span class="">
账号:
</span>
<input type="text" disabled maxlength="10" placeholder="请填写" v-model="appPersonallist.userName" />
</view>
</view> -->
<view class="name">
<span>电话:</span>
<input disabled type="text" maxlength="11" placeholder="请输入"
v-model="appPersonallist.phonenumber" />
<span>手机号:</span>
<input disabled type="text" maxlength="11" placeholder="请输入" v-model="appPersonallist.phonenumber"
disabled />
</view>
<view class="nursetype">
<span>职称级别:</span>
<text v-if="appPersonallist.positionalTitleLevel">
{{appPersonallist.positionalTitleLevel}}
</text>
</view>
<view class="nursetype" style="">
<span>家庭住址:</span>
<text v-if="appPersonallist.address"> {{appPersonallist.address}}
</text>
</view>
<view class="nursetype " style="">
护理站:
@ -29,44 +50,70 @@
</text>
<!-- {{getNurseStationName(appPersonallist)}} -->
</view>
<view class="nursetype " style="">
擅长项目:
<text v-if="appPersonallist.geniusItem"> {{appPersonallist.geniusItem}}
</text>
</view>
<view class="nursetype " style="border: none;">
证书上传:
<view class="upload" @tap='uploadcertificateimg' v-if="certificateimg.length==0">
<view class="">
<u-icon name="plus" color='#E6E6E6' label='拍摄上传' label-color='#E6E6E6'></u-icon>
</view>
</view>
<view class="rate" v-else>
<view class="itemimgs" v-for="(item,index) in certificateimg">
<image class="delimg" src="../../static/gb2.png" mode="" @tap='delimg(item)'>
</image>
<image class="itemimg" :src="item" mode=""></image>
</view>
<view class="item" @tap='uploadcertificateimg'>
<image src="../../static/paishe.png" mode=""></image>
<view class="title">
拍摄上传
</view>
</view>
</view>
</view>
</view>
</view>
<view class="title">
注:只可修改姓名和头像
</view>
<view class="finish" @tap="gofinish()">完成
</view>
<u-select v-model="show" mode="single-column" :list="NurseStationList" @confirm="confirm"></u-select>
<view class="finish" @tap="uploadcertificateimgs">保存</view>
<u-select v-model="sexshow" :list="sexlist" mode="single-column" @confirm="sexconfirm"></u-select>
<u-toast ref="uToast" />
</view>
</template>
<script>
import {
updateNursePersonCheck,
personNurseStationLists
} from '@/api/register/index.js'
import {
userPassWord,
nursePerson
} from '@/api/Modifyinformation/Modifyinformation.js';
import {
nurseAppletPersonCenter,
} from '@/api/personnal/personal.js';
import baseurl from '@/api/baseurl.js'
export default {
data() {
return {
show: false,
timer: null, //timer
nursePersonId: 34, //护理员id
sexshow: false, //性别选择
baseurl: '', //url
img: null,
image: null,
NurseStationList: [], //护理站list
sexlist: [{
value: 'MALE',
label: '男'
},
{
value: 'FEMALE',
label: '女'
}
],
appPersonallist: {
userId: '',
userName: '',
nickName: '',
phonenumber: '',
avatar: '',
File: '',
},
timer: null,
nurseStationPersonCheckList: []
}, //用户信息
image: null, //判断是否上传头像
certificateimg: [], //证书img
myimg: null, //头像img
}
},
computed: {
@ -75,22 +122,33 @@
// },
},
onShow() {
this.info();
this.baseurl = baseurl;
},
onLoad(options) {
let that = this
try {
const value = uni.getStorageSync('phonenumber');
const value2 = uni.getStorageSync('password');
if (value && value2) {
that.phonenumber = value
that.password = value2
that.myInfo()
}
} catch (e) {}
// const value = uni.getStorageSync('nursePersonId');
// if (value) {
// that.nursePersonId= value
that.myInfo()
// }
},
methods: {
//删除证书图片
delimg(item) {
this.certificateimg = this.certificateimg.filter(e => e != item)
},
//上传证书
uploadcertificateimg() {
var that = this;
uni.chooseImage({
count: 9,
success(res) {
res.tempFilePaths.forEach(e => {
that.certificateimg.push(e)
})
}
})
},
//上传头像
uploadImag() {
var that = this;
@ -99,23 +157,66 @@
sourceType: ['album'],
success(res) {
that.appPersonallist.avatar = res.tempFilePaths[0]
that.img = res.tempFilePaths[0]
that.myimg = res.tempFilePaths[0]
that.image = true
}
})
},
//个人信息
myInfo() {
nursePerson(this.phonenumber, this.password).then(res => {
this.img = baseurl + res.data.avatar
nurseAppletPersonCenter(this.nursePersonId).then(res => {
res.data.sex == 'MALE' ? res.data.sex = '男' : ''
res.data.sex == 'FEMALE' ? res.data.sex = '女' : ''
this.myimg = baseurl + res.data.avatar
res.data.positionalTitleLevel == 'PRIMARY_LEVEL' ? res.data.positionalTitleLevel = '初级' : ''
res.data.positionalTitleLevel == 'MIDDLE_LEVEL' ? res.data.positionalTitleLevel = '中级' : ''
res.data.positionalTitleLevel == 'HIGH_LEVEL' ? res.data.positionalTitleLevel = '高级' : ''
res.data.nurseStationPersonCertificateList.forEach(e => {
e.certificateUrl = baseurl + e.certificateUrl
this.certificateimg.push(e.certificateUrl)
})
res.data.id = this.nursePersonId
res.data.nurseStationPersonCheckList = []
this.appPersonallist = res.data
})
},
//上传证书
uploadcertificateimgs() {
let that = this
if (this.certificateimg.length > 0) {
this.certificateimg.forEach(e => {
uni.uploadFile({
url: baseurl +
'/nurseApplet/personCenter/uploadNurseStationPersonCertificateUrl',
filePath: e, //file: 二进制(filePath)
name: 'file',
formData: { //多余值
'nursePersonId': that.nursePersonId,
},
timeout: 5000,
success(res) {
var img = {
certificateUrl: JSON.parse(res.data).imgUrl
}
that.appPersonallist.nurseStationPersonCheckList.push(img)
if (that.appPersonallist.nurseStationPersonCheckList.length == that
.certificateimg.length) {
that.gofinish();
}
}
})
})
} else {
that.gofinish();
}
},
//修改
gofinish() {
var that = this
if (this.image) {
uni.uploadFile({
url: baseurl + '/nurseApp/personLogin/updateHeadAvatarHead',
filePath: that.img, //file: 二进制(filePath)
filePath: that.myimg, //file: 二进制(filePath)
name: 'file',
formData: { //多余值
'userId': that.appPersonallist.userId,
@ -123,70 +224,59 @@
timeout: 5000,
success(res) {
that.appPersonallist.avatar = JSON.parse(res.data).imgUrl
userPassWord(that.appPersonallist).then(res => {
if (res.code == 200) {
that.$refs.uToast.show({
title: '修改成功',
type: 'success',
duration: '1500',
})
if (that.timer) {
clearTimeout(that.timer)
}
that.timer = setTimeout(e => {
uni.navigateBack({
delta: 1
})
}, 1500)
} else {
that.$refs.uToast.show({
title: res.msg,
type: 'error'
})
}
})
that.updateNursePerson();
}
})
} else {
userPassWord(that.appPersonallist).then(res => {
console.log(res)
if (res.code == 200) {
that.$refs.uToast.show({
title: '修改成功',
type: 'success',
duration: '1500',
})
if (that.timer) {
clearTimeout(that.timer)
}
that.timer = setTimeout(e => {
uni.navigateBack({
delta: 1
})
}, 1500)
} else {
that.$refs.uToast.show({
title: res.msg,
type: 'error'
})
}
})
that.updateNursePerson();
}
},
updateNursePerson() {
var that = this
var obj = {
avatar: that.appPersonallist.avatar,
userId: that.appPersonallist.userId,
id: that.nursePersonId,
positionalTitleLevelCheck: that.appPersonallist.positionalTitleLevel,
geniusItemCheck: that.appPersonallist.geniusItem,
nurseStationPersonCheckList: that.appPersonallist.nurseStationPersonCheckList
}
updateNursePersonCheck(obj).then(res => {
if (res.code == 200) {
that.myInfo();
that.$refs.uToast.show({
title: '修改成功',
type: 'success',
duration: '1500',
})
if (that.timer) {
clearTimeout(that.timer)
}
that.timer = setTimeout(e => {
uni.navigateBack({
delta: 1
})
}, 1500)
} else {
that.$refs.uToast.show({
title: res.msg,
type: 'error'
})
}
})
},
confirm(e) {
this.appPersonallist.nurseStationSysUserVOList[0].nurseStationId = e[0].value
this.appPersonallist.nurseStationSysUserVOList[0].nurseStationName = e[0]['label']
},
//护理站
info() {
personNurseStationLists(this.pageNum, this.pageSize).then(res => {
this.NurseStationList = res.rows.map((e) => {
return {
value: e.id,
label: e.nurseStationName,
}
})
})
//开启选择性别
sexshowtrue() {
this.sexshow = true
},
//选择性别
sexconfirm(e) {
this.appPersonallist.sex = e[0].label
},
},
}

View File

@ -0,0 +1,276 @@
<template>
<view class="app">
<view class="topleft" @tap="taptime">
{{newtime}}
<u-icon name="arrow-down-fill" style='padding-left: 10rpx;'></u-icon>
</view>
<view class="benefits">
<image src="../../static/shouyibeijing.png" mode=""></image>
<view class="top">
本月收益(元)
</view>
<view class="center">
2000.00
</view>
<view class="bottom">
<view class="bottomitem">
<view class="text">
今日收益(元)
</view>
<view class="price">
180
</view>
</view>
<view class="bottomitem">
<view class="text">
累计总收益(元)
</view>
<view class="price">
10000.00
</view>
</view>
</view>
</view>
<view class="list">
<view class="item">
<view class="time">
03.27 8:00-12:00
</view>
<view class="border"></view>
<view class="title">
陪诊(省立医院)
</view>
<view class="price">
+ 20.00
</view>
</view>
</view>
<u-popup v-model="tiemmask" mode='bottom' :closeable='true' :safe-area-inset-bottom='true'>
<view class="timemask">
<view class="tabs">
<view class="tab" v-for="(item,index) in timetablist" @tap='timechange(index)'
:style="timeindex == index?'border-bottom: 5rpx solid #4C7BC9;':''">
{{item.name}}
</view>
</view>
<view class="upiker">
<upicker mode="time" v-model="timeshow" :params="timeparams" v-if="timeindex==0" start-year='2023'
:end-year='newyear'>
</upicker>
</view>
<view class="ucalendar">
<ucalendar mode="range" v-if="timeindex==1" @change="ucalendarchange">
</ucalendar>
</view>
</view>
</u-popup>
</view>
</template>
<script>
import ucalendar from '../ucalendar/u-calendar.vue'
import upicker from '../upicker/u-picker.vue'
export default {
components: {
ucalendar,
upicker
},
data() {
return {
tiemmask: false, //遮罩层
timeparams: {
year: true,
month: true,
day: false,
hour: false,
minute: false,
second: false
},
timeshow: false,
timetablist: [{
name: '月份选择'
}, {
name: '自定义'
}, ],
timeindex: 0,
tiemshow: false, //选择时间开关
newtime: null, //开局月份
newyear: null, //当前年份
};
},
onShow() {
this.nowtime();
},
methods: {
ucalendarchange(e) {
console.log(e)
},
//time
timechange(index) {
this.timeindex = index;
},
//点击时间
taptime() {
this.tiemmask = true;
},
//当前月份
nowtime() {
let nowDate = new Date();
let date = {
// 获取当前年份
year: nowDate.getFullYear(),
//获取当前月份
month: nowDate.getMonth() + 1,
//获取当前日期
};
//拼接
this.newyear = date.year
this.newtime = date.year + "." + date.month
},
}
}
</script>
<style lang="scss">
.app {
padding: 0;
.timemask {
height: 1100rpx;
position: relative;
.ucalendar {
width: 100%;
}
.upiker {
position: absolute;
top: 25%;
left: 50%;
transform: translateX(-50%);
width: 100%;
}
.tabs {
width: 70%;
.tab {
width: 150rpx;
height: 100rpx;
font-size: 32rpx;
color: #000000;
line-height: 100rpx;
text-align: center;
margin-left: 60rpx;
display: inline-block;
}
}
}
.list {
width: 94%;
margin: 0 auto;
.item {
background-color: #fff;
width: 100%;
height: 210rpx;
margin-top: 20rpx;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 5rpx;
position: relative;
.border {
width: 94%;
margin: 0 auto;
height: 1rpx;
background-color: #E6E6E6;
}
.title {
display: inline-block;
width: 70%;
font-size: 34rpx;
color: #333333;
overflow: hidden; //超出的文本隐藏
display: -webkit-box;
-webkit-line-clamp: 1; // 超出多少行
-webkit-box-orient: vertical;
position: absolute;
left: 30rpx;
top: 120rpx;
}
.price {
position: absolute;
right: 30rpx;
top: 120rpx;
font-size: 34rpx;
color: #EA706A;
}
.time {
height: 80rpx;
line-height: 80rpx;
font-size: 28rpx;
color: #848383;
margin-left: 30rpx;
}
}
}
.benefits {
width: 94%;
height: 380rpx;
margin: 20rpx auto 0;
position: relative;
color: #FFFFFF;
.bottom {
width: 100%;
position: absolute;
bottom: 30rpx;
display: flex;
justify-content: space-around;
text-align: center;
.bottomitem {
.text {
font-size: 26rpx;
opacity: 0.8;
}
.price {
margin-top: 17rpx;
font-size: 37rpx;
}
}
}
.center {
font-weight: 600;
position: absolute;
top: 87rpx;
left: 26rpx;
font-size: 66rpx;
}
.top {
position: absolute;
top: 47rpx;
left: 26rpx;
font-size: 24rpx;
opacity: 0.8;
}
image {
width: 100%;
height: 100%;
}
}
.topleft {
margin: 30rpx 0 0 30rpx;
}
}
</style>

View File

@ -1,182 +1,204 @@
<template>
<view class="app">
<view class="inputs">
<i class="icon"></i>
<input type="text" name="" v-model='nurseItemName' id="" class="input" placeholder="请输入搜索内容">
<view class="cards">
<view class="card" @tap="tapmymission('')" :style="orderStatus=='' ? 'background: #4271B9;color:#fff':''">
<image src="../../static/qbgd.png" mode="" v-if="orderStatus!=''"></image>
<image src="../../static/qbgd2.png" mode="" v-else></image>
<view class="text">
全部工单
</view>
</view>
<view class="card" @tap="tapmymission('NOT_FINISH')"
:style="orderStatus=='NOT_FINISH' ? 'background: #F5A623;color:#fff':''">
<image src="../../static/dqgd.png" mode="" v-if="orderStatus!='NOT_FINISH'"></image>
<image src="../../static/dqgd2.png" mode="" v-else></image>
<view class="text">
当前工单
</view>
</view>
<view class="card" @tap="tapmymission('COMPLETE')"
:style="orderStatus=='COMPLETE' ? 'background: #02D081;color:#fff':''">
<image src="../../static/ywcgd.png" mode="" v-if="orderStatus!='COMPLETE'"></image>
<image src="../../static/ywcgd2.png" mode="" v-else></image>
<view class="text">
已完成工单
</view>
</view>
</view>
<view class="tab">
<view class="tab-item" @tap="testTabClick(index)" v-for="(item,index) in tabList"
:class="tabIndex == index?'active':''">
{{item.name}}
</view>
<view class="" v-if="list.length>0">
<view class="Apayment" v-if='choicetab==0' v-for="(item,index) in list" :key="item.id">
<view class="names">{{item.serviceDate}} {{item.serviceStartTime}}-{{item.serviceEndTime}}
<span>待完成</span>
<view class="items">
<view class="item" v-for="(item,index) in missionlist" @click.stop='gotaskDetails(item)'>
<view class="title">
<view class="text">
{{item.nurseItemName}}
</view>
<image @tap='gotask(item)' :src="baseurl+item.itemPictureUrl" mode=""></image>
<view class="detailsinfo" @tap='gotask(item)'>
<view class="change">
{{item.nurseItemName}}
</view>
<view class="time">
服务时长:{{item.itemServeDurationUnit}}
</view>
<view class="price">
¥{{item.totalPrice}}
</view>
</view>
<view class="anniu">
<view class="logistics" @tap='gotask(item)'>详情</view>
<view class="logistics harvest" @tap='goconfirmCompletion(item)'>去完成</view>
<view class="image">
<image src="../../static/jinbi.png" mode=""></image>
<span>
+ {{item.totalPrice}}
</span>
</view>
</view>
<view class="Apayment" @tap='gotask(item)' v-if='choicetab==1' v-for="(item,uindex) in list"
:key="uindex">
<view class="names">{{item.serviceDate}} {{item.serviceStartTime}}-{{item.serviceEndTime}}
<span>已完成</span>
</view>
<image :src="baseurl+item.itemPictureUrl" mode=""></image>
<view class="detailsinfo">
<view class="change">
{{item.nurseItemName}}
</view>
<view class="time">
服务时长:{{item.itemServeDurationUnit}}
</view>
<view class="price">
¥{{item.totalPrice}}
</view>
</view>
<!-- <view class="anniu">
<view class="evaluate">查看评价</view>
</view> -->
<image class="itemimg" v-if="item.orderStatus=='NOT_FINISH'||item.orderStatus=='WAIT_RECEIVE'"
src="../../static/dcl.png" mode=""></image>
<image class="itemimg" v-else src="../../static/ywc.png" mode=""></image>
<view class="time">
{{item.serviceDate}}
<span style='padding-left: 10rpx;'>{{item.serviceStartTime}}</span>
</view>
</view>
<view class="">
<!-- //暂无未完成订单 -->
<view class="noorder" v-if="list.length==0&&choicetab==0">
<image src="../../static/noorder.png" mode=""></image>
<view class="">
暂无待完成服务
<view class="address">
<view class="text">
{{item.serviceAddress}}
</view>
<view class="daohang" @click.stop='goMap(item)'>
<image src="../../static/daohang.png" mode=""></image>
<span class='p'>导航</span>
</view>
</view>
<!-- //暂无完成订单 -->
<view class="noorder" v-if="list.length==0&&choicetab==1">
<image src="../../static/noorder.png" mode=""></image>
<view class="">
暂无已完成服务
<view class="btns" v-if="item.orderStatus=='NOT_FINISH'||item.orderStatus=='WAIT_RECEIVE'">
<view class="btnreturn" @click.stop='gotaskReturn(item)'>
退回
</view>
<view class="btnaccept" @click.stop='Receivingorders(item)' v-if="item.orderStatus=='WAIT_RECEIVE'">
接单
</view>
<view class="btnaccept" @click.stop='goconfirmCompletion(item)'
v-if="item.orderStatus=='NOT_FINISH'">
去完成
</view>
</view>
</view>
</view>
<u-toast ref="uToast" />
</view>
</template>
<script>
import baseurl from '../../api/baseurl'
import {
selectMission
} from '@/api/Mymission.js'
import baseurl from '@/api/baseurl.js'
selectMission,
receiveOrders
} from '@/api/Mymission/Mymission.js'
export default {
data() {
return {
baseurl: '',
choicetab: 0, //切换
tabIndex: 0, //切换
tabList: [{
name: "待完成"
}, {
name: "已完成"
}, ],
nursePersonId: '', //护理员id
orderStatus: 'NOT_FINISH', // orderStatus:订单状态 未完成:NOT_FINISH,服务完成:COMPLETE
baseurl: null,
nursePersonId: 35, //护理员id
orderStatus: '', //COMPLETE 已完成 NOT_FINISH 未完成
pageNum: 1,
pageSize: 10,
//未完成任务
list: [],
nurseItemName: '', //项目名称
missionlist: [], //项目list
total: 0,
nurseItemName: '',
}
},
watch: {
nurseItemName() {
this.selectMissioninfo()
tude: { //经纬度
latitude: '',
longitude: '',
},
}
},
methods: {
//去完成
goconfirmCompletion(item) {
uni.navigateTo({
url: `/pages/confirmCompletion/confirmCompletion?orderDetailsId=${item.id}&orderNo=${item.orderNo}`
})
//点击toptabr
tapmymission(item) {
this.orderStatus = item
this.selectMissioninfo();
},
//任务list
//工单list请求
selectMissioninfo() {
this.pageNum = 1
selectMission(this.nursePersonId, this.orderStatus, this.pageNum, this.pageSize, this.nurseItemName).then(
res => {
this.list = res.rows
this.missionlist = res.rows
this.total = res.total
})
},
//跳转详情页
gotask(item) {
//跳转导航
getlocations() {
let that = this
uni.openLocation({
latitude: Number(that.tude.latitude),
longitude: Number(that.tude.longitude),
})
},
//获取经纬度
goMap(item) {
let that = this
uni.request({
url: 'https://apis.map.qq.com/ws/geocoder/v1/?address=',
method: 'GET',
data: {
key: '3VABZ-6LZWK-YPAJ3-AMQED-D7RUK-VPB37', //高德地图key
address: item.serviceAddress // 详细地址
},
success: function(res) {
that.tude.latitude = res.data.result.location.lat
that.tude.longitude = res.data.result.location.lng
that.getlocations();
},
fail(err) {}
})
},
//任务退回
gotaskReturn(item) {
uni.navigateTo({
url: `/pages/taskReturn/taskReturn?item=${JSON.stringify(item)}`
})
},
//接单
Receivingorders(item) {
var obj = {
"appointmentOrderId": item.id,
"stationPersonId": this.nursePersonId,
"appointmentOrderNo": item.orderNo
}
receiveOrders(obj).then(res => {
console.log(res)
if (res.code == 200) {
this.$refs.uToast.show({
title: '接单成功',
type: 'success',
duration: '1500'
})
this.selectMissioninfo();
}
})
},
//去完成
goconfirmCompletion(item) {
uni.navigateTo({
url: `/pages/confirmCompletion/confirmCompletion?list=${JSON.stringify(item)}&&orderDetailsId=${item.id}`
})
},
//详情
gotaskDetails(item) {
uni.navigateTo({
url: `/pages/taskDetails/taskDetails?orderDetailsId=${item.id}`
})
},
//任务切换
testTabClick(index) {
this.list = []
this.tabIndex = index
this.choicetab = index
this.pageNum == 1
if (this.choicetab == 0) {
this.orderStatus = 'NOT_FINISH'
} else {
this.orderStatus = 'COMPLETE'
}
selectMission(this.nursePersonId, this.orderStatus, this.pageNum, this.pageSize, this.nurseItemName).then(
res => {
this.list = res.rows
this.total = res.total
})
},
// goorderdetails() {
// uni.navigateTo({
// url: '/pages/orderDetails/orderDetails'
// })
// },
},
onLoad(options) {
this.orderStatus = options.orderStatus
},
onShow() { //加载的时候执行(没有次数限制)
this.baseurl = baseurl
var that = this
try {
const value = uni.getStorageSync('nursePersonId');
if (value) {
that.nursePersonId = value
this.selectMissioninfo();
}
} catch (e) {}
// const value = uni.getStorageSync('nursePersonId');
// if (value) {
// that.nursePersonId = value
this.selectMissioninfo();
// }
},
onReachBottom() { //下滑加载
if (this.list.length >= this.total) {} else {
if (this.missionlist.length >= this.total) {} else {
this.pageNum++
selectMission(this.nursePersonId, this.orderStatus, this.pageNum, this.pageSize, this.nurseItemName).then(
res => {
res.rows.forEach(e => {
this.list.push(e)
this.missionlist.push(e)
})
})
}
},
onPullDownRefresh() { //下拉刷新
this.pageNum = 1;
selectMission(this.nursePersonId, this.orderStatus, this.PageNum, this.PageSize, this.nurseItemName).then(
res => {
this.list = res.rows
this.total = res.total
})
this.selectMissioninfo();
setTimeout(function() {
uni.stopPullDownRefresh();
}, 1000);
@ -186,170 +208,166 @@
<style lang="scss">
.app {
background-color: #F4F5F7;
width: 100%;
height: 100vh;
padding: 1rpx 3%;
padding: 0;
.noorder {
margin-top: 20%;
.items {
width: 96%;
margin: 0 auto;
image {
display: block;
margin: 0 auto;
width: 200rpx;
height: 240rpx;
}
.item {
margin: 15rpx auto;
background-color: #fff;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 5rpx;
padding: 3%;
width: 100%;
position: relative;
color: #333333;
font-size: 30rpx;
padding-bottom: 60rpx;
view {
margin-top: 100rpx;
text-align: center;
font-size: 36rpx;
color: #BFBFBF;
}
}
.btns {
margin-top: 60rpx;
display: flex;
position: relative;
height: 30rpx;
.tab .active {
background: #4C7BC9;
}
.btnaccept,
.btnreturn {
width: 170rpx;
height: 60rpx;
text-align: center;
line-height: 55rpx;
border-radius: 5rpx;
border: 1px solid #4271B9;
position: absolute;
}
// 切换
.tab-item {
width: 50%;
text-align: center;
line-height: 70rpx;
color: #ffffff;
background: #BAB7B8;
display: inline-block;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20rpx;
font-size: 34rpx;
}
.btnaccept {
right: 24rpx;
color: #fff;
background-color: #4271B9;
}
.Apayment {
width: 100%;
height: 391rpx;
background: #FFFFFF;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20rpx;
line-height: 70rpx;
padding: 1%;
font-size: 30rpx;
color: #969394;
margin-top: 20rpx;
position: relative;
image {
display: block;
width: 170rpx;
height: 170rpx;
border-radius: 10rpx;
margin: 30rpx 0 0 20rpx;
}
.anniu {
// width: 375rpx;
float: right;
margin: 30rpx 20rpx 0 0;
.evaluate {
background: #4C7BC9;
width: 216rpx;
height: 68rpx;
text-align: center;
color: #ffffff;
border-radius: 26rpx;
.btnreturn {
right: 220rpx;
color: #4271B9;
background: #FFFFFF;
}
}
.logistics {
width: 175rpx;
height: 68rpx;
text-align: center;
color: #ffffff;
background: #E1AE3C;
border-radius: 26rpx;
display: inline-block;
}
.address {
position: relative;
.harvest {
background: #4C7BC9;
margin: 0 0 0 15rpx;
}
}
.text {
width: 80%;
}
.detailsinfo {
width: 60%;
height: 200rpx;
border-radius: 10rpx;
position: absolute;
top: 25%;
left: 35%;
.daohang {
position: absolute;
top: 50%;
transform: translateY(-50%);
right: 10rpx;
display: inline-block;
width: 100rpx;
}
.change {
width: 100%;
color: #000000;
font-size: 34rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
.p {
padding-left: 30rpx;
font-size: 24rpx;
color: #EA706A;
}
image {
position: absolute;
top: 50%;
left: 0rpx;
transform: translateY(-40%);
width: 25rpx;
height: 25rpx;
}
}
.time {
width: 100%;
font-size: 32rpx;
color: #999999;
position: absolute;
top: 32%;
line-height: 90rpx;
}
.price {
width: 100%;
font-size: 30rpx;
color: #D43953;
.itemimg {
position: absolute;
top: 65%;
right: 15rpx;
top: 18rpx;
width: 140rpx;
height: 120rpx;
}
}
.names {
width: 95%;
margin-left: 20rpx;
border-bottom: 1rpx solid #D8D4D4;
.title {
line-height: 100rpx;
border-bottom: 1rpx solid #E6E6E6;
font-size: 36rpx;
color: #333333;
position: relative;
height: 100rpx;
span {
color: #4C7BC9;
float: right;
.text {
height: 100%;
overflow: hidden; //超出的文本隐藏
display: -webkit-box;
-webkit-line-clamp: 1; // 超出多少行
-webkit-box-orient: vertical;
width: 57%;
}
.image {
position: absolute;
left: 58%;
top: 50%;
transform: translateY(-50%);
display: inline-block;
font-size: 30rpx;
color: #EA706A;
width: 150rpx;
image {
// vertical-align: middle;
transform: translateY(20%);
width: 40rpx;
height: 40rpx;
padding-right: 10rpx;
}
}
}
}
}
.inputs {
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border: 1rpx solid #f0f0f0;
width: 99%;
height: 65rpx;
margin: 20rpx auto;
border-radius: 20rpx;
background-color: #Ffffff;
position: relative;
.cards {
width: 96%;
margin: 10rpx auto;
display: flex;
background-color: #fff;
.input {
position: absolute;
height: 65rpx;
left: 10%;
line-height: 65rpx;
font-size: 26rpx;
color: #BEBEC0;
}
.card {
width: 33.3%;
position: relative;
text-align: center;
height: 150rpx;
border-radius: 5rpx;
.icon {
background: url(@/static/sousuo.png) no-repeat;
width: 30rpx;
height: 28rpx;
background-size: cover;
position: absolute;
top: 30%;
left: 5%;
.text {
width: 100%;
font-size: 26rpx;
line-height: 40rpx;
position: absolute;
top: 90rpx;
}
image {
position: absolute;
top: 20rpx;
left: 50%;
transform: translateX(-50%);
width: 50rpx;
height: 60rpx;
}
}
}
}

View File

@ -1,66 +1,99 @@
<template>
<view class="app">
<view class="picture">
<view class="attendantImg">
护理员到岗照片
</view>
<view class="uppicture" @tap='uploadonDutyPictureUrl'>
<view class="choice" v-if="!onDutyPictureUrl">
拍摄照片
<view class="top">
<view class="title">
<image src="../../static/fuwu.png" mode=""></image>
<view class="text">
{{itemlist.nurseItemName}}
</view>
<image v-else :src="onDutyPictureUrl" mode=""></image>
<!-- <u-upload class="slot-btn" width="530" height="130" ></u-upload> -->
</view>
</view>
<!-- <view class="picture" style="height: 330rpx;">
<view class="attendantImg">
服务进行中视频(不少于1min)<span>*选填</span>
</view>
<view class="uppicture">
<u-upload class="slot-btn" width="530" height="130"></u-upload>
</view>
<view class="user">
<image src="../../static/radio.png" mode=""></image>
用户不同意拍摄
</view>
</view> -->
<view class="picture">
<view class="attendantImg">
服务结束照片
</view>
<view class="uppicture" @tap='uploadserviceEndPictureUrl'>
<view class="choice" v-if="!serviceEndPictureUrl">
拍摄照片
<view class="righttext">
¥{{itemlist.totalPrice}}
</view>
</view>
<view class="content">
<view class="time">
时间: {{itemlist.serviceDate}}
<span style='padding-left: 10rpx;'>{{itemlist.serviceStartTime}}</span>
</view>
<view class="address">
地点:{{itemlist.serviceAddress}}
</view>
<image v-else :src="serviceEndPictureUrl" mode=""></image>
<!-- <u-upload class="slot-btn" width="530" height="130" ></u-upload> -->
</view>
</view>
<view class="picture" style="height: 730rpx;">
<view class="attendantImg" style="border-bottom: 1rpx solid #BAB7B8;">
用户签名确认
<view class="pictures">
<view class="picture">
<view class="attendantImg">
护理员到岗照片
</view>
<view class="uppicture" @tap='uploadonDutyPictureUrl'>
<view class="choice" v-if="!onDutyPictureUrl">
拍摄照片
</view>
<image v-else :src="onDutyPictureUrl" mode=""></image>
<!-- <u-upload class="slot-btn" width="530" height="130" ></u-upload> -->
</view>
</view>
<view class="receive">
我确认已接受服务
<!-- <view class="picture" style="height: 330rpx;">
<view class="attendantImg">
服务进行中视频(不少于1min)<span>*选填</span>
</view>
<view class="uppicture">
<u-upload class="slot-btn" width="530" height="130"></u-upload>
</view>
<view class="user">
<image src="../../static/radio.png" mode=""></image>
用户不同意拍摄
</view>
</view> -->
<view class="picture">
<view class="attendantImg">
服务结束照片
</view>
<view class="uppicture" @tap='uploadserviceEndPictureUrl'>
<view class="choice" v-if="!serviceEndPictureUrl">
拍摄照片
</view>
<image v-else :src="serviceEndPictureUrl" mode=""></image>
<!-- <u-upload class="slot-btn" width="530" height="130" ></u-upload> -->
</view>
</view>
<view class="uppicture" @tap='show=true'>
<image v-if="!userSignaturePictureUrl" style="width: 36rpx;height: 36rpx;margin:8% 0 0 35%"
src="../../static/autograph.png" mode="">
</image>
<span v-if="!userSignaturePictureUrl">点此签名</span>
<image v-else :src="userSignaturePictureUrl" mode=""></image>
<!-- <u-upload class="slot-btn" :action="action" :file-list="fileList" width="620" height="130"></u-upload> -->
<view class="picture" style="height: 730rpx;">
<view class="attendantImg" style="border-bottom: 1rpx solid #BAB7B8;">
用户签名确认
</view>
<!-- <view class="receive">
我确认已接受服务
</view> -->
<view class="uppicture" @tap='show=true'>
<image v-if="!userSignaturePictureUrl" style="width: 36rpx;height: 36rpx;margin:8% 0 0 35%"
src="../../static/autograph.png" mode="">
</image>
<span v-if="!userSignaturePictureUrl">点此签名</span>
<image v-else :src="userSignaturePictureUrl" mode=""></image>
<!-- <u-upload class="slot-btn" :action="action" :file-list="fileList" width="620" height="130"></u-upload> -->
</view>
</view>
</view>
<view class="submit">
<view class="finish" @tap='buyfinish'>
去完成
</view>
<view class="submit" @tap='finishshow=true'>
完成
</view>
<u-mask :show="show" @click="show = false">
<u-popup v-model="finishshow" mode='bottom' :closeable='true' :safe-area-inset-bottom='true'>
<view class="finishmask">
<view class="title">
是否确认完成当前工单?
</view>
<view class="leftbtn" @tap='finishshow = false'>
否
</view>
<view class="rightbtn" @tap='buyfinish'>
是
</view>
</view>
</u-popup>
<u-popup v-model="show" mode='bottom' :closeable='true' :safe-area-inset-bottom='true'>
<signature @userSignaturePictureUrl='userSignaturePicture' @click.native.stop
style='position:absolute;bottom:0%;width: 100%;height: 800rpx;'></signature>
</u-mask>
style='width: 100%;height: 800rpx;'></signature>
</u-popup>
<u-toast ref="uToast" />
</view>
</template>
@ -77,8 +110,10 @@
},
data() {
return {
show: false,
orderNo: null,
itemlist: null, //信息list
finishshow: false, //是否完成
show: false, //签名
orderNo: null, //订单编号
onDutyPictureUrl: null,
serviceEndPictureUrl: null,
userSignaturePictureUrl: null,
@ -137,6 +172,7 @@
},
//完成
buyfinish() {
this.finishshow = true
if (this.serviceEndPictureUrl && this.userSignaturePictureUrl && this.onDutyPictureUrl) {
let that = this
uni.uploadFile({
@ -208,122 +244,210 @@
},
},
onLoad(options) {
this.itemlist = JSON.parse(options.list)
console.log(this.itemlist)
this.list.id = options.orderDetailsId
this.orderNo = options.orderNo
this.orderNo = this.itemlist.orderNo
var that = this
uni.getLocation({
type: 'gcj02',
geocode: true,
success: function(res) {
that.list.serviceLocationName = res.address.poiName
that.list.serveLocationLatitude = res.latitude
that.list.serveLocationLongitude = res.longitude
},
fail: error => {
uni.showModal({
title: '提示',
content: '获取定位失败,是否授权打开定位',
success: (res) => {
if (res.confirm) {}
}
})
}
});
// uni.getLocation({
// type: 'gcj02',
// geocode: true,
// success: function(res) {
// that.list.serviceLocationName = res.address.poiName
// that.list.serveLocationLatitude = res.latitude
// that.list.serveLocationLongitude = res.longitude
// },
// fail: error => {
// uni.showModal({
// title: '提示',
// content: '获取定位失败,是否授权打开定位',
// success: (res) => {
// if (res.confirm) {}
// }
// })
// }
// });
},
}
</script>
<style lang="scss">
.app {
padding: 3%;
font-size: 36rpx;
padding: 0 0 100rpx;
.picture {
width: 95%;
height: 630rpx;
background: #FFFFFF;
box-shadow: 0px 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20px;
margin: 20rpx auto 0;
.finishmask {
height: 300rpx;
position: relative;
.attendantImg {
color: #000000;
height: 88rpx;
line-height: 88rpx;
margin-left: 30rpx;
span {
color: #BAB7B8;
}
.rightbtn,
.leftbtn {
position: absolute;
text-align: center;
line-height: 59rpx;
width: 249rpx;
height: 59rpx;
border-radius: 5rpx;
top: 200rpx;
}
.uppicture {
border: 1rpx dashed #818181;
width: 90%;
height: 500rpx;
margin: 0 auto;
.leftbtn {
border: 1px solid #4271B9;
background: #FFFFFF;
color: #4271B9;
left: 61rpx;
}
.rightbtn {
background: #4271B9;
color: #fff;
right: 61rpx;
}
.title {
width: 100%;
text-align: center;
font-size: 41rpx;
margin-top: 160rpx;
color: #333333;
}
}
.top {
padding-bottom: 40rpx;
background-color: #fff;
width: 96%;
margin: 15rpx auto 0;
color: #333333;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 5rpx;
.content {
margin-left: 50rpx;
font-size: 30rpx;
.time {
line-height: 90rpx;
}
.address {}
}
.title {
border-bottom: 1rpx solid #E6E6E6;
display: flex;
height: 100rpx;
line-height: 100rpx;
position: relative;
image {
width: 100%;
height: 100%;
}
.choice {
.righttext {
position: absolute;
right: 20rpx;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
transform: translateY(-50%);
font-size: 34rpx;
color: #EA706A;
}
::v-deep .u-list-item[data-v-49deb6f2] {
background: #FFFFFF;
.text {
font-size: 34rpx;
line-height: 100rpx;
padding-left: 18rpx;
}
span {
font-size: 35rpx;
color: #969394;
}
}
.user {
height: 88rpx;
line-height: 88rpx;
color: #969394;
margin-left: 30rpx;
image {
width: 34rpx;
height: 34rpx;
margin: 50rpx 0 0 35rpx;
transform: translateY(-50%);
width: 40rpx;
height: 40rpx;
}
}
}
.pictures {
width: 96%;
margin: 15rpx auto;
background: #FFFFFF;
box-shadow: 0px 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 5rpx;
.picture {
width: 100%;
height: 630rpx;
.attendantImg {
color: #000000;
height: 88rpx;
line-height: 88rpx;
margin-left: 30rpx;
span {
color: #BAB7B8;
}
}
}
.uppicture {
border: 1rpx dashed #818181;
width: 90%;
height: 500rpx;
margin: 0 auto;
position: relative;
.receive {
height: 88rpx;
line-height: 88rpx;
color: #969394;
margin-left: 30rpx;
image {
width: 100%;
height: 100%;
}
.choice {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
::v-deep .u-list-item[data-v-49deb6f2] {
background: #FFFFFF;
}
span {
font-size: 35rpx;
color: #969394;
}
}
.user {
height: 88rpx;
line-height: 88rpx;
color: #969394;
margin-left: 30rpx;
image {
width: 34rpx;
height: 34rpx;
}
}
.receive {
height: 88rpx;
line-height: 88rpx;
color: #969394;
margin-left: 30rpx;
}
}
}
.submit {
width: 32%;
height: 68rpx;
font-size: 32rpx;
width: 496rpx;
height: 58rpx;
background: #4271B9;
border-radius: 5rpx;
color: #FFFFFF;
text-align: center;
margin-left: 60%;
.finish {
width: 100%;
height: 68rpx;
line-height: 68rpx;
background: #4C7BC9;
border-radius: 26rpx;
margin-top: 100rpx;
}
line-height: 58rpx;
background: #4C7BC9;
margin: 90rpx auto;
}
}
</style>

View File

@ -1,74 +0,0 @@
.app {
height: 100vh;
padding: 20rpx 0;
.item {
font-size: 34rpx;
margin: 0 auto 20rpx;
width: 94%;
height: 100rpx;
line-height: 100rpx;
background-color: #fff;
box-shadow: 0px 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20rpx;
position: relative;
.lefttext {
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 3%;
}
.righttext {
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 18%;
height: 100rpx;
}
.lefttext,
.righttext {
::v-deep .uni-input-input {
font-size: 34rpx;
}
::v-deep .uni-input-wrapper {
height: 100rpx;
line-height: 100rpx;
}
::v-deep .uni-input-placeholder {
line-height: 100rpx;
font-size: 34rpx;
font-weight: 400;
color: #C3C1C1;
}
}
.obtaincode {
text-align: center;
font-size: 36rpx;
color: #4C7BC9;
line-height: 100rpx;
position: absolute;
right: 5%;
top: 0%;
}
}
.loginbtn {
width: 80%;
height: 100rpx;
text-align: center;
line-height: 100rpx;
background: #4C7BC9;
border-radius: 51rpx;
font-size: 41rpx;
color: #FFFFFF;
position: absolute;
top: 40%;
left: 10%;
}
}

View File

@ -1,144 +0,0 @@
<template>
<view class="app">
<view class="item">
<view class="lefttext">
输入新密码
</view>
<u-input class='righttext' style='left:30%' placeholder="请输入密码" maxlength="10" type="password"
:border="false" :password-icon="true" v-model="newpassword" />
</view>
<view class="item">
<view class="lefttext">
重复新密码
</view>
<u-input class='righttext' style='left:30%' placeholder="请再次输入密码" maxlength="10" type="password"
:border="false" :password-icon="true" v-model="password" />
</view>
<view class="item">
<view class="lefttext">
手机号
</view>
<input class="righttext" style='left:23%' type="text" placeholder="请输入" maxlength="11"
v-model="phonenumber" />
</view>
<!-- <view class="item">
<view class="lefttext">
验证码
</view>
<input class="righttext" style='left:23%' type="text" placeholder="" maxlength="6" v-model="verification" />
<view class="obtaincode" :style="{'color':getCodeBtnColor}" @click.stop="getCode()">
{{getCodeText}}
</view>
</view> -->
<view class="loginbtn" @tap='pwdlogin'>
确定
</view>
<u-toast ref="uToast" />
</view>
</template>
<script>
import {
updatePassword
} from '@/api/forgotPassword/forgotPassword.js'
export default {
data() {
return {
phonenumber: '',
password: '',
newpassword: '',
getCodeText: '获取验证码', //获取验证码的文字
getCodeBtnColor: "#4C7BC9", //获取验证码的color
timer: null,
}
},
onLoad(options) {
if (options.phonenumber) {
this.phonenumber = options.phonenumber
}
},
methods: {
pwdlogin() {
var that = this
if (this.password !== this.newpassword) {
this.$refs.uToast.show({
title: '密码输入不一致,请重新输入',
type: 'error',
duration: '1500'
})
} else {
updatePassword(this.phonenumber, this.password, this.verification).then(res => {
if (res.code == 200) {
this.$refs.uToast.show({
title: '密码修改成功',
type: 'success',
duration: '1500'
})
if (that.timer) {
clearTimeout(that.timer)
}
that.timer = setTimeout(e => {
uni.navigateTo({
url: `/pages/login/login?phonenumber=${this.phonenumber}&password=${this.password}`
})
}, 1500)
} else {
this.$refs.uToast.show({
title: res.msg,
type: 'error'
})
}
})
}
},
//点击获取验证码
getCode() {
uni.hideKeyboard() //隐藏已经显示的软键盘,如果软键盘没有显示则不做任何操作。
if (this.getCodeisWaiting) { //是否在倒计时中
return;
}
if (!(/^1(3|4|5|6|7|8|9)\d{9}$/.test(this.phonenumber))) { //校验手机号码是否有误
uni.showToast({
title: '请填写正确手机号码',
icon: "none"
});
return false;
}
this.getCodeText = "发送中..." //发送验证码
this.getCodeisWaiting = true;
this.getCodeBtnColor = "rgba(138,139,133,1)" //追加样式,修改颜色
//示例用定时器模拟请求效果
//setTimeout(()用于在指定的毫秒数后调用函数或计算表达式
setTimeout(() => {
uni.showToast({
title: '验证码已发送',
icon: "none"
}); //弹出提示框
// this.code = '1234'; //发送验证码,进行填入 示例默认1234,生产中请删除这一句。
this.setTimer(); //调用定时器方法
}, 1000)
},
//获取验证码的倒计时 setTimer: 需要每隔一段时间执行一件事的的时候就需要使用SetTimer函数
setTimer() {
let holdTime = 60; //定义变量并赋值
this.getCodeText = "重新获取(60)"
//setInterval()是一个实现定时调用的函数,可按照指定的周期(以毫秒计)来调用函数或计算表达式。
//setInterval方法会不停地调用函数,直到 clearInterval被调用或窗口被关闭。
this.Timer = setInterval(() => {
if (holdTime <= 0) {
this.getCodeisWaiting = false;
this.getCodeBtnColor = "#4C7BC9";
this.getCodeText = "获取验证码"
clearInterval(this.Timer); //清除该函数
return; //返回前面
}
this.getCodeText = "重新获取(" + holdTime + ")"
holdTime--;
}, 1000)
},
},
}
</script>
<style lang="scss">
@import "./forgotPassword.scss";
</style>

View File

@ -1,91 +1,243 @@
<template>
<view class="app">
<view class="cards">
<view class="item" style="background: #D43953;" @tap='gomymission'>
<image src="../../static/dingdan.png" mode=""></image>
<view class="title">
我的任务
</view>
<image class="circular" :src="beijingurl" mode=""></image>
<view class="topfloat">
<image src="../../static/gongdan.png" mode=""></image>
<view class="tapbtn" @tap="goMymission('')">
立即处理
</view>
<view class=" item" style="background: #4C7BC9; " @tap='gopersonal'>
<image src="../../static/user.png" mode=""></image>
<view class="title">
个人信息
<view class="btns">
<view class="btn" @tap="goMymission('NOT_FINISH')">
<view class="number">
{{selectOrderByNursePersonCountlist.notFinshCount}}项
</view>
<view class="text">
待处理
</view>
</view>
<view class="btn" @tap="goMymission('COMPLETE')">
<view class="number" style="color: #333333;">
{{selectOrderByNursePersonCountlist.completeCount}}项
</view>
<view class="text">
已完成
</view>
</view>
</view>
</view>
<view class="centerfloat">
<view class="title">
在线学习
</view>
<view class="cards">
<image src="../../static/xxpx.png" mode=""></image>
<image src="../../static/jnks.png" mode=""></image>
<image src="../../static/zxkf.png" mode=""></image>
</view>
</view>
<view class="centerfloat bottomfloat">
<view class="title">
护理新闻
</view>
<view class="righttitle">
查看更多
<u-icon name="arrow-right" color='#969494'></u-icon>
</view>
<view class="items">
<view class="item">
<image src="../../static/jnks.png" mode=""></image>
<view class="toptext">
护理 I 致力于打造专业护理人才
</view>
<view class="centertext">
生活小窍门,是指人们在日常生活中总结出来的知识和经验,和生活小常识非常相似
</view>
</view>
</view>
</view>
<u-toast ref="uToast" />
</view>
</template>
<script>
import {
nursePerson,
} from '@/api/personnal/personal.js';
selectOrderByNursePersonCount
} from '@/api/homepage/index.js'
import baseurl from '@/api/baseurl.js'
export default {
data() {
return {
phonenumber: null,
password: null,
beijingurl: null, //背景
nurserStationPresonId: 35, //护理员id
selectOrderByNursePersonCountlist: {}, //项目数量对象
};
},
onShow() {
let that = this
try {
const value = uni.getStorageSync('phonenumber');
const value2 = uni.getStorageSync('password');
if (value && value2) {
that.phonenumber = value
that.password = value2
}
} catch (e) {}
this.beijingurl = baseurl + '/profile/nursePersonAppletPicture/person_center.png'
this.OrderByNursePersonCount();
},
methods: {
gomymission() {
nursePerson(this.phonenumber, this.password).then(res => {
if (res.code == 200) {
uni.navigateTo({
url: '/pages/Mymission/Mymission'
})
} else if (res.code == 9999) {} else {
this.$refs.uToast.show({
title: '账号异常,请重新登录',
type: 'error',
duration: '1000'
})
setTimeout(e => {
uni.reLaunch({
url: '/pages/login/login'
})
}, 1000)
}
//项目数量
OrderByNursePersonCount() {
selectOrderByNursePersonCount(this.nurserStationPresonId).then(res => {
this.selectOrderByNursePersonCountlist = res
console.log(this.selectOrderByNursePersonCountlist)
})
},
gopersonal() {
nursePerson(this.phonenumber, this.password).then(res => {
if (res.code == 200) {
uni.navigateTo({
url: '/pages/personal/personal'
})
} else if (res.code == 9999) {} else {
this.$refs.uToast.show({
title: '账号异常,请重新登录',
type: 'error',
duration: '1000'
})
setTimeout(e => {
uni.reLaunch({
url: '/pages/login/login'
})
}, 1000)
}
goMymission(item) {
uni.navigateTo({
url: `/pages/Mymission/Mymission?orderStatus=${item}`
})
},
},
}
</script>
<style lang="scss">
.app{
padding-top: 160rpx;
page {
background-color: #fff;
}
.app {
position: relative;
.bottomfloat {
position: relative;
.items {
width: 100%;
.item {
position: relative;
height: 150rpx;
width: 100%;
color: #666666;
image {
position: absolute;
top: 0;
left: 0;
width: 130rpx;
height: 130rpx;
}
.centertext {
font-size: 22rpx;
position: absolute;
top: 60rpx;
left: 150rpx;
overflow: hidden; //超出的文本隐藏
display: -webkit-box;
-webkit-line-clamp: 2; // 超出多少行
-webkit-box-orient: vertical;
}
.toptext {
font-size: 30rpx;
position: absolute;
top: 5rpx;
left: 150rpx;
width: 75%;
overflow: hidden; //超出的文本隐藏
display: -webkit-box;
-webkit-line-clamp: 1; // 超出多少行
-webkit-box-orient: vertical;
// overflow: hidden; //超出的文本隐藏
// text-overflow: ellipsis; //溢出用省略号显示
// white-space: nowrap; // 默认不换行;
}
}
}
.righttitle {
position: absolute;
right: 20rpx;
top: 0;
color: #969494;
font-size: 24rpx;
}
}
.centerfloat {
width: 94%;
margin: 50rpx auto 0;
.cards {
display: flex;
justify-content: space-between;
image {
width: 31%;
height: 240rpx;
}
}
.title {
height: 29rpx;
font-size: 30rpx;
line-height: 29rpx;
color: #333333;
margin: 0 0 40rpx 0;
padding-left: 10rpx;
border-left: 6rpx solid #4271B9;
}
}
.topfloat {
z-index: 999;
display: block;
width: 94%;
height: 510rpx;
margin: 160rpx auto 0;
position: relative;
box-shadow: 0rpx 3rpx 18rpx 0rpx rgba(79, 108, 254, 0.43);
.btns {
position: absolute;
top: 380rpx;
display: flex;
justify-content: space-around;
width: 100%;
text-align: center;
.btn {
width: 200rpx;
.text {
font-size: 30rpx;
color: #999999;
}
.number {
font-size: 34rpx;
color: #F14941;
}
}
}
.tapbtn {
width: 239rpx;
height: 70rpx;
background: #4271B9;
border-radius: 35rpx;
text-align: center;
line-height: 70rpx;
color: #fff;
position: absolute;
top: 210rpx;
left: 60rpx;
}
image {
width: 100%;
height: 100%;
}
}
.circular {
z-index: -1;
width: 100%;
height: 500rpx;
position: absolute;
top: 0;
}
}
</style>

View File

@ -27,7 +27,7 @@
position: absolute;
top:55%;
left:5%;
background-color: #46ABD7;
background-color: #4271B9;
color: #ffffff;
}
}

View File

@ -1,124 +1,124 @@
<template>
<view class="app">
<view class="user">
<view class="img" v-if="appPersonallist.avatar==''||!appPersonallist.avatar">
<image style="height: 110rpx;" src="../../static/person.png" mode=""></image>
<image class="circular" :src="beijingurl" mode=""></image>
<view class="user" v-if="Personallist">
<image class="img" :src="baseurl+Personallist.avatar" mode=""></image>
<view class="phone" v-if="Personallist.nursePersonName">
{{Personallist.nursePersonName}}
</view>
<view class="img" v-else>
<image :src="baseurl+appPersonallist.avatar" mode=""></image>
<view class="nickname" style="top:245rpx" v-if="Personallist.phone">
{{Personallist.phone}}
</view>
<!-- <view class="phone">
{{appPersonallist.phonenumber}}
</view> -->
<view class="nickname">
{{appPersonallist.userName}}
<view class="nickname" v-if="Personallist.evaluateStarCount>=0">
<u-rate :count="5" v-model="Personallist.evaluateStarCount" disabled active-color='#F4EA2A'></u-rate>
</view>
<view class="modify" @tap='updatainfo()'>
<view class="modify" @tap='goModifyinformation'>
<image src="../../static/xg.png" mode="" style="padding-right: 15rpx;"></image>
修改信息
<u-icon name="arrow-right" color="#ffffff" size="32"></u-icon>
</view>
</view>
<view class="information">
<view class="item">
姓名:{{appPersonallist.nickName}}
</view>
<view class="item">
电话:{{appPersonallist.phonenumber }}
</view>
<view class="item" style="border:none;border-radius:0 0 20rpx 20rpx;line-height:50rpx;padding: 20rpx 3%;"
v-if="appPersonallist.nurseStationSysUserVOList">
护理站:
<text v-for='(uitem,index) in appPersonallist.nurseStationSysUserVOList'> {{uitem.nurseStationName}}
<text v-if="index!=appPersonallist.nurseStationSysUserVOList.length-1">,</text>
</text>
</view>
<view class="signout" @tap='remove'>
退出账号
<view class="user" v-else>
<image class="img" src="../../static/user.png" mode=""></image>
<view class="login" @tap='gologin'>
登录
</view>
</view>
<!-- <view class="External" style="margin: 100rpx auto 0;">
<view class="lefttext">
我的设备
<view class="topitems">
<view class="topitem" @tap="tapstatus('ONLINE')">
<image src="../../static/kaishi2.png" mode="" v-if="Personallist.workStatus=='ONLINE'"></image>
<image src="../../static/kaishi.png" mode="" v-else></image>
<view class="">
在线
</view>
</view>
<image src="../../static/jiantou.png" mode=""></image>
</view> -->
<!-- <view class="External">
<view class="lefttext">
修改密码
<view class="topitem" @tap="tapstatus('BE_BUSY')">
<image src="../../static/manglu2.png" mode="" v-if="Personallist.workStatus=='BE_BUSY'"></image>
<image src="../../static/manglu.png" mode="" v-else></image>
<view class="">
忙碌
</view>
</view>
<image src="../../static/jiantou.png" mode=""></image>
</view> -->
<view class="topitem" @tap="tapstatus('OFFLINE')">
<image src="../../static/lixian2.png" mode="" v-if="Personallist.workStatus=='OFFLINE'"></image>
<image src="../../static/lixian.png" mode="" v-else></image>
<view class="">
离线
</view>
</view>
</view>
<view class="bottomitems">
<view class="bottomitem" @tap='goMyBenefits'>
<image src="../../static/shouyi.png" mode=""></image>
<view class="">
我的收益
</view>
</view>
<view class="bottomitem">
<image src="../../static/xuexi.png" mode=""></image>
<view class="">
我的学习
</view>
</view>
<view class="bottomitem">
<image src="../../static/kaoshi.png" mode=""></image>
<view class="">
我的考试
</view>
</view>
<view class="bottomitem">
<image src="../../static/shezhi.png" mode=""></image>
<view class="">
设置
</view>
</view>
</view>
<u-toast ref="uToast" />
</view>
</template>
<script>
import {
nursePerson,
nurseAppletPersonCenter,
updateNursePersonWorkStatus
} from '@/api/personnal/personal.js';
import baseurl from '@/api/baseurl.js'
export default {
data() {
return {
baseurl: '', //url
phonenumber: '',
avatar: '',
password: '',
userId: '',
appPersonallist: [], //获取个人信息
nurseStationSysUserVOList: [],
beijingurl: null, //背景
nursePersonId: 34, //护理员id
baseurl: null, //url
Personallist: null, //获取个人信息
}
},
onShow() {
this.beijingurl = baseurl + '/profile/nursePersonAppletPicture/person_center.png'
this.baseurl = baseurl;
let that = this
try {
const value = uni.getStorageSync('phonenumber');
const value2 = uni.getStorageSync('password');
if (value && value2) {
that.phonenumber = value
that.password = value2
that.myInfo()
}
} catch (e) {}
// const value = uni.getStorageSync('nursePersonId');
// if (value) {
// this.nursePersonId = value
that.myInfo()
// }
},
onLoad(options) {},
methods: {
//退出
remove() {
let that = this
uni.showModal({
title: '提示',
content: '确认要退出此账号吗',
success: function(res) {
if (res.confirm) {
uni.removeStorageSync("phonenumber")
uni.removeStorageSync("password")
uni.removeStorageSync("nursePersonId")
that.$refs.uToast.show({
title: '退出账号成功',
type: 'success',
duration: '1000'
})
setTimeout(e => {
uni.reLaunch({
url: '/pages/login/login'
})
}, 1000)
} else if (res.cancel) {
that.$refs.uToast.show({
title: '退出账号失败',
type: 'error',
duration: '1000'
})
}
//点击状态
tapstatus(item) {
var obj = {
id: this.nursePersonId,
workStatus: item
}
updateNursePersonWorkStatus(obj).then(res => {
if (res.code == 200) {
this.myInfo()
}
});
})
},
myInfo() {
nursePerson(this.phonenumber, this.password).then(res => {
nurseAppletPersonCenter(this.nursePersonId).then(res => {
if (res.code == 200) {
this.appPersonallist = res.data
this.Personallist = res.data
} else {
this.$refs.uToast.show({
title: '账号异常,请重新登录',
@ -137,128 +137,158 @@
uni.navigateTo({
url: `/pages/Modifyinformation/Modifyinformation`
})
}
},
//跳登录
gologin() {
uni.navigateTo({
url: '/pages/login/login'
})
},
//跳修改
goModifyinformation() {
uni.navigateTo({
url: '/pages/Modifyinformation/Modifyinformation'
})
},
//我的收益
goMyBenefits() {
uni.navigateTo({
url: '/pages/MyBenefits/MyBenefits'
})
},
}
}
</script>
<style lang="scss">
page {
background-color: #fff;
}
.app {
padding: 0;
font-size: 32rpx;
height: 100vh;
.signout {
// position: absolute;
// bottom: 60rpx;
// width: 94%;
background: #FFFFFF;
margin-top: 50rpx;
height: 80rpx;
line-height: 80rpx;
// left:3%;
border-radius: 20rpx;
text-align: center;
}
.bottomitems {
width: 100%;
margin-top: 30rpx;
.External {
width: 94%;
height: 100rpx;
line-height: 100rpx;
margin: 20rpx auto;
padding-left: 5%;
background: #FFFFFF;
box-shadow: 0px 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20rpx;
position: relative;
.bottomitem {
width: 85%;
margin: 0 auto;
height: 120rpx;
position: relative;
border-bottom: 1rpx solid #F3F3F3;
image {
width: 18rpx;
height: 27rpx;
position: absolute;
right: 5%;
top: 50%;
transform: translateY(-50%);
}
.lefttext {
display: inline-block;
}
}
.information {
width: 98%;
border-radius: 20rpx;
position: absolute;
top: 20%;
left: 1%;
color: #000000;
overflow: hidden;
font-size: 35rpx;
.item {
// height: 110rpx;
line-height: 110rpx;
background: #FFFFFF;
padding-left: 3%;
box-shadow: 0px 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-bottom: 1rpx solid #D8D4D4;
.address {
height: 40rpx;
// font-size: 30rpx;
line-height: 40rpx;
view {
display: inline-block;
width: 80%;
margin-left: 30rpx;
margin-top: 30rpx;
font-size: 35rpx;
color: #333333;
line-height: 120rpx;
margin-left: 80rpx;
}
image {
position: absolute;
top: 50%;
transform: translateY(-50%);
display: inline-block;
width: 50rpx;
height: 50rpx;
}
}
}
.topitems {
z-index: 999;
padding: 45rpx 0 35rpx;
width: 94%;
margin: 0 auto;
display: flex;
background: #FFFFFF;
box-shadow: 0rpx 3rpx 18rpx 0rpx rgba(79, 108, 254, 0.43);
border-radius: 5rpx;
justify-content: space-around;
text-align: center;
.topitem {
view {
font-size: 32rpx;
margin-top: 10rpx;
}
image {
width: 90rpx;
height: 90rpx;
}
}
}
.user {
width: 100%;
height: 500rpx;
background: #4C7BC9;
height: 400rpx;
position: relative;
color: #FFFFFF;
font-size: 38rpx;
.modify {
font-size: 32rpx;
position: absolute;
right: 3%;
top: 18%;
top: 250rpx;
font-size: 28rpx;
image {
width: 23rpx;
height: 23rpx;
padding-left: 10rpx;
}
}
.login {
text-align: center;
position: absolute;
top: 220rpx;
left: 35%;
font-size: 36rpx;
width: 180rpx;
line-height: 70rpx;
border: 1rpx solid #fff;
height: 70rpx;
border-radius: 20rpx;
}
.nickname {
position: absolute;
top: 18%;
left: 28%;
top: 300rpx;
left: 35%;
font-size: 28rpx;
}
.phone {
position: absolute;
top: 13%;
left: 28%;
top: 180rpx;
left: 35%;
}
.img {
width: 120rpx;
height: 120rpx;
width: 160rpx;
height: 160rpx;
border-radius: 50%;
background: #F6F6F6;
position: absolute;
top: 10%;
left: 5%;
image {
border-radius: 50%;
width: 120rpx;
margin-left: 50%;
margin-top: 50%;
transform: translate(-50%, -50%);
height: 120rpx;
}
top: 170rpx;
left: 8%;
border: 4px solid #6DD8FC;
}
}
.circular {
z-index: -1;
width: 100%;
height: 500rpx;
position: absolute;
top: 0;
}
}
</style>

View File

@ -1,172 +0,0 @@
.app {
height: 100vh;
padding: 20rpx 0;
.Agreement{
width: 100%;
background-color: #F4F5F7;
text-align: center;
height: 1000rpx;
position: absolute;
// left:3%;
top:5%;
font-size: 30rpx;
.title{
height: 100rpx;
line-height: 100rpx;
border-bottom: 1px solid #eeeeee;
font-size: 34rpx;
margin: 0px auto;
width: 100%;
text-align: center;
}
.scroll-Y{
height:830rpx ;
overflow-y:scroll;
text-align: left;
text-indent: 2em;
}
.cancel {
height:70rpx;
line-height: 70rpx;
font-size: 32rpx;
background-color: #F4F5F7;
position: absolute;
border-top: 1rpx solid #000000;
bottom:0;
right:0;
width: 50%;
color: #000000;
}
.determine {
height:70rpx;
line-height: 70rpx;
font-size: 32rpx;
width: 50%;
color: #F4F5F7;
background: #4C7BC9;
position: absolute;
bottom:0;
left:0;
}
}
.item {
font-size: 34rpx;
margin: 0 auto 20rpx;
width: 94%;
height: 100rpx;
line-height: 100rpx;
background-color: #fff;
box-shadow: 0px 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20rpx;
position: relative;
span {
margin-left: 3%;
}
.addition {
line-height: 100rpx;
font-size: 34rpx;
font-weight: 400;
margin-left: 3%;
}
.lefttext {
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 3%;
}
.righttext {
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 18%;
height: 100rpx;
}
.lefttext,
.righttext {
::v-deep .uni-input-input {
font-size: 34rpx;
}
::v-deep .uni-input-wrapper {
height: 100rpx;
line-height: 100rpx;
}
::v-deep .uni-input-placeholder {
line-height: 100rpx;
font-size: 34rpx;
font-weight: 400;
color: #C3C1C1;
}
}
}
.radio-content {
margin: 50rpx auto;
width: 70%;
text-align: center;
font-size: 28rpx;
position: relative;
.agreement {
position: absolute;
top:50%;
left:20%;
transform: translateY(-50%);
color: #878987;
}
.radio-right {
height: 100rpx;
.radio {
display: inline-block;
width: 35rpx;
height: 35rpx;
border-radius: 70%;
border: 2rpx solid #178ffb;
position: absolute;
top:50%;
left:5%;
transform: translateY(-50%);
.radio-active {
width: 16rpx;
height: 16rpx;
border-radius: 50%;
background-color: #178ffb;
margin-left: 26%;
margin-top: 22%;
// margin: 0 auto;
}
}
}
}
.switch {
text-align: center;
line-height: 60rpx;
color: #46ABD7;
position: absolute;
top: 70%;
}
.loginbtn {
width: 70%;
height: 100rpx;
text-align: center;
line-height: 100rpx;
background: #4C7BC9;
border-radius: 51rpx;
font-size: 41rpx;
color: #FFFFFF;
position: absolute;
top: 60%;
left: 15%;
}
}

View File

@ -1,175 +0,0 @@
<template>
<view class="app">
<view class="item">
<view class="lefttext">
姓名
</view>
<input class="righttext" type="text" placeholder="请输入" v-model="appPersonallist.nickName" maxlength="30" />
</view>
<view class="item">
<view class="lefttext">
输入密码
</view>
<u-input class='righttext' style='left:30%' placeholder="请输入密码" maxlength="10"
v-model="appPersonallist.stationPersonPassword" type="password" :border="false" :password-icon="true" />
</view>
<view class="item">
<view class="lefttext">
重复密码
</view>
<u-input class='righttext' style='left:30%' placeholder="请再次输入密码" maxlength="10"
v-model="appPersonallist.newpassword" type="password" :border="false" :password-icon="true" />
</view>
<view class="item">
<view class="lefttext">
手机号
</view>
<input class="righttext" style='left:23%' type="text" placeholder="请输入" maxlength="11"
v-model="appPersonallist.phonenumber" />
</view>
<view class="item" @tap='show=true'>
<span>护理站</span>
<text class='addition'>{{nurseStationName}}</text>
</view>
<view class="radio-content">
<view class="radio-right" @tap="changeRadio">
<view class="radio" :class="radio == 2 ? 'radio-default':''">
<view :class="radio == 2 ? 'radio-active':''"></view>
</view>
</view>
<view class="agreement">我已阅读并同意<text @tap='maskshow=true'
style="color: #000000;border-bottom: 1rpx solid #000000;">《用户协议》</text></view>
</view>
<view class="loginbtn" @tap='getInfo'>
注册
</view>
<view class="switch" style="right:5%" @tap='gologin'>
已有账号,去登录
</view>
<u-select v-model="show" mode="single-column" :list="listinfo" @confirm="confirm"></u-select>
<u-toast ref="uToast" />
<!-- //用户协议 -->
<u-mask :show="maskshow" class='mask' @click='maskshow=false'>
<view class="Agreement">
<view class="title">
用户协议与隐私政策
</view>
<scroll-view scroll-y="true" class="scroll-Y" style="">
<contenttext></contenttext>
</scroll-view>
<view class="cancel" @tap='maskshow=false'>
取消
</view>
<view class="determine" @tap='tapradio'>
确定并同意
</view>
</view>
</u-mask>
</view>
</template>
<script>
import {
nurseAppLoginSysUser,
personNurseStationLists
} from '@/api/register/index.js'
import contenttext from './text.vue'
export default {
components: {
contenttext
},
data() {
return {
maskshow: false, //用户协议
listinfo: [],
show: false,
radio: 1, //用户协议
nurseStationName: '',
pageSize: 999,
pageNum: 1,
appPersonallist: {
nickName: '',
newpassword: '',
phonenumber: '',
stationPersonPassword: '',
nurseStationIds: '',
}
};
},
onLoad() {
this.info()
},
methods: {
//注册功能
getInfo() {
if (this.radio == 1) {
this.$refs.uToast.show({
title: '请审核并同意用户协议',
type: 'error'
})
} else if (this.appPersonallist.stationPersonPassword !== this.appPersonallist.newpassword) {
this.$refs.uToast.show({
title: '密码输入不一致,请重新输入',
type: 'error',
duration: '1500'
})
} else {
nurseAppLoginSysUser(this.appPersonallist).then(res => {
if (res.code == 200) {
this.$refs.uToast.show({
title: '注册成功,前往登录',
type: 'success',
duration: '1500'
})
setTimeout(e => {
uni.navigateTo({
url: `/pages/login/login?phonenumber=${this.appPersonallist.phonenumber}&password=${this.appPersonallist.stationPersonPassword}`
})
}, 1500)
} else {
this.$refs.uToast.show({
title: res.msg,
type: 'error'
})
}
})
}
},
//护理站
info() {
personNurseStationLists(this.pageNum, this.pageSize).then(res => {
this.listinfo = res.rows.map((e) => {
return {
value: e.id,
label: e.nurseStationName,
}
})
})
},
confirm(e) {
this.appPersonallist.nurseStationIds = e[0].value
this.nurseStationName = e[0]['label']
},
tapradio() {
this.radio = 2;
this.maskshow = false;
},
//跳转登录页
gologin() {
uni.navigateTo({
url: `/pages/login/login`
})
},
changeRadio() {
if (this.radio == 1) {
this.radio = 2;
} else {
this.radio = 1;
}
},
},
}
</script>
<style lang="scss">
@import './register.scss';
</style>

View File

@ -1,384 +0,0 @@
<template>
<view class="">
泉医到家(简称“我们”)深知个人信息对您的重要性,也感谢您对我们的信任。
我们将通过本政策向您说明我们如何收集、存储、保护、使用及对外提供您的信息,并说明您享有的权利,其中要点如下:
<view class="">
1、为了便于您了解您在使用我们的服务时,我们需要收集的信息类型与用途,我们将结合具体服务向您逐一说明;
</view>
<view class="">
2、为了向您提供服务所需,我们会按照合法、正当、必要的原则收集您的信息;
</view>
<view class="">
3、如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意或确认第三方已征得您的同意;
</view>
<view class="">
4、如果为了向您提供服务而需要从第三方获取您的信息,我们将要求第三方说明信息来源,并要求第三方保障其提供信息的合法性;如果我们开展业务、提供服务需进行的个人信息处理活动超出您原本向第三方提供个人信息的授权范围,我们将征得您的明确同意;
</view>
<view class="">
5 、您可以通过本隐私政策介绍的方式访问和管理您的信息、设置隐私功能或进行投诉举报。
</view>
<view class="" style="padding-top: 20rpx;">
您可以根据以下索引阅读相应章节,进一步了解本政策的具体约定:
</view>
<view>一、我们如何收集和使用个人信息</view>
<view> 二、我们对Cookie(或同类技术)的使用</view>
<view> 三、我们如何存储个人信息</view>
<view> 四、我们如何共享、转让、公开披露个人信息</view>
<view> 五、我们如何保护个人信息的安全</view>
<view> 六、您的权利</view>
<view> 七、未成年人使用条款</view>
<view> 八、隐私政策的修订和通知</view>
<view> 九、适用范围</view>
<view> 十、第三方软件开发包(SDK)个人信息收集情况</view>
<view> 十一、联系我们</view>
<view> 我们将按照法律规定,保护您的个人信息及隐私安全。我们制定本“隐私政策”并特别提示:希望您在使用泉医到家及相关服务前仔细阅读并理解本隐私政策,以便做出适当的选择。</view>
<view class="" style="text-indent: 0em;padding: 20rpx 0;">
一、我们如何收集和使用个人信息
</view>
<view class="">
在您使用“泉医到家”及服务的过程中,我们将根据合法、正当、必要的原则,收集信息。我们收集或您提供的信息将用于:
</view>
<view class="">
1.保障产品的正常基础运行;
</view>
<view> 2.实现各项功能和服务;</view>
<view> 3.优化、改善产品和服务;</view>
<view> 4.保障产品、服务以及用户使用安全;</view>
<view> 5.遵循法律法规与国家标准的规定。</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> (一)我们直接收集与使用的个人信息</view>
<view> 我们会按照如下方式收集您在使用服务时主动提供的,以及通过自动化手段收集您在使用功能或接受服务过程中产生的信息:</view>
<view> 1.保障“泉医到家”和相关服务的正常运行</view>
<view>
当您使用“泉医到家”及相关服务时,为了保障软件与服务的正常运行,我们会收集您的硬件型号、操作系统版本号、国际移动设备识别码(IMEI)、网络设备硬件地址(MAC)、IP地址、软件版本号、网络接入方式及类型、操作日志、电话状态等信息。请您了解,这些信息是我们提供服务和保障产品正常运行所必须收集的基本信息。
</view>
<view> 2.注册、认证、登录“泉医到家”和相关服务</view>
<view>
(1)当您注册、登录“泉医到家”及相关服务时,您可以通过手机号创建账号,我们将通过发送短信验证码来验证您的身份是否有效,并且您可以完善相关的网络身份识别信息(如头像、昵称和密码),收集这些信息是为了帮助您完成注册。您还可以根据自身需求选择填写性别、生日等信息完善您的个人信息。
</view>
<view>
(2)您也可以使用第三方账号(如微信)登录进入泉医到家,您此时将授权我们获取您在第三方平台注册的公开信息(头像、昵称等),并在您同意本隐私政策后将您的第三方账号与您的泉医到家账号绑定,使您可以通过第三方账号直接登录并使用本产品和相关服务。
</view>
<view> 3.获得您的明示同意后的地理位置信息</view>
<view> 在本地频道中,我们会基于IP地址对应的城市(如:济南)向您展示、推荐您所在地区的本地相关信息。</view>
<view> 拒绝提供地理位置信息,我们将不会基于地理位置向您推送信息,但不会影响“泉医到家”其他功能与服务的正常使用。</view>
<view> 4.为您提供信息发布功能或服务</view>
<view> 您发布内容、评论、提问或回答时,我们将收集您发布的信息,并展示您的昵称、头像、发布内容等。</view>
<view> 您使用上传图片、发布音视频功能时,我们会请求您授权相机、照片、麦克风等敏感权限。您如果拒绝授权提供,将无法使用此功能,但不影响您正常使用“泉医到家”的其他功能。</view>
<view> 您发布信息并选择显示位置时,我们会请求您授权地理位置权限,并收集与本服务相关的位置信息。这些技术包括 IP 地址、GPS 以及能够提供相关信息的
WI-FI接入点、蓝牙和基站等传感器技术。您如果拒绝授权提供,将无法使用此功能,但不影响您正常使用“泉医到家”的其他功能。</view>
<view>
我们会将缓存写入外置存储器,为此需要您授权外置存储器读写权限。
</view>
<view>
5.为您提供搜索服务
</view>
<view>
您使用“泉医到家”的搜索服务时,我们会收集您的搜索关键字信息、日志记录等。为了提供高效的搜索服务,部分前述信息会暂时存储在您的本地存储设备之中,并可向您展示搜索结果内容、搜索历史记录。
</view>
<view>
6.保障产品、服务及用户使用安全
</view>
<view>
为帮助我们更好地了解“泉医到家”及相关服务的运行情况,以便确保运行与提供服务的安全,我们可能记录网络日志信息,以及使用软件及相关服务的频率、崩溃数据、总体安装、使用情况、性能数据等信息。
</view>
<view>
7.为您提供意见反馈服务
</view>
<view>
为了确认您的身份信息及在处理完您的意见反馈后便于向您回复,需要您提交意见反馈时填写您的电话或QQ或邮箱等。此信息仅用于确认身份及回复您使用。
</view>
<view style="text-indent: 0em;padding: 10rpx 0;">
(二)我们可能从第三方获得的您的个人信息
</view>
<view>
1.当您主动使用第三方账号登录“泉医到家”时,我们会收集第三方账号的昵称、头像等信息。
</view>
<view>
2.用户因使用我们的产品或者服务而被我们收集的信息,例如其他用户发布的信息中可能含有您的部分信息(如:在评论、留言、发布图文、音视频中涉及到与您相关的信息)。
</view>
<view style="text-indent: 0em;padding: 10rpx 0;">
(三)收集、使用个人信息目的变更的处理
</view>
<view>
请您了解,随着我们业务的发展,可能会对“泉医到家”的功能和提供的服务有所调整变化。原则上,当新功能或服务与发布信息、互动交流、搜索查询、注册认证等场景相关时,收集与使用的个人信息将与原处理目的具有直接或合理关联。在与原处理目的无直接或合理关联的场景下,我们收集、使用您的个人信息,会再次进行告知,并征得您的同意。
</view>
<view style="text-indent: 0em;padding: 10rpx 0;">
(四)依法豁免征得同意收集和使用的个人信息
</view>
<view> 请您理解,在下列情形中,根据法律法规及相关国家标准,我们收集和使用您的个人信息无需征得您的授权同意:</view>
<view> (1)与国家安全、国防安全直接相关的;</view>
<view> (2)与公共安全、公共卫生、重大公共利益直接相关的;</view>
<view> (3)与犯罪侦查、起诉、审判和判决执行等直接相关的;</view>
<view> (4)出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</view>
<view> (5)所收集的您的个人信息是您自行向社会公众公开的;</view>
<view> (6)从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道;</view>
<view> (7)根据您的要求签订或履行合同所必需的;</view>
<view> (8)用于维护“泉医到家”软件及相关服务的安全稳定运行所必需的,例如发现、处置“泉医到家”软件及相关服务的故障;</view>
<view> (9)学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;</view>
<view> (10)法律法规规定的及与履行行业主管部门有关规定的义务相关的其他情形。</view>
<view>
特别提示您注意,如信息无法单独或结合其他信息识别到您的个人身份,其不属于法律意义上您的个人信息;当您的信息可以单独或结合其他信息识别到您的个人身份时或我们将无法与任何特定个人信息建立联系的数据与其他您的个人信息结合使用时,这些信息在结合使用期间,将作为您的个人信息按照本隐私政策处理与保护。
</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> (五)其他</view>
<view>
请您理解,我们向您提供的服务是不断更新和发展的。如您选择使用了前述说明当中未涵盖的其他服务,基于该服务我们需要收集您的信息的,我们会通过页面提示、交互流程、协议约定的方式另行向您说明信息收集的范围与目的,并征得您的同意。我们会按照本政策以及相应的用户协议约定使用、存储、对外提供及保护您的信息;如您选择不提供前述信息,您可能无法使用某项或某部分服务,但不影响您使用我们提供的其他服务。
</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 二、我们对Cookie(或同类技术)的使用</view>
<view> 为使您获得更轻松的访问体验,您访问“泉医到家”提供的服务时,我们可能会通过小型数据文件识别您的身份,帮您省去重复输入登录信息的步骤,或者帮助您判断您的账户是否安全。这些数据文件可能是Cookie、Flash
Cookie、或您的浏览器或关联应用程序提供的其他本地存储(统称“Cookie”)。请您理解,我们的某些服务只能通过使用Cookie才可得到实现。如果您的浏览器或浏览器附加服务允许,您可以修改对Cookie的接受程度或者拒绝“泉医到家”的Cookie,但这一举动在某些情况下可能会影响您安全访问“泉医到家”和使用“泉医到家”提供的服务。我们使用
Cookie(或同类技术)主要为了实现以下功能或服务:</view>
<view> (一)保障产品与服务的安全、高效运转</view>
<view> 我们可能会设置认证与保障安全性的cookie或匿名标识符,使我们确认您是否安全登录服务,或者是否遇到盗用、欺诈等不法行为。这些技术还会帮助我们改进服务效率,提升登录和响应速度。</view>
<view> (二)帮助您获得更轻松的访问体验</view>
<view> 使用此类技术可以帮助您省去重复您填写个人信息、输入搜索内容的步骤和流程(例如:记录搜索历史)。</view>
<view> (三)为您推荐、展示、推送您可能感兴趣的内容或账号</view>
<view> 我们可能会利用Cookie或同类技术了解您的偏好和使用习惯,进行咨询或数据分析,以改善产品服务及用户体验,并优化您对广告的选择。</view>
<view> 我们承诺,我们不会将Cookie用于本隐私政策所述目的之外的任何其他用途。</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 三、我们如何存储个人信息</view>
<view> (一)信息存储的地点</view>
<view> 我们依照法律法规的规定,将在境内运营过程中收集和产生的您的个人信息存储于中华人民共和国境内。</view>
<view> (二)存储期限</view>
<view>
我们仅在为提供“泉医到家”及服务之目的所必需的期间内保留您的个人信息,例如,您发布的信息、评论、点赞等信息,在您未撤回、删除或未注销账号期间,我们会保留相关信息。超出必要期限后,我们将对您的个人信息进行删除或匿名化处理,但法律法规另有规定的除外。
</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 四、我们如何共享、转让、公开披露个人信息</view>
<view> (一)个人信息的共享、转让</view>
<view> 我们不会向第三方共享、转让您的个人信息,除非经过您本人事先授权同意,或者共享、转让的个人信息是去标识化处理后的信息,且共享第三方无法重新识别此类信息的自然人主体。</view>
<view> 1.我们可能会共享的个人信息</view>
<view> 1.1为实现特定功能而与业务合作伙伴共享</view>
<view>
当软件服务提供商、智能设备提供商或系统服务提供商与我们联合为您提供服务时,例如您需要使用地理位置功能时,为实现这一功能,我们可能会收集您的位置信息及相关设备信息(例如硬件型号、操作系统版本号、国际移动设备身份识别码(IMEI)、网络设备硬件地址(MAC))经过去标识化后并提供给前述提供商。
</view>
<view> 1.2帮助您参加营销推广活动</view>
<view> 当您选择参加我们举办的有关营销活动时,根据活动需要您提供姓名、通信地址、联系方式等信息。经过您的明示同意,我们会将上述信息与第三方共享以便我们能委托第三方及时向您提供奖品。</view>
<view> 2.对共享个人信息第三方主体的谨慎评估及责任约束</view>
<view>
2.1如果为了向您提供服务而需要将您的信息共享至第三方,我们将评估第三方收集信息的合法性、正当性、必要性。我们将要求第三方对您的信息采取保护措施并且严格遵守相关法律法规与监管要求。另外,我们会按照法律法规及国家标准的要求以确认协议、具体场景下的文案确认、弹窗提示等形式征得您的同意或确认第三方已征得您的同意。
</view>
<view> 2.2对我们与之共享您个人信息的第三方,该些第三方会与我们签订保密协议。同时,我们会对其数据安全能力与环境进行评估,并要求第三方以不低于本隐私政策所要求的保密和安全措施来保护信息。</view>
<view> (二)个人信息的公开披露</view>
<view> 我们不会公开披露您的信息,除非遵循国家法律法规规定或者获得您的同意。我们公开披露您的个人信息会采用符合行业内标准的安全保护措施。</view>
<view> (三)依法豁免征得同意共享、转让、公开披露的个人信息</view>
<view> 请您理解,在下列情形中,根据法律法规及国家标准,我们共享、转让、公开披露您的个人信息无需征得您的授权同意:</view>
<view> 1.与国家安全、国防安全直接相关的;</view>
<view> 2.与公共安全、公共卫生、重大公共利益直接相关的;</view>
<view> 3.与犯罪侦查、起诉、审判和判决执行等直接相关的;</view>
<view> 4.出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</view>
<view> 5.您自行向社会公众公开的个人信息;</view>
<view> 6.从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 五、我们如何保护个人信息安全</view>
<view> (一)我们非常重视您个人信息的安全,将努力采取合理的安全措施(包括技术方面和管理方面)来保护您的个人信息,防止您提供的个人信息被不当使用或未经授权的情况下被访问、公开披露、使用、修改、损坏、丢失或泄漏。
</view>
<view> (二)我们会使用加密技术、匿名化处理等合理可行的手段保护您的个人信息,并使用安全保护机制防止您的个人信息遭到恶意攻击。</view>
<view> (三)我们会建立专门的安全部门、安全管理制度、数据安全流程保障您的个人信息安全。我们采取严格的数据使用和访问制度,确保只有授权人员才可访问您的个人 信息,并适时对数据和技术进行安全审计。</view>
<view>
(四)尽管已经采取了上述合理有效措施,并已经遵守了相关法律规定要求的标准,但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全,我们将尽力确保您提供给我们的个人信息的安全性。您知悉并理解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。因此,我们强烈建议您采取积极措施保护个人信息的安全,包括但不限于使用复杂密码、定期修改密码、不将自己的账号密码等个人信息透露给他人。
</view>
<view>
(五)我们会制定应急处理预案,并在发生用户信息安全事件时立即启动应急预案,努力阻止该等安全事件的影响和后果扩大。一旦发生用户信息安全事件(泄露、丢失等)后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已经采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以推送通知、邮件、信函、短信等形式告知您,难以逐一告知时,我们会采取合理、有效的方式发布公告。同时,我们还将按照相关监管部门要求,上报用户信息安全事件的处置情况。
</view>
<view>
(六)我们谨此特别提醒您,本隐私政策提供的个人信息保护措施仅适用于“泉医到家”及相关服务。一旦您离开“泉医到家”及相关服务,浏览或使用其他网站、服务及内容资源,我们即没有能力及义务保护您在“泉医到家”及相关服务之外的软件、网站提交的任何个人信息,无论您登录、浏览或使用上述软件、网站是否基于“泉医到家”的链接或引导。
</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 六、您的权利</view>
<view> 我们非常重视您对个人信息的管理,并尽全力保护您对于您个人信息的查询、访问、修改、删除、撤回同意授权、在设置页面注销账号、投诉举报以及设置隐私功能等权利,以使您有能力保障您的隐私和安全。</view>
<view> (一)访问、删除、更正您的个人信息</view>
<view> 您可以通过以下方式管理您的信息:</view>
<view> 1. 访问个人账号信息:</view>
<view> 您可以查询、访问您的头像、用户名、简介、性别、生日、地区、位置等基本信息(身份证个人信息除外),您可以在泉医到家的“编辑资料”中进行查询、访问。</view>
<view> 2. 查询访问、更改、删除您的收藏记录,清理缓存</view>
<view> 2.1 点击“我的”—点击“我的收藏”进入查询访问、删除;</view>
<view> 2.2 您可以通过点击“我的”—“设置”—点击“清理缓存”。</view>
<view> 3. 注销账号</view>
<view> 点击“我的”—点击“设置”—点击“账号注销”,同意账户注销协议并点击确定按钮。如需人工处理,我们将在核实您的身份之日起15日之内予以处理并回复。</view>
<view>
特别提示您注意,出于安全性和身份识别(如号码申诉服务)的考虑,您可能无法自主修改注册时提交的某些初始注册信息。如您确有需要修改该类注册信息,请根据本隐私政策载明的联系方式联系我们,我们核查并验证您的用户身份后会在15个工作日内处理并给予回复。
</view>
<view> (二)改变您授权同意范围或撤销授权</view>
<view> 1. 改变或撤回敏感信息权限</view>
<view> 您可以通过更改系统设置以及在设备本身操作系统中关闭地理位置、通讯录、摄像头、麦克风等权限改变同意范围或撤回您的授权。</view>
<view> 2. 拒绝接受推送及营销信息</view>
<view> 您可以通过设置关闭“推送通知”拒绝消息的推送。</view>
<view> 请您理解,特定的业务功能和服务将需要您的信息才能得以完成,当您撤回同意或授权后,我们无法继续为您提供撤回同意或授权所对应的功能和服务,也不再处理您相应的个人信息。</view>
<view> (三)投诉举报</view>
<view>
您可按照我们公示的制度进行投诉或举报。如果您认为您的个人信息权利可能受到侵害,或者发现侵害个人信息权利的线索(例如:认为我们收集您的个人信息违反法律规定或者双方约定),您可以通过点击“我的”,进入举报反馈界面与我们联系。我们核查后会在15个工作日内反馈您的投诉与举报。
</view>
<view> (四)访问隐私政策</view>
<view> 您可以在“我的”—“设置”中查看本隐私政策的全部内容。</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 七、未成年人使用条款</view>
<view> (一)若您是未满18周岁的未成年人且无完全民事行为能力,在使用“泉医到家”及相关服务前,应在您的父母或其他监护人监护、指导下共同阅读并在征得您父母或者监护人同意的前提下使用我们的服务或向我们提供信息。
</view>
<view>
(二)我们根据国家相关法律法规的规定保护未成年人的个人信息,只会在法律允许、父母或其他监护人明确同意或保护未成年人所必要的情况下收集、使用、储存、共享、转让或披露未成年人的个人信息;如果我们发现在违背了法律有关规定或未事先获得可证实的父母同意的情况下收集了未成年人的个人信息,则会设法尽快删除相关信息。
</view>
<view> (三)若您是未成年人的监护人,当您对您所监护的未成年人的个人信息有相关疑问时,请通过本隐私政策公示的联系方式与我们联系。</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 八、隐私政策的修订和通知</view>
<view>
为了给您提供更好的服务,泉医到家及相关服务将不时更新与变化,我们会适时对本隐私政策进行修订,这些修订构成本隐私政策的一部分并具有等同于本隐私政策的效力,未经您明确同意,我们不会削减您依据当前生效的本隐私政策所应享受的权利。
</view>
<view> 本隐私政策更新后,我们会在泉医到家发出更新版本,以便您及时了解本隐私政策的最新版本。</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 九、适用范围</view>
<view> 本隐私政策仅适用于泉医到家客户端,不适用于有单独的隐私政策且未纳入本隐私政策的第三方产品或服务。</view>
<view> 本隐私权政策不适用于:</view>
<view> 1. 其他第三方产品或服务,可能包括在推荐中向您显示的产品或网站和广告内容或者“泉医到家”服务中链接到的其他产品或网站。</view>
<view> 2. 为“泉医到家”服务进行广告宣传的其他第三方。</view>
<view> 第三方主体可能会通过“泉医到家”向您提供服务。当您进入第三方主体运营的服务界面时,请注意相关服务由第三方主体向您提供。涉及到第三方主体向您收集信息的,建议您仔细查看第三方主体的隐私政策或协议约定。</view>
<view> 请您了解,本隐私政策中所述的“泉医到家”及相关服务可能会根据您所使用的手机型号、系统版本、软件应用程序版本、移动客户端等因素而有所不同。最终的产品和服务以您所使用的“泉医到家”软件及相关服务为准。</view>
<view style="text-indent: 0em;padding: 10rpx 0;"> 十、第三方软件开发包(SDK)个人信息收集情况</view>
<view>
1.地理位置服务:当您使用地理位置相关服务时,我们会将您的WLAN状态信息、定位信息、终端设备唯一标识符,与位置服务提供商(百度地图)进行共享,以便可以返回您的位置信息,并最终向您提供定位服务。我们会使用各种技术进行定位,包括IP地址、GNSS以及能够提供相关信息的其他传感器(如可能会为百度提供附近设备、WLAN接入点和基站的信息)。这些个人信息的收集,仅会在已获得您的终端设备系统权限允许的前提下进行。若您拒绝提供,仅会影响地理位置服务功能,但不影响其他功能的正常使用。
</view>
<view> 以下将详细列出我们的基本服务功能及为实现该功能所需收集的个人信息类型以及与收集个人信息相关的权限:</view>
<uni-table border stripe emptyText="">
<uni-tr>
<uni-th>权限类型</uni-th>
<uni-th>功能及服务</uni-th>
<uni-th>权限授权方式</uni-th>
</uni-tr>
<uni-tr>
<uni-td>访问WI-FI状态</uni-td>
<uni-td>获取连接WIFI信息,返回至百度定位服务端作为辅助定位依据,再返回给开发者更精准的位置信息 </uni-td>
<uni-td> 由设备系统开发方及开发者应用决定,当最终用户同意向开发者应用授予该权限时开启</uni-td>
</uni-tr>
<uni-tr>
<uni-td>获取位置</uni-td>
<uni-td>
获取的位置信息(可能包括GNSS信息、WIFI地址及信号强度信息、基站ID数据信息、传感器信息、手机信号强度信息),以便无需最终用户手动输入自身地理坐标就可以给开发者返回最终用户的位置信息
</uni-td>
<uni-td>由设备系统开发方及开发者应用决定,当最终用户同意向开发者应用授予该权限时开启</uni-td>
</uni-tr>
</uni-table>
<view style="text-indent: 0em">更多内容请参考百度地图隐私政策链接:http://privacy.baidu.com/detail?id=288</view>
<view>
2.分享服务:当您使用客户端分享服务时,我们会向提供该服务的上海游昆信息技术有限公司(以下称“MobTech”)共享您的系统运营、网络状态、MAC地址、国际移动设备识别码(IMEI)、匿名设备标识符(OAID)、国际移动用户识别码(IMSI)、应用列表、基站信息、社交平台OpenID、地理位置,以确保您的分享功能能够正常使用。以上信息将在您授权后收集。关于MobTech收集个人信息的保护规则及退出机制等。更多内容,详见MobTech官网(www.mob.com)
隐私政策条款(https://www.mob.com/about/policy)。</view>
<uni-table border stripe emptyText="">
<uni-tr>
<uni-th>SDK名称</uni-th>
<uni-th>场景描述</uni-th>
<uni-th>收集个人信息的类型</uni-th>
</uni-tr>
<uni-tr>
<uni-td>MobTech,ShareSDK</uni-td>
<uni-td>社交分享,第三方登录</uni-td>
<uni-td>
系统运营信息、网络状态信息、MAC地址、国际移动设备识别码(IMEI)、匿名设备标识符(OAID)、国际移动用户识别码(IMSI)、应用列表信息、基站信息、社交平台OpenID、地理位置
</uni-td>
</uni-tr>
</uni-table>
<view>
3.推送服务:当您使用客户端消息推送接收服务时,我们会收集您的设备信息、网络信息、位置信息与推送服务提供商(极光)进行共享,以便您能够正常收到本软件推送的消息。此外,我们将收集您的推送打开情况等统计数据与推送服务提供商(极光)共享,以协助本软件运营人员分析服务使用情况,提供更好的消息推送服务。极光收集使用实现服务所必须的个人信息,将通过【加密通道】将消息和通知推送给您。
</view>
<view>极光SDK绝不收集或者要求您提供包括但不限于个人种族、政治倾向、宗教、信仰、个人基因数据或生物特征数据、性取向等个人敏感信息。当我们要将收集而来的个人信息用于本政策未载明的其它用途时,会事先征求您的同意。
</view>
<view>如您拒绝开启消息推送服务,以上信息将不会共享给第三方,且仅影响消息推送服务功能,不影响其他功能的正常使用。</view>
<view> 极光SDK收集信息及目的如下:</view>
<uni-table border stripe emptyText="">
<uni-tr>
<uni-th>权限类型</uni-th>
<uni-th>内容</uni-th>
<uni-th>目的</uni-th>
</uni-tr>
<uni-tr>
<uni-td>设备信息</uni-td>
<uni-td>设备标识符(IMEI、IDFA、Android
ID、MAC、OAID等相关信息)、应用信息或运行中的进程信息(应用崩溃信息、通知开关状态、软件列表等相关信息)、设备参数及系统信息(设备类型、设备型号、操作系统及硬件相关信息)
</uni-td>
<uni-td>
用于识别唯一用户,保证消息推送的精准送达;优化推送通道资源,我们会根据设备上不同APP的活跃情况,整合消息推送的通道资源,为开发者提高消息送达率;为开发者提供智能标签以及展示业务统计信息的服务
</uni-td>
</uni-tr>
<uni-tr>
<uni-td>网络信息</uni-td>
<uni-td>
</uni-td>
<uni-td>
优化SDK与极光服务器的网络连接请求,保证服务的稳定性和连续性。</uni-td>
</uni-tr>
<uni-tr>
<uni-td>位置信息</uni-td>
<uni-td></uni-td>
<uni-td>
实现区域推送功能。 </uni-td>
</uni-tr>
</uni-table>
<view> 提请您注意并知悉:极光 SDK 为实现上述业务功能,收集您终端用户“设备信 息”、“网络信息”和/或“位置信息”的前提是,终端用户授权同意开启“读 写 SD
卡权限”、“网络访问权限”、“设备信息权限”和/或“位置权限”。 如果您的终端用户不想被收集上述信息,可以通过关闭“读写 SD 卡权限”、“网 络访问权限”、“设备信息权限”和/或“位置权限”实现。</view>
<view style="text-indent: 0em"> 更多内容请参考极光隐私政策链接:https://www.jiguang.cn/license/privacy</view>
<view>4.分析统计 : 为分析产品与服务的使用情况,提升用户使用的体验,我们会与移动应用统计服务商友盟统计共享产品使用情况(打开、闪退、崩溃)的统计性数据,以及硬件
型号、操作系统版本号、网络设备硬件地址、软件版本号、网络信息、启动来源、 使用时长、地理位置、访问路经等统计性数据,这些数据难以与其他信息结合识 别您的个人身份,将通过加密技术传输,我们不会在您同意隐私协议并同意获取
相应数据前分享给相应 SDK。</view>
<view> 各项业务功能对系统隐私权限的调用,将在经过您的授权后开启,您可 以随时在系统中取消授权。取消授权会导致您无法使用相关业务功能, 但不会导致最终用户无法使用其他业务功能的使用。</view>
<view> 友 盟 +SDK 需要收集您的唯一设备识别码( 如 IMEI/android ID/IDFA/OPENUDID/GUID、SIM 卡 IMSI
信息)、您安装的应用信息或运行中的进程信息,无法通过唯一设备识别码标识设备的特殊情况下(如您使用平板设备或电视盒子时)收 集设备 Mac 地址作为用户唯一标识以提供统计分析服务,并获取您的 位置信息及 IP
地址校准用户地域分布数据,提供基础反作弊能力。</view>
<view style="text-indent: 0;">具体获取权限及其用途列表如下</view>
<view class="" style="width: 100%;">
<uni-table border stripe emptyText="">
<uni-tr>
<uni-th>权限</uni-th>
<uni-th>用途</uni-th>
</uni-tr>
<uni-tr>
<uni-td> ACCESS_NETWORK_STATE</uni-td>
<uni-td>检测联网方式,在网络异常状态下避免数据发送,节省流量和电量。</uni-td>
</uni-tr>
<uni-tr>
<uni-td>READ_PHONE_STATE</uni-td>
<uni-td>获取用户设备的 IMEI,通过 IMEI 对用户进行唯一标识,以便提供统计分析服务。</uni-td>
</uni-tr>
<uni-tr>
<uni-td>ACCESS_WIFI_STATE </uni-td>
<uni-td> 获取 WIFI mac 地址,在平板设备或电视盒子上,无法通过 IMEI 标识设备,我们会将 WIFI mac 地址作为用户的唯一标识,以便正
常提供统计分析服务。</uni-td>
</uni-tr>
<uni-tr>
<uni-td>INTERNET</uni-td>
<uni-td>
允许应用程序联网和发送统计数据的权限,以便提供统计分析服务。
</uni-td>
</uni-tr>
<uni-tr>
<uni-td>ACCESS_FINE_LOCATION(可选) </uni-td>
<uni-td>
通过获取位置信息,为开发者提供反作弊功能,剔除作弊设备; 同时校正用户的地域分布数据,使报表数据更加准确。
</uni-td>
</uni-tr>
<uni-tr>
<uni-td>ACCESS_COARSE_LOCATION(可选)</uni-td>
<uni-td>
通过获取位置信息,为开发者提供反作弊功能,剔除作弊设备; 同时校正用户的地域分布数据,使报表数据更加准确。
</uni-td>
</uni-tr>
</uni-table>
</view>
<view> 友盟 SDK 安全能力通过:</view>
<view> 公安部三级等保认证(非银机构最高安全等级);</view>
<view> ISO27001 信息安全管理体系认证;</view>
<view> ISO27018 公有云个人信息保护体系认证。</view>
<view> 更多内容请参考友盟隐私政策链接:https://www.umeng.com/page/policy</view>
<view>
5.语音服务:当您使用客户端语音搜索服务时,我们会向提供该服务的科大讯飞股份有限公司(以下称“讯飞”)共享您的设备标识信息,地理位置信息,以确保您的语音功能能够正常使用。以上信息将在您授权后收集。关于讯飞收集个人信息的保护规则及退出机制等。更多内容,详见讯飞官网隐私政策页面:https://www.xfyun.cn/doc/policy/privacy.html。
</view>
<view style="text-indent: 0; padding: 20rpx 0;"> 十一、联系我们</view>
<view> 1.如果您对个人信息保护问题有投诉、建议、疑问,您可通过登录“泉医到家”客户端内的“举报反馈”页面与我们联系,我们核查并验证您的用户身份后会在15个工作日内反馈您的投诉与举报 。</view>
<view> 2.如对本隐私政策内容有任何疑问、意见或建议,您也可通过登录“泉医到家”客户端内的“举报反馈”页面与我们联系。</view>
<view> 3.APP运营单位:山东新医路信息科技有限公司,地址:山东省济南市槐荫区经十路22799号银座中心2号楼1608室, 联系电话:0558-69900398。</view>
<view></view>
<view></view>
<view></view>
</view>
</template>
<script>
</script>
<style>
</style>

View File

@ -9,6 +9,9 @@
</template>
<script>
import {
createMobileToken
} from '@/api/login/index.js'
export default {
data() {
return {};
@ -18,6 +21,10 @@
},
methods: {
info() {
var that = this
createMobileToken().then(res => {
uni.setStorageSync("token", res.data.token)
})
setTimeout(() => {
uni.reLaunch({
url: '/pages/homepage/homepage',

View File

@ -1,120 +1,107 @@
.app {
padding: 0;
height: 100vh;
padding: 3%;
.img{
line-height: 90rpx;
view{
font-size: 32rpx;
padding: 20rpx 0;
}
image{
width: 100%;
height: 700rpx;
}
}
.details {
width: 100%;
height: 250rpx;
background: #FFFFFF;
.app {
.btnsuccess,
.btnreturn {
width: 496rpx;
height: 70rpx;
border-radius: 5rpx;
text-align: center;
line-height: 70rpx;
font-size: 32rpx;
}
.btnsuccess {
margin: 100rpx auto 0;
background: #4271B9;
color: #fff;
}
.btnreturn {
margin: 25rpx auto 0;
color: #4271B9;
border: 1px solid #4271B9;
}
.top {
padding-bottom: 40rpx;
background-color: #fff;
width: 96%;
margin: 15rpx auto 0;
color: #333333;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20rpx;
margin: 0 auto;
position: relative;
border-radius: 5rpx;
image {
width: 170rpx;
height: 170rpx;
border-radius: 10rpx;
margin: 20rpx 0 0 30rpx;
}
.content {
margin-left: 50rpx;
font-size: 30rpx;
.detailsinfo {
width: 60%;
height: 200rpx;
border-radius: 10rpx;
position: absolute;
top: 12%;
left: 35%;
.change {
width: 100%;
color: #000000;
font-size: 34rpx;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
.item {
line-height: 60rpx;
}
.time {
width: 100%;
font-size: 32rpx;
color: #999999;
position: absolute;
top: 32%;
line-height: 90rpx;
}
.price {
width: 100%;
font-size: 30rpx;
color: #D43953;
position: absolute;
top: 65%;
.address {
position: relative;
line-height: 45rpx;
.text {
width: 80%;
}
.daohang {
position: absolute;
top: 50%;
transform: translateY(-50%);
right: 10rpx;
display: inline-block;
width: 100rpx;
}
.p {
padding-left: 30rpx;
font-size: 24rpx;
color: #EA706A;
}
image {
position: absolute;
top: 50%;
left: 0rpx;
transform: translateY(-40%);
width: 25rpx;
height: 25rpx;
}
}
}
}
.info {
width: 100%;
background: #FFFFFF;
box-shadow: 0px 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20rpx;
position: relative;
top: 20rpx;
.item {
line-height: 110rpx;
border-bottom: 1rpx solid #D8D4D4;
font-size: 32rpx;
color: #000000;
margin-left: 30rpx;
}
}
.submit {
width: 100%;
.title {
border-bottom: 1rpx solid #E6E6E6;
display: flex;
height: 100rpx;
height: 68rpx;
font-size: 32rpx;
color: #FFFFFF;
text-align: center;
position: fixed;
bottom: 80rpx;
// background-color: red;
left: 15%;
// padding: 20rpx;
.return {
width: 216rpx;
height: 68rpx;
background: #E1AE3C;
border-radius: 26rpx;
line-height: 68rpx;
display: inline-block;
line-height: 100rpx;
width: 100%;
position: relative;
.righttext{
position: absolute;
right:20rpx;
top:50%;
transform: translateY(-50%);
font-size: 34rpx;
color: #EA706A;
}
.text {
font-size: 34rpx;
line-height: 100rpx;
padding-left: 18rpx;
}
.finish {
width: 217rpx;
height: 68rpx;
line-height: 68rpx;
background: #4C7BC9;
border-radius: 26rpx;
display: inline-block;
margin-left: 30rpx;
image {
margin: 50rpx 0 0 35rpx;
transform: translateY(-50%);
width: 40rpx;
height: 40rpx;
}
}
}

View File

@ -1,55 +1,65 @@
<template>
<view class="app">
<view class="details">
<image :src="baseurl+list.itemPictureUrl" mode=""></image>
<view class="detailsinfo">
<view class="change">
<view class="app" v-if="baseurl">
<view class="top">
<view class="title">
<image src="../../static/fuwu.png" mode=""></image>
<view class="text">
{{list.nurseItemName}}
</view>
<view class="righttext" >
¥{{list.totalPrice}}
</view>
</view>
<view class="content">
<view class="time">
服务时长: {{list.itemServeDurationUnit}}
时间:{{list.serviceDate}}
<span style='padding-left: 10rpx;'>{{list.serviceStartTime}}</span>
</view>
<view class="price">
¥ {{list.totalPrice}}
<view class="address">
地点:{{list.serviceAddress}}
</view>
</view>
</view>
<view class="info">
<view class="item">
姓名: {{list.patientName}}
<view class="top">
<view class="title">
<image src="../../static/user.png" mode=""></image>
<view class="text">
用户信息
</view>
</view>
<view class="item">
电话:{{list.phone}}
</view>
<view class="item" style="border:none;line-height: 60rpx;padding: 20rpx 0;">
地址:{{list.serviceAddress}}
<view class="content" style="margin-top: 20rpx;">
<view class="item">
姓名:{{list.patientName}}
</view>
<view class="item">
年龄:{{list.age}}
</view>
<view class="item">
电话:{{list.phone}}
</view>
<view class="item address" @tap='getlocations'>
<view class="text" style="line-height: 60rpx;">
住址:{{list.address}}
</view>
<view class="daohang">
<image src="../../static/daohang.png" mode=""></image>
<span class='p'>导航</span>
</view>
</view>
<view class="item">
是否失能:{{list.disablingCondition=="NOT_DISABLED"?'未失能':''}}
{{list.disablingCondition=="DISABLED"?'已失能':''}}
</view>
<view class="item" v-if="list.disablingCondition=='DISABLED'">
失能情况:{{list.disablingReason}}
</view>
</view>
</view>
<view class="img" v-if="list.orderStatus=='COMPLETE'||list.orderStatus=='EVALUATED'">
<view class="">
护理员到岗照片
</view>
<image :src="baseurl+list.onDutyPictureUrl" mode=""></image>
<view class="btnsuccess" v-if="list.orderStatus!='COMPLETE'" @tap='goconfirmCompletion'>
去完成
</view>
<view class="img" v-if="list.orderStatus=='COMPLETE'||list.orderStatus=='EVALUATED'">
<view class="" >
服务结束照片
</view>
<image :src="baseurl+list.serviceEndPictureUrl" mode=""></image>
</view>
<view class="img" v-if="list.orderStatus=='COMPLETE'||list.orderStatus=='EVALUATED'">
<view class="">
签名
</view>
<image :src="baseurl+list.userSignaturePictureUrl" mode=""></image>
</view>
<view class="submit">
<view class="return" @tap='goreturn' v-if="list.orderStatus=='NOT_FINISH'">
任务退回
</view>
<view class="finish" @tap='gocomplete' v-if="list.orderStatus=='NOT_FINISH'">
去完成
</view>
<view class="btnreturn" @tap='gotaskReturn' v-if="list.orderStatus!='COMPLETE'">
退回
</view>
</view>
</template>
@ -57,36 +67,70 @@
<script>
import {
taskDetails
} from '@/api/taskDetails.js'
} from '@/api/taskDetails/taskDetails.js'
import baseurl from '@/api/baseurl.js'
export default {
data() {
return {
baseurl: '',
list: {},
orderDetailsId: null,
baseurl: null,
list: {}, //详情对象
tude: { //经纬度
latitude: null,
longitude: null,
},
orderDetailsId: null, //工单id
}
},
methods: {
//详情接口
taskDetailsinfo(orderDetailsId) {
taskDetails(orderDetailsId).then(res => {
this.list = res.data
if (res.code == 200) {
this.list = res.data
}
this.baseurl = baseurl
})
},
goreturn() {
uni.navigateTo({
url: `/pages/taskReturn/taskReturn?orderNo=${this.list.orderNo}`
//经纬度
getlocations() {
let that = this
uni.request({
url: 'https://apis.map.qq.com/ws/geocoder/v1/?address=',
method: 'GET',
data: {
key: '3VABZ-6LZWK-YPAJ3-AMQED-D7RUK-VPB37', //高德地图key
address: that.list.address // 详细地址
},
success: function(res) {
that.tude.latitude = res.data.result.location.lat
that.tude.longitude = res.data.result.location.lng
that.goaddress();
},
fail(err) {}
})
},
gocomplete() {
//跳转地图
goaddress() {
let that = this
uni.openLocation({
latitude: Number(that.tude.latitude),
longitude: Number(that.tude.longitude),
})
},
//退回
gotaskReturn() {
uni.navigateTo({
url: `/pages/confirmCompletion/confirmCompletion?orderDetailsId=${this.list.orderDetailsId}&orderNo=${this.list.orderNo}`
url: `/pages/taskReturn/taskReturn?item=${JSON.stringify(this.list)}`
})
},
//去完成
goconfirmCompletion() {
uni.navigateTo({
url: `/pages/confirmCompletion/confirmCompletion?list=${JSON.stringify(this.list)}&&orderDetailsId=${this.list.orderDetailsId}`
})
},
},
onLoad(options) {
this.baseurl = baseurl
this.orderDetailsId = options.orderDetailsId
},
onShow() {

View File

@ -1,17 +1,38 @@
<template>
<view class="app">
<view class="return">
<view class="reason">
退回原因
<view class="top">
<view class="title">
<image src="../../static/fuwu.png" mode=""></image>
<view class="text">
陪诊
</view>
</view>
<view class="reason" style="border: none;margin: 20rpx 0 0 50rpx;">
<input type="text" placeholder="请填写" v-model="taskReturnReason" />
<view class="content">
<view class="time">
时间:2023-02-07 8:00-12:00
</view>
<view class="address">
地点:山东省立医院东院区
</view>
</view>
</view>
<view class="submit">
<view class="finish" @tap='taskreturn'>
确定
<view class="bottom">
<view class="title">
<image src="../../static/no.png" mode=""></image>
<view class="text">
拒绝原因(多选)
</view>
</view>
<view class="checkboxs">
<u-checkbox-group @change="checkboxGroupChange" :wrap='true'>
<u-checkbox @change="checkboxChange" v-model="item.checked" v-for="(item, index) in list"
:key="index" :name="item.name" shape='circle'>{{item.name}}</u-checkbox>
</u-checkbox-group>
</view>
<u-input v-model="value" type="text" :border="true" border-color='#E6E6E6' placeholder='请在此输入' />
</view>
<view class="btn" @tap='taskreturn'>
立即提交
</view>
<u-toast ref="uToast" />
</view>
@ -24,13 +45,45 @@
export default {
data() {
return {
orderNo: null,
taskReturnReason: null,
item: null, //传值item
nursePersonId: 35, //护理员id
taskReturnReason: '',
value: '', //input绑定
list: [{
name: '与其他工单时间冲突',
checked: false,
}, {
name: '服务要求较高,当前资质无法完成',
checked: false,
}, {
name: '距离较远无法到达',
checked: false,
}, {
name: '距离较远无法到达',
checked: false,
}, {
name: '其它',
checked: false,
}]
}
},
methods: {
// 选中某个复选框时,由checkbox时触发
checkboxChange(e) {},
// 选中任一checkbox时,由checkbox-group触发
checkboxGroupChange(e) {
e.forEach(e => {
this.taskReturnReason += e + ';'
})
},
taskreturn() {
orderFallback(this.orderNo, this.taskReturnReason).then(res => {
var obj = {
"appointmentOrderId": this.item.id,
"stationPersonId": this.nursePersonId,
"appointmentOrderNo": this.item.orderNo,
"taskReturnReason": this.taskReturnReason,
}
orderFallback(obj).then(res => {
this.$refs.uToast.show({
title: '任务退回成功',
type: 'success',
@ -45,54 +98,88 @@
},
},
onLoad(options) {
this.orderNo = options.orderNo
this.item = JSON.parse(options.item)
console.log(this.item)
},
}
</script>
<style lang="scss">
::v-deep .u-input {
border: 1rpx solid #E6E6E6;
width: 85%;
display: block;
margin: 20rpx auto;
}
::v-deep .u-checkbox {
height: 80rpx !important;
}
.app {
padding: 0;
// font-size: 35rpx;
height: 100vh;
padding: 3%;
.return {
width: 98%;
height: 342rpx;
background: #FFFFFF;
box-shadow: 0px 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 20rpx;
margin: 0 auto;
.btn {
width: 496rpx;
height: 58rpx;
background: #4271B9;
border-radius: 5rpx;
margin: 80rpx auto;
text-align: center;
line-height: 58rpx;
color: #fff;
}
.reason {
width: 93%;
height: 80rpx;
.checkboxs {
padding-left: 50rpx;
}
.bottom {
padding-bottom: 40rpx;
}
.bottom,
.top {
background-color: #fff;
width: 96%;
margin: 15rpx auto 0;
color: #333333;
box-shadow: 0rpx 9rpx 31rpx 9rpx rgba(0, 0, 0, 0.03);
border-radius: 5rpx;
}
.top {
padding-bottom: 40rpx;
.content {
margin-left: 50rpx;
font-size: 30rpx;
color: #030303;
line-height: 80rpx;
border-bottom: 1rpx solid #D8D4D4;
margin: 0 auto;
.time {
line-height: 90rpx;
}
.address {}
}
}
.submit {
height: 68rpx;
font-size: 32rpx;
color: #FFFFFF;
text-align: center;
position: fixed;
bottom: 80rpx;
left: 60%;
.title {
border-bottom: 1rpx solid #E6E6E6;
display: flex;
height: 100rpx;
line-height: 100rpx;
.finish {
width: 217rpx;
height: 68rpx;
line-height: 68rpx;
background: #4C7BC9;
border-radius: 26rpx;
margin-left: 30rpx;
.text {
font-size: 34rpx;
line-height: 100rpx;
padding-left: 18rpx;
}
image {
margin: 50rpx 0 0 35rpx;
transform: translateY(-50%);
width: 40rpx;
height: 40rpx;
}
}
}

View File

@ -0,0 +1,671 @@
<template>
<view class="u-calendar">
<!-- <view class="u-calendar__header">
<view class="u-calendar__header__text" v-if="!$slots['tooltip']">
{{toolTip}}
</view>
<slot v-else name="tooltip" />
</view> -->
<view class="u-calendar__action u-flex u-row-center">
<view class="u-calendar__action__icon">
<u-icon v-if="changeYear" name="arrow-left-double" :color="yearArrowColor"
@click="changeYearHandler(0)"></u-icon>
</view>
<view class="u-calendar__action__icon">
<u-icon v-if="changeMonth" name="arrow-left" :color="monthArrowColor" @click="changeMonthHandler(0)">
</u-icon>
</view>
<view class="u-calendar__action__text">{{ showTitle }}</view>
<view class="u-calendar__action__icon">
<u-icon v-if="changeMonth" name="arrow-right" :color="monthArrowColor" @click="changeMonthHandler(1)">
</u-icon>
</view>
<view class="u-calendar__action__icon">
<u-icon v-if="changeYear" name="arrow-right-double" :color="yearArrowColor"
@click="changeYearHandler(1)"></u-icon>
</view>
</view>
<view class="u-calendar__week-day">
<view class="u-calendar__week-day__text" v-for="(item, index) in weekDayZh" :key="index">{{item}}</view>
</view>
<view class="u-calendar__content">
<!-- 前置空白部分 -->
<block v-for="(item, index) in weekdayArr" :key="index">
<view class="u-calendar__content__item"></view>
</block>
<view class="u-calendar__content__item" :class="{
'u-hover-class':openDisAbled(year,month,index+1),
'u-calendar__content--start-date': (mode == 'range' && startDate==`${year}-${month}-${index+1}`) || mode== 'date',
'u-calendar__content--end-date':(mode== 'range' && endDate==`${year}-${month}-${index+1}`) || mode == 'date'
}" :style="{backgroundColor: getColor(index,1)}" v-for="(item, index) in daysArr" :key="index"
@tap="dateClick(index)">
<view class="u-calendar__content__item__inner" :style="{color: getColor(index,2)}">
<view>{{ index + 1 }}</view>
</view>
<view class="u-calendar__content__item__tips" :style="{color:activeColor}"
v-if="mode== 'range' && startDate==`${year}-${month}-${index+1}` && startDate!=endDate">
{{startText}}
</view>
<view class="u-calendar__content__item__tips" :style="{color:activeColor}"
v-if="mode== 'range' && endDate==`${year}-${month}-${index+1}`">{{endText}}</view>
</view>
<view class="u-calendar__content__bg-month">{{month}}</view>
</view>
<view class="u-calendar__bottom">
<view class="u-calendar__bottom__choose">
<text>{{mode == 'date' ? activeDate : startDate}}</text>
<text v-if="endDate">至{{endDate}}</text>
</view>
<view class="u-calendar__bottom__btn">
<view class="btn" @click="btnFix(false)">
确定
</view>
<!-- <u-button :type="btnType" shape="circle" size="default" @click="btnFix(false)">确定</u-button> -->
</view>
</view>
</view>
</template>
<script>
/**
* calendar 日历
* @description 此组件用于单个选择日期,范围选择日期等,日历被包裹在底部弹起的容器中。
* @tutorial http://uviewui.com/components/calendar.html
* @property {String} mode 选择日期的模式,date-为单个日期,range-为选择日期范围
* @property {Boolean} v-model 布尔值变量,用于控制日历的弹出与收起
* @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配(默认false)
* @property {Boolean} change-year 是否显示顶部的切换年份方向的按钮(默认true)
* @property {Boolean} change-month 是否显示顶部的切换月份方向的按钮(默认true)
* @property {String Number} max-year 可切换的最大年份(默认2050)
* @property {String Number} min-year 可切换的最小年份(默认1950)
* @property {String Number} min-date 最小可选日期(默认1950-01-01)
* @property {String Number} max-date 最大可选日期(默认当前日期)
* @property {String Number} 弹窗顶部左右两边的圆角值,单位rpx(默认20)
* @property {Boolean} mask-close-able 是否允许通过点击遮罩关闭日历(默认true)
* @property {String} month-arrow-color 月份切换按钮箭头颜色(默认#606266)
* @property {String} year-arrow-color 年份切换按钮箭头颜色(默认#909399)
* @property {String} color 日期字体的默认颜色(默认#303133)
* @property {String} active-bg-color 起始/结束日期按钮的背景色(默认#2979ff)
* @property {String Number} z-index 弹出时的z-index值(默认10075)
* @property {String} active-color 起始/结束日期按钮的字体颜色(默认#ffffff)
* @property {String} range-bg-color 起始/结束日期之间的区域的背景颜色(默认rgba(41,121,255,0.13))
* @property {String} range-color 选择范围内字体颜色(默认#2979ff)
* @property {String} start-text 起始日期底部的提示文字(默认 '开始')
* @property {String} end-text 结束日期底部的提示文字(默认 '结束')
* @property {String} btn-type 底部确定按钮的主题(默认 'primary')
* @property {String} toolTip 顶部提示文字,如设置名为tooltip的slot,此参数将失效(默认 '选择日期')
* @property {Boolean} closeable 是否显示右上角的关闭图标(默认true)
* @example <u-calendar v-model="show" :mode="mode"></u-calendar>
*/
export default {
name: 'u-calendar',
props: {
safeAreaInsetBottom: {
type: Boolean,
default: false
},
// 是否允许通过点击遮罩关闭Picker
maskCloseAble: {
type: Boolean,
default: true
},
// 通过双向绑定控制组件的弹出与收起
value: {
type: Boolean,
default: false
},
// 弹出的z-index值
zIndex: {
type: [String, Number],
default: 0
},
// 是否允许切换年份
changeYear: {
type: Boolean,
default: true
},
// 是否允许切换月份
changeMonth: {
type: Boolean,
default: true
},
// date-单个日期选择,range-开始日期+结束日期选择
mode: {
type: String,
default: 'date'
},
// 可切换的最大年份
maxYear: {
type: [Number, String],
default: 2050
},
// 可切换的最小年份
minYear: {
type: [Number, String],
default: 1950
},
// 最小可选日期(不在范围内日期禁用不可选)
minDate: {
type: [Number, String],
default: '1950-01-01'
},
/**
* 最大可选日期
* 默认最大值为今天,之后的日期不可选
* 2030-12-31
* */
maxDate: {
type: [Number, String],
default: ''
},
// 弹窗顶部左右两边的圆角值
borderRadius: {
type: [String, Number],
default: 20
},
// 月份切换按钮箭头颜色
monthArrowColor: {
type: String,
default: '#606266'
},
// 年份切换按钮箭头颜色
yearArrowColor: {
type: String,
default: '#909399'
},
// 默认日期字体颜色
color: {
type: String,
default: '#303133'
},
// 选中|起始结束日期背景色
activeBgColor: {
type: String,
default: '#4271B9'
},
// 选中|起始结束日期字体颜色
activeColor: {
type: String,
default: '#ffffff'
},
// 范围内日期背景色
rangeBgColor: {
type: String,
default: 'rgba(41,121,255,0.13)'
},
// 范围内日期字体颜色
rangeColor: {
type: String,
default: '#4271B9'
},
// mode=range时生效,起始日期自定义文案
startText: {
type: String,
default: '开始'
},
// mode=range时生效,结束日期自定义文案
endText: {
type: String,
default: '结束'
},
//按钮样式类型
btnType: {
type: String,
default: 'primary'
},
// 当前选中日期带选中效果
isActiveCurrent: {
type: Boolean,
default: true
},
// 切换年月是否触发事件 mode=date时生效
isChange: {
type: Boolean,
default: false
},
// 是否显示右上角的关闭图标
closeable: {
type: Boolean,
default: true
},
// 顶部的提示文字
toolTip: {
type: String,
default: '选择日期'
}
},
data() {
return {
// 星期几,值为1-7
weekday: 1,
weekdayArr: [],
// 当前月有多少天
days: 0,
daysArr: [],
showTitle: '',
year: 2020,
month: 0,
day: 0,
startYear: 0,
startMonth: 0,
startDay: 0,
endYear: 0,
endMonth: 0,
endDay: 0,
today: '',
activeDate: '',
startDate: '',
endDate: '',
isStart: true,
min: null,
max: null,
weekDayZh: ['日', '一', '二', '三', '四', '五', '六']
};
},
computed: {
dataChange() {
return `${this.mode}-${this.minDate}-${this.maxDate}`;
},
uZIndex() {
// 如果用户有传递z-index值,优先使用
return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
}
},
watch: {
dataChange(val) {
this.init()
}
},
created() {
this.init()
},
methods: {
getColor(index, type) {
let color = type == 1 ? '' : this.color;
let day = index + 1
let date = `${this.year}-${this.month}-${day}`
let timestamp = new Date(date.replace(/\-/g, '/')).getTime();
let start = this.startDate.replace(/\-/g, '/')
let end = this.endDate.replace(/\-/g, '/')
if ((this.isActiveCurrent && this.activeDate == date) || this.startDate == date || this.endDate == date) {
color = type == 1 ? this.activeBgColor : this.activeColor;
} else if (this.endDate && timestamp > new Date(start).getTime() && timestamp < new Date(end).getTime()) {
color = type == 1 ? this.rangeBgColor : this.rangeColor;
}
return color;
},
init() {
let now = new Date();
this.year = now.getFullYear();
this.month = now.getMonth() + 1;
this.day = now.getDate();
this.today = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;
this.activeDate = this.today;
this.min = this.initDate(this.minDate);
this.max = this.initDate(this.maxDate || this.today);
this.startDate = "";
this.startYear = 0;
this.startMonth = 0;
this.startDay = 0;
this.endYear = 0;
this.endMonth = 0;
this.endDay = 0;
this.endDate = "";
this.isStart = true;
this.changeData();
},
//日期处理
initDate(date) {
let fdate = date.split('-');
return {
year: Number(fdate[0] || 1920),
month: Number(fdate[1] || 1),
day: Number(fdate[2] || 1)
}
},
openDisAbled: function(year, month, day) {
let bool = true;
let date = `${year}/${month}/${day}`;
// let today = this.today.replace(/\-/g, '/');
let min = `${this.min.year}/${this.min.month}/${this.min.day}`;
let max = `${this.max.year}/${this.max.month}/${this.max.day}`;
let timestamp = new Date(date).getTime();
if (timestamp >= new Date(min).getTime() && timestamp <= new Date(max).getTime()) {
bool = false;
}
return bool;
},
generateArray: function(start, end) {
return Array.from(new Array(end + 1).keys()).slice(start);
},
formatNum: function(num) {
return num < 10 ? '0' + num : num + '';
},
//一个月有多少天
getMonthDay(year, month) {
let days = new Date(year, month, 0).getDate();
return days;
},
getWeekday(year, month) {
let date = new Date(`${year}/${month}/01 00:00:00`);
return date.getDay();
},
checkRange(year) {
let overstep = false;
if (year < this.minYear || year > this.maxYear) {
uni.showToast({
title: "日期超出范围啦~",
icon: 'none'
})
overstep = true;
}
return overstep;
},
changeMonthHandler(isAdd) {
if (isAdd) {
let month = this.month + 1;
let year = month > 12 ? this.year + 1 : this.year;
if (!this.checkRange(year)) {
this.month = month > 12 ? 1 : month;
this.year = year;
this.changeData();
}
} else {
let month = this.month - 1;
let year = month < 1 ? this.year - 1 : this.year;
if (!this.checkRange(year)) {
this.month = month < 1 ? 12 : month;
this.year = year;
this.changeData();
}
}
},
changeYearHandler(isAdd) {
let year = isAdd ? this.year + 1 : this.year - 1;
if (!this.checkRange(year)) {
this.year = year;
this.changeData();
}
},
changeData() {
this.days = this.getMonthDay(this.year, this.month);
this.daysArr = this.generateArray(1, this.days)
this.weekday = this.getWeekday(this.year, this.month);
this.weekdayArr = this.generateArray(1, this.weekday)
this.showTitle = `${this.year}年${this.month}月`;
if (this.isChange && this.mode == 'date') {
this.btnFix(true);
}
},
dateClick: function(day) {
day += 1;
if (!this.openDisAbled(this.year, this.month, day)) {
this.day = day;
let date = `${this.year}-${this.month}-${day}`;
if (this.mode == 'date') {
this.activeDate = date;
} else {
let compare = new Date(date.replace(/\-/g, '/')).getTime() < new Date(this.startDate.replace(
/\-/g, '/')).getTime()
if (this.isStart || compare) {
this.startDate = date;
this.startYear = this.year;
this.startMonth = this.month;
this.startDay = this.day;
this.endYear = 0;
this.endMonth = 0;
this.endDay = 0;
this.endDate = "";
this.activeDate = "";
this.isStart = false;
} else {
this.endDate = date;
this.endYear = this.year;
this.endMonth = this.month;
this.endDay = this.day;
this.isStart = true;
}
}
}
},
close() {
// 修改通过v-model绑定的父组件变量的值为false,从而隐藏日历弹窗
this.$emit('input', false);
},
getWeekText(date) {
date = new Date(`${date.replace(/\-/g, '/')} 00:00:00`);
let week = date.getDay();
return '星期' + ['日', '一', '二', '三', '四', '五', '六'][week];
},
btnFix(show) {
if (!show) {
this.close();
}
if (this.mode == 'date') {
let arr = this.activeDate.split('-')
let year = this.isChange ? this.year : Number(arr[0]);
let month = this.isChange ? this.month : Number(arr[1]);
let day = this.isChange ? this.day : Number(arr[2]);
//当前月有多少天
let days = this.getMonthDay(year, month);
let result = `${year}-${this.formatNum(month)}-${this.formatNum(day)}`;
let weekText = this.getWeekText(result);
let isToday = false;
if (`${year}-${month}-${day}` == this.today) {
//今天
isToday = true;
}
this.$emit('change', {
year: year,
month: month,
day: day,
days: days,
result: result,
week: weekText,
isToday: isToday,
// switch: show //是否是切换年月操作
});
} else {
if (!this.startDate || !this.endDate) return;
let startMonth = this.formatNum(this.startMonth);
let startDay = this.formatNum(this.startDay);
let startDate = `${this.startYear}-${startMonth}-${startDay}`;
let startWeek = this.getWeekText(startDate)
let endMonth = this.formatNum(this.endMonth);
let endDay = this.formatNum(this.endDay);
let endDate = `${this.endYear}-${endMonth}-${endDay}`;
let endWeek = this.getWeekText(endDate);
this.$emit('change', {
startYear: this.startYear,
startMonth: this.startMonth,
startDay: this.startDay,
startDate: startDate,
startWeek: startWeek,
endYear: this.endYear,
endMonth: this.endMonth,
endDay: this.endDay,
endDate: endDate,
endWeek: endWeek
});
}
}
}
};
</script>
<style scoped lang="scss">
// 定义混入指令,用于在非nvue环境下的flex定义,因为nvue没有display属性,会报错
@mixin vue-flex($direction: row) {
/* #ifndef APP-NVUE */
display: flex;
flex-direction: $direction;
/* #endif */
}
.u-calendar {
color: $u-content-color;
// transform: scale(0.8);
// width: 100%;
// height: 800rpx;
.btn {
width: 496rpx;
height: 70rpx;
background: #4271B9;
border-radius: 5rpx;
line-height: 70rpx;
text-align: center;
color: #fff;
font-size: 34rpx;
font-weight: 600;
margin: 0 auto;
}
&__header {
width: 100%;
box-sizing: border-box;
font-size: 30rpx;
background-color: #fff;
color: $u-main-color;
&__text {
margin-top: 30rpx;
padding: 0 60rpx;
@include vue-flex;
justify-content: center;
align-items: center;
}
}
&__action {
padding: 40rpx 0 40rpx 0;
&__icon {
margin: 0 16rpx;
}
&__text {
padding: 0 16rpx;
color: $u-main-color;
font-size: 32rpx;
line-height: 32rpx;
font-weight: bold;
}
}
&__week-day {
@include vue-flex;
align-items: center;
justify-content: center;
padding: 6px 0;
overflow: hidden;
&__text {
flex: 1;
text-align: center;
}
}
&__content {
width: 100%;
@include vue-flex;
flex-wrap: wrap;
padding: 6px 0;
box-sizing: border-box;
background-color: #fff;
position: relative;
&--end-date {
border-top-right-radius: 8rpx;
border-bottom-right-radius: 8rpx;
}
&--start-date {
border-top-left-radius: 8rpx;
border-bottom-left-radius: 8rpx;
}
&__item {
width: 14.2857%;
@include vue-flex;
align-items: center;
justify-content: center;
padding: 6px 0;
overflow: hidden;
position: relative;
z-index: 2;
&__inner {
height: 84rpx;
@include vue-flex;
align-items: center;
justify-content: center;
flex-direction: column;
font-size: 32rpx;
position: relative;
border-radius: 50%;
&__desc {
width: 100%;
font-size: 24rpx;
line-height: 24rpx;
transform: scale(0.75);
transform-origin: center center;
position: absolute;
left: 0;
text-align: center;
bottom: 2rpx;
}
}
&__tips {
width: 100%;
font-size: 24rpx;
line-height: 24rpx;
position: absolute;
left: 0;
transform: scale(0.8);
transform-origin: center center;
text-align: center;
bottom: 8rpx;
z-index: 2;
}
}
&__bg-month {
position: absolute;
font-size: 130px;
line-height: 130px;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
color: #e4e7ed;
z-index: 1;
}
}
&__bottom {
width: 100%;
@include vue-flex;
align-items: center;
justify-content: center;
flex-direction: column;
background-color: #fff;
padding: 0 40rpx 30rpx;
box-sizing: border-box;
font-size: 24rpx;
color: $u-tips-color;
&__choose {
height: 50rpx;
}
&__btn {
width: 100%;
}
}
}
</style>

695
pages/upicker/u-picker.vue Normal file
View File

@ -0,0 +1,695 @@
<template>
<!-- <u-popup :maskCloseAble="maskCloseAble" mode="bottom" :popup="false" v-model="value" length="auto"
:safeAreaInsetBottom="safeAreaInsetBottom" @close="close" :z-index="uZIndex"> -->
<view class="u-datetime-picker">
<!-- <view class="u-picker-header" @touchmove.stop.prevent="">
<view class="u-btn-picker u-btn-picker--tips" :style="{ color: cancelColor }" hover-class="u-opacity"
:hover-stay-time="150" @tap="getResult('cancel')">{{cancelText}}</view>
<view class="u-picker__title">{{ title }}</view>
<view class="u-btn-picker u-btn-picker--primary" :style="{ color: moving ? cancelColor : confirmColor }"
hover-class="u-opacity" :hover-stay-time="150" @touchmove.stop="" @tap.stop="getResult('confirm')">
{{confirmText}}
</view>
</view> -->
<view class="u-picker-body">
<picker-view v-if="mode == 'region'" :value="valueArr" @change="change" class="u-picker-view"
@pickstart="pickstart" @pickend="pickend">
<picker-view-column v-if="!reset && params.province">
<view class="u-column-item" v-for="(item, index) in provinces" :key="index">
<view class="u-line-1">{{ item.label }}</view>
</view>
</picker-view-column>
<picker-view-column v-if="!reset && params.city">
<view class="u-column-item" v-for="(item, index) in citys" :key="index">
<view class="u-line-1">{{ item.label }}</view>
</view>
</picker-view-column>
<picker-view-column v-if="!reset && params.area">
<view class="u-column-item" v-for="(item, index) in areas" :key="index">
<view class="u-line-1">{{ item.label }}</view>
</view>
</picker-view-column>
</picker-view>
<picker-view v-else-if="mode == 'time'" :value="valueArr" @change="change" class="u-picker-view"
@pickstart="pickstart" @pickend="pickend">
<picker-view-column v-if="!reset && params.year">
<view class="u-column-item" v-for="(item, index) in years" :key="index">
{{ item }}
<text class="u-text" v-if="showTimeTag">年</text>
</view>
</picker-view-column>
<picker-view-column v-if="!reset && params.month">
<view class="u-column-item" v-for="(item, index) in months" :key="index">
{{ formatNumber(item) }}
<text class="u-text" v-if="showTimeTag">月</text>
</view>
</picker-view-column>
<picker-view-column v-if="!reset && params.day">
<view class="u-column-item" v-for="(item, index) in days" :key="index">
{{ formatNumber(item) }}
<text class="u-text" v-if="showTimeTag">日</text>
</view>
</picker-view-column>
<picker-view-column v-if="!reset && params.hour">
<view class="u-column-item" v-for="(item, index) in hours" :key="index">
{{ formatNumber(item) }}
<text class="u-text" v-if="showTimeTag">时</text>
</view>
</picker-view-column>
<picker-view-column v-if="!reset && params.minute">
<view class="u-column-item" v-for="(item, index) in minutes" :key="index">
{{ formatNumber(item) }}
<text class="u-text" v-if="showTimeTag">分</text>
</view>
</picker-view-column>
<picker-view-column v-if="!reset && params.second">
<view class="u-column-item" v-for="(item, index) in seconds" :key="index">
{{ formatNumber(item) }}
<text class="u-text" v-if="showTimeTag">秒</text>
</view>
</picker-view-column>
</picker-view>
<picker-view v-else-if="mode == 'selector'" :value="valueArr" @change="change" class="u-picker-view"
@pickstart="pickstart" @pickend="pickend">
<picker-view-column v-if="!reset">
<view class="u-column-item" v-for="(item, index) in range" :key="index">
<view class="u-line-1">{{ getItemValue(item, 'selector') }}</view>
</view>
</picker-view-column>
</picker-view>
<picker-view v-else-if="mode == 'multiSelector'" :value="valueArr" @change="change" class="u-picker-view"
@pickstart="pickstart" @pickend="pickend">
<picker-view-column v-if="!reset" v-for="(item, index) in range" :key="index">
<view class="u-column-item" v-for="(item1, index1) in item" :key="index1">
<view class="u-line-1">{{ getItemValue(item1, 'multiSelector') }}</view>
</view>
</picker-view-column>
</picker-view>
<view class="btn">
确定
</view>
</view>
</view>
<!-- </u-popup> -->
</template>
<script>
// import provinces from '../../libs/util/province.js';
// import citys from '../../libs/util/city.js';
// import areas from '../../libs/util/area.js';
/**
* picker picker弹出选择器
* @description 此选择器有两种弹出模式:一是时间模式,可以配置年,日,月,时,分,秒参数 二是地区模式,可以配置省,市,区参数
* @tutorial https://www.uviewui.com/components/picker.html
* @property {Object} params 需要显示的参数,见官网说明
* @property {String} mode 模式选择,region-地区类型,time-时间类型(默认time)
* @property {String Number} start-year 可选的开始年份,mode=time时有效(默认1950)
* @property {String Number} end-year 可选的结束年份,mode=time时有效(默认2050)
* @property {Boolean} safe-area-inset-bottom 是否开启底部安全区适配(默认false)
* @property {Boolean} show-time-tag 时间模式时,是否显示后面的年月日中文提示
* @property {String} cancel-color 取消按钮的颜色(默认#606266)
* @property {String} confirm-color 确认按钮的颜色(默认#2979ff)
* @property {String} default-time 默认选中的时间,mode=time时有效
* @property {String} confirm-text 确认按钮的文字
* @property {String} cancel-text 取消按钮的文字
* @property {String} default-region 默认选中的地区,中文形式,mode=region时有效
* @property {String} default-code 默认选中的地区,编号形式,mode=region时有效
* @property {Boolean} mask-close-able 是否允许通过点击遮罩关闭Picker(默认true)
* @property {String Number} z-index 弹出时的z-index值(默认1075)
* @property {Array} default-selector 数组形式,其中每一项表示选择了range对应项中的第几个
* @property {Array} range 自定义选择的数据,mode=selector或mode=multiSelector时有效
* @property {String} range-key 当range参数的元素为对象时,指定Object中的哪个key的值作为选择器显示内容
* @event {Function} confirm 点击确定按钮,返回当前选择的值
* @event {Function} cancel 点击取消按钮,返回当前选择的值
* @example <u-picker v-model="show" mode="time"></u-picker>
*/
export default {
name: 'u-picker',
props: {
// picker中需要显示的参数
params: {
type: Object,
default () {
return {
year: true,
month: true,
day: true,
hour: false,
minute: false,
second: false,
province: true,
city: true,
area: true,
timestamp: true,
};
}
},
// 当mode=selector或者mode=multiSelector时,提供的数组
range: {
type: Array,
default () {
return [];
}
},
// 当mode=selector或者mode=multiSelector时,提供的默认选中的下标
defaultSelector: {
type: Array,
default () {
return [0];
}
},
// 当 range 是一个 Array<Object> 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
rangeKey: {
type: String,
default: ''
},
// 模式选择,region-地区类型,time-时间类型,selector-单列模式,multiSelector-多列模式
mode: {
type: String,
default: 'time'
},
// 年份开始时间
startYear: {
type: [String, Number],
default: 1950
},
// 年份结束时间
endYear: {
type: [String, Number],
default: 2050
},
// "取消"按钮的颜色
cancelColor: {
type: String,
default: '#606266'
},
// "确定"按钮的颜色
confirmColor: {
type: String,
default: '#2979ff'
},
// 默认显示的时间,2025-07-02 || 2025-07-02 13:01:00 || 2025/07/02
defaultTime: {
type: String,
default: ''
},
// 默认显示的地区,可传类似["河北省", "秦皇岛市", "北戴河区"]
defaultRegion: {
type: Array,
default () {
return [];
}
},
// 时间模式时,是否显示后面的年月日中文提示
showTimeTag: {
type: Boolean,
default: true
},
// 默认显示地区的编码,defaultRegion和areaCode同时存在,areaCode优先,可传类似["13", "1303", "130304"]
areaCode: {
type: Array,
default () {
return [];
}
},
safeAreaInsetBottom: {
type: Boolean,
default: false
},
// 是否允许通过点击遮罩关闭Picker
maskCloseAble: {
type: Boolean,
default: true
},
// 通过双向绑定控制组件的弹出与收起
value: {
type: Boolean,
default: false
},
// 弹出的z-index值
zIndex: {
type: [String, Number],
default: 0
},
// 顶部标题
title: {
type: String,
default: ''
},
// 取消按钮的文字
cancelText: {
type: String,
default: '取消'
},
// 确认按钮的文字
confirmText: {
type: String,
default: '确认'
}
},
data() {
return {
years: [],
months: [],
days: [],
hours: [],
minutes: [],
seconds: [],
year: 0,
month: 0,
day: 0,
hour: 0,
minute: 0,
second: 0,
reset: false,
startDate: '',
endDate: '',
valueArr: [],
// provinces: provinces,
// citys: citys[0],
// areas: areas[0][0],
province: 0,
city: 0,
area: 0,
moving: false // 列是否还在滑动中,微信小程序如果在滑动中就点确定,结果可能不准确
};
},
mounted() {
this.init();
},
computed: {
propsChange() {
// 引用这几个变量,是为了监听其变化
return `${this.mode}-${this.defaultTime}-${this.startYear}-${this.endYear}-${this.defaultRegion}-${this.areaCode}`;
},
regionChange() {
// 引用这几个变量,是为了监听其变化
return `${this.province}-${this.city}`;
},
yearAndMonth() {
return `${this.year}-${this.month}`;
},
uZIndex() {
// 如果用户有传递z-index值,优先使用
return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
}
},
watch: {
propsChange() {
this.reset = true;
setTimeout(() => this.init(), 10);
},
// 如果地区发生变化,为了让picker联动起来,必须重置this.citys和this.areas
regionChange(val) {
this.citys = citys[this.province];
this.areas = areas[this.province][this.city];
},
// watch监听月份的变化,实时变更日的天数,因为不同月份,天数不一样
// 一个月可能有30,31天,甚至闰年2月的29天,平年2月28天
yearAndMonth(val) {
if (this.params.year) this.setDays();
},
// 微信和QQ小程序由于一些奇怪的原因(故同时对所有平台均初始化一遍),需要重新初始化才能显示正确的值
value(n) {
if (n) {
this.reset = true;
setTimeout(() => this.init(), 10);
}
}
},
methods: {
// 标识滑动开始,只有微信小程序才有这样的事件
pickstart() {
// #ifdef MP-WEIXIN
this.moving = true;
// #endif
},
// 标识滑动结束
pickend() {
// #ifdef MP-WEIXIN
this.moving = false;
// #endif
},
// 对单列和多列形式的判断是否有传入变量的情况
getItemValue(item, mode) {
// 目前(2020-05-25)uni-app对微信小程序编译有错误,导致v-if为false中的内容也执行,错误导致
// 单列模式或者多列模式中的getItemValue同时被执行,故在这里再加一层判断
if (this.mode == mode) {
return typeof item == 'object' ? item[this.rangeKey] : item;
}
},
// 小于10前面补0,用于月份,日期,时分秒等
formatNumber(num) {
return +num < 10 ? '0' + num : String(num);
},
// 生成递进的数组
generateArray: function(start, end) {
// 转为数值格式,否则用户给end-year等传递字符串值时,下面的end+1会导致字符串拼接,而不是相加
start = Number(start);
end = Number(end);
end = end > start ? end : start;
// 生成数组,获取其中的索引,并剪出来
return [...Array(end + 1).keys()].slice(start);
},
getIndex: function(arr, val) {
let index = arr.indexOf(val);
// 如果index为-1(即找不到index值),~(-1)=-(-1)-1=0,导致条件不成立
return ~index ? index : 0;
},
//日期时间处理
initTimeValue() {
// 格式化时间,在IE浏览器(uni不存在此情况),无法识别日期间的"-"间隔符号
let fdate = this.defaultTime.replace(/\-/g, '/');
fdate = fdate && fdate.indexOf('/') == -1 ? `2020/01/01 ${fdate}` : fdate;
let time = null;
if (fdate) time = new Date(fdate);
else time = new Date();
// 获取年日月时分秒
this.year = time.getFullYear();
this.month = Number(time.getMonth()) + 1;
this.day = time.getDate();
this.hour = time.getHours();
this.minute = time.getMinutes();
this.second = time.getSeconds();
},
init() {
this.valueArr = [];
this.reset = false;
if (this.mode == 'time') {
this.initTimeValue();
if (this.params.year) {
this.valueArr.push(0);
this.setYears();
}
if (this.params.month) {
this.valueArr.push(0);
this.setMonths();
}
if (this.params.day) {
this.valueArr.push(0);
this.setDays();
}
if (this.params.hour) {
this.valueArr.push(0);
this.setHours();
}
if (this.params.minute) {
this.valueArr.push(0);
this.setMinutes();
}
if (this.params.second) {
this.valueArr.push(0);
this.setSeconds();
}
} else if (this.mode == 'region') {
if (this.params.province) {
this.valueArr.push(0);
this.setProvinces();
}
if (this.params.city) {
this.valueArr.push(0);
this.setCitys();
}
if (this.params.area) {
this.valueArr.push(0);
this.setAreas();
}
} else if (this.mode == 'selector') {
this.valueArr = this.defaultSelector;
} else if (this.mode == 'multiSelector') {
this.valueArr = this.defaultSelector;
this.multiSelectorValue = this.defaultSelector;
}
this.$forceUpdate();
},
// 设置picker的某一列值
setYears() {
// 获取年份集合
this.years = this.generateArray(this.startYear, this.endYear);
// 设置this.valueArr某一项的值,是为了让picker预选中某一个值
this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.years, this.year));
},
setMonths() {
this.months = this.generateArray(1, 12);
this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.months, this.month));
},
setDays() {
let totalDays = new Date(this.year, this.month, 0).getDate();
this.days = this.generateArray(1, totalDays);
let index = 0;
// 这里不能使用类似setMonths()中的this.valueArr.splice(this.valueArr.length - 1, xxx)做法
// 因为this.month和this.year变化时,会触发watch中的this.setDays(),导致this.valueArr.length计算有误
if (this.params.year && this.params.month) index = 2;
else if (this.params.month) index = 1;
else if (this.params.year) index = 1;
else index = 0;
// 当月份变化时,会导致日期的天数也会变化,如果原来选的天数大于变化后的天数,则重置为变化后的最大值
// 比如原来选中3月31日,调整为2月后,日期变为最大29,这时如果day值继续为31显然不合理,于是将其置为29(picker-column从1开始)
if (this.day > this.days.length) this.day = this.days.length;
this.valueArr.splice(index, 1, this.getIndex(this.days, this.day));
},
setHours() {
this.hours = this.generateArray(0, 23);
this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.hours, this.hour));
},
setMinutes() {
this.minutes = this.generateArray(0, 59);
this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.minutes, this.minute));
},
setSeconds() {
this.seconds = this.generateArray(0, 59);
this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.seconds, this.second));
},
setProvinces() {
// 判断是否需要province参数
if (!this.params.province) return;
let tmp = '';
let useCode = false;
// 如果同时配置了defaultRegion和areaCode,优先使用areaCode参数
if (this.areaCode.length) {
tmp = this.areaCode[0];
useCode = true;
} else if (this.defaultRegion.length) tmp = this.defaultRegion[0];
else tmp = 0;
// 历遍省份数组匹配
provinces.map((v, k) => {
if (useCode ? v.value == tmp : v.label == tmp) {
tmp = k;
}
});
this.province = tmp;
this.provinces = provinces;
// 设置默认省份的值
this.valueArr.splice(0, 1, this.province);
},
setCitys() {
if (!this.params.city) return;
let tmp = '';
let useCode = false;
if (this.areaCode.length) {
tmp = this.areaCode[1];
useCode = true;
} else if (this.defaultRegion.length) tmp = this.defaultRegion[1];
else tmp = 0;
citys[this.province].map((v, k) => {
if (useCode ? v.value == tmp : v.label == tmp) {
tmp = k;
}
});
this.city = tmp;
this.citys = citys[this.province];
this.valueArr.splice(1, 1, this.city);
},
setAreas() {
if (!this.params.area) return;
let tmp = '';
let useCode = false;
if (this.areaCode.length) {
tmp = this.areaCode[2];
useCode = true;
} else if (this.defaultRegion.length) tmp = this.defaultRegion[2];
else tmp = 0;
areas[this.province][this.city].map((v, k) => {
if (useCode ? v.value == tmp : v.label == tmp) {
tmp = k;
}
});
this.area = tmp;
this.areas = areas[this.province][this.city];
this.valueArr.splice(2, 1, this.area);
},
close() {
this.$emit('input', false);
},
// 用户更改picker的列选项
change(e) {
this.valueArr = e.detail.value;
let i = 0;
if (this.mode == 'time') {
// 这里使用i++,是因为this.valueArr数组的长度是不确定长度的,它根据this.params的值来配置长度
// 进入if规则,i会加1,保证了能获取准确的值
if (this.params.year) this.year = this.years[this.valueArr[i++]];
if (this.params.month) this.month = this.months[this.valueArr[i++]];
if (this.params.day) this.day = this.days[this.valueArr[i++]];
if (this.params.hour) this.hour = this.hours[this.valueArr[i++]];
if (this.params.minute) this.minute = this.minutes[this.valueArr[i++]];
if (this.params.second) this.second = this.seconds[this.valueArr[i++]];
} else if (this.mode == 'region') {
if (this.params.province) this.province = this.valueArr[i++];
if (this.params.city) this.city = this.valueArr[i++];
if (this.params.area) this.area = this.valueArr[i++];
} else if (this.mode == 'multiSelector') {
let index = null;
// 对比前后两个数组,寻找变更的是哪一列,如果某一个元素不同,即可判定该列发生了变化
this.defaultSelector.map((val, idx) => {
if (val != e.detail.value[idx]) index = idx;
});
// 为了让用户对多列变化时,对动态设置其他列的变更
if (index != null) {
this.$emit('columnchange', {
column: index,
index: e.detail.value[index]
});
}
}
},
// 用户点击确定按钮
getResult(event = null) {
// #ifdef MP-WEIXIN
if (this.moving) return;
// #endif
let result = {};
// 只返回用户在this.params中配置了为true的字段
if (this.mode == 'time') {
if (this.params.year) result.year = this.formatNumber(this.year || 0);
if (this.params.month) result.month = this.formatNumber(this.month || 0);
if (this.params.day) result.day = this.formatNumber(this.day || 0);
if (this.params.hour) result.hour = this.formatNumber(this.hour || 0);
if (this.params.minute) result.minute = this.formatNumber(this.minute || 0);
if (this.params.second) result.second = this.formatNumber(this.second || 0);
if (this.params.timestamp) result.timestamp = this.getTimestamp();
} else if (this.mode == 'region') {
if (this.params.province) result.province = provinces[this.province];
if (this.params.city) result.city = citys[this.province][this.city];
if (this.params.area) result.area = areas[this.province][this.city][this.area];
} else if (this.mode == 'selector') {
result = this.valueArr;
} else if (this.mode == 'multiSelector') {
result = this.valueArr;
}
if (event) this.$emit(event, result);
this.close();
},
// 获取时间戳
getTimestamp() {
// yyyy-mm-dd为安卓写法,不支持iOS,需要使用"/"分隔,才能二者兼容
let time = this.year + '/' + this.month + '/' + this.day + ' ' + this.hour + ':' + this.minute + ':' + this
.second;
return new Date(time).getTime() / 1000;
}
}
};
</script>
<style lang="scss" scoped>
// 定义混入指令,用于在非nvue环境下的flex定义,因为nvue没有display属性,会报错
@mixin vue-flex($direction: row) {
/* #ifndef APP-NVUE */
display: flex;
flex-direction: $direction;
/* #endif */
}
.btn {
width: 496rpx;
height: 70rpx;
background: #4271B9;
border-radius: 5rpx;
margin: 90rpx auto;
line-height: 70rpx;
text-align: center;
color: #fff;
font-size: 34rpx;
font-weight: 600;
}
.u-datetime-picker {
position: relative;
z-index: 999;
width: 100%;
}
.u-picker-view {
height: 100%;
box-sizing: border-box;
}
.u-picker-header {
width: 100%;
height: 90rpx;
padding: 0 40rpx;
@include vue-flex;
justify-content: space-between;
align-items: center;
box-sizing: border-box;
font-size: 30rpx;
background: #fff;
position: relative;
}
.u-picker-header::after {
content: '';
position: absolute;
border-bottom: 1rpx solid #eaeef1;
-webkit-transform: scaleY(0.5);
transform: scaleY(0.5);
bottom: 0;
right: 0;
left: 0;
}
.u-picker__title {
color: $u-content-color;
}
.u-picker-body {
width: 100%;
height: 500rpx;
// overflow: hidden;
background-color: #fff;
}
.u-column-item {
@include vue-flex;
align-items: center;
justify-content: center;
font-size: 34rpx;
color: $u-main-color;
padding: 0 8rpx;
}
.u-text {
font-size: 24rpx;
padding-left: 8rpx;
}
.u-btn-picker {
padding: 16rpx;
box-sizing: border-box;
text-align: center;
text-decoration: none;
}
.u-opacity {
opacity: 0.5;
}
.u-btn-picker--primary {
color: $u-type-primary;
}
.u-btn-picker--tips {
color: $u-tips-color;
}
</style>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
static/daohang.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 793 B

BIN
static/dcl.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

BIN
static/dqgd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/dqgd2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

BIN
static/fuwu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/gb2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
static/gongdan.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

BIN
static/homepage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

BIN
static/jinbi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/jnks.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
static/kaishi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

BIN
static/kaishi2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
static/kaoshi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
static/lixian.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

BIN
static/lixian2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
static/manglu.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
static/manglu2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/no.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/paishe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 729 B

BIN
static/qbgd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 987 B

BIN
static/qbgd2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 638 B

BIN
static/shezhi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

BIN
static/shouyi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
static/shouyibeijing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

BIN
static/user.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1014 B

BIN
static/xg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

BIN
static/xuexi.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
static/xxpx.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
static/ywc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
static/ywcgd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
static/ywcgd2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
static/zxkf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB