Kaynağa Gözat

养老场景

wgl 4 yıl önce
ebeveyn
işleme
5a20e261f7
41 değiştirilmiş dosya ile 3094 ekleme ve 134 silme
  1. 7 65
      config/pages.js
  2. 1 1
      config/project.js
  3. 1 0
      src/projects/business/views/Master/Mine/Config.vue
  4. 0 0
      src/projects/pension/App.vue
  5. 74 0
      src/projects/pension/apis/Common/notice.js
  6. 24 0
      src/projects/pension/apis/Master/index.js
  7. 12 0
      src/projects/pension/apis/Master/mine.js
  8. 60 0
      src/projects/pension/components/NavMenu.vue
  9. 101 0
      src/projects/pension/main.js
  10. 58 0
      src/projects/pension/router/common.js
  11. 32 0
      src/projects/pension/router/index.js
  12. 224 0
      src/projects/pension/router/master.js
  13. 83 0
      src/projects/pension/utils/request.js
  14. 111 0
      src/projects/pension/views/Common/Device/List.vue
  15. 118 0
      src/projects/pension/views/Common/Device/OpenDoor.vue
  16. 392 0
      src/projects/pension/views/Common/Health/Cert.vue
  17. 117 0
      src/projects/pension/views/Common/Health/TemperatureInfo.vue
  18. 158 0
      src/projects/pension/views/Common/Health/TemperatureRecord.vue
  19. 119 0
      src/projects/pension/views/Common/Notice/Home.vue
  20. 109 0
      src/projects/pension/views/Common/Notice/Info.vue
  21. 113 0
      src/projects/pension/views/Common/Notice/Send.vue
  22. 11 0
      src/projects/pension/views/Home.vue
  23. 11 0
      src/projects/pension/views/Layout.vue
  24. 77 0
      src/projects/pension/views/Master/AllFun.vue
  25. 8 0
      src/projects/pension/views/Master/Health/Archives.vue
  26. 302 0
      src/projects/pension/views/Master/Home.vue
  27. 8 0
      src/projects/pension/views/Master/Mine/About.vue
  28. 8 0
      src/projects/pension/views/Master/Mine/Bill/Info.vue
  29. 8 0
      src/projects/pension/views/Master/Mine/Bill/List.vue
  30. 8 0
      src/projects/pension/views/Master/Mine/Bill/Record.vue
  31. 8 0
      src/projects/pension/views/Master/Mine/BindPhone.vue
  32. 150 0
      src/projects/pension/views/Master/Mine/Center.vue
  33. 99 0
      src/projects/pension/views/Master/Mine/Config.vue
  34. 199 0
      src/projects/pension/views/Master/Mine/EditInfo.vue
  35. 156 0
      src/projects/pension/views/Master/Mine/Feedback.vue
  36. 111 0
      src/projects/pension/views/Master/Mine/Message.vue
  37. 8 0
      src/projects/pension/views/Master/Mine/Order/Info.vue
  38. 8 0
      src/projects/pension/views/Master/Mine/Order/List.vue
  39. 0 27
      src/projects/pension_company/main.js
  40. 0 14
      src/projects/pension_home/App.vue
  41. 0 27
      src/projects/pension_home/main.js

+ 7 - 65
config/pages.js

@@ -135,17 +135,17 @@ const config = {
 			}
 		},
 	},
-	//机构养老
-	pension_company: {
+	//机构/居家养老
+	pension: {
 		pages: {
 			index: {
-				entry: 'src/projects/pension_company/main.js',
-				template: 'index/pension_company/index.html',
+				entry: 'src/projects/pension/main.js',
+				template: 'index/pension/index.html',
 				filename: 'index.html',
 				title: '小鹏管家' + title,
 			}
 		},
-		outputDir: 'dist/pension_company',
+		outputDir: 'dist/pension',
 		devServer: {
 			host: '0.0.0.0',
 			port: 8080,
@@ -155,9 +155,9 @@ const config = {
 			compress: true,
 		},
 		chainWebpack: (config) => {
-			config.entry.app = ['babel-polyfill', '../src/projects/pension_company/main.js']
+			config.entry.app = ['babel-polyfill', '../src/projects/pension/main.js']
 			config.resolve.alias
-				.set('@', resolve('../src/projects/pension_company/'))
+				.set('@', resolve('../src/projects/pension/'))
 				.set('$project', resolve('../src/'))
 
 			config.plugins.delete('preload');
@@ -193,64 +193,6 @@ const config = {
 			}
 		},
 	},
-	//居家养老院
-	pension_home: {
-		pages: {
-			index: {
-				entry: 'src/projects/pension_home/main.js',
-				template: 'index/pension_home/index.html',
-				filename: 'index.html',
-				title: '小鹏管家' + title,
-			}
-		},
-		outputDir: 'dist/pension_home',
-		devServer: {
-			host: '0.0.0.0',
-			port: 8080,
-			//解析缓存
-			disableHostCheck: true,
-			//支持gzip
-			compress: true,
-		},
-		chainWebpack: (config) => {
-			config.entry.app = ['babel-polyfill', '../src/projects/pension_home/main.js']
-			config.resolve.alias
-				.set('@', resolve('../src/projects/pension_home/'))
-				.set('$project', resolve('../src/'))
-	
-			config.plugins.delete('preload');
-			config.plugins.delete('prefetch');
-	
-			config.optimization.minimize(true);
-		},
-		configureWebpack: (config) => {
-			/* //开启gzip压缩,需要配置Nginx服务器gzip选项开启
-			config.plugins.push(
-				new CompressionWebpackPlugin({
-					filename: '[path].gz[query]',
-					algorithm: 'gzip',
-					test: new RegExp('\\.(' + productionGzipExtensions.join('|') + ')$'),
-					threshold: 10240,
-					minRatio: 0.8
-				})
-			); */
-	
-			config.output.filename = `./static/js/[name].${Timestamp}.js`
-			config.output.chunkFilename = `./static/js/[name].${Timestamp}.js`
-	
-			config.performance = {
-				hints: 'warning',
-				//入口起点的最大体积 整数类型(以字节为单位)
-				maxEntrypointSize: 50000000,
-				//生成文件的最大体积 整数类型(以字节为单位 300k)
-				maxAssetSize: 30000000,
-				//只给出 js 文件的性能提示
-				assetFilter: function(assetFilename) {
-					return assetFilename.endsWith('.js');
-				}
-			}
-		},
-	},
 	//入口
 	home: {
 		pages: {

+ 1 - 1
config/project.js

@@ -1 +1 @@
-exports.name = 'business'
+exports.name = 'pension'

+ 1 - 0
src/projects/business/views/Master/Mine/Config.vue

@@ -22,6 +22,7 @@
 						<a class="mui-navigate-right"> 关于小鹏管家 </a>
 					</li>
 				</ul>
+				<a href="../home/#/register?project=business" class="vongi-meset jump">注册新身份</a>
 				<a href="../home/#/user/role?project=business&exchange=1" class="vongi-meset jump">切换身份</a>
 				<a @click="loginOut" class="vongi-meset">退出帐号</a>
 			</div>

+ 0 - 0
src/projects/pension_company/App.vue → src/projects/pension/App.vue


+ 74 - 0
src/projects/pension/apis/Common/notice.js

@@ -0,0 +1,74 @@
+import request from '@/utils/request'
+import Qs from 'qs';
+
+//获取通知列表
+export function getNoticeList(params) {
+	return request({
+		url: '/mobile/messageNoticeApi/pageListShort',
+		data: Qs.stringify(params),
+		method: 'post',
+	})
+}
+
+//获取通知详情
+export function getNoticeInfo(params) {
+	return request({
+		url: '/mobile/messageNoticeApi/detail',
+		data: Qs.stringify(params),
+		method: 'post',
+	})
+}
+
+//发送通知
+export function sendMessage(params) {
+	return request({
+		url: '/mobile/messageNoticeApi/add',
+		data: Qs.stringify(params),
+		method: 'post',
+	})
+}
+
+//============================新接口========================
+//预获取最新消息
+export function prefetch() {
+	return request({
+		url: '/mobile/messageApi/prefetch',
+		data: Qs.stringify({}),
+		method: 'get',
+	})
+}
+
+//获取最新消息列表
+export function getTopList(params) {
+	return request({
+		url: '/mobile/messageApi/topList',
+		data: Qs.stringify(params),
+		method: 'post',
+	})
+}
+
+//消息分组
+export function getGroupList(params) {
+	return request({
+		url: '/mobile/messageApi/groupList',
+		data: Qs.stringify(params),
+		method: 'post',
+	})
+}
+
+//消息分页列表
+export function getMessageList(params) {
+	return request({
+		url: '/mobile/messageApi/pageList',
+		data: Qs.stringify(params),
+		method: 'post',
+	})
+}
+
+//查看消息
+export function getMessageInfo(id) {
+	return request({
+		url: '/mobile/messageApi/view/' + id,
+		method: 'get',
+	})
+}

+ 24 - 0
src/projects/pension/apis/Master/index.js

@@ -0,0 +1,24 @@
+import request from '@/utils/request'
+import Qs from 'qs';
+
+
+//保存用户信息
+export function savePerson(params) {
+	return request({
+		url: '/mobile/personInfoApi/saveDetail',
+		data: Qs.stringify(params),
+		method: 'post',
+	})
+}
+
+//更新用户身份证
+export function updateIdCard(idCard, name) {
+	return request({
+		url: '/mobile/personInfoApi/updateIdCard',
+		data: Qs.stringify({
+			idCard: idCard,
+			name: name
+		}),
+		method: 'post',
+	})
+}

+ 12 - 0
src/projects/pension/apis/Master/mine.js

@@ -0,0 +1,12 @@
+import request from '@/utils/request'
+import Qs from 'qs';
+
+
+//建议提交
+export function problemFeedback(params) {
+	return request({
+		url: '/mobile/personInfoApi/problemFeedback',
+		data: Qs.stringify(params),
+		method: 'post',
+	})
+}

+ 60 - 0
src/projects/pension/components/NavMenu.vue

@@ -0,0 +1,60 @@
+<template>
+	<nav class="mui-bar mui-bar-tab">
+		<router-link :to="router[0]" :class="'mui-tab-item '+(routeName==router[0]['name']?'mui-active':'')">
+			<span class="mui-icon iconfont icon-shouye2"></span>
+			<span class="mui-tab-label">首页</span>
+		</router-link>
+		<router-link :to="router[1]" :class="'mui-tab-item '+(routeName==router[1]['name']?'mui-active':'')">
+			<span class="mui-icon iconfont icon-xiaoxi1"></span>
+			<span class="mui-tab-label">消息</span>
+		</router-link>
+		<router-link :to="router[2]" :class="'mui-tab-item '+(routeName==router[2]['name']?'mui-active':'')">
+			<span class="mui-icon iconfont icon-wode1"></span>
+			<span class="mui-tab-label">我的</span>
+		</router-link>
+	</nav>
+</template>
+
+<script>
+	export default {
+		name: 'NavMenu',
+		props: {
+			visible: {
+				require: false,
+				default: true,
+			},
+			router: {
+				require: true,
+				type: Array,
+				default: [{
+					name: 'Home'
+				}, {
+					name: 'Home'
+				}, {
+					name: 'Home'
+				}],
+			},
+		},
+		created() {
+			console.log(this.$route);
+		},
+		methods: {},
+		mounted() {},
+		computed: {
+			routeName: {
+				// getter
+				get: function() {
+					return this.$route.name;
+				},
+				// setter
+				set: function(newValue) {
+					console.log(newValue)
+				}
+			},
+		}
+	}
+</script>
+
+<style src="$project/assets/css/iconfont.css"></style>
+<style scoped>
+</style>

+ 101 - 0
src/projects/pension/main.js

@@ -0,0 +1,101 @@
+import Vue from 'vue'
+import App from './App.vue'
+import router from './router'
+import store from '$project/store'
+
+//引入mui
+import mui from '$project/assets/js/mui.js'
+import '$project/assets/css/mui.min.css'
+import Vconsole from 'vconsole'
+
+window.mui = mui;
+window.mui.init();
+
+if (location.hostname === 'localhost') {
+	Vue.prototype.HTTPLOCAT = ''
+} else {
+	const http = window.location.protocol + '//' + location.hostname + ':' + location.port
+	Vue.prototype.HTTPLOCAT = http + ''
+}
+
+Vue.config.productionTip = false
+
+//图片预览
+import VueDirectiveImagePreviewer from 'vue-directive-image-previewer'
+import 'vue-directive-image-previewer/dist/assets/style.css'
+Vue.use(VueDirectiveImagePreviewer, {
+	background: {
+		color: '#000'
+	},
+	// transition
+	animate: {
+		duration: 600,
+		delay: 500
+	},
+	// loading (not supported)
+	loading: {
+		image: ''
+	},
+	// cursor(css)
+	cursor: 'pointer',
+	clickMethod: 'doubleClick'
+})
+
+//获取纯权限路由数组
+let funList = [];
+let fun_list = store.state.fun_list;
+if (fun_list && fun_list.length > 0) {
+	fun_list.forEach(function(item) {
+		item.list.forEach(function(iten) {
+			funList.push(iten.iconRoute);
+			if (iten.iconSubRouteList) {
+				iten.iconSubRouteList.forEach(function(iteb) {
+					funList.push(iteb)
+				})
+			}
+		})
+	})
+}
+//console.log(funList)
+
+
+router.beforeEach((to, from, next) => {
+	if (to.query.test) {
+		if (to.query.test == 'test') {
+			let vConsole = new Vconsole()
+		}
+	}
+
+	if (to.meta != null && to.meta.requireAuth) {
+		if (store.state.person_data) {
+
+			if ((to.meta.form != null && to.meta.form) || (to.meta.mode != null && to.meta.mode)) {
+				//验证
+				if (funList.indexOf(to.name) > -1) {
+					next();
+				} else {
+					//测试环境不验证权限
+					if (process.env.VUE_APP_NODE_NAME == 'devlopment') {
+						next();
+					} else {
+						mui.toast('无权访问');
+					}
+				}
+			} else {
+				//不验证
+				next();
+			}
+
+		} else {
+			window.location.href = '../home/#/user/login';
+		}
+	} else {
+		next();
+	}
+})
+
+new Vue({
+	router,
+	store,
+	render: h => h(App)
+}).$mount('#app')

+ 58 - 0
src/projects/pension/router/common.js

@@ -0,0 +1,58 @@
+/**
+ * meta 参数说明
+ * form:表单路由,存在或ture,也要后台配置,前端校验
+ * mode:功能入口路由,存在或ture,也要后台配置,前端校验
+ */
+const routesCommon = [
+	/***公共***/
+	{
+		path: '/common',
+		component: () => import('../views/Layout.vue'),
+		children: [
+			//消息
+			{
+				path: 'notice',
+				component: () => import('../views/Layout.vue'),
+				children: [
+					//消息列表
+					{
+						path: '',
+						name: 'CommonNotice',
+						component: () => import('../views/Common/Notice/Home.vue'),
+						meta: {
+							requireAuth: true,
+							role: [],
+							title: '消息列表',
+						}
+					},
+					//消息详情
+					{
+						path: 'info',
+						name: 'CommonNoticeInfo',
+						component: () => import('../views/Common/Notice/Info.vue'),
+						meta: {
+							requireAuth: true,
+							role: [],
+							title: '消息详情',
+						}
+					},
+					//发送通知
+					{
+						path: 'send',
+						name: 'CommonNoticeSend',
+						component: () => import('../views/Common/Notice/Send.vue'),
+						meta: {
+							requireAuth: true,
+							role: [],
+							title: '发送通知',
+							mode: true
+						}
+					},
+				]
+			},
+			
+		],
+	}
+]
+
+export default routesCommon

+ 32 - 0
src/projects/pension/router/index.js

@@ -0,0 +1,32 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+
+//公共
+import routesCommon from './common'
+//业主
+import routesMaster from './master'
+
+if (!window.VueRouter) Vue.use(VueRouter)
+
+const routesIndex = [
+	//首页
+	{
+		path: '/',
+		name: 'Home',
+		component: () => import('../views/Home.vue'),
+		meta: {
+			requireAuth: false,
+			role: [],
+			title: '首页',
+		}
+	},
+]
+
+const routes = routesIndex.concat(routesCommon, routesMaster);
+
+const router = new VueRouter({
+	//base: process.env.BASE_URL,
+	routes
+})
+
+export default router

+ 224 - 0
src/projects/pension/router/master.js

@@ -0,0 +1,224 @@
+/**
+ * meta 参数说明
+ * form:表单路由,存在或ture,也要后台配置,前端校验
+ * mode:功能入口路由,存在或ture,也要后台配置,前端校验
+ */
+const routesMaster = [
+	/***主人***/
+	{
+		path: '/master',
+		component: () => import('../views/Layout.vue'),
+		children: [
+			//主页
+			{
+				path: '',
+				name: 'Master',
+				component: () => import('../views/Master/Home.vue'),
+				meta: {
+					requireAuth: false,
+					role: [],
+					title: '主人主页',
+				}
+			},
+			//所有功能
+			{
+				path: 'allFun',
+				name: 'MasterAllFun',
+				component: () => import('../views/Master/AllFun.vue'),
+				meta: {
+					requireAuth: false,
+					role: [],
+					title: '所有功能',
+				}
+			},
+
+			//我的
+			{
+				path: 'mine',
+				component: () => import('../views/Layout.vue'),
+				children: [
+					//个人中心
+					{
+						path: 'center',
+						name: 'MasterMineCenter',
+						component: () => import('../views/Master/Mine/Center.vue'),
+						meta: {
+							requireAuth: false,
+							role: [],
+							title: '个人中心',
+						}
+					},
+					//消息
+					{
+						path: 'message',
+						name: 'MasterMineMessage',
+						component: () => import('../views/Master/Mine/Message.vue'),
+						meta: {
+							requireAuth: false,
+							role: [],
+							title: '消息',
+						}
+					},
+					//修改个人信息
+					{
+						path: 'editInfo',
+						name: 'MasterMineEditInfo',
+						component: () => import('../views/Master/Mine/EditInfo.vue'),
+						meta: {
+							requireAuth: false,
+							role: [],
+							title: '修改个人信息',
+						}
+					},
+					//设置
+					{
+						path: 'config',
+						name: 'MasterMineConfig',
+						component: () => import('../views/Master/Mine/Config.vue'),
+						meta: {
+							requireAuth: false,
+							role: [],
+							title: '设置',
+						}
+					},
+					//绑定手机
+					{
+						path: 'bindPhone',
+						name: 'MasterMineBindPhone',
+						component: () => import('../views/Master/Mine/BindPhone.vue'),
+						meta: {
+							requireAuth: false,
+							role: [],
+							title: '绑定手机',
+						}
+					},
+					//关于小鹏管家
+					{
+						path: 'about',
+						name: 'MasterMineAbout',
+						component: () => import('../views/Master/Mine/About.vue'),
+						meta: {
+							requireAuth: false,
+							role: [],
+							title: '关于小鹏管家',
+						}
+					},
+					//问题反馈
+					{
+						path: 'feedback',
+						name: 'MasterMineFeedback',
+						component: () => import('../views/Master/Mine/Feedback.vue'),
+						meta: {
+							requireAuth: false,
+							role: [],
+							title: '问题反馈',
+						}
+					},
+
+					//我的账单
+					{
+						path: 'bill',
+						component: () => import('../views/Layout.vue'),
+						children: [
+							//账单列表
+							{
+								path: 'list',
+								name: 'MasterMineBillList',
+								component: () => import('../views/Master/Mine/Bill/List.vue'),
+								meta: {
+									requireAuth: false,
+									role: [],
+									title: '账单列表',
+								}
+							},
+							//账单记录
+							{
+								path: 'record',
+								name: 'MasterMineBillRecord',
+								component: () => import('../views/Master/Mine/Bill/Record.vue'),
+								meta: {
+									requireAuth: false,
+									role: [],
+									title: '账单记录',
+								}
+							},
+							//账单详情
+							{
+								path: 'info',
+								name: 'MasterMineBillInfo',
+								component: () => import('../views/Master/Mine/Bill/Info.vue'),
+								meta: {
+									requireAuth: false,
+									role: [],
+									title: '账单详情',
+								}
+							},
+						],
+					},
+
+					//我的订单
+					{
+						path: 'order',
+						component: () => import('../views/Layout.vue'),
+						children: [
+							//订单列表
+							{
+								path: 'list',
+								name: 'MasterMineOrderList',
+								component: () => import('../views/Master/Mine/Order/List.vue'),
+								meta: {
+									requireAuth: false,
+									role: [],
+									title: '订单列表',
+								}
+							},
+							//订单详情
+							{
+								path: 'info',
+								name: 'MasterMineOrderInfo',
+								component: () => import('../views/Master/Mine/Order/Info.vue'),
+								meta: {
+									requireAuth: false,
+									role: [],
+									title: '订单详情',
+								}
+							},
+						],
+					},
+				],
+			},
+
+			//健康手环
+			{
+				path: 'health',
+				component: () => import('../views/Layout.vue'),
+				children: [
+					//健康档案
+					{
+						path: 'archives',
+						name: 'MasterHealthArchives',
+						component: () => import('../views/Master/Health/Archives.vue'),
+						meta: {
+							requireAuth: false,
+							role: [],
+							title: '健康档案',
+							mode: true
+						}
+					},
+				],
+			},
+
+			//直播
+			{
+				path: 'live',
+				component: () => import('../views/Layout.vue'),
+				children: [
+
+				],
+			},
+
+		],
+	},
+]
+
+export default routesMaster

+ 83 - 0
src/projects/pension/utils/request.js

@@ -0,0 +1,83 @@
+import axios from 'axios';
+import store from '$project/store';
+import router from '@/router';
+import Vue from 'vue';
+import Qs from 'qs';
+
+import {
+	getToken,
+	getOpenId
+} from '$project/utils/storage'
+
+axios.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded'
+
+// 创建axios实例
+const service = axios.create({
+	baseURL: process.env.VUE_APP_BACKEND_URL,
+	timeout: 20000,
+	// 请求头信息
+	headers: {
+		'Content-Type': 'application/x-www-form-urlencoded',
+		'X-Requested-With': 'XMLHttpRequest',
+	},
+});
+
+//request拦截器
+service.interceptors.request.use(config => {
+	let Authorization = getToken() ? getToken() : '';
+	config.headers['Authorization'] = Authorization;
+	return config;
+}, error => {
+	//对请求错误处理
+	return Promise.reject(error);
+});
+
+// response拦截器
+service.interceptors.response.use(
+	response => {
+		if (response.data.code === 200) {
+			if (response.data.result) {
+				return Promise.resolve(response.data.data);
+			} else {
+				return Promise.reject(response.data.message);
+			}
+		} else if (response.data.code === 415) {
+			//这里不执行,token过期
+		} else {
+			//无code的情况
+			if (response.data.result) {
+				return Promise.resolve(response.data.data);
+			} else {
+				return Promise.reject(response.data.message);
+			}
+
+			// todo 根据返回值判定去向,比如token过期,未登录等等
+
+			// 403 接口需要登录
+			/* if (response.data.code === 403) {
+				store.dispatch('clearToken');
+				router.replace({
+					name: 'Login',
+					query: {
+						redirect: router.currentRoute.fullPath
+					}
+				});
+			} */
+
+			return Promise.reject(response.data.message);
+		}
+	},
+	error => {
+		// alert('网络超时!请重新加载!');
+		//console.error(error);
+		// 判断请求异常信息中是否含有超时timeout字符串
+		if (error.message.includes('timeout')) {
+			return Promise.reject('请求超时,请稍后再试');
+		} else if (error.message.includes('NetworkError')) {
+			return Promise.reject('网络错误,请稍后再试');
+		}
+		return Promise.reject(error);
+	}
+);
+
+export default service;

+ 111 - 0
src/projects/pension/views/Common/Device/List.vue

@@ -0,0 +1,111 @@
+<template>
+	<div>
+
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle"></top-header>
+
+		<div class="mui-content">
+			<div class="mui-content-padded">
+				<h5>
+					设备列表
+					<span class='mui-pull-right'>
+						<span class="color55f868">在线</span> {{onNum}} 台 / <span class="colorfe616c">离线</span> {{offNum}} 台
+					</span>
+				</h5>
+
+			</div>
+
+			<ul class="mui-table-view">
+				<li class="mui-table-view-cell mui-media" v-for="(device,index) in devices">
+					<a>
+						<div class="mui-media-body flew-sp">
+							{{index+1}}.{{device.aliasName}}
+							<h4 class='flew-items'>
+								<span class="vongi-sbzt-yuan " :class="device.isOnline?'yuan-green':'yuan-red'"></span>
+								{{device.isOnline?'在线':'离线'}}
+							</h4>
+						</div>
+					</a>
+				</li>
+
+			</ul>
+
+		</div>
+		<loading :visible="isLoading"></loading>
+
+	</div>
+</template>
+
+
+<script>
+	import * as API_Device from '@/apis/Common/device'
+
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'CommonDeviceList',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '设备列表',
+				devices: [],
+				isLoading: false,
+				onNum: 0,
+				offNum: 0,
+			}
+		},
+		created() {
+			this.pageTitle = this.person_data.companyName;
+		},
+		methods: {
+			//获取列表
+			getList() {
+				API_Device.listOfDevice({
+					schoolId: this.person_data.companyId
+				}).then(data => {
+					this.devices = data;
+					for (var i in data) {
+						if (data[i].isOnline) {
+							this.onNum++;
+						} else {
+							this.offNum++;
+						}
+					}
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			asynCallBack() {
+
+			},
+		},
+		mounted() {
+			//获取列表
+			this.getList();
+		},
+		destroyed() {},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+				person_popedom: 'person_popedom',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style>
+</style>

+ 118 - 0
src/projects/pension/views/Common/Device/OpenDoor.vue

@@ -0,0 +1,118 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle"></top-header>
+
+		<div class="mui-content">
+			<div class="vongi-opendoor">
+				<div class="flew-items">
+					<div class="mui-col-xs-3">
+						<div class="vongi-opendoor-img">
+							<img :src="person_data.faceImageUrl" />
+						</div>
+						{{person_popedom.personRoleName}}
+					</div>
+					<div class="mui-col-xs-9 mui-media-body">
+						{{person_popedom.companyName}}
+						<h5 v-text="person_popedom.deptName"></h5>
+					</div>
+				</div>
+				<div class="vongi-yuan vongi-yuan1"></div>
+				<div class="vongi-yuan vongi-yuan2"></div>
+			</div>
+			<div class="vongi-opendoor-bottom">
+				<div v-for="(item,index) in doorList" class="flew-sp">
+					{{item.name}}
+					<button :disabled="!item.isOnline" class="mui-btn mui-btn-primary" @click="open(item.id)">开门</button>
+				</div>
+			</div>
+		</div>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	import * as API_Device from '@/apis/Common/device'
+
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'CommonDeviceOpenDoor',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '手机开门',
+				doorList: [],
+				isLoading: false,
+				onNum: 0,
+				offNum: 0,
+			}
+		},
+		created() {},
+		methods: {
+			//获取列表
+			getDoorList() {
+				this.isLoading = true;
+				API_Device.getDoorList().then(response => {
+					this.isLoading = false;
+					this.doorList = response;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//开门
+			open(id) {
+				var _this = this;
+				var btnArray = ['否', '是'];
+				mui.confirm('确认开门?', '提示', btnArray, function(e) {
+					if (e.index == 1) {
+						_this.openDoor(id);
+					}
+				})
+			},
+			//开门操作
+			openDoor(id) {
+				this.isLoading = true;
+				API_Device.openDoor(id).then(response => {
+					this.isLoading = false;
+					mui.toast('开门成功');
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			asynCallBack() {
+
+			},
+		},
+		mounted() {
+			//获取列表
+			this.getDoorList();
+		},
+		destroyed() {},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+				person_popedom: 'person_popedom',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpgj.css"></style>
+<style scoped>
+</style>

+ 392 - 0
src/projects/pension/views/Common/Health/Cert.vue

@@ -0,0 +1,392 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle" :rightLink="rightLink" :doRightLink="doRightLink" :headerStyle="'background-color:'+statusTitleColor"></top-header>
+		<green-code ref="greenCode" :personId="subForm.personId"></green-code>
+
+		<div class="mui-content vongi-jkz-content">
+			<div class="vongi-jkz-content mui-content-padded mui-clearfix">
+				<div class="vongi-jkz-left mui-col-xs-5">
+					<div class="mui-content-padded faceaifyy-content">
+						<div class="faceaifyy-content-region">
+							<img :src="detail.faceImageUrl">
+						</div>
+						<div class="mui-media-body" style="width: 100%;">最近体温测量<span :style="'color:'+statusTitleColor" v-text="detail.lastTemperature+'℃'"></span></div>
+					</div>
+				</div>
+				<div class="vongi-jkz-right mui-col-xs-7">
+					<ul class="mui-table-view mui-grid-view mui-grid-9 fyy-statistics">
+						<li class="mui-table-view-cell mui-media mui-col-xs-12">
+							<div class="vongi-jkz-list">
+								<div class="fyy-statistics-body">
+									<h2>{{detail.name}}<span :style="'color:'+statusTitleColor">{{statusName}}</span></h2>
+									<a class="mui-navigate-right" @click="showGreenCode">
+										<span class="mui-icon iconfont icon-erweima1" :style="'color: '+statusTitleColor+';margin-right:15px;line-height: 27px'"></span>
+									</a>
+								</div>
+								<div class="mui-ellipsis mui-h5" v-text="detail.parking"></div>
+								<div class="mui-ellipsis mui-h5" v-text="detail.companyName"></div>
+							</div>
+						</li>
+						<li class="mui-table-view-cell mui-media mui-col-xs-6">
+							<div class="vongi-jkz-list">
+								<div class="fyy-statistics-body">
+									<h3><span class="color55f868 mui-h1" v-text="detail.totalDays"></span>天</h3>
+								</div>
+								<div class="mui-media-body">已连续正常天数</div>
+							</div>
+						</li>
+						<li class="mui-table-view-cell mui-media mui-col-xs-6">
+							<div class="vongi-jkz-list">
+								<div class="fyy-statistics-body">
+									<h3><span class="colorfe616c mui-h1" v-text="detail.undetectedCount"></span>次</h3>
+								</div>
+								<div class="mui-media-body">漏测记录</div>
+							</div>
+						</li>
+					</ul>
+				</div>
+			</div>
+			<div class="mui-content-padded fyy-echarts">
+				<div class="fyy-echarts-inter" v-for="(item,index) in chartsList">
+					<h4 class="colorf6f448">{{item.startDate}}~{{item.endDate}}</h4>
+					<div :id="'linePicture'+index" style="width:100%;"></div>
+				</div>
+				<!-- <div class="fyy-annotation" @click="doChartTips">
+					<div class="fyy-annotation-color">
+						<span class="color09ae47"></span><span>14天连续测温正常</span>
+					</div>
+					<div class="fyy-annotation-color">
+						<span class="colorfe616c"></span><span>7天内有一次以上异常</span>
+					</div>
+					<div class="fyy-annotation-color">
+						<span class="colord39d33"></span><span>14天内有一次以上异常</span>
+					</div>
+				</div> -->
+			</div>
+		</div>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	import * as API_Health from '@/apis/Common/health'
+	import GreenCode from '@/components/GreenCode.vue'
+	import echarts from 'echarts/lib/echarts'
+	import 'echarts/lib/chart/line'
+	import 'echarts/lib/component/legend'
+	import 'echarts/lib/component/title'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'CommonHealthCert',
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			GreenCode
+		},
+		data() {
+			return {
+				pageTitle: '健康证',
+
+				isLoading: false,
+
+				rightLink: {
+					show: true,
+					icon: 'icon-shijian',
+					style: 'font-size:14px;color:#000;',
+					title: '测温记录'
+				},
+
+				detail: {},
+
+				subForm: {
+					personId: ''
+				},
+				chartsList: [],
+				maxTemparture: 37,
+				//和下面的对应默认值
+				lineColor: '#e5aa37',
+				statusColor: '#e5aa37',
+				statusTitleColor: '#d39d33',
+				statusName: '异常',
+			}
+		},
+		created() {
+			this.subForm.personId = this.$route.query.personId ? this.$route.query.personId : this.person_data.id;
+		},
+		methods: {
+			//获取详情
+			getDetail() {
+				this.isLoading = true;
+				API_Health.getCertDetail(this.subForm).then(response => {
+					this.detail = response;
+					this.maxTemparture = response.temperatureMax;
+
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//获取统计图表数据
+			getEcharts() {
+				this.isLoading = true;
+				API_Health.getCertList(this.subForm).then(response => {
+					this.chartsList = response;
+					if (response.length > 0) {
+						this.maxTemparture = response[0]['temperatureMax'];
+						this.detail.totalDays = response[0]['totalDays'];
+						this.detail.undetectedCount = response[0]['undetectedCount'];
+						//this.getStatus()
+						//只根据绿码来判断状态
+						this.getGreenCode()
+						this.echarts();
+					}
+
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//根据绿码显示颜色
+			getGreenCode() {
+				var colors = this.$refs.greenCode.getCode();
+				this.statusColor = colors.foreground;
+				this.statusTitleColor = colors.foreground;
+				this.statusName = colors.title;
+				console.log(colors);
+			},
+			//计算显示颜色
+			getStatus() {
+				if (this.chartsList.length) {
+					var chartList = this.chartsList[0]['list'].slice();
+					chartList.reverse();
+					//console.log(chartList)
+					for (var index in chartList) {
+						if (chartList[index]['value'] >= this.maxTemparture && index < 7) {
+							this.statusColor = '#fe616c';
+							this.statusTitleColor = '#ed5b65';
+							this.statusName = '异常';
+							break;
+						} else if (chartList[index]['value'] >= this.maxTemparture && index < 14) {
+							this.statusColor = '#e5aa37';
+							this.statusTitleColor = '#d39d33';
+							this.statusName = '异常';
+							break;
+						} else {
+							this.statusColor = '#0bcf54';
+							this.statusTitleColor = '#09ae47';
+							this.statusName = '正常';
+						}
+					}
+
+					//如果全为0则显示默认值
+					var allzero = true;
+					for (var index in chartList) {
+						if (chartList[index]['value'] > 0) {
+							allzero = false;
+							break;
+						}
+					}
+					if (allzero) {
+						this.statusColor = '#e5aa37';
+						this.statusTitleColor = '#d39d33';
+						this.statusName = '异常';
+					}
+				}
+			},
+			echarts() {
+				this.$nextTick(() => {
+					var _titleData = [];
+					var _listData = [];
+					for (var index in this.chartsList) {
+						for (var k in this.chartsList[index]['list']) {
+							_titleData.push(this.chartsList[index]['list'][k]['name']);
+							_listData.push(this.chartsList[index]['list'][k]['value']);
+						}
+					}
+
+					console.log(_titleData);
+					console.log(_listData);
+					for (var index in this.chartsList) {
+						var _this = this;
+						//是否有异常数据
+						for (var k in this.chartsList[index]['list']) {
+							if (this.chartsList[index]['list'][k]['value'] >= this.maxTemparture) {
+								this.lineColor = 'yellow';
+								break;
+							}
+						}
+
+						var wheight = window.screen.height;
+						if (wheight < 480) {
+							var rHeight = '180';
+							var gHeight = '130';
+						} else if (wheight >= 480 && wheight <= 568) {
+							var rHeight = '190';
+							var gHeight = '130';
+						} else if (wheight > 568 && wheight <= 736) {
+							var rHeight = '200';
+							var gHeight = '130';
+						} else {
+							var rHeight = '230';
+							var gHeight = '180';
+						}
+
+						// 基于准备好的dom,初始化echarts实例
+						var myChart = echarts.init(document.getElementById('linePicture' + index));
+						// 指定图表的配置项和数据
+						var option = {
+							xAxis: {
+								type: 'category',
+								boundaryGap: false,
+								data: _titleData,
+								axisLabel: {
+									textStyle: {
+										color: '#fff',
+										fontSize: '12'
+									},
+									showMinLabel: true,
+									showMaxLabel: true,
+								},
+								axisLine: {
+									lineStyle: {
+										type: 'solid',
+										color: '#fff',
+										//width: '2'
+									}
+								},
+							},
+							yAxis: {
+								type: 'value',
+								axisLabel: {
+									textStyle: {
+										color: '#fff',
+										//fontSize: '12'
+									},
+								},
+								min: 30,
+								max: 40,
+								splitNumber: 6,
+								axisLine: {
+									lineStyle: {
+										type: 'solid',
+										color: '#fff',
+										//width: '2'
+									}
+								},
+								splitLine: {
+									lineStyle: {
+										type: 'dashed',
+										color: '#404978',
+									}
+								}
+							},
+							series: [{
+								data: _listData,
+								type: 'line',
+								//smooth: true,
+								markLine: { //添加警戒线
+									symbol: "none", //去掉警戒线最后面的箭头
+									name: "",
+									silent: true,
+									precision: 2,
+									data: [{
+										silent: true, //鼠标悬停事件  true没有,false有
+										lineStyle: { //警戒线的样式  ,虚实  颜色
+											type: "solid",
+											color: "red"
+										},
+										label: {
+											position: 'start'
+										},
+										yAxis: _this.maxTemparture
+									}]
+								},
+								lineStyle: {
+									normal: {
+										color: _this.statusColor //改变区域颜色
+									}
+								},
+								areaStyle: {
+									color: _this.statusColor,
+								}
+							}],
+							visualMap: {
+								show: false,
+								//dimension: 0,
+								seriesIndex: 0,
+								pieces: [{
+									gt: _this.maxTemparture,
+									lt: 40,
+									color: 'red'
+								}, {
+									gt: 0,
+									lt: _this.maxTemparture,
+									color: 'green'
+								}],
+							},
+							grid: {
+								show: true,
+								x: 40,
+								x2: 30,
+								y: 20,
+								height: gHeight
+							},
+						};
+
+						// 使用刚指定的配置项和数据显示图表。
+						myChart.setOption(option);
+						myChart.resize({
+							height: rHeight + 'px'
+						})
+					}
+				});
+			},
+			//显示健康码
+			showGreenCode() {
+				this.$refs.greenCode.showGreenCode();
+			},
+			//右上角点击事件
+			doRightLink() {
+				this.$router.push({
+					name: 'CommonHealthTemperatureRecord',
+					query: {}
+				})
+			},
+			asynCallBack() {},
+		},
+		mounted() {
+			//获取详情
+			this.getDetail();
+			//获取统计图表
+			this.getEcharts();
+
+			this.$refs.greenCode.getGreenCode();
+		},
+		destroyed() {},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+                person_popedom: 'person_popedom',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style scoped src="$project/assets/css/sczpfyy.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style scoped>
+</style>

+ 117 - 0
src/projects/pension/views/Common/Health/TemperatureInfo.vue

@@ -0,0 +1,117 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle" :rightLink="rightLink" :doRightLink="doRightLink"></top-header>
+
+		<div class="mui-content fyy-detail-content mui-fullscreen">
+			<div class="mui-content-padded fyynew-detail">
+				<div class="fyynew-detail-photo">
+					<div class="fyynew-detail-region">
+						<img :src="detail.faceImage">
+					</div>
+				</div>
+				<div class="fyynew-detail-title" :style="detail.fever?'background: rgba(254,97,108,0.6);':'background: rgba(5,200,175,0.6);'"
+				 v-text="detail.fever?'检测异常':'检测正常'"></div>
+				<div class="fyynew-detail-wendu" :style="'background-color:'+detail.fever?'#fe616c':'#05c8af'" v-text="detail.temperature"></div>
+				<div class="fyynew-detail-text">
+					<h4 v-text="detail.personName"></h4>
+					<ul class="mui-table-view fyy-view">
+						<li class="mui-table-view-cell">
+							<label>检测时间</label>
+							<span v-text="detail.recordTime"></span>
+						</li>
+						<li class="mui-table-view-cell">
+							<label>设备名称</label>
+							<span v-text="detail.deviceName"></span>
+						</li>
+					</ul>
+				</div>
+			</div>
+		</div>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	import * as API_Health from '@/apis/Common/health'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'CommonHealthTemperatureInfo',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '详情',
+
+				isLoading: false,
+
+				rightLink: {
+					show: true,
+					icon: 'icon-tongji',
+					style: 'font-size:14px',
+					title: '健康统计'
+				},
+
+				detail: {},
+
+				subForm: {
+					id: this.$route.query.id
+				},
+			}
+		},
+		created() {
+
+		},
+		methods: {
+			//获取详情
+			getInfo() {
+				this.isLoading = true;
+				API_Health.getTemperatureInfo(this.subForm).then(response => {
+					this.detail = response;
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//右上角点击事件
+			doRightLink() {
+				this.$router.push({
+					name: 'CommonHealthCert',
+					query: {
+						personId: this.detail.personId
+					}
+				})
+			},
+			asynCallBack() {},
+		},
+		mounted() {
+			this.getInfo();
+		},
+		destroyed() {},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+                person_popedom: 'person_popedom',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style scoped src="$project/assets/css/sczpfyy.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style scoped>
+</style>

+ 158 - 0
src/projects/pension/views/Common/Health/TemperatureRecord.vue

@@ -0,0 +1,158 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle" :rightLink="rightLink" :doRightLink="doRightLink"></top-header>
+
+		<div class="mui-content">
+			<div class="mui-content-padded">
+				<ul class="mui-table-view openfyy-list">
+					<li v-for="(item,index) in recordList" @click="goToPage(item.id)" class="mui-table-view-cell mui-media flew-sp">
+						<div class="mui-h4">
+							<span v-text="item.recordTime"></span>
+							<!-- <button>设备测温</button> -->
+						</div>
+						<span class="mui-navigate-right">
+							<p class="color05c8af">
+								{{item.fever?'异常':'正常'}}
+								<!-- <span v-text="item.temperature"></span> -->
+							</p>
+						</span>
+					</li>
+				</ul>
+			</div>
+		</div>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	import * as API_Health from '@/apis/Common/health'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import isReachBottom from '$project/utils/isReachBottom'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'CommonHealthTemperatureRecord',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '测温记录',
+
+				isLoading: false,
+
+				rightLink: {
+					show: true,
+					icon: 'icon-baojing',
+					style: 'font-size:14px',
+					title: '异常记录'
+				},
+
+				recordList: [],
+
+				listForm: {
+					pageIndex: 1,
+					pageSize: 20,
+					token: '',
+					fever: '',
+					totalPage: 1
+				},
+			}
+		},
+		created() {
+
+		},
+		methods: {
+			goToPage(id) {
+				this.$router.push({
+					name: 'CommonHealthTemperatureInfo',
+					query: {
+						id: id
+					}
+				})
+			},
+			//获取列表
+			getList() {
+				this.isLoading = true;
+				API_Health.getRecordList(this.listForm).then(response => {
+					if (response) {
+						if (this.listForm.pageIndex == 1) {
+							this.recordList = response.data;
+							this.listForm.pageIndex = response.pageNumber;
+							this.listForm.totalPage = response.totalPage;
+						} else {
+							this.recordList = [
+								...this.recordList,
+								...response.data
+							];
+						}
+					}
+					this.listForm.pageIndex++;
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//下拉事件
+			handleScrool() {
+				if (isReachBottom()) {
+					console.log('到达底部')
+					if (this.listForm.pageIndex <= this.listForm.totalPage && this.isLoading == false) {
+						this.getList();
+					} else {
+						return;
+					}
+				}
+			},
+			//右上角点击事件
+			doRightLink() {
+				this.listForm.pageIndex = 1;
+				this.listForm.fever = this.listForm.fever == 1 ? '' : 1;
+				this.getList();
+			},
+			asynCallBack() {},
+		},
+		mounted() {
+			this.getList();
+			//监控下拉加载事件
+			var _this = this;
+			window.addEventListener('scroll', _this.handleScrool);
+		},
+		destroyed() {
+			//销毁监听事件
+			var _this = this;
+			window.removeEventListener('scroll', _this.handleScrool);
+		},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+                person_popedom: 'person_popedom',
+			})
+		},
+		watch: {
+			'listForm.fever': function(newValue, oldValue) {
+				if (newValue == 1) {
+					this.rightLink.title = '全部记录';
+				} else {
+					this.rightLink.title = '异常记录';
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style scoped>
+</style>

+ 119 - 0
src/projects/pension/views/Common/Notice/Home.vue

@@ -0,0 +1,119 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle"></top-header>
+
+		<div class="mui-content">
+			<div class="mui-content-padded">
+				<ul class="mui-table-view openfyy-list">
+					<li class="mui-table-view-cell mui-media" v-for="(item,index) in recordList">
+						<router-link :to="{name:'CommonNoticeInfo',query:{id:item.id}}" class="mui-navigate-right">
+							<div class="mui-media-body">
+								{{item.title}}
+								<p class="mui-ellipsis" v-text="item.createTime"></p>
+							</div>
+						</router-link>
+					</li>
+				</ul>
+			</div>
+		</div>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	import * as API_Notice from '@/apis/Common/notice'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import isReachBottom from '$project/utils/isReachBottom'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'CommonNotice',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '消息列表',
+
+				isLoading: false,
+
+				listForm: {
+					pageIndex: 1,
+					pageSize: 20,
+					totalPage: 1,
+					type: this.$route.query.type
+				},
+				recordList: [],
+			}
+		},
+		created() {},
+		methods: {
+			//获取列表
+			getList() {
+				this.isLoading = true;
+				API_Notice.getMessageList(this.listForm).then(response => {
+					if (response) {
+						if (this.listForm.pageIndex == 1) {
+							this.recordList = response.data;
+							this.listForm.pageIndex = response.pageNumber;
+							this.listForm.totalPage = response.totalPage;
+						} else {
+							this.recordList = [
+								...this.recordList,
+								...response.data
+							];
+						}
+					}
+					this.listForm.pageIndex++;
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//下拉事件
+			handleScrool() {
+				if (isReachBottom()) {
+					console.log('到达底部')
+					if (this.listForm.pageIndex <= this.listForm.totalPage && this.isLoading == false) {
+						this.getList();
+					} else {
+						return;
+					}
+				}
+			},
+			asynCallBack() {
+
+			},
+		},
+		mounted() {
+			this.getList();
+			//监控下拉加载事件
+			var _this = this;
+			window.addEventListener('scroll', _this.handleScrool);
+		},
+		destroyed() {
+			//销毁监听事件
+			var _this = this;
+			window.removeEventListener('scroll', _this.handleScrool);
+		},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style scoped>
+</style>

+ 109 - 0
src/projects/pension/views/Common/Notice/Info.vue

@@ -0,0 +1,109 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle"></top-header>
+
+		<div class="mui-content">
+			<div class="vongi-notice">
+				<div class="mui-h3">
+					{{detail.title}}
+					<h6 v-text="detail.createTime"></h6>
+				</div>
+				<p v-html="detail.content"></p>
+			</div>
+			<div v-if="noticeList.length" class="vongi-notice-list">
+				<h3><img src="~$project/assets/img/text.png" width="12" />相关内容</h3>
+				<div class="vongi-floor-padded">
+					<router-link :to="{name:'CommonNoticeInfo',query:{id:item.id}}" v-for="(item,index) in noticeList" :key="index"
+					 class="mui-ellipsis" v-text="item.title"></router-link>
+				</div>
+			</div>
+		</div>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	import * as API_Notice from '@/apis/Common/notice'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'CommonNoticeInfo',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '消息详情',
+
+				isLoading: false,
+
+				id: this.$route.query.id,
+				detail: [],
+
+				noticeList: [],
+			}
+		},
+		created() {
+
+		},
+		methods: {
+			//获取详情
+			getDetail() {
+				this.isLoading = true;
+				API_Notice.getMessageInfo(this.id).then(response => {
+
+					this.detail = response;
+
+					this.isLoading = false;
+					//获取最新5条通知消息
+					this.getLastNotice();
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//获取最新5条通知消息
+			getLastNotice() {
+				this.isLoading = true;
+				API_Notice.getTopList({
+					type: this.detail.type,
+					limit: 5,
+					excludeMessageId: this.id
+				}).then(response => {
+					this.noticeList = response;
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			asynCallBack() {
+
+			},
+		},
+		mounted() {
+			//获取详情
+			this.getDetail();
+		},
+		destroyed() {},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style scoped>
+</style>

+ 113 - 0
src/projects/pension/views/Common/Notice/Send.vue

@@ -0,0 +1,113 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle"></top-header>
+
+		<div class="mui-content margin60">
+			<form class="mui-input-group vongi-send">
+				<div class="mui-input-row">
+					<label>通知标题</label>
+					<input type="text" v-model="addForm.title" placeholder="请输入标题">
+				</div>
+
+				<textarea-check v-model="addForm.content" :max="1000" :placeholder="'请填写内容,最多可输入1000字'"></textarea-check>
+
+			</form>
+		</div>
+		<div class="fyy-footer">
+			<div class="bindfyy-btn">
+				<button type="submit" class="mui-btn mui-btn-primary " @click="submit">发送</button></div>
+		</div>
+		<loading :visible="isLoading"></loading>
+
+	</div>
+</template>
+
+
+<script>
+	import * as API_Notice from '@/apis/Common/notice'
+
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import TextareaCheck from '$project/components/TextareaCheck.vue'
+
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'CommonNoticeSend',
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			TextareaCheck
+		},
+		data() {
+			return {
+				pageTitle: '发送通知',
+
+				isLoading: false,
+
+				addForm: {
+					title: '',
+					content: '',
+				},
+				detail: {},
+			}
+		},
+		created() {
+
+		},
+		methods: {
+
+			//表单校验
+			checkForm() {
+				if (!this.addForm.title) {
+					mui.toast('请输入通知标题');
+					return false;
+				} else if (!this.addForm.content) {
+					mui.toast('请输入通知内容');
+					return false;
+				} else {
+					return true;
+				}
+			},
+			//提交
+			submit() {
+				if (this.checkForm()) {
+					this.isLoading = true;
+					API_Notice.sendMessage(this.addForm).then(response => {
+						this.isLoading = false;
+						mui.toast("发送成功");
+						//跳转首页
+						this.$router.push({
+							name: 'Master',
+							query: {}
+						})
+
+					}).catch(error => {
+						this.isLoading = false;
+						mui.toast(error);
+					})
+				}
+			},
+			asynCallBack() {
+
+			},
+		},
+		mounted() {
+
+		},
+		destroyed() {},
+		computed: {
+
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style scoped>
+</style>

+ 11 - 0
src/projects/pension/views/Home.vue

@@ -0,0 +1,11 @@
+<template>
+	<div>
+	</div>
+</template>
+
+<script>
+	export default {
+		name: 'Home',
+		components: {}
+	}
+</script>

+ 11 - 0
src/projects/pension/views/Layout.vue

@@ -0,0 +1,11 @@
+<template>
+	<div>
+		<router-view></router-view>
+	</div>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 77 - 0
src/projects/pension/views/Master/AllFun.vue

@@ -0,0 +1,77 @@
+<template>
+	<div id="app">
+		<common ref="common" @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle"></top-header>
+
+		<div class="mui-content">
+			<div class="vongi-icons vongi-all">
+				<div v-for="(iten,indey) in fun_list">
+					<h4 v-text="iten.name"></h4>
+					<ul class="mui-table-view mui-grid-view mui-grid-9">
+						<li v-for="(item,index) in iten.list" :class="'mui-table-view-cell mui-media mui-col-xs-3 '+(item.iconRoute?'':'kfz')">
+							<router-link :to="{name:item.iconRoute}">
+								<img :src="requirePic(item.iconPic)" />
+								<div class="mui-media-body" v-text="item.iconName"></div>
+							</router-link>
+						</li>
+					</ul>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import NavMenu from '@/components/NavMenu.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'MasterAllFun',
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			NavMenu
+		},
+		data() {
+			return {
+				isLoading: false,
+
+				pageTitle: '全部应用',
+			}
+		},
+		created() {},
+		methods: {
+			//引入图片
+			requirePic(file) {
+				return require('$project/assets/img/' + file);
+			},
+			asynCallBack() {
+
+			},
+		},
+		mounted() {},
+		destroyed() {
+
+		},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+				person_popedom: 'person_popedom',
+				fun_list: 'fun_list'
+			})
+		}
+	}
+</script>
+
+
+<style scoped src="$project/assets/css/xpgj.css"></style>
+<style>
+</style>

+ 8 - 0
src/projects/pension/views/Master/Health/Archives.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 302 - 0
src/projects/pension/views/Master/Home.vue

@@ -0,0 +1,302 @@
+<template>
+	<div>
+		<common ref="common" @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle" headerClass="vongi-bar"></top-header>
+
+		<div class="mui-content margin49">
+			<div class="vongi-index">
+				<div class="vongi-index-top">
+					<div class="mui-media-object mui-pull-left">
+						<img :src="person_data?person_data.faceImageUrl:''">
+					</div>
+					<div class="mui-media-body">
+						<h3 v-text="person_data?person_data.name:''"></h3>
+						<p class='mui-ellipsis' v-text="person_data?person_data.companyName:''"></p>
+					</div>
+					<a class="mui-pull-right" @click="selectRole">切换身份<span class="mui-icon iconfont icon-jiaohuan"></span></a>
+				</div>
+			</div>
+			<div class="vongi-icons">
+				<div class="vongi-index">
+					<ul class="mui-table-view mui-grid-view mui-grid-9 vongi-grid-head">
+						<li class="mui-table-view-cell mui-media mui-col-xs-3">
+							<router-link :to="{name:'CommonHealthCert'}">
+								<img src="~$project/assets/img/icon54.png" />
+								<div class="mui-media-body">健康证</div>
+							</router-link>
+						</li>
+						<li class="mui-table-view-cell mui-media mui-col-xs-3">
+							<router-link :to="{name:'CommonHealthTemperatureRecord'}">
+								<img src="~$project/assets/img/icon41.png" />
+								<div class="mui-media-body">测温记录</div>
+							</router-link>
+						</li>
+						<li class="mui-table-view-cell mui-media mui-col-xs-3">
+							<router-link :to="{name:'MasterAttendanceList'}">
+								<img src="~$project/assets/img/icon39.png" />
+								<div class="mui-media-body">考勤记录</div>
+							</router-link>
+						</li>
+						<li class="mui-table-view-cell mui-media mui-col-xs-3">
+							<router-link :to="{name:'MasterAttendanceLeaveList'}">
+								<img src="~$project/assets/img/icon.png" />
+								<div class="mui-media-body">请假</div>
+							</router-link>
+						</li>
+					</ul>
+				</div>
+				<ul class="mui-table-view mui-grid-view mui-grid-9">
+					<li v-for="(item,index) in menu_list" :class="'mui-table-view-cell mui-media mui-col-xs-3 '+(item.iconRoute?'':'kfz')">
+						<router-link :to="{name:item.iconRoute}">
+							<img :src="requirePic(item.iconPic)" />
+							<div class="mui-media-body" v-text="item.iconName"></div>
+						</router-link>
+					</li>
+					<li class="mui-table-view-cell mui-media mui-col-xs-3">
+						<router-link :to="{name:'MasterAllFun'}">
+							<img src="~$project/assets/img/cicon30.png" />
+							<div class="mui-media-body">全部</div>
+						</router-link>
+					</li>
+				</ul>
+			</div>
+			<div class="vongi-index-floor">
+				<h4 class="vongi-floor-title">功能推荐区</h4>
+				<div class="vongi-index-inter flew-sp">
+					<div class="mui-col-xs-6">
+						<router-link :to="{name:'MasterMineEditInfo'}" class="vongi-floor-padded">
+							<div class="mui-media-body">
+								<h4 class="mui-ellipsis">关联健康码</h4>
+								<p class="mui-ellipsis">出行更便捷</p>
+							</div>
+							<img class="mui-media-object mui-pull-right" src="~$project/assets/img/cicon15.png" width="54" />
+						</router-link>
+					</div>
+					<div class="mui-col-xs-6">
+						<router-link :to="{name:'MasterMineEditInfo'}" class="vongi-floor-padded">
+							<div class="mui-media-body">
+								<h4 class="mui-ellipsis">上传登记照</h4>
+								<p class="mui-ellipsis">打卡快人一步</p>
+							</div>
+							<img class="mui-media-object mui-pull-right" src="~$project/assets/img/cicon18.png" width="54" />
+						</router-link>
+					</div>
+					<div v-if="noticeList.length" class="mui-col-xs-12">
+						<div class="vongi-floor-padded">
+							<router-link :to="{name:'CommonNotice'}" v-for="(item,index) in noticeList" :key="index" class="text-list">
+								<h5 class="mui-ellipsis" v-text="item.title"></h5><span v-text="item.date"></span>
+							</router-link>
+						</div>
+						<router-link :to="{name:'CommonNotice'}" class="vongi-link"><span class="mui-icon mui-icon-forward"></span></router-link>
+					</div>
+					<div class="mui-col-xs-12">
+						<div id="slider" class="mui-slider">
+							<div class="mui-slider-group">
+								<!-- 第一张 -->
+								<div class="mui-slider-item">
+									<a href="javascript:void(0)">
+										<img src="~$project/assets/img/02.jpg">
+									</a>
+								</div>
+								<!-- 第二张 -->
+								<div class="mui-slider-item">
+									<a href="javascript:void(0)">
+										<img src="~$project/assets/img/02.jpg">
+									</a>
+								</div>
+							</div>
+							<div class="mui-slider-indicator">
+								<div class="mui-indicator mui-active"></div>
+								<div class="mui-indicator"></div>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="vongi-index-floor kfz">
+				<h4 class="vongi-floor-title">优品推荐</h4>
+				<div class="vongi-index-inter flew-sp">
+					<div class="mui-col-xs-12">
+						<ul class="mui-table-view mui-grid-view mui-grid-9 vongi-floor-padded">
+							<li class="mui-table-view-cell mui-media mui-col-xs-4">
+								<a href="javascript:void(0)">
+									<div class="vongi-shop-img"><img src="~$project/assets/img/01.png" width="100%" /></div>
+									<div class="mui-media-body">老人防丢手环</div>
+									<div class="mui-media-body color-yellow">¥299.0</div>
+								</a>
+							</li>
+							<li class="mui-table-view-cell mui-media mui-col-xs-4">
+								<a href="javascript:void(0)">
+									<div class="vongi-shop-img"><img src="~$project/assets/img/01.png" width="100%" /></div>
+									<div class="mui-media-body">老人防丢手环</div>
+									<div class="mui-media-body color-yellow">¥299.0</div>
+								</a>
+							</li>
+							<li class="mui-table-view-cell mui-media mui-col-xs-4">
+								<a href="javascript:void(0)">
+									<div class="vongi-shop-img"><img src="~$project/assets/img/01.png" width="100%" /></div>
+									<div class="mui-media-body">老人防丢手环</div>
+									<div class="mui-media-body color-yellow">¥299.0</div>
+								</a>
+							</li>
+						</ul>
+					</div>
+				</div>
+			</div>
+		</div>
+
+		<nav-menu :router="[{name:'Master'},{name:'MasterMineMessage'},{name:'MasterMineCenter'}]"></nav-menu>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	require('$project/assets/js/mui.picker.min.js');
+	import * as API_Notice from '@/apis/Common/notice'
+	import * as API_User from '$project/apis/user'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import NavMenu from '@/components/NavMenu.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'Master',
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			NavMenu
+		},
+		data() {
+			return {
+				isLoading: false,
+
+				roleList: [],
+
+				noticeList: [],
+			}
+		},
+		created() {},
+		methods: {
+			//获取用户角色列表
+			getRoleList() {
+				this.isLoading = true;
+				API_User.getRoleList().then(response => {
+					this.isLoading = false;
+
+					this.roleList = response.list;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//选择角色
+			selectRole() {
+				var roleList = [];
+				for (var i = 0; i < this.roleList.length; i++) {
+					roleList.push({
+						value: this.roleList[i]['id'],
+						text: this.roleList[i]['companyName'] + ' ' + this.roleList[i]['personRoleName'],
+					})
+				}
+				var _this = this;
+				var picker = new mui.PopPicker();
+				picker.setData(roleList);
+				picker.show(function(selectItems) {
+					_this.switchRole(selectItems[0].value);
+				})
+			},
+			//切换角色
+			switchRole(id) {
+				this.isLoading = true;
+				API_User.exchangePopedom({
+					id: id
+				}).then(response => {
+					this.isLoading = false;
+
+					this.$refs.common.getDataByOpenId();
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//预读取通知消息
+			prefetchNotice() {
+				this.isLoading = true;
+				API_Notice.prefetch().then(response => {
+					this.isLoading = false;
+
+					this.getLastNotice();
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//获取最新二条通知消息
+			getLastNotice() {
+				this.isLoading = true;
+				API_Notice.getTopList({
+					type: 1,
+					limit: 2,
+					excludeMessageId: ''
+				}).then(response => {
+					this.noticeList = response;
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//引入图片
+			requirePic(file) {
+				return require('$project/assets/img/' + file);
+			},
+			asynCallBack() {
+				//获取用户角色列表
+				this.getRoleList();
+			},
+		},
+		mounted() {
+			//获取最新二条通知消息
+			this.prefetchNotice();
+
+			var gallery = mui('.mui-slider');
+			var slider = gallery.slider({
+				interval: 2000, //自动轮播周期,若为0则不自动播放,默认为0;
+				bounce: true //是否启用回弹
+			});
+		},
+		destroyed() {
+
+		},
+		computed: {
+			pageTitle: {
+				// getter
+				get: function() {
+					return this.person_data ? this.person_data.companyName : '小鹏管家';
+				},
+				// setter
+				set: function(newValue) {
+					console.log(newValue)
+				}
+			},
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+				person_popedom: 'person_popedom',
+				menu_list: 'menu_list'
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpgj.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style src="$project/assets/css/mui.picker.min.css"></style>
+<style scoped>
+</style>

+ 8 - 0
src/projects/pension/views/Master/Mine/About.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 8 - 0
src/projects/pension/views/Master/Mine/Bill/Info.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 8 - 0
src/projects/pension/views/Master/Mine/Bill/List.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 8 - 0
src/projects/pension/views/Master/Mine/Bill/Record.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 8 - 0
src/projects/pension/views/Master/Mine/BindPhone.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 150 - 0
src/projects/pension/views/Master/Mine/Center.vue

@@ -0,0 +1,150 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+
+		<div class="mui-content margin49">
+			<div class="vongi-icon-gear">
+				<router-link id="icon-gear" :to="{name:'MasterMineConfig'}" class="mui-icon mui-icon-gear"></router-link>
+			</div>
+			<div class="vongi-me">
+				<div class="vongi-me-name">
+					<div class="vongi-me-top">
+						<div class="flew-items">
+							<div class="mui-media-object mui-pull-left">
+								<img :src="person_data.faceImageUrl" />
+							</div>
+							<h2>{{wellcomme}}{{person_data.name}}</h2>
+						</div>
+						<h4 v-text="person_data.phone"></h4>
+					</div>
+					<button type="button" class="mui-btn mui-btn-primary mui-btn-outlined" @click="editInfo">
+						编辑资料
+					</button>
+				</div>
+				<div class="vongi-me-card">
+					<h2 v-text="person_popedom.companyName"></h2>
+					<h4 v-text="person_popedom.deptName"></h4>
+				</div>
+			</div>
+			<div class="vongi-me-list">
+				<ul class="mui-table-view mui-table-view-chevron vongi-news">
+					<li class="mui-table-view-cell">
+						<a class="mui-navigate-right">
+							<img src="~$project/assets/img/cicon32.png" width="18" /> 我的账单
+						</a>
+					</li>
+					<li class="mui-table-view-cell">
+						<a class="mui-navigate-right">
+							<img src="~$project/assets/img/cicon07.png" width="18" /> 我的订单
+						</a>
+					</li>
+				</ul>
+				<ul class="mui-table-view mui-table-view-chevron vongi-news">
+					<li class="mui-table-view-cell">
+						<router-link :to="{name:'MasterMineFeedback'}" class="mui-navigate-right">
+							<img src="~$project/assets/img/set.png" width="18" /> 问题反馈
+						</router-link>
+					</li>
+					<li class="mui-table-view-cell">
+						<a href="tel:4008899619" class="">
+							<img src="~$project/assets/img/cicon33.png" width="18" /> 客服热线
+							<span>400-8899-619</span>
+							<span class="mui-icon mui-icon-phone"></span>
+						</a>
+					</li>
+				</ul>
+			</div>
+		</div>
+
+		<nav-menu :router="[{name:'Master'},{name:'MasterMineMessage'},{name:'MasterMineCenter'}]"></nav-menu>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	import Common from "$project/components/Common.vue";
+	import Loading from "$project/components/Loading.vue";
+	import TopHeader from "$project/components/TopHeader.vue";
+	import NavMenu from "@/components/NavMenu.vue";
+	import {
+		mapGetters,
+		mapMutations
+	} from "vuex";
+	export default {
+		name: "MasterMineCenter",
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			NavMenu,
+		},
+		data() {
+			return {
+				pageTitle: "个人中心",
+
+				isLoading: false,
+			};
+		},
+		created() {
+			//如果不存在则跳转到注册页面
+			if (!this.person_data) {
+				window.location.href = "../home/#/user/login";
+			}
+		},
+		methods: {
+			//修改个人信息
+			editInfo() {
+				this.$router.push({
+					name: "MasterMineEditInfo",
+					query: {},
+				});
+			},
+			asynCallBack() {},
+		},
+		mounted() {},
+		destroyed() {},
+		computed: {
+			wellcomme: {
+				// getter
+				get: function() {
+					let now = new Date(),
+						hour = now.getHours();
+					if (hour < 6) {
+						return "凌晨好!";
+					} else if (hour < 9) {
+						return "早上好!";
+					} else if (hour < 12) {
+						return "上午好";
+					} else if (hour < 14) {
+						return "中午好!";
+					} else if (hour < 17) {
+						return "下午好!";
+					} else if (hour < 19) {
+						return "傍晚好!";
+					} else if (hour < 22) {
+						return "晚上好!";
+					} else {
+						return "夜里好!";
+					}
+				},
+				// setter
+				set: function(newValue) {
+					console.log(newValue);
+				},
+			},
+			...mapGetters({
+				openId: "wx_openid",
+				token: "token",
+				person_data: "person_data",
+				person_popedom: "person_popedom",
+			}),
+		},
+	};
+</script>
+
+
+<style scoped src="$project/assets/css/xpgj.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style scoped>
+</style>

+ 99 - 0
src/projects/pension/views/Master/Mine/Config.vue

@@ -0,0 +1,99 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle"></top-header>
+
+		<div class="mui-content">
+			<div class="vongi-me-list vongi-meset-list">
+				<ul class="mui-table-view mui-table-view-chevron vongi-news">
+					<li class="mui-table-view-cell">
+						<a class="mui-navigate-right flew-sp">
+							已绑定手机号
+							<span v-text="person_data.phone"></span>
+						</a>
+					</li>
+					<li class="mui-table-view-cell">
+						<a class="mui-navigate-right flew-sp">
+							字体大小
+							<span>普通模式</span>
+						</a>
+					</li>
+					<li class="mui-table-view-cell">
+						<a class="mui-navigate-right"> 关于小鹏管家 </a>
+					</li>
+				</ul>
+				<a href="../home/#/register?project=business" class="vongi-meset jump">注册新身份</a>
+				<a href="../home/#/user/role?project=business&exchange=1" class="vongi-meset jump">切换身份</a>
+				<a @click="loginOut" class="vongi-meset">退出帐号</a>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import * as API_User from '$project/apis/user'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import NavMenu from '@/components/NavMenu.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'MasterMineConfig',
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			NavMenu
+		},
+		data() {
+			return {
+				pageTitle: '设置',
+
+				isLoading: false,
+
+				lastNotice: {}
+			}
+		},
+		created() {
+
+		},
+		methods: {
+			//退出登录
+			loginOut() {
+				this.isLoading = true;
+				API_User.logOut().then(response => {
+					this.isLoading = false;
+
+					window.location.href = '../home/#/';
+
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			asynCallBack() {},
+		},
+		mounted() {
+
+		},
+		destroyed() {
+
+		},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+				person_popedom: 'person_popedom',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpgj.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style>
+</style>

+ 199 - 0
src/projects/pension/views/Master/Mine/EditInfo.vue

@@ -0,0 +1,199 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle"></top-header>
+
+		<div class="mui-content">
+			<div class="mui-content-padded vongi-editme">
+				<form class="mui-input-group">
+					<div class="mui-input-row">
+						<label style="width: 40%">人脸识别照片</label>
+						<button @click="chooseImage('faceImageUrl') " class="mui-btn mui-btn-block mui-navigate-right" type="button"
+						 style="width: 60%">
+							<img :src="subForm.faceImageUrl" />
+						</button>
+					</div>
+					<div class="mui-input-row">
+						<label>姓名</label>
+						<input name="name" type="text" class="mui-input-clear" v-model="subForm.name">
+					</div>
+					<div class="mui-input-row">
+						<label>手机号码</label>
+						<input name="phone" type="text" class="mui-input-clear" v-model="subForm.phone">
+					</div>
+					<div class="mui-input-row">
+						<label>身份证号</label>
+						<input name="idCard" type="text" class="mui-input-clear" v-model="subForm.idCard">
+					</div>
+				</form>
+			</div>
+		</div>
+		<div class="fyy-footer">
+			<div class="bindfyy-btn">
+				<button type="submit" class="mui-btn mui-btn-primary" @click="save">保 存</button>
+			</div>
+		</div>
+
+		<loading :visible="isLoading"></loading>
+		
+		<!--图片裁剪-->
+		<cropper :cwidth="cropperWidth" :cheight="cropperHeight" :visible="cropperVisible" :field="cropperField" :cropper="cropper"
+		 @cropperFinish="cropperFinish" @cropperCancel="cropperCancel"></cropper>
+	</div>
+</template>
+
+<script>
+	import * as API_WeiXin from '$project/apis/weixin'
+	import * as API_Common from '$project/apis/common'
+	import * as API_Master from '@/apis/Master/index'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	import Cropper from '$project/components/Cropper.vue'
+	import * as WxJsApi from '$project/utils/wxJsApi'
+	export default {
+		name: 'MasterMineEditInfo',
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			Cropper
+		},
+		data() {
+			return {
+				pageTitle: '修改个人信息',
+
+				isLoading: false,
+
+				subForm: {
+					name: '',
+					phone: '',
+					idCard: '',
+					faceImageUrl: '',
+					wechatNoticeEnabled: true,
+					openId: '',
+				},
+
+				imgBase64: '',
+				
+				cropperVisible: '',
+				cropperField: '',
+				cropperWidth: 250,
+				cropperHeight: 350,
+				cropper: {
+					img: '',
+					info: true,
+					size: 1,
+					outputType: 'jpeg',
+					canScale: false,
+					autoCrop: false,
+					// 只有自动截图开启 宽度高度才生效
+					autoCropWidth: 250,
+					autoCropHeight: 350,
+					fixed: true,
+					// 真实的输出宽高
+					infoTrue: true,
+					fixedNumber: [5, 7]
+				},
+			}
+		},
+		created() {
+			this.subForm.name = this.person_data.name;
+			this.subForm.phone = this.person_data.phone;
+			this.subForm.idCard = this.person_data.idCard;
+			this.subForm.faceImageUrl = this.person_data.faceImageUrl;
+			this.subForm.openId = this.openId;
+		},
+		methods: {
+			//保存
+			save() {
+				this.isLoading = true;
+				API_Master.savePerson(this.subForm).then(response => {
+					this.isLoading = false;
+
+					mui.toast('保存成功');
+					this.$router.push({
+						name: 'Master',
+						query: {}
+					})
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//微信选择图片
+			chooseImage(field) {
+				WxJsApi.chooseImage().then(res => {
+					var localData = res.localData;
+
+					if (localData.indexOf('data:image') != 0) {
+						//判断是否有这样的头部
+						localData = 'data:image/jpeg;base64,' + localData
+					}
+					localData = localData.replace(/\r|\n/g, '').replace('data:image/jgp', 'data:image/jpeg')
+					this.imgBase64 = localData;
+					//显示裁剪图片
+					this.showCropper(field);
+					//this.uploadpic(field);
+				}).catch(error => {
+					mui.toast(error);
+				})
+			},
+			//显示裁剪图片
+			showCropper(field) {
+				this.cropper.img = this.imgBase64;
+				this.cropperField = field;
+				this.cropperVisible = true;
+			},
+			//裁剪图片
+			cropperFinish(obj) {
+				console.log(obj);
+				this.imgBase64 = obj.data;
+				this.uploadpic(obj.field);
+				this.cropperVisible = false;
+			},
+			//隐藏裁剪图片
+			cropperCancel() {
+				this.cropperVisible = false;
+			},
+			//上传图片
+			uploadpic(field) {
+				this.isLoading = true;
+				WxJsApi.uploadPic(this.imgBase64).then(response => {
+					this.isLoading = false;
+
+					this.subForm[field] = response;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			asynCallBack() {
+
+			},
+		},
+		mounted() {
+			//获取微信配置
+			WxJsApi.getWxConfig();
+		},
+		destroyed() {
+
+		},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+                person_popedom: 'person_popedom',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style scoped>
+</style>

+ 156 - 0
src/projects/pension/views/Master/Mine/Feedback.vue

@@ -0,0 +1,156 @@
+<template>
+	<div>
+		<header class="mui-bar mui-bar-nav">
+			<h1 class="mui-title">问题反馈</h1>
+			<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
+		</header>
+
+		<div class="mui-content vongi-meform">
+			<div class="mui-h5">问题和意见</div>
+			<div class="mui-input-row">
+				<textarea v-model="subForm.content" rows="5" placeholder="请详细描述您的问题和意见"></textarea>
+			</div>
+			<div class="vongi-wordcard vongi-meform-pho">
+				<h5>上传图片<span class="mui-h6">(选填,提供问题截图)</span></h5>
+				<div class="fyy-upphoto">
+					<div v-for="(item,index) in listPic" class="mui-col-xs-3">
+						<img :src="item" />
+					</div>
+					<div class="mui-col-xs-3" @click="chooseImage">
+						<a><span class="mui-icon mui-icon-camera"></span></a>
+					</div>
+				</div>
+			</div>
+			<form class="mui-input-group">
+				<div class="mui-input-row">
+					<label>联系方式</label>
+					<input type="text" v-model="subForm.telephone" class="mui-input-clear" placeholder="选填,方便我们联系您" />
+				</div>
+			</form>
+			<div class="vongi-btn vongi-login-btn">
+				<button class="mui-btn mui-btn-primary" @click="submit">提 交</button>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import * as API_Mine from '@/apis/Master/mine'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import NavMenu from '@/components/NavMenu.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	import * as WxJsApi from '$project/utils/wxJsApi'
+	export default {
+		name: 'MasterMineFeedback',
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			NavMenu
+		},
+		data() {
+			return {
+				pageTitle: '消息',
+
+				isLoading: false,
+
+				lastNotice: {},
+
+				imgBase64: '',
+				listPic: [],
+				subForm: {
+					content: '',
+					picUrl: '',
+					telephone: ''
+				}
+			}
+		},
+		created() {
+
+		},
+		methods: {
+			//微信选择图片
+			chooseImage() {
+				WxJsApi.chooseImage().then(res => {
+					var localData = res.localData;
+
+					if (localData.indexOf('data:image') != 0) {
+						//判断是否有这样的头部
+						localData = 'data:image/jpeg;base64,' + localData
+					}
+					localData = localData.replace(/\r|\n/g, '').replace('data:image/jgp', 'data:image/jpeg')
+					this.imgBase64 = localData;
+					this.uploadpic();
+				}).catch(error => {
+					mui.toast(error);
+				})
+			},
+			//上传图片
+			uploadpic() {
+				this.isLoading = true;
+				WxJsApi.uploadPic(this.imgBase64).then(response => {
+					this.isLoading = false;
+
+					this.listPic.push(response);
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			//表单检测
+			checkFrom() {
+				if (!this.subForm.content) {
+					mui.toast('请输入内容');
+					return false;
+				} else {
+					return true;
+				}
+			},
+			//提交
+			submit() {
+				if (this.checkFrom()) {
+					this.subForm.picUrl = this.listPic.join(',');
+					this.isLoading = true;
+					API_Mine.problemFeedback(this.subForm).then(response => {
+						this.isLoading = false;
+
+						mui.toast('提交成功');
+						this.$router.push({
+							name: 'MasterMineCenter'
+						})
+
+					}).catch(error => {
+						this.isLoading = false;
+						mui.toast(error);
+					})
+				}
+			},
+			asynCallBack() {},
+		},
+		mounted() {
+			//获取微信配置
+			WxJsApi.getWxConfig();
+		},
+		destroyed() {
+
+		},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+				person_popedom: 'person_popedom',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style>
+</style>

+ 111 - 0
src/projects/pension/views/Master/Mine/Message.vue

@@ -0,0 +1,111 @@
+<template>
+	<div>
+		<common @asynCallBack="asynCallBack"></common>
+		<top-header :pageTitle="pageTitle" headerClass="vongi-bar" :leftShow="false"></top-header>
+
+		<div class="mui-content margin49">
+			<ul class="mui-table-view vongi-news">
+				<li class="mui-table-view-cell mui-media">
+					<router-link :to="{name:'CommonNotice',query:{type:noticeInfo.type}}">
+						<img class="mui-media-object mui-pull-left" src="~$project/assets/img/bell1.png">
+						<div class="mui-media-body">
+							<h3 class="flew-sp">{{noticeInfo.name}}<span class="mui-h6" v-text="noticeInfo.message?noticeInfo.message.date:''"></span></h3>
+							<p class='mui-ellipsis' v-text="noticeInfo.message?noticeInfo.message.title:''"></p>
+						</div>
+						<span v-if="noticeInfo.total" class="mui-badge mui-badge-danger" v-text="noticeInfo.total"></span>
+					</router-link>
+				</li>
+			</ul>
+			<ul class="mui-table-view vongi-news">
+				<li v-for="(item,index) in messageList" class="mui-table-view-cell mui-media">
+					<router-link :to="{name:'CommonNotice',query:{type:item.type}}">
+						<img class="mui-media-object mui-pull-left" src="~$project/assets/img/kaoqin1.png">
+						<div class="mui-media-body">
+							<h3 class="flew-sp">{{item.name}}<span class="mui-h6" v-text="item.message?item.message.date:''"></span></h3>
+							<p class='mui-ellipsis' v-text="item.message?item.message.title:''"></p>
+						</div>
+						<span v-if="item.total" class="mui-badge mui-badge-danger" v-text="item.total"></span>
+					</router-link>
+				</li>
+			</ul>
+		</div>
+
+		<nav-menu :router="[{name:'Master'},{name:'MasterMineMessage'},{name:'MasterMineCenter'}]"></nav-menu>
+
+		<loading :visible="isLoading"></loading>
+	</div>
+</template>
+
+<script>
+	import * as API_Notice from '@/apis/Common/notice'
+	import Common from '$project/components/Common.vue'
+	import Loading from '$project/components/Loading.vue'
+	import TopHeader from '$project/components/TopHeader.vue'
+	import NavMenu from '@/components/NavMenu.vue'
+	import {
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: 'MasterMineMessage',
+		components: {
+			Common,
+			Loading,
+			TopHeader,
+			NavMenu
+		},
+		data() {
+			return {
+				pageTitle: '消息',
+
+				isLoading: false,
+
+				noticeInfo: {
+					message: {}
+				},
+				messageList: [],
+			}
+		},
+		created() {
+			//如果不存在则跳转到注册页面
+			if (!this.person_data) {
+				window.location.href = '../home/#/user/login'
+			}
+		},
+		methods: {
+			//获取消息分组
+			getGroupList() {
+				this.isLoading = true;
+				API_Notice.getGroupList().then(response => {
+					this.noticeInfo = response[0];
+					this.messageList = response.slice(1)
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+			asynCallBack() {},
+		},
+		mounted() {
+			//获取分组通知消息
+			this.getGroupList();
+		},
+		destroyed() {
+
+		},
+		computed: {
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+				person_data: 'person_data',
+				person_popedom: 'person_popedom',
+			})
+		}
+	}
+</script>
+
+<style scoped src="$project/assets/css/xpgj.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style scoped>
+</style>

+ 8 - 0
src/projects/pension/views/Master/Mine/Order/Info.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 8 - 0
src/projects/pension/views/Master/Mine/Order/List.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 0 - 27
src/projects/pension_company/main.js

@@ -1,27 +0,0 @@
-import Vue from 'vue'
-import App from './App.vue'
-import router from './router'
-import store from '$project/store'
-
-//引入mui
-import mui from '$project/assets/js/mui.js'
-import '$project/assets/css/mui.min.css'
-import Vconsole from 'vconsole'
-
-window.mui = mui;
-window.mui.init();
-
-if (location.hostname === 'localhost') {
-	Vue.prototype.HTTPLOCAT = ''
-} else {
-	const http = window.location.protocol + '//' + location.hostname + ':' + location.port
-	Vue.prototype.HTTPLOCAT = http + ''
-}
-
-Vue.config.productionTip = false
-
-new Vue({
-	router,
-	store,
-	render: h => h(App)
-}).$mount('#app')

+ 0 - 14
src/projects/pension_home/App.vue

@@ -1,14 +0,0 @@
-<template>
-	<div id="app">
-		<router-view />
-	</div>
-</template>
-
-<style lang="scss">
-	#app {
-		font-family: Avenir, Helvetica, Arial, sans-serif;
-		-webkit-font-smoothing: antialiased;
-		-moz-osx-font-smoothing: grayscale;
-	}
-</style>
-

+ 0 - 27
src/projects/pension_home/main.js

@@ -1,27 +0,0 @@
-import Vue from 'vue'
-import App from './App.vue'
-import router from './router'
-import store from '$project/store'
-
-//引入mui
-import mui from '$project/assets/js/mui.js'
-import '$project/assets/css/mui.min.css'
-import Vconsole from 'vconsole'
-
-window.mui = mui;
-window.mui.init();
-
-if (location.hostname === 'localhost') {
-	Vue.prototype.HTTPLOCAT = ''
-} else {
-	const http = window.location.protocol + '//' + location.hostname + ':' + location.port
-	Vue.prototype.HTTPLOCAT = http + ''
-}
-
-Vue.config.productionTip = false
-
-new Vue({
-	router,
-	store,
-	render: h => h(App)
-}).$mount('#app')