lhl01 1 週間 前
親
コミット
e42c01bafc

+ 1 - 0
App.vue

@@ -122,6 +122,7 @@
 				this.openOpen(true)
 				this.openOpen(true)
 			} else {
 			} else {
 				this.openOpen(false)
 				this.openOpen(false)
+				// this.openOpen(true)
 			}
 			}
 			// 加载拦截
 			// 加载拦截
 		},
 		},

+ 14 - 0
api/good.js

@@ -68,4 +68,18 @@ export function createOrder(data) {
 		method: 'post',
 		method: 'post',
 		data
 		data
 	});
 	});
+}
+
+/**
+ * 获取模板列表
+ * api/user/scoreTemplateList
+ * @param {object} data
+ * @param {number} data.page
+ * @param {number} data.pageSize pageSize 固定50即可
+ */
+export function getScoreTemplateList() {
+	return request({
+		url: '/api/user/scoreTemplateList',
+		method: 'get'
+	});
 }
 }

+ 2 - 1
api/model.js

@@ -78,7 +78,8 @@ export function getBannerList(data) {
 export function getShowTemplateList(data) {
 export function getShowTemplateList(data) {
 	return request({
 	return request({
 		url: '/api/pub/getShowTemplateList',
 		url: '/api/pub/getShowTemplateList',
-		method: 'post',
+		method: 'post',
+		data
 })
 })
 }
 }
 //我的模板
 //我的模板

+ 235 - 0
api/student.js

@@ -0,0 +1,235 @@
+import request from '@/utils/request'
+
+// ==================== 导师模块 /api/tutor/* ====================
+
+/**
+ * 提交导师申请
+ * @param {object} data
+ * @param {number} data.work_type_id 申请的职业(user_work_type.id)
+ */
+export function tutorApply(data) {
+	return request({
+		url: '/api/tutor/apply',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 我的导师申请状态
+ */
+export function tutorMyApply(data) {
+	return request({
+		url: '/api/tutor/myApply',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 获取研究员简历详情(导师端)
+ * @param {object} data
+ * @param {number} data.researcher_uid 研究员 uid
+ */
+export function tutorResearcherInfo(data) {
+	return request({
+		url: '/api/tutor/researcherInfo',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 修改研究员简历(导师端)
+ * @param {object} data
+ * @param {number} data.researcher_uid 研究员 uid
+ * @param {string} [data.service_project] 服务内容
+ * @param {string} [data.service_intro_content] 服务介绍文本
+ * @param {array} [data.service_intro_imgs] 介绍图片
+ * @param {array} [data.service_audit_imgs] 证书截图
+ * @param {array} [data.service_imgs] 服务照片
+ * @param {number} [data.service_min_price] 最低服务价格
+ * @param {number} [data.service_max_price] 最高服务价格
+ */
+export function tutorEditResearcherInfo(data) {
+	return request({
+		url: '/api/tutor/editResearcherInfo',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 查看研究员打卡历史(导师端)
+ * @param {object} data
+ * @param {number} data.researcher_uid 研究员 uid
+ * @param {number} [data.page] 页码,默认 1
+ * @param {number} [data.pageSize] 每页条数,默认 50,最大 50
+ */
+export function tutorResearcherClockList(data) {
+	return request({
+		url: '/api/tutor/researcherClockList',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 首页导师列表(公开)
+ * @param {object} data
+ * @param {number} [data.work_type_id] 职业筛选
+ * @param {number} [data.page] 页码,默认 1
+ * @param {number} [data.pageSize] 每页条数,默认 50,最大 50
+ */
+export function tutorList(data) {
+	return request({
+		url: '/api/tutor/tutorList',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 导师名片详情(公开)
+ * @param {object} data
+ * @param {number} data.tutor_uid 导师 uid
+ */
+export function tutorCardInfo(data) {
+	return request({
+		url: '/api/tutor/tutorCardInfo',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 研究员名片详情(公开)
+ * @param {object} data
+ * @param {number} data.researcher_uid 研究员 uid
+ */
+export function researcherCardInfo(data) {
+	return request({
+		url: '/api/tutor/researcherCardInfo',
+		method: 'post',
+		data
+	})
+}
+
+// ==================== 研究员模块 /api/researcher/* ====================
+
+/**
+ * 提交研究员申请
+ * @param {object} data
+ * @param {number} data.tutor_uid 导师 uid
+ */
+export function researcherApply(data) {
+	return request({
+		url: '/api/researcher/apply',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 我的研究员申请状态
+ */
+export function researcherMyApply() {
+	return request({
+		url: '/api/researcher/myApply',
+		method: 'post',
+	})
+}
+
+/**
+ * 导师处理研究员申请(导师端)
+ * @param {object} data
+ * @param {number} data.apply_id 申请记录 id
+ * @param {number} data.action 1=同意,2=拒绝
+ */
+export function researcherDeal(data) {
+	return request({
+		url: '/api/researcher/deal',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 研究员申请列表(导师端)
+ * @param {object} data
+ * @param {number} [data.status] 0申请中 1同意 2拒绝 3已解除
+ * @param {number} [data.page] 默认 1
+ * @param {number} [data.pageSize] 默认 50,最大 50
+ */
+export function researcherList(data) {
+	return request({
+		url: '/api/researcher/list',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 我的申请列表(阿姨端)
+ * @param {object} data
+ * @param {number} [data.status] 0申请中 1同意 2拒绝 3已解除
+ * @param {number} [data.page] 默认 1
+ * @param {number} [data.pageSize] 默认 50,最大 50
+ */
+export function researcherMyList(data) {
+	return request({
+		url: '/api/researcher/myList',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 解除导师-研究员关系
+ * @param {object} data
+ * @param {number} [data.relation_id] tutor_researcher 的 id(与 uid 二选一)
+ * @param {number} [data.uid] 对方 uid(与 relation_id 二选一)
+ */
+export function researcherUnbind(data) {
+	return request({
+		url: '/api/researcher/unbind',
+		method: 'post',
+		data
+	})
+}
+
+// ==================== 身份接口 /api/user/* ====================
+
+/**
+ * 个人中心身份信息
+ * @returns {Promise} data.is_tutor / is_researcher / my_tutor / my_researchers
+ */
+export function userIdentity(data) {
+	return request({
+		url: '/api/user/userIdentity',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 申请黑金模板
+ */
+
+export function applyBlackGold() {
+	return request({
+		url: '/api/blackGold/apply',
+		method: 'post',
+	})
+}
+
+/**
+ * 我的黑金模板申请状态
+ * api/blackGold/myApply
+ */
+export function myBlackGoldApply() {
+	return request({
+		url: '/api/blackGold/myApply',
+		method: 'post',
+	})
+}

+ 41 - 0
api/user.js

@@ -531,4 +531,45 @@ export function express(data) {
 		method: 'post',
 		method: 'post',
 		data
 		data
 	})
 	})
+}
+
+/**
+ * 搜索转账目标用户
+ * @param {object} data
+ * @param {string} data.keyword
+ */
+export function searchTransferUser(data) {
+	return request({
+		url: '/api/user/searchTransferUser',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 积分转账
+ * @param {object} data
+ * @param {string} data.to_uid 转账目标用户ID
+ * @param {number} data.score 金额(整数)
+ * @param {string} data.mono 备注(可选)
+ */
+export function scoreTransfer(data) {
+	return request({
+		url: '/api/user/scoreTransfer',
+		method: 'post',
+		data
+	})
+}
+
+/**
+ * 积分购买模板
+ * @param {object} data
+ * @param {number} data.id 模板ID
+ */
+export function scoreBuyTemplate(data) {
+	return request({
+		url: '/api/user/scoreBuyTemplate',
+		method: 'post',
+		data
+	})
 }
 }

+ 37 - 2
pages.json

@@ -18,7 +18,8 @@
 		{
 		{
 			"path": "pages/index/webview",
 			"path": "pages/index/webview",
 			"style": {
 			"style": {
-				"navigationStyle": "custom"
+				"navigationStyle": "custom",
+				"navigationBarTitleText": "母婴界严选"
 			}
 			}
 		},
 		},
 		{
 		{
@@ -103,11 +104,39 @@
 			}],
 			}],
 			"plugins" : {
 			"plugins" : {
 			    "chatbot" : {
 			    "chatbot" : {
-			        "version" : "1.5.4",
+			        "version" : "1.5.6",
 			        "provider" : "wx8c631f7e9f2465e1"
 			        "provider" : "wx8c631f7e9f2465e1"
 			    }
 			    }
 			}
 			}
 		},
 		},
+		{
+			"root": "pages/student",
+			"name": "student",
+			"pages": [{
+				"path": "myStudent",
+				"style": {
+					"navigationBarBackgroundColor": "#ff629f",
+					"navigationBarTextStyle": "white",
+					"navigationBarTitleText": "我的研究员"
+				}
+			},
+			{
+				"path": "studentDetail",
+				"style": {
+					"navigationBarBackgroundColor": "#ff629f",
+					"navigationBarTextStyle": "white",
+					"navigationBarTitleText": "研究员详情"
+				}
+			},
+			{
+				"path": "dk",
+				"style": {
+					"navigationBarBackgroundColor": "#ff629f",
+					"navigationBarTextStyle": "white",
+					"navigationBarTitleText": "打卡记录"
+				}
+			}]
+		},
 		{
 		{
 			"root": "pages/user",
 			"root": "pages/user",
 			"name": "user",
 			"name": "user",
@@ -305,6 +334,12 @@
 						"navigationBarTitleText": ""
 						"navigationBarTitleText": ""
 					}
 					}
 				},
 				},
+				{
+					"path": "jf/give",
+					"style": {
+						"navigationBarTitleText": "积分互转"
+					}
+				},
 				// {
 				// {
 				// 	"path": "jf/store",
 				// 	"path": "jf/store",
 				// 	"style": {
 				// 	"style": {

+ 33 - 44
pages/index/index.vue

@@ -14,7 +14,7 @@
 			<uni-notice-bar @click="navTo(textList[0].url)" show-icon scrollable :text="textList[0].title" />
 			<uni-notice-bar @click="navTo(textList[0].url)" show-icon scrollable :text="textList[0].title" />
 		</view>
 		</view>
 		<view class="hot-list-box">
 		<view class="hot-list-box">
-			<view class="title-box flex">
+			<!-- <view class="title-box flex">
 				<view class="flex">
 				<view class="flex">
 					<image class="hot margin-r-10" src="../../static/icon/hot.png" mode="scaleToFill"></image>
 					<image class="hot margin-r-10" src="../../static/icon/hot.png" mode="scaleToFill"></image>
 					<view class="title">
 					<view class="title">
@@ -27,8 +27,8 @@
 					</text>
 					</text>
 					<image src="../../static/icon/next1.png" mode="scaleToFill" class="tip"></image>
 					<image src="../../static/icon/next1.png" mode="scaleToFill" class="tip"></image>
 				</view>
 				</view>
-			</view>
-			<view class="hot-list">
+			</view> -->
+			<!-- <view class="hot-list">
 				<view class="item" :key='ind' v-for="(item,ind) in rmList"
 				<view class="item" :key='ind' v-for="(item,ind) in rmList"
 					@click="navTo('/pages/user/model/model?mtype=' + item.id+'&type=0')">
 					@click="navTo('/pages/user/model/model?mtype=' + item.id+'&type=0')">
 					<view class="hot-image-box">
 					<view class="hot-image-box">
@@ -37,7 +37,6 @@
 					<view class="hot-title clamp">
 					<view class="hot-title clamp">
 						{{item.title}}
 						{{item.title}}
 					</view>
 					</view>
-					<!-- #ifdef MP -->
 					<view class="hot-money flex clamp" v-if="systeam!='ios'">
 					<view class="hot-money flex clamp" v-if="systeam!='ios'">
 						<text class="money">
 						<text class="money">
 							¥{{item.price}}
 							¥{{item.price}}
@@ -46,45 +45,32 @@
 							{{item.old_price}}
 							{{item.old_price}}
 						</text>
 						</text>
 					</view>
 					</view>
-					<!-- #endif -->
-					<!-- #ifndef MP -->
-					<view class="hot-money flex clamp">
-						<text class="money">
-							¥{{item.price}}
-						</text>
-						<text class="oldmoney">
-							{{item.old_price}}
-						</text>
-					</view>
-					<!-- #endif -->
 				</view>
 				</view>
-			</view>
-			<view class="flex">
-				<!-- @click="navTo('/pages/public/video')" -->
+			</view> -->
+			<view class="flex" v-if="isOpen">
 				<view class="banner" @click="navTo('/pages/public/artDetailTab?cid=4')">
 				<view class="banner" @click="navTo('/pages/public/artDetailTab?cid=4')">
-					<image v-if="baseURL" :src="baseURL+'/static/img/indexLeft.png'" mode="widthFix"></image>
+					<image v-if="baseURL" :src="baseURL+'/static/img/indexLeft.gif'" mode="widthFix"></image>
 				</view>
 				</view>
-				<!-- <view class="banner" @click="navTo('/pages/user/model/phb')"> -->
 				<view class="banner" @click="navTo('/pages/index/listModel?type=2&timetype=&servicePrice=&work_type_id=&service_area=&is_china=')">
 				<view class="banner" @click="navTo('/pages/index/listModel?type=2&timetype=&servicePrice=&work_type_id=&service_area=&is_china=')">
-					<image v-if="baseURL" :src="baseURL+'/static/img/indexRight.png'" mode="widthFix"></image>
+					<image v-if="baseURL" :src="baseURL+'/static/img/indexRight.gif'" mode="widthFix"></image>
 				</view>
 				</view>
 			</view>
 			</view>
-
-			<view class="title-box flex padding-b-30" v-if="jxList.length > 0">
+			<view class="title-box flex padding-b-30" v-if="tutorList.length > 0">
 				<view class="flex">
 				<view class="flex">
 					<image class="hot margin-r-10" src="../../static/icon/hot.png" mode="scaleToFill"></image>
 					<image class="hot margin-r-10" src="../../static/icon/hot.png" mode="scaleToFill"></image>
 					<view class="title">
 					<view class="title">
-						精选名片推荐
+						职业导师推荐
 					</view>
 					</view>
 				</view>
 				</view>
-				<!-- <navigator url="/pages/index/listModel?type=1">
-					<view class="right flex">
-						<text class="margin-r-10">
-							更多
-						</text>
-						<image src="../../static/icon/next1.png" mode="scaleToFill" class="tip"></image>
+			</view>
+			<cmy-mys-list :list='tutorList' :height="440"></cmy-mys-list>
+			<view class="title-box flex padding-b-30" v-if="jxList.length > 0" style="margin-top: 20rpx;">
+				<view class="flex">
+					<image class="hot margin-r-10" src="../../static/icon/hot.png" mode="scaleToFill"></image>
+					<view class="title">
+						精选名片推荐
 					</view>
 					</view>
-				</navigator> -->
+				</view>
 			</view>
 			</view>
 			<cmy-mys-list :list='jxList' :height="440"></cmy-mys-list>
 			<cmy-mys-list :list='jxList' :height="440"></cmy-mys-list>
 			<view class="title-box flex padding-t-30 padding-b-30">
 			<view class="title-box flex padding-t-30 padding-b-30">
@@ -94,14 +80,6 @@
 						最新名片推荐
 						最新名片推荐
 					</view>
 					</view>
 				</view>
 				</view>
-				<!-- <navigator url="/pages/index/listModel?type=2">
-					<view class="right flex">
-						<text class="margin-r-10">
-							更多
-						</text>
-						<image src="../../static/icon/next1.png" mode="scaleToFill" class="tip"></image>
-					</view>
-				</navigator> -->
 			</view>
 			</view>
 			<cmy-mys-list :list='zxList'></cmy-mys-list>
 			<cmy-mys-list :list='zxList'></cmy-mys-list>
 		</view>
 		</view>
@@ -117,6 +95,8 @@
 
 
 <script>
 <script>
 	import TabbarConfig from '@/config/tabbar.js'
 	import TabbarConfig from '@/config/tabbar.js'
+
+	import { tutorList } from '@/api/student.js';
 	import {
 	import {
 		mapState,
 		mapState,
 		mapMutations
 		mapMutations
@@ -157,14 +137,13 @@
 				zxList: [],
 				zxList: [],
 				page: 1,
 				page: 1,
 				limit: 20,
 				limit: 20,
-				loading: 'more'
+				loading: 'more',
+				tutorList: []
 			};
 			};
 		},
 		},
 		computed: {
 		computed: {
-			...mapState('user', ['userInfo','isOpen']),
-			// #ifdef MP
-			...mapState(['systeam', 'baseURL']),
-			// #endif
+			...mapState('user', ['userInfo']),
+			...mapState(['systeam', 'baseURL','isOpen']),
 		},
 		},
 		onLoad: function(option) {
 		onLoad: function(option) {
 			const that = this;
 			const that = this;
@@ -188,6 +167,7 @@
 			this.loadIndexs();
 			this.loadIndexs();
 			this.getWorkerList()
 			this.getWorkerList()
 			this.getNewWorkerList('re');
 			this.getNewWorkerList('re');
+			this.getTutorList();
 		},
 		},
 		onReachBottom() {
 		onReachBottom() {
 			this.getNewWorkerList();
 			this.getNewWorkerList();
@@ -225,6 +205,15 @@
 		},
 		},
 		// #endif
 		// #endif
 		methods: {
 		methods: {
+			getTutorList() {
+				tutorList({
+					page: 1,
+					pageSize: 50,
+				}).then(res => {
+					console.log(res);
+					this.tutorList = res.data.list.filter(item => item.name.indexOf('测试') == -1 );
+				})
+			},
 			// 打开小程序
 			// 打开小程序
 			openXcx(item) {
 			openXcx(item) {
 				// #ifdef MP
 				// #ifdef MP

+ 1 - 1
pages/index/listModel.vue

@@ -342,7 +342,7 @@
 						id: item.uid*1,
 						id: item.uid*1,
 						latitude: item.latitude || ( item.uid * 0.0001 + 28.9),
 						latitude: item.latitude || ( item.uid * 0.0001 + 28.9),
 						longitude: item.longitude || ( item.uid * 0.0001 + 120.44297),
 						longitude: item.longitude || ( item.uid * 0.0001 + 120.44297),
-						iconPath: '/static/icon/myjdw.png',
+						iconPath:  item.is_tutor == 1 ? '/static/icon/zyds.png':   item.is_researcher == 1 ? "/static/icon/yjy.png" :'/static/icon/myjdw.png',
 						width: 35,
 						width: 35,
 						height: 35
 						height: 35
 					})
 					})

+ 101 - 22
pages/index/store.vue

@@ -1,21 +1,56 @@
 <template>
 <template>
 	<view class="content">
 	<view class="content">
 		<view class="goods-list">
 		<view class="goods-list">
+			
+			<view class="goods-item" v-for="(item, index) in tutorTemplate" :key="index" @click="addCarts(item)">
+				<image :src="item.img" mode="aspectFill" class="goods-image"></image>
+				<view class="goods-name clamp">{{item.title}}</view>
+				<view class="goods-info">
+					<text class="goods-points" style="text-align: center;">立即申请</text>
+					<!-- <image src="/static/icon/cart.png" mode="widthFix" class="add-cart"></image> -->
+				</view>
+			</view>
+			<view class="goods-item" v-for="(item, index) in blackTemplate" :key="index" @click="addCarts(item)">
+				<image :src="item.img" mode="aspectFill" class="goods-image"></image>
+				<view class="goods-name clamp">{{item.title}}</view>
+				<view class="goods-info">
+					<text class="goods-points" style="text-align: center;">立即申请</text>
+					<!-- <image src="/static/icon/cart.png" mode="widthFix" class="add-cart"></image> -->
+				</view>
+			</view>
+			<view class="goods-item" v-for="(item, index) in scoreTemplateList" :key="index" @click="addCarts(item)">
+				<image :src="item.img" mode="aspectFill" class="goods-image"></image>
+				<view class="goods-name clamp">{{item.title}}</view>
+				<view class="goods-info">
+					<text class="goods-points">{{item.score_price}} 积分</text>
+					<image src="/static/icon/cart.png" mode="widthFix" class="add-cart"></image>
+				</view>
+			</view>
 			<view class="goods-item" v-for="(item, index) in goodsList" :key="index" @click="addCart(item)">
 			<view class="goods-item" v-for="(item, index) in goodsList" :key="index" @click="addCart(item)">
 				<image :src="item.image" mode="aspectFill" class="goods-image"></image>
 				<image :src="item.image" mode="aspectFill" class="goods-image"></image>
 				<view class="goods-name clamp">{{item.store_name}}</view>
 				<view class="goods-name clamp">{{item.store_name}}</view>
 				<view class="goods-info">
 				<view class="goods-info">
 					<text class="goods-points">{{item.price}} 积分</text>
 					<text class="goods-points">{{item.price}} 积分</text>
-					<image src="/static/icon/cart.png" mode="widthFix" class="add-cart" ></image>
+					<image src="/static/icon/cart.png" mode="widthFix" class="add-cart"></image>
 				</view>
 				</view>
 			</view>
 			</view>
 		</view>
 		</view>
-	<m-tabbar fixed fill current="1" :tabbar="tabbar"></m-tabbar>
-		</view>
-	</template>
-	<script>
-		import TabbarConfig from '@/config/tabbar.js'
-	import { getProductList  } from '@/api/good.js'
+		<m-tabbar fixed fill current="1" :tabbar="tabbar"></m-tabbar>
+	</view>
+</template>
+<script>
+	import {
+		getShowTemplateList
+	} from '@/api/model.js';
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex';
+	import TabbarConfig from '@/config/tabbar.js'
+	import {
+		getProductList,
+		getScoreTemplateList
+	} from '@/api/good.js'
 	export default {
 	export default {
 		data() {
 		data() {
 			return {
 			return {
@@ -25,14 +60,46 @@
 				list: [],
 				list: [],
 				loaded: false,
 				loaded: false,
 				status: 'more',
 				status: 'more',
-				goodsList: []
+				goodsList: [],
+				scoreTemplateList: [],
+				scoreTemplateLists: [],
+				tutorTemplate: [],
+				blackTemplate: []
 			};
 			};
 		},
 		},
+		computed: {
+			...mapState('user',['userInfo','hasLogin'])
+
+		},
 		methods: {
 		methods: {
 			// 返回
 			// 返回
+			getScoreTemplateList() {
+				getScoreTemplateList({
+					page: 1,
+					pageSize: 50
+				}).then(res => {
+					this.scoreTemplateList = res.data.list
+				})
+			},
+			getScoreTemplateLists() {
+				getShowTemplateList({
+					page: 1,
+					pageSize: 50,
+				}).then(res => {
+					this.tutorTemplate = []
+					this.blackTemplate = []
+					res.data.list.forEach(item => {
+						if(item.template_type == 1) {
+							this.tutorTemplate.push(item)
+						} else if(item.template_type == 2) {
+							this.blackTemplate.push(item)
+						}
+					})
+				})
+			},
 			getProductList() {
 			getProductList() {
 				let that = this
 				let that = this
-				if(that.status == 'noMore' || that.status == 'loading') return;
+				if (that.status == 'noMore' || that.status == 'loading') return;
 				that.status = 'loading'
 				that.status = 'loading'
 				getProductList({
 				getProductList({
 					page: that.page,
 					page: that.page,
@@ -40,9 +107,9 @@
 				}).then(res => {
 				}).then(res => {
 					let list = res.data.list
 					let list = res.data.list
 					that.goodsList = that.goodsList.concat(list)
 					that.goodsList = that.goodsList.concat(list)
-					if(that.limit == list.length) {
+					if (that.limit == list.length) {
 						that.status = 'more'
 						that.status = 'more'
-					}else {
+					} else {
 						that.status = 'noMore'
 						that.status = 'noMore'
 					}
 					}
 					that.loaded = true
 					that.loaded = true
@@ -51,12 +118,22 @@
 			// 添加到购物车
 			// 添加到购物车
 			addCart(item) {
 			addCart(item) {
 				uni.navigateTo({
 				uni.navigateTo({
-					url:'/pages/user/jf/detail?id=' + item.id
+					url: '/pages/user/jf/detail?id=' + item.id
+				})
+			},
+			addCarts(item) {
+				uni.navigateTo({
+					url: '/pages/user/model/model?type=0&mtype=' + item.id
 				})
 				})
 			}
 			}
 		},
 		},
 		onLoad() {
 		onLoad() {
 			this.getProductList()
 			this.getProductList()
+			if(this.hasLogin) {
+				console.log('zhix');
+				this.getScoreTemplateList()
+				this.getScoreTemplateLists()
+			}
 		},
 		},
 		onReachBottom() {
 		onReachBottom() {
 			this.getProductList()
 			this.getProductList()
@@ -81,23 +158,23 @@
 		padding: 0 30rpx;
 		padding: 0 30rpx;
 		height: 80rpx;
 		height: 80rpx;
 		background-color: #FF4444;
 		background-color: #FF4444;
-		
+
 		.back {
 		.back {
 			width: 40rpx;
 			width: 40rpx;
 			height: 40rpx;
 			height: 40rpx;
-			
+
 			image {
 			image {
 				width: 100%;
 				width: 100%;
 				height: 100%;
 				height: 100%;
 			}
 			}
 		}
 		}
-		
+
 		.title {
 		.title {
 			font-size: 32rpx;
 			font-size: 32rpx;
 			font-weight: bold;
 			font-weight: bold;
 			color: #FFFFFF;
 			color: #FFFFFF;
 		}
 		}
-		
+
 		.right {
 		.right {
 			width: 40rpx;
 			width: 40rpx;
 		}
 		}
@@ -111,6 +188,7 @@
 		padding: 0 15rpx;
 		padding: 0 15rpx;
 		justify-content: space-between;
 		justify-content: space-between;
 		padding-top: 20rpx;
 		padding-top: 20rpx;
+
 		.goods-item {
 		.goods-item {
 			width: 350rpx;
 			width: 350rpx;
 			// margin: 1%;
 			// margin: 1%;
@@ -118,14 +196,15 @@
 			border-radius: 15rpx;
 			border-radius: 15rpx;
 			overflow: hidden;
 			overflow: hidden;
 			margin-bottom: 20rpx;
 			margin-bottom: 20rpx;
+
 			.goods-image {
 			.goods-image {
 				width: 350rpx;
 				width: 350rpx;
 				height: 300rpx;
 				height: 300rpx;
 			}
 			}
-			
+
 			.goods-name {
 			.goods-name {
 				width: 330rpx;
 				width: 330rpx;
-				padding: 15rpx ;
+				padding: 15rpx;
 				font-size: 26rpx;
 				font-size: 26rpx;
 				color: #333333;
 				color: #333333;
 				line-height: 36rpx;
 				line-height: 36rpx;
@@ -136,19 +215,19 @@
 				// -webkit-line-clamp: 2;
 				// -webkit-line-clamp: 2;
 				// -webkit-box-orient: vertical;
 				// -webkit-box-orient: vertical;
 			}
 			}
-			
+
 			.goods-info {
 			.goods-info {
 				display: flex;
 				display: flex;
 				align-items: center;
 				align-items: center;
 				justify-content: space-between;
 				justify-content: space-between;
 				padding: 0 15rpx 15rpx;
 				padding: 0 15rpx 15rpx;
-				
+
 				.goods-points {
 				.goods-points {
 					font-size: 26rpx;
 					font-size: 26rpx;
 					font-weight: bold;
 					font-weight: bold;
 					color: #FF4444;
 					color: #FF4444;
 				}
 				}
-				
+
 				.add-cart {
 				.add-cart {
 					width: 40rpx;
 					width: 40rpx;
 					height: 40rpx;
 					height: 40rpx;
@@ -157,7 +236,7 @@
 					display: flex;
 					display: flex;
 					align-items: center;
 					align-items: center;
 					justify-content: center;
 					justify-content: center;
-					
+
 					.cart-icon {
 					.cart-icon {
 						width: 24rpx;
 						width: 24rpx;
 						height: 24rpx;
 						height: 24rpx;

+ 3 - 2
pages/index/webview.vue

@@ -1,6 +1,6 @@
 <template>
 <template>
 	<view>
 	<view>
-		<web-view :webview-styles="webviewStyles" :src="wsrc"></web-view>
+		<web-view v-if="wsrc" :webview-styles="webviewStyles" :src="wsrc"></web-view>
 	</view>
 	</view>
 </template>
 </template>
 
 
@@ -17,7 +17,8 @@
 			}
 			}
 		},
 		},
 		onLoad(opt) {
 		onLoad(opt) {
-			this.wsrc = opt.targetUrl
+			let url = uni.getStorageSync('targetUrl')
+			this.wsrc = url
 		}
 		}
 	}
 	}
 </script>
 </script>

+ 34 - 21
pages/modelData/index.vue

@@ -1,18 +1,20 @@
 <template>
 <template>
 	<view>
 	<view>
 		<model1 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-if="modelId==3||modelId==1"
 		<model1 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-if="modelId==3||modelId==1"
-			:templateDetail='templateData' :isShare='isShare' :isLook='isLook' :honorList="honorList"></model1>
-		<model2 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==4" :templateDetail='templateData'
-			:isShare='isShare' :isLook='isLook' :honorList="honorList"></model2>
-		<model3 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==5"  :templateDetail='templateData'
-			:isShare='isShare' :isLook='isLook' :honorList="honorList"></model3>
-		<model4 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==6"  :templateDetail='templateData'
-			:isShare='isShare' :isLook='isLook' :honorList="honorList"></model4>
-		<model5 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==7"  :templateDetail='templateData'
-			:isShare='isShare' :isLook='isLook' :honorList="honorList"></model5>
+			:templateDetail='templateData' :isShare='isShare' :isLook='isLook' :honorList="honorList" ></model1>
+		<model2 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==4"
+			:templateDetail='templateData' :isShare='isShare' :isLook='isLook' :honorList="honorList"></model2>
+		<model3 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==5"
+			:templateDetail='templateData' :isShare='isShare' :isLook='isLook' :honorList="honorList"></model3>
+		<model4 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==6"
+			:templateDetail='templateData' :isShare='isShare' :isLook='isLook' :honorList="honorList"></model4>
+		<model5 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==7"
+			:templateDetail='templateData' :isShare='isShare' :isLook='isLook' :honorList="honorList" ></model5>
+		<model6 :shareNumber='shareNumber' @openImage='openImage' :isDefault='isDefault' v-else-if="modelId==8"
+			:templateDetail='templateData' :isShare='isShare' :isLook='isLook' :honorList="honorList" :stype="stype" :reBackdays="reBackdays"></model6>
 		<template v-if="imageList.length>0">
 		<template v-if="imageList.length>0">
-			<q-previewImage ref="previewImage" :urls="imageList" 
-				@close="close" @open="open"  @onLongpress="onLongpress"></q-previewImage>
+			<q-previewImage ref="previewImage" :urls="imageList" @close="close" @open="open"
+				@onLongpress="onLongpress"></q-previewImage>
 		</template>
 		</template>
 	</view>
 	</view>
 </template>
 </template>
@@ -23,11 +25,13 @@
 	import model3 from './modeltemplate/model_3.vue'
 	import model3 from './modeltemplate/model_3.vue'
 	import model4 from './modeltemplate/model_4.vue'
 	import model4 from './modeltemplate/model_4.vue'
 	import model5 from './modeltemplate/model_5.vue'
 	import model5 from './modeltemplate/model_5.vue'
+	import model6 from './modeltemplate/model_6.vue'
+
 	export default {
 	export default {
 		props: {
 		props: {
 			honorList: {
 			honorList: {
 				type: Array,
 				type: Array,
-				default:()=>{
+				default: () => {
 					return []
 					return []
 				}
 				}
 			},
 			},
@@ -60,21 +64,30 @@
 				type: Number,
 				type: Number,
 				default: 0
 				default: 0
 			},
 			},
+			stype: {
+				type: Number,
+				default: 0
+			},
+			reBackdays: {
+				type: Number,
+				default: 0
+			}
 		},
 		},
 		components: {
 		components: {
 			model1,
 			model1,
 			model2,
 			model2,
 			model3,
 			model3,
 			model4,
 			model4,
-			model5
+			model5,
+			model6
 		},
 		},
 		computed: {
 		computed: {
 			imageList() {
 			imageList() {
-				try{
+				try {
 					let templateData = this.templateData;
 					let templateData = this.templateData;
 					let arr = [];
 					let arr = [];
-					if(templateData.modelType==0){
-						if(templateData.service_intro_imgs && templateData.service_intro_imgs.length > 0){
+					if (templateData.modelType == 0) {
+						if (templateData.service_intro_imgs && templateData.service_intro_imgs.length > 0) {
 							arr = [...templateData.service_intro_imgs]
 							arr = [...templateData.service_intro_imgs]
 						}
 						}
 						if (templateData.service_audit_imgs && templateData.service_audit_imgs.length > 0) {
 						if (templateData.service_audit_imgs && templateData.service_audit_imgs.length > 0) {
@@ -83,14 +96,14 @@
 						if (templateData.service_imgs && templateData.service_imgs.length > 0) {
 						if (templateData.service_imgs && templateData.service_imgs.length > 0) {
 							arr = arr.concat(templateData.service_imgs)
 							arr = arr.concat(templateData.service_imgs)
 						}
 						}
-					}else if(templateData.modelType==1){
+					} else if (templateData.modelType == 1) {
 						arr = arr.concat(templateData.model_imgs)
 						arr = arr.concat(templateData.model_imgs)
 					}
 					}
-					
-					
+
+
 					return arr
 					return arr
-				}catch(e){
-					console.log(e,'eeee')
+				} catch (e) {
+					console.log(e, 'eeee')
 					return []
 					return []
 					//TODO handle the exception
 					//TODO handle the exception
 				}
 				}

+ 50 - 2
pages/modelData/modeltemplate/model_1.vue

@@ -108,6 +108,35 @@
 					</view>
 					</view>
 				</view>
 				</view>
 			</view>
 			</view>
+			<view class="m-card" v-if="cardInfo.my_tutor && cardInfo.my_tutor.uid">
+				<image v-if="baseURL" :src="baseURL + '/resource/model/model1/card-bg.png'"  class="card-bg"></image>
+				<view class="card-tit flex">
+					<image v-if="baseURL" :src="baseURL + '/resource/model/model1/m5.png'"  class="tit-logo"></image>职业导师
+				</view>
+				<view class="flex" style="flex-wrap: wrap;justify-content: center; padding-bottom: 20rpx;">
+					<view class="honor "   @click="goDetail(cardInfo.my_tutor.show_template_id,cardInfo.my_tutor.uid)">
+						<image :src="cardInfo.my_tutor.avatar" mode="heightFix" class="honor-icons"></image>
+						<view class="honor-name">
+							{{cardInfo.my_tutor.name}}
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="m-card" v-if="cardInfo.my_researcher && cardInfo.my_researcher.length > 0">
+				<image v-if="baseURL" :src="baseURL + '/resource/model/model1/card-bg.png'"  class="card-bg"></image>
+				<view class="card-tit flex">
+					<image v-if="baseURL" :src="baseURL + '/resource/model/model1/m5.png'"  class="tit-logo"></image>小组研究成员
+				</view>
+				<view class="flex" style="flex-wrap: wrap;justify-content: center; padding-bottom: 20rpx;">
+					<view class="honor " v-for="item in cardInfo.my_researcher"  @click="goDetail(item.show_template_id,item.uid)">
+						<image :src="item.avatar" mode="heightFix" class="honor-icons"></image>
+						<view class="honor-name">
+							{{item.name}}
+						</view>
+					</view>
+				</view>
+			</view>
+			
 			<!-- 自我评价 -->
 			<!-- 自我评价 -->
 			<view class="hua4">
 			<view class="hua4">
 				<view class="hua3">
 				<view class="hua3">
@@ -280,6 +309,13 @@
 				}
 				}
 			}
 			}
 		},
 		},
+		methods: {
+			goDetail(mtype,uid) {
+				uni.navigateTo({
+					url:'/pages/user/model/model?mtype=' + mtype + '&uid=' + uid + '&type=2'
+				})
+			},
+		}
 	}
 	}
 </script>
 </script>
 
 
@@ -433,13 +469,14 @@
 		margin: 0 auto 46rpx;
 		margin: 0 auto 46rpx;
 
 
 		.card-tit {
 		.card-tit {
-			width: 219rpx;
+			display: inline-block;
+			min-width: 219rpx;
 			height: 57rpx;
 			height: 57rpx;
 			background: #F46C85;
 			background: #F46C85;
 			border-radius: 20rpx 28rpx 29rpx 0rpx;
 			border-radius: 20rpx 28rpx 29rpx 0rpx;
 			justify-content: flex-start;
 			justify-content: flex-start;
 			align-items: center;
 			align-items: center;
-			padding: 0 20rpx;
+			padding: 10rpx 20rpx;
 			font-size: 32rpx;
 			font-size: 32rpx;
 			font-weight: bold;
 			font-weight: bold;
 			color: #FFFFFF;
 			color: #FFFFFF;
@@ -677,12 +714,23 @@
 	
 	
 	.honor {
 	.honor {
 		width: 33.3%;
 		width: 33.3%;
+		z-index: 99;
 		&-icon {
 		&-icon {
 			// width: 5;
 			// width: 5;
 			display: block;
 			display: block;
 			height: 200rpx;
 			height: 200rpx;
 			margin: 20rpx auto;
 			margin: 20rpx auto;
 		}
 		}
+		&-icons {
+			// width: 5;
+			display: block;
+			height: 200rpx;
+			width: 200rpx;
+			border: 1rpx solid #f46c85;
+			margin: 20rpx auto;
+			border-radius: 50%;
+			
+		}
 		&-name {
 		&-name {
 			text-align: center;
 			text-align: center;
 			font-size: 30rpx;
 			font-size: 30rpx;

+ 62 - 8
pages/modelData/modeltemplate/model_2.vue

@@ -103,15 +103,53 @@
 				</view>
 				</view>
 			</view>	
 			</view>	
 			</view>
 			</view>
-			<view class="hua4">
+			<view class="hua4" v-if="honorList && honorList.length > 0">
 				<view >
 				<view >
 					<view class="m-card">
 					<view class="m-card">
 						<view class="card-tit flex">
 						<view class="card-tit flex">
-							<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/ryxx.png'"  ></image>
+							<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/ryxx.png'" mode="heightFix" ></image>
 						</view>
 						</view>
 						<view class="flex" style="flex-wrap: wrap;justify-content: center;">
 						<view class="flex" style="flex-wrap: wrap;justify-content: center;">
 							<view class="honor " v-for="item in honorList">
 							<view class="honor " v-for="item in honorList">
-								<image :src="item.icon" mode="heightFix" class="honor-icon"></image>
+								<image :src="item.icon"  mode="heightFix" class="honor-icon"></image>
+								<view class="honor-name">
+									{{item.name}}
+								</view>
+							</view>
+						</view>
+						
+					</view>
+				</view>
+			</view>
+			
+			<view class="hua4" v-if="cardInfo.my_tutor && cardInfo.my_tutor.uid">
+				<view >
+					<view class="m-card">
+						<view class="card-tit flex">
+							<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/zyds.png'"   mode="heightFix"></image>
+						</view>
+						<view class="flex" style="flex-wrap: wrap;justify-content: center;"  @click="goDetail(cardInfo.my_tutor.show_template_id,cardInfo.my_tutor.uid)">
+							<view class="honor " >
+								<image :src="cardInfo.my_tutor.avatar" mode="heightFix" class="honor-icons"></image>
+								<view class="honor-name">
+									{{cardInfo.my_tutor.name}}
+								</view>
+							</view>
+						</view>
+						
+					</view>
+				</view>
+			</view>
+			
+			<view class="hua4" v-if="cardInfo.my_researcher && cardInfo.my_researcher.length > 0">
+				<view >
+					<view class="m-card">
+						<view class="card-tit flex">
+							<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/xzyjcy.png'"  mode="heightFix"></image>
+						</view>
+						<view class="flex" style="flex-wrap: wrap;justify-content: center;"  @click="goDetail(item.show_template_id,item.uid)">
+							<view class="honor " v-for="item in cardInfo.my_researcher">
+								<image :src="item.avatar" mode="heightFix" class="honor-icons"></image>
 								<view class="honor-name">
 								<view class="honor-name">
 									{{item.name}}
 									{{item.name}}
 								</view>
 								</view>
@@ -126,7 +164,7 @@
 				<view >
 				<view >
 					<view class="m-card">
 					<view class="m-card">
 						<view class="card-tit flex">
 						<view class="card-tit flex">
-							<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/zwpj.png'"  ></image>
+							<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/zwpj.png'"  mode="heightFix" ></image>
 						</view>
 						</view>
 						<view class="card-content">
 						<view class="card-content">
 							<rich-text :nodes="cardInfo.service_intro_content"></rich-text>
 							<rich-text :nodes="cardInfo.service_intro_content"></rich-text>
@@ -141,7 +179,7 @@
 			<view class="hua5" v-if="cardInfo.service_audit_imgs && cardInfo.service_audit_imgs.length > 0">
 			<view class="hua5" v-if="cardInfo.service_audit_imgs && cardInfo.service_audit_imgs.length > 0">
 				<view class="m-card">
 				<view class="m-card">
 					<view class="card-tit flex">
 					<view class="card-tit flex">
-						<image class="image" :src="baseURL + '/resource/icon/model2/wdzs.png'"  ></image>
+						<image class="image" :src="baseURL + '/resource/icon/model2/wdzs.png'"  mode="heightFix" ></image>
 					</view>
 					</view>
 					<view class="img-list flex">
 					<view class="img-list flex">
 						<image class="image" @click="$emit('openImage',saiitem)" :src="saiitem"  :key='ind'   v-for="(saiitem,ind) in cardInfo.service_audit_imgs"></image>
 						<image class="image" @click="$emit('openImage',saiitem)" :src="saiitem"  :key='ind'   v-for="(saiitem,ind) in cardInfo.service_audit_imgs"></image>
@@ -152,7 +190,7 @@
 			<view class="hua6">
 			<view class="hua6">
 				<view class="m-card">
 				<view class="m-card">
 					<view class="card-tit flex">
 					<view class="card-tit flex">
-						<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/fwnr.png'"  ></image>
+						<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/fwnr.png'"  mode="heightFix" ></image>
 					</view>
 					</view>
 					<view class="card-content">
 					<view class="card-content">
 						<view class="fw" :key='ind' v-for="(spaitem,ind) in cardInfo.service_project_ar">
 						<view class="fw" :key='ind' v-for="(spaitem,ind) in cardInfo.service_project_ar">
@@ -171,7 +209,7 @@
 				<view class="hua8">
 				<view class="hua8">
 					<view class="m-card" >
 					<view class="m-card" >
 						<view class="card-tit flex">
 						<view class="card-tit flex">
-							<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/fwzp.png'"  ></image>
+							<image class="image" v-if="baseURL" :src="baseURL + '/resource/icon/model2/fwzp.png'"  mode="heightFix" ></image>
 						</view>
 						</view>
 						<view class="img-list flex">
 						<view class="img-list flex">
 							<image  class="image" @click="$emit('openImage',siitem)" :src="siitem"  :key='ind' v-for="(siitem,ind) in cardInfo.service_imgs"></image>
 							<image  class="image" @click="$emit('openImage',siitem)" :src="siitem"  :key='ind' v-for="(siitem,ind) in cardInfo.service_imgs"></image>
@@ -295,6 +333,13 @@
 				}
 				}
 			}
 			}
 		},
 		},
+		methods: {
+			goDetail(mtype,uid) {
+				uni.navigateTo({
+					url:'/pages/user/model/model?mtype=' + mtype + '&uid=' + uid + '&type=2'
+				})
+			},
+		}
 	}
 	}
 </script>
 </script>
 
 
@@ -460,7 +505,7 @@
 			}
 			}
 
 
 			.image {
 			.image {
-				width: 213rpx;
+				// width: 213rpx;
 				height: 47rpx;
 				height: 47rpx;
 			}
 			}
 		}
 		}
@@ -746,6 +791,15 @@
 			height: 200rpx;
 			height: 200rpx;
 			margin: 20rpx auto;
 			margin: 20rpx auto;
 		}
 		}
+		&-icons {
+			// width: 5;
+			display: block;
+			height: 200rpx;
+			width: 200rpx;
+			border-radius: 50%;
+			border: 1rpx solid #ffc98f;
+			margin: 20rpx auto;
+		}
 		&-name {
 		&-name {
 			text-align: center;
 			text-align: center;
 			font-size: 30rpx;
 			font-size: 30rpx;

+ 44 - 9
pages/modelData/modeltemplate/model_3.vue

@@ -141,17 +141,38 @@
 					</view>
 					</view>
 				</view>
 				</view>
 			</view>
 			</view>
-			
-			<!-- <view class="flex">
-				<view></view>
-				<image v-if="baseURL" class="line" :src="baseURL + '/resource/model/model3/tap11.png'" mode="widthFix"></image>
+		</view>
+		<view class="content-text" v-if="cardInfo.my_tutor && cardInfo.my_tutor.uid">
+			<view class="flex margin-b-20">
+				<view class="name">
+					职业导师
+				</view>
+				<image v-if="baseURL" class="icon" :src="baseURL + '/resource/model/model3/tap13.png'" mode="widthFix"></image>
 			</view>
 			</view>
-			<view class="text margin-t-20">
-				<rich-text :nodes="cardInfo.service_intro_content"></rich-text>
+			<view class="flex" style="justify-content: center;flex-wrap: wrap;">
+				<view class="honor" @click="goDetail(cardInfo.my_tutor.show_template_id,cardInfo.my_tutor.uid)">
+					<image :src="cardInfo.my_tutor.avatar" mode="heightFix" class="honor-icons"></image>
+					<view class="honor-name">
+						{{cardInfo.my_tutor.name}}
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="content-text" v-if="cardInfo.my_researcher && cardInfo.my_researcher.length > 0">
+			<view class="flex margin-b-20">
+				<view class="name">
+					研究成员
+				</view>
+				<image v-if="baseURL" class="icon" :src="baseURL + '/resource/model/model3/tap13.png'" mode="widthFix"></image>
+			</view>
+			<view class="flex" style="justify-content: center;flex-wrap: wrap;">
+				<view class="honor" v-for="(fwitem,fwindex) in cardInfo.my_researcher" @click="goDetail(fwitem.show_template_id,fwitem.uid)">
+					<image :src="fwitem.avatar" mode="heightFix" class="honor-icons"></image>
+					<view class="honor-name">
+						{{fwitem.name}}
+					</view>
+				</view>
 			</view>
 			</view>
-			<view class="img-list flex">
-				<image class="image"  @click="$emit('openImage',siiitem)" :src="siiitem" mode="scaleToFill" :key='ind' v-for="(siiitem,ind) in cardInfo.service_intro_imgs"></image>
-			</view> -->
 		</view>
 		</view>
 		<view class="content-text">
 		<view class="content-text">
 			<view class="flex margin-b-20">
 			<view class="flex margin-b-20">
@@ -337,6 +358,13 @@
 				}
 				}
 			}
 			}
 		},
 		},
+		methods: {
+			goDetail(mtype,uid) {
+				uni.navigateTo({
+					url:'/pages/user/model/model?mtype=' + mtype + '&uid=' + uid + '&type=2'
+				})
+			},
+		}
 	}
 	}
 </script>
 </script>
 
 
@@ -737,6 +765,13 @@
 			height: 200rpx;
 			height: 200rpx;
 			margin: 20rpx auto;
 			margin: 20rpx auto;
 		}
 		}
+		&-icons {
+			width: 200rpx;
+			height: 200rpx;
+			border: 1rpx solid #266b9e;
+			border-radius: 50%;
+			margin: 20rpx auto;
+		}
 		&-name {
 		&-name {
 			text-align: center;
 			text-align: center;
 			font-size: 30rpx;
 			font-size: 30rpx;

+ 92 - 31
pages/modelData/modeltemplate/model_5.vue

@@ -20,7 +20,8 @@
 			</view>
 			</view>
 			<view class="contentBox">
 			<view class="contentBox">
 				<view class="titleImg">
 				<view class="titleImg">
-					<image class="titleImg1" :src="`${baseURL}/resource/user/user5/text4.png`" mode="scaleToFill"></image>
+					<image class="titleImg1" :src="`${baseURL}/resource/user/user5/text4.png`" mode="scaleToFill">
+					</image>
 				</view>
 				</view>
 				<view class="content">
 				<view class="content">
 					<view class="userName">
 					<view class="userName">
@@ -63,21 +64,22 @@
 						</view>
 						</view>
 					</view>
 					</view>
 				</view>
 				</view>
-				
+
 				<view class="position-relative">
 				<view class="position-relative">
-					
-					
+
+
 					<view class="typeTitleImg flex-center">
 					<view class="typeTitleImg flex-center">
-						<image :src="`${baseURL}/resource/user/user5/text1.png`" mode="scaleToFill" class="typeImage">
+						<image :src="`${baseURL}/resource/user/user5/text1.png`" mode="heightFix" class="typeImage">
 						</image>
 						</image>
 					</view>
 					</view>
 					<view class="flex-center padding-v-20 padding-c-20">
 					<view class="flex-center padding-v-20 padding-c-20">
 						<view class="areaList" v-if="cardInfo.is_china == 1">
 						<view class="areaList" v-if="cardInfo.is_china == 1">
-							<text  class="blue-text" :key='fwindex' v-for="(fwitem,fwindex) in cardInfo.service_area_all">
+							<text class="blue-text" :key='fwindex'
+								v-for="(fwitem,fwindex) in cardInfo.service_area_all">
 								{{fwitem}}{{fwindex ==(cardInfo.service_area_all.length -1) ?'': ''  }}
 								{{fwitem}}{{fwindex ==(cardInfo.service_area_all.length -1) ?'': ''  }}
 							</text>
 							</text>
 						</view>
 						</view>
-						<text  class="blue-text" v-if="cardInfo.is_china == 0">
+						<text class="blue-text" v-if="cardInfo.is_china == 0">
 							海外
 							海外
 						</text>
 						</text>
 						<text class="blue-text" v-if="cardInfo.is_china == 2">
 						<text class="blue-text" v-if="cardInfo.is_china == 2">
@@ -85,17 +87,18 @@
 						</text>
 						</text>
 					</view>
 					</view>
 					<view class="typeTitleImg flex-center">
 					<view class="typeTitleImg flex-center">
-						<image :src="`${baseURL}/resource/user/user5/text2.png`" mode="scaleToFill" class="typeImage">
+						<image :src="`${baseURL}/resource/user/user5/text2.png`" mode="heightFix" class="typeImage">
 						</image>
 						</image>
 					</view>
 					</view>
 					<view class="flex-center  padding-v-20 padding-c-20">
 					<view class="flex-center  padding-v-20 padding-c-20">
 						<text class="blue-text">
 						<text class="blue-text">
-							{{cardInfo.service_min_price}}元/{{ cardInfo.service_time_type_title && cardInfo.service_time_type_title.replace('每','')}}——{{cardInfo.service_max_price}}元/{{cardInfo.service_time_type_title && cardInfo.service_time_type_title.replace('每','')}}	
+							{{cardInfo.service_min_price}}元/{{ cardInfo.service_time_type_title && cardInfo.service_time_type_title.replace('每','')}}——{{cardInfo.service_max_price}}元/{{cardInfo.service_time_type_title && cardInfo.service_time_type_title.replace('每','')}}
 						</text>
 						</text>
 					</view>
 					</view>
-					<image :src="`${baseURL}/resource/user/user5/img2.png`" mode="scaleToFill" class="typeLeftLogo"></image>
+					<image :src="`${baseURL}/resource/user/user5/img2.png`" mode="scaleToFill" class="typeLeftLogo">
+					</image>
 					<view class="typeTitleImg flex-center" v-if="honorList.length > 0">
 					<view class="typeTitleImg flex-center" v-if="honorList.length > 0">
-						<image :src="`${baseURL}/resource/model/model5/honor.png`" mode="scaleToFill" class="typeImage">
+						<image :src="`${baseURL}/resource/model/model5/honor.png`" mode="heightFix" class="typeImage">
 						</image>
 						</image>
 					</view>
 					</view>
 					<view class="flex" style="padding: 30rpx 0;flex-wrap: wrap;justify-content: center;">
 					<view class="flex" style="padding: 30rpx 0;flex-wrap: wrap;justify-content: center;">
@@ -106,6 +109,33 @@
 							</view>
 							</view>
 						</view>
 						</view>
 					</view>
 					</view>
+					<view class="typeTitleImg flex-center" v-if="cardInfo.my_tutor && cardInfo.my_tutor.uid">
+						<image :src="`${baseURL}/resource/model/model5/zyds.png`" mode="heightFix" class="typeImage">
+						</image>
+					</view>
+					<view class="flex" style="padding: 30rpx 0;flex-wrap: wrap;justify-content: center;"
+						v-if="cardInfo.my_tutor && cardInfo.my_tutor.uid">
+						<view class="honor ">
+							<image :src="cardInfo.my_tutor.avatar" mode="heightFix" class="honor-icons"></image>
+							<view class="honor-name">
+								{{cardInfo.my_tutor.name}}
+							</view>
+						</view>
+					</view>
+					<view class="typeTitleImg flex-center"
+						v-if="cardInfo.my_researcher && cardInfo.my_researcher.length > 0">
+						<image :src="`${baseURL}/resource/model/model5/xzyjcys.png`" mode="heightFix" class="typeImage">
+						</image>
+					</view>
+					<view class="flex" style="padding: 30rpx 0;flex-wrap: wrap;justify-content: center;"
+						v-if="cardInfo.my_researcher && cardInfo.my_researcher.length > 0">
+						<view class="honor " v-for="item in cardInfo.my_researcher">
+							<image :src="item.avatar" mode="heightFix" class="honor-icons"></image>
+							<view class="honor-name">
+								{{item.name}}
+							</view>
+						</view>
+					</view>
 				</view>
 				</view>
 			</view>
 			</view>
 			<view class="footerBox">
 			<view class="footerBox">
@@ -129,7 +159,7 @@
 		props: {
 		props: {
 			honorList: {
 			honorList: {
 				type: Array,
 				type: Array,
-				default:()=>{
+				default: () => {
 					return []
 					return []
 				}
 				}
 			},
 			},
@@ -177,15 +207,19 @@
 					service_max_price: 49800,
 					service_max_price: 49800,
 					service_time_type_title: '每月',
 					service_time_type_title: '每月',
 					service_intro_content: '高级育婴师证|高级催乳师证|早产儿护理师母婴护理证|金牌月嫂证|产后恢复师证|公共营养师证|月子药膳调理师证|国际宝宝睡眠咨询师证|普通话二级甲等|中央广播电视大学学历|学前教育专业,深耕幼教十年,技能全面,性格活泼,有亲和力,做事干净利落,有很强的责任心。对宝宝有爱心,体贴新手妈妈。专业技能熟练。应急能力强。让家人放心、产妇舒心的坐好月子。',
 					service_intro_content: '高级育婴师证|高级催乳师证|早产儿护理师母婴护理证|金牌月嫂证|产后恢复师证|公共营养师证|月子药膳调理师证|国际宝宝睡眠咨询师证|普通话二级甲等|中央广播电视大学学历|学前教育专业,深耕幼教十年,技能全面,性格活泼,有亲和力,做事干净利落,有很强的责任心。对宝宝有爱心,体贴新手妈妈。专业技能熟练。应急能力强。让家人放心、产妇舒心的坐好月子。',
-					service_intro_imgs: ['https://api.myjie.cn/resource/user/user1/pj1.png',
-						'https://api.myjie.cn/resource/user/user1/pj2.png',
-						'https://api.myjie.cn/resource/user/user1/pj3.png',
-						'https://api.myjie.cn/resource/user/user1/pj4.png'
+					service_intro_imgs: ['https://api.myjie.cn/resource/model/goodimg/1.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/2.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/3.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/4.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/5.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/6.jpg',
 					],
 					],
-					service_audit_imgs: ['https://api.myjie.cn/resource/user/user1/zs1.png',
-						'https://api.myjie.cn/resource/user/user1/zs2.png',
-						'https://api.myjie.cn/resource/user/user1/zs3.png',
-						'https://api.myjie.cn/resource/user/user1/zs4.png'
+					service_audit_imgs: ['https://api.myjie.cn/resource/model/goodimg/6.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/7.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/8.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/9.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/10.png',
+						'https://api.myjie.cn/resource/model/goodimg/11.jpg',
 					],
 					],
 					service_project_ar: [{
 					service_project_ar: [{
 							title: '婴幼儿睡眠管理',
 							title: '婴幼儿睡眠管理',
@@ -225,15 +259,22 @@
 				}
 				}
 			},
 			},
 			no() {
 			no() {
-				const ar = this.cardInfo.no.split('');
-				// console.log(ar, 'ar')
+				const ar = this.cardInfo && this.cardInfo.no ? this.cardInfo.no.split('') : [];
 				if (ar.length > 0) {
 				if (ar.length > 0) {
 					return ar
 					return ar
 				} else {
 				} else {
 					return []
 					return []
 				}
 				}
+
 			}
 			}
 		},
 		},
+		methods: {
+			goDetail(mtype, uid) {
+				uni.navigateTo({
+					url: '/pages/user/model/model?mtype=' + mtype + '&uid=' + uid + '&type=2'
+				})
+			},
+		}
 	}
 	}
 </script>
 </script>
 
 
@@ -299,6 +340,7 @@
 			display: flex;
 			display: flex;
 			flex-direction: column;
 			flex-direction: column;
 			margin-top: -50rpx;
 			margin-top: -50rpx;
+
 			.noText {
 			.noText {
 				text-align: center;
 				text-align: center;
 				font-size: 21rpx;
 				font-size: 21rpx;
@@ -352,7 +394,7 @@
 		}
 		}
 
 
 		.typeImage {
 		.typeImage {
-			width: 189rpx;
+			// width: 189rpx;
 			height: 42rpx;
 			height: 42rpx;
 		}
 		}
 
 
@@ -363,12 +405,14 @@
 			left: 0;
 			left: 0;
 			bottom: 50rpx;
 			bottom: 50rpx;
 		}
 		}
-		.areaList{
+
+		.areaList {
 			display: flex;
 			display: flex;
 			flex-wrap: wrap;
 			flex-wrap: wrap;
 			justify-content: space-around;
 			justify-content: space-around;
 		}
 		}
-		.blue-text{
+
+		.blue-text {
 			flex-grow: 1;
 			flex-grow: 1;
 			font-size: 29rpx;
 			font-size: 29rpx;
 			text-align: center;
 			text-align: center;
@@ -376,24 +420,29 @@
 			line-height: 60rpx;
 			line-height: 60rpx;
 		}
 		}
 	}
 	}
-	.footerBox{
+
+	.footerBox {
 		display: flex;
 		display: flex;
 		flex-direction: column;
 		flex-direction: column;
 		padding: 25rpx;
 		padding: 25rpx;
-		.footerTitle{
+
+		.footerTitle {
 			width: 448rpx;
 			width: 448rpx;
 			height: 51rpx;
 			height: 51rpx;
 		}
 		}
-		.richtext{
+
+		.richtext {
 			color: #CBA892;
 			color: #CBA892;
 		}
 		}
 	}
 	}
-	.imageList{
-		.imageItem{
+
+	.imageList {
+		.imageItem {
 			width: 750rpx;
 			width: 750rpx;
 			height: 1000rpx;
 			height: 1000rpx;
 		}
 		}
 	}
 	}
+
 	// .honor {
 	// .honor {
 	// 	justify-content: center;
 	// 	justify-content: center;
 	// 	margin-bottom: 20rpx;
 	// 	margin-bottom: 20rpx;
@@ -405,17 +454,29 @@
 	// 	&-name {
 	// 	&-name {
 	// 		color: #0DF6F3;
 	// 		color: #0DF6F3;
 	// 		font-size: 30rpx;
 	// 		font-size: 30rpx;
-			
+
 	// 	}
 	// 	}
 	// }
 	// }
 	.honor {
 	.honor {
 		width: 33.3%;
 		width: 33.3%;
+
 		&-icon {
 		&-icon {
 			// width: 5;
 			// width: 5;
 			display: block;
 			display: block;
 			height: 200rpx;
 			height: 200rpx;
 			margin: 20rpx auto;
 			margin: 20rpx auto;
 		}
 		}
+
+		&-icons {
+			// width: 5;
+			display: block;
+			height: 200rpx;
+			width: 200rpx;
+			border-radius: 50%;
+			border: 1rpx solid #b8937b;
+			margin: 20rpx auto;
+		}
+
 		&-name {
 		&-name {
 			text-align: center;
 			text-align: center;
 			font-size: 30rpx;
 			font-size: 30rpx;

+ 684 - 0
pages/modelData/modeltemplate/model_6.vue

@@ -0,0 +1,684 @@
+<template>
+	<view class="mone">
+		<template v-if="baseURL">
+			<view class="user-top">
+				<image :src="cardInfo.avatar" mode="widthFix" class="avt"></image>
+				<image :src="`${baseURL}/resource/model/model6/bg2.png`" mode="" class="bg2"></image>
+				<image :src="`${baseURL}/resource/model/model6/bg1.png`" mode="" class="bg1"></image>
+			</view>
+
+			<view class="hx">
+				<view class="tit flex">
+					<view class="ling"></view>
+					<view>五大核心权益</view>
+					<view class="ling"></view>
+				</view>
+				<view class="hx-l flex">
+					<image v-for="i in 5" :key="i" :src="`${baseURL}/resource/model/model6/hx${i}.png`" mode=""></image>
+				</view>
+			</view>
+			<view class="hx" v-if="cardInfo.my_tutor && cardInfo.my_tutor.uid">
+				<view class="tit flex">
+					<view class="ling"></view>
+					<view>职业导师</view>
+					<view class="ling"></view>
+				</view>
+				<view class="cy-wrap flex">
+					<view class="cy-item" @click="goDetail(cardInfo.my_tutor.show_template_id,cardInfo.my_tutor.uid)">
+						<view class="cy">
+							<image class="logo" :src="cardInfo.my_tutor.avatar" mode="widthFix"></image>
+						</view>
+						<view class="name">{{ cardInfo.my_tutor.name }}</view>
+					</view>
+				</view>
+			</view>
+			<view class="hx" v-if="cardInfo.my_researcher.length > 0">
+				<view class="tit flex">
+					<view class="ling"></view>
+					<view>小组研究成员</view>
+					<view class="ling"></view>
+				</view>
+				<view class="cy-wrap flex">
+					<view class="cy-item" v-for="(item, index) in cardInfo.my_researcher" :key="index" @click="goDetail(item.show_template_id,item.uid)">
+						<view class="cy">
+							<image class="logo" :src="item.avatar" mode="aspectFit"></image>
+						</view>
+						<view class="name">{{ item.name }}</view>
+					</view>
+				</view>
+			</view>
+
+			<view class="hx">
+				<view class="tit flex">
+					<view class="ling"></view>
+					<view>六大报名须知</view>
+					<view class="ling"></view>
+				</view>
+				<view class="flow-list">
+					<view class="flow-item flex">
+						<view class="flow-no">1</view>
+						<view class="flow-text">已经完成国家基本证书考核</view>
+					</view>
+					<view class="flow-item flex">
+						<view class="flow-no">2</view>
+						<view class="flow-text">导师指导研究时间为1年</view>
+					</view>
+					<view class="flow-item flex">
+						<view class="flow-no">3</view>
+						<view class="flow-text">每个研究员一年只能申请一个导师</view>
+					</view>
+					<view class="flow-item flex">
+						<view class="flow-no">4</view>
+						<view class="flow-text">具体指导方式以导师规划为准</view>
+					</view>
+					<view class="flow-item flex">
+						<view class="flow-no">5</view>
+						<view class="flow-text">先申请对应导师的研究员,导师通过后指导关系才成立</view>
+					</view>
+					<view class="flow-item flex">
+						<view class="flow-no">6</view>
+						<view class="flow-text">报名后有{{ reBackdays }}天考核期,若不满意可申请解除关系,积分原路返回</view>
+					</view>
+				</view>
+			</view>
+			<view class="hx">
+				<view class="titt">
+					基本信息
+				</view>
+				<view class="base-info flex">
+					<view class="base-col">
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>姓名:{{ cardInfo.name || '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>籍贯:{{ cardInfo.ancestral_place || '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>民族:{{ cardInfo.minority || '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>学历:{{ cardInfo.education || '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>年龄:{{ cardInfo.age || '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>星座:{{ cardInfo.constellation || '暂无' }}</text>
+						</view>
+					</view>
+					<view class="base-col">
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>身高:{{ cardInfo.height ? cardInfo.height * 1 + '厘米' : '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>体重:{{ cardInfo.weight ? cardInfo.weight * 1 + 'kg' : '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>属相:{{ cardInfo.twelve || '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>服务年限:{{ cardInfo.work_year ? cardInfo.work_year + '年' : '暂无' }}</text>
+						</view>
+						<view class="base-item">
+							<text class="diamond"></text>
+							<text>服务次数:{{ cardInfo.service_count || 0 }}次</text>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="hx" v-if="honorList.length">
+				<view class="titt">
+					荣誉信息
+				</view>
+				<view class="honor-wrap flex">
+					<view class="honor-item" v-for="(item, index) in honorList" :key="index">
+						<image class="honor-icon" :src="item.icon" mode="heightFix"></image>
+						<view class="honor-name">{{ item.name }}</view>
+					</view>
+				</view>
+			</view>
+
+			<view class="hx">
+				<view class="tit flex">
+					<view class="ling"></view>
+					<view>自我评价</view>
+					<view class="ling"></view>
+				</view>
+				<view class="intro">
+					<rich-text :nodes="cardInfo.service_intro_content"></rich-text>
+				</view>
+				<view class="img-grid" v-if="cardInfo.service_intro_imgs && cardInfo.service_intro_imgs.length">
+					<image v-for="(img, index) in cardInfo.service_intro_imgs" :key="index" :src="img" mode="aspectFill"
+						@click="$emit('openImage', img)"></image>
+				</view>
+			</view>
+
+			<view class="hx" v-if="cardInfo.service_audit_imgs && cardInfo.service_audit_imgs.length">
+				<view class="tit flex">
+					<view class="ling"></view>
+					<view>我的证书</view>
+					<view class="ling"></view>
+				</view>
+				<view class="img-grid">
+					<image v-for="(img, index) in cardInfo.service_audit_imgs" :key="index" :src="img" mode="aspectFill"
+						@click="$emit('openImage', img)"></image>
+				</view>
+			</view>
+
+			<view class="hx" v-if="cardInfo.service_imgs && cardInfo.service_imgs.length">
+				<view class="tit flex">
+					<view class="ling"></view>
+					<view>服务照片</view>
+					<view class="ling"></view>
+				</view>
+				<view class="img-grid">
+					<image v-for="(img, index) in cardInfo.service_imgs" :key="index" :src="img" mode="aspectFill"
+						@click="$emit('openImage', img)"></image>
+				</view>
+			</view>
+		</template>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+	} from 'vuex';
+	export default {
+		props: {
+            reBackdays: {
+                type: Number,
+				default: 0
+            },
+			honorList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			// 浏览数量
+			shareNumber: {
+				type: Number,
+				default: 0
+			},
+			// 是否显示默认数据
+			isDefault: {
+				type: Boolean,
+				default: true
+			},
+			isShare: {
+				type: Boolean,
+				default: false
+			},
+			//1为模板2为用户
+			isLook: {
+				type: Number,
+				default: 0
+			},
+			templateDetail: {
+				type: Object,
+				default: () => {
+					return {}
+				}
+			},
+		},
+		data() {
+			return {
+				
+				fitLeft: ['小白、零基础', '想提升技术', '遇到职业瓶颈', '时间不充裕', '希望能快速上手'],
+				fitRight: ['缺乏系统知识', '转行/找工作', '需要名师指导', '希望打破圈层', '需要优质人脉'],
+				gainList: ['实战技术提升', '独立完成项目', '收益转化', '金牌导师团', '官方结业证', '优先推荐权'],
+				defaults: {
+					user_work_type_title: '母婴护理师',
+					name: '张红梅',
+					avatar: 'https://api.myjie.cn/resource/user/user5/model5.png',
+					age: '50',
+					height: '160',
+					weight: '55',
+					twelve: '牛',
+					work_year: '16',
+					constellation: '巨蟹座',
+					ancestral_place: '黑龙江',
+					minority: '汉族',
+					education: '大专',
+					service_area_all: ['全国'],
+					service_min_price: 29800,
+					service_max_price: 49800,
+					service_time_type_title: '每月',
+					service_intro_content: '高级育婴师证|高级催乳师证|早产儿护理师母婴护理证|金牌月嫂证|产后恢复师证|公共营养师证|月子药膳调理师证|国际宝宝睡眠咨询师证|普通话二级甲等|中央广播电视大学学历|学前教育专业,深耕幼教十年,技能全面,性格活泼,有亲和力,做事干净利落,有很强的责任心。对宝宝有爱心,体贴新手妈妈。专业技能熟练。应急能力强。让家人放心、产妇舒心的坐好月子。',
+					service_intro_imgs: [
+						'https://api.myjie.cn/resource/model/goodimg/4.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/5.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/6.jpg',
+					],
+					service_audit_imgs: ['https://api.myjie.cn/resource/model/goodimg/1.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/2.jpg',
+						'https://api.myjie.cn/resource/model/goodimg/3.jpg',
+					],
+					service_project_ar: [{
+							title: '婴幼儿睡眠管理',
+							content: '如:日夜颠倒、睡眠不规律、乳头混淆、奶睡、抱睡等问题,帮助宝爸宝妈规律孩子作息、解决婴幼儿喂养困扰,培养良好的生活、学习习惯。'
+						}, {
+							title: '特色月子餐',
+							content: '套用客户的一句话“养眼、养心更养胃”!家常菜、面食、点心、甜品、靓汤、五谷杂粮粥、婴幼儿花样辅食等。'
+						},
+						{
+							title: '早产儿特殊护理',
+							content: '包括早产儿基础护理、安全喂养方法、追赶性生长、消化与免疫系统等技能,根据宝宝具体情况给予早产儿家长的科学入户指导。'
+						},
+						{
+							title: '0-6岁早期教育',
+							content: '在婴孩最敏感最能接受的时期进行事半功倍的适时教育,针对不同年龄段的孩子,开发婴幼儿潜能的教育,为孩子多元化和健康人格打下良好基础。'
+						}
+					],
+					service_imgs: [
+							'https://api.myjie.cn/resource/model/goodimg/7.jpg',
+							'https://api.myjie.cn/resource/model/goodimg/8.jpg',
+							'https://api.myjie.cn/resource/model/goodimg/9.jpg',
+							'https://api.myjie.cn/resource/model/goodimg/10.png',
+							'https://api.myjie.cn/resource/model/goodimg/11.jpg'
+					],
+					is_type_audit: 1,
+					service_count: 121,
+					is_china: 2,
+					my_researcher: [{
+							avatar: 'https://api.myjie.cn/resource/user/user5/model5.png',
+							name: '母婴界'
+						},
+						{
+							avatar: 'https://api.myjie.cn/resource/user/user5/model5.png',
+							name: '母婴界'
+						},
+						{
+							avatar: 'https://api.myjie.cn/resource/user/user5/model5.png',
+							name: '母婴界'
+						},
+						{
+							avatar: 'https://api.myjie.cn/resource/user/user5/model5.png',
+							name: '母婴界'
+						},
+						{
+							avatar: 'https://api.myjie.cn/resource/user/user5/model5.png',
+							name: '母婴界'
+						},
+						{
+							avatar: 'https://api.myjie.cn/resource/user/user5/model5.png',
+							name: '母婴界'
+						}
+					],
+					my_tutor: {}
+				}
+			}
+		},
+		computed: {
+			...mapState(['baseURL']),
+			cardInfo() {
+				if (this.isDefault) {
+					return this.defaults
+				} else {
+					return this.templateDetail
+				}
+			},
+			memberList() {
+				const info = this.cardInfo || {}
+				const list = (info.researchers && info.researchers.length) ? info.researchers : (info.cyList || [])
+				return list.map(item => ({
+					avt: item.avt || item.avatar || '',
+					name: item.name || item.nickname || ''
+				}))
+			},
+			no() {
+				const ar = this.cardInfo && this.cardInfo.no ? this.cardInfo.no.split('') : [];
+				if (ar.length > 0) {
+					return ar
+				} else {
+					return []
+				}
+			},
+			
+		},
+		methods: {
+			goDetail(mtype,uid) {
+				uni.navigateTo({
+					url:'/pages/user/model/model?mtype=' + mtype + '&uid=' + uid + '&type=2'
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.mone {
+		background: #24160b;
+		
+		padding-bottom: 120rpx;
+	}
+
+	.user-top {
+		width: 750rpx;
+		height: 1026rpx;
+		position: relative;
+		overflow: hidden;
+		image {
+			display: block;
+		}
+
+		.bg1 {
+			width: 750rpx;
+			height: 970rpx;
+		}
+
+		.avt {
+			width: 420rpx;
+			// height: 645rpx;
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			right: 0;
+			margin: auto;
+			z-index: 1;
+		}
+
+		.bg2 {
+			width: 750rpx;
+			height: 94rpx;
+			position: absolute;
+			bottom: 0;
+			z-index: 2;
+		}
+	}
+
+	.hx {
+		background: #fdf6ee;
+		border: 13rpx solid #dea66d;
+		border-radius: 20rpx;
+		width: 692rpx;
+		margin: 0 auto 30rpx;
+		padding: 28rpx 16rpx 24rpx;
+		box-sizing: border-box;
+
+		.hx-l {
+			margin-top: 24rpx;
+			justify-content: space-between;
+
+			image {
+				width: 124rpx;
+				height: 180rpx;
+				flex-shrink: 0;
+			}
+		}
+	}
+	.titt {
+		background-image: url('https://api.myjie.cn/resource/model/model6/tit-bg.png');
+		background-repeat: no-repeat;
+		background-size: 100% 100%;
+		margin: auto;
+		width: 432rpx;
+		height: 88rpx;
+		color: #f7eaca;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.base-info {
+		margin-top: 28rpx;
+		padding: 0 6rpx 8rpx;
+		align-items: flex-start;
+	}
+
+	.base-col {
+		width: 50%;
+		box-sizing: border-box;
+		padding: 0 8rpx;
+	}
+
+	.base-item {
+		display: flex;
+		align-items: center;
+		font-size: 26rpx;
+		color: #3a2414;
+		line-height: 1.4;
+		margin-bottom: 22rpx;
+
+		.diamond {
+			width: 12rpx;
+			height: 12rpx;
+			margin-right: 12rpx;
+			border: 2rpx solid #3a2414;
+			transform: rotate(45deg);
+			flex-shrink: 0;
+			box-sizing: border-box;
+		}
+	}
+	.tit {
+		color: #68401d;
+		font-size: 30rpx;
+		font-weight: bold;
+		text-align: center;
+		justify-content: center;
+		align-items: center;
+
+		.ling {
+			width: 16rpx;
+			height: 16rpx;
+			transform: rotate(45deg);
+			background: #c99555;
+			margin: 0 24rpx;
+			flex-shrink: 0;
+		}
+	}
+
+
+	.cy-wrap {
+		flex-wrap: wrap;
+		// justify-content: flex-start;
+		justify-content: center;
+		padding: 10rpx 6rpx 0;
+		.cy-item {
+			width: 33.33%;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			margin-top: 24rpx;
+		}
+
+		.cy {
+			width: 168rpx;
+			height: 168rpx;
+			border: 6rpx solid #392516;
+			border-radius: 50%;
+			overflow: hidden;
+			box-sizing: border-box;
+			background: #392516;
+			.logo {
+				width: 168rpx;
+			}
+		}
+
+		.name {
+			margin-top: 12rpx;
+			max-width: 180rpx;
+			font-size: 26rpx;
+			color: #59371b;
+			text-align: center;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			white-space: nowrap;
+		}
+	}
+
+	.flow-list {
+		margin-top: 20rpx;
+		padding: 0 10rpx;
+	}
+
+	.flow-item {
+		align-items: center;
+		background: #fff;
+		border-radius: 40rpx;
+		padding: 16rpx 20rpx;
+		margin-bottom: 16rpx;
+
+		&:last-child {
+			margin-bottom: 0;
+		}
+	}
+
+	.flow-no {
+		width: 44rpx;
+		height: 44rpx;
+		line-height: 44rpx;
+		text-align: center;
+		border-radius: 50%;
+		background: linear-gradient(180deg, #e7c48a, #b8874a);
+		color: #fff;
+		font-size: 24rpx;
+		font-weight: bold;
+		flex-shrink: 0;
+		margin-right: 16rpx;
+	}
+
+	.flow-text {
+		flex: 1;
+		font-size: 26rpx;
+		color: #5c3a22;
+		line-height: 1.5;
+	}
+
+	.fit-wrap {
+		align-items: flex-start;
+		padding: 0 10rpx 6rpx;
+	}
+
+	.fit-col {
+		width: 50%;
+		box-sizing: border-box;
+		padding: 0 8rpx;
+	}
+
+	.fit-item {
+		display: flex;
+		align-items: center;
+		font-size: 26rpx;
+		color: #5c3a22;
+		line-height: 1.4;
+		margin-bottom: 18rpx;
+
+		.dot {
+			width: 14rpx;
+			height: 14rpx;
+			border-radius: 50%;
+			background: #c99555;
+			margin-right: 12rpx;
+			flex-shrink: 0;
+		}
+	}
+
+	.gain-wrap {
+		flex-wrap: wrap;
+		padding-top: 6rpx;
+	}
+
+	.gain-item {
+		width: 33.33%;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		margin-bottom: 24rpx;
+	}
+
+	.gain-icon {
+		width: 120rpx;
+		height: 120rpx;
+		border-radius: 50%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background: radial-gradient(circle at 40% 35%, #fff4d6, #e0b15a 45%, #8d6230);
+
+		.gain-icon-inner {
+			width: 64rpx;
+			height: 64rpx;
+			border-radius: 50%;
+			border: 4rpx solid rgba(255, 244, 214, 0.85);
+			box-sizing: border-box;
+		}
+	}
+
+	.gain-icon-1 {
+		background: radial-gradient(circle at 40% 35%, #f7f7f7, #c5c5c5 45%, #7a7a7a);
+	}
+
+	.gain-icon-2 {
+		background: radial-gradient(circle at 40% 35%, #f8e2cf, #d0926a 45%, #8a4e32);
+	}
+
+	.gain-name {
+		margin-top: 12rpx;
+		font-size: 24rpx;
+		color: #5c3a22;
+		text-align: center;
+		padding: 0 8rpx;
+	}
+
+	.honor-wrap {
+		flex-wrap: wrap;
+		justify-content: center;
+		padding-top: 10rpx;
+	}
+
+	.honor-item {
+		width: 33.33%;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		margin-bottom: 20rpx;
+	}
+
+	.honor-icon {
+		height: 140rpx;
+	}
+
+	.honor-name {
+		margin-top: 8rpx;
+		font-size: 24rpx;
+		color: #5c3a22;
+		text-align: center;
+		padding: 0 8rpx;
+	}
+
+	.intro {
+		margin-top: 20rpx;
+		padding: 0 16rpx;
+		font-size: 26rpx;
+		color: #5c3a22;
+		line-height: 1.7;
+		text-align: justify;
+	}
+
+	.img-grid {
+		display: flex;
+		flex-wrap: wrap;
+		justify-content: space-between;
+		padding: 20rpx 10rpx 0;
+
+		image {
+			width: 290rpx;
+			height: 220rpx;
+			border-radius: 12rpx;
+			margin-bottom: 16rpx;
+			background: #f3e6d6;
+		}
+	}
+</style>

+ 128 - 7
pages/set/kf/index.vue

@@ -1,11 +1,12 @@
 <template>
 <template>
 	<view class="chat-container">
 	<view class="chat-container">
 		<view class="header">
 		<view class="header">
-			<text class="title">{{name || '在线客服'}}</text>
-			<!-- <view class="status">
-				<text class="status-dot" :class="{ 'online': isConnected }"></text>
-				<text class="status-text">{{ isConnected ? '已连接' : '连接中...' }}</text> 
-			</view> -->
+			<view class="header-main flex">
+				<text class="title">{{ name || '在线客服' }}</text>
+				<view class="phone-btn" v-if="toUserInfo.mobile" @click="showPhonePopup">
+					<uni-icons type="phone-filled" size="22" color="#f65486"></uni-icons>
+				</view>
+			</view>
 		</view>
 		</view>
 		
 		
 		<scroll-view 
 		<scroll-view 
@@ -69,6 +70,17 @@
 				</view>
 				</view>
 			</view>
 			</view>
 		</view>
 		</view>
+
+		<view class="phone-mask" v-if="phonePopupShow" @click="phonePopupShow = false">
+			<view class="phone-popup" @click.stop="">
+				<view class="phone-number">{{ toUserInfo.mobile }}</view>
+				<view class="phone-actions">
+					<view class="phone-action" @click="copyPhone">复制电话</view>
+					<view class="phone-action call" @click="callPhone">拨打电话</view>
+				</view>
+				<view class="phone-cancel" @click="phonePopupShow = false">取消</view>
+			</view>
+		</view>
 	</view>
 	</view>
 </template>
 </template>
 
 
@@ -80,7 +92,7 @@
 		upload
 		upload
 	} from '@/api/set.js';
 	} from '@/api/set.js';
 	import { send, getRecordList } from '@/api/kf.js'
 	import { send, getRecordList } from '@/api/kf.js'
-	
+	import { getCommonUserCardInfo } from '@/api/model.js'
 	export default {
 	export default {
 		data() {
 		data() {
 			return {
 			return {
@@ -99,7 +111,9 @@
 				pollingTimer: null,
 				pollingTimer: null,
 				pollingInterval: 3000,
 				pollingInterval: 3000,
 				lastMessageId: 0,
 				lastMessageId: 0,
-				avatar: ''
+				avatar: '',
+				toUserInfo: { mobile: '' },
+				phonePopupShow: false
 			}
 			}
 		},
 		},
 		onLoad(opt) {
 		onLoad(opt) {
@@ -110,6 +124,7 @@
 			
 			
 			this.getRecordList()
 			this.getRecordList()
 			this.startPolling()
 			this.startPolling()
+			this.getCommonUserCardInfo(this.to_uid)
 			// this.connectWebSocket();
 			// this.connectWebSocket();
 		},
 		},
 		onUnload() {
 		onUnload() {
@@ -123,6 +138,37 @@
 			...mapState('user', ['userInfo'])
 			...mapState('user', ['userInfo'])
 		},
 		},
 		methods: {
 		methods: {
+			getCommonUserCardInfo(uid) {
+				getCommonUserCardInfo({uid: uid}).then(res => {
+					this.toUserInfo = res.data
+				})
+			},
+			showPhonePopup() {
+				if (!this.toUserInfo.mobile) {
+					return this.$api.msg('暂无电话')
+				}
+				this.phonePopupShow = true
+			},
+			copyPhone() {
+				const mobile = this.toUserInfo.mobile
+				uni.setClipboardData({
+					data: String(mobile),
+					success: () => {
+						this.phonePopupShow = false
+						uni.showToast({
+							title: '已复制',
+							icon: 'success'
+						})
+					}
+				})
+			},
+			callPhone() {
+				const mobile = this.toUserInfo.mobile
+				this.phonePopupShow = false
+				uni.makePhoneCall({
+					phoneNumber: String(mobile)
+				})
+			},
 			showTime(time) {
 			showTime(time) {
 				const date = new Date(time * 1000);
 				const date = new Date(time * 1000);
 				const today = new Date();
 				const today = new Date();
@@ -328,11 +374,29 @@
 		padding: 20rpx 30rpx;
 		padding: 20rpx 30rpx;
 		background-color: #FFFFFF;
 		background-color: #FFFFFF;
 		border-bottom: 1px solid $border-color-light;
 		border-bottom: 1px solid $border-color-light;
+
+		.header-main {
+			align-items: center;
+			justify-content: center;
+		}
 		
 		
 		.title {
 		.title {
 			font-size: $font-lg;
 			font-size: $font-lg;
 			color: $font-color-dark;
 			color: $font-color-dark;
 			font-weight: bold;
 			font-weight: bold;
+			max-width: 480rpx;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			white-space: nowrap;
+		}
+
+		.phone-btn {
+			margin-left: 12rpx;
+			width: 48rpx;
+			height: 48rpx;
+			display: flex;
+			align-items: center;
+			justify-content: center;
 		}
 		}
 		
 		
 		.status {
 		.status {
@@ -357,6 +421,63 @@
 			}
 			}
 		}
 		}
 	}
 	}
+
+	.phone-mask {
+		position: fixed;
+		left: 0;
+		right: 0;
+		top: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.45);
+		z-index: 999;
+		display: flex;
+		align-items: flex-end;
+		justify-content: center;
+	}
+
+	.phone-popup {
+		width: 100%;
+		background: #f5f5f5;
+		border-radius: 24rpx 24rpx 0 0;
+		padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
+		overflow: hidden;
+
+		.phone-number {
+			text-align: center;
+			padding: 30rpx;
+			font-size: 28rpx;
+			color: #999;
+			background: #fff;
+		}
+
+		.phone-actions {
+			background: #fff;
+			margin-bottom: 16rpx;
+		}
+
+		.phone-action {
+			height: 100rpx;
+			line-height: 100rpx;
+			text-align: center;
+			font-size: 32rpx;
+			color: #333;
+			border-top: 1rpx solid #f0f0f0;
+
+			&.call {
+				color: #f65486;
+				font-weight: bold;
+			}
+		}
+
+		.phone-cancel {
+			height: 100rpx;
+			line-height: 100rpx;
+			text-align: center;
+			font-size: 32rpx;
+			color: #333;
+			background: #fff;
+		}
+	}
 	
 	
 	.message-list {
 	.message-list {
 		flex: 1;
 		flex: 1;

+ 42 - 6
pages/set/userinfo.vue

@@ -26,14 +26,14 @@
 						<!-- <image class="img" src="../../static/icon/next1.png" mode="widthFix"></image> -->
 						<!-- <image class="img" src="../../static/icon/next1.png" mode="widthFix"></image> -->
 					</view>
 					</view>
 				</view>
 				</view>
-				<!-- <view class="flex listItem">
+				<view class="flex listItem" v-if="userIdentity.my_tutor && userIdentity.my_tutor.uid">
 					<view class="flex titleBox">
 					<view class="flex titleBox">
-						<text class="title">账户</text>
+						<text class="title">职业导师({{userIdentity.my_tutor.name}})</text>
 					</view>
 					</view>
-					<view class="right flex">
-						<text>{{userInfo.account}}</text>
+					<view class="right flex" @click="unbind">
+						<text>解除关系></text>
 					</view>
 					</view>
-				</view> -->
+				</view>
 			</view>
 			</view>
 		</view>
 		</view>
 		<view class="base-buttom" @click="confirm">提交</view>
 		<view class="base-buttom" @click="confirm">提交</view>
@@ -41,6 +41,11 @@
 </template>
 </template>
 
 
 <script>
 <script>
+	import {
+		userIdentity,
+		getUserIdentity,
+		researcherUnbind
+	} from '@/api/student.js'
 	import {
 	import {
 		mapState,
 		mapState,
 	} from 'vuex';
 	} from 'vuex';
@@ -52,15 +57,46 @@
 	export default {
 	export default {
 		data() {
 		data() {
 			return {
 			return {
-
+				userIdentity: {
+					is_tutor: 0, // 是否是导师
+					is_researcher: 0, // 是否是研究员
+					my_tutor: '', // 我的导师
+					my_researchers: [], // 我的研究员
+				},
 			}
 			}
 		},
 		},
 		onLoad() {
 		onLoad() {
+			this.getUserIdentity()
 		},
 		},
 		computed: {
 		computed: {
 			...mapState('user', ['userInfo'])
 			...mapState('user', ['userInfo'])
 		},
 		},
 		methods: {
 		methods: {
+			unbind() {
+				// researcherUnbind
+				let that = this
+				uni.showModal({
+					content:'确认与导师[' + that.userIdentity.my_tutor.name + ']解除关系?',
+					complete(e) {
+						if(e.confirm) {
+							researcherUnbind({
+								uid: that.userIdentity.my_tutor.uid
+							}).then(res => {
+								uni.showToast({
+									content: '解除成功',
+									icon: 'success'
+								})
+								that.getUserIdentity()
+							})
+						}
+					}
+				})
+			},
+			getUserIdentity() {
+				userIdentity({}).then(res => {
+					this.userIdentity = res.data;
+				})
+			},
 			imgsub() {
 			imgsub() {
 				upload({
 				upload({
 					filename: ''
 					filename: ''

+ 121 - 0
pages/student/dk.vue

@@ -0,0 +1,121 @@
+<template>
+	<view class="content">
+		<view class="item" v-for="(item, index) in dkList" :key="item.id || index">
+			<view class="time">{{ item.create_time_text || formatTime(item.create_time) }}</view>
+			<view class="row">打卡状态:已打卡</view>
+			<view class="row" v-if="item.content">工作记录:{{ item.content }}</view>
+			<!-- <view class="row loc" v-if="item.latitude && item.longitude" @click="openMap(item)">查看打卡地点</view> -->
+			<view class="row loc" v-if="item.latitude && item.longitude">打卡地点:{{ item.latitude }},{{ item.longitude }}</view>
+
+		</view>
+		<empty v-if="loaded && dkList.length === 0"></empty>
+		<uni-load-more v-else :status="loadingType"></uni-load-more>
+	</view>
+</template>
+
+<script>
+	import { tutorResearcherClockList } from '@/api/student.js'
+	export default {
+		data() {
+			return {
+				dkList: [],
+				uid: '',
+				page: 1,
+				pageSize: 10,
+				loading: false,
+				finished: false,
+				loaded: false
+			}
+		},
+		computed: {
+			loadingType() {
+				if (this.loading) return 'loading'
+				if (this.finished) return 'noMore'
+				return 'more'
+			}
+		},
+		onLoad(options) {
+			this.uid = options.uid
+			this.getDkList()
+		},
+		onReachBottom() {
+			this.getDkList()
+		},
+		methods: {
+			formatTime(time) {
+				if (!time) return ''
+				const date = new Date(Number(time) * 1000)
+				if (Number.isNaN(date.getTime())) return time
+				const y = date.getFullYear()
+				const m = String(date.getMonth() + 1).padStart(2, '0')
+				const d = String(date.getDate()).padStart(2, '0')
+				const h = String(date.getHours()).padStart(2, '0')
+				const min = String(date.getMinutes()).padStart(2, '0')
+				return `${y}-${m}-${d} ${h}:${min}`
+			},
+			getDkList() {
+				if (!this.uid || this.loading || this.finished) return
+				this.loading = true
+				tutorResearcherClockList({
+					researcher_uid: this.uid,
+					page: this.page,
+					pageSize: this.pageSize
+				}).then(res => {
+					const list = (res.data && res.data.list) || []
+					this.dkList = this.dkList.concat(list)
+					this.page++
+					this.finished = list.length < this.pageSize
+					this.loaded = true
+				}).catch(() => {
+					this.loaded = true
+				}).finally(() => {
+					this.loading = false
+				})
+			},
+			openMap(item) {
+				uni.openLocation({
+					latitude: Number(item.latitude),
+					longitude: Number(item.longitude),
+					name: '打卡地点',
+					address: item.content || ''
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		min-height: 100vh;
+		background: #f5f5f5;
+		padding: 20rpx 0 40rpx;
+		box-sizing: border-box;
+	}
+
+	.item {
+		width: 690rpx;
+		margin: 0 auto 20rpx;
+		background: #fff;
+		border-radius: 20rpx;
+		padding: 28rpx 30rpx;
+		box-sizing: border-box;
+
+		.time {
+			font-size: 30rpx;
+			font-weight: bold;
+			color: #333;
+			margin-bottom: 12rpx;
+		}
+
+		.row {
+			font-size: 26rpx;
+			color: #666;
+			line-height: 1.7;
+		}
+
+		.loc {
+			color: #ff629f;
+			margin-top: 8rpx;
+		}
+	}
+</style>

+ 383 - 0
pages/student/myStudent.vue

@@ -0,0 +1,383 @@
+<template>
+	<view class="content">
+		<view class="nav flex">
+			<view
+				class="nav-item"
+				v-for="(item, index) in navList"
+				:key="index"
+				:class="{ action: index == current }"
+				@click="tabChange(index)"
+			>
+				{{ item.tit }}
+			</view>
+		</view>
+		<scroll-view scroll-y class="list-wrap" :style="{ height: height }" @scrolltolower="getList">
+			<view class="card" v-for="(item, index) in navList[current].list" :key="item.id || index">
+				<view class="card-status" :class="'status-' + item.status">
+					{{ item.status_text || statusText(item.status) }}
+				</view>
+				<view class="card-main flex">
+					<image
+						class="avatar"
+						:src="item.researcher_avatar || 'https://api.myjie.cn/static/img/logo.png'"
+						mode="aspectFill"
+					></image>
+					<view class="info">
+						<view class="name clamp">{{ item.researcher_nickname || '微信用户' }}</view>
+						<view class="row">UID:{{ item.researcher_uid }}</view>
+						<view class="row" v-if="item.researcher_mobile">手机:{{ item.researcher_mobile }}</view>
+						<view class="row" v-if="item.work_type_title">职业:{{ item.work_type_title }}</view>
+						<view class="row" v-if="item.score">申请费:{{ item.score }}积分</view>
+						<view class="row" v-if="item.apply_time">申请时间:{{ item.apply_time }}</view>
+						<view class="row" v-if="item.deal_time">处理时间:{{ item.deal_time }}</view>
+						<view class="row" v-if="item.unbind_time">解除时间:{{ item.unbind_time }}</view>
+					</view>
+				</view>
+				<view class="card-btn flex" v-if="item.status == 0 || item.status == 1">
+					<template v-if="item.status == 0">
+						<view class="btn refuse" @click.stop="dealApply(index, 2)">拒绝</view>
+						<view class="btn agree" @click.stop="dealApply(index, 1)">同意</view>
+					</template>
+					<template v-else-if="item.status == 1">
+						<view class="btn detail" @click.stop="goDetail(index)">协助修改</view>
+						<view class="btn refuse" @click.stop="goDk(index)">打卡记录</view>
+					</template>
+				</view>
+			</view>
+			<empty v-if="navList[current].list.length == 0 && navList[current].loaded"></empty>
+			<uni-load-more v-else :status="navList[current].loading"></uni-load-more>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import {
+		researcherList,
+		researcherDeal,
+		researcherUnbind
+	} from '@/api/student.js'
+
+	export default {
+		data() {
+			return {
+				height: '',
+				current: 0,
+				navList: [{
+						tit: '我的研究员',
+						status: 1,
+						list: [],
+						loading: 'more',
+						page: 1,
+						pageSize: 10,
+						loaded: false
+					},
+					{
+						tit: '申请中',
+						status: 0,
+						list: [],
+						loading: 'more',
+						page: 1,
+						pageSize: 10,
+						loaded: false
+					},
+					{
+						tit: '已拒绝',
+						status: 2,
+						list: [],
+						loading: 'more',
+						page: 1,
+						pageSize: 10,
+						loaded: false
+					},
+					{
+						tit: '已解除',
+						status: 3,
+						list: [],
+						loading: 'more',
+						page: 1,
+						pageSize: 10,
+						loaded: false
+					}
+				]
+			}
+		},
+		onReady() {
+			const that = this
+			uni.getSystemInfo({
+				success: resu => {
+					const query = uni.createSelectorQuery()
+					query.select('.list-wrap').boundingClientRect()
+					query.exec(function(res) {
+						if (res && res[0]) {
+							that.height = resu.windowHeight - res[0].top + 'px'
+						}
+					})
+				}
+			})
+		},
+		onLoad() {
+			this.getList('re')
+		},
+		onShow() {
+			if (this.navList[this.current].loaded) {
+				this.getList('re')
+			}
+		},
+		methods: {
+			statusText(status) {
+				const map = {
+					0: '申请中',
+					1: '已同意',
+					2: '已拒绝',
+					3: '已解除'
+				}
+				return map[status] || ''
+			},
+			tabChange(index) {
+				this.current = index
+				this.getList('re')
+			},
+			getList(type) {
+				const that = this
+				const item = that.navList[that.current]
+				if (type == 're') {
+					item.page = 1
+					item.loading = 'more'
+					item.loaded = false
+					item.list = []
+				}
+				if (type == 'tab' && item.loaded) return
+				if (item.loading == 'noMore' || item.loading == 'loading') return
+				item.loading = 'loading'
+				researcherList({
+					status: item.status,
+					page: item.page,
+					pageSize: item.pageSize
+				}).then(res => {
+					const list = (res.data && res.data.list) || []
+					item.list = item.list.concat(list)
+					item.page++
+					item.loading = list.length == item.pageSize ? 'more' : 'noMore'
+					item.loaded = true
+				}).catch(() => {
+					item.loading = 'more'
+					item.loaded = true
+				})
+			},
+			dealApply(index, action) {
+				const that = this
+				const item = that.navList[that.current].list[index]
+				if (!item) return
+				uni.showModal({
+					title: '温馨提示',
+					content: action == 1 ? '确认同意该研究员申请?' : '确认拒绝该研究员申请?',
+					success(res) {
+						if (!res.confirm) return
+						researcherDeal({
+							apply_id: item.id,
+							action
+						}).then(() => {
+							that.$api.msg(action == 1 ? '已同意该申请' : '已拒绝该申请')
+							that.getList('re')
+						}).catch(err => {
+							uni.showToast({
+								title: (err && err.msg) || '操作失败',
+								icon: 'none'
+							})
+						})
+					}
+				})
+			},
+			unbind(index) {
+				const that = this
+				const item = that.navList[that.current].list[index]
+				if (!item) return
+				uni.showModal({
+					title: '温馨提示',
+					content: '确认解除与该研究员的关系?',
+					success(res) {
+						if (!res.confirm) return
+						researcherUnbind({
+							uid: item.researcher_uid
+						}).then(result => {
+							that.$api.msg((result && result.msg) || '解除成功')
+							that.getList('re')
+						}).catch(err => {
+							uni.showToast({
+								title: (err && err.msg) || '解除失败',
+								icon: 'none'
+							})
+						})
+					}
+				})
+			},
+			goDetail(index) {
+				const item = this.navList[this.current].list[index]
+				if (!item || item.status != 1) return
+				uni.navigateTo({
+					url: '/pages/student/studentDetail?uid=' + item.researcher_uid
+				})
+			},
+			goDk(index) {
+				const item = this.navList[this.current].list[index]
+				if (!item || item.status != 1) return
+				uni.navigateTo({
+					url: '/pages/student/dk?uid=' + item.researcher_uid
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	page {
+		background: #f5f5f5;
+	}
+
+	.content {
+		min-height: 100%;
+	}
+
+	.nav {
+		height: 88rpx;
+		background-color: #fff;
+
+		.nav-item {
+			flex: 1;
+			line-height: 88rpx;
+			text-align: center;
+			font-size: 28rpx;
+			color: #666;
+		}
+
+		.action {
+			font-weight: bold;
+			color: #333;
+			position: relative;
+
+			&::after {
+				content: '';
+				position: absolute;
+				left: 0;
+				right: 0;
+				bottom: 6rpx;
+				margin: auto;
+				width: 48rpx;
+				height: 6rpx;
+				background: #ff629f;
+				border-radius: 3rpx;
+			}
+		}
+	}
+
+	.list-wrap {
+		padding-top: 1rpx;
+		box-sizing: border-box;
+	}
+
+	.card {
+		width: 690rpx;
+		margin: 20rpx auto;
+		background: #fff;
+		border-radius: 20rpx;
+		padding: 30rpx;
+		box-sizing: border-box;
+		position: relative;
+
+		.card-status {
+			position: absolute;
+			right: 0;
+			top: 30rpx;
+			padding: 0 16rpx;
+			height: 40rpx;
+			line-height: 40rpx;
+			border-radius: 10rpx 0 0 10rpx;
+			font-size: 22rpx;
+			color: #fff;
+			background: #ff629f;
+
+			&.status-0 {
+				background: #ff9f43;
+			}
+
+			&.status-1 {
+				background: #31c98f;
+			}
+
+			&.status-2 {
+				background: #fd4664;
+			}
+
+			&.status-3 {
+				background: #999;
+			}
+		}
+
+		.card-main {
+			align-items: flex-start;
+		}
+
+		.avatar {
+			width: 100rpx;
+			height: 100rpx;
+			border-radius: 50%;
+			flex-shrink: 0;
+			background: #f0f0f0;
+		}
+
+		.info {
+			flex: 1;
+			margin-left: 20rpx;
+			padding-right: 90rpx;
+
+			.name {
+				font-size: 30rpx;
+				font-weight: bold;
+				color: #333;
+				margin-bottom: 10rpx;
+			}
+
+			.row {
+				font-size: 24rpx;
+				color: #888;
+				line-height: 1.6;
+			}
+		}
+
+		.card-btn {
+			justify-content: flex-end;
+			margin-top: 24rpx;
+			padding-top: 20rpx;
+			border-top: 1rpx solid #f0f0f0;
+
+			.btn {
+				min-width: 140rpx;
+				height: 60rpx;
+				line-height: 60rpx;
+				text-align: center;
+				border-radius: 30rpx;
+				font-size: 26rpx;
+				margin-left: 16rpx;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+
+			.agree {
+				background: #ff629f;
+				color: #fff;
+			}
+
+			.refuse {
+				background: #fff;
+				color: #fd4664;
+				border: 1rpx solid #fd4664;
+			}
+
+			.detail {
+				background: #fff;
+				color: #ff629f;
+				border: 1rpx solid #ff629f;
+			}
+		}
+	}
+</style>

+ 1287 - 0
pages/student/studentDetail.vue

@@ -0,0 +1,1287 @@
+<template>
+	<view class="content ">
+		<!-- <view class="errorIf" v-if="dataInitError">
+			初始化数据失败请重新填写数据
+		</view> -->
+		<!-- <view class="table flex" v-if="showModelType">
+			<text class="table-text" @click="updata.modelType=0" :class="{action:updata.modelType==0}">
+				图文模式
+			</text>
+			<text class="table-text" @click="updata.modelType=1" :class="{action:updata.modelType==1}">
+				纯图模式
+			</text>
+		</view> -->
+		<template>
+			<!-- <view class="item-name">
+				上传头像
+			</view>
+			<view class="con_box">
+				<view class="con_image">
+					<image class="img" v-if="modelid==7" @click="upImage('avatar',1)"
+						:src="updata.avatar||`../../../static/image/upImg.png`">
+					</image>
+					<image class="img" v-else @click="navCroper(400,400,'one')"
+						:src="updata.avatar||`../../../static/image/upImg.png`">
+					</image>
+				</view>
+			</view> -->
+			<view class="item-name">
+				基本信息
+			</view>
+			<view class="listBox">
+				<view class="list">
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text> <text class="title">真实姓名</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.name" type="text" placeholder="请填写真实姓名"
+								placeholder-class="placeholder" />
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">手机号</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.phone" type="text" placeholder="请填写手机号"
+								placeholder-class="placeholder" />
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">身份证号</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.cardId" type="text" placeholder="请填写身份证号"
+								placeholder-class="placeholder" />
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="title">从业时长</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.work_year" type="number" placeholder="请填写从业时长"
+								placeholder-class="placeholder" />
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="title">籍贯</text>
+						</view>
+						<view class="right flex">
+							<picker class="input" :range='jgList' mode="selector" @change="changeAncestralPlace"
+								range-key="name">
+								<view>
+									{{updata.ancestral_place||'选择籍贯'}}
+								</view>
+							</picker>
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="title">学历</text>
+						</view>
+						<view class="right flex">
+							<picker class="input" :range='educationList' mode="selector" @change="changeEducation">
+								<view>
+									{{updata.education||'选择学历'}}
+								</view>
+							</picker>
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="title">民族</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.minority" type="text" placeholder="请填写民族"
+								placeholder-class="placeholder" />
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="title">身高</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.height" type="number" placeholder="请填写身高"
+								placeholder-class="placeholder" />
+							<text class="margin-l-10 flex-shrink-false">厘米</text>
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="title">体重</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.weight" type="number" placeholder="请填写体重"
+								placeholder-class="placeholder" />
+							<text class="margin-l-10">kg</text>
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="title">出生日期</text>
+						</view>
+						<view class="right flex">
+							<picker class="input" value='2000-01-01' mode="date" @change="changetime">
+								<view>
+									{{updata.time||'请选择日期'}}
+								</view>
+							</picker>
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">职业</text>
+						</view>
+						<view class="right flex">
+							<picker class="input" :range='workTypeList' range-key='title' mode="selector"
+								@change="changeWorkType">
+								<view>
+									{{updata.word.title||'选择职业'}}
+								</view>
+							</picker>
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">收费类型</text>
+						</view>
+						<view class="right flex">
+							<picker class="input" :value="updata.timetype.ind" :range='timeTypeList' range-key='title'
+								mode="selector" @change="changetimetype">
+								<view>
+									{{updata.timetype.title||'收费时间类型'}}
+								</view>
+							</picker>
+						</view>
+					</view> -->
+					<view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">最低价</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.minMoney" type="number" placeholder="请输入最低收费价"
+								placeholder-class="placeholder" />
+						</view>
+					</view>
+					<view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">最高价</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.maxMoney" type="number" placeholder="请输入最高收费价"
+								placeholder-class="placeholder" />
+						</view>
+					</view>
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">服务次数</text>
+						</view>
+						<view class="right flex">
+							<input class="input" v-model="updata.service_count" type="number" placeholder="请输入已经服务的数量"
+								placeholder-class="placeholder" />
+						</view>
+					</view> -->
+
+					<!-- <view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="title">服务区域</text>
+						</view>
+						<view class="right flex">
+							<picker class="input" range-key='title' :range='areaType' mode="selector"
+								@change="changeAreaType">
+								<view>
+									{{areaType[actionAreaType].title}}
+								</view>
+							</picker>
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem" @click="chooseLng">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">定位地址</text>
+						</view>
+						<view class="right flex">
+							<text>{{updata.latitude ? (updata.latitude + ','+updata.longitude): '请选择定位'}}</text>
+						</view>
+					</view> -->
+					<!-- <view class="flex listItem" v-if="actionAreaType==1">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">服务区域</text>
+						</view>
+						<view class="right">
+							<view class="citylist">
+								<view class="flex margin-b-20" v-for="(item,ind) in updata.onCity" :key="ind">
+									<view></view>
+									<view>
+										{{item.province+item.city+item.district}}
+										<text class="margin-l-10 del" @click="updata.onCity.splice(ind,1)">
+											删除
+										</text>
+									</view>
+								</view>
+								<view class="flex">
+									<view></view>
+									<pickerAddress class="buttom" @change="onCityClick">添加地区</pickerAddress>
+								</view>
+							</view>
+
+						</view>
+					</view> -->
+					<view class="flex listItem">
+						<view class="flex titleBox">
+							<text class="font-color-red font-size-sm">✲</text><text class="title">服务内容</text>
+						</view>
+						<view class="right">
+							<checkbox-group @change="checkTypeChange">
+								<label class="flex timetype margin-b-10" v-for="(item,ind) in typeList" :key="item.id">
+									<view class="margin-r-10">{{item.title}}</view>
+									<view>
+										<checkbox :value="`${item.id}`" :checked="item.checked" />
+									</view>
+								</label>
+							</checkbox-group>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="item-name">
+				自我展示
+			</view>
+			<view class="listBox">
+				<view class="list">
+					<view class="listItem">
+						<editor id='editor' class="textarea" auto-height :maxlength='-1' @input='changeMyask'
+							type="text"
+							placeholder="自我评价\n\n本人从业***年,已经服务***名客户\n成长经历:\n从事母婴工作之前是做***行业的,于***年经过专业培训后进入母婴行业;先后学习了***\n性格特征:\n本人性格直爽,具有很强的服务意识,做事认真负责,擅长……类工作\n服务格言:\n全心全意服务好每一位客户">
+						</editor>
+					</view>
+				</view>
+				<view class="con_box">
+					<view class="con_image" v-for="(item,ind) in updata.imageList">
+						<image class="img" v-if="modelid==7" @click="upImage('imageList',3,ind)" :src="item"></image>
+						<image class="img" v-else @click="navCroper(400,400,'tab',ind)" :src="item"></image>
+
+						<image @click="updata.imageList.splice(ind,1)" class="tip"
+							src="/static/icon/goodsExit.png" mode="scaleToFill"></image>
+					</view>
+					<view class="con_image">
+						<image class="img" v-if="modelid==7" @click="upImage('imageList',2)"
+							src="/static/image/upImg.png"></image>
+						<image class="img" v-else @click="navCroper(400,400,'all')"
+							src="/static/image/upImg.png"></image>
+
+					</view>
+				</view>
+			</view>
+			<view class="item-name">
+				证书展示
+			</view>
+			<view class="listBox">
+				<view class="con_box">
+					<view class="con_image" v-for="(item,ind) in updata.service_audit_imgs">
+						<image class="img" @click="navCroper(400,400,'audit',ind)" :src="item"></image>
+						<image @click="updata.service_audit_imgs.splice(ind,1)" class="tip"
+							src="/static/icon/goodsExit.png" mode="scaleToFill"></image>
+					</view>
+					<view class="con_image">
+						<image class="img" @click="navCroper(400,400,'auditall')" src="/static/image/upImg.png">
+						</image>
+					</view>
+				</view>
+			</view>
+			<view class="item-name">
+				服务展示
+			</view>
+			<view class="listBox" >
+				<view class="con_box">
+					<view class="con_image" v-for="(item,ind) in updata.service_imgs">
+						<image class="img" @click="navCroper(400,400,'service',ind)" :src="item"></image>
+						<image @click="updata.service_imgs.splice(ind,1)" class="tip"
+							src="/static/icon/goodsExit.png" mode="scaleToFill"></image>
+					</view>
+					<view class="con_image">
+						<image class="img" @click="navCroper(400,400,'serviceall')"
+							src="/static/image/upImg.png">
+						</image>
+					</view>
+				</view>
+			</view>
+		</template>
+		<!-- <template v-else-if="updata.modelType==1">
+			<view class="item-name">
+				展示图片
+			</view>
+			<view class="listBox">
+				<view class="con_box">
+					<view class="con_image" v-for="(item,ind) in updata.model_imgs">
+						<image class="img" @click="navCroper(300,400,'model',ind)" :src="item"></image>
+						<image @click="updata.model_imgs.splice(ind,1)" class="tip"
+							src="../../../static/icon/goodsExit.png" mode="scaleToFill"></image>
+					</view>
+					<view class="con_image">
+						<image class="img" @click="navCroper(300,400,'modelall')" src="../../../static/image/upImg.png">
+						</image>
+					</view>
+				</view>
+			</view>
+		</template> -->
+		<view class="base-buttom flex">
+			<view class="updata flex flex-center" :class="{ 'bg-gray': loding }" @click="loding ? '' : confirm()">
+				提交修改
+			</view>
+			<!-- <view class="ylan flex flex-center" @click="look">
+				预览
+			</view> -->
+		</view>
+	</view>
+</template>
+
+<script>
+	import AllAddress from '@/components/wangding-pickerAddress/data.js'
+	import {
+		getServiceTimeTypeList,
+		getServiceTypeList,
+		subInfoAudit,
+		getUserWorkTypeList,
+		getUserCardInfo,
+		getCommonUserCardInfo
+	} from '@/api/model.js';
+	import {
+		isCardNo
+	} from '@/utils/rocessor.js';
+	import {
+		getAstro,
+		getShengXiao,
+		IdCard
+	} from '@/utils/twelve.js';
+	import {
+		mapState
+	} from "vuex"
+
+	import pickerAddress from '@/components/wangding-pickerAddress/wangding-pickerAddress.vue';
+
+	import {
+		addLng
+	} from '@/api/set.js'
+	
+	import { researcherCardInfo,tutorEditResearcherInfo} from '@/api/student.js'
+
+	export default {
+		components: {
+			pickerAddress
+		},
+		data() {
+			return {
+				latitude: '',
+				longitude: '',
+				// showModelType:false,//默认类型
+				// 初始化数据失败
+				dataInitError: false,
+				jgList: AllAddress,
+				// 上传数据
+				updata: {
+					// modelType: 0, //模板类型0为老类型,1为纯图片
+					// is_global: 0, //是否全国0是否1是是
+					// is_wm: '', //是否海外
+					// avatar: '', //用户头像
+					// name: '', //用户名称
+					// phone: '', //手机号
+					// cardId: '', //身份证号
+					minMoney: '', //最低价
+					maxMoney: '', //最高价
+					// height: '', //身高
+					// weight: '', //体重
+					checkedType: [], //选中的服务类型
+					// time: '', //出生日期
+					// timetype: {
+					// 	title: '',
+					// 	code: '',
+					// 	ind: 0 //默认0
+					// }, //选中的时间类型
+					// onCity: [], //选中的城市
+					mymask: '', //自评
+					imageList: [], //自评上传图片列表
+					// ancestral_place: '', //籍贯
+					// education: '', //学历
+					// minority: '', //民族
+					// work_year: '', //从业时长
+					// word: {
+					// 	title: '',
+					// 	id: ''
+					// },
+					service_audit_imgs: [], //我的证书
+					service_imgs: [], //服务展示
+					// model_imgs: [], //服务展示
+					// no: '',
+					// latitude: '',
+					// longitude: ''
+				},
+				typeList: [], //服务类型
+				timeTypeList: [], //时间类型
+				workTypeList: [], //工作类型
+				loding: false, //是否载入中
+				type: 0, //0为新增,1为修改2为商品页进入注册
+				userModelData: {}, //保存获取的用户模板
+				modelid: '', //保存要预览的模板id
+				educationList: ['小学', '初中', '高中', '大专', '本科', '研究生', '博士'], //学历列表
+				areaList: ['是', '否'], //保存是否国内国外
+				areaType: [{
+						title: '国外',
+						type: 2
+					},
+					{
+						title: '国内',
+						type: 1
+					},
+					{
+						title: '全国',
+						type: 3
+					}
+				],
+				editorCtx: '', //保存详情页面数据
+				actionAreaType: 1,
+				uid: ''
+			};
+		},
+		async onLoad(options) {
+			const that = this;
+			// that.modelid = options.modelid
+			// // 判断是否为隐藏赠送模板
+			// if (that.modelid == 6) {
+			// 	that.updata.modelType = 1;
+			// }
+			// console.log(that.modelid,'that.modelid')
+			// if (options.type == 1) {
+			// 	that.type = 1;
+			// } else if (options.type == 2) {
+			// 	that.type = 0
+			// }
+			this.uid = options.uid
+		},
+		onReady() {
+			const that = this;
+			// 保存对象
+			if (that.modelid != 6) {
+				this.$nextTick(() => {
+					uni.createSelectorQuery().select('#editor').context(async (res) => {
+						that.editorCtx = res.context
+						// console.log(that.editorCtx,'that.editorCtx');
+						// if (that.type == 1) {
+							await that.getUserCardInfo()
+						// }
+						that.init()
+					}).exec();
+				})
+			} else {
+				// if (that.type == 1) {
+					that.getUserCardInfo()
+				// }
+			}
+
+		},
+		computed: {
+			// #ifdef H5
+			...mapState(['urlFile']),
+			// #endif
+			...mapState(['baseURL']),
+		},
+		methods: {
+			// chooseLng() {
+			// 	let that = this
+			// 	uni.chooseLocation({
+			// 		success(res) {
+			// 			that.updata.latitude = res.latitude
+			// 			that.updata.longitude = res.longitude
+			// 			uni.setStorageSync('latitude', res.latitude)
+			// 			uni.setStorageSync('longitude', res.longitude)
+			// 			addLng({
+			// 				latitude: res.latitude,
+			// 				longitude: res.longitude
+			// 			}).then(res => {
+			// 				// this.$api.msg('修改成功');
+
+			// 			}).catch(err => {
+			// 				console.log(err);
+			// 			})
+			// 		},
+			// 		fail(err) { // 失败回调
+			// 			console.error('选择位置失败:', err)
+			// 		},
+			// 	})
+			// },
+			changeMyask({
+				detail
+			}) {
+				this.updata.mymask = detail.html;
+			},
+			// 选择学历
+			// changeEducation(res) {
+			// 	this.updata.education = this.educationList[res.detail.value];
+			// },
+			//修改地区类型
+			// changeAreaType(re) {
+			// 	this.actionAreaType = re.detail.value * 1;
+			// 	if (re.detail.value == '1') {
+			// 		this.updata.is_wm = this.areaList[1];
+			// 		return
+			// 	} else {
+			// 		this.updata.is_wm = this.areaList[0];
+			// 	}
+
+			// },
+			// 初始化
+			init() {
+				const that = this;
+				// getServiceTimeTypeList().then(
+				// 	(res) => {
+				// 		that.timeTypeList = res.data.list.map((arr) => {
+				// 			return arr
+				// 		})
+				// 		if (that.type == 0) {
+				// 			that.updata.timetype = that.timeTypeList[0];
+				// 		} else
+				// 		if (that.type == 1) {
+				// 			for (let i = 0; i < that.timeTypeList.length; i++) {
+				// 				if (that.timeTypeList[i].code == that.userModelData.service_type) {
+				// 					that.updata.timetype = that.timeTypeList[i]
+				// 					that.updata.timetype.ind = i;
+				// 					break
+				// 				}
+				// 			}
+				// 		}
+				// 	}
+				// ).catch(
+				// 	(res) => {
+				// 		console.log(res);
+				// 	}
+				// )
+				getServiceTypeList().then(
+					(res) => {
+						that.typeList = res.data.list
+						try {
+							if (that.userModelData.service_project_ar) {
+								for (let i = 0; i < that.userModelData.service_project_ar.length; i++) {
+									for (let a = 0; a < that.typeList.length; a++) {
+										if (+that.typeList[a].id == +that.userModelData.service_project_ar[i].id) {
+											that.typeList[a].checked = true;
+											that.updata.checkedType.push('' + that.typeList[a].id)
+										}
+									}
+								}
+							}
+						} catch (e) {
+							//TODO handle the exception
+						}
+					}
+				).catch(
+					(res) => {
+						console.log(res);
+					}
+				)
+				getUserWorkTypeList().then(
+					(res) => {
+						that.workTypeList = res.data.list
+						if (that.type == 0) {
+							that.updata.word = that.workTypeList[0];
+						} else if (that.type == 1) {
+							try {
+								if (that.userModelData.user_work_type_id) {
+									for (let i = 0; i < that.workTypeList.length; i++) {
+										if (that.workTypeList[i].id == that.userModelData.user_work_type_id) {
+											that.updata.word = that.workTypeList[i];
+											break
+										}
+									}
+								} else {
+									that.updata.word = that.workTypeList[0];
+								}
+							} catch (e) {
+								that.updata.word = that.workTypeList[0];
+							}
+						}
+					}
+				).catch(
+					(res) => {
+						console.log(res);
+					}
+				)
+			},
+			// 跳转查看预览页面
+			// look() {
+			// 	const that = this;
+			// 	if (!that.rendl()) {
+			// 		return
+			// 	}
+			// 	uni.showLoading({
+			// 		title: "生成预览中。。。",
+			// 		mask: true
+			// 	})
+			// 	setTimeout(function() {
+			// 		uni.hideLoading()
+			// 		// 获取生日
+			// 		const birthday = IdCard('' + that.updata.cardId, 1);
+			// 		// 复制选中的服务数组
+			// 		let arr = [...that.updata.checkedType]
+			// 		let pushar = [];
+			// 		that.typeList.forEach(
+			// 			(re) => {
+			// 				for (let i = 0; i < arr.length; i++) {
+			// 					if (+arr[i] == +re.id) {
+			// 						// 删除已选中的对象
+			// 						arr.splice(i, 1)
+			// 						pushar.push(re)
+			// 						break
+			// 					}
+			// 				}
+			// 			}
+			// 		)
+			// 		let data = {
+			// 			is_china: that.actionAreaType,
+			// 			name: that.updata.name,
+			// 			avatar: that.updata.avatar,
+			// 			age: IdCard(that.updata.cardId, 3),
+			// 			twelve: getShengXiao(birthday),
+			// 			work_year: that.updata.work_year,
+			// 			constellation: getAstro(...(birthday.split('-'))),
+			// 			ancestral_place: that.updata.ancestral_place,
+			// 			minority: that.updata.minority,
+			// 			education: that.updata.education,
+			// 			service_area_all: that.actionAreaType == 0 ? that.updata.onCity.map(
+			// 				(item) => {
+			// 					return item.province + item.city + item.district
+			// 				}
+			// 			) : (that.actionAreaType == 1 ? ['海外,海外,海外'] : ['全国,全国,全国']),
+			// 			service_min_price: that.updata.minMoney,
+			// 			service_max_price: that.updata.maxMoney,
+			// 			service_time_type_title: that.updata.timetype.title,
+			// 			service_intro_content: that.updata.mymask,
+			// 			service_intro_imgs: that.updata.imageList,
+			// 			service_audit_imgs: that.updata.service_audit_imgs,
+			// 			service_project_ar: pushar,
+			// 			service_imgs: that.updata.service_imgs,
+			// 			model_imgs: that.updata.model_imgs,
+			// 			no: that.updata.no,
+			// 			user_work_type_title: that.updata.word.title,
+			// 			service_count: that.updata.service_count,
+			// 			weight: that.updata.weight,
+			// 			height: that.updata.height
+			// 		}
+
+			// 		uni.setStorageSync('modeldata', data)
+			// 		uni.navigateTo({
+			// 			url: '/pages/user/model/model?mtype=' + that.modelid + '&type=1'
+			// 		})
+
+			// 	}, 1000);
+			// },
+			// 获取用户提交数据
+			getUserCardInfo() {
+				const that = this;
+				return new Promise((resolve, reject) => {
+					getCommonUserCardInfo({
+						uid: that.uid
+					}).then(
+						(data) => {
+							try {
+								const res = data.data;
+								// 存储返回用户数据
+								that.userModelData = res;
+								that.actionAreaType = res.is_china;
+								let onCity = [];
+								if (res.is_china == 1) {
+									for (let i = 0; i < res.service_area_all.length; i++) {
+										let arr = res.service_area_all[i];
+										if (arr.length > 0) {
+											onCity.push({
+												province: arr[0].name,
+												city: arr[1].name,
+												district: arr[2] ? arr[2].name : '市辖区'
+											})
+										}
+									}
+								};
+								that.updata = Object.assign(that.updata, {
+									modelType: that.modelid == 6 ? 1 : 0, //保存模板类型
+									is_wm: res.is_china == 0 ? '是' : '否', //是否海外
+									avatar: res.avatar, //用户头像
+									name: res.name, //用户名称
+									phone: res.mobile, //手机号
+									cardId: res.idcard, //身份证号
+									minMoney: res.service_min_price, //最低价
+									maxMoney: res.service_max_price, //最高价
+									time: res.birthday, //出生日期
+									onCity: onCity, //选中的城市
+									mymask: res.service_intro_content, //自评
+									imageList: res.service_intro_imgs, //自评上传图片列表
+									ancestral_place: res.ancestral_place, //籍贯
+									education: res.education, //学历
+									minority: res.minority, //民族
+									work_year: res.work_year, //从业时长
+									service_audit_imgs: res.service_audit_imgs, //我的证书
+									service_imgs: res.service_imgs, //服务展示
+									model_imgs: res.model_imgs, //服务展示
+									no: res.no,
+									service_count: res.service_count,
+									weight: res.weight * 1,
+									height: res.height,
+									latitude: res.latitude || '',
+									longitude: res.longitude || '',
+								})
+								let longitude = uni.getStorageSync('longitude') || ''
+								let latitude = uni.getStorageSync('latitude') || ''
+								if (latitude && longitude) {
+									that.updata.longitude = longitude
+									that.updata.latitude = latitude
+								}
+								if (that.modelid != 6) {
+									that.editorCtx.setContents({
+										html: res.service_intro_content
+									})
+								}
+
+								resolve('初始化数据成功')
+							} catch (e) {
+								console.log(e, 'eeee')
+								that.dataInitError = true;
+								//TODO handle the exception
+							}
+						}
+					).catch(
+						(res) => {
+							that.dataInitError = true;
+							reject(res)
+						}
+					)
+				})
+
+			},
+			// 选中的服务类型
+			checkTypeChange(type) {
+				this.updata.checkedType = type.detail.value;
+			},
+			// 选中的工作类型
+			changeWorkType(type) {
+				this.updata.word = this.workTypeList[type.detail.value];
+			},
+			// 选择时间类型
+			changetimetype(res) {
+				this.updata.timetype = this.timeTypeList[res.detail.value];
+			},
+			// 时间选择
+			changetime(time) {
+				this.updata.time = time.detail.value;
+			},
+			// 选择籍贯
+			changeAncestralPlace(val) {
+				this.updata.ancestral_place = this.jgList[val.detail.value].name;
+			},
+			// 选择省市区
+			onCityClick({
+				data
+			}) {
+				let address = {};
+				address.province = data[0];
+				address.city = data[1];
+				address.district = data[2];
+				this.updata.onCity.push(address)
+			},
+			upLoad(path) {
+				uni.showLoading({
+					title: '图片上传中',
+					mask: true
+				});
+				return new Promise((resolve, error) => {
+					uni.uploadFile({
+						url: this.baseURL + '/api/user/qiniuUpload', //仅为示例,非真实的接口地址
+						filePath: path,
+						name: 'file',
+						header: {
+							"token": uni.getStorageSync('token')
+						},
+						success: (uploadFileRes) => {
+							if ("string" === typeof uploadFileRes.data) {
+								resolve(JSON.parse(uploadFileRes.data).data)
+							} else {
+								resolve(uploadFileRes.data.data)
+							}
+						},
+						complete() {
+							uni.hideLoading()
+						}
+					});
+				})
+			},
+			// 图片裁切
+			/**
+			 * @param {Number} w 裁切宽度比例
+			 * @param {Number} h 裁切高度比例
+			 * @param {Number} mw 图片最小宽度
+			 * @param {Number} mh 图片最小高度
+			 * @param {String} url url修改
+			 */
+			navCroper(w, h, type, ind) {
+				let that = this;
+				let tt = (type == 'upimg' ? 2 : 1)
+				this.onImg(tt).then((url) => {
+					uni.navigateTo({
+						url: `../realName/cropper?width=${w}&height=${h}`,
+						events: {
+							uploadSuccess(res) {
+								that.upLoad(res).then((urldata) => {
+									if (type == 'one') {
+										that.updata.avatar = urldata.img
+									} else if (type == 'all') {
+										that.updata.imageList.push(urldata.img)
+									} else if (type == 'tab') {
+										that.updata.imageList.splice(ind, 1, urldata.img)
+									} else if (type == 'audit') {
+										that.updata.service_audit_imgs.splice(ind, 1, urldata.img)
+									} else if (type == 'auditall') {
+										that.updata.service_audit_imgs.push(urldata.img)
+									} else if (type == 'service') {
+										that.updata.service_imgs.splice(ind, 1, urldata.img)
+									} else if (type == 'serviceall') {
+										that.updata.service_imgs.push(urldata.img)
+									} else if (type == 'model') {
+										that.updata.model_imgs.splice(ind, 1, urldata.img)
+									} else if (type == 'modelall') {
+										that.updata.model_imgs.push(urldata.img)
+									}
+								})
+							}
+						},
+						success: function(res) {
+							// 通过eventChannel向被打开页面传送数据
+							res.eventChannel.emit('urlNext', {
+								url
+							})
+						}
+					})
+				})
+			},
+			upImage(name, type, ind) {
+				const that = this;
+				that.onImg(1).then((res) => {
+					console.log(res.tempFilePath, 'res');
+					that.upLoad(res.tempFilePath).then((urldata) => {
+						console.log(urldata, 'urldata');
+						if (type == 1) {
+							that.updata[name] = urldata.img
+						} else if (type == 2) {
+							that.updata[name].push(urldata.img)
+						} else if (type == 3) {
+							that.updata[name].splice(ind, 1, urldata.img)
+						}
+					})
+				})
+			},
+			onImg(type) {
+				const _this = this
+				return new Promise((ok, erro) => {
+					// 判断是否需要选择
+					if (type == 1) {
+						uni.showActionSheet({
+							itemList: ['拍照', '选择一张照片'],
+							success: function(res) {
+								_this.chooseImage(res.tapIndex).then((url) => {
+									ok(url)
+								}).catch((res) => {
+									erro(res)
+								})
+							},
+							fail: function(res) {
+								erro(res)
+							}
+						});
+					}
+					// 判断是否只需要拍照
+					if (type == 2) {
+						_this.chooseImage(0).then((url) => {
+							ok(url)
+						}).catch((res) => {
+							erro(res)
+						})
+					}
+				})
+
+			},
+			chooseImage: function(index) {
+				const _this = this
+				return new Promise((ok, error) => {
+					// 从相册/相机选择
+					// 如需直接开相机或直接选相册,请只使用一个选项
+					const sourceType = index === 0 ? ['camera'] : ['album'];
+					// #ifdef MP
+					uni.chooseMedia({
+						count: 1,
+						mediaType: ['image'],
+						sizeType: ['compressed'], //可以指定是原图还是压缩图,默认二者都有
+						sourceType: sourceType,
+						success(res) {
+							// 缓存文件路径
+							ok(res.tempFiles[0])
+						},
+						fail(err) {
+							uni.showModal({
+								title: '文件打开错误',
+								content: '请设置授权文件存储权限',
+								showCancel: false,
+							});
+							error(e)
+						}
+					})
+					// #endif
+					// #ifndef MP
+					uni.chooseImage({
+						count: 1, //默认9
+						sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+						sourceType: sourceType,
+						success: function(res) {
+							ok(res.tempFilePaths[0])
+						},
+						fail(e) {
+							uni.showModal({
+								title: '文件打开错误',
+								content: '请设置授权文件存储权限',
+								showCancel: false,
+							});
+							error(e)
+						}
+					});
+					// #endif
+
+				})
+			},
+			// 实名认证
+			confirm(e) {
+				const that = this;
+				if (!that.rendl()) {
+					return
+				}
+				that.loding = true;
+				tutorEditResearcherInfo({
+						researcher_uid: that.uid,
+						// modelType: that.updata.modelType,
+						// is_china: that.actionAreaType,
+						// avatar: that.updata.avatar,
+						// name: that.updata.name,
+						// mobile: that.updata.phone,
+						// idcard: that.updata.cardId,
+						// service_type: that.updata.timetype.code,
+						service_min_price: that.updata.minMoney,
+						service_max_price: that.updata.maxMoney,
+						// service_area: that.updata.is_wm == '是' ? ["海外,海外1,海外2"] : that.updata.onCity.map((item) => {
+						// 	return item.province + ',' + item.city + ',' + item.district;
+						// }),
+						service_project: that.updata.checkedType,
+						service_intro_content: that.updata.mymask,
+						service_intro_imgs: that.updata.imageList,
+						// work_year: that.updata.work_year,
+						// ancestral_place: that.updata.ancestral_place,
+						// education: that.updata.education,
+						// minority: that.updata.minority,
+						service_audit_imgs: that.updata.service_audit_imgs,
+						service_imgs: that.updata.service_imgs,
+						// model_imgs: that.updata.model_imgs,
+						// user_work_type_id: that.updata.word.id,
+						// service_count: that.updata.service_count,
+						// weight: that.updata.weight,
+						// height: that.updata.height
+					})
+					.then((e) => {
+						uni.showToast({
+							title: '修改成功',
+							icon: 'success'
+						})
+						that.loding = false;
+						setTimeout(()=> {
+							uni.navigateBack()
+						},1500)
+					})
+					.catch(err => {
+						this.loding = false;
+						console.log(err);
+					});
+			},
+			// 认证
+			rendl() {
+				const that = this;
+					// if (!that.updata.avatar) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请上传头像',
+					// 		showCancel: false,
+					// 	});
+					// 	return false
+					// }
+
+					// if (!that.updata.name) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请填写姓名',
+					// 		showCancel: false,
+					// 	});
+					// 	return false
+					// }
+					// if (!that.updata.cardId) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请填写身份证号',
+					// 		showCancel: false,
+					// 	});
+					// 	return
+					// } else if (!isCardNo(that.updata.cardId)) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请填写正确的身份证号',
+					// 		showCancel: false,
+					// 	});
+					// 	return false
+					// }
+					// if (!that.updata.phone) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请填写手机号',
+					// 		showCancel: false,
+					// 	});
+					// 	return false
+					// }
+					// if (!that.updata.timetype.code) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请选择收费时间类型',
+					// 		showCancel: false,
+					// 	});
+					// 	return false
+					// }
+					if (!that.updata.minMoney) {
+						uni.showModal({
+							title: '错误',
+							content: '请填写最低收费价',
+							showCancel: false,
+						});
+						return false
+					}
+					if (!that.updata.maxMoney) {
+						uni.showModal({
+							title: '错误',
+							content: '请填写最高收费价',
+							showCancel: false,
+						});
+						return false
+					}
+					// if (!that.updata.is_wm) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请选择服务区域是否海外',
+					// 		showCancel: false,
+					// 	});
+					// 	return
+					// }
+					// if (that.actionAreaType == 1 && that.updata.onCity.length == 0) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请选择服务区域',
+					// 		showCancel: false,
+					// 	});
+					// 	return false
+					// }
+					if (that.updata.checkedType.length == 0) {
+						uni.showModal({
+							title: '错误',
+							content: '请选择服务内容',
+							showCancel: false,
+						});
+						return false
+					}
+					// if (!that.updata.latitude) {
+					// 	uni.showModal({
+					// 		title: '错误',
+					// 		content: '请选择定位',
+					// 		showCancel: false,
+					// 	});
+					// 	return false
+					// }
+				
+				return true
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	.content,
+	page {
+		min-height: 100%;
+	}
+
+	.content {
+		padding-bottom: 150rpx;
+	}
+
+	.item-name {
+		margin: $page-row-spacing;
+		font-size: $font-lg;
+		font-weight: bold;
+		color: $font-color-dark;
+	}
+
+	.con_box {
+		margin: $page-row-spacing;
+
+		.con_image {
+			width: 150rpx;
+			height: 150rpx;
+			display: inline-block;
+			margin-right: 20rpx;
+			position: relative;
+
+			.img {
+				width: 100%;
+				height: 100%;
+			}
+
+			.tip {
+				position: absolute;
+				top: -10rpx;
+				right: -10rpx;
+				width: 30rpx;
+				height: 30rpx;
+				background-color: #FFF;
+				border-radius: 99rpx;
+			}
+		}
+	}
+
+	.listBox {
+		margin: $page-row-spacing;
+		margin-top: 30rpx;
+		border-radius: 20rpx;
+		overflow: hidden;
+		background-color: #FFFFFF;
+	}
+
+	.list {
+		.input {
+			text-align: right;
+			font-size: $font-base;
+			color: $color-gray;
+			width: 100%;
+		}
+
+		.listItem {
+			padding: 35rpx 40rpx;
+			border-bottom: 1px solid $page-color-light;
+
+			.ql-editor.ql-blank:before {
+				font-style: normal;
+			}
+
+			.textarea {
+				font-size: $font-base;
+				width: 100%;
+				word-wrap: break-word;
+				white-space: pre-line;
+				min-height: 9rem;
+			}
+		}
+
+		.listIconImg {
+			width: 36rpx;
+		}
+
+		.right {
+			color: $font-color-light;
+			font-size: $font-base;
+			flex-grow: 1;
+			justify-content: flex-end;
+
+			.timetype {
+				width: 100%;
+				justify-content: flex-end;
+			}
+
+			.citylist {
+				.del {
+					color: $color-red;
+					font-size: $font-sm;
+					border: 1px solid $color-red;
+					border-radius: 10rpx;
+					line-height: 1;
+					padding: 5rpx 15rpx;
+				}
+			}
+
+			.img {
+				width: 26rpx;
+			}
+
+			.buttom {
+				color: $base-color;
+				border: 1px solid $base-color;
+				border-radius: 10rpx;
+				line-height: 1;
+				padding: 10rpx 20rpx;
+			}
+		}
+
+		.titleBox {
+			.title {
+				color: $font-color-base;
+				font-size: $font-base;
+			}
+		}
+	}
+
+	.bg-gray {
+		background-color: $color-gray;
+	}
+
+	.base-buttom {
+		position: fixed;
+		bottom: 0rpx;
+		right: 0rpx;
+		left: 0rpx;
+		margin: 0;
+		padding: 0;
+		height: 100rpx;
+		border-radius: 0;
+
+		.updata,
+		.ylan {
+			width: 50%;
+			height: 100%;
+			justify-content: center;
+			flex-grow: 1;
+		}
+
+		.ylan {
+			background-color: #FFF;
+			color: $font-color-dark;
+		}
+	}
+
+	.errorIf {
+		font-size: $font-lg;
+		color: #F65486;
+		padding: 30rpx;
+	}
+
+	.table {
+		.table-text {
+			color: #F65486;
+			text-align: center;
+			flex-grow: 1;
+			padding: 30rpx;
+			border: 1px solid #F65486;
+
+			&.action {
+				background-color: #F65486;
+				color: #FFFFFF;
+			}
+		}
+	}
+</style>

+ 1 - 1
pages/user/jf/bill.vue

@@ -12,7 +12,7 @@
 			</view>
 			</view>
 			<view class="money-box flex" style="padding:20rpx;" >
 			<view class="money-box flex" style="padding:20rpx;" >
 				<!-- 积分商城 -->
 				<!-- 积分商城 -->
-				<view style="flex-grow: 1;text-align: left;" @click="navto('/pages/index/store')"></view>
+				<view style="flex-grow: 1;text-align: left;" @click="navto('/pages/user/jf/give')">积分互转</view>
 				<view style="flex-grow: 1;text-align: right;" @click="navto('/pages/user/jf/jfcz')">充值积分</view>
 				<view style="flex-grow: 1;text-align: right;" @click="navto('/pages/user/jf/jfcz')">充值积分</view>
 			</view>
 			</view>
 			<!-- <view class="money-box flex" style="padding:20rpx;" >
 			<!-- <view class="money-box flex" style="padding:20rpx;" >

+ 60 - 1
pages/user/jf/detail.vue

@@ -108,6 +108,9 @@
 		mapState,
 		mapState,
 		mapMutations
 		mapMutations
 	} from 'vuex';
 	} from 'vuex';
+	import {
+		share
+	} from '@/api/wx';
 	import {
 	import {
 		getProductDetail,
 		getProductDetail,
 		addToCart,
 		addToCart,
@@ -126,7 +129,8 @@
 				quantity: 1,
 				quantity: 1,
 				showAddressPopup: false,
 				showAddressPopup: false,
 				addresses: [],
 				addresses: [],
-				selectedAddress: null
+				selectedAddress: null,
+				shareData: {},
 			};
 			};
 		},
 		},
 		computed: {
 		computed: {
@@ -135,7 +139,49 @@
 				return this.product.price * this.quantity;
 				return this.product.price * this.quantity;
 			}
 			}
 		},
 		},
+		// #ifdef MP
+		onShareAppMessage(options) {
+			// 设置菜单中的转发按钮触发转发事件时的转发内容
+			let pages = getCurrentPages(); //获取加载的页面
+			let currentPage = pages[pages.length - 1]; //获取当前页面的对象
+			let url = currentPage.route; //当前页面url
+			let item = currentPage.options; //如果要获取url中所带的参数可以查看options
+			let shareObj = {
+				title: this.product.store_name, // 默认是小程序的名称(可以写slogan等)
+				path: '/pages/user/jf/detail?id=' + this.id + '&scene=' + (this.userInfo && this.userInfo.uid || ''), // 默认是当前页面,必须是以‘/’开头的完整路径
+				// imageUrl: this.shareData.img,
+				desc: this.shareData.content,
+				success: function(res) {
+					// 转发成功之后的回调
+					if (res.errMsg == 'shareAppMessage:ok') {}
+				},
+				fail: function() {
+					// 转发失败之后的回调
+					if (res.errMsg == 'shareAppMessage:fail cancel') {
+						// 用户取消转发
+					} else if (res.errMsg == 'shareAppMessage:fail') {
+						// 转发失败,其中 detail message 为详细失败信息
+					}
+				}
+			};
+			// 判断是否可以邀请
+			if (this.userInfo.uid) {
+				shareObj.path += '&spread=' + this.userInfo.uid;
+			}
+			// console.log(shareObj);
+			return shareObj;
+		},
+		// #endif
 		methods: {
 		methods: {
+			share() {
+				const that = this;
+				// 请求获取默认数据
+				share({}).then(({
+					data
+				}) => {
+					that.shareData = data
+				});
+			},
 			getProductDetail() {
 			getProductDetail() {
 				let that = this;
 				let that = this;
 				getProductDetail(that.id).then(res => {
 				getProductDetail(that.id).then(res => {
@@ -239,6 +285,19 @@
 			this.id = opt.id
 			this.id = opt.id
 			this.getProductDetail()
 			this.getProductDetail()
 			this.getAddresses()
 			this.getAddresses()
+			this.share()
+			if (opt.spread) {
+				uni.setStorageSync('spread', opt.spread);
+			}
+			// #ifdef MP
+			if (opt.scene) {
+				// 存储小程序邀请人
+				uni.setStorage({
+					key: 'spread_code',
+					data: opt.scene
+				});
+			}
+			// #endif
 		}
 		}
 	};
 	};
 </script>
 </script>

+ 338 - 0
pages/user/jf/give.vue

@@ -0,0 +1,338 @@
+<template>
+	<view class="content">
+		<view class="points-header">
+			<text class="points-count">{{ userInfo.score || '0' }}</text>
+			<text class="points-label">我的积分</text>
+		</view>
+
+		<view class="form-box">
+			<view class="form-item">
+				<text class="label">收款人UID</text>
+				<input
+					class="input"
+					type="number"
+					v-model="keyword"
+					placeholder="请输入收款人UID"
+					placeholder-class="placeholder"
+				/>
+			</view>
+
+			<view class="user-card" v-if="targetUser">
+				<image
+					class="avatar"
+					:src="targetUser.avatar || 'https://api.myjie.cn/static/img/logo.png'"
+					mode="aspectFill"
+				></image>
+				<view class="user-info">
+					<text class="nickname">{{ targetUser.nickname || '微信用户' }}</text>
+					<text class="uid">UID:{{ targetUser.uid }}</text>
+				</view>
+			</view>
+			<view class="user-tip" v-else-if="keyword && searched && !searching">
+				<text>未找到该用户,请检查UID</text>
+			</view>
+			<view class="user-tip" v-else-if="searching">
+				<text>搜索中...</text>
+			</view>
+
+			<view class="form-item">
+				<text class="label">转账积分</text>
+				<input
+					class="input"
+					type="number"
+					v-model="score"
+					placeholder="请输入转账积分数(整数)"
+					placeholder-class="placeholder"
+				/>
+			</view>
+
+			<view class="form-item">
+				<text class="label">备注</text>
+				<input
+					class="input"
+					type="text"
+					v-model="mono"
+					placeholder="选填"
+					placeholder-class="placeholder"
+					maxlength="50"
+				/>
+			</view>
+		</view>
+
+		<view class="submit-btn" :class="{ disabled: submitting }" @click="submit">确认转账</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex';
+	import {
+		getUserInfo,
+		searchTransferUser,
+		scoreTransfer
+	} from '@/api/user.js';
+
+	export default {
+		data() {
+			return {
+				keyword: '',
+				score: '',
+				mono: '',
+				targetUser: null,
+				searching: false,
+				searched: false,
+				submitting: false,
+				searchTimer: null
+			};
+		},
+		computed: {
+			...mapState('user', ['userInfo', 'hasLogin'])
+		},
+		onShow() {
+			this.refreshUserInfo();
+		},
+		methods: {
+			...mapMutations('user', ['setUserInfo']),
+			refreshUserInfo() {
+				getUserInfo().then(res => {
+					this.setUserInfo(res.data);
+				});
+			},
+			onKeywordInput(e) {
+				const value = (e.detail.value || '').trim();
+				this.keyword = value;
+				this.targetUser = null;
+				this.searched = false;
+				if (this.searchTimer) {
+					clearTimeout(this.searchTimer);
+					this.searchTimer = null;
+				}
+				if (!value) {
+					this.searching = false;
+					return;
+				}
+				this.searchTimer = setTimeout(() => {
+					this.searchUser(value);
+				}, 400);
+			},
+			searchUser(keyword) {
+				this.searching = true;
+				searchTransferUser({
+						keyword
+					})
+					.then(({
+						data
+					}) => {
+						let user = null;
+						if (Array.isArray(data)) {
+							user = data[0] || null;
+						} else if (data && (data.uid || data.nickname || data.avatar)) {
+							user = data;
+						} else if (data && data.user) {
+							user = data.user;
+						} else if (data && data.list && data.list.length) {
+							user = data.list[0];
+						}
+						this.targetUser = user;
+						this.searched = true;
+					})
+					.catch(() => {
+						this.targetUser = null;
+						this.searched = true;
+					})
+					.finally(() => {
+						this.searching = false;
+					});
+			},
+			submit() {
+				const that = this;
+				if (that.submitting) return;
+
+				if (!that.keyword) {
+					return that.$api.msg('请输入收款人UID');
+				}
+				// if (!that.targetUser || !that.targetUser.uid) {
+				// 	return that.$api.msg('请先确认收款人信息');
+				// }
+				if (String(that.keyword) === String(that.userInfo.uid)) {
+					return that.$api.msg('不能给自己转账');
+				}
+
+				const score = parseInt(that.score, 10);
+				if (!score || score <= 0 || String(score) !== String(that.score).trim()) {
+					return that.$api.msg('请输入有效的整数积分');
+				}
+				if (score > Number(that.userInfo.score || 0)) {
+					return that.$api.msg('积分余额不足');
+				}
+
+				uni.showModal({
+					title: '确认转账',
+					content: `向「UID:${that.keyword}」转账 ${score} 积分?`,
+					success(res) {
+						if (!res.confirm) return;
+						that.submitting = true;
+						const payload = {
+							to_uid: that.keyword,
+							score
+						};
+						if (that.mono && that.mono.trim()) {
+							payload.mono = that.mono.trim();
+						}
+						scoreTransfer(payload)
+							.then(() => {
+								that.$api.msg('转账成功');
+								that.score = '';
+								that.mono = '';
+								that.refreshUserInfo();
+								setTimeout(() => {
+									uni.navigateBack({
+										fail() {
+											uni.redirectTo({
+												url: '/pages/user/jf/bill'
+											});
+										}
+									});
+								}, 1200);
+							})
+							.catch(() => {})
+							.finally(() => {
+								that.submitting = false;
+							});
+					}
+				});
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	page {
+		height: 100%;
+		background-color: #F5F5F5;
+	}
+
+	.content {
+		min-height: 100%;
+	}
+
+	.points-header {
+		height: 200rpx;
+		background-color: #f65486;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		color: #FFFFFF;
+
+		.points-count {
+			font-size: 60rpx;
+			font-weight: bold;
+			margin-bottom: 10rpx;
+		}
+
+		.points-label {
+			font-size: 28rpx;
+		}
+	}
+
+	.form-box {
+		margin: 30rpx;
+		margin-top: -30rpx;
+		border-radius: 20rpx;
+		padding: 10rpx 30rpx 30rpx;
+		background-color: #FFFFFF;
+		position: relative;
+		box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
+	}
+
+	.form-item {
+		padding: 28rpx 0;
+		border-bottom: 1rpx solid #EEEEEE;
+
+		&:last-child {
+			border-bottom: none;
+		}
+
+		.label {
+			display: block;
+			font-size: 26rpx;
+			color: #666666;
+			margin-bottom: 16rpx;
+		}
+
+		.input {
+			height: 64rpx;
+			font-size: 30rpx;
+			color: #333333;
+		}
+
+		.placeholder {
+			color: #CCCCCC;
+		}
+	}
+
+	.user-card {
+		display: flex;
+		align-items: center;
+		padding: 24rpx;
+		margin: 10rpx 0 10rpx;
+		background-color: #FFF5F8;
+		border-radius: 16rpx;
+		border: 1rpx solid #FFE0EA;
+
+		.avatar {
+			width: 88rpx;
+			height: 88rpx;
+			border-radius: 50%;
+			flex-shrink: 0;
+			background-color: #EEEEEE;
+		}
+
+		.user-info {
+			margin-left: 20rpx;
+			display: flex;
+			flex-direction: column;
+
+			.nickname {
+				font-size: 30rpx;
+				font-weight: bold;
+				color: #333333;
+				margin-bottom: 8rpx;
+			}
+
+			.uid {
+				font-size: 24rpx;
+				color: #999999;
+			}
+		}
+	}
+
+	.user-tip {
+		padding: 16rpx 0 8rpx;
+
+		text {
+			font-size: 24rpx;
+			color: #f65486;
+		}
+	}
+
+	.submit-btn {
+		margin: 50rpx 30rpx;
+		height: 90rpx;
+		background-color: #f65486;
+		border-radius: 45rpx;
+		font-size: 32rpx;
+		font-weight: bold;
+		color: #FFFFFF;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+
+		&.disabled {
+			opacity: 0.6;
+		}
+	}
+</style>

+ 552 - 93
pages/user/model/model.vue

@@ -1,18 +1,31 @@
 <template>
 <template>
 	<view class="content mone" v-if="baseURL">
 	<view class="content mone" v-if="baseURL">
 		<model :modelId='mtype' :templateData='userTemplate' :isShare='isShare' :isLook='isLook' :isDefault='isDefault'
 		<model :modelId='mtype' :templateData='userTemplate' :isShare='isShare' :isLook='isLook' :isDefault='isDefault'
-			:share-number='shareNumber' :honorList="honor_list"></model>
+			:share-number='shareNumber' :honorList="honor_list" :reBackdays="researcherMyApply.tutor_unbind_days" :stype="type" >
+		</model>
+		<!-- 分享进入 -->
 		<view class="fxmp flex bottom" v-if="type==2">
 		<view class="fxmp flex bottom" v-if="type==2">
-			<button class="share" type="default" open-type="share">
+			<button class="share" type="default" open-type="share" v-if="mtype != 8">
 				分享名片
 				分享名片
 			</button>
 			</button>
 			<view class="nav-model pink" @click="payPhone" v-if="mtype ==5">
 			<view class="nav-model pink" @click="payPhone" v-if="mtype ==5">
 				拨打电话
 				拨打电话
 			</view>
 			</view>
 			<view class="nav-model" @click="navto('/pages/user/model/model?mtype=' + mtype+'&type=0')"
 			<view class="nav-model" @click="navto('/pages/user/model/model?mtype=' + mtype+'&type=0')"
-				v-if="mtype != 3">
+				v-if="mtype != 3 && mtype != 8 && mtype != 7">
 				生成我的名片
 				生成我的名片
 			</view>
 			</view>
+			<view class="nav-model" v-if="mtype == 7 && userInfo.work_type_id && userInfo.info_audit_status == 1"
+				@click="goBlackGoldApply">
+				{{ blackGoldMyApply.is_black_gold == 0 ? (blackGoldMyApply.has_wait == 0 ? '申请匠心模板' : '匠心模板申请中'):'我的模板' }}
+			</view>
+			<view class="nav-model" @click="navto('/pages/user/model/modelrz?modelid='+userInfo.show_template_id)"
+				v-if="mtype == 7 && hasLogin && userInfo.info_audit_status==-2">
+				立即认证
+			</view>
+			<view class="nav-model" v-if="mtype == 7 && hasLogin && userInfo.info_audit_status==0">
+				资料审核中
+			</view>
 			<template v-else-if="mtype == 3">
 			<template v-else-if="mtype == 3">
 				<view class="nav-model" @click="navto('/pages/user/model/modelrz?modelid='+userInfo.show_template_id)"
 				<view class="nav-model" @click="navto('/pages/user/model/modelrz?modelid='+userInfo.show_template_id)"
 					v-if=" hasLogin && userInfo.info_audit_status==-2">
 					v-if=" hasLogin && userInfo.info_audit_status==-2">
@@ -20,7 +33,8 @@
 				</view>
 				</view>
 				<view class="nav-model" @click="navto('/pages/user/model/mymodellist')"
 				<view class="nav-model" @click="navto('/pages/user/model/mymodellist')"
 					v-if=" hasLogin && userInfo.info_audit_status==1">
 					v-if=" hasLogin && userInfo.info_audit_status==1">
-					查看我的名片
+					<!-- 查看我的名片 -->
+					我的模板
 				</view>
 				</view>
 				<view class="nav-model" v-if=" hasLogin && userInfo.info_audit_status==0">
 				<view class="nav-model" v-if=" hasLogin && userInfo.info_audit_status==0">
 					资料审核中
 					资料审核中
@@ -29,7 +43,34 @@
 					生成我的名片
 					生成我的名片
 				</view>
 				</view>
 			</template>
 			</template>
+			<template v-else-if="mtype == 8">
+				<!-- userIdentity: {
+					is_tutor: 0, // 是否是导师
+					is_researcher: 0, // 是否是研究员
+					my_tutor: '', // 我的导师
+					my_researchers: [], // 我的研究员
+				}, -->
+				<!-- 普通阿姨 非本人 -->
+
+				<view class="nav-model gold"
+					v-if="hasLogin && userInfo.info_audit_status==1 && userIdentity.is_tutor == 0 && userInfo.uid != uid"
+					@click="tutorMyApply.has_wait == 0?gotutorApply():''">
+					{{ tutorMyApply.has_wait == 0 ? '申请成为职业导师' : '职业导师申请中' }}
+				</view>
+				<button class="shares" type="default" open-type="share" v-else>
+					分享名片
+				</button>
+				<view class="nav-model black"
+					v-if="hasLogin && userInfo.info_audit_status==1 && userIdentity.is_researcher == 0 && userInfo.uid != uid"
+					@click="researcherMyApply.has_wait == 0?goResearcherApply():''">
+					{{ researcherMyApply.has_wait == 0 ? '申请成为研究员' : '研究员申请中' }}
+				</view>
+				<view class="nav-model black" v-if="hasLogin && userIdentity.is_researcher == 1 &&  userIdentity.my_tutor &&  userIdentity.my_tutor.uid == uid" @click="unbind">
+					解除关系
+				</view>
+			</template>
 		</view>
 		</view>
+		<!-- 个人中心查看本人模板 -->
 		<view class="fxmp flex bottom" v-if="type==3">
 		<view class="fxmp flex bottom" v-if="type==3">
 			<button class="share" type="default" open-type="share">
 			<button class="share" type="default" open-type="share">
 				分享名片
 				分享名片
@@ -37,28 +78,63 @@
 			<view class="nav-model " @click="navto('/pages/user/model/modelrz?type=1&modelid=' + mtype)">
 			<view class="nav-model " @click="navto('/pages/user/model/modelrz?type=1&modelid=' + mtype)">
 				修改名片
 				修改名片
 			</view>
 			</view>
-			<view class="nav-model pink"
+			<!-- <view class="nav-model pink"
 				@click="navto('/pages/user/model/modelQr?modelid='+mtype+'&avatar='+userTemplate.avatar)">
 				@click="navto('/pages/user/model/modelQr?modelid='+mtype+'&avatar='+userTemplate.avatar)">
 				生成海报
 				生成海报
-			</view>
+			</view> -->
 		</view>
 		</view>
 
 
 		<view style="height:45px;" v-if="type==3"></view>
 		<view style="height:45px;" v-if="type==3"></view>
-
-		<block v-if="type==0">
+		<!-- 商品进入 -->
+		<block v-if="type==0 && mtype != 8">
 			<view class="ljrz bottom" v-if="userInfo.work_type_id <=0&&userInfo.info_audit_status != 1"
 			<view class="ljrz bottom" v-if="userInfo.work_type_id <=0&&userInfo.info_audit_status != 1"
 				@click="navto('/pages/user/model/modelrz?modelid=' + mtype + '&type=2')">
 				@click="navto('/pages/user/model/modelrz?modelid=' + mtype + '&type=2')">
 				生成我的名片
 				生成我的名片
 			</view>
 			</view>
 			<view v-else class="create-model flex bottom">
 			<view v-else class="create-model flex bottom">
 				<view v-if="systeam!='ios'" class="price-show">
 				<view v-if="systeam!='ios'" class="price-show">
-					模板费用:<text class="price-show-text">{{modelInfo.price*1}}</text>
+					<text class="price-show-label" :style="priceLabelStyle">模板费用:</text>
+					<text class="price-show-text" :style="priceValueStyle">{{ displayPrice }}</text>
 				</view>
 				</view>
 				<view class="to-show" @click="preview">
 				<view class="to-show" @click="preview">
 					模板预览
 					模板预览
 				</view>
 				</view>
 				<view v-if="systeam!='ios'" class="by-now" @click="gobuy">
 				<view v-if="systeam!='ios'" class="by-now" @click="gobuy">
-					{{!isBuy?'立即购买': (!isBase ? '设为默认': '默认模板')}}
+					<!-- {{!isBuy?(modelInfo.score_price? '立即兑换': '立即购买'): (!isBase ? '设为默认': '默认模板')}} -->
+					{{!isBuy?(modelInfo.score_price? '立即兑换': '立即购买'): '我的模板'}}
+				</view>
+			</view>
+		</block>
+		<!--  -->
+		<block v-if="type==0 && mtype == 8">
+			<view class="fxmp create-model flex bottom">
+				<button class="shares" type="default" open-type="share">
+					分享模板
+				</button>
+				<!-- 阿姨进入 -->
+				<view class="nav-model black"
+					v-if="hasLogin && userInfo.info_audit_status==1 && userIdentity.is_tutor == 0"
+					@click="tutorMyApply.has_wait == 0?gotutorApply():''">
+					{{ tutorMyApply.has_wait == 0 ? '申请成为职业导师' : '职业导师申请中' }}
+				</view>
+			</view>
+		</block>
+		<block v-if="type==0 && mtype == 7">
+			<view class="fxmp create-model flex bottom">
+				<button class="share" type="default" open-type="share">
+					分享模板
+				</button>
+				<view class="nav-model" v-if="userInfo.work_type_id && userInfo.info_audit_status == 1"
+					@click="goBlackGoldApply">
+					<!-- {{ blackGoldMyApply.is_black_gold == 0 ? (blackGoldMyApply.has_wait == 0 ? '申请匠心模板' : '匠心模板申请中'):(isBase ? '设为默认': '默认模板') }} -->
+					{{ blackGoldMyApply.is_black_gold == 0 ? (blackGoldMyApply.has_wait == 0 ? '申请匠心模板' : '匠心模板申请中'):'我的模板' }}
+				</view>
+				<view class="nav-model" @click="navto('/pages/user/model/modelrz?modelid='+userInfo.show_template_id)"
+					v-if=" hasLogin && userInfo.info_audit_status==-2">
+					立即认证
+				</view>
+				<view class="nav-model" v-if=" hasLogin && userInfo.info_audit_status==0">
+					资料审核中
 				</view>
 				</view>
 			</view>
 			</view>
 		</block>
 		</block>
@@ -66,7 +142,7 @@
 			结束预览
 			结束预览
 		</view>
 		</view>
 
 
-		<view class="rightIcon" v-if="isOpen">
+		<view class="rightIcon" v-if="isOpen && type != 0">
 			<view class="Dz" @click="onDz(1)">
 			<view class="Dz" @click="onDz(1)">
 				<uni-icons class="icon" :color="userTemplate.is_like==0?'#FFF':'#FEB8C6'" size='80rpx'
 				<uni-icons class="icon" :color="userTemplate.is_like==0?'#FFF':'#FEB8C6'" size='80rpx'
 					type="hand-up-filled"></uni-icons>
 					type="hand-up-filled"></uni-icons>
@@ -84,11 +160,9 @@
 			<view class="Sc" @click="goPl">
 			<view class="Sc" @click="goPl">
 				<uni-icons class="icon" color="#FFF" size='80rpx' type="chat-filled"></uni-icons>
 				<uni-icons class="icon" color="#FFF" size='80rpx' type="chat-filled"></uni-icons>
 			</view>
 			</view>
-			<!-- calendar-filled -->
 			<view class="ScNum">
 			<view class="ScNum">
 				{{userTemplate.comment_num||0}}
 				{{userTemplate.comment_num||0}}
 			</view>
 			</view>
-			<!--  -->
 			<view class="Dz" @click="showDk(userTemplate.check_num)">
 			<view class="Dz" @click="showDk(userTemplate.check_num)">
 				<uni-icons class="icon" color="#FFF" size='80rpx' type="calendar-filled"></uni-icons>
 				<uni-icons class="icon" color="#FFF" size='80rpx' type="calendar-filled"></uni-icons>
 			</view>
 			</view>
@@ -100,7 +174,7 @@
 			v-if="!userInfo.uid || (userInfo.uid && userInfo.uid != uid)"></image>
 			v-if="!userInfo.uid || (userInfo.uid && userInfo.uid != uid)"></image>
 		<image src="/static/image/ht.png" mode="widthFix" class="qianyue" @click="goHt"
 		<image src="/static/image/ht.png" mode="widthFix" class="qianyue" @click="goHt"
 			v-if="userInfo.uid && userInfo.uid == uid"></image>
 			v-if="userInfo.uid && userInfo.uid == uid"></image>
-			<!-- v-if="isOpen" -->
+		<!-- v-if="isOpen" -->
 		<view class="qianyues" v-if="isOpen">
 		<view class="qianyues" v-if="isOpen">
 			<image src="/static/image/zx.png" mode="widthFix" class="qianyues" @click="goZx"
 			<image src="/static/image/zx.png" mode="widthFix" class="qianyues" @click="goZx"
 				v-if="!userInfo.uid || (userInfo.uid && userInfo.uid != uid)"></image>
 				v-if="!userInfo.uid || (userInfo.uid && userInfo.uid != uid)"></image>
@@ -109,12 +183,35 @@
 			</view>
 			</view>
 		</view>
 		</view>
 
 
+		<uni-popup ref="kfPopup" type="center">
+			<view class="kf-popup">
+				<view class="kf-title">提交成功,请等待审核</view>
+				<view class="kf-tip">长按识别添加客服微信</view>
+
+				<image class="kf-qrcode" show-menu-by-longpress src="https://api.myjie.cn/static/img/qyweichat.jpg"
+					mode="aspectFit"></image>
+
+				<view class="kf-tip">领取操作视频和接单教程</view>
+				<view class="kf-btn" @click="$refs.kfPopup.close()">我知道了</view>
+			</view>
+		</uni-popup>
+
 	</view>
 	</view>
 </template>
 </template>
 
 
 <script>
 <script>
 	import model from '@/pages/modelData/index.vue';
 	import model from '@/pages/modelData/index.vue';
-
+	import {
+		tutorCardInfo,
+		userIdentity,
+		tutorApply,
+		researcherApply,
+		researcherMyApply,
+		tutorMyApply,
+		myBlackGoldApply,
+		applyBlackGold,
+		researcherUnbind
+	} from '@/api/student.js'
 	import {
 	import {
 		mapState,
 		mapState,
 		mapMutations
 		mapMutations
@@ -132,7 +229,8 @@
 		getUser,
 		getUser,
 		getHonor,
 		getHonor,
 		getChatConfig,
 		getChatConfig,
-		buyChatCount
+		buyChatCount,
+		scoreBuyTemplate
 	} from '@/api/user.js';
 	} from '@/api/user.js';
 	import {
 	import {
 		saveUrl,
 		saveUrl,
@@ -152,6 +250,31 @@
 		},
 		},
 		data() {
 		data() {
 			return {
 			return {
+				blackGoldMyApply: {
+					is_black_gold: 0, //是否已是匠心模板 1 是、0 否
+					has_wait: 0, //是否有申请中的记录 1 有、0 无
+					condition: {
+						max_price: '', //单价需超过多少
+						work_year: '', //服务年限需超过多少年
+						max_age: '', //年龄需少于多少岁
+					}, //申请条件
+				},
+				researcherMyApply: {
+					researcher_apply_score: 0, //申请支付积分金额
+					is_researcher: 0, //是否已是研究员 1 是、0 否
+					has_wait: 0, //是否有申请中的记录 1 有、0 无
+					tutor_unbind_days: 0, //免费解除观察期天数
+				},
+				tutorMyApply: {
+					is_tutor: 0, //是否已是导师 1 是、0 否
+					has_wait: 0 //是否有申请中的记录 1 有、0 无
+				},
+				userIdentity: {
+					is_tutor: 0, // 是否是导师
+					is_researcher: 0, // 是否是研究员
+					my_tutor: '', // 我的导师
+					my_researchers: [], // 我的研究员
+				},
 				price: 0,
 				price: 0,
 				isBase: false,
 				isBase: false,
 				isBuy: false,
 				isBuy: false,
@@ -191,7 +314,7 @@
 				// 存储其他邀请人
 				// 存储其他邀请人
 				uni.setStorageSync('spread_code', opt.spread);
 				uni.setStorageSync('spread_code', opt.spread);
 			}
 			}
-			uni.hideShareMenu();
+			// uni.hideShareMenu();
 			if (opt.scene) {
 			if (opt.scene) {
 				let arr = opt.scene.split('_')
 				let arr = opt.scene.split('_')
 				this.isLook = 2;
 				this.isLook = 2;
@@ -218,9 +341,13 @@
 			if (this.type === 0) {
 			if (this.type === 0) {
 				this.isLook = 1;
 				this.isLook = 1;
 				if (this.userInfo.uid) {
 				if (this.userInfo.uid) {
-					this.getCommonUserCardInfo(this.userInfo.uid);
 					this.uid = this.userInfo.uid;
 					this.uid = this.userInfo.uid;
-					that.getHonor(this.userInfo.uid)
+
+					if (this.userInfo.work_type_id && this.userInfo.info_audit_status == 1) {
+						this.getCommonUserCardInfo(this.userInfo.uid);
+						that.getHonor(this.userInfo.uid)
+					}
+
 				}
 				}
 				this.getShowTemplateItem();
 				this.getShowTemplateItem();
 				return
 				return
@@ -253,6 +380,7 @@
 				this.uid = this.userInfo.uid;
 				this.uid = this.userInfo.uid;
 				return
 				return
 			}
 			}
+			uni.showShareMenu();
 			// if(opt.look && opt.look == 2) {
 			// if(opt.look && opt.look == 2) {
 			// 	this.islook = opt.look
 			// 	this.islook = opt.look
 			// 	this.cardInfo = uni.getStorageSync('modeldata')
 			// 	this.cardInfo = uni.getStorageSync('modeldata')
@@ -279,6 +407,36 @@
 			// #ifdef MP
 			// #ifdef MP
 			...mapState(['systeam']),
 			...mapState(['systeam']),
 			// #endif
 			// #endif
+			displayPrice() {
+				return this.modelInfo.score_price ? this.modelInfo.score_price : this.modelInfo.price * 1;
+			},
+			priceLen() {
+				return String(this.displayPrice == null ? '' : this.displayPrice).length;
+			},
+			priceLabelStyle() {
+				if (this.priceLen >= 8) return {
+					fontSize: '18rpx'
+				};
+				if (this.priceLen >= 6) return {
+					fontSize: '22rpx'
+				};
+				if (this.priceLen >= 5) return {
+					fontSize: '26rpx'
+				};
+				return {};
+			},
+			priceValueStyle() {
+				if (this.priceLen >= 8) return {
+					fontSize: '28rpx'
+				};
+				if (this.priceLen >= 6) return {
+					fontSize: '34rpx'
+				};
+				if (this.priceLen >= 5) return {
+					fontSize: '40rpx'
+				};
+				return {};
+			}
 		},
 		},
 		onShow() {
 		onShow() {
 			this.getShow()
 			this.getShow()
@@ -286,8 +444,10 @@
 				this.getSessionList()
 				this.getSessionList()
 				this.getUnreadCount()
 				this.getUnreadCount()
 				this.getChatConfig()
 				this.getChatConfig()
-			}else {
-				if(this.isOpen) {
+				this.getUser()
+				
+			} else {
+				if (this.isOpen) {
 					this.getUser()
 					this.getUser()
 				}
 				}
 			}
 			}
@@ -300,9 +460,16 @@
 			let url = currentPage.route; //当前页面url
 			let url = currentPage.route; //当前页面url
 			let item = currentPage.options; //如果要获取url中所带的参数可以查看options
 			let item = currentPage.options; //如果要获取url中所带的参数可以查看options
 			let shareObj = {}
 			let shareObj = {}
+			// 商品进入分享
+			if (this.type == 0) {
+				url = url + '?uid=' + this.shareId + '&mtype=' + this.mtype + '&type=0'
+			} else {
+				url = url + '?uid=' + this.shareId + '&mtype=' + this.mtype + '&type=2'
+			}
+			console.log(url, 'url');
 			shareObj = {
 			shareObj = {
 				title: this.userTemplate.name + '母婴界数字名片', // 默认是小程序的名称(可以写slogan等)
 				title: this.userTemplate.name + '母婴界数字名片', // 默认是小程序的名称(可以写slogan等)
-				path: url + '?uid=' + this.shareId + '&mtype=' + this.mtype + '&type=2', // 默认是当前页面,必须是以‘/’开头的完整路径
+				path: url, // 默认是当前页面,必须是以‘/’开头的完整路径
 				imageUrl: '',
 				imageUrl: '',
 				success: function(res) {
 				success: function(res) {
 					// 转发成功之后的回调
 					// 转发成功之后的回调
@@ -332,7 +499,7 @@
 					url: '/pages/index/index',
 					url: '/pages/index/index',
 					fail() {
 					fail() {
 						uni.navigateTo({
 						uni.navigateTo({
-							url:'/pages/index/index'
+							url: '/pages/index/index'
 						})
 						})
 					}
 					}
 				})
 				})
@@ -340,6 +507,157 @@
 		},
 		},
 		methods: {
 		methods: {
 			...mapMutations('user', ['setUserInfo']),
 			...mapMutations('user', ['setUserInfo']),
+			unbind() {
+				// researcherUnbind
+				let that = this
+				uni.showModal({
+					content:'确认与导师[' + that.userTemplate.name + ']解除关系?',
+					complete(e) {
+						if(e.confirm) {
+							researcherUnbind({
+								uid: that.uid
+							}).then(res => {
+								uni.showToast({
+									title: '解除成功',
+									icon: 'success'
+								})
+								that.getResearcherMyApply()
+								that.getUserIdentity()
+							})
+						}
+					}
+				})
+			},
+			goBlackGoldApply() {
+				const that = this;
+				if (that.blackGoldMyApply.is_black_gold == 0) {
+					if (that.blackGoldMyApply.has_wait == 0) {
+						const condition = that.blackGoldMyApply.condition || {};
+						const content =
+							`申请条件:\n1.单价须超过${condition.max_price || 0};\n2.服务年限须超过${condition.work_year || 0}年;\n3.年龄须小于${condition.max_age || 0}岁。\n\n确认申请匠心模板?`;
+						uni.showModal({
+							title: '温馨提示',
+							content,
+							confirmText: '确认申请',
+							success(res) {
+								if (!res.confirm) return;
+								applyBlackGold().then(() => {
+									uni.showModal({
+										content: '已提交申请,请等待审核',
+										showCancel: false
+									});
+									that.getBlackGoldMyApply();
+								}).catch(err => {
+									uni.showToast({
+										title: (err && err.msg) || '申请失败',
+										icon: 'none'
+									});
+								});
+							}
+						});
+					} else {
+						uni.showModal({
+							content: '匠心模板申请中',
+							showCancel: false
+						});
+					}
+				} else {
+					// if (that.isBase) {
+					// 	setShowTemplate({
+					// 		show_template_id: that.mtype
+					// 	}).then(() => {
+					// 		uni.showModal({
+					// 			content: '已设置为默认模板',
+					// 			showCancel: false
+					// 		});
+					// 	});
+					// }
+					uni.navigateTo({
+						url:'/pages/user/model/mymodellist'
+					})
+				}
+			},
+			getBlackGoldMyApply() {
+				myBlackGoldApply().then(res => {
+					this.blackGoldMyApply = res.data;
+				})
+			},
+			goResearcherApply() {
+				let that = this
+				// 判断是否付费
+				if (Number(that.researcherMyApply.researcher_apply_score) > 0) {
+					// 判断职业是否匹配
+					if(that.userTemplate.user_work_type_id != that.userInfo.work_type_id) {
+						return that.$api.msg('您当前职业与导师不一致')
+					}
+					// 判断用户积分是否足够
+					if (that.userInfo.score < Number(that.researcherMyApply.researcher_apply_score)) {
+						return uni.showModal({
+							title: `申请将消耗${Number(that.researcherMyApply.researcher_apply_score)}积分,您当前积分不足,是否立即充值?`,
+							complete(e) {
+								if (e.confirm) {
+									uni.navigateTo({
+										url: '/pages/user/jf/jfcz'
+									})
+								}
+							}
+						})
+					}
+					uni.showModal({
+						content:`申请将消耗${Number(that.researcherMyApply.researcher_apply_score)}积分,是否立即申请?`,
+						complete(e) {
+							if (e.confirm) {
+								that.payResearcherApply()
+							}
+						}
+					})
+				} else {
+					if(that.userTemplate.user_work_type_id != that.userInfo.work_type_id) {
+						return that.$api.msg('您当前职业与导师不一致')
+					}
+					that.payResearcherApply()
+				}
+			},
+			payResearcherApply() {
+				
+				researcherApply({
+					tutor_uid: this.uid,
+				}).then(res => {
+					uni.showModal({
+						content: '已提交申请,请等待审核',
+						icon: 'success'
+					})
+					this.getResearcherMyApply()
+				})
+			},
+			getResearcherMyApply() {
+				researcherMyApply().then(res => {
+					this.researcherMyApply = res.data;
+				})
+			},
+			getTutorMyApply() {
+				tutorMyApply().then(res => {
+					this.tutorMyApply = res.data;
+				})
+			},
+			gotutorApply() {
+				tutorApply({
+					work_type_id: this.userInfo.work_type_id
+				}).then(res => {
+					this.$refs.kfPopup.open();
+					this.getTutorMyApply()
+				}).catch(err => {
+					uni.showToast({
+						title: err.msg || '申请失败',
+						icon: 'none'
+					});
+				})
+			},
+			getUserIdentity() {
+				userIdentity({}).then(res => {
+					this.userIdentity = res.data;
+				})
+			},
 			getChatConfig() {
 			getChatConfig() {
 				getChatConfig().then(res => {
 				getChatConfig().then(res => {
 					this.balance = res.data.balance
 					this.balance = res.data.balance
@@ -385,24 +703,24 @@
 					//没有聊天次数
 					//没有聊天次数
 					if (this.balance == 0) {
 					if (this.balance == 0) {
 						// 判断积分是否足够
 						// 判断积分是否足够
-						if(Number(that.userInfo.score) < that.price) {
+						if (Number(that.userInfo.score) < that.price) {
 							uni.showModal({
 							uni.showModal({
 								title: '温馨提示',
 								title: '温馨提示',
 								content: '您当前积分不足' + that.price + ',是否立即充值?',
 								content: '您当前积分不足' + that.price + ',是否立即充值?',
 								complete(e) {
 								complete(e) {
-									if(e.confirm) {
+									if (e.confirm) {
 										uni.navigateTo({
 										uni.navigateTo({
-											url:'/pages/user/jf/jfcz'
+											url: '/pages/user/jf/jfcz'
 										})
 										})
 									}
 									}
 								}
 								}
 							})
 							})
-						}else {
+						} else {
 							uni.showModal({
 							uni.showModal({
 								title: '温馨提示',
 								title: '温馨提示',
 								content: '建立聊天将消耗' + that.price + '积分,是否立即聊天?',
 								content: '建立聊天将消耗' + that.price + '积分,是否立即聊天?',
 								complete(e) {
 								complete(e) {
-									if(e.confirm) {
+									if (e.confirm) {
 										// 买一次聊天
 										// 买一次聊天
 										buyChatCount({
 										buyChatCount({
 											chat_num: 1
 											chat_num: 1
@@ -412,18 +730,19 @@
 											}).then(res => {
 											}).then(res => {
 												uni.setStorageSync('avt', that.userTemplate.avatar)
 												uni.setStorageSync('avt', that.userTemplate.avatar)
 												uni.navigateTo({
 												uni.navigateTo({
-													url: '/pages/set/kf/index?to_uid=' + that.uid +
+													url: '/pages/set/kf/index?to_uid=' +
+														that.uid +
 														'&name=' +
 														'&name=' +
 														that.userTemplate.name
 														that.userTemplate.name
 												})
 												})
 											})
 											})
 										})
 										})
 									}
 									}
-									
+
 								}
 								}
 							})
 							})
 						}
 						}
-						
+
 					} else {
 					} else {
 						uni.showModal({
 						uni.showModal({
 							title: '温馨提示',
 							title: '温馨提示',
@@ -454,6 +773,7 @@
 				this.$api.msg('总打卡' + num + '次')
 				this.$api.msg('总打卡' + num + '次')
 			},
 			},
 			getHonor(uid) {
 			getHonor(uid) {
+				if (!uid) return;
 				getHonor({
 				getHonor({
 					uid
 					uid
 				}).then(res => {
 				}).then(res => {
@@ -570,7 +890,17 @@
 					} else {
 					} else {
 						that.cardInfo = {}
 						that.cardInfo = {}
 					}
 					}
-					this.userShowTemplateList()
+					that.userShowTemplateList()
+					
+					that.getUserIdentity()
+					if (that.mtype == 8) {
+						that.getResearcherMyApply()
+						that.getTutorMyApply()
+					}
+					if (that.mtype == 7) {
+						that.getBlackGoldMyApply()
+					}
+					
 				}).catch((e) => {})
 				}).catch((e) => {})
 			},
 			},
 			userShowTemplateList() {
 			userShowTemplateList() {
@@ -597,25 +927,40 @@
 			gobuy() {
 			gobuy() {
 				let that = this
 				let that = this
 				if (that.isBuy) {
 				if (that.isBuy) {
-					if (that.isBase) return;
-					setShowTemplate({
-						show_template_id: that.mtype
-					}).then(res => {
-						uni.showToast({
-							title: res.msg
-						})
-						that.isBase = true
+					// if (that.isBase) return;
+					// setShowTemplate({
+					// 	show_template_id: that.mtype
+					// }).then(res => {
+					// 	uni.showToast({
+					// 		title: res.msg
+					// 	})
+					// 	that.isBase = true
+					// })
+					uni.navigateTo({
+						url:'/pages/user/model/mymodellist'
 					})
 					})
 				} else {
 				} else {
-					subShowTemplateOrder({
-						id: that.mtype,
-						pay_type: that.payType
-					}).then(res => {
-						if (res.data.status == 1) {
+
+					if (that.modelInfo.score_price) {
+						if (Number(that.userInfo.score) < Number(that.modelInfo.score_price)) {
+							return uni.showModal({
+								title: '您当前积分不足,是否立即充值?',
+								complete(e) {
+									if (e.confirm) {
+										uni.navigateTo({
+											url: '/pages/user/jf/jfcz'
+										})
+									}
+								}
+							})
+						}
+						scoreBuyTemplate({
+							id: that.mtype
+						}).then(res => {
 							that.userShowTemplateList()
 							that.userShowTemplateList()
 							uni.showModal({
 							uni.showModal({
 								title: '提示',
 								title: '提示',
-								content: '支付成功!',
+								content: '兑换成功!',
 								cancelText: '关闭',
 								cancelText: '关闭',
 								confirmText: '查看模板',
 								confirmText: '查看模板',
 								success: res => {
 								success: res => {
@@ -629,55 +974,77 @@
 								fail: () => {},
 								fail: () => {},
 								complete: () => {}
 								complete: () => {}
 							});
 							});
-						} else {
-							let da = res.data.jsApiParameters;
-							let data = {
-								appId: da.appId,
-								// #ifdef H5
-								timestamp: da.timeStamp,
-								// #endif
-								// #ifdef MP
-								timeStamp: da.timeStamp + '',
-								// #endif
-								nonceStr: da.nonceStr,
-								package: da.package,
-								signType: da.signType,
-								paySign: da.paySign,
-								success: function(res) {
-									// obj.paySuccessTo();
-									// alert('支付成功')
-									that.userShowTemplateList()
-									uni.showModal({
-										title: '提示',
-										content: '支付成功!',
-										cancelText: '关闭',
-										confirmText: '查看模板',
-										success: res => {
-											if (res.confirm) {
-												uni.reLaunch({
-													url: '/pages/user/model/model?mtype=' +
-														that.mtype,
-												});
-											}
-										},
-										fail: () => {},
-										complete: () => {}
-									});
-								},
-								fail: (err) => {
-									console.log(err)
-									// alert('支付失败')
-									// uni.navigateTo({
-									// 	url: '/pages/order/order?state=0'
-									// });
+						})
+					} else {
+						subShowTemplateOrder({
+							id: that.mtype,
+							pay_type: that.payType
+						}).then(res => {
+							if (res.data.status == 1) {
+								that.userShowTemplateList()
+								uni.showModal({
+									title: '提示',
+									content: '支付成功!',
+									cancelText: '关闭',
+									confirmText: '查看模板',
+									success: res => {
+										if (res.confirm) {
+											uni.reLaunch({
+												url: '/pages/user/model/model?mtype=' +
+													that.mtype,
+											});
+										}
+									},
+									fail: () => {},
+									complete: () => {}
+								});
+							} else {
+								let da = res.data.jsApiParameters;
+								let data = {
+									appId: da.appId,
+									// #ifdef H5
+									timestamp: da.timeStamp,
+									// #endif
+									// #ifdef MP
+									timeStamp: da.timeStamp + '',
+									// #endif
+									nonceStr: da.nonceStr,
+									package: da.package,
+									signType: da.signType,
+									paySign: da.paySign,
+									success: function(res) {
+										that.userShowTemplateList()
+										uni.showModal({
+											title: '提示',
+											content: '支付成功!',
+											cancelText: '关闭',
+											confirmText: '查看模板',
+											success: res => {
+												if (res.confirm) {
+													uni.reLaunch({
+														url: '/pages/user/model/model?mtype=' +
+															that.mtype,
+													});
+												}
+											},
+											fail: () => {},
+											complete: () => {}
+										});
+									},
+									fail: (err) => {
+										console.log(err)
+									}
+								};
+								if (that.payType == 'wxpay') {
+									wx.requestPayment(data)
 								}
 								}
-							};
-							if (that.payType == 'wxpay') {
-								wx.requestPayment(data)
 							}
 							}
-						}
 
 
-					})
+						})
+					}
+
+
+
 				}
 				}
 
 
 			},
 			},
@@ -700,6 +1067,7 @@
 			getCommonUserCardInfo(uid) {
 			getCommonUserCardInfo(uid) {
 				console.log('jr')
 				console.log('jr')
 				let that = this
 				let that = this
+
 				getCommonUserCardInfo({
 				getCommonUserCardInfo({
 					uid: uid
 					uid: uid
 				}).then(res => {
 				}).then(res => {
@@ -716,6 +1084,13 @@
 					res.data.service_area_all = arr
 					res.data.service_area_all = arr
 					// 保存用户模板数据
 					// 保存用户模板数据
 					that.userTemplate = res.data
 					that.userTemplate = res.data
+					if (that.mtype == 8 && that.type != 0) {
+						tutorCardInfo({
+							tutor_uid: uid
+						}).then(ress => {
+							that.userTemplate.researchers = ress.data.researchers
+						})
+					}
 					// 判断是否从用户个人中心或者分享进入
 					// 判断是否从用户个人中心或者分享进入
 					if (that.type == 3 || that.type == 2) {
 					if (that.type == 3 || that.type == 2) {
 						// 修改为非默认数据
 						// 修改为非默认数据
@@ -767,6 +1142,17 @@
 			font-size: 32rpx;
 			font-size: 32rpx;
 		}
 		}
 
 
+		.shares {
+			width: 50%;
+			height: 100%;
+			padding: 0;
+			border-radius: 0;
+			flex-grow: 1;
+			background: linear-gradient(to right, #4f3014, #b9763f);
+			color: #f5e3b1;
+			font-size: 32rpx;
+		}
+
 		.nav-model {
 		.nav-model {
 			background-color: #FFF;
 			background-color: #FFF;
 			color: $base-color;
 			color: $base-color;
@@ -776,6 +1162,17 @@
 				color: #FFF;
 				color: #FFF;
 				background-color: #FEB8C6;
 				background-color: #FEB8C6;
 			}
 			}
+
+			&.black {
+				color: #fdc49a;
+				background: #0a0605;
+				// border: 1px solid #c59656;
+			}
+
+			&.gold {
+				background: linear-gradient(to right, #4f3014, #b9763f);
+				color: #f5e3b1;
+			}
 		}
 		}
 	}
 	}
 
 
@@ -789,16 +1186,32 @@
 		text-align: center;
 		text-align: center;
 
 
 		.price-show {
 		.price-show {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			flex-wrap: nowrap;
+			white-space: nowrap;
+			overflow: hidden;
+			min-width: 0;
 			font-size: 32rpx;
 			font-size: 32rpx;
 			font-weight: 500;
 			font-weight: 500;
 			color: #333333;
 			color: #333333;
 			background-color: #fff;
 			background-color: #fff;
 			flex-grow: 1;
 			flex-grow: 1;
+			padding: 0 8rpx;
+			box-sizing: border-box;
+
+			.price-show-label {
+				flex-shrink: 1;
+				white-space: nowrap;
+			}
 
 
 			.price-show-text {
 			.price-show-text {
+				flex-shrink: 0;
 				font-size: 48rpx;
 				font-size: 48rpx;
 				font-weight: 500;
 				font-weight: 500;
 				color: #FC6F6D;
 				color: #FC6F6D;
+				white-space: nowrap;
 			}
 			}
 		}
 		}
 
 
@@ -844,6 +1257,7 @@
 	.bottom {
 	.bottom {
 		line-height: 45px;
 		line-height: 45px;
 		height: 45px;
 		height: 45px;
+		z-index: 99;
 	}
 	}
 
 
 	.rightIcon {
 	.rightIcon {
@@ -853,7 +1267,7 @@
 		background-color: rgba(0, 0, 0, 0.1);
 		background-color: rgba(0, 0, 0, 0.1);
 		padding: 40rpx 10rpx;
 		padding: 40rpx 10rpx;
 		border-radius: 100rpx;
 		border-radius: 100rpx;
-
+		z-index: 99;
 		// border: 1px solid #fa98b6;
 		// border: 1px solid #fa98b6;
 		.icon {
 		.icon {
 			color: #fff;
 			color: #fff;
@@ -898,4 +1312,49 @@
 		background-color: #f65486;
 		background-color: #f65486;
 		color: #fff;
 		color: #fff;
 	}
 	}
+
+	.kf-popup {
+		width: 560rpx;
+		background: #fff;
+		border-radius: 24rpx;
+		padding: 40rpx 30rpx 36rpx;
+		box-sizing: border-box;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+
+		.kf-title {
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #333;
+			text-align: center;
+		}
+
+		.kf-tip {
+			margin-top: 16rpx;
+			font-size: 26rpx;
+			color: #999;
+			text-align: center;
+		}
+
+		.kf-qrcode {
+			width: 380rpx;
+			height: 380rpx;
+			margin-top: 28rpx;
+			background: #f5f5f5;
+		}
+
+		.kf-btn {
+			margin-top: 36rpx;
+			width: 100%;
+			height: 80rpx;
+			line-height: 80rpx;
+			text-align: center;
+			background: #f65486;
+			border-radius: 40rpx;
+			color: #fff;
+			font-size: 30rpx;
+			font-weight: bold;
+		}
+	}
 </style>
 </style>

+ 100 - 19
pages/user/model/modelrz.vue

@@ -17,7 +17,7 @@
 			</view>
 			</view>
 			<view class="con_box">
 			<view class="con_box">
 				<view class="con_image">
 				<view class="con_image">
-					<image class="img" v-if="modelid==7" @click="upImage('avatar',1)"
+					<image class="img" v-if="modelid==7 || modelid == 8" @click="upImage('avatar',1)"
 						:src="updata.avatar||`../../../static/image/upImg.png`">
 						:src="updata.avatar||`../../../static/image/upImg.png`">
 					</image>
 					</image>
 					<image class="img" v-else @click="navCroper(400,400,'one')"
 					<image class="img" v-else @click="navCroper(400,400,'one')"
@@ -343,6 +343,18 @@
 				预览
 				预览
 			</view>
 			</view>
 		</view>
 		</view>
+		<uni-popup ref="kfPopup" type="center">
+			<view class="kf-popup">
+				<view class="kf-title">提交成功</view>
+				<view class="kf-tip">长按识别添加客服微信</view>
+
+				<image class="kf-qrcode" show-menu-by-longpress src="https://api.myjie.cn/static/img/qyweichat.jpg"
+					mode="aspectFit"></image>
+
+				<view class="kf-tip">领取操作视频和接单教程</view>
+				<view class="kf-btn" @click="goHome">我知道了</view>
+			</view>
+		</uni-popup>
 	</view>
 	</view>
 </template>
 </template>
 
 
@@ -379,6 +391,7 @@
 		},
 		},
 		data() {
 		data() {
 			return {
 			return {
+				isFrist: false,
 				latitude: '',
 				latitude: '',
 				longitude: '',
 				longitude: '',
 				// showModelType:false,//默认类型
 				// showModelType:false,//默认类型
@@ -693,6 +706,9 @@
 								const res = data.data;
 								const res = data.data;
 								// 存储返回用户数据
 								// 存储返回用户数据
 								that.userModelData = res;
 								that.userModelData = res;
+								if (!that.userModelData.name) {
+									that.isFrist = true
+								}
 								that.actionAreaType = res.is_china;
 								that.actionAreaType = res.is_china;
 								let onCity = [];
 								let onCity = [];
 								if (res.is_china == 1) {
 								if (res.is_china == 1) {
@@ -982,7 +998,7 @@
 						service_project: that.updata.checkedType,
 						service_project: that.updata.checkedType,
 						service_intro_content: that.updata.mymask,
 						service_intro_content: that.updata.mymask,
 						service_intro_imgs: that.updata.imageList,
 						service_intro_imgs: that.updata.imageList,
-						work_year: that.updata.work_year,
+						work_year: Number(that.updata.work_year),
 						ancestral_place: that.updata.ancestral_place,
 						ancestral_place: that.updata.ancestral_place,
 						education: that.updata.education,
 						education: that.updata.education,
 						minority: that.updata.minority,
 						minority: that.updata.minority,
@@ -995,25 +1011,32 @@
 						height: that.updata.height
 						height: that.updata.height
 					})
 					})
 					.then((e) => {
 					.then((e) => {
-						if (e.msg == '提交成功,数据已通过审核') {
-							this.$api.msg(e.msg);
-							setTimeout(
-								() => {
-									uni.switchTab({
-										url: "/pages/userhome/user",
-										fail(re) {
+						that.$refs.kfPopup.open()
+						// if (e.msg == '提交成功,数据已通过审核') {
+						// 	if(that.isFrist) {
 
 
-											uni.navigateTo({
-												url: '/pages/userhome/user'
-											})
 
 
-										}
-									})
-								}, 1000
-							)
-						} else {
-							this.$api.msg(e.msg);
-						}
+						// 	}else {
+						// 		this.$api.msg(e.msg);
+						// 		setTimeout(
+						// 			() => {
+						// 				uni.switchTab({
+						// 					url: "/pages/userhome/user",
+						// 					fail(re) {
+
+						// 						uni.navigateTo({
+						// 							url: '/pages/userhome/user'
+						// 						})
+
+						// 					}
+						// 				})
+						// 			}, 1000
+						// 		)
+						// 	}
+
+						// } else {
+						// 	this.$api.msg(e.msg);
+						// }
 						that.loding = false;
 						that.loding = false;
 					})
 					})
 					.catch(err => {
 					.catch(err => {
@@ -1021,6 +1044,19 @@
 						console.log(err);
 						console.log(err);
 					});
 					});
 			},
 			},
+			goHome() {
+				this.$refs.kfPopup.close()
+				setTimeout(()=> {
+					uni.switchTab({
+						url:'/pages/userhome/user',
+						fail() {
+							uni.navigateTo({
+								url:'/pages/userhome/user',
+							})
+						}
+					})
+				},500)
+			},
 			// 认证
 			// 认证
 			rendl() {
 			rendl() {
 				const that = this;
 				const that = this;
@@ -1308,4 +1344,49 @@
 			}
 			}
 		}
 		}
 	}
 	}
+
+	.kf-popup {
+		width: 560rpx;
+		background: #fff;
+		border-radius: 24rpx;
+		padding: 40rpx 30rpx 36rpx;
+		box-sizing: border-box;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+
+		.kf-title {
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #333;
+			text-align: center;
+		}
+
+		.kf-tip {
+			margin-top: 16rpx;
+			font-size: 26rpx;
+			color: #999;
+			text-align: center;
+		}
+
+		.kf-qrcode {
+			width: 380rpx;
+			height: 380rpx;
+			margin-top: 28rpx;
+			background: #f5f5f5;
+		}
+
+		.kf-btn {
+			margin-top: 36rpx;
+			width: 100%;
+			height: 80rpx;
+			line-height: 80rpx;
+			text-align: center;
+			background: #f65486;
+			border-radius: 40rpx;
+			color: #fff;
+			font-size: 30rpx;
+			font-weight: bold;
+		}
+	}
 </style>
 </style>

+ 1 - 1
pages/user/signing/mySig.vue

@@ -142,7 +142,7 @@
 										class="title">{{item.name}}</text>
 										class="title">{{item.name}}</text>
 								</view>
 								</view>
 								<view class="right flex">
 								<view class="right flex">
-									<input class="input" v-model="item.value" type="number"
+									<input class="input" v-model="item.value" type="text"
 										:placeholder="'请填写' + item.name" placeholder-class="placeholder" />
 										:placeholder="'请填写' + item.name" placeholder-class="placeholder" />
 								</view>
 								</view>
 							</view>
 							</view>

+ 30 - 0
pages/userhome/user.vue

@@ -16,6 +16,9 @@
 								<view class="tipLevel flex-shrink-false">
 								<view class="tipLevel flex-shrink-false">
 								</view>
 								</view>
 							</view>
 							</view>
+							<view class="flex-start flex" v-if="user && user.uid">
+								<view class="authentication">UID: {{user.uid}}</view>
+							</view>
 							<view class="flex-start flex">
 							<view class="flex-start flex">
 								<view class="authentication">{{user.mobile}}</view>
 								<view class="authentication">{{user.mobile}}</view>
 							</view>
 							</view>
@@ -73,6 +76,9 @@
 					重新生成
 					重新生成
 				</view>
 				</view>
 			</view> -->
 			</view> -->
+			<!-- <view @click="gotutorApply">
+				申请导师
+			</view> -->
 			<view class="cover-container">
 			<view class="cover-container">
 				<view class="listBox">
 				<view class="listBox">
 					<view class="list">
 					<view class="list">
@@ -86,6 +92,17 @@
 								<image class="img" src="../../static/icon/next1.png" mode="widthFix"></image>
 								<image class="img" src="../../static/icon/next1.png" mode="widthFix"></image>
 							</view>
 							</view>
 						</view> -->
 						</view> -->
+						<!-- is_tutor -->
+						<view class="flex listItem" @click="navTo('/pages/student/myStudent')" v-if="userIdentity.is_tutor==1 && isOpen">
+							<view class="flex titleBox">
+								<image class="listIconImg" src="../../static/icon/myyjy.png" mode="widthFix"></image>
+								<text class="title">我的研究员</text>
+							</view>
+							<view class="right flex">
+								<text></text>
+								<image class="img" src="../../static/icon/next1.png" mode="widthFix"></image>
+							</view>
+						</view>
 						<view v-if="isOpen == 1" class="flex listItem" @click="navTo('/pages/user/forum/index')">
 						<view v-if="isOpen == 1" class="flex listItem" @click="navTo('/pages/user/forum/index')">
 							<view class="flex titleBox">
 							<view class="flex titleBox">
 								<image class="listIconImg" src="../../static/icon/forum.png" mode="widthFix"></image>
 								<image class="listIconImg" src="../../static/icon/forum.png" mode="widthFix"></image>
@@ -328,6 +345,7 @@
 	</view>
 	</view>
 </template>
 </template>
 <script>
 <script>
+	import { userIdentity, tutorApply } from '@/api/student.js';
 	import TabbarConfig from '@/config/tabbar.js'
 	import TabbarConfig from '@/config/tabbar.js'
 	import {
 	import {
 		mapState,
 		mapState,
@@ -361,6 +379,12 @@
 	export default {
 	export default {
 		data() {
 		data() {
 			return {
 			return {
+				userIdentity: {
+					is_tutor: 0, // 是否是导师
+					is_researcher: 0, // 是否是研究员
+					my_tutor: '', // 我的导师
+					my_researchers: [], // 我的研究员
+				},
 				tabbar: TabbarConfig,
 				tabbar: TabbarConfig,
 				iHeight: '480rpx',
 				iHeight: '480rpx',
 				unread: 0,
 				unread: 0,
@@ -405,6 +429,11 @@
 		},
 		},
 		methods: {
 		methods: {
 			...mapMutations('user', ['setUserInfo']),
 			...mapMutations('user', ['setUserInfo']),
+			getUserIdentity() {
+				userIdentity({}).then(res => {
+					this.userIdentity = res.data;
+				})
+			},
 			getShow() {
 			getShow() {
 				share({}).then(({
 				share({}).then(({
 					data
 					data
@@ -598,6 +627,7 @@
 					this.user = e.data;
 					this.user = e.data;
 					this.setUserInfo(e.data)
 					this.setUserInfo(e.data)
 					this.getSessionList()
 					this.getSessionList()
+					this.getUserIdentity()
 				}).catch((e) => {
 				}).catch((e) => {
 					console.log(e, 'sj');
 					console.log(e, 'sj');
 				})
 				})

+ 5 - 2
pages/znkf/index.vue

@@ -60,9 +60,12 @@
 			},
 			},
 			// 机器人回复中点击H5链接
 			// 机器人回复中点击H5链接
 			handleOpenWebview(e) {
 			handleOpenWebview(e) {
-				const url = encodeURIComponent(e.detail.weburl)
+				console.log(e,'点击H5链接');
+				let src = e.detail.weburl
+				uni.setStorageSync('targetUrl',src)
+				// const url = encodeURI(e.detail.weburl.replace('?','xxxyyyzzz'))
 				uni.navigateTo({
 				uni.navigateTo({
-					url: `/pages/index/webview?targetUrl=${url}`
+					url: `/pages/index/webview`
 				})
 				})
 			},
 			},
 			// 机器人回复跳转其他小程序
 			// 机器人回复跳转其他小程序

BIN
static/icon/myyjy.png


BIN
static/icon/yjy.png


BIN
static/icon/zyds.png


+ 1 - 1
uni_modules/cmy-mys-list/components/cmy-mys-list/cmy-mys-list.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
 	<view class="listBox">
 	<view class="listBox">
 		<view class="bd-btm-item" :key='ind' v-for="(item,ind) in list" @click="clickList(item)"
 		<view class="bd-btm-item" :key='ind' v-for="(item,ind) in list" @click="clickList(item)"
-			v-if="item.name != '影子' && item.name != '测试牛niu' &&item.name != '111'">
+			v-if="item.name != '影子' && item.name != '测试牛niu' &&item.name != '111' && item.name != '测试'">
 			<view class="item-img-box" :style="{'height': height + 'rpx'}" >
 			<view class="item-img-box" :style="{'height': height + 'rpx'}" >
 				<image :src="item.avatar" class="item-img" mode="widthFix" >
 				<image :src="item.avatar" class="item-img" mode="widthFix" >
 				</image>
 				</image>

+ 134 - 4
uni_modules/ksp-cropper/components/ksp-cropper/ksp-cropper.vue

@@ -277,6 +277,7 @@ export default {
 				setTimeout(resolve, 200);
 				setTimeout(resolve, 200);
 			});
 			});
 			var context = canvas.getContext("2d");
 			var context = canvas.getContext("2d");
+			context.clearRect(0, 0, mx.tw, mx.th);
 			var image = canvas.createImage();
 			var image = canvas.createImage();
 			await new Promise((resolve, reject) => {
 			await new Promise((resolve, reject) => {
 				image.onload = resolve;
 				image.onload = resolve;
@@ -287,14 +288,36 @@ export default {
 			context.rotate(this.rotate * Math.PI / 180);
 			context.rotate(this.rotate * Math.PI / 180);
 			context.drawImage(image, mx.sx, mx.sy, mx.sw, mx.sh, mx.dx, mx.dy, mx.dw, mx.dh);
 			context.drawImage(image, mx.sx, mx.sy, mx.sw, mx.sh, mx.dx, mx.dy, mx.dw, mx.dh);
 			context.restore();
 			context.restore();
+			try {
+				var imageData = context.getImageData(0, 0, canvas.width, canvas.height);
+				var buffer = this.encodePng(imageData);
+				var filePath = `${wx.env.USER_DATA_PATH}/crop_${Date.now()}.png`;
+				wx.getFileSystemManager().writeFile({
+					filePath: filePath,
+					data: buffer,
+					success: () => {
+						this.$emit("ok", {
+							path: filePath
+						});
+					},
+					fail: () => {
+						this.exportCanvasPng(canvas);
+					},
+					complete: () => {
+						uni.hideLoading();
+					}
+				});
+			} catch (e) {
+				this.exportCanvasPng(canvas);
+			}
+		},
+		exportCanvasPng(canvas) {
 			wx.canvasToTempFilePath({
 			wx.canvasToTempFilePath({
 				canvas: canvas,
 				canvas: canvas,
-				// destWidth: mx.tw,
-				// destHeight: mx.th,
+				fileType: 'png',
 				success: (rst) => {
 				success: (rst) => {
-					var path = rst.tempFilePath;
 					this.$emit("ok", {
 					this.$emit("ok", {
-						path: path
+						path: rst.tempFilePath
 					});
 					});
 				},
 				},
 				complete: () => {
 				complete: () => {
@@ -302,6 +325,113 @@ export default {
 				}
 				}
 			});
 			});
 		},
 		},
+		encodePng(imageData) {
+			var width = imageData.width;
+			var height = imageData.height;
+			var src = imageData.data;
+			var raw = new Uint8Array(height * (1 + width * 4));
+			var p = 0;
+			for (var y = 0; y < height; y++) {
+				raw[p++] = 0;
+				var start = y * width * 4;
+				raw.set(src.subarray(start, start + width * 4), p);
+				p += width * 4;
+			}
+			var signature = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]);
+			var ihdr = new Uint8Array(13);
+			this.writeUint32(ihdr, 0, width);
+			this.writeUint32(ihdr, 4, height);
+			ihdr[8] = 8;
+			ihdr[9] = 6;
+			var parts = [
+				signature,
+				this.pngChunk("IHDR", ihdr),
+				this.pngChunk("IDAT", this.zlibStore(raw)),
+				this.pngChunk("IEND", new Uint8Array(0))
+			];
+			var total = 0;
+			for (var i = 0; i < parts.length; i++) total += parts[i].length;
+			var png = new Uint8Array(total);
+			var offset = 0;
+			for (var j = 0; j < parts.length; j++) {
+				png.set(parts[j], offset);
+				offset += parts[j].length;
+			}
+			return png.buffer;
+		},
+		writeUint32(buf, offset, value) {
+			buf[offset] = (value >>> 24) & 255;
+			buf[offset + 1] = (value >>> 16) & 255;
+			buf[offset + 2] = (value >>> 8) & 255;
+			buf[offset + 3] = value & 255;
+		},
+		pngChunk(type, data) {
+			var chunk = new Uint8Array(12 + data.length);
+			this.writeUint32(chunk, 0, data.length);
+			for (var i = 0; i < 4; i++) chunk[4 + i] = type.charCodeAt(i);
+			chunk.set(data, 8);
+			var crcBuf = chunk.subarray(4, 8 + data.length);
+			this.writeUint32(chunk, 8 + data.length, this.crc32(crcBuf));
+			return chunk;
+		},
+		crc32(buf) {
+			if (!this._crcTable) {
+				var table = new Uint32Array(256);
+				for (var n = 0; n < 256; n++) {
+					var c = n;
+					for (var k = 0; k < 8; k++) {
+						c = (c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1);
+					}
+					table[n] = c >>> 0;
+				}
+				this._crcTable = table;
+			}
+			var table = this._crcTable;
+			var crc = 0xffffffff;
+			for (var i = 0; i < buf.length; i++) {
+				crc = table[(crc ^ buf[i]) & 255] ^ (crc >>> 8);
+			}
+			return (crc ^ 0xffffffff) >>> 0;
+		},
+		zlibStore(data) {
+			var blocks = [];
+			var offset = 0;
+			var bodyLen = 0;
+			while (offset < data.length) {
+				var len = Math.min(65535, data.length - offset);
+				var block = new Uint8Array(5 + len);
+				block[0] = offset + len >= data.length ? 1 : 0;
+				block[1] = len & 255;
+				block[2] = (len >> 8) & 255;
+				var nlen = (~len) & 0xffff;
+				block[3] = nlen & 255;
+				block[4] = (nlen >> 8) & 255;
+				block.set(data.subarray(offset, offset + len), 5);
+				blocks.push(block);
+				bodyLen += block.length;
+				offset += len;
+			}
+			var adler = this.adler32(data);
+			var out = new Uint8Array(2 + bodyLen + 4);
+			out[0] = 0x78;
+			out[1] = 0x01;
+			var o = 2;
+			for (var i = 0; i < blocks.length; i++) {
+				out.set(blocks[i], o);
+				o += blocks[i].length;
+			}
+			this.writeUint32(out, o, adler);
+			return out;
+		},
+		adler32(data) {
+			var a = 1;
+			var b = 0;
+			for (var i = 0; i < data.length; i++) {
+				a = (a + data[i]) % 65521;
+				b = (b + a) % 65521;
+			}
+			return ((b << 16) | a) >>> 0;
+		},
 		async cropAppH5() {
 		async cropAppH5() {
 			var mx = this.computeMatrix();
 			var mx = this.computeMatrix();
 			this.target = {
 			this.target = {