作者 韩昌

gaibug

... ... @@ -109,7 +109,7 @@
<view class="flexJ" style="margin-top: 32rpx">
<view>处方金额:</view>
<view style="width: 30vw">
<up-input placeholder="请输入金额" type="number" border="none">
<up-input placeholder="请输入金额" border="none">
<template #prefix>
<view style="color: #a6a6a6">¥</view>
</template>
... ... @@ -138,7 +138,7 @@
<view class="flexJ" style="margin-top: 32rpx">
<view>处方金额:</view>
<view style="width: 30vw">
<up-input placeholder="请输入金额" type="number" border="none">
<up-input placeholder="请输入金额" border="none">
<template #prefix>
<view>¥</view>
</template>
... ...
{
"version": "1",
"prompt": "template",
"title": "服务协议和隐私政策",
"message": "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept": "同意并接受",
"buttonRefuse": "暂不同意",
"hrefLoader": "system|default",
"backToExit": "false",
"second": {
"title": "确认提示",
"message": "  进入应用前,你需先同意<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>,否则将退出应用。",
"buttonAccept": "同意并继续",
"buttonRefuse": "退出应用"
"version" : "1",
"prompt" : "template",
"title" : "服务协议和隐私政策",
"message" : "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
"buttonAccept" : "同意并接受",
"buttonRefuse" : "暂不同意",
"hrefLoader" : "system|default",
"backToExit" : "false",
"second" : {
"title" : "确认提示",
"message" : "  进入应用前,你需先同意<a href=\"\">《服务协议》</a>和<a href=\"\">《隐私政策》</a>,否则将退出应用。",
"buttonAccept" : "同意并继续",
"buttonRefuse" : "退出应用"
},
"disagreeMode": {
"support": false,
"loadNativePlugins": false,
"visitorEntry": true,
"showAlways": false
"disagreeMode" : {
"support" : false,
"loadNativePlugins" : false,
"visitorEntry" : true,
"showAlways" : false
},
"styles": {
"backgroundColor": "#ffffff",
"borderRadius": "5px",
"title": {
"color": "#333"
"styles" : {
"backgroundColor" : "#ffffff",
"borderRadius" : "5px",
"title" : {
"color" : "#333"
},
"buttonAccept": {
"color": "#000"
"buttonAccept" : {
"color" : "#000"
},
"buttonRefuse": {
"color": "##c6cdd4"
"buttonRefuse" : {
"color" : "##c6cdd4"
},
"buttonVisitor": {
"color": "##c6cdd4"
"buttonVisitor" : {
"color" : "##c6cdd4"
}
}
}
\ No newline at end of file
}
... ...
... ... @@ -5,7 +5,7 @@ import { ApplyAuthType, MessageListParamsType, CommentReceiveType, CommentListPa
export const getDepartment = (data: { keyword: string }) => request({ url: '/consultation/department', method: 'GET', data }) // 获取科室
export const getCareer = (data?: { keyword: string }) => request({ url: '/consultation/career', method: 'GET', data }) // 获取职称
export const appUpload = () => request({ url: '/sys/common/upload', method: 'GET' }) // 上传
export const getSendMessage = () => request({ url: '/pet/login/sendMessage', method: 'GET' }) // 发送验证码
export const getSendMessage = (data: { phoneNum: number | string }) => request({ url: '/pet/login/sendMessage', method: 'GET', data }) // 发送验证码
export const getMessageLogin = (data) => request({ url: '/pet/login/messageLogin', method: 'GET', data }) // 验证码登录
export const getFeedtype = () => request({ url: '/veterinary/feedtype', method: 'GET' }) // 反馈类型
export const updateFeedback = (data: FeedBackParamsType) => request({ url: '/veterinary/feedback', method: 'POST', data }) // 意见反馈
... ... @@ -14,6 +14,7 @@ export const doctorLoginWithPwd = (data: doctorLoginWithPwdType) => request({ ur
export const doctorPhoneEasyLogin = (data: doctorPhoneEasyLoginType) => request({ url: '/pet/login/doctorPhoneEasyLogin', method: 'POST', data }) // 兽医端一键登录
export const outLogin = () => request({ url: '/doctor/outLogin', method: 'GET' }) // 退出登录
export const getOrder_chat = (data: { id: string | number }) => request({ url: '/consultation/order_chat', method: 'GET', data }) // im聊天记录
export const getChangePhonePwdCode = (data: { type: string | number }) => request({ url: '/veterinary/getChangePhonePwdCode', method: 'GET', data }) // 发送修改手机号和密码验证码 type:1-修改手机号,2-修改密码
// 首页
export const getStart = () => request({ url: '/veterinary/start', method: 'GET' }) // 开屏页
... ...
... ... @@ -24,7 +24,7 @@
</view>
<view class="flexC grayinput">
<up-input @change="computedTotalHandler" placeholder="价格" type="number" border="none" v-model="form.drugList[index].amount">
<up-input @change="computedTotalHandler" placeholder="价格" border="none" v-model="form.drugList[index].amount">
<template #prefix>
<text>¥</text>
</template>
... ... @@ -117,6 +117,7 @@ watch(
nextTick(() => {
if (![null, undefined, []].includes(newValue)) {
if (!newValue.length) return
form.value.drugList = newValue as any
computedTotalHandler()
... ... @@ -144,6 +145,7 @@ const computedTotalHandler = () => {
form.value.prescriptionAmount = form.value.drugList.reduce((accumulator, item) => {
// 将amount和num转换为数字,如果为空则转换为0
const amount = item.amount ? item.amount : 0
const num = item.num ? item.num : 0
// 只有当amount和num都不为空时才加入计算
... ...
... ... @@ -82,7 +82,8 @@
}
},
"hms" : {},
"vivo" : {}
"vivo" : {},
"oppo" : {}
}
},
"oauth" : {
... ...
<template>
<u-sticky zIndex="99999999999999999">
<NavBar :isShowQrCode="false" :isShowBgColor="navbarColor" :isShowLeft="false" :isShowRight="true" :isplaceholder="false" :showDot="[0, '0', null, undefined].includes(messageNumber) ? false : true" />
<NavBar :isShowQrCode="false" :isShowBgColor="navbarColor" :isShowLeft="false" :isShowRight="true" :isplaceholder="false" :showDot="[0, '0', null, undefined].includes(showRedDotNumber) ? false : true" />
</u-sticky>
<view class="index">
... ... @@ -191,6 +191,8 @@ const evaluateContent = ref<string>('<div style="font-size: 14px; color: #666666
const messageNumber = ref<number>(0)
const showRedDotNumber = ref<number>(0)
const showMessageState = ref<boolean>(false)
onLoad(() => {
... ... @@ -275,7 +277,9 @@ function viewtoken() {
const getMessageDataHandler = async () => {
const { result }: { result: MessageCountType } = await getMsg_count()
messageNumber.value = result.sysCount + result.userCount + result.xufangCount
messageNumber.value = result.userCount + result.xufangCount
showRedDotNumber.value = result.userCount + result.xufangCount + result.sysCount
if (messageNumber.value === 0 || ![20].includes(authState.value)) return
... ...
<template>
<view class="flexC applelogin" @click="appleLoginHandler">
<!-- <up-icon name="apple-fill" color="#fff" size="16"></up-icon> -->
<up-icon name="apple-fill" color="#000" size="16"></up-icon>
<view class="login-applelogin-text">通过 Apple 登录</view>
</view>
</template>
<script lang="ts" setup>
import {} from '../../../api'
import {} from '../../../types'
const appleLoginHandler = () => {
uni.login({
provider: 'apple',
success: function (loginRes) {
// 登录成功
uni.getUserInfo({
provider: 'apple',
success: function (info) {
// 获取用户信息成功, info.authResult中保存登录认证数据
}
})
},
fail: function (err) {
// 登录授权失败
// err.code错误码参考`授权失败错误码(code)说明`
}
})
}
</script>
<style lang="scss">
.applelogin {
width: 130pt;
height: 30pt;
border-radius: 6pt;
border: 2rpx solid #000;
background-color: #fff;
position: fixed;
bottom: 240rpx;
left: 50%;
transform: translate(-50%);
&-text {
/* color: #fff; */
color: #000;
font-size: 26rpx;
margin-left: 6rpx;
}
}
</style>
... ...
... ... @@ -7,7 +7,7 @@
<view>
<up-input placeholder="请输入手机号" border="bottom" placeholderClass="placeholderClass" v-model="params.phoneNum">
<template #suffix>
<view class="phone-suffix" @click="startCountdown(clickGetCodeHandler)">{{ countdown === 60 ? '获取验证码' : `${countdown}秒后可重新获取` }}</view>
<view class="phone-suffix" @click="sendCodeHandler">{{ countdown === 60 ? '获取验证码' : `${countdown}秒后可重新获取` }}</view>
</template>
</up-input>
<view style="height: 24rpx"></view>
... ... @@ -23,7 +23,7 @@ import { reactive, getCurrentInstance, ComponentPublicInstance } from 'vue'
import useTimeHandler from '@/hooks/useTimeChange'
import { getSendMessage, getMessageLogin, getIndex } from '@/api'
import type { PhoneCodeLoginType, IndexType } from '../../../types'
import UseSetCidHandler from '@/hooks/useSetCidHandler'
import { DebounceBy } from '../../../utils/debounceBy'
const { proxy } = getCurrentInstance() as { proxy: ComponentPublicInstance }
... ... @@ -33,7 +33,7 @@ const emit = defineEmits(['editLoginStateHandler'])
const params = reactive({
phoneNum: '',
code: '10086'
code: ''
})
const loginHandler = async () => {
... ... @@ -59,7 +59,15 @@ const loginHandler = async () => {
uni.reLaunch({ url: '/pages/index/index' })
}
const clickGetCodeHandler = async () => await getSendMessage()
const clickGetCodeHandler = async () => await getSendMessage({ phoneNum: params.phoneNum })
const sendCodeHandler = DebounceBy(() => {
if ([null, undefined, ''].includes(params.phoneNum)) return uni.$u.toast('请输入手机号')
if (!/^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-79])|(?:5[0-35-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1589]))\d{8}$/.test(params.phoneNum)) return uni.$u.toast('请输入正确的手机号')
startCountdown(clickGetCodeHandler)
}, 2000)
defineExpose({ loginHandler })
</script>
... ...
<template>
<view class="login">
<view class="login" :class="{ login_paddingtop: loginState === 1 }">
<template v-if="loginState === 1">
<image class="login-bgimg" src="/static/images/bg.png" mode="aspectFill" />
<view class="login-topclose" @click="proxy.$h.relaunchUrl('/pages/index/index')">
... ... @@ -20,6 +20,9 @@
<view>暂无需求</view>
</template>
<ConfirmProtocol @login="loginHandler" :loginState="loginState" ref="confirmProtocolRef" />
<template v-if="loginState === 1 && iosVersion >= 13">
<AppleLogin ref="AppleLoginRef" />
</template>
<view v-if="loginState === 1" class="login-other flexC" @click="loginState = 2">其他登录方式</view>
</view>
</template>
... ... @@ -27,10 +30,12 @@
<script setup lang="ts">
import { ref, getCurrentInstance } from 'vue'
import { DebounceBy } from '@/utils/debounceBy'
import { onShow } from '@dcloudio/uni-app'
import ConfirmProtocol from './com/ConfirmProtocol.vue'
import PhoneLogin from './com/PhoneLogin.vue'
import AccountLogin from './com/AccountLogin.vue'
import useSetCidHandler from '../../hooks/useSetCidHandler'
import AppleLogin from './com/AppleLogin.vue'
const { proxy } = getCurrentInstance()
... ... @@ -40,9 +45,29 @@ const accountLoginRef = ref<InstanceType<typeof AccountLogin>>()
const confirmProtocolRef = ref<InstanceType<typeof ConfirmProtocol>>()
// 1 一键登录 2 手机验证码登录 3 账号登录
const AppleLoginRef = ref<InstanceType<typeof AppleLogin>>()
const iosVersion = ref<number>(0)
const loginState = ref<number>(1)
onShow(() => {
uni.getSystemInfo({
success: function (res) {
const system = res.system.toLowerCase()
if (system.indexOf('ios') !== -1) {
const version = parseInt(system.split(' ')[1], 10)
if (version >= 13) {
iosVersion.value = version
}
console.log('当前设备为iOS ' + version)
} else {
console.log('当前设备不是iOS')
}
}
})
})
const loginHandler = (state: number) => {
useSetCidHandler()
... ... @@ -57,11 +82,18 @@ const loginHandler = (state: number) => {
</script>
<style lang="scss" scoped>
page {
}
.login {
&_paddingtop {
box-sizing: border-box;
padding: 236rpx 0 0;
}
font-size: 26rpx;
&-bgimg {
width: 100vw;
height: 100vh;
overflow: hidden;
position: fixed;
top: 0;
left: 0;
... ... @@ -77,7 +109,7 @@ const loginHandler = (state: number) => {
width: 136rpx;
height: 136rpx;
border-radius: 32rpx;
margin: 236rpx auto 0;
/* margin: 236rpx auto 0; */
}
&-logo {
margin: 0 auto;
... ... @@ -99,9 +131,9 @@ const loginHandler = (state: number) => {
&-other {
color: #999999;
width: 242rpx;
height: 70rpx;
border-radius: 57rpx;
width: 130pt;
height: 30pt;
border-radius: 6pt;
border: 1rpx solid #0000001a;
position: fixed;
bottom: 140rpx;
... ...
... ... @@ -32,7 +32,7 @@
<view class="flexA" style="margin-right: 68rpx">
<u-icon name="thumb-up" color="#484848" size="22"></u-icon>
<view class="graytext mine-centertext">用户评价</view>
<view class="mine-righttext">{{ UserInfo?.star || 0 }}{{ ![0, '0', '', null, undefined].includes(UserInfo?.star) && '.0' }}</view>
<view class="mine-righttext">{{ UserInfo?.star || 0 }}{{ ![0, '0', '', null, undefined].includes(UserInfo?.star) ? '.0' : '' }}</view>
</view>
<view class="flexA">
<u-icon name="clock" color="#484848" size="18"></u-icon>
... ...
... ... @@ -34,7 +34,7 @@
<view class="main">
<view class="bgimg" style="margin-bottom: 70rpx">
<image src="/static/images/auditbg.png" class="autbgimg" mode="aspectFill" />
<image :src="proxy.$h.downFile(UserInfo?.avatar)" class="avatar" mode="aspectFill" />
<image :src="![null, '', undefined].includes(UserInfo?.avatar) ? proxy.$h.downFile(UserInfo?.avatar) : '/static/images/mAvatar.png'" class="avatar" mode="aspectFill" />
<view class="infomain Zindex">
<view class="infomain-title">您已完成认证</view>
... ...
... ... @@ -85,7 +85,7 @@ onShow(() => getDataHandler())
}
&-badge {
box-sizing: border-box;
padding: 0rpx 8rpx;
padding: 1rpx 8rpx;
background: #f44d36;
border-radius: 50%;
color: #ffffff;
... ...
... ... @@ -5,9 +5,9 @@
</view>
<view class="phone-title">{{ Event?.type === 'editpassword' ? '修改密码' : '更换手机号' }}</view>
<view style="margin-bottom: 56rpx">
<up-input placeholder="请输入手机号" border="bottom" placeholderClass="placeholderClass" v-model="phone">
<up-input placeholder="请输入手机号" border="bottom" placeholderClass="placeholderClass" v-model="phone" disabled disabledColor="#fff">
<template #suffix>
<view class="phone-suffix" @click="startCountdown(clickGetCodeHandler)">{{ countdown === 60 ? '获取验证码' : `${countdown}秒后可重新获取` }}</view>
<view class="phone-suffix" @click="sendCodeHandler">{{ countdown === 60 ? '获取验证码' : `${countdown}秒后可重新获取` }}</view>
</template>
</up-input>
<template v-if="Event?.type === 'editphone'">
... ... @@ -28,8 +28,9 @@
import { ref, getCurrentInstance, ComponentPublicInstance } from 'vue'
import useTimeHandler from '@/hooks/useTimeChange'
import { onLoad } from '@dcloudio/uni-app'
import { updateChange_phone, updateChange_pwd } from '../../api'
import { updateChange_phone, updateChange_pwd, getChangePhonePwdCode } from '../../api'
import { EditPhoneType, ChangePwdType } from '../../types'
import { DebounceBy } from '../../utils/debounceBy'
interface EventType {
type: string
... ... @@ -55,7 +56,9 @@ const [countdown, startCountdown] = useTimeHandler()
const phone = ref('')
const clickGetCodeHandler = () => {}
const clickGetCodeHandler = async () => await getChangePhonePwdCode({ type: { editphone: 1, editpassword: 2 }[Event.value?.type as string | number] as string | number })
const sendCodeHandler = DebounceBy(() => startCountdown(clickGetCodeHandler), 2000)
const loginAgainHandler = () => {
uni.clearStorageSync()
... ... @@ -69,6 +72,10 @@ const loginAgainHandler = () => {
const editPhoneHandler = async () => {
if (Event.value?.type === 'editphone') {
if ([''].includes(form.value.code as string)) return uni.$u.toast('请输入验证码')
if ([null, undefined, ''].includes(form.value.phone)) return uni.$u.toast('请输入新手机号码')
await updateChange_phone(form.value as EditPhoneType)
loginAgainHandler()
... ... @@ -76,6 +83,12 @@ const editPhoneHandler = async () => {
if (Event.value?.type === 'editpassword') {
try {
if ([''].includes(changePwdForm.value.code as string)) return uni.$u.toast('请输入验证码')
if ([null, undefined, ''].includes(changePwdForm.value.password) || [null, undefined, ''].includes(changePwdForm.value.repassword)) return uni.$u.toast('请输入新密码')
if (changePwdForm.value.password !== changePwdForm.value.repassword) return uni.$u.toast('输入两次密码不一致')
await updateChange_pwd({ ...changePwdForm.value, phone: phone.value })
loginAgainHandler()
... ...
... ... @@ -23,7 +23,7 @@
<view class="flexA">
<view class="f">¥</view>
<up-input placeholder="" border="none" type="number" v-model="params.amount" @change="e => limitDecimal(e)"></up-input>
<up-input placeholder="" border="none" v-model="params.amount" @change="e => limitDecimal(e)"></up-input>
</view>
<u-line margin="36rpx 0"></u-line>
<view style="margin-bottom: 114rpx">
... ... @@ -93,24 +93,31 @@ const confirmWithdrawDepositHandler = async () => {
}
}
})
if (params.value.amount === 0) return uni.$u.toast('请输入提现金额')
uni.showModal({
title: '提示',
content: '提现成功,请等候后台审核',
showCancel: false,
success: () => {
proxy.$h.backUrl(1)
}
})
await updateAdd_withdraw({ ...params.value })
try {
await updateAdd_withdraw({ ...params.value })
uni.showModal({
title: '提示',
content: '提现成功,请等候后台审核',
showCancel: false,
success: () => {
proxy.$h.backUrl(1)
}
})
} catch (error) {
uni.$u.toast(error)
}
}
const regex = /^\d+(\.\d{0,2})?$/
const limitDecimal = (value: number) => {
const regex = /^\d+(\.\d{0,2})?$/
if (!regex.test(value + '')) {
params.value.amount = Math.floor(value * 100) / 100
}
// if (!regex.test(value + '')) {
// params.value.amount = Math.floor(value * 100) / 100
// }
}
</script>
... ...
// export const baseURL = 'http://192.168.10.63:8080/jeecg-boot' // 本地
// export const baseURL = 'http://t5qnpc.natappfree.cc/jeecg-boot' // 本地
// export const baseURL = 'http://192.168.12.171:8881/jeecg-boot' // 本地
// export const baseURL = 'http://192.168.12.173:8881/jeecg-boot' // 本地
export const baseURL = 'http://114.115.178.175:8799/jeecg-boot' // 测试
// export const baseURL = 'http://127.0.0.1:4523/m1/3332971-0-default/jeecg-boot' // mock
... ...
... ... @@ -47,6 +47,9 @@ export default {
url: baseURL + url, //仅为示例,非真实的接口地址
filePath: _,
name: 'file',
// header: {
// 'content-type': 'multipart/form-data'
// },
formData: {
user: 'test',
token: uni.getStorageSync('token')
... ...