فهرست منبع

Signed-off-by: 李妹妹 <1639016684@qq.com>

李妹妹 2 هفته پیش
والد
کامیت
b1c2b81976

+ 12 - 6
pages/auth/login.vue

@@ -157,8 +157,8 @@ export default {
 		// 返回主页
 		goBack() {
 			uni.navigateBack({
-				delta:1
-			})
+				delta: 1
+			});
 		},
 		// 获取验证码
 		async getVerifyCode() {
@@ -302,9 +302,15 @@ export default {
 								url: '/pages_user/certification'
 							})
 						}else{
-							uni.navigateBack({
-								delta: 1
-							});
+						if(this.companyId!=null && this.companyUserId!=null){
+								uni.switchTab({
+									url: '/pages/home/index',
+								})
+							}else{
+								uni.navigateBack({
+									delta: 1
+								});
+							}
 						}
 					}, 500);
 				} else {
@@ -350,7 +356,7 @@ export default {
 					uni.$emit('refreshLogin');
 					var data= res.data.docker
 					setTimeout(() => {
-						if(data.status==0){
+						if(data.status==4){
 							uni.navigateTo({
 								url: '/pages_user/certification'
 							})

+ 37 - 3
pages_task/caseCollection.vue

@@ -25,9 +25,9 @@
 					class="form-item" 
 					v-for="(field, index) in formFields" 
 					:key="getFieldKey(field, index)">
-					<view class="form-label">
+					<view class="form-label" v-if="showFieldLabel(field)">
 						<text class="required" v-if="field.__config__.required">*</text>
-						<text>{{ index + 1 }}、{{ field.__config__.label }}</text>
+						<text>{{ getDisplayIndex(index) }}、{{ field.__config__.label }}</text>
 					</view>
 					
 					<!-- 单行文本输入 -->
@@ -257,6 +257,12 @@
 							<text class="rate-text" v-if="field['show-score']">{{ formData[field.__vModel__] || 0 }}分</text>
 						</view>
 					</template>
+					<!-- 文本描述 -->
+					<template v-else-if="field.__config__.tag === 'span'">
+					  <view :style="field.style">
+					    {{ getSpanText(field) }}
+					  </view>
+					</template>
 				</view>
 			</view>
 		</scroll-view>
@@ -301,6 +307,33 @@ export default {
 		}
 	},
 	methods: {
+		showFieldLabel(field) {
+			const config = (field && field.__config__) || {}
+			if (config.tag === 'span') {
+				return false;
+			}
+			return true
+		},
+		getDisplayIndex(index) {
+			if (!Array.isArray(this.formFields) || index < 0) {
+				return 0
+			}
+			let displayIndex = 0
+			for (let i = 0; i <= index; i++) {
+				const field = this.formFields[i]
+				if (this.showFieldLabel(field)) {
+					displayIndex++
+				}
+			}
+			return displayIndex
+		},
+		getSpanText(field) {
+			if (!field) return ''
+			if (field.__slot__ && typeof field.__slot__.default === 'string') {
+				return field.__slot__.default
+			}
+			return (field.__config__ && field.__config__.label) || ''
+		},
 		getFieldKey(field, index) {
 			// 在非 H5 平台,:key 不支持表达式,需要使用方法来生成 key
 			return field && field.__config__ && field.__config__.formId ? field.__config__.formId : `field_${index}`
@@ -969,6 +1002,7 @@ export default {
 				
 				// 获取详情数据中的信息
 				const companyId = this.caseDetail?.companyId
+				const taskId = this.caseDetail?.taskId
 				const tableName = this.caseDetail?.surveyQuestionnaireVersion.tableName || ''
 				const version = this.caseDetail?.surveyQuestionnaireVersion.versionNo || 0
 				// 添加公用字段
@@ -977,7 +1011,7 @@ export default {
 				submitData.user_id = userInfo.id || 0
 				submitData.user_name = userName
 				submitData.version_id = Number(version) || 0
-				
+				submitData.taskId = taskId
 				const res = await submitCaseCollection(submitData)
 				uni.hideLoading()
 				if (res.code === 200) {

+ 14 - 14
pages_task/completeTask.vue

@@ -40,7 +40,7 @@
 			</view>
 			
 			<!-- 项目分组 -->
-			<view class="form-section">
+		<!-- 	<view class="form-section">
 				<view class="form-label">
 					<text class="required">*</text>
 					<text>项目分组</text>
@@ -51,10 +51,10 @@
 					</text>
 					<text class="arrow-right">></text>
 				</view>
-			</view>
+			</view> -->
 			
 			<!-- 项目标签 -->
-			<view class="form-section">
+			<!-- <view class="form-section">
 				<view class="form-label">
 					<text class="required">*</text>
 					<text>项目标签</text>
@@ -65,7 +65,7 @@
 					</text>
 					<text class="arrow-right">></text>
 				</view>
-			</view>
+			</view> -->
 			
 			<!-- 上传封面 -->
 			<view class="form-section">
@@ -558,14 +558,14 @@ export default {
 				uni.showToast({ icon: 'none', title: '请输入标题' })
 				return
 			}
-			if (!this.formData.groupId) {
-				uni.showToast({ icon: 'none', title: '请选择项目分组' })
-				return
-			}
-			if (!this.formData.tagId) {
-				uni.showToast({ icon: 'none', title: '请选择项目标签' })
-				return
-			}
+			// if (!this.formData.groupId) {
+			// 	uni.showToast({ icon: 'none', title: '请选择项目分组' })
+			// 	return
+			// }
+			// if (!this.formData.tagId) {
+			// 	uni.showToast({ icon: 'none', title: '请选择项目标签' })
+			// 	return
+			// }
 			if (!this.formData.coverImage) {
 				uni.showToast({ icon: 'none', title: '请上传封面' })
 				return
@@ -593,8 +593,8 @@ export default {
 					attachmentUrl: attachmentUrl, // 附件 URL(多个用逗号分隔)
 					content: this.formData.summary || '', // 摘要/内容
 					coverImage: this.formData.coverImage, // 封面图片
-					projectId: parseInt(this.formData.groupId) || 0, // 项目分组 ID
-					tagIds: this.formData.tagId || '', // 标签 ID(字符串)
+					//projectId: parseInt(this.formData.groupId) || 0, // 项目分组 ID
+					//tagIds: this.formData.tagId || '', // 标签 ID(字符串)
 					taskId: parseInt(this.taskId) || 0, // 任务 ID
 					title: this.formData.title, // 标题
 					userId: userId, // 用户 ID

+ 1 - 1
pages_task/longVideo.vue

@@ -289,7 +289,7 @@ export default {
 					endTime: this.dateRange.endDate,
 					finishAuditStatus:this.currentTab,
 					taskType:6,
-					pageNum: 1,
+					pageNum: this.pageNum,
 					pageSize: this.pageSize
 				}
 				const res = await getAirClassroomList(params)

+ 1 - 1
pages_task/medicationSurvey.vue

@@ -90,7 +90,7 @@ export default {
 				uni.showLoading({ title: '加载中...' })
 				const res = await getMedicationSurveyList({
 					timeStatus: this.currentTab,
-					pageNum: 1,
+					pageNum: this.pageNum,
 					pageSize: this.pageSize
 				})
 				uni.hideLoading()

+ 3 - 3
pages_task/onlineLecture.vue

@@ -371,7 +371,7 @@ export default {
 				const params = {
 					finishStatus:this.currentTab,
 					title:this.keyword,
-					pageNum: 1,
+					pageNum: this.pageNum,
 					pageSize: this.pageSize
 				}
 				const res = await getOnlineLectureList(params)
@@ -406,7 +406,7 @@ export default {
 				const params = {
 					finishStatus:this.currentTab,
 					title:this.keyword,
-					pageNum: 1,
+					pageNum: nextPage,
 					pageSize: this.pageSize
 				}
 				
@@ -507,7 +507,7 @@ export default {
 .search-bar {
 	padding: 24rpx;
 	background: #fff;
-	border-bottom: 1rpx solid #f0f0f0;
+	//border-bottom: 1rpx solid #f0f0f0;
 	
 	.search-input-wrapper {
 		display: flex;

+ 1 - 1
pages_task/questionnaire.vue

@@ -155,7 +155,7 @@ export default {
 				uni.showLoading({ title: '加载中...' })
 				const res = await getQuestionnaireList({
 					timeStatus: this.currentTab,
-					pageNum: 1,
+					pageNum: this.pageNum,
 					pageSize: this.pageSize
 				})
 				uni.hideLoading()

+ 1310 - 0
pages_task/questionnaireForm - 副本.vue

@@ -0,0 +1,1310 @@
+<template>
+	<view class="container">
+		<image class="bg" src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/images/bg_qestion.png" mode="widthFix"></image>
+		<view class="fixed-top-box" :style="{background: bgColor }">
+			<view class="status_bar" :style="{height: statusBarHeight}"></view>
+			<view class="back-box" @click="goBack">
+				<image src="@/static/image/back.png" mode=""></image>
+				<text class="title">问卷调查</text>
+				<text></text>
+			</view>
+		</view>
+		<scroll-view class="content" scroll-y>
+			<!-- 表单标题 -->
+			<view class="form-header">
+				<view class="form-title">{{ formTitle }}</view>
+				<view class="form-tips">
+					<view class="tip-item">请您根据患者真实情况选择并填写</view>
+					<view class="tip-item">我们承诺对您及患者所提供的所有信息严格保密</view>
+				</view>
+			</view>
+			
+			<!-- 动态表单内容 -->
+			<view class="form-section">
+				<view 
+					class="form-item" 
+					v-for="(field, index) in formFields" 
+					:key="getFieldKey(field, index)">
+					<view class="form-label">
+						<text class="required" v-if="field.__config__.required">*</text>
+						<text>{{ index + 1 }}、{{ field.__config__.label }}</text>
+					</view>
+					
+					<!-- 单行文本输入 -->
+					<template v-if="field.__config__.tag === 'el-input' && field.type !== 'textarea'">
+						<input 
+							class="form-input" 
+							:value="formData[field.__vModel__] || ''" 
+							@input="(e) => onInputChange(field, e)"
+							:placeholder="field.placeholder || '请输入' + field.__config__.label"
+							type="text"
+							:disabled="field.disabled"
+							placeholder-class="text-placeholder"
+						/>
+					</template>
+					
+					<!-- 多行文本输入 -->
+					<template v-else-if="field.__config__.tag === 'el-input' && field.type === 'textarea'">
+						<textarea 
+							class="form-textarea" 
+							:value="formData[field.__vModel__] || ''" 
+							@input="(e) => onInputChange(field, e)"
+							:placeholder="field.placeholder || '请输入' + field.__config__.label"
+							:maxlength="field.maxlength"
+							:disabled="field.disabled"
+							:auto-height="field.autosize ? true : false"
+							placeholder-class="text-placeholder"
+						/>
+					</template>
+					
+					<!-- 计数器 -->
+					<template v-else-if="field.__config__.tag === 'el-input-number'">
+						<view class="input-number-wrapper">
+							<view class="input-number-btn" @click="(e) => decreaseNumber(field, index)" :class="{ disabled: isNumberMin(field) }">-</view>
+							<input 
+								class="form-input input-number-input" 
+								:value="formData[field.__vModel__] || ''" 
+								@input="(e) => onNumberInputChange(field, e)"
+								type="number"
+								:placeholder="field.placeholder || '请输入' + field.__config__.label"
+								:disabled="field.disabled"
+								placeholder-class="text-placeholder"
+							/>
+							<view class="input-number-btn" @click="(e) => increaseNumber(field, index)" :class="{ disabled: isNumberMax(field) }">+</view>
+						</view>
+					</template>
+					
+					<!-- 下拉选择 -->
+					<template v-else-if="field.__config__.tag === 'el-select'">
+						<picker 
+							mode="selector" 
+							:range="getSelectOptions(field)" 
+							range-key="label"
+							:value="getSelectIndex(field)"
+							@change="(e) => onSelectChange(field, e)">
+							<view class="form-input picker-input" :class="{ placeholder: !formData[field.__vModel__] }">
+								{{ getSelectLabel(field) || field.placeholder || '请选择' + field.__config__.label }}
+								<image class="w48 h48" src="@/static/image/icon_more.png" mode=""></image>
+							</view>
+						</picker>
+					</template>
+					
+					<!-- 滑块 -->
+					<template v-else-if="field.__config__.tag === 'el-slider'">
+						<view class="slider-wrapper">
+							<slider 
+								:value="formData[field.__vModel__] || field.__config__.defaultValue || 0"
+								:min="field.min || 0"
+								:max="field.max || 100"
+								:step="field.step || 1"
+								:show-value="true"
+								activeColor="#388BFF"
+								@change="(e) => onSliderChange(field, e)"
+							/>
+						</view>
+					</template>
+					
+					<!-- 多选框组 -->
+					<template v-else-if="field.__config__.tag === 'el-checkbox-group'">
+						<checkbox-group @change="(e) => onCheckboxChange(field, e)" class="checkbox-group">
+							<label 
+								class="checkbox-item"
+								v-for="(option, optIndex) in getSelectOptions(field)" 
+								:key="optIndex">
+								<checkbox 
+									:value="option.value" 
+									:checked="isCheckboxChecked(field, option.value)" 
+									color="#388BFF" 
+								/>
+								<text>{{ option.label }}</text>
+							</label>
+						</checkbox-group>
+					</template>
+					
+					<!-- 单选框组 -->
+					<template v-else-if="field.__config__.tag === 'el-radio-group'">
+						<radio-group @change="(e) => onRadioChange(field, e)" class="radio-group">
+							<label 
+								class="radio-item"
+								v-for="(option, optIndex) in getSelectOptions(field)" 
+								:key="optIndex">
+								<radio 
+									:value="option.value" 
+									:checked="formData[field.__vModel__] == option.value" 
+									color="#388BFF" 
+								/>
+								<text>{{ option.label }}</text>
+							</label>
+						</radio-group>
+					</template>
+					
+					<!-- 文件上传 -->
+					<template v-else-if="field.__config__.tag === 'el-upload'">
+						<view class="upload-section">
+							<view class="upload-item" v-for="(file, fileIndex) in getUploadFiles(field)" :key="fileIndex">
+								<image class="uploaded-image" :src="file" mode="aspectFill" v-if="isImageFile(file)"></image>
+								<view class="uploaded-file" v-else>
+									<text class="file-name">{{ getFileName(file) }}</text>
+								</view>
+								<view class="delete-btn" @click="(e) => removeUploadFile(field, fileIndex, index)">×</view>
+							</view>
+							<view class="upload-item upload-placeholder" @click="(e) => chooseUploadFile(field, index)">
+								<image class="w48 h48" src="@/static/image/icon_camera1.png" mode=""></image>
+								<text class="upload-text">{{ field.__config__.buttonText || '点击上传' }}</text>
+							</view>
+						</view>
+					</template>
+					
+					<!-- 开关 -->
+					<template v-else-if="field.__config__.tag === 'el-switch'">
+						<switch 
+							:checked="formData[field.__vModel__] || false"
+							:disabled="field.disabled"
+							:color="field['active-color'] || '#388BFF'"
+							@change="(e) => onSwitchChange(field, e)"
+						/>
+					</template>
+					
+					<!-- 时间选择 -->
+					<template v-else-if="field.__config__.tag === 'el-time-picker' && !field['is-range']">
+						<picker 
+							mode="time" 
+							:value="formData[field.__vModel__] || ''"
+							@change="(e) => onTimePickerChange(field, e)">
+							<view class="form-input picker-input" :class="{ placeholder: !formData[field.__vModel__] }">
+								{{ formData[field.__vModel__] || field.placeholder || '请选择' + field.__config__.label }}
+								<!-- <image class="w48 h48" src="@/static/image/icon_my_more.png" mode=""></image> -->
+							</view>
+						</picker>
+					</template>
+					
+					<!-- 时间范围 -->
+					<template v-else-if="field.__config__.tag === 'el-time-picker' && field['is-range']">
+						<view class="time-range-wrapper">
+							<picker 
+								mode="time" 
+								:value="getTimeRangeStart(field)"
+								@change="(e) => onTimeRangeStartChange(field, e)">
+								<view class="form-input picker-input time-range-input" :class="{ placeholder: !getTimeRangeStart(field) }">
+									{{ getTimeRangeStart(field) || field['start-placeholder'] || '开始时间' }}
+									<!-- <image class="w48 h48" src="@/static/image/icon_my_more.png" mode=""></image> -->
+								</view>
+							</picker>
+							<text class="time-range-separator">{{ field['range-separator'] || '至' }}</text>
+							<picker 
+								mode="time" 
+								:value="getTimeRangeEnd(field)"
+								@change="(e) => onTimeRangeEndChange(field, e)">
+								<view class="form-input picker-input time-range-input" :class="{ placeholder: !getTimeRangeEnd(field) }">
+									{{ getTimeRangeEnd(field) || field['end-placeholder'] || '结束时间' }}
+									<!-- <image class="w48 h48" src="@/static/image/icon_my_more.png" mode=""></image> -->
+								</view>
+							</picker>
+						</view>
+					</template>
+					
+					<!-- 日期选择 -->
+					<template v-else-if="field.__config__.tag === 'el-date-picker' && field.type !== 'daterange'">
+						<picker 
+							mode="date" 
+							:value="formData[field.__vModel__] || ''"
+							:start="field['start-date'] || ''"
+							:end="field['end-date'] || ''"
+							@change="(e) => onDatePickerChange(field, e)">
+							<view class="form-input picker-input" :class="{ placeholder: !formData[field.__vModel__] }">
+								{{ formData[field.__vModel__] || field.placeholder || '请选择' + field.__config__.label }}
+								<!-- <image class="w48 h48" src="@/static/image/icon_my_more.png" mode=""></image> -->
+							</view>
+						</picker>
+					</template>
+					
+					<!-- 日期范围 -->
+					<template v-else-if="field.__config__.tag === 'el-date-picker' && field.type === 'daterange'">
+						<view class="date-range-wrapper">
+							<picker 
+								mode="date" 
+								:value="getDateRangeStart(field)"
+								@change="(e) => onDateRangeStartChange(field, e)">
+								<view class="form-input picker-input date-range-input" :class="{ placeholder: !getDateRangeStart(field) }">
+									{{ getDateRangeStart(field) || field['start-placeholder'] || '开始日期' }}
+									<!-- <image class="w48 h48" src="@/static/image/icon_my_more.png" mode=""></image> -->
+								</view>
+							</picker>
+							<text class="date-range-separator">{{ field['range-separator'] || '至' }}</text>
+							<picker 
+								mode="date" 
+								:value="getDateRangeEnd(field)"
+								@change="(e) => onDateRangeEndChange(field, e)">
+								<view class="form-input picker-input date-range-input" :class="{ placeholder: !getDateRangeEnd(field) }">
+									{{ getDateRangeEnd(field) || field['end-placeholder'] || '结束日期' }}
+									<!-- <image class="w48 h48" src="@/static/image/icon_my_more.png" mode=""></image> -->
+								</view>
+							</picker>
+						</view>
+					</template>
+					
+					<!-- 评分 -->
+					<template v-else-if="field.__config__.tag === 'el-rate'">
+						<view class="rate-wrapper">
+							<view 
+								class="rate-star" 
+								v-for="(star, starIndex) in (field.max || 5)" 
+								:key="starIndex"
+								@click="(e) => setRate(field, starIndex + 1, index)"
+								:class="{ active: (formData[field.__vModel__] || 0) >= (starIndex + 1) }">
+								★
+							</view>
+							<text class="rate-text" v-if="field['show-score']">{{ formData[field.__vModel__] || 0 }}分</text>
+						</view>
+					</template>
+				</view>
+			</view>
+		</scroll-view>
+		
+		<!-- 提交按钮 -->
+		<view v-if="caseDetail.periodNum!==0" class="submit-btn" @click="handleSubmit">提交</view>
+	</view>
+</template>
+
+<script>
+import { submitQuestionnaire, getQuestionnaireDetail} from '@/api/questionnaire'
+
+export default {
+		data() {
+			return {
+				top: 0,
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px',
+				questionnaireId: '',
+				formTitle: '病例收集',
+				formFields: [],
+				formData: {},
+				caseDetail: null ,// 保存详情数据,用于获取 company_id, table_name 等
+			}
+		},
+	onLoad(options) {
+		if (options.id) {
+			this.questionnaireId = options.id
+		}
+		if (options.title) {
+			this.formTitle = decodeURIComponent(options.title)
+		}
+		this.loadDetail()
+	},
+	onPageScroll(e) {
+		this.top = e.scrollTop
+	},
+	computed: {
+		bgColor() {
+			const opacity = Math.min(this.top / 30, 1)
+			return `rgba(255, 255, 255, ${opacity})`
+		}
+	},
+	methods: {
+		getFieldKey(field, index) {
+			// 在非 H5 平台,:key 不支持表达式,需要使用方法来生成 key
+			return field && field.__config__ && field.__config__.formId ? field.__config__.formId : `field_${index}`
+		},
+		goBack() {
+			uni.navigateBack()
+		},
+		initFormData() {
+			// 初始化表单数据
+			this.formFields.forEach(field => {
+				const vModel = field.__vModel__
+				if (!vModel) {
+					console.warn('字段缺少 __vModel__ 属性', field)
+					return
+				}
+				
+				// 如果字段已存在值,跳过初始化(保留已有数据)
+				if (this.formData[vModel] !== undefined && this.formData[vModel] !== null) {
+					return
+				}
+				
+				const tag = field.__config__.tag
+				const defaultValue = field.__config__.defaultValue
+				
+				// 根据字段类型设置默认值
+				switch (tag) {
+					// 单行文本输入
+					case 'el-input':
+						if (field.type === 'textarea') {
+							// 多行文本
+							this.$set(this.formData, vModel, defaultValue !== undefined ? defaultValue : '')
+						} else {
+							// 单行文本
+							this.$set(this.formData, vModel, defaultValue !== undefined ? defaultValue : '')
+						}
+						break
+					
+					// 数字输入(计数器)
+					case 'el-input-number':
+						if (defaultValue !== undefined) {
+							this.$set(this.formData, vModel, Number(defaultValue))
+						} else {
+							// 根据 min 值设置默认值,如果没有 min 则默认为 0
+							const minValue = field.min !== undefined ? Number(field.min) : null
+							this.$set(this.formData, vModel, minValue)
+						}
+						break
+					
+					// 下拉选择
+					case 'el-select':
+						this.$set(this.formData, vModel, defaultValue !== undefined ? defaultValue : '')
+						break
+					
+					// 滑块
+					case 'el-slider':
+						if (defaultValue !== undefined) {
+							this.$set(this.formData, vModel, Number(defaultValue))
+						} else {
+							// 默认值为 min 值,如果没有 min 则默认为 0
+							const minValue = field.min !== undefined ? Number(field.min) : 0
+							this.$set(this.formData, vModel, minValue)
+						}
+						break
+					
+					// 多选框组
+					case 'el-checkbox-group':
+						if (defaultValue !== undefined && Array.isArray(defaultValue)) {
+							this.$set(this.formData, vModel, [...defaultValue])
+						} else {
+							this.$set(this.formData, vModel, [])
+						}
+						break
+					
+					// 单选框组
+					case 'el-radio-group':
+						this.$set(this.formData, vModel, defaultValue !== undefined ? defaultValue : '')
+						break
+					
+					// 文件上传
+					case 'el-upload':
+						if (defaultValue !== undefined && Array.isArray(defaultValue)) {
+							this.$set(this.formData, vModel, [...defaultValue])
+						} else if (defaultValue !== undefined && typeof defaultValue === 'string') {
+							// 如果是字符串(逗号分隔),转换为数组
+							this.$set(this.formData, vModel, defaultValue.split(',').filter(item => item.trim()))
+						} else {
+							this.$set(this.formData, vModel, [])
+						}
+						break
+					
+					// 开关
+					case 'el-switch':
+						this.$set(this.formData, vModel, defaultValue !== undefined ? Boolean(defaultValue) : false)
+						break
+					
+					// 时间选择
+					case 'el-time-picker':
+						if (field['is-range']) {
+							// 时间范围
+							if (defaultValue !== undefined && Array.isArray(defaultValue)) {
+								this.$set(this.formData, vModel, [...defaultValue])
+							} else {
+								this.$set(this.formData, vModel, ['', ''])
+							}
+						} else {
+							// 单个时间
+							this.$set(this.formData, vModel, defaultValue !== undefined ? defaultValue : '')
+						}
+						break
+					
+					// 日期选择
+					case 'el-date-picker':
+						if (field.type === 'daterange') {
+							// 日期范围
+							if (defaultValue !== undefined && Array.isArray(defaultValue)) {
+								this.$set(this.formData, vModel, [...defaultValue])
+							} else {
+								this.$set(this.formData, vModel, ['', ''])
+							}
+						} else {
+							// 单个日期
+							this.$set(this.formData, vModel, defaultValue !== undefined ? defaultValue : '')
+						}
+						break
+					
+					// 评分
+					case 'el-rate':
+						if (defaultValue !== undefined) {
+							this.$set(this.formData, vModel, Number(defaultValue))
+						} else {
+							this.$set(this.formData, vModel, 0)
+						}
+						break
+					
+					// 默认情况:字符串类型
+					default:
+						this.$set(this.formData, vModel, defaultValue !== undefined ? defaultValue : '')
+						break
+				}
+			})
+		},
+		async loadDetail() {
+			try {
+				uni.showLoading({ title: '加载中...' })
+				const res = await getQuestionnaireDetail({ id: this.questionnaireId })
+				uni.hideLoading()
+				
+				if (res.code === 200 && res.data) {
+					// 保存详情数据
+					this.caseDetail = res.data
+					// 设置表单标题
+					this.formTitle = res.data.questionnaireName || this.formTitle
+					let question = res.data.surveyQuestionnaireVersion
+					let formConfigData = question.formJson || ''
+					// 如果 formConfigData 是字符串,需要解析 JSON
+					if (typeof formConfigData === 'string') {
+						try {
+							formConfigData = JSON.parse(formConfigData)
+						} catch (e) {
+							console.error('解析表单配置 JSON 失败', e)
+							formConfigData = null
+						}
+					}
+					// 设置表单字段
+					if (formConfigData && formConfigData.fields && Array.isArray(formConfigData.fields)) {
+						this.formFields = formConfigData.fields
+						this.initFormData()
+					} else {
+						// 接口返回的数据格式不正确,使用默认配置
+						console.warn('表单配置格式不正确,使用默认配置', formConfigData)
+							uni.showToast({
+								icon: 'none',
+								title: '表单配置加载失败'
+							})
+					}
+					
+					// 如果有已保存的数据,填充表单
+					if (res.data.formData) {
+						Object.assign(this.formData, res.data.formData)
+					}
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: res.msg
+					})
+				}
+			} catch (e) {
+				uni.hideLoading()
+				console.error('加载详情失败,使用默认配置', e)
+				uni.showToast({
+					icon: 'none',
+					title: '表单配置加载失败'
+				})
+			}
+		},
+		getSelectOptions(field) {
+			return field.__slot__?.options || []
+		},
+		getSelectIndex(field) {
+			const value = this.formData[field.__vModel__]
+			const options = this.getSelectOptions(field)
+			const index = options.findIndex(opt => opt.value == value)
+			return index >= 0 ? index : 0
+		},
+		getSelectLabel(field) {
+			const value = this.formData[field.__vModel__]
+			const options = this.getSelectOptions(field)
+			const option = options.find(opt => opt.value == value)
+			return option ? option.label : ''
+		},
+		onInputChange(field, e) {
+			const value = e.detail.value || e.target.value || ''
+			this.$set(this.formData, field.__vModel__, value)
+		},
+		onNumberInputChange(field, e) {
+			const value = e.detail.value || e.target.value || ''
+			const numValue = value === '' ? null : Number(value)
+			// 如果输入的不是有效数字,保持原值
+			if (value !== '' && isNaN(numValue)) {
+				return
+			}
+			this.$set(this.formData, field.__vModel__, numValue)
+		},
+		onSelectChange(field, e) {
+			const options = this.getSelectOptions(field)
+			const index = e.detail.value
+			if (options[index]) {
+				this.$set(this.formData, field.__vModel__, options[index].value)
+			}
+		},
+		onSliderChange(field, e) {
+			this.$set(this.formData, field.__vModel__, e.detail.value)
+		},
+		onCheckboxChange(field, e) {
+			this.$set(this.formData, field.__vModel__, e.detail.value)
+		},
+		onRadioChange(field, e) {
+			this.$set(this.formData, field.__vModel__, e.detail.value)
+		},
+		isCheckboxChecked(field, value) {
+			const checkedValues = this.formData[field.__vModel__] || []
+			return checkedValues.includes(value)
+		},
+		getUploadFiles(field) {
+			if (!field || !field.__vModel__) return []
+			const files = this.formData[field.__vModel__] || []
+			return Array.isArray(files) ? files : []
+		},
+		isImageFile(file) {
+			if (typeof file === 'string') {
+				return /\.(jpg|jpeg|png|gif|bmp|webp)$/i.test(file) || file.startsWith('data:image')
+			}
+			return false
+		},
+		getFileName(file) {
+			if (typeof file === 'string') {
+				const parts = file.split('/')
+				return parts[parts.length - 1]
+			}
+			return '文件'
+		},
+		chooseUploadFile(field, formIndex) {
+			// 如果 field 未定义,通过索引获取
+			if (!field && formIndex !== undefined) {
+				field = this.formFields[formIndex]
+			}
+			if (!field || !field.__vModel__) {
+				console.error('上传字段未找到')
+				return
+			}
+			const maxCount = field.multiple ? 9 : 3
+			const currentFiles = this.getUploadFiles(field)
+			const remaining = maxCount - currentFiles.length
+			
+			if (remaining <= 0) {
+				uni.showToast({
+					icon: 'none',
+					title: '已达到最大上传数量'
+				})
+				return
+			}
+			
+			const vm = this
+			uni.chooseImage({
+				//count: remaining,
+				sizeType: ['compressed'],
+				sourceType: ['album', 'camera'],
+				success: (res) => {
+					if (!res.tempFilePaths || res.tempFilePaths.length === 0) {
+						uni.showToast({
+							icon: 'none',
+							title: '未选择文件'
+						})
+						return
+					}
+					
+					uni.showLoading({ title: '上传中...' })
+					const files = vm.formData[field.__vModel__] || []
+					const requestPath = uni.getStorageSync('requestPath')
+					const totalCount = res.tempFilePaths.length
+					let completedCount = 0
+					const uploadedUrls = []
+					
+					// 循环上传所有选择的图片
+					res.tempFilePaths.forEach((filePath, index) => {
+						uni.uploadFile({
+							url: `${requestPath}/app/common/uploadOSS`,
+							filePath: filePath,
+							name: 'file',
+							formData: {},
+							success: (uploadRes) => {
+								completedCount++
+								try {
+									const result = typeof uploadRes.data === 'string' ? JSON.parse(uploadRes.data) : uploadRes.data
+									if (result.code == 200 && result.data && result.data.url) {
+										uploadedUrls.push(result.data.url)
+									} else if (result.code == 200 && result.url) {
+										// 兼容不同的返回格式
+										uploadedUrls.push(result.url)
+									}
+								} catch (e) {
+									console.error('解析上传结果失败', e)
+								}
+								
+								// 所有文件上传完成后,更新表单数据
+								if (completedCount === totalCount) {
+									uni.hideLoading()
+									if (uploadedUrls.length > 0) {
+										vm.$set(vm.formData, field.__vModel__, [...files, ...uploadedUrls])
+										uni.showToast({
+											icon: 'success',
+											title: uploadedUrls.length === totalCount ? '上传成功' : `成功上传${uploadedUrls.length}/${totalCount}个文件`
+										})
+									} else {
+										uni.showToast({
+											icon: 'none',
+											title: '上传失败'
+										})
+									}
+								}
+							},
+							fail: (err) => {
+								completedCount++
+								console.error('上传失败', err)
+								// 所有文件上传完成后,更新表单数据
+								if (completedCount === totalCount) {
+									uni.hideLoading()
+									if (uploadedUrls.length > 0) {
+										vm.$set(vm.formData, field.__vModel__, [...files, ...uploadedUrls])
+										uni.showToast({
+											icon: 'none',
+											title: `成功上传${uploadedUrls.length}/${totalCount}个文件`
+										})
+									} else {
+										uni.showToast({
+											icon: 'none',
+											title: '上传失败'
+										})
+									}
+								}
+							}
+						})
+					})
+				},
+				fail: (err) => {
+					console.error('选择文件失败', err)
+					uni.showToast({
+						icon: 'none',
+						title: '选择文件失败'
+					})
+				}
+			})
+		},
+		removeUploadFile(field, fileIndex, formIndex) {
+			// 如果 field 未定义,通过索引获取
+			if (!field && formIndex !== undefined) {
+				field = this.formFields[formIndex]
+			}
+			if (!field || !field.__vModel__) {
+				console.error('上传字段未找到')
+				return
+			}
+			const files = this.formData[field.__vModel__] || []
+			if (fileIndex >= 0 && fileIndex < files.length) {
+				files.splice(fileIndex, 1)
+				this.$set(this.formData, field.__vModel__, files)
+			}
+		},
+		// 计数器相关方法
+		decreaseNumber(field, index) {
+			// 如果 field 未定义,通过索引获取
+			if (!field && index !== undefined) {
+				field = this.formFields[index]
+			}
+			if (!field || !field.__vModel__) {
+				console.error('计数器字段未找到')
+				return
+			}
+			if (this.isNumberMin(field)) return
+			const current = Number(this.formData[field.__vModel__] || 0)
+			const step = field.step || 1
+			const min = field.min !== undefined ? field.min : 0
+			const newValue = Math.max(min, current - step)
+			this.$set(this.formData, field.__vModel__, newValue)
+		},
+		increaseNumber(field, index) {
+			// 如果 field 未定义,通过索引获取
+			if (!field && index !== undefined) {
+				field = this.formFields[index]
+			}
+			if (!field || !field.__vModel__) {
+				console.error('计数器字段未找到')
+				return
+			}
+			if (this.isNumberMax(field)) return
+			const current = Number(this.formData[field.__vModel__] || 0)
+			const step = field.step || 1
+			const max = field.max !== undefined ? field.max : Infinity
+			const newValue = Math.min(max, current + step)
+			this.$set(this.formData, field.__vModel__, newValue)
+		},
+		isNumberMin(field) {
+			if (!field || !field.__vModel__) return false
+			const current = Number(this.formData[field.__vModel__] || 0)
+			const min = field.min !== undefined ? field.min : 0
+			return current <= min
+		},
+		isNumberMax(field) {
+			if (!field || !field.__vModel__) return false
+			const current = Number(this.formData[field.__vModel__] || 0)
+			const max = field.max !== undefined ? field.max : Infinity
+			return current >= max
+		},
+		// 开关相关方法
+		onSwitchChange(field, e) {
+			this.$set(this.formData, field.__vModel__, e.detail.value)
+		},
+		// 时间选择相关方法
+		onTimePickerChange(field, e) {
+			this.$set(this.formData, field.__vModel__, e.detail.value)
+		},
+		getTimeRangeStart(field) {
+			const value = this.formData[field.__vModel__]
+			if (Array.isArray(value) && value.length > 0) {
+				return value[0]
+			}
+			return ''
+		},
+		getTimeRangeEnd(field) {
+			const value = this.formData[field.__vModel__]
+			if (Array.isArray(value) && value.length > 1) {
+				return value[1]
+			}
+			return ''
+		},
+		onTimeRangeStartChange(field, e) {
+			const value = this.formData[field.__vModel__] || []
+			value[0] = e.detail.value
+			this.$set(this.formData, field.__vModel__, [...value])
+		},
+		onTimeRangeEndChange(field, e) {
+			const value = this.formData[field.__vModel__] || []
+			value[1] = e.detail.value
+			this.$set(this.formData, field.__vModel__, [...value])
+		},
+		// 日期选择相关方法
+		onDatePickerChange(field, e) {
+			this.$set(this.formData, field.__vModel__, e.detail.value)
+		},
+		getDateRangeStart(field) {
+			const value = this.formData[field.__vModel__]
+			if (Array.isArray(value) && value.length > 0) {
+				return value[0]
+			}
+			return ''
+		},
+		getDateRangeEnd(field) {
+			const value = this.formData[field.__vModel__]
+			if (Array.isArray(value) && value.length > 1) {
+				return value[1]
+			}
+			return ''
+		},
+		onDateRangeStartChange(field, e) {
+			const value = this.formData[field.__vModel__] || []
+			value[0] = e.detail.value
+			this.$set(this.formData, field.__vModel__, [...value])
+		},
+		onDateRangeEndChange(field, e) {
+			const value = this.formData[field.__vModel__] || []
+			value[1] = e.detail.value
+			this.$set(this.formData, field.__vModel__, [...value])
+		},
+		// 评分相关方法
+		setRate(field, value, formIndex) {
+			// 如果 field 未定义,通过索引获取
+			if (!field && formIndex !== undefined) {
+				field = this.formFields[formIndex]
+			}
+			if (!field || !field.__vModel__) {
+				console.error('评分字段未找到')
+				return
+			}
+			if (field.disabled) return
+			this.$set(this.formData, field.__vModel__, value)
+		},
+		validateForm() {
+			for (let field of this.formFields) {
+			const value = this.formData[field.__vModel__]
+			const fieldLabel = field.__config__.label || '该字段'
+			const tag = field.__config__.tag
+			const isRequired = field.__config__.required
+			
+			// 必填校验
+				if (isRequired) {
+					// 数组类型(多选框、文件上传、范围选择)
+					if (tag === 'el-checkbox-group' || tag === 'el-upload') {
+						const arr = tag === 'el-upload' ? this.getUploadFiles(field) : value
+						if (!arr || !Array.isArray(arr) || arr.length === 0) {
+							return { valid: false, message: tag === 'el-upload' ? `请上传${fieldLabel}` : `请选择${fieldLabel}` }
+						}
+					}
+					// 范围选择(时间范围、日期范围)
+					else if ((tag === 'el-time-picker' && field['is-range']) || (tag === 'el-date-picker' && field.type === 'daterange')) {
+						const range = value || []
+						if (!Array.isArray(range) || range.length < 2 || !range[0] || !range[1]) {
+							return { valid: false, message: `请选择${fieldLabel}` }
+						}
+					}
+					// 选择类型(下拉、单选框、时间、日期)
+					else if (tag === 'el-select' || tag === 'el-radio-group' || 
+					         (tag === 'el-time-picker' && !field['is-range']) || 
+					         (tag === 'el-date-picker' && field.type !== 'daterange')) {
+						if (!value && value !== 0 && value !== '0' && value !== false) {
+							return { valid: false, message: `请选择${fieldLabel}` }
+						}
+					}
+					// 文本输入
+					else if (tag === 'el-input') {
+						if (!value || (typeof value === 'string' && value.trim() === '')) {
+							return { valid: false, message: `请输入${fieldLabel}` }
+						}
+					}
+					// 数字类型(数字输入、滑块)
+					else if (tag === 'el-input-number' || tag === 'el-slider') {
+						if (value === null || value === undefined || value === '') {
+							return { valid: false, message: tag === 'el-slider' ? `请设置${fieldLabel}` : `请输入${fieldLabel}` }
+						}
+					}
+					// 评分
+					else if (tag === 'el-rate') {
+						if (!value || value === 0) {
+							return { valid: false, message: `请为${fieldLabel}评分` }
+						}
+					}
+					// 其他类型
+					else if (!value && value !== 0 && value !== false) {
+						return { valid: false, message: `请填写${fieldLabel}` }
+					}
+				}
+				
+				// 格式校验(必填和非必填都校验)
+				if (value !== null && value !== undefined && value !== '') {
+					// 文本长度校验
+					if (tag === 'el-input' && typeof value === 'string') {
+						if (field.maxlength && value.length > field.maxlength) {
+							return { valid: false, message: `${fieldLabel}不能超过${field.maxlength}个字符` }
+						}
+						if (field.minlength && value.length < field.minlength) {
+							return { valid: false, message: `${fieldLabel}不能少于${field.minlength}个字符` }
+						}
+					}
+					// 数字范围校验
+					else if ((tag === 'el-input-number' || tag === 'el-slider')) {
+						const numValue = Number(value)
+						if (!isNaN(numValue)) {
+							if (field.min !== undefined && numValue < field.min) {
+								return { valid: false, message: `${fieldLabel}不能小于${field.min}` }
+							}
+							if (field.max !== undefined && numValue > field.max) {
+								return { valid: false, message: `${fieldLabel}不能大于${field.max}` }
+							}
+						}
+					}
+				}
+			}
+			return { valid: true }
+		},
+		async handleSubmit() {
+			// 表单验证
+			const validation = this.validateForm()
+			if (!validation.valid) {
+				uni.showToast({
+					icon: 'none',
+					title: validation.message
+				})
+				return
+			}
+			
+			try {
+				uni.showLoading({ title: '提交中...' })
+				// 处理表单数据:将数组类型字段转换为逗号分隔的字符串
+				const submitData = { ...this.formData }
+				this.formFields.forEach(field => {
+					const vModel = field.__vModel__
+					const value = submitData[vModel]
+					
+					// 文件上传字段:数组转逗号分隔字符串
+					if (field.__config__.tag === 'el-upload') {
+						if (Array.isArray(value) && value.length > 0) {
+							submitData[vModel] = value.join(',')
+						} else if (value) {
+							// 如果已经是字符串,保持不变
+							submitData[vModel] = value
+						} else {
+							// 如果没有文件,设置为空字符串
+							submitData[vModel] = ''
+						}
+					}
+					// 多选框组:数组转逗号分隔字符串
+					else if (field.__config__.tag === 'el-checkbox-group') {
+						if (Array.isArray(value) && value.length > 0) {
+							submitData[vModel] = value.join(',')
+						} else if (value) {
+							// 如果已经是字符串,保持不变
+							submitData[vModel] = value
+						} else {
+							// 如果没有选择,设置为空字符串
+							submitData[vModel] = ''
+						}
+					}
+				})
+				
+				// 获取用户信息
+				const userInfo = JSON.parse(uni.getStorageSync('userInfo') || '{}')
+				const userName = userInfo.doctorName|| ''
+				
+				// 获取详情数据中的信息
+				const companyId = this.caseDetail?.companyId
+				const taskId = this.caseDetail?.taskId
+				const periodNum = this.caseDetail?.periodNum
+				const tableName = this.caseDetail?.surveyQuestionnaireVersion.tableName || ''
+				const version = this.caseDetail?.surveyQuestionnaireVersion.versionNo || 0
+				// 添加公用字段
+				submitData.company_id = Number(companyId) || 0
+				submitData.table_name = tableName
+				submitData.user_id = userInfo.id || 0
+				submitData.user_name = userName
+				submitData.version_id = Number(version) || 0
+				submitData.periodNum = periodNum
+				submitData.taskId = taskId
+				const res = await submitQuestionnaire(submitData)
+				uni.hideLoading()
+				if (res.code === 200) {
+					uni.showToast({
+						icon: 'success',
+						title: '提交成功'
+					})
+					setTimeout(() => {
+						uni.navigateBack()
+					}, 1500)
+				} else {
+					uni.showToast({
+						icon: 'none',
+						title: res.msg || '提交失败'
+					})
+				}
+			} catch (e) {
+				uni.hideLoading()
+				uni.showToast({
+					icon: 'none',
+					title: '提交失败'
+				})
+			}
+		}
+	}
+}
+</script>
+
+<style lang="stylus">
+.text-placeholder {
+	color: #C8C9CC !important;
+}
+
+checkbox .wx-checkbox-input {
+	border-radius: 0 !important;
+}
+
+checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+	border-radius: 0 !important;
+}
+</style>
+
+<style lang="scss" scoped>
+.container {
+	min-height: 100vh;
+	display: flex;
+	flex-direction: column;
+	
+	.bg {
+		width: 100%;
+		position: absolute;
+		top: 0;
+		left: 0;
+	}
+}
+
+.status-bar {
+	width: 100%;
+	background: transparent;
+}
+
+.fixed-top-box {
+	width: 100%;
+	position: fixed;
+	top: 0;
+	left: 0;
+	z-index: 1000;
+	
+	.back-box {
+		height: 88upx;
+		padding: 0 24upx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		
+		image {
+			width: 40upx;
+			height: 40upx;
+		}
+		
+		.title {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 600;
+			font-size: 36rpx;
+			color: #333333;
+		}
+	}
+}
+
+.content {
+	margin-top: 168rpx;
+	flex: 1;
+	padding: 24rpx;
+	box-sizing: border-box;
+}
+
+.form-header {
+	margin-bottom: 32rpx;
+	
+	.form-title {
+		font-family: PingFang SC, PingFang SC;
+		font-weight: 600;
+		font-size: 40rpx;
+		color: #333333;
+		margin-bottom: 32rpx;
+		text-align: center;
+	}
+	
+	.form-tips {
+		.tip-item {
+			font-family: PingFang SC, PingFang SC;
+			font-weight: 400;
+			font-size: 28rpx;
+			color: #666666;
+			line-height: 44rpx;
+			text-align: center;
+		}
+	}
+}
+
+.form-section {
+	padding-bottom: 160rpx;
+}
+
+.form-item {
+	background: #fff;
+	padding: 24rpx 32rpx;
+	margin-bottom: 20rpx;
+	border-radius: 16rpx;
+	
+	&:last-child {
+		margin-bottom: 0;
+	}
+	
+	.form-label {
+		display: flex;
+		align-items: center;
+		font-size: 28rpx;
+		color: #333;
+		margin-bottom: 16rpx;
+		
+		.required {
+			color: #FF5030;
+			margin-right: 4rpx;
+		}
+	}
+	
+	.form-input {
+		width: 100%;
+		height: 72rpx;
+		padding: 0 24rpx;
+		border-radius: 12rpx;
+		border: 2rpx solid #F5F5F5;
+		font-size: 28rpx;
+		color: #333;
+		box-sizing: border-box;
+		
+		&.placeholder {
+			color: #C8C9CC;
+		}
+		
+		&.picker-input {
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+		}
+	}
+	
+	.slider-wrapper {
+		padding: 20rpx 0;
+	}
+	
+	.radio-group,
+	.checkbox-group {
+		display: flex;
+		flex-direction: column;
+		gap: 48rpx;
+		
+		.radio-item,
+		.checkbox-item {
+			display: flex;
+			align-items: center;
+			gap: 16rpx;
+			font-size: 28rpx;
+			color: #333;
+		}
+	}
+	
+	.form-textarea {
+		width: 100%;
+		min-height: 200rpx;
+		padding: 24rpx;
+		border-radius: 12rpx;
+		border: 2rpx solid #F5F5F5;
+		font-size: 28rpx;
+		color: #333;
+		box-sizing: border-box;
+		line-height: 1.6;
+	}
+	
+	.input-number-wrapper {
+		display: flex;
+		align-items: center;
+		gap: 16rpx;
+		
+		.input-number-btn {
+			width: 60rpx;
+			height: 60rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			border: 2rpx solid #F5F5F5;
+			border-radius: 8rpx;
+			font-size: 32rpx;
+			color: #333;
+			background: #fff;
+			
+			&.disabled {
+				opacity: 0.5;
+				color: #C8C9CC;
+			}
+		}
+		
+		.input-number-input {
+			flex: 1;
+		}
+	}
+	
+	.time-range-wrapper,
+	.date-range-wrapper {
+		display: flex;
+		align-items: center;
+		gap: 16rpx;
+		
+		.time-range-input,
+		.date-range-input {
+			flex: 1;
+		}
+		
+		.time-range-separator,
+		.date-range-separator {
+			font-size: 28rpx;
+			color: #666;
+		}
+	}
+	
+	.rate-wrapper {
+		display: flex;
+		align-items: center;
+		gap: 16rpx;
+		
+		.rate-star {
+			font-size: 48rpx;
+			color: #E0E0E0;
+			line-height: 1;
+			cursor: pointer;
+			
+			&.active {
+				color: #FFD700;
+			}
+		}
+		
+		.rate-text {
+			font-size: 28rpx;
+			color: #666;
+		}
+	}
+	
+	.upload-section {
+		display: flex;
+		gap: 16rpx;
+		flex-wrap: wrap;
+		padding: 10rpx;
+		width: 100%;
+		.upload-item {
+			flex: 0 0 calc((100% - 32rpx) / 3);
+			width: calc((100% - 32rpx) / 3);
+			// height: calc((100% - 32rpx) / 3);
+			min-height: 200rpx;
+			border-radius: 8rpx;
+			overflow: hidden;
+			position: relative;
+			box-sizing: border-box;
+			.uploaded-image {
+				width: 100%;
+				height: 100%;
+			}
+			
+			.uploaded-file {
+				width: 100%;
+				height: 100%;
+				background: #f5f5f5;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				padding: 16rpx;
+				box-sizing: border-box;
+				
+				.file-name {
+					font-size: 24rpx;
+					color: #666;
+					text-align: center;
+					word-break: break-all;
+				}
+			}
+			
+			.delete-btn {
+				position: absolute;
+				top: 0;
+				right:0;
+				width: 40rpx;
+				height: 40rpx;
+				background: rgba(0, 0, 0, 0.5);
+				border-radius: 50%;
+				display: flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 32rpx;
+				color: #fff;
+				line-height: 1;
+			}
+			
+			&.upload-placeholder {
+				background: #f5f5f5;
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				justify-content: center;
+				gap: 8rpx;
+				
+				.upload-text {
+					font-size: 24rpx;
+					color: #999;
+				}
+			}
+		}
+	}
+}
+
+.submit-btn {
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	height: 88rpx;
+	background: #388BFF;
+	border-radius: 200rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	color: #fff;
+	font-weight: 500;
+	z-index: 100;
+	margin: 40rpx 32rpx;
+}
+</style>

+ 54 - 4
pages_task/questionnaireForm.vue

@@ -21,13 +21,12 @@
 			
 			<!-- 动态表单内容 -->
 			<view class="form-section">
-				<view 
-					class="form-item" 
+				<view class="form-item" 
 					v-for="(field, index) in formFields" 
 					:key="getFieldKey(field, index)">
-					<view class="form-label">
+					<view class="form-label" v-if="showFieldLabel(field)">
 						<text class="required" v-if="field.__config__.required">*</text>
-						<text>{{ index + 1 }}、{{ field.__config__.label }}</text>
+						<text>{{ getDisplayIndex(index) }}、{{ field.__config__.label }}</text>
 					</view>
 					
 					<!-- 单行文本输入 -->
@@ -257,6 +256,13 @@
 							<text class="rate-text" v-if="field['show-score']">{{ formData[field.__vModel__] || 0 }}分</text>
 						</view>
 					</template>
+					
+					<!-- 文本描述 -->
+					<template v-else-if="field.__config__.tag === 'span'">
+					  <view :style="field.style">
+					    {{ getSpanText(field) }}
+					  </view>
+					</template>
 				</view>
 			</view>
 		</scroll-view>
@@ -300,6 +306,41 @@ export default {
 		}
 	},
 	methods: {
+		showFieldLabel(field) {
+			const config = (field && field.__config__) || {}
+			if (config.tag === 'span') {
+				return false;
+			}
+			return true
+		},
+		getDisplayIndex(index) {
+			if (!Array.isArray(this.formFields) || index < 0) {
+				return 0
+			}
+			let displayIndex = 0
+			for (let i = 0; i <= index; i++) {
+				const field = this.formFields[i]
+				if (this.showFieldLabel(field)) {
+					displayIndex++
+				}
+			}
+			return displayIndex
+		},
+		getSpanText(field) {
+			if (!field) return ''
+			if (field.__slot__ && typeof field.__slot__.default === 'string') {
+				return field.__slot__.default
+			}
+			return (field.__config__ && field.__config__.label) || ''
+		},
+		getSpanStyle(field) {
+			const style = (field && field.style) || {}
+			return {
+				fontSize: style.fontSize || '28rpx',
+				color: style.color || '#333333',
+				fontWeight: style.fontWeight || 'normal'
+			}
+		},
 		getFieldKey(field, index) {
 			// 在非 H5 平台,:key 不支持表达式,需要使用方法来生成 key
 			return field && field.__config__ && field.__config__.formId ? field.__config__.formId : `field_${index}`
@@ -939,6 +980,7 @@ export default {
 				
 				// 获取详情数据中的信息
 				const companyId = this.caseDetail?.companyId
+				const taskId = this.caseDetail?.taskId
 				const periodNum = this.caseDetail?.periodNum
 				const tableName = this.caseDetail?.surveyQuestionnaireVersion.tableName || ''
 				const version = this.caseDetail?.surveyQuestionnaireVersion.versionNo || 0
@@ -949,6 +991,7 @@ export default {
 				submitData.user_name = userName
 				submitData.version_id = Number(version) || 0
 				submitData.periodNum = periodNum
+				submitData.taskId = taskId
 				const res = await submitQuestionnaire(submitData)
 				uni.hideLoading()
 				if (res.code === 200) {
@@ -1149,6 +1192,13 @@ checkbox .wx-checkbox-input.wx-checkbox-input-checked {
 		line-height: 1.6;
 	}
 	
+	.form-span-text {
+		display: block;
+		width: 100%;
+		line-height: 1.6;
+		word-break: break-word;
+	}
+	
 	.input-number-wrapper {
 		display: flex;
 		align-items: center;

+ 1 - 1
pages_task/science.vue

@@ -297,7 +297,7 @@ export default {
 					applyEndTime: this.dateRange.endDate,
 					finishAuditStatus:this.currentTab,
 					taskType:this.selectedTaskType,
-					pageNum: 1,
+					pageNum: this.pageNum,
 					selectType:'kp',
 					timeType: "valid",
 					pageSize: this.pageSize

+ 1 - 1
pages_task/shortVideo.vue

@@ -297,7 +297,7 @@ export default {
 					applyEndTime: this.dateRange.endDate,
 					finishAuditStatus:this.currentTab,
 					taskType:3,
-					pageNum: 1,
+					pageNum: this.pageNum,
 					pageSize: this.pageSize
 				}
 				const res = await getAirClassroomList(params)

+ 0 - 1
pages_task/taskDetail.vue

@@ -136,7 +136,6 @@
 		<!-- 底部按钮 -->
 			<view class="submit-box" v-if="taskData.finishAuditStatus == 3||taskData.finishAuditStatus == 2">
 			<view class="submit-btn"  @click="goComplete">去完成</view>
-			
 		</view>
 	</view>
 </template>

+ 62 - 12
pages_user/privacyPolicy.vue

@@ -3,7 +3,7 @@
 		<scroll-view class="content" scroll-y>
 			<view class="agreement-body">
 				<view class="title">【文依学苑】隐私保护政策</view>
-				<view class="update-time">更新日期:2026年2月24日</view>
+				<view class="update-time">更新日期:2026年3月18日</view>
 
 				<view class="section">
 					<view class="section-text">更新提示:</view>
@@ -24,16 +24,15 @@
 					<view class="section-text">1、定义</view>
 					<view class="section-text">2、我们可能收集的信息</view>
 					<view class="section-text">3、我们如何收集和使用您的个人信息</view>
-					<view class="section-text">4、我们如何使用 Cookie 和同类技术</view>
-					<view class="section-text">5、信息存储</view>
-					<view class="section-text">6、我们如何委托处理、共享、转让、公开披露您的个人信息</view>
-					<view class="section-text">7、用户业务数据和公开信息</view>
-					<view class="section-text">8、我们如何保护您的个人信息</view>
-					<view class="section-text">9、您如何管理您的个人信息</view>
-					<view class="section-text">10、我们如何处理未成年人的个人信息</view>
-					<view class="section-text">11、您的个人信息如何在全球范围转移</view>
-					<view class="section-text">12、本声明和协议如何更新</view>
-					<view class="section-text">13、如何联系我们</view>
+					<view class="section-text">4、信息存储</view>
+					<view class="section-text">5、我们如何委托处理、共享、转让、公开披露您的个人信息</view>
+					<view class="section-text">6、用户业务数据和公开信息</view>
+					<view class="section-text">7、我们如何保护您的个人信息</view>
+					<view class="section-text">8、您如何管理您的个人信息</view>
+					<view class="section-text">9、我们如何处理未成年人的个人信息</view>
+					<view class="section-text">10、您的个人信息如何在全球范围转移</view>
+					<view class="section-text">11、本声明和协议如何更新</view>
+					<view class="section-text">12、如何联系我们</view>
 				</view>
 
 				<view class="section">
@@ -49,7 +48,7 @@
 					<view class="section-text">1.5 业务数据</view>
 					<view class="section-text">不同于个人信息,是指学苑的用户利用文依学苑的服务上传、下载、分发等通过文依学苑的技术服务处理的数据。</view>
 					<view class="section-text">1.6 服务平台</view>
-					<view class="section-text">指文依学苑开发、运营的互联网诊疗服务平台,包括域名为:qicaijiaxiang.com的网站和"文依学苑"微信小程序、"一咻学术"微信小程序等移动端应用及网站的合称。</view>
+					<view class="section-text">指文依学苑开发、运营的互联网诊疗服务平台,包括域名为:qicaijiaxiang.com的网站和"文依学苑"微信小程序、"文依学术"微信小程序等移动端应用及网站的合称。</view>
 					<view class="section-text">1.7 关联公司</view>
 					<view class="section-text">指一方现在或将来控制、受控制或与其处于共同控制下的任何公司、机构。"控制"是指直接或间接地拥有影响所提及公司管理的能力,无论是通过所有权、有投票权的股份、合同或其他被依法认定的方式。</view>
 				</view>
@@ -225,6 +224,57 @@
 					<view class="section-text">在以下情形中,按照法律法规要求,我们将无法响应您的请求:</view>
 					<view class="section-text">1、与个人信息控制者履行法律法规规定的义务相关的;</view>
 					<view class="section-text">2、与国家安全、国防安全有关的;</view>
+					<view class="section-text">3、与公共安全、公共卫生、重大公共利益有关的;</view>
+					<view class="section-text">4、与犯罪侦查、起诉、审判和执行判决等有关的;</view>
+					<view class="section-text">5、有充分证据表明个人信息主体存在主观恶意或滥用权利的;</view>
+					<view class="section-text">6、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</view>
+					<view class="section-text">7、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;</view>
+					<view class="section-text">8、涉及商业秘密的。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">九、我们如何处理未成年人的个人信息</view>
+					<view class="section-text">如果没有父母或监护人的同意,未成年人不得创建自己的用户账户。在电子商务活动中我们推定您具有相应的民事行为能力。如您为未成年人,建议您请您的父母或监护人仔细阅读本声明和协议,并在征得您的父母或监护人同意的前提下使用我们的互联网电子服务或商品或向我们提供信息。</view>
+					<view class="section-text">我们不会主动直接向未成年人收集其个人信息。对于经父母或监护人同意使用我们的互联网电子服务或商品而收集未成年人个人信息的情况,我们只会在法律法规允许、父母或监护人明确同意或者保护未成年人所必要的情况下使用、共享、转让或披露此信息。</view>
+					<view class="section-text">根据当地监管部门的相关规定,文依学苑仅对满足特定年龄要求的用户提供互联网电子服务或商品。如果有事实证明未成年人并未取得监护人同意的情况下注册使用了我们的产品和/或服务,我们会与相关监护人协商,并设法尽快删除相关个人信息。</view>
+					<view class="section-text">对于可能涉及的儿童个人信息,我们进一步采取以下措施予以保障:</view>
+					<view class="section-text">对于收集到的儿童个人信息,我们除遵守本隐私保护协议关于用户个人信息的约定外,还会秉持正当必要、知情同意、目的明确、安全保障、依法利用的原则,严格遵循《儿童个人信息网络保护规定》等法律法规的要求进行存储、使用、披露,且不会超过实现收集、使用目的所必须的期限,到期后我们会对儿童个人信息进行删除或匿名化处理。</view>
+					<view class="section-text">当您作为监护人为被监护的儿童选择使用我们提供的相关服务时,我们可能需要向您收集被监护的儿童个人信息,用于向您履行相关服务之必要。在具体服务中需要向您收集儿童个人信息的,我们会事先取得您的授权同意,并告知您收集的目的和用途。如果您不提供前述信息,您将无法享受我们提供的相关服务。此外,您在使用本平台过程中可能会主动向我们提供儿童个人信息,请您明确知悉并谨慎选择。您作为监护人应当正确履行监护职责,保护儿童个人信息安全。若儿童本人需要注册或使用我们的产品和/或服务,您应正确引导并予以监护。</view>
+					<view class="section-text">儿童或其监护人有权随时访问、复制、更正、删除儿童个人信息,还可以向我们提出访问、复制、更正、删除的请求。如您对儿童个人信息相关事宜有任何意见、建议或投诉、举报,请联系我们。我们会随时为您提供帮助。</view>
+					<view class="section-text">更多具体详细的未成年人信息处理规则详见《儿童个人信息处理规则》。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十、您的个人信息如何在全球范围转移</view>
+					<view class="section-text">我们在中华人民共和国境内运营中收集和产生的个人信息,存储在中国境内,以下情形除外:</view>
+					<view class="section-text">1、法律法规有明确规定;</view>
+					<view class="section-text">2、获得您的明确授权;</view>
+					<view class="section-text">3、您通过互联网进行海外互联网电子服务或商品等个人主动行为。</view>
+					<view class="section-text">针对以上情形,我们会通过合理必要的措施确保以不低于本协议规定的程度及我国法律法规规定的个人信息保护标准保护您的个人信息。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十一、本声明和协议如何更新</view>
+					<view class="section-text">我们的声明和协议可能变更,我们保留不时更新或修改本声明和协议的权利。</view>
+					<view class="section-text">未经您明确同意,我们不会削减您按照本声明和协议所应享有的权利。我们会在本页面上发布对本声明和协议所做的任何变更。</view>
+					<view class="section-text">对于重大变更,我们还会提供更为显著的通知(包括我们会通过网站公示的方式进行通知甚至向您提供弹窗提示)。</view>
+					<view class="section-text">本声明和协议所指的重大变更包括但不限于:</view>
+					<view class="section-text">1、我们的服务模式发生重大变化,如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;</view>
+					<view class="section-text">2、我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;</view>
+					<view class="section-text">3、个人信息共享、转让或公开披露的主要对象发生变化;</view>
+					<view class="section-text">4、您参与个人信息处理方面的权利及其行使方式发生重大变化;</view>
+					<view class="section-text">5、我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;</view>
+					<view class="section-text">6、个人信息安全影响评估报告表明存在高风险时。</view>
+					<view class="section-text">如果您不同意修改后的内容,您有权并应立即停止使用我们提供的服务。如果您继续使用我们提供的服务,则视为您接受我们对本声明和协议相关条款所做的修改。我们还会将本声明和协议的旧版本存档,供您查阅。</view>
+				</view>
+
+				<view class="section">
+					<view class="section-title">十二、如何联系我们</view>
+					<view class="section-text">以下情况,您可以通过在线客服与我们联系,一般情况下我们将在30个工作日内回复您的请求:</view>
+					<view class="section-text">1、如对本声明和协议内容有任何疑问、意见或建议;</view>
+					<view class="section-text">2、如发现个人信息可能被泄露。</view>
+					<view class="section-text">您可以通过"我的-联系客服"或客服电话(17716144271)与我们联系。</view>
+					<view class="section-text">如果您对我们的回复不满意,特别是您认为我们的个人信息处理行为损害了您的合法权益,您还可以通过向文依学苑运营总部成都市温江区海天腾逸广场有管辖权的法院提起诉讼来寻求解决方案。</view>
 				</view>
 
 				<view class="footer">感谢您对文依学苑平台的信任与支持。</view>

+ 13 - 26
pages_user/userAgreement.vue

@@ -3,10 +3,10 @@
 		<scroll-view class="content" scroll-y>
 			<view class="agreement-body">
 				<view class="title">【文依学苑】医生注册协议</view>
-				<view class="update-time">更新日期:2026年2月26日</view>
+				<view class="update-time">更新日期:2026年3月18日</view>
 
-				<view class="intro">
-					您在开始使用文依学苑服务前,请您务必仔细阅读并充分理解本《文依学苑用户使用协议》。同时,您还应仔细阅读并充分理解文依学苑的隐私政策、知识产权申请等系列政策和声明。在本服务条款中,请您务必特别注意及重点阅读与您的权利及义务密切相关的条款,此类条款可能以粗体加黑的方式标记,包括但不限于免责条款等。
+				<view class="section">
+					<view class="section-text">您在开始使用文依学苑服务前,请您务必仔细阅读并充分理解本《文依学苑用户使用协议》。同时,您还应仔细阅读并充分理解文依学苑的隐私政策、知识产权申请等系列政策和声明。在本服务条款中,请您务必特别注意及重点阅读与您的权利及义务密切相关的条款,此类条款可能以粗体加黑的方式标记,包括但不限于免责条款等。</view>
 				</view>
 
 				<view class="section">
@@ -36,21 +36,21 @@
 					<view class="section-text">用户个人信息。用户个人信息包括但不限于下列信息:用户真实姓名、头像、身份证号、职业、职务、手机电话、银行账号、第三方支付账号、电子邮件、教育经历、从业经历等。</view>
 					<view class="section-text">非用户个人信息。用户在文依学苑上,包括提问、发布、回答、浏览、操作状态、使用记录、使用习惯等在内的全部记录信息。除 1 款所列用户个人信息范围外的其他所有信息,均视为非用户个人信息。</view>
 					<view class="section-text">第三方平台记录信息。使用第三方账号注册、登录、使用文依学苑服务的,将被视为用户完全理解、同意并接受文依学苑包括但不限于收集、统计、分析等方式使用其在第三方平台填写、登记、公布、记录的全部信息。用户一旦使用第三方平台账号注册、登陆、使用文依学苑服务,文依学苑对该第三方记录信息的任何使用,均被视为已经获得了用户本人的完全同意并接受。</view>
-					<view class="section-text">2. 用户使用文依学苑前,需要拥有一个成功注册的账户,用户可以使用真实有效的个人手机号码或邮箱地址作为用户名进行账户注册,亦可授权第三方账号(如一咻医生、一咻健康、微信、支付宝等)快捷登录,且在第三方账户快捷登录中可能涉及用户绑定已有账户或注册新账户的操作。用户注册成功后,文依学苑将给予每个用户一个用户帐号及相应的密码,账户名称和密码将作为文依学苑识别用户身份的唯一有效标识,只要使用了正确的帐号和密码无论是谁登录均视为您本人登录或已得到您本人的授权,用户应当对以其用户帐号进行的所有活动和事件负法律责任,请用户务必妥善保管该用户帐号和密码。用户不得将账号转借、租让、售卖给他人使用,否则应承担由此可能产生的全部责任,并与实际使用人承担连带责任。文依学苑无法对非法或未经您授权使用您的账号及密码的行为做出甄别,因此文依学苑不承担任何责任。当密码或者账号遭到未获授权使用,或者发生任何安全问题时,用户有责任及时有效地通知文依学苑并向当地公安机关报案。</view>
+					<view class="section-text">2. 用户使用文依学苑前,需要拥有一个成功注册的账户,用户可以使用真实有效的个人手机号码或邮箱地址作为用户名进行账户注册,亦可授权第三方账号(如文依医生、文依健康、微信、支付宝等)快捷登录,且在第三方账户快捷登录中可能涉及用户绑定已有账户或注册新账户的操作。用户注册成功后,文依学苑将给予每个用户一个用户帐号及相应的密码,账户名称和密码将作为文依学苑识别用户身份的唯一有效标识,只要使用了正确的帐号和密码无论是谁登录均视为您本人登录或已得到您本人的授权,用户应当对以其用户帐号进行的所有活动和事件负法律责任,请用户务必妥善保管该用户帐号和密码。用户不得将账号转借、租让、售卖给他人使用,否则应承担由此可能产生的全部责任,并与实际使用人承担连带责任。文依学苑无法对非法或未经您授权使用您的账号及密码的行为做出甄别,因此文依学苑不承担任何责任。当密码或者账号遭到未获授权使用,或者发生任何安全问题时,用户有责任及时有效地通知文依学苑并向当地公安机关报案。</view>
 					<view class="section-text">3. 用户应本着诚实守信的原则,自行向文依学苑提供所需信息。信息发布者可提供个人信息、行医资格(如需)、就医经历(如需)、教育经历(如需)、工作经历(如需)以及相关的其他信息;用户需保证所提供的信息必须在合法基础上保证真实、准确、完整,并保证及时更新以上信息。如因用户自行提供的信息存在非法、抄袭、错误、侵犯他人隐私等问题,用户需承担因此引发的相应的法律责任及后果,且文依学苑保留暂停、清除各类不符合法律政策或不真实的信息内容而无须通知您的权利及终止用户使用文依学苑各项服务的权利,且文依学苑可以保留向被侵权的第三方披露此类用户的个人信息之相关权利。若您未遵守国家法律法规及本协议规定,文依学苑有权作出独立判断并采取暂停或关闭您的帐号等措施。</view>
 					<view class="section-text">4. 用户须对在文依学苑的注册信息的真实性、合法性、有效性承担全部责任,用户不得冒充他人;不得利用他人的名义发布任何信息;不得恶意使用注册帐号导致其他用户误认;否则文依学苑有权立即停止提供服务,收回其帐号并由用户独自承担由此而产生的一切法律责任。</view>
 					<view class="section-text">5. 用户直接或通过各类方式(如 RSS 源和站外 AdivI引用等)间接使用文依学苑服务和数据的行为,都将被视作已无条件接受本协议全部内容;若用户对本协议的任何条款存在异议,请停止使用文依学苑所提供的全部服务。</view>
 					<view class="section-text">6. 文依学苑是一个医疗健康相关信息提供、分享、传播及获取的平台,用户通过文依学苑发表的信息为公开的信息,其他第三方均可以通过文依学苑获取用户发表的信息,用户对任何信息的发表即认可该信息为公开的信息,并单独对此行为承担法律责任;任何用户不愿被其他第三人获知的信息都不应该在文依学苑上进行发表。</view>
 					<view class="section-text">7. 用户承诺不得以任何方式利用文依学苑直接或间接从事违反中国法律以及社会公德的行为,文依学苑有权对违反上述承诺的内容予以删除。用户不得利用文依学苑服务制作、上载、复制、发布、传播或者转载如下内容:</view>
-					<view class="section-text list">• 反对宪法所确定的基本原则的;</view>
-					<view class="section-text list">• 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;</view>
-					<view class="section-text list">• 损害国家荣誉和利益的;煽动民族仇恨、民族歧视,破坏民族团结的;</view>
-					<view class="section-text list">• 侮辱、滥用英烈形象,否定英烈事迹,美化粉饰侵略战争行为的;</view>
-					<view class="section-text list">• 破坏国家宗教政策,宣扬邪教和封建迷信的;</view>
-					<view class="section-text list">• 散布谣言,扰乱社会秩序,破坏社会稳定的;</view>
-					<view class="section-text list">• 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;</view>
-					<view class="section-text list">• 侮辱或者诽谤他人,侵害他人合法权益的;</view>
-					<view class="section-text list">• 含有法律、行政法规禁止的其他内容的信息。</view>
+					<view class="section-text">• 反对宪法所确定的基本原则的;</view>
+					<view class="section-text">• 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;</view>
+					<view class="section-text">• 损害国家荣誉和利益的;煽动民族仇恨、民族歧视,破坏民族团结的;</view>
+					<view class="section-text">• 侮辱、滥用英烈形象,否定英烈事迹,美化粉饰侵略战争行为的;</view>
+					<view class="section-text">• 破坏国家宗教政策,宣扬邪教和封建迷信的;</view>
+					<view class="section-text">• 散布谣言,扰乱社会秩序,破坏社会稳定的;</view>
+					<view class="section-text">• 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;</view>
+					<view class="section-text">• 侮辱或者诽谤他人,侵害他人合法权益的;</view>
+					<view class="section-text">• 含有法律、行政法规禁止的其他内容的信息。</view>
 					<view class="section-text">8. 文依学苑有权对用户使用文依学苑的情况进行审查和监督,如用户在使用文依学苑时违反任何上述规定,文依学苑或其授权的人有权要求用户改正或直接采取一切必要的措施(包括但不限于更改或删除用户张贴的内容、暂停或终止用户使用文依学苑的权利)以减轻用户不当行为造成的影响。</view>
 					<view class="section-text">9. 文依学苑保留从任何服务中筛选、审阅、标明、过滤、修订、拒绝或删除任何或所有内容的权利(但无义务这样做)。就某些服务而言,文依学苑可提供滤除明确色情内容、政治相关内容的工具。此外,还有可以通过商业渠道获得的服务和软件能够限制访问令您反感的材料。</view>
 					<view class="section-text">10. 我们非常注重未成年人的保护:</view>
@@ -187,7 +187,6 @@
 				<view class="section">
 					<view class="section-title">十二、如何联系我们</view>
 					<view class="section-text">如对本协议内容有任何疑问、意见或建议您可以通过在线客服与我们联系,一般情况下我们将在30个工作日内回复您的请求。</view>
-					<view class="section-text" style="text-align: right;">成都文依合创科技有限公司</view>
 				</view>
 
 				<view class="footer">感谢您使用文依学苑平台。</view>
@@ -237,14 +236,6 @@ export default {
 	margin-bottom: 40rpx;
 }
 
-.intro {
-	font-size: 28rpx;
-	color: #666;
-	line-height: 1.75;
-	margin-bottom: 36rpx;
-	text-align: justify;
-}
-
 .section {
 	margin-bottom: 36rpx;
 
@@ -266,10 +257,6 @@ export default {
 		&:last-child {
 			margin-bottom: 0;
 		}
-
-		&.list {
-			padding-left: 16rpx;
-		}
 	}
 }
 

+ 333 - 0
pages_user/zz.vue

@@ -0,0 +1,333 @@
+<template>
+	<view class="container">
+		<scroll-view class="content" scroll-y>
+			<view class="agreement-body">
+				<view class="section">
+					更新提示:
+					尊敬的文依学苑用户:根据最新的法律法规及政策要求,结合实际情况,我们对《用户隐私保护协议》进行了部分更新。此版本的更新内容主要集中在:
+					1、更新了"十、我们如何处理未成年人的个人信息"部分内容;
+					提示条款
+					您的信任对我们非常重要,我们深知隐私和个人信息安全的重要性,我们将按照法律法规要求,采取相应的安全保护措施,以保护您的个人信息安全。鉴此,文依学苑(以下简称"我们"或"学苑")制定本《用户隐私保护协议》(以下简称"本协议")并承诺严格遵循本协议的内容合理处理您的个人信息及其他数据。我们在此提醒您:
+					本协议适用于文依学苑的所有互联网电子服务或商品。如我们及/或关联公司的互联网电子服务或商品中使用了文依学苑提供的互联网电子服务或商品(例如直接使用文依学苑APP、小程序账户登录)但未设独立隐私保护协议的,则本协议同样适用于该部分互联网电子服务或商品。我们及/或关联公司就其向您提供电子服务或商品单独设立隐私保护协议的,则相应产品或服务适用该相应的隐私保护协议。
+					请您注意,本协议和声明不适用于以下情况:
+					1、通过我们的互联网电子服务或商品而接入的第三方服务(包括任何第三方网站)收集的信息;
+					2、通过在我们互联网电子服务或商品中进行广告服务的其他公司或机构所收集的信息。
+					我们不参与且不对您与第三方之间因个人信息保护等发生的纠纷承担任何责任。
+					在使用我们的各项互联网电子服务或商品前,请您务必仔细阅读并透彻理解本协议,特别是以粗体标识的条款,您应重点阅读,在确认充分理解并同意后方使用相关互联网电子服务或商品。一旦您开始使用本平台服务,将被视为对本协议内容的接受和认可。
+					
+					如对本声明和协议内容有任何疑问、意见或建议,您可通过客服与我们联系。
+					隐私权协议
+					学苑深知个人信息对您的重要性,并会尽全力保护您的个人信息安全。我们致力于维持您对我们的信任,我们承诺将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。在使用我们的互联网电子服务或商品前,请您仔细阅读并了解本协议,我们将按照本协议收集、处理及披露您的信息。
+					本协议和声明将帮助您了解以下内容:
+					1、定义
+					2、我们可能收集的信息
+					3、我们如何收集和使用您的个人信息
+					4、信息存储
+					5、我们如何委托处理、共享、转让、公开披露您的个人信息
+					6、用户业务数据和公开信息
+					7、我们如何保护您的个人信息
+					8、您如何管理您的个人信息
+					9、我们如何处理未成年人的个人信息
+					10、您的个人信息如何在全球范围转移
+					11、本声明和协议如何更新
+					12、如何联系我们
+					一、定义
+					1.1 个人信息
+					指以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息, 不包括匿名化处理后的信息。
+					1.2 敏感个人信息
+					指一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息,包括生物识别信息、宗教信仰、特定身份、医疗健康、金融账户、行踪轨迹等信息,以及儿童的个人信息。
+					1.3 个人信息删除
+					指在实现日常业务功能所涉及的系统中去除个人信息的行为,使其保持不可被检索、访问的状态。
+					1.4 儿童
+					指不满十四周岁的未成年人。
+					1.5 业务数据
+					不同于个人信息,是指学苑的用户利用文依学苑的服务上传、下载、分发等通过文依学苑的技术服务处理的数据。
+					1.6 服务平台
+					指文依学苑开发、运营的互联网诊疗服务平台,包括域名为:qicaijiaxiang.com的网站和"文依学苑"微信小程序、"文依学术"微信小程序等移动端应用及网站的合称。
+					1.7 关联公司
+					指一方现在或将来控制、受控制或与其处于共同控制下的任何公司、机构。"控制"是指直接或间接地拥有影响所提及公司管理的能力,无论是通过所有权、有投票权的股份、合同或其他被依法认定的方式。
+					二、我们可能收集的信息
+					我们提供产品或服务时,可能会收集、储存和使用下列与您有关的个人信息:
+					2.1 为实现向您提供产品/服务的基本功能,您需授权我们收集、使用的必要个人信息。如您拒绝提供相应信息,您将无法正常使用我们的产品/服务。
+					2.2 为实现向您提供产品/服务的附加功能,您可选择是否授权我们收集、使用的个人信息。如您拒绝提供,您将无法正常使用相关附加功能或无法达到我们拟达到的功能效果。
+					您理解并同意:因我们向您提供的产品和服务种类众多,且不同用户选择使用的具体产品/服务范围存在差异,相应的,基本/附加功能及收集使用的个人信息类型、范围等会有所区别,请以具体的产品/服务功能为准。同时,为给您带来更好的产品和服务体验,我们在持续努力改进我们的技术,随之我们可能会不时推出新的或优化后的功能,可能需要收集、使用新的个人信息或变更个人信息使用目的或方式。对此,我们将通过更新本协议、弹窗、页面提示等方式另行向您说明对应信息的收集目的、范围及使用方式,并为您提供自主选择同意的方式,且在征得您明示同意后收集、使用。在此过程中,如果您有任何疑问、意见或建议的,您可通过服务平台提供的各种联系方式与我们联系,我们会尽快为您作出解答。
+					三、我们如何收集和使用您的个人信息
+					我们会出于协议所述的以下目的,收集、储存和使用您的个人信息:
+					3.1 帮助您成为我们的用户
+					文依学苑平台的知识内容属于平台付费所得,在您查阅时,需要注册成为平台用户,以便我们根据您的行为习惯提供服务。在您注册时,请您至少提供手机号码、密码,我们将通过发送短信验证码的方式验证您的身份是否有效。若仅需使用浏览、搜索等基本服务,您不需要注册成为我们的用户及提供上述信息。
+					您的登录名包括但不仅限于您的手机号、邮箱账号、用户名,您可以完善昵称、密码、头像、联系地址、出生日期等相关信息,补充这些"账户信息"将有助于我们为您提供更具个性化的服务。
+					您需要向我们提供真实姓名和有效身份证件(包括但不限于身份证、医保卡、护照)的号码和复印件、生物识别特征(静态或动态的面部特征)、银行卡号及预留手机号,以便于我们进行实名(实人)认证。如果您不提供这些信息,可能会影响您对文依学苑部分核心业务功能的正常使用,如预约挂号、慢病复诊、购药等,但不会影响您进行基本的浏览、搜索。
+					在您主动注销账号时,我们将根据相关法律法规的要求尽快使其匿名或删除您的个人信息。
+					授权登录:您注册我们的账户后,我们可能经您同意后向我们的关联公司共享您的账户信息(头像、昵称及其他页面提示的信息),您可通过同一账号在我们提供的链接入口使用我们关联公司提供的服务或产品。此外,我们可能从第三方获取您授权共享的第三方账户信息(如头像、昵称、联系方式等),并将您的第三方账户与您的文依学苑账户绑定,使您可以通过第三方账户直接登录并使用文依学苑的服务或产品。我们将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。
+					3.2 为您展示和推送医疗相关信息和服务
+					为向您提供更契合您需求的页面展示和搜索结果、了解产品适配性,我们会收集关于您使用的服务以及使用方式的信息并将这些信息进行关联,这些信息包括:
+					设备信息:我们会根据您在软件安装及使用中授予的具体权限,接收并记录您所使用的设备相关信息(包括设备型号、操作系统版本、设备设置、Android id、MAC地址、IMEI、IMSI、唯一设备标识符、浏览器等软硬件特征信息)、设备所在位置相关信息(包括IP 地址、GPS位置以及能够提供相关信息的Wi-Fi 接入点、蓝牙和基站这类传感器信息)。
+					日志信息:当您使用我们的网站或客户端等提供的服务或产品时,我们会自动收集您对服务的详细使用情况,作为有关网络日志保存,包括您的搜索查询内容、IP地址、浏览器的类型、电信运营商、使用的语言、访问日期和时间及您访问的网页记录。除此之外,我们还会收集您的浏览记录,浏览记录包括您浏览的医院信息、科室信息、医生信息、药品信息、问答、评论、文章。
+					请注意,单独的设备信息、日志信息是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。
+					为改善我们的产品或服务、向您提供更符合您个性化需求的信息展示、搜索及推送服务,我们会根据您的浏览及搜索记录、设备信息、位置信息、历史问诊、个人生理健康信息、关注医生、加入的圈子等,提取您的浏览、搜索偏好、行为习惯、位置信息等特征,基于特征标签进行间接人群画像并展示、推送信息。
+					同时,我们通过以下措施努力保障您的隐私体验:
+					1、如果您要删除您的浏览和搜索记录,您可以在"搜索框"中点击清除图标、或"清空历史";
+					2、如您不想接受我们给您发送的商业广告,您可通过联系客服退订或我们提供的其他方式进行退订或关闭;
+					3、如您想管理我们给您发送的定向推送和个性化广告功能,您可以在"设置-隐私设置"中进行调整。需注意的是,您可设置我们不适用某些类别信息向您展示相关定性推送和广告,但是您仍然会看到推送信息和广告,您看到的推送信息和广告数量不会变化,只不过推送信息和广告的相关性会下降。
+					3.3 向您提供互联网电子服务或商品
+					3.3.1 您向我们提供的信息
+					为便于您使用互联网电子服务或商品,您需提供真实姓名、手机号、社保卡、就诊卡等信息。您可以为其他人进行预约或咨询等服务,您需要提供该实际用户的前述个人信息。在提供该实际用户的前述个人信息之前,您需确保您已经取得其授权同意,其中涉及儿童个人信息的,您需在提供前征得该儿童监护人的同意。
+					当您在产品及/或服务中订购相应的医疗服务和商品时,我们可能会收集您的交易信息、记录,包括您所购买的商品及/或服务信息、具体订单号、订单创建时间、您应支付的金额,我们收集这些信息是为了帮助您顺利完成交易、保障您的交易安全、查询订单信息。其中,如您购买商品的,在下单过程中,您需至少提供您的收货人姓名、收货地址、收货人联系电话;您可以为其他人订购商品及/或服务,但需提供该实际收货人的前述个人信息,且需确保您已经取得其授权同意。您知晓并同意第三方物流配送主体不可避免地获知及使用您的上述信息,用于完成交付目的。为使我们及时获悉并确认交付进度及状态,向您提供售后与争议解决服务,您同意我们可自物流相关服务主体处收集与交付进度相关的信息。如果您拒绝提供此类信息,您理解并同意我们将无法完成相关交付及售后服务。
+					当您使用本产品或服务提供的问诊功能,在问诊过程中,我们可能会申请开启您的位置信息(地理位置)、相机/摄像头、麦克风(语音)以及存储的相关权限,您可随时通过您设备的相关功能设置开启/取消上述权限;同时可能要求您提供患者姓名、性别、身份证号码、手机号码、出生日期、所在城市、与患者的关系、病情病症、住院志、医嘱单、问诊记录、检验报告、手术及麻醉记录、护理记录、用药记录、药物食物过敏信息、生育信息、以往病史、诊治情况、家族病史、现病史、传染病史等,以及与个人身体健康状况产生的相关信息,及体重、身高、肺活量等。如您不提供上述信息,将会影响您使用部分互联网电子服务或商品,但不影响您使用文依学苑产品或服务的基本浏览、搜索功能。另外,我们可能会收集您在使用服务或产品过程中产生的健康咨询详情(如图片、文字、视频、语音)、预约挂号记录、检查检验、用药处方、医生诊断结果等信息,用于向您展示及便于您对信息进行管理。
+					为帮助您顺利完成交易、保证您的交易安全、完成付款相应医疗服务和/或商品费用的支付,您可能需要提供银行卡号、身份证号码、银行卡的预留手机号和/或其他认证信息、创建账户与支付口令、医保卡号、医保卡绑定的手机号码以及医保支付口令,同时,为满足相关法律法规或监管机构的要求,我们可能需要将您必要的个人信息及上述支付信息提供给监管机构以及监管机构指定的第三方服务机构,以顺利完成您所订购相应医疗服务和药品费用的支付和结算。如您不提供上述信息,将无法正常使用相关的支付功能,但不会影响您使用文依学苑提供的基本浏览、搜索功能。
+					当您与我们联系时,我们可能会保存您的沟通、通信/通话记录和内容或您留下的联系方式等信息,以便与您联系或帮助您解决问题,或记录相关问题的处理方案及结果。为了提供服务及改进服务质量的合理需要,我们还可能使用的您的其他信息,包括您与客服联系时您提供的相关信息,您参与问卷调查时向我们发送的问卷答复信息。如果您针对具体订单进行咨询、投诉或提供建议的,我们会使用您的账户信息和订单信息。如您拒绝提供上述信息,我们可能无法向您及时反馈投诉、申诉或咨询结果。
+					您可通过我们为您提供的评价、问答、论坛等信息发布功能公开发布信息,包括作为注册用户可发表评价及问答内容、发布图文信息。请注意,您公开发布的信息中可能会涉及您或他人的个人信息甚至敏感个人信息,如您在评价时选择上传包含个人信息的图片。请您更加谨慎地考虑,是否在使用服务时共享甚至公开分享相关信息。若您公开发布的信息中涉及儿童个人信息的,您需在发布前征得对应儿童监护人的同意。
+					3.3.2 我们通过间接获得方式收集到的您的个人信息
+					我们可能从第三方获取您授权共享的账户信息(头像、昵称、联系方式),并在您同意本声明和协议后将您的第三方账户与您的账户绑定,使您可以通过第三方账户直接登录并使用我们的互联网电子服务或商品。我们会将依据与第三方的约定、对个人信息来源的合法性进行确认后,在符合相关法律和法规规定的前提下,使用您的这些个人信息。
+					您可通过同一账号在我们提供的链接入口使用我们关联公司提供的互联网电子服务或商品,为便于我们基于关联账号共同向您提供一站式服务并便于您统一进行管理,我们在文依学苑平台集中展示您的信息或推荐您感兴趣的信息。
+					当您通过我们互联网电子服务或商品使用上述服务时,您授权我们根据实际业务及合作需要从我们关联公司处接收、汇总、分析我们确认其来源合法或您授权同意其向我们提供的您的个人信息或交易信息。
+					如您拒绝提供上述信息或拒绝授权,可能无法使用我们关联公司的相应互联网电子服务或商品,或者无法展示相关信息,但不影响使用文依学苑的健康咨询等核心服务。
+					3.4 为您提供安全保障
+					请注意,为确保账户身份真实性、向您提供更好的安全保障,您可以向我们提供身份证、社保卡等身份信息,绑定银行卡等完成实名认证。如您拒绝提供上述信息,可能无法使用特定的互联网电子服务或商品、继续可能存在风险的操作等,但不会影响您使用浏览、搜索等服务。
+					为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或文依学苑相关协议规则的情况,我们可能使用或整合您的账户信息、交易信息、设备信息(包括设备型号、操作系统版本、设备设置、Android id、MAC地址、IMEI、IMSI、唯一设备标识符、已安装应用软件列表、最近运行的应用这类软硬件特征信息)、设备所在位置相关信息(包括IP地址、GPS位置以及能够提供相关信息的Wi-Fi接入点、蓝牙和基站这类传感器信息)、有关网络日志以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。
+					3.5 其他用途
+					我们将信息用于本声明和协议未载明的其他用途,或者将基于特定目的收集而来的信息用于其他目的时,会事先征求您的同意。若您提供的信息中含有其他用户的个人信息,在向我们提供这些个人信息之前,您需确保您已经取得合法的授权。若其中涉及儿童个人信息的,您需在发布前取得对应儿童监护人的同意,前述情形下监护人有权通过本协议规定的途径联系我们,要求更正或删除涉及儿童个人信息的内容。
+					3.6 征得授权同意的例外
+					根据相关法律法规规定,以下情形中收集您的个人信息无需征得您的授权同意:
+					1、与国家安全、国防安全有关的;
+					2、与公共安全、公共卫生、重大公共利益有关的;
+					3、与犯罪侦查、起诉、审判和判决执行等有关的;
+					4、出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;
+					5、所收集的个人信息是您自行向社会公众公开的;
+					6、从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道;
+					7、根据您的要求签订合同所必需的;
+					8、用于维护所提供的产品或服务的安全稳定运行所必需的,例如发现、处置产品或服务的故障;
+					9、为合法的新闻报道所必需的;
+					10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;
+					11、法律法规规定的其他情形。
+					请知悉,根据适用的法律,若我们对个人信息采取技术措施和其他必要措施进行处理,使得数据接收方无法重新识别特定个人且不能复原,或我们可能会对收集的信息进行去标识化地研究、统计分析和预测,用于改善平台的内容和布局,为商业决策提供产品或服务支撑,以及改进产品和服务(包括使用匿名数据进行机器学习或模型算法训练),则此类处理后数据的使用无需另行向您通知并征得您的同意。
+					如我们停止运营文依学苑平台,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以逐一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。
+					3.7 设备权限调用
+					为向您提供便捷、优质的服务,我们可能会调用您设备的一些权限,以下是我们可能调用的设备权限列表及对应的使用目的说明,您有权随时选择关闭下列权限的授权,但可能会影响您正常使用我们互联网电子服务或商品的部分或全部功能。
+					
+					点击图片可查看完整电子表格
+					
+					四、信息存储
+					4.1 存储地点
+					您知晓并同意,您在使用文依学苑产品、服务期间所产生的有关您的信息存储在中国境内安全可信的服务器上。
+					4.2 存储期限
+					我们仅在实现本协议所述目的所必需的时间内保留您的个人信息。在您与我们之间的合同关系(客户关系)存续期间,我们会处理并保存您的数据。当您注销文依学苑账户后,我们将对您的帐号信息进行删除或匿名化处理,但法律法规另有规定(例如《中华人民共和国电子商务法》要求商品和服务信息、交易信息保存时间自交易完成之日起不少于三年,《处方管理办法》要求普通处方保存期限为一年,《医疗机构管理条例实施细则》要求医疗机构门诊病历的保存期不得少于十五年等)或者您另行授权同意的除外。
+					五、我们如何委托处理、共享、转让、公开披露您的个人信息
+					5.1 委托处理
+					涉及具体的模块或功能由外部供应商提供的,对我们委托处理个人信息的该等外部供应商,我们会与其签署严格的保密协定,要求他们按照我们的要求、本协议以及其他任何相关的保密和安全措施来处理个人信息。
+					5.2 共享
+					我们不会与文依学苑服务提供者以外的任何公司、组织和个人分享您的个人信息,但以下情况除外:
+					1、在获取您的明确授权或同意的情况下共享:获得您的明确授权或同意后,我们会与其他方共享您的个人信息。
+					2、在法定情形下的共享:我们可能会根据法律法规规定,或按政府主管部门的强制性要求,对外共享您的个人信息。
+					3、与关联公司间共享:为便于我们基于关联账号共同向您提供服务,推荐您可能感兴趣的信息或保护文依学苑关联公司或其他用户或公众的人身财产安全免遭侵害,您的个人信息可能会与我们的关联公司共享。我们只会共享必要的个人信息(如为便于您通过同一账号使用我们关联公司产品或服务,我们会向关联公司共享您必要的账户信息),且这种共享受本协议所声明目的的约束。如果我们共享您的敏感个人信息或关联公司改变个人信息的使用及处理目的,将再次征求您的授权同意。
+					4、与授权合作伙伴共享:仅为实现本声明和协议中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与合作伙伴共享您的某些个人信息,以提供更好的客户服务和用户体验。例如,在您订购我们的商品时,我们必须与配送服务提供商共享您的订单信息才能安排送货;或者我们需要将您的订单号和订单金额与金融机构共享以实现其确认您的支付指令并完成支付等。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。同时,我们会与合作伙伴签署严格的保密协定,要求他们按照我们的说明、本协议以及其他任何相关的保密和安全措施来处理您的个人信息。我们的合作伙伴无权将共享的个人信息用于任何其他用途。如果您拒绝我们的合作伙伴在提供服务时收集为提供服务所必须的个人信息, 将可能导致您无法使用该第三方服务。
+					鉴于医疗的特殊性,出于患教以及帮助其他患者的目的,您与医生的交流信息将在匿名化和/或去标识化处理后,默认展示给第三方阅读。通过由我们或第三方提供的功能,您可以主动公开分享、共享信息(如向其他互联网平台转发内容),在这种情况下共享信息将被广泛并即时传送。但只要您不删除被共享的信息,该信息会一直留存在公众领域;在一些情况下,即使您删除共享信息,该等信息仍可由其他用户或与我们没有关联及不受我们控制的第三方独立地缓存、复制或储存,或通过其他用户或该等第三方在公众领域保存。例如,当您将您本平台提出的问题转发到其他互联网平台,该平台将可能独立的展示、缓存或保存您转发的内容,其他互联网用户也可能转发、保存您的回答,而相应的页面将不受我们的控制。
+					5.3 转让
+					我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:
+					1、在获取您的明确授权或同意的情况下转让:获得您的明确授权或同意后,我们会向其他方转让您的个人信息;
+					2、在文依学苑服务提供者发生合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会在要求新的持有您个人信息的公司、组织继续受声明和协议的约束,否则我们将要求该公司、组织重新向您征求授权同意。
+					5.4 公开披露
+					我们仅会在以下情况下,公开披露您的个人信息:
+					1、获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息;
+					2、基于法律、法律程序、诉讼或政府主管部门强制性要求的情况下,我们可能会向有权机关披露您的个人信息。 但我们保证,在上述情况发生时,我们会要求披露请求方必须出具与之相应的有效法律文件,并对被披露的信息采取符合法律和业界标准的安全防护措施。
+					3、如果我们确定您出现违反法律法规或严重违反文依学苑相关协议规则的情况,或为保护文依学苑及其关联公司用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或文依学苑相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及文依学苑已对您采取的措施。例如,若您囤积号源、虚假预约而严重违反用户协议,我们可能会公开披露或与合作方共享您的身份信息、联系方式与处罚情况。
+					5.5 共享、转让、公开披露个人信息时事先征得授权同意的例外
+					以下情形中,共享、转让、公开披露您的个人信息无需事先征得您的授权同意:
+					1、与个人信息控制者履行法律法规规定的义务相关的;
+					2、与国家安全、国防安全有关的;
+					3、与公共安全、公共卫生、重大公共利益有关的;
+					4、与犯罪侦查、起诉、审判和判决执行等有关的;
+					5、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
+					6、您自行向社会公众公开的个人信息;
+					7、从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道;
+					8、法律法规规定的其他情形。
+					根据法律规定,共享、转让经去标识化处理的个人信息,且确保数据接收方无法复原并重新识别个人信息主体的,不属于个人信息的对外共享、转让及公开披露行为,对此类数据的保存及处理将无需另行向您通知并征得您的同意。
+					六、用户业务数据和公开信息
+					不同于您的个人信息,对于用户业务数据和公开信息,文依学苑将按如下方式处理:
+					6.1 用户业务数据
+					1、您通过文依学苑平台提供的互联网电子服务或商品,加工、存储、上传、下载、分发以及通过其他方式处理的数据,均为您的用户业务数据,您完全拥有您的用户业务数据。文依学苑作为服务提供商,我们只会严格执行您的指示处理您的业务数据,除按与您协商一致或执行明确的法律法规要求外,不对您的业务数据进行任何非授权的使用或披露。
+					2、您应对您的用户业务数据来源及内容负责,文依学苑提示您谨慎判断数据来源及内容的合法性。因您的用户业务数据内容违反法律法规、部门规章或国家协议而造成的全部结果及责任均由您自行承担。
+					3、根据您与文依学苑协商一致,文依学苑在您选定的数据中心存储用户业务数据。文依学苑恪守对用户的安全承诺,根据适用的法律保护用户存储在文依学苑数据中心的数据。
+					6.2 公开信息
+					1、公开信息是指您公开分享的任何信息,任何人都可以在使用和未使用文依学苑互联网电子服务或商品期间查看或访问这些信息。例如您在社区、论坛发布的信息。
+					2、为使用文依学苑的互联网电子服务或商品,可能存在您必须公开分享的信息。
+					3、在使用文依学苑平台进行交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址等。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。您也可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的联络方式、交流信息或分享内容等相关信息的第三方,如您发现自己的个人信息泄漏,尤其是您的账户或密码发生泄露,请您立即联络客服,以便文依学苑采取相应措施。
+					七、我们如何保护您的个人信息
+					7.1 我们已采取符合业界标准、合理可行的安全防护措施保护您提供的个人信息安全,防止个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。例如,在您的浏览器与服务器之间交换数据(如信用卡信息)时受 SSL(Secure Socket Layer)协议加密保护;我们同时对文依学苑平台提供HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议安全浏览方式;我们会使用加密技术提高个人信息的安全性;我们会使用受信赖的保护机制防止个人信息遭到恶意攻击;我们会部署访问控制机制,尽力确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。我们努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护您的个人信息安全。我们积极建立数据分类分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用,努力确保未收集与我们提供的服务无关的个人信息。此外,我们通过与信息接触者签署保密协议、监控和审计机制来对数据进行全面安全控制。防止您的个人信息遭到未经授权的访问、公开披露、使用、修改、损坏或丢失。
+					但请您理解,由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全。您需要了解,您接入我们的服务所用的系统和通讯网络,有可能因我们可控范围外的因素而出现问题。
+					7.2 我们有行业先进的以数据为核心,围绕数据生命周期进行的数据安全管理体系,从组织建设、制度设计、人员管理、产品技术等方面多维度提升整个系统的安全性。
+					7.3 我们会采取合理可行的措施,尽力避免收集无关的个人信息。我们只会在达成本声明和协议所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。
+					7.4 互联网并非绝对安全的环境,我们强烈建议您不要使用非文依学苑推荐的通信方式发送个人信息。您可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的交易内容、联络方式、交流信息或分享内容等相关信息的第三方。
+					在使用文依学苑平台进行网上健康咨询时,您不可避免地要向医务人员或客服披露自己的个人信息,如联系方式或身份信息。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息尤其是您的账户或密码发生泄露,请您立即联络客服,以便我们根据您的申请采取相应措施。
+					请注意,您在使用我们服务时自愿共享甚至公开分享的信息,可能会涉及您或他人的个人信息甚至敏感个人信息,如您在发帖、评论时选择上传包含个人信息的图片。请您更加谨慎地考虑,是否在使用我们的服务时共享甚至公开分享相关信息。
+					请使用复杂密码,协助我们保证您的账号安全。我们将尽力保障您发送给我们的任何信息的安全性。如果我们的物理、技术或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改或毁坏,导致您的合法权益受损,我们将承担相应的法律责任。
+					7.5 我们将不定期更新并公开安全风险、个人信息安全影响评估报告等有关内容,您可通过文依学苑平台公告方式获得。
+					7.6 在不幸发生个人信息安全事件后,我们将按照法律法规的要求向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。事件相关情况我们将以邮件、信函、电话、推送通知等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。在不幸发生儿童信息安全事件后,我们将按照法律法规的要求,及时向儿童及其监护人告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、儿童及其监护人可自主防范和降低风险的建议、对儿童及其监护人的补救措施等。我们将及时将事件相关情况以电话、推送、发送邮件/短消息等方式告知儿童及其监护人。难以逐一告知时,我们会采取合理、有效的方式发布相关警示信息。
+					7.7 我们还将按照监管部门要求,上报个人信息安全事件的处置情况。
+					八、您如何管理您的个人信息
+					我们非常重视您对个人信息的关注,并尽最大努力保护您对于自己个人信息访问、更正、删除以及撤回同意的各项权利, 以使您拥有充分的能力保障您的隐私和安全。您可以通过以下方式访问及管理您的个人信息:
+					8.1 访问您的个人信息
+					您有权随时访问您的个人信息,法律法规规定的例外情况除外。您可以通过以下方式自行访问您的个人信息:
+					a.账户信息——如果您希望访问或编辑您的账户中的个人基本资料信息和实名认证信息、更改您的密码或添加绑定邮箱等,您可以登录账号通过"我的-设置中心"执行此类操作。
+					b.银行卡管理:您可以登陆账号,通过"我的-银行卡"进行银行卡的绑定、更换。
+					c.预约、问诊记录等:您可以登陆账号通过"我的-全部订单"查看了解历史记录。
+					如果您无法通过上述路径访问您的个人信息,您可以随时通过客服与我们取得联系。我们将在30个工作日内回复您的访问请求。
+					对于您在使用我们的互联网电子服务或商品过程中产生的其他个人信息,我们将根据本条"8.7 响应您的上述请求"中的相关安排向您提供。
+					8.2 更正或补充您的个人信息
+					当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正或补充。您可以通过"8.1访问您的个人信息"中列明的方式提出更正或补充申请。
+					8.3 删除您的个人信息
+					您可以通过"8.1访问您的个人信息"中列明的方式删除您的部分个人信息。同时,您也可以通过在线客服联系我们,帮助您删除您在平台上的部分相关信息。在以下情形中,您可以向我们提出删除个人信息的请求:
+					1、如果我们处理个人信息的行为违反法律法规;
+					2、如果我们收集、使用您的个人信息,却未征得您的明确同意;
+					3、如果我们处理个人信息的行为严重违反了与您的约定;
+					4、如果您不再使用我们的产品或服务,或您主动注销了账号;
+					5、如果我们永久不再为您提供产品或服务。
+					若我们决定响应您的删除请求,我们还将同时尽可能通知从我们处获得您的个人信息的主体,要求其及时删除,除非法律法规另有规定,或这些主体获得您的独立授权。
+					当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除这些信息。
+					8.4 改变您授权同意的范围
+					您可以通过删除信息、关闭设备功能、在文依学苑平台中进行隐私设置等方式改变您授权我们继续收集个人信息的范围或撤回您的授权。
+					请您理解,每个业务功能需要一些基本的个人信息才能得以完成(见本隐私保护协议"我们如何收集和使用您的信息")。当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。
+					8.5 个人信息主体注销账户
+					您可通过"我的-联系客服"功能联系客服完成账户的注销。请您谨慎操作,否则,因账户注销产生的数据丢失问题均由您自行承担。
+					在符合文依学苑单项服务的服务协议约定条件及国家相关法律法规规定的情况下,您的该项文依学苑服务帐号可能被注销或删除。当帐号注销或被删除后,与该帐号相关的、该单项服务项下的全部服务资料和数据将依照单项服务的服务协议约定删除或匿名化处理。但法律法规另有规定的除外。
+					在注销账户之后,我们将停止为您提供产品或服务,并依据您的要求,删除您的个人信息,但法律法规另有规定的除外。
+					8.6 约束信息系统自动决策
+					在某些互联网电子服务或商品中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。例如向您推荐您可能希望了解的医生或疾病知识,也可能根据您的位置信息或用户画像向您推送更精准的医生信息。如果这些决定显著影响您的合法权益,您有权要求我们做出解释,我们也将在不侵害文依学苑商业秘密或用户权益、社会公共利益的前提下提供申诉方法。
+					8.7 响应您的上述请求
+					为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。
+					我们将在30个工作日内做出答复。如您不满意,还可以通过客服发起投诉。
+					对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情况收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际的请求,我们可能会予以拒绝。
+					在以下情形中,按照法律法规要求,我们将无法响应您的请求:
+					1、与个人信息控制者履行法律法规规定的义务相关的;
+					2、与国家安全、国防安全有关的;
+					3、与公共安全、公共卫生、重大公共利益有关的;
+					4、与犯罪侦查、起诉、审判和执行判决等有关的;
+					5、有充分证据表明个人信息主体存在主观恶意或滥用权利的;
+					6、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;
+					7、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;
+					8、涉及商业秘密的。
+					九、我们如何处理未成年人的个人信息
+					如果没有父母或监护人的同意,未成年人不得创建自己的用户账户。在电子商务活动中我们推定您具有相应的民事行为能力。如您为未成年人,建议您请您的父母或监护人仔细阅读本声明和协议,并在征得您的父母或监护人同意的前提下使用我们的互联网电子服务或商品或向我们提供信息。
+					我们不会主动直接向未成年人收集其个人信息。对于经父母或监护人同意使用我们的互联网电子服务或商品而收集未成年人个人信息的情况,我们只会在法律法规允许、父母或监护人明确同意或者保护未成年人所必要的情况下使用、共享、转让或披露此信息。
+					根据当地监管部门的相关规定,文依学苑仅对满足特定年龄要求的用户提供互联网电子服务或商品。如果有事实证明未成年人并未取得监护人同意的情况下注册使用了我们的产品和/或服务,我们会与相关监护人协商,并设法尽快删除相关个人信息。
+					对于可能涉及的儿童个人信息,我们进一步采取以下措施予以保障:
+					对于收集到的儿童个人信息,我们除遵守本隐私保护协议关于用户个人信息的约定外,还会秉持正当必要、知情同意、目的明确、安全保障、依法利用的原则,严格遵循《儿童个人信息网络保护规定》等法律法规的要求进行存储、使用、披露,且不会超过实现收集、使用目的所必须的期限,到期后我们会对儿童个人信息进行删除或匿名化处理。
+					当您作为监护人为被监护的儿童选择使用我们提供的相关服务时,我们可能需要向您收集被监护的儿童个人信息,用于向您履行相关服务之必要。在具体服务中需要向您收集儿童个人信息的,我们会事先取得您的授权同意,并告知您收集的目的和用途。如果您不提供前述信息,您将无法享受我们提供的相关服务。此外,您在使用本平台过程中可能会主动向我们提供儿童个人信息,请您明确知悉并谨慎选择。您作为监护人应当正确履行监护职责,保护儿童个人信息安全。若儿童本人需要注册或使用我们的产品和/或服务,您应正确引导并予以监护。
+					儿童或其监护人有权随时访问、复制、更正、删除儿童个人信息,还可以向我们提出访问、复制、更正、删除的请求。如您对儿童个人信息相关事宜有任何意见、建议或投诉、举报,请联系我们。我们会随时为您提供帮助。
+					更多具体详细的未成年人信息处理规则详见《儿童个人信息处理规则》。
+					十、您的个人信息如何在全球范围转移
+					我们在中华人民共和国境内运营中收集和产生的个人信息,存储在中国境内,以下情形除外:
+					1、法律法规有明确规定;
+					2、获得您的明确授权;
+					3、您通过互联网进行海外互联网电子服务或商品等个人主动行为。
+					针对以上情形,我们会通过合理必要的措施确保以不低于本协议规定的程度及我国法律法规规定的个人信息保护标准保护您的个人信息。
+					十一、本声明和协议如何更新
+					我们的声明和协议可能变更,我们保留不时更新或修改本声明和协议的权利。
+					未经您明确同意,我们不会削减您按照本声明和协议所应享有的权利。 我们会在本页面上发布对本声明和协议所做的任何变更。
+					对于重大变更,我们还会提供更为显著的通知(包括我们会通过网站公示的方式进行通知甚至向您提供弹窗提示)。
+					本声明和协议所指的重大变更包括但不限于:
+					1、我们的服务模式发生重大变化,如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;
+					2、我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;
+					3、个人信息共享、转让或公开披露的主要对象发生变化;
+					4、您参与个人信息处理方面的权利及其行使方式发生重大变化;
+					5、我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;
+					6、个人信息安全影响评估报告表明存在高风险时。
+					如果您不同意修改后的内容,您有权并应立即停止使用我们提供的服务。如果您继续使用我们提供的服务,则视为您接受我们对本声明和协议相关条款所做的修改。我们还会将本声明和协议的旧版本存档,供您查阅。
+					十二、如何联系我们
+					以下情况,您可以通过在线客服与我们联系,一般情况下我们将在30个工作日内回复您的请求:
+					1、如对本声明和协议内容有任何疑问、意见或建议;
+					2、如发现个人信息可能被泄露。
+					您可以通过"我的-联系客服"或客服电话( 17716144271)与我们联系。
+					如果您对我们的回复不满意,特别是您认为我们的个人信息处理行为损害了您的合法权益,您还可以通过向文依学苑运营总部成都市温江区海天腾逸广场有管辖权的法院提起诉讼来寻求解决方案。
+				</view>
+
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {}
+	},
+	onLoad() {}
+}
+</script>
+
+<style lang="scss" scoped>
+.container {
+	min-height: 100vh;
+	background: #fff;
+	display: flex;
+	flex-direction: column;
+}
+
+.content {
+	flex: 1;
+	height: 100vh;
+}
+
+.agreement-body {
+	padding: 32rpx 24rpx 48rpx;
+}
+
+.title {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #333;
+	text-align: center;
+	margin-bottom: 16rpx;
+}
+
+.update-time {
+	font-size: 24rpx;
+	color: #999;
+	text-align: center;
+	margin-bottom: 40rpx;
+}
+
+.intro {
+	font-size: 28rpx;
+	color: #666;
+	line-height: 1.75;
+	margin-bottom: 36rpx;
+	text-align: justify;
+}
+
+.section {
+	margin-bottom: 36rpx;
+
+	.section-title {
+		font-size: 30rpx;
+		font-weight: bold;
+		color: #333;
+		margin-bottom: 16rpx;
+		line-height: 1.5;
+	}
+
+	.section-text {
+		font-size: 28rpx;
+		color: #666;
+		line-height: 1.75;
+		margin-bottom: 12rpx;
+		text-align: justify;
+
+		&:last-child {
+			margin-bottom: 0;
+		}
+
+		&.list {
+			padding-left: 16rpx;
+		}
+	}
+}
+
+.footer {
+	font-size: 26rpx;
+	color: #999;
+	text-align: center;
+	margin-top: 32rpx;
+	padding-top: 24rpx;
+}
+</style>