Browse Source

Merge remote-tracking branch 'origin/master'

wgl 4 năm trước cách đây
mục cha
commit
749f4290b0

+ 8 - 0
README.md

@@ -13,16 +13,24 @@ yarn install
 ### 本地开发环境启动,其中[project]为不同应用场景标识
 ```
 yarn jserve [project]
+yarn jserve business
+yarn jserve factory
+yarn jserve persion
+
 ```
 
 ### 生成环境打包,其中[project]为不同应用场景标识
 ```
 yarn jbuild [project]
+
 ```
 
 ### 测试环境打包,其中[project]为不同应用场景标识
 ```
 yarn jtest [project]
+yarn jtest business
+yarn jtest factory
+yarn jtest persion
 ```
 
 ### 更多配置

+ 197 - 72
src/assets/css/xpwyfyy.css

@@ -44,9 +44,11 @@ body {
 .coloreb59fc {
 	color: #375cf5
 }
-.color999{
-	color:#999
+
+.color999 {
+	color: #999
 }
+
 .margin60 {
 	margin-bottom: 60px
 }
@@ -54,17 +56,21 @@ body {
 .inedxfyy-content {
 	margin-bottom: 70px
 }
-.flew{
+
+.flew {
 	display: flex;
 }
-.flew-sp{
+
+.flew-sp {
 	display: flex;
 	justify-content: space-between;
 }
-.flew-items{
+
+.flew-items {
 	display: flex;
 	align-items: center;
 }
+
 .inedxfyy-content-icon .mui-grid-view.mui-grid-9 .mui-media .mui-icon.color4fc5f7 {
 	border: 1px #4fc5f7 solid;
 }
@@ -215,8 +221,8 @@ body {
 	.mui-content .vongi-choose .mui-table-view-cell a {
 		padding: 11px 15px
 	}
-	.mui-content .vongi-photo{
-		height:240px
+	.mui-content .vongi-photo {
+		height: 240px
 	}
 }
 
@@ -289,14 +295,16 @@ body {
 	width: 100%;
 	border-radius: 3px;
 }
-.vongi-photo{
+
+.vongi-photo {
 	background: url(../img/faceai.png) center no-repeat;
-    background-size: 100% 100%;
-    height: 300px;
-    width: 60%;
-    padding: 15px;
-    margin: 20px auto;
-} 
+	background-size: 100% 100%;
+	height: 300px;
+	width: 60%;
+	padding: 15px;
+	margin: 20px auto;
+}
+
 .faceaifyy-content-region {
 	background: #999;
 	text-align: center;
@@ -313,10 +321,6 @@ body {
 	font-size: 40px
 }
 
-.mui-slider .mui-slider-group .mui-slider-item {
-	font-size: 17px
-}
-
 .mui-segmented-control.mui-scroll-wrapper .mui-scroll {
 	width: 100%;
 	background: #ffffff;
@@ -615,22 +619,24 @@ h3 {
 	width: 50%;
 	margin: 10px auto;
 }
-.fyy-upphoto-close{
-	position:relative
+
+.fyy-upphoto-close {
+	position: relative
 }
-.vongi-wordcard .fyy-upphoto .mui-col-xs-3.fyy-upphoto-close a{
-	width:16px;
-	height:16px;
+
+.vongi-wordcard .fyy-upphoto .mui-col-xs-3.fyy-upphoto-close a {
+	width: 16px;
+	height: 16px;
 	border-radius: 50%;
-	position:absolute;
-	top:0;
-	right:0;
-	background:#333;
-	color:#ffffff;
+	position: absolute;
+	top: 0;
+	right: 0;
+	background: #333;
+	color: #ffffff;
 	line-height: 16px;
-    font-size: 16px;
-	
+	font-size: 16px;
 }
+
 .fyy-radio ul li .mui-media-body {
 	color: #ffffff
 }
@@ -1036,7 +1042,7 @@ h3 {
 .mui-content-padded h5 {
 	margin: 20px 0 15px 0;
 	color: #666;
-	font-size:14px
+	font-size: 14px
 }
 
 .vongi-wordcard-padded {
@@ -1052,7 +1058,6 @@ h3 {
 	width: auto
 }
 
-
 .vongi-wordcard .mui-input-row {
 	display: flex;
 	justify-content: space-between
@@ -1060,7 +1065,7 @@ h3 {
 
 .vongi-wordcard .mui-input-row .mui-btn {
 	padding-right: 40px;
-	width:auto
+	width: auto
 }
 
 .vongi-wordcard .vongi-wordcard-padded h5 {
@@ -1262,7 +1267,8 @@ h3 {
 	color: #333;
 	display: block;
 	background: #eee;
-	padding: 10px
+	padding: 10px;
+	margin:10px 10px 10px 50px
 }
 
 .vongi-wordcard-sp .mui-input-group .mui-input-row {
@@ -1299,13 +1305,13 @@ h3 {
 	display: flex;
 	z-index: 9999;
 	margin: 0;
-	position: fixed;
+	position: absolute;
 	width: 100%;
 	-webkit-box-shadow: 0 1px 6px #ccc;
 	box-shadow: 0 1px 6px #ccc;
 }
 
-.vongi-wordcard-sp .mui-scroll .fyy-bindfyy-btn button {
+.vongi-wordcard-sp .mui-scroll-wrapper .fyy-bindfyy-btn button {
 	border-radius: initial;
 	width: 30%;
 	margin-bottom: 0;
@@ -1321,11 +1327,15 @@ h3 {
 }
 
 .vongi-wordcard-sp #item1mobile .mui-btn-danger {
-	background: #fe616c
+	background: #fe616c;
+	width: 30%;
+    border-radius: initial;
 }
 
 .vongi-wordcard-sp #item1mobile .mui-btn-success {
-	background: #47bf37
+	background: #47bf37;
+	width: 30%;
+    border-radius: initial;
 }
 
 .vongi-wordcard-sp #item2mobile .mui-btn-danger,
@@ -1373,59 +1383,174 @@ h3 {
 #item2mobile .mui-push-right:after {
 	right: 0
 }
-.vongi-work .vongi-qingjia li{
-	margin-bottom:10px
+
+.vongi-work .vongi-qingjia li {
+	margin-bottom: 10px
 }
-.vongi-work .vongi-qingjia li button{
-	padding:3px 12px
+
+.vongi-work .vongi-qingjia li button {
+	padding: 3px 12px
 }
-.vongi-qingjia li h4 span{
-	margin-left:15px
+
+.vongi-qingjia li h4 span {
+	margin-left: 15px
 }
-.vongi-qingjiadt-head{
-	padding:20px 15px;
+
+.vongi-qingjiadt-head {
+	padding: 20px 15px;
 	align-items: center;
 }
-.vongi-qingjiadt-head .flew{
-	width:60px;
-	height:60px;
+
+.vongi-qingjiadt-head .flew {
+	width: 60px;
+	height: 60px;
 	border-radius: 50%;
 	overflow: hidden;
-	margin-right:5px
+	margin-right: 5px
 }
-.vongi-qingjiadt-head .flew img{
-	width:100%;
+
+.vongi-qingjiadt-head .flew img {
+	width: 100%;
 	object-fit: cover;
 	min-height: 100%;
 }
-.vongi-qingjiadt .mui-input-group span{
+
+.vongi-qingjiadt .mui-input-group span {
 	text-align: right;
-    display: block;
-    padding: 14.5px 15px;
+	display: block;
+	padding: 14.5px 15px;
 }
-.vongi-qingjiadt .mui-input-group .vongi-qingjiadt-photo{
-	width:36px;
-	height:36px;
+
+.vongi-qingjiadt .mui-input-group .vongi-qingjiadt-photo {
+	width: 36px;
+	height: 36px;
 	overflow: hidden;
 	display: flex;
 	padding: 0;
-    margin: 7px 15px;
-    align-items: right;
-    float: right;
-    border-radius: 4px;
+	margin: 7px 15px;
+	align-items: right;
+	float: right;
+	border-radius: 4px;
+}
+
+.vongi-qingjiadt-photo img {
+	width: 100%;
+	object-fit: cover;
+	min-height: 100%;
+}
+
+.vongi-yidi-location {
+	position: relative;
+	width: 70%
+}
+
+.vongi-yidi-location .mui-icon {
+	top: 50%;
+	position: absolute;
+	right: 15px;
+	margin-top: -10.5px;
+}
+
+.vongi-archives .mui-segmented-control.mui-scroll-wrapper .mui-control-item {
+	width: 25%;
+	padding: 0;
+	color: #999
+}
+
+.vongi-archives .mui-segmented-control.mui-scroll-wrapper .mui-control-item.mui-active {
+	position: relative;
+	color: #3385FF
+}
+
+.vongi-archives .mui-segmented-control.mui-scroll-wrapper .mui-control-item.mui-active:after {
+	content: "";
+	position: absolute;
+	bottom: 0;
+	left: 50%;
+	width: 40px;
+	height: 1px;
+	background: #3385FF;
+	margin-left: -20px
+}
+
+.vongi-archives .mui-table-view .mui-media-object {
+	width: 32px;
+	height: 32px;
+	border-radius: 50%;
+	display: flex;
+	overflow: hidden;
 }
-.vongi-qingjiadt-photo img{
-	width:100%;
+
+.vongi-archives .mui-table-view .mui-media-object img {
+	width: 100%;
+	min-height: 100%;
 	object-fit: cover;
-	min-height:100%;
 }
-.vongi-yidi-location{
-	position:relative;
-	width:70%
+
+.vongi-archives .mui-table-view h4 {
+	margin: 0 5px
+}
+
+.vongi-archives .mui-table-view .mui-pull-right {
+	font-size: 14px;
+	line-height: 32px;
+	padding-right: 20px;
 }
-.vongi-yidi-location .mui-icon{
+
+.vongi-archives-search {
+	position: absolute;
+	bottom: 10px;
+	left: 50%;
+	margin-left: -98px;
+	border-radius: 30px;
+	-webkit-box-shadow: 0 1px 6px #ccc;
+	box-shadow: 0 1px 6px #ccc;
+}
+
+.vongi-archives-search a {
+	padding: 6px 15px;
+	display: block;
+}
+
+.vongi-archives-search:after {
+	width: 1px;
+	height: 14px;
+	content: "";
+	background: #999;
+	position: absolute;
+	left: 50%;
 	top: 50%;
-    position: absolute;
-    right: 15px;
-    margin-top: -10.5px;
+	margin-top: -7px
+}
+
+.vongi-archives-search .mui-active {
+	color: #3385FF
 }
+
+.vongi-clasadmin {
+	background: #ffffff;
+	margin-bottom: 10px
+}
+
+.vongi-clasadmin h4 {
+	text-align: center;
+	border-bottom: #eee solid 1px;
+	padding: 15px;
+	margin: 0
+}
+
+.vongi-clasadmin-list {
+	display: flex;
+	justify-content: space-between;
+	padding: 10px;
+}
+
+.vongi-clasadmin-ma {
+	text-align: center;
+	line-height: 1.5;
+	position: relative
+}
+
+.vongi-clasadmin-ma span {
+	font-size: 24px;
+}

+ 76 - 0
src/projects/business/apis/Master/leave.js

@@ -0,0 +1,76 @@
+import request from '@/utils/request'
+import Qs from 'qs';
+
+/**
+ * 请假相关页面
+ * @param params
+ */
+
+
+
+//获取请假列表(个人)
+export function pageList(params) {
+    return request({
+        url: '/mobile/requestForLeave/pageList',
+        data: Qs.stringify(params),
+        method: 'post',
+    })
+}
+
+//请假类型列表
+export function leaveTypeList(params) {
+    return request({
+        url: '/mobile/requestForLeave/leaveTypeList',
+        data: Qs.stringify(params),
+        method: 'post',
+    })
+}
+//审批人列表
+export function approvedList(params) {
+    return request({
+        headers: {
+            'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
+        },
+        url: '/mobile/requestForLeave/approvedList',
+        data:params,
+        method: 'post',
+    })
+}
+//获取请假详情
+export function detail(params) {
+    return request({
+        url: '/mobile/requestForLeave/detail',
+        data: Qs.stringify(params),
+        method: 'post',
+    })
+}
+
+//提交请假
+export function save(params) {
+
+    return request.post('/mobile/requestForLeave/save', params,{
+        headers: {
+            "Content-Type": "application/json"
+        }
+
+    });
+}
+
+//获取请假列表(管理)
+export function approvedPageList(params) {
+    return request({
+        url: '/mobile/requestForLeave/approvedPageList',
+        data: Qs.stringify(params),
+        method: 'post',
+    })
+}
+
+//请假   审批
+export function approved(params) {
+    return request({
+        url: '/mobile/requestForLeave/approved',
+        data: Qs.stringify(params),
+        method: 'post',
+    })
+}
+

+ 244 - 19
src/projects/business/views/Master/Attendance/LeaveForm.vue

@@ -1,22 +1,22 @@
 <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-wordcard">
+
+	<common @asynCallBack="asynCallBack"></common>
+	<top-header :pageTitle="pageTitle"  ></top-header>
+
+	<div class="mui-content vongi-wordcard">
 			<div class="mui-content-padded">
 				<form class="mui-input-group">
 					<div class="mui-input-row">
 						<label><span class="colorfe616c">*</span>请假类型</label>
-						<div class="mui-navigate-right">
-							<button id='showUserPicker' class="mui-btn mui-btn-block" type='button'>请选择</button>
+						<div class="mui-navigate-right" @click="selectType">
+							<button   class="mui-btn mui-btn-block" type='button' v-text="typeName">请选择</button>
 						</div>
 					</div>
 					<div class="mui-input-row">
 						<label><span class="colorfe616c">*</span>审批人</label>
-						<div class="mui-navigate-right">
-							<button id='showUserPicker' class="mui-btn mui-btn-block" type='button'>请选择</button>
+						<div class="mui-navigate-right"  @click="selectPerson">
+							<button id='' class="mui-btn mui-btn-block" type='button' v-text="approvalPersonName">请选择</button>
 						</div>
 					</div>
 				</form>
@@ -25,14 +25,14 @@
 				<form class="mui-input-group">
 					<div class="mui-input-row">
 						<label><span class="colorfe616c">*</span>开始日期</label>
-						<div class="mui-navigate-right">
-							<button class="mui-btn mui-btn-block" type='button'>2020-04-28 08:00</button>
+						<div class="mui-navigate-right" @click="selectStartTime()">
+							<button class="mui-btn mui-btn-block" type='button' v-text="tjForm.startTime">请选择</button>
 						</div>
 					</div>
 					<div class="mui-input-row">
 						<label><span class="colorfe616c">*</span>结束日期</label>
-						<div class="mui-navigate-right">
-							<button class="mui-btn mui-btn-block" type='button'>请选择</button>
+						<div class="mui-navigate-right"  @click="selectEndTime()">
+							<button class="mui-btn mui-btn-block" type='button' v-text="tjForm.endTime">请选择</button>
 						</div>
 					</div>
 				</form>
@@ -40,24 +40,25 @@
 			<div class="mui-content-padded">
 				<h5><span class="colorfe616c">*</span>请假事由</h5>
 				<div class="mui-input-row">
-					<textarea id="textarea" rows="5" placeholder="请输入"></textarea>
+					<textarea id="textarea" rows="5"  v-model="tjForm.reason" placeholder="请输入"></textarea>
 				</div>
 			</div>
+
 			<div class="mui-content-padded">
 				<h5>上传照片</h5>
 				<div class="fyy-upphoto">
-					<div class="mui-col-xs-3 fyy-upphoto-close">
-						<img src="~$project/assets/img/zhaop.jpg" />
-                        <a class="mui-icon mui-icon-closeempty"></a>
+					<div class="mui-col-xs-3" v-for="(item,index) in picList">
+						<img :src="item" />
 					</div>
-					<div class="mui-col-xs-3">
+					<div class="mui-col-xs-3" @click="chooseImage">
 						<a><span class="mui-icon mui-icon-plusempty"></span></a>
 					</div>
 				</div>
 			</div>
+
 			<div class="mui-content-padded mui-h6">注:1、病假须上传医院证明。2、请假事由中须写明请假去向。</div>
 			<div class="vongi-btn">
-				<button class="mui-btn mui-btn-primary " type="submit">
+				<button class="mui-btn mui-btn-primary " type="submit" @click="submit()">
 					提交
 				</button>
 			</div>
@@ -65,9 +66,233 @@
 </div>
 </template>
 
+
 <script>
+	require('$project/assets/js/mui.picker.min.js');
+	import * as API_Leave from '@/apis/Master/leave'
+	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 * as WxJsApi from '$project/utils/wxJsApi'
+	export default {
+		name: 'MasterAttendanceLeaveForm',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '请假',
+
+				isLoading: false,
+				leaveTypeList:[],
+				approvedList:[],
+				typeName: '请选择',
+				approvalPersonName: '请选择',
+				tjForm: {
+					startTime: '请选择',
+					endTime: '请选择',
+					leaveType: '',
+
+					imageUrl: '',
+					reason: '',
+					personId: '',
+
+					approvedId: '',
+					remark: '',
+
+				},
+				picList: [],
+
+			}
+		},
+		created() {
+
+		},
+			methods: {
+				//审批类型
+				getLeaveTypeList() {
+					API_Leave.leaveTypeList().then(response => {
+
+						for(var i in response){
+							var mod=response[i]
+							mod.text=mod.name
+							this.leaveTypeList.push(mod)
+						}
+					}).catch(error => {
+						mui.toast(error);
+					})
+				},
+				//获取审核人列表
+				getPsersonList() {
+					this.isLoading = true;
+					API_Leave.approvedList().then(response => {
+
+						for(var i in response){
+							var mod=response[i]
+							mod.text=mod.name
+							mod.value=mod.id;
+
+							this.approvedList.push(mod)
+						}
+
+						this.isLoading = false;
+					}).catch(error => {
+						this.isLoading = false;
+						mui.toast(error);
+					})
+				},
+				//微信选择图片
+				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.showCropper(field);
+						this.uploadpic();
+					}).catch(error => {
+						mui.toast(error);
+					})
+				},
+				//上传图片
+				uploadpic() {
+					this.isLoading = true;
+					WxJsApi.uploadPic(this.imgBase64).then(response => {
+						this.isLoading = false;
+
+						this.picList.push(response);
+					}).catch(error => {
+						this.isLoading = false;
+						mui.toast(error);
+					})
+				},
+				//选择审核人
+				selectPerson() {
+					var _this = this;
+					var picker = new mui.PopPicker();
+
+					picker.setData(_this.approvedList);
+					picker.show(function(selectItems) {
+						_this.tjForm.approvedId = selectItems[0].value;
+						_this.approvalPersonName = selectItems[0].text;
+					})
+				},
+				//选择时间
+				selectStartTime() {
+					var _this = this;
+					var startTime= _this.tjForm.startTime=='请选择'? new Date():_this.tjForm.startTime;
+
+					var picker = new mui.DtPicker({
+						"type": "date",
+						"beginYear": 2020,
+						"endYear": 2040,
+					});
+					picker.show(function(rs) {
+						_this.tjForm.startTime = rs.text;
+					});
+				},
+				//选择时间
+				selectEndTime() {
+					var _this = this;
+					var picker = new mui.DtPicker({
+						"type": "date",
+						"beginYear": 2020,
+						"endYear": 2040,
+						"beginDate": _this.tjForm.startTime,
+					});
+					picker.show(function(rs) {
+						_this.tjForm.endTime = rs.text;
+					});
+				},
+				//类型选择
+				selectType() {
+					var picker = new mui.PopPicker();
+
+					picker.setData(this.leaveTypeList);
+					var _this = this;
+					picker.show(function(selectItems) {
+						_this.tjForm.leaveType = selectItems[0].value;
+						_this.typeName = selectItems[0].text;
+					})
+				},
+				//表单检测
+				checkFrom() {
+					if (!this.tjForm.leaveType) {
+						mui.toast('请选择请假类型');
+						return false;
+					} else if (!this.tjForm.approvedId) {
+						mui.toast('请选择审批人');
+						return false;
+					} else if (!this.tjForm.startTime) {
+						mui.toast('请选择开始日期');
+						return false;
+					}else if (!this.tjForm.endTime) {
+						mui.toast('请选择结束日期');
+						return false;
+					}else if (!this.tjForm.reason) {
+						mui.toast('请输入请假理由');
+						return false;
+					} else {
+						return true;
+					}
+
+
+				},
+				//提交
+				submit() {
+					if (this.checkFrom()) {
+						this.tjForm.imageUrl = this.picList.join(',');
+						this.isLoading = true;
+						API_Leave.save(this.tjForm).then(response => {
+							this.isLoading = false;
+							mui.toast("提交成功!");
+							this.$router.push({
+								name: 'MasterAttendanceLeaveList',
+								query: {}
+							})
+						}).catch(error => {
+							this.isLoading = false;
+							mui.toast(error);
+						})
+					}
+				},
+				asynCallBack() {
+
+				},
+			},
+		mounted() {
+			//获取微信配置
+			WxJsApi.getWxConfig();
+
+			this.getLeaveTypeList();
+
+			this.getPsersonList();
+		},
+		destroyed() {},
+		computed: {
+
+			...mapGetters({
+				openId: 'wx_openid',
+				token: 'token',
+			})
+		}
+	}
 </script>
 
 <style scoped src="$project/assets/css/xpwyfyy.css"></style>
+<style src="$project/assets/css/iconfont.css"></style>
+<style src="$project/assets/css/mui.picker.min.css"></style>
+
 <style>
 </style>

+ 106 - 18
src/projects/business/views/Master/Attendance/LeaveInfo.vue

@@ -1,46 +1,50 @@
 <template>
 <div>
-    <header class="mui-bar mui-bar-nav">
-				<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
-				<h1 class="mui-title">请假</h1>
-			</header>
-			<div class="mui-content vongi-qingjiadt">
+	<common @asynCallBack="asynCallBack"></common>
+	<top-header :pageTitle="pageTitle"  ></top-header>
+
+	<div class="mui-content vongi-qingjiadt">
 				<div class="vongi-qingjiadt-head flew-sp">
 					<div class="flew-items">
 						<div class="flew"><img src="~$project/assets/img/03.jpg" width="50" /></div>
-						<h4>郭麒麟 申请请假 事假</h4>
+						<h4 v-text="detail.name+' 申请请假 '+detail.leaveTypeN">郭麒麟 申请请假 事假</h4>
 					</div>
-					<button class="mui-btn  mui-btn-success mui-btn-outlined">已批准</button>
+					<button class="mui-btn   mui-btn-outlined" :class="statusColor[detail.status]" v-text="status[detail.status]">已批准</button>
 					<!-- <div class="examine-refuse">已拒绝</div> -->
 				</div>
 				<form class="mui-input-group">
 					<div class="mui-input-row">
 						<label>身份证号</label>
-						<span>420400200002020101</span>
+						<span v-text="detail.idCard">420400200002020101</span>
 					</div>
 					<div class="mui-input-row">
 						<label>工号</label>
-						<span>0201022121001</span>
+						<span v-text="detail.jobNumber">0201022121001</span>
 					</div>
 					<div class="mui-input-row">
 						<label>部门</label>
-						<span>信息工程中心</span>
+						<span v-text="detail.department">信息工程中心</span>
 					</div>
 					<div class="mui-input-row">
 						<label>请假时间</label>
-						<span>自2020年4月28日8时 至 4月30日17时</span>
+						<span >自{{detail.startTime}} 至 {{detail.endTime}}</span>
 					</div>
 					<div class="mui-input-row">
 						<label>请假事由</label>
-						<span>家中有事,需要会老家一趟家中有事,需要会老家一趟家中有事,需要会老家一趟家中有事,需要会老家一趟。</span>
+						<span v-text="detail.reason">家中有事,需要会老家一趟家中有事,需要会老家一趟家中有事,需要会老家一趟家中有事,需要会老家一趟。</span>
 					</div>
 					<div class="mui-input-row">
 						<label>上传图片</label>
-						<span class="vongi-qingjiadt-photo"><img src="~$project/assets/img/02.jpg"/></span>
+						<span class="vongi-qingjiadt-photo">
+							<template v-for="(item,index) in picList">
+									<img :src="item" v-image-preview />
+
+							</template>
+						</span>
 					</div>
 					<div class="mui-input-row">
 						<label>申请时间</label>
-						<span>2020-04-27 12:00:00</span>
+						<span v-text="detail.createTime">2020-04-27 12:00:00</span>
 					</div>
 				</form>
 				<div class="mui-content-padded">
@@ -49,19 +53,19 @@
 				<form class="mui-input-group">
 					<div class="mui-input-row">
 						<label>审批人</label>
-						<span>王后雄</span>
+						<span>{{detail.approvedName}}</span>
 					</div>
 					<div class="mui-input-row">
 						<label>审核意见</label>
-						<span>同意</span>
+						<span>{{detail.approvalOpinions}}</span>
 					</div>
 					<div class="mui-input-row">
 						<label>意见说明</label>
-						<span>注意安全</span>
+						<span>{{detail.approvalExplain}}</span>
 					</div>
 					<div class="mui-input-row">
 						<label>审核时间</label>
-						<span>2020-04-28 10:00:00</span>
+						<span>{{detail.approvedTime}}</span>
 					</div>
 				</form>
 
@@ -70,6 +74,90 @@
 </template>
 
 <script>
+	import * as API_Leave from '@/apis/Master/leave'
+	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: 'MasterAttendanceLeaveInfo',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '请假详情',
+
+				isLoading: false,
+				id:this.$route.query.id,
+				detail:{},
+				status: ['待审核', '已批准', '已拒绝'],
+				statusColor: ['', 'mui-btn-success', 'mui-btn-danger'],
+
+
+
+			}
+		},
+		created() {
+
+		},
+		methods: {
+			//info
+			getDetail() {
+				this.isLoading = true;
+				API_Leave.detail({
+					id:this.id
+				}).then(response => {
+					this.detail=response;
+					this.isLoading = false;
+				}).catch(error => {
+					this.isLoading = false;
+					mui.toast(error);
+				})
+			},
+
+
+
+			asynCallBack() {
+
+			},
+		},
+		mounted() {
+			this.getDetail();
+
+		},
+		destroyed() {
+		},
+		computed: {
+			computed: {
+				picList: {
+					// getter
+					get: function() {
+						if (this.detail && this.detail.imageUrl) {
+							return this.detail.imageUrl.split(',');
+						} else {
+							return [];
+						}
+					},
+					// setter
+					set: function(newValue) {
+						console.log(newValue)
+					}
+				},
+				...mapGetters({
+					openId: 'wx_openid',
+					token: 'token',
+				})
+			}
+		},
+
+	}
 </script>
 
 <style scoped src="$project/assets/css/xpwyfyy.css"></style>

+ 131 - 17
src/projects/business/views/Master/Attendance/LeaveList.vue

@@ -1,34 +1,148 @@
 <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">
+
+	<common @asynCallBack="asynCallBack"></common>
+	<top-header :pageTitle="pageTitle"  ></top-header>
+
+	<div class="mui-content">
 			<div class="mui-content-padded vongi-work">
 				<ul class="mui-table-view vongi-qingjia">
-					<li class="mui-table-view-cell">
-						<h4>郭麒麟的病假申请<span>12:00</span></h4>
-						<button type="button" class="mui-btn  mui-btn-outlined">待审核</button>
-					</li>
-					<li class="mui-table-view-cell">
-						<h4>郭麒麟的病假申请<span>12:00</span></h4>
-						<button type="button" class="mui-btn  mui-btn-success mui-btn-outlined">已批准</button>
-					</li>
-					<li class="mui-table-view-cell">
-						<h4>郭麒麟的病假申请<span>12:00</span></h4>
-						<button type="button" class="mui-btn  mui-btn-danger mui-btn-outlined">已拒绝</button>
+					<li class="mui-table-view-cell" v-for="mod in recordList" @click="detail(mod.id)">
+						<h4 >
+							{{mod.title}}
+							<span v-text="mod.createTime">12:00</span>
+						</h4>
+						<button type="button" class="mui-btn  mui-btn-outlined" :class="statusColor[mod.status]" v-text="status[mod.status]">
+							 </button>
 					</li>
+
 				</ul>
 			</div>
 			<div class="fyy-footer">
-				<div class="bindfyy-btn"><button type="submit" class="mui-btn mui-btn-primary ">写请假条</button></div>
+				<div class="bindfyy-btn"><button type="submit" class="mui-btn mui-btn-primary " @click="save()">写请假条</button></div>
 			</div>
 		</div>
 </div>
 </template>
 
+
 <script>
+	import * as API_Leave from '@/apis/Master/leave'
+	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: 'MasterAttendanceLeaveList',
+		components: {
+			Common,
+			Loading,
+			TopHeader
+		},
+		data() {
+			return {
+				pageTitle: '请假记录',
+
+				isLoading: false,
+
+				listForm: {
+					pageIndex: 1,
+					pageSize: 20,
+				//	token: '',
+					totalPage: 1,
+					result: 0,
+				},
+				recordList: [],
+				status: ['待审核', '已批准', '已拒绝'],
+				statusColor: ['', 'mui-btn-success', 'mui-btn-danger'],
+
+
+			}
+		},
+		created() {
+			//this.listForm.openId = this.openId;
+			//this.listForm.result = this.$route.query.result != null ? this.$route.query.result : 0;
+		},
+		methods: {
+			//info
+			detail(id) {
+				this.$router.push({
+					name: 'MasterAttendanceLeaveInfo',
+					query: {
+						id: id
+					}
+				})
+			},
+			save() {
+				this.$router.push({
+					name: 'MasterAttendanceLeaveForm',
+					query: {
+
+					}
+				})
+			},
+			//获取列表
+			getList() {
+				this.isLoading = true;
+				API_Leave.pageList(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>

+ 180 - 0
src/projects/business/views/Master/Attendance/VerifyLeaveList.vue

@@ -1,8 +1,188 @@
 <template>
+    <div>
+
+        <common @asynCallBack="asynCallBack"></common>
+        <top-header :pageTitle="pageTitle"></top-header>
+
+        <div class="mui-content vongi-wordcard-sp">
+            <div id="slider" class="mui-slider mui-fullscreen">
+                <div id="sliderSegmentedControl" class="mui-scroll-wrapper mui-slider-indicator mui-segmented-control mui-segmented-control-inverted">
+                    <div class="mui-scroll">
+                        <a class="mui-control-item mui-active" >
+                            <span class="fyy-badge">待处理<span class="mui-badge">5</span></span>
+                        </a>
+                        <a class="mui-control-item" href="#item2mobile">
+                            已处理
+                        </a>
+                    </div>
+                </div>
+                <div class="mui-slider-group">
+                    <div id="item1mobile" class="mui-slider-item mui-control-content mui-active">
+                        <div id="scroll1" class="mui-scroll-wrapper">
+                            <div class="mui-scroll">
+                                <form class="mui-input-group fyy-checkbox">
+                                    <div class="mui-input-row mui-checkbox mui-left" v-for="mod in recordList">
+                                        <label @click="detail(mod.id)" >
+                                            <router-link class="mui-navigate-right" :to="{name: 'MasterAttendanceLeaveInfo', params: {data:iten}}">
+
+
+                                                <div class="mui-media-object mui-pull-left" >
+                                                    <img :src="mod.picUrl"></div>
+                                                <div class="mui-media-body" >
+                                                    {{mod.name}}
+                                                    <p class='mui-ellipsis'><span class="colorfe616c">{{mod.typeN}}</span>请假申请</p>
+                                                </div>
+                                            </router-link>
+                                        </label>
+                                        <input name="checkbox" v-model="selectIndex" :value="mod.id" type="checkbox"  >
+                                    </div>
+
+                                </form>
+                                <div class="fyy-bindfyy-btn">
+                                    <form class="mui-input-group">
+                                        <div class="mui-input-row mui-checkbox mui-left">
+                                            <label>全选</label>
+                                            <input name="checkbox" value="Item 1" type="checkbox">
+                                        </div>
+                                    </form>
+                                    <button type="button" class="mui-btn mui-btn-danger">拒绝</button>
+                                    <button type="button" class="mui-btn mui-btn-success">同意</button>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+
+                </div>
+            </div>
+
+        </div>
+        <loading :visible="isLoading"></loading>
+
+    </div>
 </template>
 
+
 <script>
+    import * as API_Leave from '@/apis/Master/leave'
+    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: 'MasterAttendanceVerifyLeaveList',
+        components: {
+            Common,
+            Loading,
+            TopHeader
+        },
+        data() {
+            return {
+                pageTitle: '请假申请审核列表',
+
+                isLoading: false,
+
+                listForm: {
+                    pageIndex: 1,
+                    pageSize: 20,
+                    type: '0',
+                    totalPage: 1,
+                    result: 0,
+                },
+                recordList: [],
+                status: ['待审核', '已批准', '已拒绝'],
+                statusColor: ['', 'mui-btn-success', 'mui-btn-danger'],
+                selectIndex:[],
+
+            }
+        },
+        created() {
+            //this.listForm.openId = this.openId;
+            //this.listForm.result = this.$route.query.result != null ? this.$route.query.result : 0;
+        },
+        methods: {
+            //info
+            detail(id) {
+                this.$router.push({
+                    name: 'MasterAttendanceLeaveInfo',
+                    query: {
+                        id: id
+                    }
+                })
+            },
+            save() {
+                this.$router.push({
+                    name: 'MasterAttendanceLeaveForm',
+                    query: {
+
+                    }
+                })
+            },
+            //获取列表
+            getList() {
+                this.isLoading = true;
+                API_Leave.approvedPageList(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 src="$project/assets/css/iconfont.css"></style>
 <style>
 </style>

+ 10 - 12
src/projects/business/views/Master/Attendance/VerifyList.vue

@@ -22,19 +22,18 @@
 							<div class="mui-scroll">
 								<form class="mui-input-group fyy-checkbox">
 									<div v-for="(item,index) in recordList" :key="item.id" class="mui-input-row mui-checkbox mui-left">
-										<label>
-											<router-link :to="{name:'MasterAttendanceInfo',query:{id:item.id}}" class="mui-navigate-right">
-												<div class="mui-media-object mui-pull-left"><img :src="item.faceImageUrl"></div>
-												<div class="mui-media-body">
-													{{item.personName}}
-													<p class='mui-ellipsis'><span class="colorfe616c" v-text="item.typeN"></span>申请</p>
-												</div>
-											</router-link>
-										</label>
+										<router-link :to="{name:'MasterAttendanceInfo',query:{id:item.id}}" class="mui-navigate-right">
+											<div class="mui-media-object mui-pull-left"><img :src="item.faceImageUrl"></div>
+											<div class="mui-media-body">
+												{{item.personName}}
+												<p class='mui-ellipsis'><span class="colorfe616c" v-text="item.typeN"></span>申请</p>
+											</div>
+										</router-link>
 										<input name="checkbox" v-model="selectIdList" :value="item.id" type="checkbox">
 									</div>
-								</form>
-								<div class="fyy-bindfyy-btn">
+								</form>								
+							</div>
+							<div class="fyy-bindfyy-btn">
 									<form class="mui-input-group">
 										<div class="mui-input-row mui-checkbox mui-left">
 											<label>全选</label>
@@ -44,7 +43,6 @@
 									<button type="button" class="mui-btn mui-btn-danger" @click="openFrom('2')">拒绝</button>
 									<button type="button" class="mui-btn mui-btn-success" @click="openFrom('1')">同意</button>
 								</div>
-							</div>
 						</div>
 					</div>
 

+ 2 - 0
src/projects/home/utils/request.js

@@ -27,6 +27,8 @@ service.interceptors.request.use(config => {
 	// 	var Authorization = process.env.VUE_APP_AUTH;
 	// } else {
 	var Authorization = getToken() ? getToken() : '';
+
+	//var Authorization =  'Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMDAxNSIsImV4cCI6MTYwMTM3NzQyNH0.lmtjaZH3VAreGTS9zPosBHPRQ3_DC2esuY1AV1pI1rM';
 	// }
 
 	// 获取token