fix:问题修复
This commit is contained in:
parent
cecb26e762
commit
267bc814cb
@ -0,0 +1,140 @@
|
||||
<template>
|
||||
<common-cell :name="name" :required="required">
|
||||
<view class="form-content__wrapper" @click="showPopup()">
|
||||
<view class="w-0 flex-grow leading-normal text-base line-clamp-2">
|
||||
{{ valueStr || '' }}
|
||||
</view>
|
||||
<!-- <view class="flex-main-content truncate" :class="value ? '' : 'form__placeholder'">
|
||||
{{ valueStr || '' }}
|
||||
</view> -->
|
||||
<uni-icons class="form-arrow" type="arrowright"></uni-icons>
|
||||
</view>
|
||||
</common-cell>
|
||||
<view v-if="show" class="teleport-container">
|
||||
<uni-popup ref="popup" type="center" :mask-click="false">
|
||||
<view class="bg-white rounded overflow-hidden" style="width: 690rpx;">
|
||||
<view class="flex items-center justify-between px-15 py-12 border-b">
|
||||
<view class="text-lg font-semibold text-dark">请选择</view>
|
||||
<uni-icons type="closeempty" :size="24" color="#999" @click="close"></uni-icons>
|
||||
</view>
|
||||
<scroll-view scroll-y="true" class="popup-content-scroll">
|
||||
<view class="px-15 py-12">
|
||||
<view class="flex flex-wrap">
|
||||
<view v-for="(i, idx) in range" :key="idx" class="mt-10 mr-5 px-10 py-5 text-base rounded-sm"
|
||||
:class="selectMap[idx] ? 'bg-primary border-primary text-white' : 'border'" @click="toggle(i)">
|
||||
{{ i }}
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="hasOther" class="mt-10 px-10 py-5 border rounded-sm">
|
||||
<input v-model="otherText" class="text-base" placeholder-class="text-base" @input="changeOther($event)" />
|
||||
</view>
|
||||
<view class="w-full pt-15"></view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</uni-popup>
|
||||
</view>
|
||||
|
||||
</template>
|
||||
<script setup>
|
||||
import { computed, ref } from 'vue';
|
||||
import useDebounce from '@/utils/useDebounce';
|
||||
|
||||
import commonCell from '../common-cell.vue';
|
||||
|
||||
const emits = defineEmits(['change']);
|
||||
const props = defineProps({
|
||||
form: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
},
|
||||
name: {
|
||||
default: ''
|
||||
},
|
||||
range: {
|
||||
type: Array,
|
||||
default: () => []
|
||||
},
|
||||
required: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
disableChange: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
title: {
|
||||
default: ''
|
||||
}
|
||||
})
|
||||
|
||||
const popup = ref(null);
|
||||
const show = ref(false);
|
||||
const otherText = ref('');
|
||||
const value = computed(() => props.form && Array.isArray(props.form[props.title]) ? props.form[props.title] : [])
|
||||
const valueStr = computed(() => value.value.filter(i => i !== '其他').join(','));
|
||||
const hasOther = computed(() => value.value.includes('其他'));
|
||||
const hasNo = computed(() => value.value.includes('无'));
|
||||
const selectMap = computed(() => (props.range || []).map(i => value.value.includes(i)))
|
||||
|
||||
|
||||
const changeOther = useDebounce(() => {
|
||||
let val = value.value.filter(i => (props.range || []).includes(i));
|
||||
if (otherText.value) {
|
||||
val.push(otherText.value);
|
||||
}
|
||||
emits('change', {
|
||||
title: props.title,
|
||||
value: val
|
||||
})
|
||||
})
|
||||
|
||||
function close() {
|
||||
popup.value?.close();
|
||||
show.value = false;
|
||||
}
|
||||
|
||||
function showPopup() {
|
||||
if (props.disableChange) return;
|
||||
show.value = true;
|
||||
const others = value.value.filter(i => !props.range.includes(i));
|
||||
otherText.value = others.length ? others.join(',') : '';
|
||||
setTimeout(() => {
|
||||
popup.value?.open();
|
||||
}, 750)
|
||||
}
|
||||
|
||||
function toggle(i) {
|
||||
let val = [...value.value];
|
||||
if (i === '无') {
|
||||
val = hasNo.value ? [] : ['无'];
|
||||
} else if (i === '其他') {
|
||||
if (hasOther.value) {
|
||||
val = val.filter(v => v !== '其他');
|
||||
otherText.value = '';
|
||||
} else {
|
||||
val = val.filter(v => v !== '无');
|
||||
val.push('其他');
|
||||
otherText.value = '';
|
||||
}
|
||||
} else if (val.includes(i)) {
|
||||
val = val.filter(v => v !== i);
|
||||
} else {
|
||||
val = val.filter(v => v !== '无');
|
||||
val.push(i);
|
||||
}
|
||||
emits('change', {
|
||||
title: props.title,
|
||||
value: val
|
||||
})
|
||||
console.log(value.value);
|
||||
}
|
||||
|
||||
</script>
|
||||
<style>
|
||||
@import '../cell-style.css';
|
||||
|
||||
.popup-content-scroll {
|
||||
max-height: 65vh;
|
||||
}
|
||||
</style>
|
||||
@ -1,4 +1,5 @@
|
||||
<template>
|
||||
<!-- <view class="px-10">{{ attrs.name }} {{ attrs.title }} {{ attrs.type }}</view> -->
|
||||
<form-datepicker v-if="attrs.type === 'date'" v-bind="attrs" :form="form" :disableChange="disableChange"
|
||||
@change="change" />
|
||||
<form-input v-else-if="attrs.type === 'input'" v-bind="attrs" :form="form" :disableChange="disableChange"
|
||||
@ -16,7 +17,7 @@
|
||||
<form-mult-disease v-else-if="attrs.type === 'diagnosis'" v-bind="attrs" :form="form"
|
||||
@change="change"></form-mult-disease>
|
||||
<form-upload v-else-if="attrs.type === 'files'" v-bind="attrs" :form="form" @change="change" />
|
||||
|
||||
<form-mult-other v-else-if="attrs.type === 'multiSelectAndOther'" v-bind="attrs" :form="form" @change="change" />
|
||||
<!--
|
||||
<form-operation v-else-if="attrs.title === 'surgicalHistory'" v-bind="attrs" :form="form" @change="change"
|
||||
@addRule="addRule" />
|
||||
@ -37,6 +38,7 @@ import formRegion from './form-region.vue';
|
||||
import formTextarea from './form-textarea.vue';
|
||||
import formMultDisease from './form-multiple-diseases.vue';
|
||||
import formUpload from './form-upload.vue';
|
||||
import formMultOther from './form-mult-select-and-other.vue';
|
||||
|
||||
defineProps({
|
||||
form: {
|
||||
|
||||
@ -50,6 +50,12 @@
|
||||
"navigationBarTitleText": "健康柚"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/login/agreement",
|
||||
"style": {
|
||||
"navigationBarTitleText": "健康柚"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/archive/archive-manage",
|
||||
"style": {
|
||||
@ -162,7 +168,7 @@
|
||||
"pagePath": "pages/home/home",
|
||||
"iconPath": "static/tabbar/home.png",
|
||||
"selectedIconPath": "static/tabbar/home_selected.png",
|
||||
"text": "消息"
|
||||
"text": "服务"
|
||||
},
|
||||
{
|
||||
"pagePath": "pages/message/message",
|
||||
|
||||
@ -26,6 +26,7 @@ import dayjs from 'dayjs';
|
||||
import useGuard from '@/hooks/useGuard';
|
||||
import useAccount from '@/store/account';
|
||||
import api from '@/utils/api';
|
||||
import { set } from "@/utils/cache";
|
||||
import { toast, confirm as uniConfirm } from '@/utils/widget';
|
||||
import validate from '@/utils/validate';
|
||||
|
||||
@ -56,7 +57,7 @@ const verifyVisible = ref(false);
|
||||
const visible = ref(false);
|
||||
|
||||
const formData = computed(() => {
|
||||
return { ...customer.value, ...form.value, mobile: account.value?.mobile }
|
||||
return { ...customer.value, ...form.value, mobile: account.value?.mobile }
|
||||
});
|
||||
|
||||
function change({ title, value }) {
|
||||
@ -137,6 +138,7 @@ async function addArchive() {
|
||||
loading.value = false;
|
||||
const res = await api('addCustomer', { params });
|
||||
if (res && res.success) {
|
||||
set('home-invite-teamId', teamId.value);
|
||||
uni.$emit('reloadTeamCustomers')
|
||||
uni.redirectTo({
|
||||
url: `/pages/archive/archive-result?corpId=${corpId.value}&teamId=${teamId.value}`
|
||||
|
||||
@ -2,37 +2,17 @@
|
||||
<view class="archive-container">
|
||||
<view class="mb-10 flex items-center justify-between">
|
||||
<view class="module-title flex-shrink-0 truncate"> 成员档案 </view>
|
||||
<view
|
||||
class="flex items-center leading-normal rounded-sm"
|
||||
style="padding-right: 0"
|
||||
@click="toManagePage()"
|
||||
>
|
||||
<image
|
||||
class="manage-icon mr-5"
|
||||
src="/static/home/archive-manage.png"
|
||||
mode="aspectFit"
|
||||
></image>
|
||||
<view class="flex items-center leading-normal rounded-sm" style="padding-right: 0" @click="toManagePage()">
|
||||
<image class="manage-icon mr-5" src="/static/home/archive-manage.png" mode="aspectFit"></image>
|
||||
<view style="font-size: 28rpx; color: #065bd6">档案管理</view>
|
||||
</view>
|
||||
</view>
|
||||
<view
|
||||
v-if="customers.length === 0"
|
||||
class="add-archive-card"
|
||||
@click="toManagePage()"
|
||||
>
|
||||
<view v-if="customers.length === 0" class="add-archive-card" @click="toManagePage()">
|
||||
<view class="add-archive-btn">
|
||||
<image
|
||||
class="add-archive-btn-icon"
|
||||
src="/static/home/add-archive-btn.png"
|
||||
mode="aspectFit"
|
||||
></image>
|
||||
<image class="add-archive-btn-icon" src="/static/home/add-archive-btn.png" mode="aspectFit"></image>
|
||||
<text class="add-archive-btn-text">新建档案</text>
|
||||
</view>
|
||||
<image
|
||||
class="add-archive-bg"
|
||||
src="/static/home/add-archive-bg.png"
|
||||
mode="aspectFit"
|
||||
></image>
|
||||
<image class="add-archive-bg" src="/static/home/add-archive-bg.png" mode="aspectFit"></image>
|
||||
</view>
|
||||
<scroll-view scroll-x="true">
|
||||
<view class="flex flex-nowrap pb-5">
|
||||
@ -44,12 +24,8 @@
|
||||
{{ i.relationship }}
|
||||
</view>
|
||||
<view class="flex flex-col items-center">
|
||||
<view
|
||||
class="customer-name text-lg leading-normal font-semibold whitespace-nowrap mb-8"
|
||||
:class="
|
||||
current && i._id === current._id ? 'text-primary' : 'text-dark'
|
||||
"
|
||||
>
|
||||
<view class="customer-name text-lg leading-normal font-semibold whitespace-nowrap mb-8"
|
||||
:class="current && i._id === current._id ? 'text-primary' : 'text-dark'">
|
||||
{{ i.name }}
|
||||
</view>
|
||||
</view>
|
||||
|
||||
@ -20,12 +20,13 @@
|
||||
<yc-home v-else />
|
||||
</template>
|
||||
<script setup>
|
||||
import { computed, ref, watch } from "vue";
|
||||
import { computed, ref } from "vue";
|
||||
import { storeToRefs } from "pinia";
|
||||
import useGuard from "@/hooks/useGuard";
|
||||
import useAccount from "@/store/account";
|
||||
import api from "@/utils/api";
|
||||
import { toast } from "@/utils/widget";
|
||||
import { get, remove } from "@/utils/cache";
|
||||
|
||||
import FullPage from "@/components/full-page.vue";
|
||||
import articleList from "./article-list.vue";
|
||||
@ -70,13 +71,12 @@ async function getTeams() {
|
||||
loading.value = true;
|
||||
const res = await api('getWxappRelateTeams', { openid: account.value.openid });
|
||||
teams.value = res && Array.isArray(res.data) ? res.data : [];
|
||||
const validTeam =
|
||||
teams.value.find(
|
||||
(item) => team.value && item.teamId === team.value.teamId
|
||||
) || teams.value[0];
|
||||
if (validTeam) {
|
||||
changeTeam(validTeam);
|
||||
return;
|
||||
const matchTeamId = get('home-invite-teamId') || (team.value ? team.value.teamId : '');
|
||||
const validTeam = teams.value.find(i => i.teamId && i.teamId === matchTeamId);
|
||||
const firstTeam = teams.value[0]
|
||||
if (validTeam || firstTeam) {
|
||||
remove('home-invite-teamId');
|
||||
changeTeam(validTeam || firstTeam);
|
||||
} else {
|
||||
team.value = null;
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
</view>
|
||||
<view class="w-0 flex-grow">
|
||||
<view class="text-lg font-semibold text-white">柚健康 </view>
|
||||
<view class="leading-normal text-base text-white truncate">生命全周期健康管理伙伴</view>
|
||||
<view class="leading-normal text-base text-white truncate">全周期健康管理伙伴</view>
|
||||
</view>
|
||||
<view v-if="menuButtonInfo && menuButtonInfo.width > 0" class="flex-shrink-0"
|
||||
:style="{ width: menuButtonInfo.width + 'px', height: menuButtonInfo.height + 'px' }">
|
||||
@ -17,8 +17,8 @@
|
||||
</view>
|
||||
<view class="flex-grow flex flex-col items-center justify-center bg-white">
|
||||
<empty-data :showText="false" />
|
||||
<view class="mb-10 text-lg text-dark font-semibold">暂无团队</view>
|
||||
<view class="text-lg text-dark font-semibold">需要扫团队二维码绑定服务团队哦!</view>
|
||||
<!-- <view class="mb-10 text-lg text-dark font-semibold">暂无团队</view> -->
|
||||
<view class="text-lg text-dark font-semibold">微信扫一扫医生团队二维码</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
30
pages/login/agreement.vue
Normal file
30
pages/login/agreement.vue
Normal file
@ -0,0 +1,30 @@
|
||||
<template>
|
||||
<scroll-view class="h-full bg-white" scroll-y="true">
|
||||
<view class="p-15 text-base text-dark leading-normal" style="white-space: pre-wrap;">
|
||||
{{ content }}
|
||||
</view>
|
||||
</scroll-view>
|
||||
</template>
|
||||
<script setup>
|
||||
import { ref } from 'vue';
|
||||
import { onLoad } from "@dcloudio/uni-app";
|
||||
|
||||
import privacy from './privacy-policy.js';
|
||||
import userAgreement from './user-agreement.js';
|
||||
|
||||
const content = ref('');
|
||||
|
||||
onLoad((options) => {
|
||||
if (options.type === 'privacyPolicy') {
|
||||
content.value = privacy;
|
||||
uni.setNavigationBarTitle({
|
||||
title: '隐私政策'
|
||||
})
|
||||
} else if (options.type === 'userAgreement') {
|
||||
content.value = userAgreement;
|
||||
uni.setNavigationBarTitle({
|
||||
title: '用户协议'
|
||||
})
|
||||
}
|
||||
})
|
||||
</script>
|
||||
@ -38,9 +38,9 @@
|
||||
<view class="agreement">
|
||||
<checkbox :checked="checked" @click="checked = !checked" />
|
||||
<text>我已阅读并同意</text>
|
||||
<text class="link" @click="openUserAgreement">《用户协议》</text>
|
||||
<text class="link" @click="toAggreement('userAgreement')">《用户协议》</text>
|
||||
<text>、</text>
|
||||
<text class="link" @click="openPrivacyPolicy">《隐私政策》</text>
|
||||
<text class="link" @click="toAggreement('privacyPolicy')">《隐私政策》</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
@ -52,7 +52,7 @@ import { storeToRefs } from "pinia";
|
||||
import { onLoad } from "@dcloudio/uni-app";
|
||||
import useAccountStore from "@/store/account";
|
||||
import api from '@/utils/api';
|
||||
import { get } from "@/utils/cache";
|
||||
import { get, set } from "@/utils/cache";
|
||||
import { toast } from "@/utils/widget";
|
||||
|
||||
import groupAvatar from "@/components/group-avatar.vue";
|
||||
@ -89,12 +89,20 @@ function remind() {
|
||||
toast("请先阅读并同意用户协议和隐私政策");
|
||||
}
|
||||
|
||||
function toAggreement(type) {
|
||||
uni.navigateTo({
|
||||
url: `/pages/login/agreement?type=${type}`
|
||||
})
|
||||
}
|
||||
|
||||
function toHome() {
|
||||
uni.switchTab({
|
||||
url: "/pages/home/home",
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
async function bindTeam() {
|
||||
const res = await api('bindWxappWithTeam', { appid, corpId: team.value.corpId, teamId: team.value.teamId, openid: account.value.openid });
|
||||
if (!res || !res.success) {
|
||||
@ -102,6 +110,7 @@ async function bindTeam() {
|
||||
}
|
||||
const res1 = await api('getWxAppCustomerCount', { miniAppId: account.value.openid, corpId: account.value.corpId, teamId: team.value.teamId });
|
||||
if (res1 && res1.data > 0) {
|
||||
set('home-invite-teamId', team.value.teamId);
|
||||
toHome();
|
||||
} else {
|
||||
attempToPage(redirectUrl.value)
|
||||
|
||||
166
pages/login/privacy-policy.js
Normal file
166
pages/login/privacy-policy.js
Normal file
@ -0,0 +1,166 @@
|
||||
export default `
|
||||
隐私政策
|
||||
|
||||
欢迎您访问健康柚平台!
|
||||
您(下称“患者”、“用户”)在健康柚平台使用我们的服务或产品时,我们可能会收集您的相关个人信息。健康柚深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。同时,健康柚承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。
|
||||
为此,我们制定本隐私政策,适用于我们为患者提供的产品和服务,包括但不限于健康柚微信小程序、柚助手微信小程序。
|
||||
在使用健康柚平台提供的产品或服务前,请您务必认真仔细阅读并确认充分理解本隐私政策,在确认充分理解并同意后再开始使用。一旦您主动选择确认本隐私政策并继续使用的,即视为同意本隐私政策的全部内容;如您不同意相关协议或其中的任何条款的,您应停止访问健康柚平台或使用健康柚产品和服务。
|
||||
如您是未成年人,请您和您的监护人仔细阅读本政策,并在征得您的监护人授权同意的前提下使用我们的服务或向我们提供个人信息。
|
||||
|
||||
本隐私政策将帮助您了解以下内容:
|
||||
1、我们如何收集和使用您的个人信息
|
||||
2、我们如何使用Cookie和同类技术
|
||||
3、我们如何共享、转移、公开披露您的个人信息
|
||||
4、我们如何保存和保护您的个人信息
|
||||
5、您的权利
|
||||
6、我们如何处理未成年人的个人信息
|
||||
7、您的个人信息如何在全球范围转移
|
||||
8、本隐私政策更新及通知
|
||||
9、如何联系我们
|
||||
10、争议解决
|
||||
一、我们如何收集和使用您的个人信息
|
||||
个人信息是指以电子或其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。
|
||||
我们仅会出于本政策所述的以下目的,收集和使用您的个人信息,当我们要将信息用于本政策未载明的其他用途时,会事先征求您的同意。
|
||||
(一) 注册成为用户
|
||||
健康柚平台提供的服务或产品是基于注册用户使用的,如您希望使用健康柚平台提供的服务或产品,则需要通过以下步骤完成账号注册。
|
||||
创建健康柚账户,我们将提供手机号码授权登陆方式,您需要提供您的手机号码。如不提供上述注册信息,您无法使用需注册成为健康柚平台用户方可使用的服务。
|
||||
(二) “成员档案管理”服务
|
||||
用户在使用“成员档案管理”服务时,需先添加成员信息,包括您的姓名、性别、年龄、与成员关系(本人/子女/父母/其他等),目的是协助医生对患者进行管理。
|
||||
(三) “我的服务团队”服务
|
||||
用户在“成员档案管理”中添加成员信息后,使用“团队”服务时,我们可能会收集在健康柚其他平台已与患者建立关系的服务团队信息,目的是与服务团队建立联系,以确保成员聊天咨询的连续性和准确性。我们还可能收集您的登记信息(姓名、身份证号码、性别、年龄),检查检验报告、用药记录、过敏史等个人健康生理信息,以及与个人身体健康状况相关的身高、体重信息,用于了解您的健康状况和咨询需求。如不收集这类信息,我们将无法为您提供健康咨询相关的服务,但不影响您使用其他服务。
|
||||
您与团队建立服务关系后,您理解并同意将添加的个人信息、病历信息、就诊记录将向该团队展示;
|
||||
(四) “回访”服务
|
||||
在您的服务团队人员对您进行回访的过程中,我们可能收集您与团队人员的沟通聊天记录、为您制定的回访计划、向您发送的文章,以及您填写的问卷信息。以支持您在健康柚平台上获得持续、可追溯的回访服务。
|
||||
(五) 客户服务
|
||||
当您向我们提出问题、投诉或建议时,我们需要收集您的通信/通话记录、您提供的联系方式信息、您为了证明相关事实提供的信息以及您参与问卷调查时向我们发送的问卷答复信息。我们收集上述信息的法律依据是基于向您提供健康柚平台服务所必需,为您解决您在使用平台及享受服务过程中所遇到的问题,以及向您提供相关问题的处理方案和结果。如不收集这类信息,您的投诉、建议和反馈将无法得到及时、有效处理,但不影响您使用其它服务。
|
||||
(六) 保障功能运行和风控服务
|
||||
为保障您正常使用我们及我们关联公司、合作伙伴提供的服务,维护我们系统基础功能的正常运行,拦截钓鱼网站、欺诈,防止网络漏洞、计算机病毒、网络攻击、网络侵入,改进及优化我们的服务体验以及保障您的账号安全,我们需要整合我们已根据本隐私政策合法收集的您的个人基本信息(姓名、身份证号码、手机号码、性别、年龄)、个人生理健康信息(既往病史、用药记录、体重),并收集、使用或整合您的网络身份标识信息(BSSID、DNS地址、IP地址、SSID、代理信息、网络类型、网络名称、掩码信息)、个人常用设备信息(IMEI、IMSI、设备ID、MAC地址、IDFA、IDFV、AndroidId、MCC、MNC、UUID、标准国家码、操作系统信息、Cookie启用状态、重力传感、陀螺仪传感、加速度传感、已安装应用列表)、位置信息(经纬度)、人脸识别信息以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息。我们收集上述信息的法律依据是基于法定义务及向您提供健康柚平台服务所必需,以综合判断您账户及交易风险、进行身份验证、检测及防范账户安全事件,并依法采取必要的记录、审计、分析、处置措施。如不收集这类信息,您将无法使用健康柚平台及健康柚平台提供的相应服务。
|
||||
(七) 我们如何使用您的信息
|
||||
1、我们会对我们提供的服务使用情况进行统计,并可能会与公众或第三方共享这些统计信息,以用于产品开发、服务优化、安全保障、数据分析等目的。但这些统计信息不包含您的任何身份识别信息。
|
||||
2、根据相关法律法规规定,以下情形中收集、使用您的个人信息无需征得您的授权同意:
|
||||
(1)为订立、履行您作为一方当事人的合同所必需;
|
||||
(2)为履行法定职责或者法定义务所必需;
|
||||
(3)为应对突发公共卫生事件,或者紧急情况下为保护自然人的生命健康和财产安全所必需;
|
||||
(4)为公共利益实施新闻报道、舆论监督等行为,在合理的范围内处理您的个人信息;
|
||||
(5)依照法律规定在合理的范围内处理您自行公开或者其他已经合法公开的个人信息;
|
||||
(6)法律、行政法规规定的其他情形。
|
||||
二、我们如何使用Cookies和同类技术
|
||||
(一) Cookies
|
||||
为确保网站正常运转、为您获得更轻松的访问体验,我们会在您的计算机或移动设备上存储名为Cookies的小数据文件。Cookies通常包含标识符、站点名称以及一些号码和字符。借助于Cookies,网站能够记住您的选择,存储您的偏好等数据。
|
||||
我们不会将Cookies用于本政策所述目的之外的任何用途。您可根据自己的偏好管理或删除Cookies。您可以清除计算机或手机上保存的所有Cookies,大部分网络浏览器都设有阻止Cookies的功能。如果您这么做,则需要在每一次访问我们的网站时亲自更改用户设置。
|
||||
第三方合作伙伴通过Cookies收集和使用您的信息不受本政策约束,而是受到其自身的信息保护声明约束,我们不对第三方的Cookies或同类技术承担责任。
|
||||
三、我们如何共享、转移、公开披露您的个人信息
|
||||
(一) 对外提供
|
||||
如您主动、自愿要求我们向第三方提供您的个人信息的,我们将基于您同意的目的,在相应页面中以适当方式告知您个人信息接收方的名称和联系方式。例如,您主动要求使用健康柚平台账户登录第三方产品或服务的,我们或第三方将在关联登录页面告知您为此目的,健康柚平台需向第三方提供的个人信息以及第三方的名称和联系方式。
|
||||
我们基于以下情况,可能会对外共享您的个人信息:
|
||||
1、在法定情形下的共享:我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的个人信息。我们为履行法定义务而向第三方提供您的个人信息的,我们将在相应页面中以适当方式告知您个人信息接收方的名称和联系信息。
|
||||
2、与关联公司间共享:我们只会共享必要的个人信息(如为便于您通过统一账号使用我们关联公司产品或服务,我们会向关联公司共享您必要的账户信息),如果我们共享您的个人敏感信息或关联公司改变个人信息的使用及处理目的,将在此就分享目的、范围、形式等必要内容征求您的授权统一。
|
||||
3、基于向您提供健康柚平台服务所必需。部分服务可能是我们的关联公司和合作机构(“授权合作伙伴”)或我们与第三方共同向您提供。因此,为向您提供健康柚平台服务,我们必需将您的个人信息提供给我们的关联公司及业务合作伙伴。例如,在某些情况下,我们必须与物流服务提供商共享您的收货信息才能安排配送。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。我们的合作伙伴无权将共享的个人信息用于任何其他用途。
|
||||
目前,我们的授权合作伙伴包含以下类型:
|
||||
1)技术服务供应商。我们可能会将您的个人信息共享给支持我们功能的第三方。这些支持包括为我们提供基础设施技术服务、安全保障服务、代表我们发出短信的通讯服务供应商、物流配送服务、数据处理等。我们共享这些信息的目的是可以实现我们产品或服务的功能,比如我们必须与物流服务提供商共享您的收货信息才能安排送货。
|
||||
2)分析服务类的授权合作伙伴。在征得您的许可后,我们可能将不能识别您的个人身份信息的统计或匿名信息共享给提供分析服务的合作伙伴。对于分析数据的伙伴,我们仅会向这些合作伙伴提供不能识别个人身份的统计或匿名信息。
|
||||
3)委托我们进行推广的合作伙伴。有时我们会代表其他企业向使用我们产品或服务的用户群提供促销推广的服务。我们可能会使用您的个人信息以及您的非个人信息集合形成的间接用户画像与委托我们进行推广的合作伙伴(“委托方”)共享,但我们仅会向这些委托方提供推广的覆盖面和有效性的信息,而不会提供您的个人身份信息,或者我们将这些信息进行汇总,以便它不会识别您个人。比如我们可以告知该委托方有多少人看了他们的推广信息,或者向他们提供不能识别个人身份的统计信息,帮助他们了解其受众或顾客。对我们与之共享个人信息的公司、组织和个人,我们会与其签署严格的保密协定,要求他们按照我们的说明、本隐私政策以及其他任何相关的保密和安全措施来处理个人信息。
|
||||
4)医疗技术与药物研发合作伙伴。在对您的个人信息进行去标识化处理、统计后,我们可能会向开展医疗技术与药物研发的合作伙伴提供相关去标识化之后的信息。我们将与我们的合作伙伴签署严格的保密协议,要求他们采取严格的保密和安全措施,仅为医疗技术与药物研发目的处理该等去标识化后的信息,并禁止其采取任何技术手段尝试利用该等信息重新识别您的身份。
|
||||
4、设备权限调用及SDK
|
||||
我们将审慎评估关联方、第三方数据使用共享信息的目的,对这些合作方的安全保障能力进行综合评估,并要求其遵循合作法律协议。我们会对合作方获取信息的软件工具开发包(SDK)、应用程序接口(API)进行严格的安全监测,以保护数据安全。
|
||||
(二) 转移
|
||||
1、您如果需要将您的个人信息转移至您指定的第三方的,您可以通过本政策载明的方式联系我们,在符合法律法规规定的条件下,我们将逐一处理和响应;
|
||||
2、在涉及合并、分立、清算、资产或业务的收购或出售等交易原因需要转移您的个人信息,我们将向您告知接收方的名称或者姓名和联系方式,并促使接收方继续履行个人信息保护义务。接收方变更原先的处理目的、处理方式的,应当依法规定重新取得您的同意,或具备其他合法事由。
|
||||
(三) 公开披露
|
||||
我们原则上不会公开披露您的个人信息,以下情况除外:
|
||||
1、获得您的单独同意后;
|
||||
2、基于法律的披露:在法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会公开披露您的个人信息。
|
||||
3、在符合法律法规的前提下,当我们收到上述披露信息的请求时,我们会要求必须出具与之相应的法律文件,如传票或调查函。我们坚信,对于要求我们提供的信息,应该在法律允许的范围内尽可能保持透明。
|
||||
(四) 共享、转移、公开披露个人信息时事先征得授权同意的例外
|
||||
在以下情形中,共享、转移、公开披露您的个人信息无需事先征得您的授权同意:
|
||||
1、为履行法定职责或者法定义务所必需;
|
||||
2、为应对突发公共卫生事件,或者紧急情况下为保护自然人的生命健康和财产安全所必需;
|
||||
3、为公共利益实施新闻报道、舆论监督等行为,在合理的范围内处理个人信息;
|
||||
4、依照本法规定在合理的范围内处理个人自行公开或者其他已经合法公开的个人信息;
|
||||
5、法律、行政法规规定的其他情形。
|
||||
6、已经匿名化处理的您的个人信息,指经过处理无法识别特定自然人且不能复原。
|
||||
四、我们如何保存和保护您的个人信息
|
||||
(一) 个人信息的保存
|
||||
1、保存期限:如您删除或通过系统设置拒绝我们对您的个人信息进行收集,或者在您申请注销账号经核实身份注销后,我们将停止使用并删除或匿名化处理您的个人信息。我们的个人信息保存期限为实现目的所需及法律法规要求的最短时间,但法律法规另有规定或者您另行授权同意的除外。
|
||||
2、保存地域:上述信息将存储于中华人民共和国境内。如需跨境传输,我们将会在符合国家对于信息出境的相关法律规定情况下,另行单独征得您的授权同意。
|
||||
(二) 个人信息的保护
|
||||
1、安全措施
|
||||
1)我们已使用符合业界标准的安全防护措施保护您提供的个人信息,防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。
|
||||
2)我们会使用加密技术确保数据的安全;我们会使用受信赖的保护机制防止数据遭到恶意攻击。
|
||||
3)我们已部署访问控制机制,确保只有授权人员才可访问个人信息;我们会与接触您个人信息的员工、合作伙伴签署保密协议,明确岗位职责及行为准则,确保只有授权人员才可访问个人信息,并对此进行审查。若有违反保密协议的行为,会被追究相关责任。
|
||||
4)我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
|
||||
2、安全提醒
|
||||
1)互联网并非绝对安全的环境,我们强烈建议您不要通过电子邮件、即使通讯及与其他用户交流等未加密的方式发送个人信息。请登陆时使用手机验证码,协助我们保证您的账号安全。
|
||||
2)请使用复杂密码,协助我们保证您的账号安全。我们将尽力保障您发送给我们的任何信息的安全性。如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改、或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。
|
||||
3)您在使用健康柚平台及服务时,请谨慎发表、上传可能会涉及您或他人隐私的信息,也勿将该等信息通过健康柚平台的服务传播给他人,若因您该等行为引起您或他人的隐私泄露,由您自行承担责任。
|
||||
4)请勿在使用健康柚平台服务时公开透露自己的各类财产账户、银行卡、信用卡、第三方支付账户及对应密码等重要资料,否则由此带来的损失由您自行承担责任。
|
||||
5)健康柚平台一旦发现假冒、仿冒、盗用他人名义进行平台认证的,健康柚有权立即删除用户信息并有权在用户提供充分证据前禁止其使用平台服务。
|
||||
3、安全事件通知
|
||||
1)我们会制定相应的网络安全事件应急预案,及时处置系统漏洞、计算机病毒、网络攻击、网络侵入等安全风险,在发生危害网络安全的事件时,我们会立即启动应急预案,采取相应的补救措施。
|
||||
2)在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们将及时将事件相关情况以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。
|
||||
同时,我们还将按照监督部门要求,主动上报个人信息安全事件的处置情况。
|
||||
请您理解,根据法律法规的规定,如果我们采取的措施能够有效避免信息泄露、篡改、丢失造成危害的,除非监管部门要求向您通知,我们可以选择不向您通知该个人信息安全事件。
|
||||
3)如您发现自己的个人信息泄密,尤其是您的账户及密码发生泄露,请您立即通过健康柚平台或本隐私政策提供的联系方式联络我们,以便我们采取相应措施。
|
||||
五、您的权利
|
||||
按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们保障您对自己的个人信息行使以下权利:
|
||||
(一) 访问您的个人信息
|
||||
您有权访问您的个人信息,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问:
|
||||
档案信息:小程序中,您可以通过【档案管理】中新增、查阅、删除您的档案信息。
|
||||
咨询记录:小程序中,您可以通过【咨询】列表查阅历史咨询记录;
|
||||
问卷信息:小程序中,您可以通过【我的问卷】查阅历史填写的问卷记录;
|
||||
(二) 更正您的个人信息
|
||||
当您发现我们处理的关于您的个人信息有错误时,您有权通过客服提出更正申请。
|
||||
(三) 删除您的个人信息
|
||||
如果您决定不再使用我们平台,需要注销账户请联系客服,进入个人中心扫描客户二维码。
|
||||
(四) 改变您授权同意的范围
|
||||
您可以通过解除绑定、删除信息、关闭设备功能、修改个人设置、联系客服等方式改变您授权我们继续收集个人信息的范围或随时撤回您的授权(包括对第三方共享信息授权)。
|
||||
(五) 注销帐号
|
||||
您随时可注销此前注册的账户,您可以通过客服向我们申请注销和删除您的信息。
|
||||
在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求,删除您的个人信息,或进行匿名化处理,法律法规另有规定的除外。
|
||||
(六) 个人信息主体获取个人信息副本
|
||||
您有权复制我们收集的您的个人信息。在法律法规规定的条件下,如果技术可行,您也可以要求我们将您的个人信息转移至您指定的其他主体。您可以通过以下方式自行操作:通过客服与我们联系,我们将在15个工作日内对您的请求进行处理。
|
||||
(七) 约束信息系统自动决策
|
||||
在某些业务功能中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。如果这些决定显著影响您的合法权益,您有权拒绝并要求我们做出解释,我们将提供适当的救济方式。
|
||||
(八) 响应您的上述请求
|
||||
为保障安全,我们可能会先验证您的身份,然后再处理您的请求。您可能需要提供书面请求,或以其他方式证明您的身份。验证通过后,对于您的请求,我们原则上将于15个工作日内做出答复。
|
||||
对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际(例如,涉及备份磁带上存放的信息)的请求,我们可能会予以拒绝。
|
||||
在以下情形中,按照法律法规要求,我们将无法响应您的请求:
|
||||
1、与我们履行法律法规规定的义务相关的;
|
||||
2、与国家安全、国防安全直接相关的;
|
||||
3、与公共安全、公共卫生、重大公共利益直接相关的;
|
||||
4、与犯罪侦查、起诉、审判和判决执行等直接相关的;
|
||||
5、有充分证据表明您存在主观恶意或滥用权利的;
|
||||
6、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;
|
||||
7、涉及商业秘密的。
|
||||
(九) 获得解释的权利
|
||||
您有权要求我们就个人信息处理规则作出解释说明。您可以通过第九部分中的联系方式与我们取得联系。
|
||||
六、我们如何处理未成年人的个人信息
|
||||
6.1如果没有父母或其他监护人的统一,儿童不得创建自己的用户账户。如您为儿童的,我们要求您请您的父母或其他监护人仔细阅读本政策,并在征得您的父母或其他监护人同意的前提下使用我们的服务或产品或向我们提供信息。
|
||||
6.2对于经父母或其他监护人同意使用我们的服务或产品而收集儿童个人信息的情况,我们只会在法律法规允许、父母或其他监护人明确同意或者保护儿童所必要的情况下使用、共享、转让或披露此信息。
|
||||
七、您的个人信息如何在全球范围转移
|
||||
我们在中华人民共和国境内运营中收集和产生的个人信息,储存在中国境内,一下情形除外:
|
||||
1. 法律法规有明确规定。
|
||||
2. 获得您的明确授权且经过国家安全相关审查的。
|
||||
针对以上情形,我们会确保依据本政策对您的个人信息提供足够的保护。
|
||||
八、本隐私政策更新及通知
|
||||
我们的隐私政策可能变更。
|
||||
未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会在本页面上发布对本政策所做的任何变更并取得您的同意。
|
||||
对于重大变更,我们可能还会提供更为显著的通知(包括对于某些服务,我们会通过电子邮件、站内信、短信、小程序服务通知、公众号通知、弹窗等方式发送通知,说明隐私政策的具体变更内容)。
|
||||
本政策重大变更包括但不限于:
|
||||
1、我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;
|
||||
2、我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;
|
||||
3、个人信息共享、转移或公开披露的主要对象发生变化;
|
||||
4、您参与个人信息处理方面的权利及其行使方式发生重大变化;
|
||||
5、我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化;
|
||||
6、个人信息安全影响评估报告表明存在高风险时。
|
||||
我们还会将本政策的旧版本存档,供您查阅。
|
||||
九、如何联系我们
|
||||
如您对本政策内容有任何疑问、意见或建议,或发现个人信息可能被泄露的,您可以通过以下方式与我们联系,一般情况下我们将在15个工作日内回复您的请求。可以通过“我的-联系客服”联系我们。或邮寄至下列地址:
|
||||
公司名称:杭州柚康科技有限公司
|
||||
法定代表人:王荣波
|
||||
联系地址:中国浙江省杭州西湖区塘苗路1号,2号楼4楼。
|
||||
十、争议解决
|
||||
因本政策以及我们处理您个人信息事宜引起的任何争议,您可随时联系我公司个人信息保护相关负责人要求给出回复,如果您对我们的回复不满意的,认为我们的个人信息处理行为严重损害了您的合法权益的,您还可以通过向本隐私政策服务提供商健康柚所在地【杭州市】有管辖权的人民法院提起诉讼来寻求解决方案。
|
||||
感谢您对健康柚平台以及健康柚产品和服务的信任和使用!
|
||||
|
||||
`
|
||||
@ -56,6 +56,7 @@ async function bindTeam() {
|
||||
}
|
||||
const res1 = await api('getWxAppCustomerCount', { miniAppId: account.value.openid, corpId: account.value.corpId, teamId: team.value.teamId });
|
||||
if (res1 && res1.data > 0) {
|
||||
set('home-invite-teamId', team.value.teamId);
|
||||
uni.switchTab({
|
||||
url: "/pages/home/home",
|
||||
});
|
||||
|
||||
2
pages/login/user-agreement.js
Normal file
2
pages/login/user-agreement.js
Normal file
@ -0,0 +1,2 @@
|
||||
export default `
|
||||
`
|
||||
@ -16,37 +16,75 @@
|
||||
|
||||
<!-- Menu List -->
|
||||
<view class="menu-container">
|
||||
<view class="px-15 py-12 flex items-center border-b" @click="toPage('/pages/mine/contact')">
|
||||
<view class="flex-shrink-0 item-icon">
|
||||
<uni-icons type="headphones" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
<view class="mr-10 flex-grow w-0 truncate text-lg text-dark">联系客服</view>
|
||||
<view class="flex-shrink-0">
|
||||
<uni-icons type="right" size="18" color="#999"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
<view class="px-15 py-12 flex items-center border-b" @click="toPage('/pages/login/agreement?type=privacyPolicy')">
|
||||
<view class="flex-shrink-0 item-icon">
|
||||
<uni-icons type="locked" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
<view class="mr-10 flex-grow w-0 truncate text-lg text-dark">隐私保护政策</view>
|
||||
<view class="flex-shrink-0">
|
||||
<uni-icons type="right" size="18" color="#999"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
<view class="px-15 py-12 flex items-center border-b" @click="toPage('/pages/login/agreement?type=userAgreement')">
|
||||
<view class="flex-shrink-0 item-icon">
|
||||
<uni-icons type="locked" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
<view class="mr-10 flex-grow w-0 truncate text-lg text-dark">用户注册协议</view>
|
||||
<view class="flex-shrink-0">
|
||||
<uni-icons type="right" size="18" color="#999"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
<view class="px-15 py-12 flex items-center" @click="handleLogout()">
|
||||
<view class="flex-shrink-0 item-icon">
|
||||
<uni-icons type="undo" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
<view class="mr-10 flex-grow w-0 truncate text-lg text-dark">退出登录</view>
|
||||
<view class="flex-shrink-0">
|
||||
<uni-icons type="right" size="18" color="#999"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- <view class="menu-container">
|
||||
<uni-list>
|
||||
<uni-list-item title="联系客服" link to="/pages/mine/contact" clickable>
|
||||
<template v-slot:header>
|
||||
<view class="item-icon">
|
||||
<uni-icons type="headphones" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
<uni-list-item title="隐私保护政策" link to="/pages/common/privacy" clickable>
|
||||
<template v-slot:header>
|
||||
<view class="item-icon">
|
||||
<uni-icons type="locked" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
<uni-list-item title="用户注册协议" link to="/pages/common/agreement" clickable>
|
||||
<template v-slot:header>
|
||||
<view class="item-icon">
|
||||
<uni-icons type="paperclip" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
<uni-list-item title="退出登录" link @click="handleLogout">
|
||||
<template v-slot:header>
|
||||
<view class="item-icon">
|
||||
<uni-icons type="undo" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
</uni-list>
|
||||
</view>
|
||||
<template v-slot:header>
|
||||
<view class="item-icon">
|
||||
<uni-icons type="headphones" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
<uni-list-item title="隐私保护政策" link to="/pages/common/privacy" clickable>
|
||||
<template v-slot:header>
|
||||
<view class="item-icon">
|
||||
<uni-icons type="locked" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
<uni-list-item title="用户注册协议" link to="/pages/common/agreement" clickable>
|
||||
<template v-slot:header>
|
||||
<view class="item-icon">
|
||||
<uni-icons type="paperclip" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
<uni-list-item title="退出登录" link @click="handleLogout">
|
||||
<template v-slot:header>
|
||||
<view class="item-icon">
|
||||
<uni-icons type="undo" size="22" color="#000"></uni-icons>
|
||||
</view>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
</uni-list>
|
||||
</view> -->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@ -77,13 +115,19 @@ const handleLogout = () => {
|
||||
|
||||
// Redirect to login or home
|
||||
uni.reLaunch({
|
||||
url: '/pages/login/login'
|
||||
url: '/pages/login/login'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
function toPage(url) {
|
||||
uni.navigateTo({
|
||||
url: url
|
||||
});
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
@ -108,7 +152,7 @@ page {
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
|
||||
|
||||
.avatar-container {
|
||||
width: 60px;
|
||||
@ -146,8 +190,8 @@ page {
|
||||
}
|
||||
|
||||
.item-icon {
|
||||
margin-right: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-right: 10px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -5,13 +5,14 @@
|
||||
<view class="mr-5 flex-shrink-0 text-xl text-dark font-semibold">{{ member.anotherName }}</view>
|
||||
<view class="w-0 flex-grow truncate text-base text-gray">{{ memberJob[member.userid] }}</view>
|
||||
</view>
|
||||
<view class="flex">
|
||||
<!-- <view class="flex">
|
||||
<view class="flex-shrink-0 text-base text-gray">机构部门:</view>
|
||||
<view class="flex-shrink-0 text-base text-dark">{{ deptNames }}</view>
|
||||
</view>
|
||||
</view> -->
|
||||
<view class="flex">
|
||||
<view class="flex-shrink-0 text-base text-gray">执业机构:</view>
|
||||
<view class="flex-shrink-0 text-base text-dark">{{ corpNames }}</view>
|
||||
<view v-if="member.hospitalName" class="flex-shrink-0 text-base text-dark">{{ member.hospitalName }}</view>
|
||||
<view v-else class="flex-shrink-0 text-base text-dark">{{ corpNames }}</view>
|
||||
</view>
|
||||
</view>
|
||||
<image class="avatar" :src="member.avatar"></image>
|
||||
|
||||
@ -111,8 +111,6 @@ export default defineStore("accountStore", () => {
|
||||
const corpId = account.value?.corpId;
|
||||
const unionid = account.value?.unionid;
|
||||
const openid = account.value?.openid;
|
||||
console.clear()
|
||||
console.log('corpId', corpId, ',unionid', unionid, ',openid', openid)
|
||||
if (!(corpId && unionid && openid) || externalUserId.value) return;
|
||||
const res = await api('getUnionidToExternalUserid', { unionid, openid, corpId }, false);
|
||||
if (res && res.success && typeof res.data === 'string' && res.data.trim()) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user