Compare commits
	
		
			2 Commits
		
	
	
		
			b1e3735af0
			...
			dc946ec669
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| dc946ec669 | |||
| 7c6e881e03 | 
@@ -7,6 +7,9 @@ const API = {
 | 
			
		||||
	wx_login: (data,userId) => net.POST('/user/binding/wechat',data,true,{"userId":userId}), // 微信登录
 | 
			
		||||
	// upload: (data) => net.POST('/user/upload',data), // 文件上传
 | 
			
		||||
	userinfoUpdae:data => net.PUT('/user/info',data,true,{"Content-Type":"application/x-www-form-urlencoded"}), // 更新用户信息
 | 
			
		||||
	// ai 客服
 | 
			
		||||
	getAikefuList:data => net.GET('/akefu/list',data), // 获取获取客服列表
 | 
			
		||||
	getReply:data => net.POST('/ai',data), // 获取客服回复
 | 
			
		||||
	// 首页
 | 
			
		||||
	getHospitalList:data => net.GET('/hospital/list',data), // 获取医院信息
 | 
			
		||||
	saveVision:data => net.POST("/vision",data),// 保存视力测试结果
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										47
									
								
								components/aikefu.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								components/aikefu.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
<template>
 | 
			
		||||
	<view class="aikefuBox">
 | 
			
		||||
		<!-- 这是ai客服!!!! -->
 | 
			
		||||
		<unFab ref="fab" :pattern="pattern"  horizontal="left" vertical="bottom"
 | 
			
		||||
					direction="horizontal" @fabClick="fabClick" />
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup>
 | 
			
		||||
	import unFab from '@/uni_modules/uni-fab/components/uni-fab/uni-fab.vue' 
 | 
			
		||||
	import { onLoad } from "@dcloudio/uni-app"
 | 
			
		||||
	// import mySwiper from "@/components/mySwiper.vue"
 | 
			
		||||
	import {ref,onMounted,nextTick,computed} from "vue"
 | 
			
		||||
	// import unCombox from '@/uni_modules/uni-combox/components/uni-combox/uni-combox.vue' 
 | 
			
		||||
	import {useStore} from '@/store/index.js'
 | 
			
		||||
	const store = useStore()
 | 
			
		||||
	import api from "@/api/index.js"
 | 
			
		||||
	const pattern = ref({
 | 
			
		||||
		color: '#7A7E83',
 | 
			
		||||
		backgroundColor: '#fff',
 | 
			
		||||
		selectedColor: '#26758d',
 | 
			
		||||
		buttonColor: '#26758d',
 | 
			
		||||
		iconColor: '#fff',
 | 
			
		||||
		icon:'headphones'
 | 
			
		||||
	})
 | 
			
		||||
	// const content = ref([{
 | 
			
		||||
	// 		iconPath: '/static/image.png',
 | 
			
		||||
	// 		selectedIconPath: '/static/image-active.png',
 | 
			
		||||
	// 		text: '相册',
 | 
			
		||||
	// 		active: false
 | 
			
		||||
	// 	}])
 | 
			
		||||
	function fabClick() {
 | 
			
		||||
		// uni.showToast({
 | 
			
		||||
		// 	title: '点击了悬浮按钮',
 | 
			
		||||
		// 	icon: 'none'
 | 
			
		||||
		// })
 | 
			
		||||
		uni.navigateTo({
 | 
			
		||||
			url:"/pages/index/aikefu"
 | 
			
		||||
		})
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
	.aikefuBox{
 | 
			
		||||
		margin-top: 200rpx;
 | 
			
		||||
	}
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
// isdev 为 true 表示开发环境 false 表示发布环境
 | 
			
		||||
const isdev = true;
 | 
			
		||||
const baseUrl = isdev ? 'http://4ca5004.r15.cpolar.top' : 'http://eb467b6.r19.cpolar.top';// 办公室接口 & 测试环境
 | 
			
		||||
const baseUrl = isdev ? 'http://5a0a6573.r9.cpolar.top' : 'http://eb467b6.r19.cpolar.top';// 办公室接口 & 测试环境
 | 
			
		||||
// const baseUrl = isdev ? 'http://192.168.1.133:8899' : 'https://api.gwkjxb.com';// 办公室接口 & 正式环境
 | 
			
		||||
// const baseUrl = 'https://api.gwkjxb.com';// 正式环境(由于本地测试后台没有启动,暂时通用正式服)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										27
									
								
								pages.json
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								pages.json
									
									
									
									
									
								
							@@ -88,6 +88,33 @@
 | 
			
		||||
				"navigationBarTitleText": "注意事项",
 | 
			
		||||
				"enablePullDownRefresh": true
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"path": "pages/user/setting/userAgreement",
 | 
			
		||||
			"style": {
 | 
			
		||||
				"navigationBarTitleText": "用户协议"
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			"path": "pages/user/setting/privacyPolicy",
 | 
			
		||||
			"style": {
 | 
			
		||||
				"navigationBarTitleText": "隐私政策"
 | 
			
		||||
			}
 | 
			
		||||
		},{
 | 
			
		||||
			"path": "pages/user/setting/phone_list",
 | 
			
		||||
			"style": {
 | 
			
		||||
				"navigationBarTitleText": "个人信息手机清单"
 | 
			
		||||
			}
 | 
			
		||||
		},{
 | 
			
		||||
			"path": "pages/user/setting/aboutUs",
 | 
			
		||||
			"style": {
 | 
			
		||||
				"navigationBarTitleText": "关于我们"
 | 
			
		||||
			}
 | 
			
		||||
		},{
 | 
			
		||||
			"path": "pages/index/aikefu",
 | 
			
		||||
			"style": {
 | 
			
		||||
				"navigationBarTitleText": "客服中心"
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	],
 | 
			
		||||
	"globalStyle": {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										202
									
								
								pages/index/aikefu.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								pages/index/aikefu.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,202 @@
 | 
			
		||||
<script setup>
 | 
			
		||||
	// 引入依赖
 | 
			
		||||
	import uniDatetimePicker from '@/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue' 
 | 
			
		||||
	import uniEasyinput from '@/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue' 
 | 
			
		||||
	// import unCombox from '@/uni_modules/uni-combox/components/uni-combox/uni-combox.vue' 
 | 
			
		||||
	import { onLoad,onShow  } from "@dcloudio/uni-app"
 | 
			
		||||
	import mySwiper from "@/components/mySwiper.vue"
 | 
			
		||||
	import aikefu from "@/components/aikefu.vue"
 | 
			
		||||
	import {ref,onMounted,nextTick,watch,getCurrentInstance} from "vue"
 | 
			
		||||
	import api from '@/api/index.js'
 | 
			
		||||
	import {useStore} from '@/store/index.js'
 | 
			
		||||
	// import uniIcons from '@/uni_modules/uni-icons/components/uni-icons/uni-icons.vue' 
 | 
			
		||||
	const store = useStore()
 | 
			
		||||
	onLoad((e) => {
 | 
			
		||||
		uni.createSelectorQuery().in(instance).select('.show-part').boundingClientRect((res)=>{
 | 
			
		||||
			w_h.value = res.height
 | 
			
		||||
			// console.log(res)
 | 
			
		||||
		}).exec()
 | 
			
		||||
	})
 | 
			
		||||
	// 变量
 | 
			
		||||
	const w_h = ref(0)
 | 
			
		||||
	const records = ref([
 | 
			
		||||
		{
 | 
			
		||||
			content:'您好,很高兴为您服务!',
 | 
			
		||||
			type:1,//1-客服;2-我
 | 
			
		||||
		}
 | 
			
		||||
	])
 | 
			
		||||
	const scrollContainer = ref()
 | 
			
		||||
	const in_content = ref('')
 | 
			
		||||
	const scrollTop = ref(0.01) //注意:不要设置成0,不然无效
 | 
			
		||||
	const instance = getCurrentInstance(); // 获取组件实例
 | 
			
		||||
	const is_loading = ref(false)
 | 
			
		||||
	// 函数
 | 
			
		||||
	async function sendFunc() {
 | 
			
		||||
		if(is_loading.value) {
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		is_loading.value = true
 | 
			
		||||
		if(!in_content.value) {
 | 
			
		||||
			uni.showToast({
 | 
			
		||||
				title:"请填写内容",
 | 
			
		||||
				icon:'error',
 | 
			
		||||
				duration:2000,
 | 
			
		||||
				mask:true
 | 
			
		||||
			})
 | 
			
		||||
			is_loading.value = false
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		// 滚动条设置
 | 
			
		||||
		uni.createSelectorQuery().in(instance).select('#scroll-view-content').boundingClientRect((res)=>{
 | 
			
		||||
			let top = res.height-w_h.value+100;
 | 
			
		||||
			if(top>0){
 | 
			
		||||
				scrollTop.value = top;
 | 
			
		||||
			}
 | 
			
		||||
			// console.log(res.height,w_h.value)
 | 
			
		||||
		}).exec()
 | 
			
		||||
		records.value.push({
 | 
			
		||||
			content:in_content.value,
 | 
			
		||||
			type:2
 | 
			
		||||
		})
 | 
			
		||||
		const res = await api.getReply({msg:in_content.value})
 | 
			
		||||
		is_loading.value = false
 | 
			
		||||
		if(res.code === 0) {
 | 
			
		||||
			in_content.value = ''
 | 
			
		||||
			// 判断用户输入的关键字是否有效
 | 
			
		||||
			if(res.data.content) {
 | 
			
		||||
				records.value.push({
 | 
			
		||||
					content:res.data.content,
 | 
			
		||||
					type:1
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
			else{
 | 
			
		||||
				records.value.push({
 | 
			
		||||
					content:'请输入正确的关键词',
 | 
			
		||||
					type:-1
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else{
 | 
			
		||||
			uni.showToast({
 | 
			
		||||
				title:res.msg,
 | 
			
		||||
				icon:"error",
 | 
			
		||||
				duration:2000
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
	<view class="aikefuBox page-box page-bg-gray" style="height: 100%;">
 | 
			
		||||
		<!-- 信息展示区域 -->
 | 
			
		||||
		<!-- <view class="ac-part show-part" id="show-part" ref="scrollContainer" :style="{scrollTop:scrollTop}"> -->
 | 
			
		||||
				<scroll-view :scroll-with-animation="true" :scroll-y="true" class="ac-part show-part" scroll-y="true" :scroll-top="scrollTop">
 | 
			
		||||
					<view class="ac-listt-box" id="scroll-view-content">
 | 
			
		||||
						<view class="r_list-card" v-for="(item,i) in records">
 | 
			
		||||
							<view v-if="item.type!=-1" class="r-row" :class="item.type === 1?'row-left':'row-right'">
 | 
			
		||||
								<view class="r-avatar" v-if="item.type === 1">
 | 
			
		||||
									<image src="../../static/kefu.png" mode="widthFix"></image>
 | 
			
		||||
								</view>
 | 
			
		||||
								<view class="r-content" :class="{'r-content-right':item.type==2}">{{item.content}}</view>
 | 
			
		||||
							</view>
 | 
			
		||||
							<!-- 错误提示 -->
 | 
			
		||||
							<view class="r-row wrong-text" v-if="item.type==-1" style="color: #bfbfbf;text-align: center">
 | 
			
		||||
								{{item.content}}
 | 
			
		||||
							</view>
 | 
			
		||||
						</view>
 | 
			
		||||
					</view>
 | 
			
		||||
				</scroll-view>
 | 
			
		||||
		<!-- </view> -->
 | 
			
		||||
		<!-- 输入区域 -->
 | 
			
		||||
		<view class="as-part input-part">
 | 
			
		||||
			<view class="input-box">
 | 
			
		||||
				<view class="ib-left">
 | 
			
		||||
					<input v-model="in_content" type="text" placeholder="输入您想咨询的内容">
 | 
			
		||||
				</view>
 | 
			
		||||
				<view class="ib-right">
 | 
			
		||||
					<view class="send_btn" @tap="sendFunc">发送</view>
 | 
			
		||||
				</view>
 | 
			
		||||
			</view>
 | 
			
		||||
		</view>
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
	.aikefuBox{
 | 
			
		||||
		height: 100%;
 | 
			
		||||
		.show-part{
 | 
			
		||||
			height: 88%;
 | 
			
		||||
			// overflow-y: auto;
 | 
			
		||||
			.ac-listt-box{
 | 
			
		||||
				padding: 20rpx;
 | 
			
		||||
				.r_list-card{
 | 
			
		||||
					margin: 40rpx 0;
 | 
			
		||||
					.r-row{
 | 
			
		||||
						overflow: hidden;
 | 
			
		||||
						.r-avatar{
 | 
			
		||||
							float: left;
 | 
			
		||||
							width: 80rpx;
 | 
			
		||||
							height: 80rpx;
 | 
			
		||||
							image{
 | 
			
		||||
								width: 100%;
 | 
			
		||||
							}
 | 
			
		||||
							margin-right: 10rpx;
 | 
			
		||||
						}
 | 
			
		||||
						.r-content{
 | 
			
		||||
							background-color: white;
 | 
			
		||||
							display: inline-block;
 | 
			
		||||
							padding: 20rpx;
 | 
			
		||||
							border-radius:0 20rpx 20rpx 20rpx;
 | 
			
		||||
							box-shadow: 10rpx 10rpx 10rpx #efefef;
 | 
			
		||||
						}
 | 
			
		||||
						.r-content-right{
 | 
			
		||||
							float: right;
 | 
			
		||||
							border-radius: 20rpx 0 20rpx 20rpx;
 | 
			
		||||
							background-color: #26758d;
 | 
			
		||||
							color: white;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		.input-part{
 | 
			
		||||
			height: 12%;
 | 
			
		||||
			background: white;
 | 
			
		||||
			position: fixed;
 | 
			
		||||
			bottom: 0px;
 | 
			
		||||
			width: 100%;
 | 
			
		||||
			.input-box{
 | 
			
		||||
				padding: 20rpx;
 | 
			
		||||
				display: flex;
 | 
			
		||||
				align-content: center;
 | 
			
		||||
				.ib-left{
 | 
			
		||||
					width: 88%;
 | 
			
		||||
					margin-right: 20rpx;
 | 
			
		||||
					input{
 | 
			
		||||
						width: 100%;
 | 
			
		||||
						border: 2rpx solid #c3c3c3;
 | 
			
		||||
						padding: 10rpx 8rpx;
 | 
			
		||||
						border-radius: 20rpx;
 | 
			
		||||
						box-sizing: border-box;
 | 
			
		||||
						display: block;
 | 
			
		||||
						height: 100%;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				.ib-right{
 | 
			
		||||
					width: 12%;
 | 
			
		||||
					display: flex;
 | 
			
		||||
					align-items: center;
 | 
			
		||||
					.send_btn{
 | 
			
		||||
						padding: 10rpx;
 | 
			
		||||
						background: #26758d;
 | 
			
		||||
						color: white;
 | 
			
		||||
						border-radius: 10rpx;
 | 
			
		||||
						width: 100%;
 | 
			
		||||
						text-align: center;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		.ac-part{
 | 
			
		||||
			
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
</style>
 | 
			
		||||
@@ -2,8 +2,10 @@
 | 
			
		||||
	// 引入依赖
 | 
			
		||||
	import uniDatetimePicker from '@/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue' 
 | 
			
		||||
	import uniEasyinput from '@/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue' 
 | 
			
		||||
	import unCombox from '@/uni_modules/uni-combox/components/uni-combox/uni-combox.vue' 
 | 
			
		||||
	import { onLoad,onShow } from "@dcloudio/uni-app"
 | 
			
		||||
	import mySwiper from "@/components/mySwiper.vue"
 | 
			
		||||
	import aikefu from "@/components/aikefu.vue"
 | 
			
		||||
	import {ref,onMounted,nextTick,watch} from "vue"
 | 
			
		||||
	import api from '@/api/index.js'
 | 
			
		||||
	import {useStore} from '@/store/index.js'
 | 
			
		||||
@@ -260,6 +262,7 @@
 | 
			
		||||
			<!-- <uni-popup-dialog ref="inputClose" mode="input" title="输入内容" value="对话框预置提示内容!"
 | 
			
		||||
				placeholder="请输入内容" @confirm="dialogInputConfirm"></uni-popup-dialog> -->
 | 
			
		||||
		</uni-popup>
 | 
			
		||||
		<aikefu />
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@
 | 
			
		||||
	import {ref,onMounted,nextTick} from "vue"
 | 
			
		||||
	import {useStore} from '@/store/index.js'
 | 
			
		||||
	import api from "@/api/index.js"
 | 
			
		||||
	const store = useStore()
 | 
			
		||||
	onLoad(() => {
 | 
			
		||||
		// console.log(useStore.userInfo)
 | 
			
		||||
		userinfo.value = JSON.parse(uni.getStorageSync('userInfo'))
 | 
			
		||||
@@ -14,7 +15,39 @@
 | 
			
		||||
	const avatar = ref(null)
 | 
			
		||||
	// 方法
 | 
			
		||||
	function toDetail(type) {
 | 
			
		||||
		
 | 
			
		||||
		let url = ''
 | 
			
		||||
		switch(type) {
 | 
			
		||||
			case 1:
 | 
			
		||||
				url = '/pages/user/setting/userAgreement'
 | 
			
		||||
			 break;
 | 
			
		||||
			case 2:
 | 
			
		||||
				url = '/pages/user/setting/privacyPolicy'
 | 
			
		||||
			 break;
 | 
			
		||||
			case 3:
 | 
			
		||||
			 	url = '/pages/user/setting/phone_list'
 | 
			
		||||
			  break;
 | 
			
		||||
			case 4:
 | 
			
		||||
			 	url = '/pages/user/setting/aboutUs'
 | 
			
		||||
			  break;
 | 
			
		||||
			case 5: // 退出
 | 
			
		||||
			 	uni.showModal({
 | 
			
		||||
					title:"提示",
 | 
			
		||||
					content:"确认要退出登录吗?",
 | 
			
		||||
					success:async function(res) {
 | 
			
		||||
						if(res.confirm) { 
 | 
			
		||||
							store.logout()
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				})
 | 
			
		||||
			  break;
 | 
			
		||||
			default:
 | 
			
		||||
			 break;
 | 
			
		||||
		}
 | 
			
		||||
		if(url) {
 | 
			
		||||
			uni.navigateTo({
 | 
			
		||||
				url
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
@@ -30,7 +63,7 @@
 | 
			
		||||
				  </view>
 | 
			
		||||
			  </view>
 | 
			
		||||
			</view>
 | 
			
		||||
			<view class="rb-card" @tap="toDetail(1)">
 | 
			
		||||
			<view class="rb-card" @tap="toDetail(2)">
 | 
			
		||||
			  <view class="rbc-content">
 | 
			
		||||
				  <view class="rbc-content-row rbc-content-left rbc-content-left-box">
 | 
			
		||||
					   <!-- <uni-icons type="phone" color="gray" size="26"></uni-icons> -->
 | 
			
		||||
@@ -40,7 +73,7 @@
 | 
			
		||||
				  </view>
 | 
			
		||||
			  </view>
 | 
			
		||||
			</view>
 | 
			
		||||
			<view class="rb-card" @tap="toDetail(1)">
 | 
			
		||||
			<view class="rb-card" @tap="toDetail(3)">
 | 
			
		||||
			  <view class="rbc-content">
 | 
			
		||||
				  <view class="rbc-content-row rbc-content-left rbc-content-left-box">
 | 
			
		||||
					   <!-- <uni-icons type="calendar" color="gray" size="26"></uni-icons> -->
 | 
			
		||||
@@ -50,7 +83,7 @@
 | 
			
		||||
				  </view>
 | 
			
		||||
			  </view>
 | 
			
		||||
			</view>
 | 
			
		||||
			<view class="rb-card" @tap="toDetail(1)">
 | 
			
		||||
			<view class="rb-card" @tap="toDetail(4)">
 | 
			
		||||
			  <view class="rbc-content">
 | 
			
		||||
				  <view class="rbc-content-row rbc-content-left rbc-content-left-box">
 | 
			
		||||
					   <!-- <uni-icons type="paperplane" color="gray" size="26"></uni-icons> -->
 | 
			
		||||
@@ -60,7 +93,7 @@
 | 
			
		||||
				  </view>
 | 
			
		||||
			  </view>
 | 
			
		||||
			</view>
 | 
			
		||||
			<view class="rb-card" @tap="toDetail(1)">
 | 
			
		||||
			<view class="rb-card" @tap="toDetail(5)">
 | 
			
		||||
			  <view class="rbc-content">
 | 
			
		||||
				  <view class="rbc-content-row rbc-content-left rbc-content-left-box">
 | 
			
		||||
					   <!-- <uni-icons type="paperplane" color="gray" size="26"></uni-icons> -->
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										11
									
								
								pages/user/setting/aboutUs.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								pages/user/setting/aboutUs.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
<script setup>
 | 
			
		||||
	
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
	<view class="aboutUs page-box page-bg-gray">
 | 
			
		||||
		
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
	
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										11
									
								
								pages/user/setting/phone_list.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								pages/user/setting/phone_list.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
<script setup>
 | 
			
		||||
	
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
	<view class="phone_list page-box page-bg-gray">
 | 
			
		||||
		
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
	
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										11
									
								
								pages/user/setting/privacyPolicy.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								pages/user/setting/privacyPolicy.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
<script setup>
 | 
			
		||||
	
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
	<view class="privacyPolicy page-box page-bg-gray">
 | 
			
		||||
		
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
	
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										11
									
								
								pages/user/setting/userAgreement.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								pages/user/setting/userAgreement.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
<script setup>
 | 
			
		||||
	
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
	<view class="userAgreement page-box page-bg-gray">
 | 
			
		||||
		
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
	
 | 
			
		||||
</style>
 | 
			
		||||
@@ -2,26 +2,51 @@
 | 
			
		||||
	import { onLoad } from "@dcloudio/uni-app"
 | 
			
		||||
	// import mySwiper from "@/components/mySwiper.vue"
 | 
			
		||||
	import {ref,onMounted,nextTick,computed} from "vue"
 | 
			
		||||
	import unCombox from '@/uni_modules/uni-combox/components/uni-combox/uni-combox.vue' 
 | 
			
		||||
	import {useStore} from '@/store/index.js'
 | 
			
		||||
	const store = useStore()
 | 
			
		||||
	import api from "@/api/index.js"
 | 
			
		||||
	onLoad(() => {
 | 
			
		||||
		// console.log(useStore.userInfo)
 | 
			
		||||
		userinfo.value = JSON.parse(uni.getStorageSync('userInfo'))
 | 
			
		||||
		console.log(userinfo.value)
 | 
			
		||||
		avatar.value = uni.getStorageSync('avatarUrl')
 | 
			
		||||
		h_info.value = JSON.parse(uni.getStorageSync('operation_info'))
 | 
			
		||||
		if(h_info.value) {
 | 
			
		||||
			// console.log(h_info.value)
 | 
			
		||||
			getHospital(h_info.value.hospitalId)
 | 
			
		||||
		if(uni.getStorageSync('operation_info')) {
 | 
			
		||||
			h_info.value = JSON.parse(uni.getStorageSync('operation_info'))
 | 
			
		||||
			if(h_info.value) {
 | 
			
		||||
				// console.log(h_info.value)
 | 
			
		||||
				getHospital(h_info.value.hospitalId)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	})
 | 
			
		||||
	// 变量
 | 
			
		||||
	const h_queryParams = ref({
 | 
			
		||||
		page:1,
 | 
			
		||||
		pageSize:1000,
 | 
			
		||||
		key:''
 | 
			
		||||
	})
 | 
			
		||||
	const hospitals = ref(null)
 | 
			
		||||
	const userinfo = ref({})
 | 
			
		||||
	const avatar = ref(null)
 | 
			
		||||
	const h_info = ref(null)
 | 
			
		||||
	const h_info = ref({})
 | 
			
		||||
	const inputDialog = ref(null)
 | 
			
		||||
	const input_title = ref(null)
 | 
			
		||||
	const hValue = ref('') // 医院
 | 
			
		||||
	const hValueId = ref('') // 医院id
 | 
			
		||||
	// const form_data = ref({})
 | 
			
		||||
	// const userForm = ref(null)
 | 
			
		||||
	// 方法
 | 
			
		||||
	async function getHospitalList() {
 | 
			
		||||
		const res = await api.getHospitalList(h_queryParams.value)
 | 
			
		||||
		if(res.code == 0) {
 | 
			
		||||
			hospitals.value = res.data.list
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	function onClickH() {
 | 
			
		||||
		h_queryParams.value.key = hValue.value
 | 
			
		||||
		getHospitalList()
 | 
			
		||||
		
 | 
			
		||||
	}
 | 
			
		||||
	async function getHospital(id) {
 | 
			
		||||
		const res = await api.getHospitalInfo(id)
 | 
			
		||||
		if(res.code === 0) {
 | 
			
		||||
@@ -55,10 +80,11 @@
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	function finishFunc() {
 | 
			
		||||
		
 | 
			
		||||
		inputDialog.value.close()
 | 
			
		||||
	}
 | 
			
		||||
	const startDate = computed(() => getDate('start'))
 | 
			
		||||
	const endDate = computed(() => getDate('end'))
 | 
			
		||||
	const choosed_h = ref(null)
 | 
			
		||||
	const date = ref(null)
 | 
			
		||||
	function getDate(type) {
 | 
			
		||||
		const date = new Date();
 | 
			
		||||
@@ -75,8 +101,67 @@
 | 
			
		||||
		day = day > 9 ? day : '0' + day;
 | 
			
		||||
		return `${year}-${month}-${day}`;
 | 
			
		||||
	}
 | 
			
		||||
	function bindDateChange() {
 | 
			
		||||
		
 | 
			
		||||
	function bindDateChange(e) {
 | 
			
		||||
		console.log(e)
 | 
			
		||||
		h_info.value.surgery_time = e.detail.value
 | 
			
		||||
	}
 | 
			
		||||
	function toChooseH(item) {
 | 
			
		||||
		console.log(item)
 | 
			
		||||
		choosed_h.value = item
 | 
			
		||||
		hValue.value = item.name
 | 
			
		||||
		// hospitals.value = null
 | 
			
		||||
	}
 | 
			
		||||
	async function sumbmitFunc() {
 | 
			
		||||
		// console.log(choosed_h.value,h_info.value,userinfo.value)
 | 
			
		||||
		let obj = {
 | 
			
		||||
			id: userinfo.value.userId,
 | 
			
		||||
			// isSurgery: 1, //是否已经手术 0为手术,1已经手术
 | 
			
		||||
			surgery_time: h_info.value?.surgery_time, //手术时间
 | 
			
		||||
			nickname: userinfo.value.nickname,
 | 
			
		||||
			// avatar: '',
 | 
			
		||||
			phone: userinfo.value.phone,
 | 
			
		||||
			hospitalId:choosed_h.value?.ID
 | 
			
		||||
		}
 | 
			
		||||
		const res = await api.userinfoUpdae(obj)
 | 
			
		||||
		// console.log('res is ',res)
 | 
			
		||||
		if(res.code === 0) {
 | 
			
		||||
			uni.showToast({
 | 
			
		||||
				title:res.msg,
 | 
			
		||||
				icon:"success",
 | 
			
		||||
				duration:2000,
 | 
			
		||||
				async success() {
 | 
			
		||||
					await wx_login(userinfo.value.userId)
 | 
			
		||||
					uni.navigateBack()
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
		else{
 | 
			
		||||
			uni.showToast({
 | 
			
		||||
				title:res.msg,
 | 
			
		||||
				icon:"error",
 | 
			
		||||
				duration:2000
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	async function wx_login(userId){
 | 
			
		||||
		let res=await new Promise(resolve=>{
 | 
			
		||||
			uni.login({
 | 
			
		||||
				  provider: 'weixin', //使用微信登录
 | 
			
		||||
				  success: function (loginRes) {
 | 
			
		||||
					  resolve(loginRes);
 | 
			
		||||
					  console.log(loginRes,'微信登录返回信息');
 | 
			
		||||
				  }
 | 
			
		||||
			});
 | 
			
		||||
		});
 | 
			
		||||
		let res2=await api.wx_login({code:res.code},userId);
 | 
			
		||||
		if(res2.code === 0) {
 | 
			
		||||
			uni.setStorageSync('userInfo',JSON.stringify(userinfo.value))
 | 
			
		||||
			// is_login.value = custom.checkLogin()
 | 
			
		||||
			store.checkLogin()
 | 
			
		||||
		}
 | 
			
		||||
		else{
 | 
			
		||||
			uni.clearStorage();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
<template>
 | 
			
		||||
@@ -113,8 +198,13 @@
 | 
			
		||||
					   <uni-icons type="calendar" color="gray" size="26"></uni-icons>
 | 
			
		||||
					  手术时间</view>
 | 
			
		||||
				  <view class="rbc-content-row rbc-content-right">
 | 
			
		||||
					  {{h_info?.surgery_time}}
 | 
			
		||||
					  <uni-icons type="forward" color="gray" size="20"></uni-icons>
 | 
			
		||||
					  <!-- {{h_info?.surgery_time}} -->
 | 
			
		||||
					  <picker mode="date" :value="h_info?.surgery_time" :start="startDate" :end="endDate" @change="bindDateChange">
 | 
			
		||||
						  <view class="rbc-content-row rbc-content-right">
 | 
			
		||||
							  <view class="uni-input"> {{h_info?.surgery_time}}</view>
 | 
			
		||||
							  <uni-icons type="forward" color="gray" size="20"></uni-icons>
 | 
			
		||||
						  </view>
 | 
			
		||||
					  </picker>
 | 
			
		||||
				  </view>
 | 
			
		||||
			  </view>
 | 
			
		||||
			</view>
 | 
			
		||||
@@ -124,7 +214,8 @@
 | 
			
		||||
					   <uni-icons type="paperplane" color="gray" size="26"></uni-icons>
 | 
			
		||||
					  手术医院</view>
 | 
			
		||||
				  <view class="rbc-content-row rbc-content-right">
 | 
			
		||||
					  {{h_info?.name}}
 | 
			
		||||
					  <!-- {{h_info?.name}} -->
 | 
			
		||||
					  <uni-combox @input="onClickH" :candidates="hospitals" placeholder="请选择医院" @choosed="toChooseH" v-model="hValue"></uni-combox>
 | 
			
		||||
					  <uni-icons type="forward" color="gray" size="20"></uni-icons>
 | 
			
		||||
				  </view>
 | 
			
		||||
			  </view>
 | 
			
		||||
@@ -144,14 +235,11 @@
 | 
			
		||||
							<uni-easyinput :inputBorder="false" v-else borderColor="#26758d" v-model="userinfo.phone" focus placeholder="输入您的电话"></uni-easyinput>
 | 
			
		||||
						</view>
 | 
			
		||||
					</view>
 | 
			
		||||
					<view  class="pb-item pb-item-btn" @tap="finishFunc">提交</view>
 | 
			
		||||
					<view  class="pb-item pb-item-btn" @tap="finishFunc">确定</view>
 | 
			
		||||
				</view>
 | 
			
		||||
			</view>
 | 
			
		||||
		</uni-popup>
 | 
			
		||||
		<!-- 手术时间 -->
 | 
			
		||||
		<picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange">
 | 
			
		||||
			<view class="uni-input"> {{h_info?.surgery_time}}</view>
 | 
			
		||||
		</picker>
 | 
			
		||||
		<view  class="pb-item pb-item-btn" style="margin-top: 40rpx;" @tap="sumbmitFunc">确定</view>
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
<style scoped lang="scss">
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								static/kefu.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								static/kefu.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 9.9 KiB  | 
							
								
								
									
										23
									
								
								uni_modules/uni-fab/changelog.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								uni_modules/uni-fab/changelog.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
## 1.2.5(2023-03-29)
 | 
			
		||||
- 新增 pattern.icon 属性,可自定义图标
 | 
			
		||||
## 1.2.4(2022-09-07)
 | 
			
		||||
小程序端由于 style 使用了对象导致报错,[详情](https://ask.dcloud.net.cn/question/152790?item_id=211778&rf=false)
 | 
			
		||||
## 1.2.3(2022-09-05)
 | 
			
		||||
- 修复 nvue 环境下,具有 tabBar 时,fab 组件下部位置无法正常获取 --window-bottom 的bug,详见:[https://ask.dcloud.net.cn/question/110638?notification_id=826310](https://ask.dcloud.net.cn/question/110638?notification_id=826310)
 | 
			
		||||
## 1.2.2(2021-12-29)
 | 
			
		||||
- 更新 组件依赖
 | 
			
		||||
## 1.2.1(2021-11-19)
 | 
			
		||||
- 修复 阴影颜色不正确的bug
 | 
			
		||||
## 1.2.0(2021-11-19)
 | 
			
		||||
- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
 | 
			
		||||
- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-fab](https://uniapp.dcloud.io/component/uniui/uni-fab)
 | 
			
		||||
## 1.1.1(2021-11-09) 
 | 
			
		||||
- 新增 提供组件设计资源,组件样式调整
 | 
			
		||||
## 1.1.0(2021-07-30)
 | 
			
		||||
- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
 | 
			
		||||
## 1.0.7(2021-05-12)
 | 
			
		||||
- 新增 组件示例地址
 | 
			
		||||
## 1.0.6(2021-02-05)
 | 
			
		||||
- 调整为uni_modules目录规范
 | 
			
		||||
- 优化 按钮背景色调整
 | 
			
		||||
- 优化 兼容pc端
 | 
			
		||||
							
								
								
									
										491
									
								
								uni_modules/uni-fab/components/uni-fab/uni-fab.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										491
									
								
								uni_modules/uni-fab/components/uni-fab/uni-fab.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,491 @@
 | 
			
		||||
<template>
 | 
			
		||||
	<view class="uni-cursor-point">
 | 
			
		||||
		<view v-if="popMenu && (leftBottom||rightBottom||leftTop||rightTop) && content.length > 0" :class="{
 | 
			
		||||
        'uni-fab--leftBottom': leftBottom,
 | 
			
		||||
        'uni-fab--rightBottom': rightBottom,
 | 
			
		||||
        'uni-fab--leftTop': leftTop,
 | 
			
		||||
        'uni-fab--rightTop': rightTop
 | 
			
		||||
      }" class="uni-fab"
 | 
			
		||||
				:style="nvueBottom"
 | 
			
		||||
			>
 | 
			
		||||
			<view :class="{
 | 
			
		||||
          'uni-fab__content--left': horizontal === 'left',
 | 
			
		||||
          'uni-fab__content--right': horizontal === 'right',
 | 
			
		||||
          'uni-fab__content--flexDirection': direction === 'vertical',
 | 
			
		||||
          'uni-fab__content--flexDirectionStart': flexDirectionStart,
 | 
			
		||||
          'uni-fab__content--flexDirectionEnd': flexDirectionEnd,
 | 
			
		||||
		  'uni-fab__content--other-platform': !isAndroidNvue
 | 
			
		||||
        }" :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }"
 | 
			
		||||
				class="uni-fab__content" elevation="5">
 | 
			
		||||
				<view v-if="flexDirectionStart || horizontalLeft" class="uni-fab__item uni-fab__item--first" />
 | 
			
		||||
				<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }"
 | 
			
		||||
					class="uni-fab__item" @click="_onItemClick(index, item)">
 | 
			
		||||
					<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image"
 | 
			
		||||
						mode="aspectFit" />
 | 
			
		||||
					<text class="uni-fab__item-text"
 | 
			
		||||
						:style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
 | 
			
		||||
				</view>
 | 
			
		||||
				<view v-if="flexDirectionEnd || horizontalRight" class="uni-fab__item uni-fab__item--first" />
 | 
			
		||||
			</view>
 | 
			
		||||
		</view>
 | 
			
		||||
		<view :class="{
 | 
			
		||||
		  'uni-fab__circle--leftBottom': leftBottom,
 | 
			
		||||
		  'uni-fab__circle--rightBottom': rightBottom,
 | 
			
		||||
		  'uni-fab__circle--leftTop': leftTop,
 | 
			
		||||
		  'uni-fab__circle--rightTop': rightTop,
 | 
			
		||||
		  'uni-fab__content--other-platform': !isAndroidNvue
 | 
			
		||||
		}" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor, 'bottom': nvueBottom }" @click="_onClick">
 | 
			
		||||
			<uni-icons class="fab-circle-icon" :type="styles.icon" :color="styles.iconColor" size="32"
 | 
			
		||||
				:class="{'uni-fab__plus--active': isShow && content.length > 0}"></uni-icons>
 | 
			
		||||
			<!-- <view class="fab-circle-v"  :class="{'uni-fab__plus--active': isShow && content.length > 0}"></view>
 | 
			
		||||
			<view class="fab-circle-h" :class="{'uni-fab__plus--active': isShow  && content.length > 0}"></view> -->
 | 
			
		||||
		</view>
 | 
			
		||||
	</view>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
	let platform = 'other'
 | 
			
		||||
	// #ifdef APP-NVUE
 | 
			
		||||
	platform = uni.getSystemInfoSync().platform
 | 
			
		||||
	// #endif
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Fab 悬浮按钮
 | 
			
		||||
	 * @description 点击可展开一个图形按钮菜单
 | 
			
		||||
	 * @tutorial https://ext.dcloud.net.cn/plugin?id=144
 | 
			
		||||
	 * @property {Object} pattern 可选样式配置项
 | 
			
		||||
	 * @property {Object} horizontal = [left | right] 水平对齐方式
 | 
			
		||||
	 * 	@value left 左对齐
 | 
			
		||||
	 * 	@value right 右对齐
 | 
			
		||||
	 * @property {Object} vertical = [bottom | top] 垂直对齐方式
 | 
			
		||||
	 * 	@value bottom 下对齐
 | 
			
		||||
	 * 	@value top 上对齐
 | 
			
		||||
	 * @property {Object} direction = [horizontal | vertical] 展开菜单显示方式
 | 
			
		||||
	 * 	@value horizontal 水平显示
 | 
			
		||||
	 * 	@value vertical 垂直显示
 | 
			
		||||
	 * @property {Array} content 展开菜单内容配置项
 | 
			
		||||
	 * @property {Boolean} popMenu 是否使用弹出菜单
 | 
			
		||||
	 * @event {Function} trigger 展开菜单点击事件,返回点击信息
 | 
			
		||||
	 * @event {Function} fabClick 悬浮按钮点击事件
 | 
			
		||||
	 */
 | 
			
		||||
	export default {
 | 
			
		||||
		name: 'UniFab',
 | 
			
		||||
		emits: ['fabClick', 'trigger'],
 | 
			
		||||
		props: {
 | 
			
		||||
			pattern: {
 | 
			
		||||
				type: Object,
 | 
			
		||||
				default () {
 | 
			
		||||
					return {}
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			horizontal: {
 | 
			
		||||
				type: String,
 | 
			
		||||
				default: 'left'
 | 
			
		||||
			},
 | 
			
		||||
			vertical: {
 | 
			
		||||
				type: String,
 | 
			
		||||
				default: 'bottom'
 | 
			
		||||
			},
 | 
			
		||||
			direction: {
 | 
			
		||||
				type: String,
 | 
			
		||||
				default: 'horizontal'
 | 
			
		||||
			},
 | 
			
		||||
			content: {
 | 
			
		||||
				type: Array,
 | 
			
		||||
				default () {
 | 
			
		||||
					return []
 | 
			
		||||
				}
 | 
			
		||||
			},
 | 
			
		||||
			show: {
 | 
			
		||||
				type: Boolean,
 | 
			
		||||
				default: false
 | 
			
		||||
			},
 | 
			
		||||
			popMenu: {
 | 
			
		||||
				type: Boolean,
 | 
			
		||||
				default: true
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		data() {
 | 
			
		||||
			return {
 | 
			
		||||
				fabShow: false,
 | 
			
		||||
				isShow: false,
 | 
			
		||||
				isAndroidNvue: platform === 'android',
 | 
			
		||||
				styles: {
 | 
			
		||||
					color: '#3c3e49',
 | 
			
		||||
					selectedColor: '#007AFF',
 | 
			
		||||
					backgroundColor: '#fff',
 | 
			
		||||
					buttonColor: '#007AFF',
 | 
			
		||||
					iconColor: '#fff',
 | 
			
		||||
					icon: 'plusempty'
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		computed: {
 | 
			
		||||
			contentWidth(e) {
 | 
			
		||||
				return (this.content.length + 1) * 55 + 15 + 'px'
 | 
			
		||||
			},
 | 
			
		||||
			contentWidthMin() {
 | 
			
		||||
				return '55px'
 | 
			
		||||
			},
 | 
			
		||||
			// 动态计算宽度
 | 
			
		||||
			boxWidth() {
 | 
			
		||||
				return this.getPosition(3, 'horizontal')
 | 
			
		||||
			},
 | 
			
		||||
			// 动态计算高度
 | 
			
		||||
			boxHeight() {
 | 
			
		||||
				return this.getPosition(3, 'vertical')
 | 
			
		||||
			},
 | 
			
		||||
			// 计算左下位置
 | 
			
		||||
			leftBottom() {
 | 
			
		||||
				return this.getPosition(0, 'left', 'bottom')
 | 
			
		||||
			},
 | 
			
		||||
			// 计算右下位置
 | 
			
		||||
			rightBottom() {
 | 
			
		||||
				return this.getPosition(0, 'right', 'bottom')
 | 
			
		||||
			},
 | 
			
		||||
			// 计算左上位置
 | 
			
		||||
			leftTop() {
 | 
			
		||||
				return this.getPosition(0, 'left', 'top')
 | 
			
		||||
			},
 | 
			
		||||
			rightTop() {
 | 
			
		||||
				return this.getPosition(0, 'right', 'top')
 | 
			
		||||
			},
 | 
			
		||||
			flexDirectionStart() {
 | 
			
		||||
				return this.getPosition(1, 'vertical', 'top')
 | 
			
		||||
			},
 | 
			
		||||
			flexDirectionEnd() {
 | 
			
		||||
				return this.getPosition(1, 'vertical', 'bottom')
 | 
			
		||||
			},
 | 
			
		||||
			horizontalLeft() {
 | 
			
		||||
				return this.getPosition(2, 'horizontal', 'left')
 | 
			
		||||
			},
 | 
			
		||||
			horizontalRight() {
 | 
			
		||||
				return this.getPosition(2, 'horizontal', 'right')
 | 
			
		||||
			},
 | 
			
		||||
			// 计算 nvue bottom
 | 
			
		||||
			nvueBottom() {
 | 
			
		||||
				const safeBottom = uni.getSystemInfoSync().windowBottom;
 | 
			
		||||
				// #ifdef APP-NVUE
 | 
			
		||||
				return 30 + safeBottom
 | 
			
		||||
				// #endif
 | 
			
		||||
				// #ifndef APP-NVUE
 | 
			
		||||
				return 30
 | 
			
		||||
				// #endif
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		watch: {
 | 
			
		||||
			pattern: {
 | 
			
		||||
				handler(val, oldVal) {
 | 
			
		||||
					this.styles = Object.assign({}, this.styles, val)
 | 
			
		||||
				},
 | 
			
		||||
				deep: true
 | 
			
		||||
			}
 | 
			
		||||
		},
 | 
			
		||||
		created() {
 | 
			
		||||
			this.isShow = this.show
 | 
			
		||||
			if (this.top === 0) {
 | 
			
		||||
				this.fabShow = true
 | 
			
		||||
			}
 | 
			
		||||
			// 初始化样式
 | 
			
		||||
			this.styles = Object.assign({}, this.styles, this.pattern)
 | 
			
		||||
		},
 | 
			
		||||
		methods: {
 | 
			
		||||
			_onClick() {
 | 
			
		||||
				this.$emit('fabClick')
 | 
			
		||||
				if (!this.popMenu) {
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				this.isShow = !this.isShow
 | 
			
		||||
			},
 | 
			
		||||
			open() {
 | 
			
		||||
				this.isShow = true
 | 
			
		||||
			},
 | 
			
		||||
			close() {
 | 
			
		||||
				this.isShow = false
 | 
			
		||||
			},
 | 
			
		||||
			/**
 | 
			
		||||
			 * 按钮点击事件
 | 
			
		||||
			 */
 | 
			
		||||
			_onItemClick(index, item) {
 | 
			
		||||
				if (!this.isShow) {
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				this.$emit('trigger', {
 | 
			
		||||
					index,
 | 
			
		||||
					item
 | 
			
		||||
				})
 | 
			
		||||
			},
 | 
			
		||||
			/**
 | 
			
		||||
			 * 获取 位置信息
 | 
			
		||||
			 */
 | 
			
		||||
			getPosition(types, paramA, paramB) {
 | 
			
		||||
				if (types === 0) {
 | 
			
		||||
					return this.horizontal === paramA && this.vertical === paramB
 | 
			
		||||
				} else if (types === 1) {
 | 
			
		||||
					return this.direction === paramA && this.vertical === paramB
 | 
			
		||||
				} else if (types === 2) {
 | 
			
		||||
					return this.direction === paramA && this.horizontal === paramB
 | 
			
		||||
				} else {
 | 
			
		||||
					return this.isShow && this.direction === paramA ? this.contentWidth : this.contentWidthMin
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="scss" >
 | 
			
		||||
	$uni-shadow-base:0 1px 5px 2px rgba($color: #000000, $alpha: 0.3) !default;
 | 
			
		||||
 | 
			
		||||
	.uni-fab {
 | 
			
		||||
		position: fixed;
 | 
			
		||||
		/* #ifndef APP-NVUE */
 | 
			
		||||
		display: flex;
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		justify-content: center;
 | 
			
		||||
		align-items: center;
 | 
			
		||||
		z-index: 10;
 | 
			
		||||
		border-radius: 45px;
 | 
			
		||||
		box-shadow: $uni-shadow-base;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-cursor-point {
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		cursor: pointer;
 | 
			
		||||
		/* #endif */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab--active {
 | 
			
		||||
		opacity: 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab--leftBottom {
 | 
			
		||||
		left: 15px;
 | 
			
		||||
		bottom: 30px;
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		left: calc(15px + var(--window-left));
 | 
			
		||||
		bottom: calc(30px + var(--window-bottom));
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		// padding: 10px;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab--leftTop {
 | 
			
		||||
		left: 15px;
 | 
			
		||||
		top: 30px;
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		left: calc(15px + var(--window-left));
 | 
			
		||||
		top: calc(30px + var(--window-top));
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		// padding: 10px;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab--rightBottom {
 | 
			
		||||
		right: 15px;
 | 
			
		||||
		bottom: 30px;
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		right: calc(15px + var(--window-right));
 | 
			
		||||
		bottom: calc(30px + var(--window-bottom));
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		// padding: 10px;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab--rightTop {
 | 
			
		||||
		right: 15px;
 | 
			
		||||
		top: 30px;
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		right: calc(15px + var(--window-right));
 | 
			
		||||
		top: calc(30px + var(--window-top));
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		// padding: 10px;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle {
 | 
			
		||||
		position: fixed;
 | 
			
		||||
		/* #ifndef APP-NVUE */
 | 
			
		||||
		display: flex;
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		justify-content: center;
 | 
			
		||||
		align-items: center;
 | 
			
		||||
		width: 55px;
 | 
			
		||||
		height: 55px;
 | 
			
		||||
		background-color: #3c3e49;
 | 
			
		||||
		border-radius: 45px;
 | 
			
		||||
		z-index: 11;
 | 
			
		||||
		// box-shadow: $uni-shadow-base;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle--leftBottom {
 | 
			
		||||
		left: 15px;
 | 
			
		||||
		bottom: 30px;
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		left: calc(15px + var(--window-left));
 | 
			
		||||
		bottom: calc(30px + var(--window-bottom));
 | 
			
		||||
		/* #endif */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle--leftTop {
 | 
			
		||||
		left: 15px;
 | 
			
		||||
		top: 30px;
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		left: calc(15px + var(--window-left));
 | 
			
		||||
		top: calc(30px + var(--window-top));
 | 
			
		||||
		/* #endif */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle--rightBottom {
 | 
			
		||||
		right: 15px;
 | 
			
		||||
		bottom: 30px;
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		right: calc(15px + var(--window-right));
 | 
			
		||||
		bottom: calc(30px + var(--window-bottom));
 | 
			
		||||
		/* #endif */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle--rightTop {
 | 
			
		||||
		right: 15px;
 | 
			
		||||
		top: 30px;
 | 
			
		||||
		/* #ifdef H5 */
 | 
			
		||||
		right: calc(15px + var(--window-right));
 | 
			
		||||
		top: calc(30px + var(--window-top));
 | 
			
		||||
		/* #endif */
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle--left {
 | 
			
		||||
		left: 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle--right {
 | 
			
		||||
		right: 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle--top {
 | 
			
		||||
		top: 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__circle--bottom {
 | 
			
		||||
		bottom: 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__plus {
 | 
			
		||||
		font-weight: bold;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// .fab-circle-v {
 | 
			
		||||
	// 	position: absolute;
 | 
			
		||||
	// 	width: 2px;
 | 
			
		||||
	// 	height: 24px;
 | 
			
		||||
	// 	left: 0;
 | 
			
		||||
	// 	top: 0;
 | 
			
		||||
	// 	right: 0;
 | 
			
		||||
	// 	bottom: 0;
 | 
			
		||||
	// 	/* #ifndef APP-NVUE */
 | 
			
		||||
	// 	margin: auto;
 | 
			
		||||
	// 	/* #endif */
 | 
			
		||||
	// 	background-color: white;
 | 
			
		||||
	// 	transform: rotate(0deg);
 | 
			
		||||
	// 	transition: transform 0.3s;
 | 
			
		||||
	// }
 | 
			
		||||
 | 
			
		||||
	// .fab-circle-h {
 | 
			
		||||
	// 	position: absolute;
 | 
			
		||||
	// 	width: 24px;
 | 
			
		||||
	// 	height: 2px;
 | 
			
		||||
	// 	left: 0;
 | 
			
		||||
	// 	top: 0;
 | 
			
		||||
	// 	right: 0;
 | 
			
		||||
	// 	bottom: 0;
 | 
			
		||||
	// 	/* #ifndef APP-NVUE */
 | 
			
		||||
	// 	margin: auto;
 | 
			
		||||
	// 	/* #endif */
 | 
			
		||||
	// 	background-color: white;
 | 
			
		||||
	// 	transform: rotate(0deg);
 | 
			
		||||
	// 	transition: transform 0.3s;
 | 
			
		||||
	// }
 | 
			
		||||
 | 
			
		||||
	.fab-circle-icon {
 | 
			
		||||
		transform: rotate(0deg);
 | 
			
		||||
		transition: transform 0.3s;
 | 
			
		||||
		font-weight: 200;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__plus--active {
 | 
			
		||||
		transform: rotate(135deg);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__content {
 | 
			
		||||
		/* #ifndef APP-NVUE */
 | 
			
		||||
		box-sizing: border-box;
 | 
			
		||||
		display: flex;
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		flex-direction: row;
 | 
			
		||||
		border-radius: 55px;
 | 
			
		||||
		overflow: hidden;
 | 
			
		||||
		transition-property: width, height;
 | 
			
		||||
		transition-duration: 0.2s;
 | 
			
		||||
		width: 55px;
 | 
			
		||||
		border-color: #DDDDDD;
 | 
			
		||||
		border-width: 1rpx;
 | 
			
		||||
		border-style: solid;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__content--other-platform {
 | 
			
		||||
		border-width: 0px;
 | 
			
		||||
		box-shadow: $uni-shadow-base;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__content--left {
 | 
			
		||||
		justify-content: flex-start;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__content--right {
 | 
			
		||||
		justify-content: flex-end;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__content--flexDirection {
 | 
			
		||||
		flex-direction: column;
 | 
			
		||||
		justify-content: flex-end;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__content--flexDirectionStart {
 | 
			
		||||
		flex-direction: column;
 | 
			
		||||
		justify-content: flex-start;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__content--flexDirectionEnd {
 | 
			
		||||
		flex-direction: column;
 | 
			
		||||
		justify-content: flex-end;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__item {
 | 
			
		||||
		/* #ifndef APP-NVUE */
 | 
			
		||||
		display: flex;
 | 
			
		||||
		/* #endif */
 | 
			
		||||
		flex-direction: column;
 | 
			
		||||
		justify-content: center;
 | 
			
		||||
		align-items: center;
 | 
			
		||||
		width: 55px;
 | 
			
		||||
		height: 55px;
 | 
			
		||||
		opacity: 0;
 | 
			
		||||
		transition: opacity 0.2s;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__item--active {
 | 
			
		||||
		opacity: 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__item-image {
 | 
			
		||||
		width: 20px;
 | 
			
		||||
		height: 20px;
 | 
			
		||||
		margin-bottom: 4px;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__item-text {
 | 
			
		||||
		color: #FFFFFF;
 | 
			
		||||
		font-size: 12px;
 | 
			
		||||
		line-height: 12px;
 | 
			
		||||
		margin-top: 2px;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	.uni-fab__item--first {
 | 
			
		||||
		width: 55px;
 | 
			
		||||
	}
 | 
			
		||||
</style>
 | 
			
		||||
							
								
								
									
										84
									
								
								uni_modules/uni-fab/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								uni_modules/uni-fab/package.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,84 @@
 | 
			
		||||
{
 | 
			
		||||
  "id": "uni-fab",
 | 
			
		||||
  "displayName": "uni-fab 悬浮按钮",
 | 
			
		||||
  "version": "1.2.5",
 | 
			
		||||
  "description": "悬浮按钮 fab button ,点击可展开一个图标按钮菜单。",
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "uni-ui",
 | 
			
		||||
    "uniui",
 | 
			
		||||
    "按钮",
 | 
			
		||||
    "悬浮按钮",
 | 
			
		||||
    "fab"
 | 
			
		||||
],
 | 
			
		||||
  "repository": "https://github.com/dcloudio/uni-ui",
 | 
			
		||||
  "engines": {
 | 
			
		||||
    "HBuilderX": ""
 | 
			
		||||
  },
 | 
			
		||||
  "directories": {
 | 
			
		||||
    "example": "../../temps/example_temps"
 | 
			
		||||
  },
 | 
			
		||||
"dcloudext": {
 | 
			
		||||
    "sale": {
 | 
			
		||||
      "regular": {
 | 
			
		||||
        "price": "0.00"
 | 
			
		||||
      },
 | 
			
		||||
      "sourcecode": {
 | 
			
		||||
        "price": "0.00"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "contact": {
 | 
			
		||||
      "qq": ""
 | 
			
		||||
    },
 | 
			
		||||
    "declaration": {
 | 
			
		||||
      "ads": "无",
 | 
			
		||||
      "data": "无",
 | 
			
		||||
      "permissions": "无"
 | 
			
		||||
    },
 | 
			
		||||
    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
 | 
			
		||||
    "type": "component-vue"
 | 
			
		||||
  },
 | 
			
		||||
  "uni_modules": {
 | 
			
		||||
    "dependencies": ["uni-scss","uni-icons"],
 | 
			
		||||
    "encrypt": [],
 | 
			
		||||
    "platforms": {
 | 
			
		||||
      "cloud": {
 | 
			
		||||
        "tcb": "y",
 | 
			
		||||
        "aliyun": "y"
 | 
			
		||||
      },
 | 
			
		||||
      "client": {
 | 
			
		||||
        "App": {
 | 
			
		||||
          "app-vue": "y",
 | 
			
		||||
          "app-nvue": "y"
 | 
			
		||||
        },
 | 
			
		||||
        "H5-mobile": {
 | 
			
		||||
          "Safari": "y",
 | 
			
		||||
          "Android Browser": "y",
 | 
			
		||||
          "微信浏览器(Android)": "y",
 | 
			
		||||
          "QQ浏览器(Android)": "y"
 | 
			
		||||
        },
 | 
			
		||||
        "H5-pc": {
 | 
			
		||||
          "Chrome": "y",
 | 
			
		||||
          "IE": "y",
 | 
			
		||||
          "Edge": "y",
 | 
			
		||||
          "Firefox": "y",
 | 
			
		||||
          "Safari": "y"
 | 
			
		||||
        },
 | 
			
		||||
        "小程序": {
 | 
			
		||||
          "微信": "y",
 | 
			
		||||
          "阿里": "y",
 | 
			
		||||
          "百度": "y",
 | 
			
		||||
          "字节跳动": "y",
 | 
			
		||||
          "QQ": "y"
 | 
			
		||||
        },
 | 
			
		||||
        "快应用": {
 | 
			
		||||
          "华为": "u",
 | 
			
		||||
          "联盟": "u"
 | 
			
		||||
        },
 | 
			
		||||
        "Vue": {
 | 
			
		||||
            "vue2": "y",
 | 
			
		||||
            "vue3": "y"
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								uni_modules/uni-fab/readme.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								uni_modules/uni-fab/readme.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
## Fab 悬浮按钮
 | 
			
		||||
> **组件名:uni-fab**
 | 
			
		||||
> 代码块: `uFab`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
点击可展开一个图形按钮菜单
 | 
			
		||||
 | 
			
		||||
### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fab)
 | 
			
		||||
#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 
 | 
			
		||||
		Reference in New Issue
	
	Block a user