zouling 1 rok pred
commit
d0b2fd3ac9
100 zmenil súbory, kde vykonal 9137 pridanie a 0 odobranie
  1. 25 0
      .gitignore
  2. 11 0
      1.txt
  3. BIN
      5737962ffdab946953097e82dea72efd.keystore
  4. 186 0
      App.vue
  5. 21 0
      LICENSE
  6. 52 0
      README.md
  7. 287 0
      a/code.vue
  8. 65 0
      api/login.js
  9. 40 0
      api/mine/mine.js
  10. 72 0
      api/mine/order.js
  11. 75 0
      api/mine/register.js
  12. 65 0
      api/system/user.js
  13. 61 0
      components/footer/footer.vue
  14. 768 0
      components/lunc-calendar/calendar.js
  15. 921 0
      components/lunc-calendar/lunc-calendar.vue
  16. 126 0
      components/lunc-calendar/readme.md
  17. 39 0
      components/nodata/nodata.vue
  18. 151 0
      components/order/list.vue
  19. 72 0
      components/order/popup.vue
  20. 76 0
      components/order/stepbar.vue
  21. 52 0
      components/order/zan.vue
  22. 176 0
      components/toptab/phonebtn.vue
  23. 99 0
      components/toptab/tab.vue
  24. 167 0
      components/uni-section/uni-section.vue
  25. 32 0
      config.js
  26. 19 0
      main.js
  27. 101 0
      manifest.json
  28. 35 0
      package-lock.json
  29. 6 0
      package.json
  30. 196 0
      pages.json
  31. 80 0
      pages/agreement.vue
  32. 43 0
      pages/common/textview/index.vue
  33. 34 0
      pages/common/webview/index.vue
  34. 37 0
      pages/index.vue
  35. 394 0
      pages/index/index.vue
  36. 409 0
      pages/login.vue
  37. 75 0
      pages/mine/about/index.vue
  38. 636 0
      pages/mine/avatar/index.vue
  39. 112 0
      pages/mine/help/index.vue
  40. 502 0
      pages/mine/index.vue
  41. 127 0
      pages/mine/info/edit.vue
  42. 44 0
      pages/mine/info/index.vue
  43. 121 0
      pages/mine/pwd/forgetpwd.vue
  44. 99 0
      pages/mine/pwd/index.vue
  45. 100 0
      pages/mine/pwd/resetpwd.vue
  46. 78 0
      pages/mine/setting/index.vue
  47. 141 0
      pages/order/code.vue
  48. 584 0
      pages/order/come.vue
  49. 274 0
      pages/order/comedetail.vue
  50. 26 0
      pages/order/index.vue
  51. 96 0
      pages/order/notice.vue
  52. 217 0
      pages/order/search.vue
  53. 203 0
      pages/order/staffcode.vue
  54. 138 0
      pages/order/stafffail.vue
  55. 196 0
      pages/register.vue
  56. 37 0
      pages/work/index.vue
  57. 39 0
      permission.js
  58. 31 0
      plugins/amap-wx.130.js
  59. 60 0
      plugins/auth.js
  60. 14 0
      plugins/index.js
  61. 74 0
      plugins/modal.js
  62. 30 0
      plugins/tab.js
  63. BIN
      static/favicon.ico
  64. 90 0
      static/font/iconfont.css
  65. BIN
      static/font/iconfont.ttf
  66. BIN
      static/images/banner/banner01.jpg
  67. BIN
      static/images/banner/banner02.jpg
  68. BIN
      static/images/banner/banner03.jpg
  69. BIN
      static/images/mine/habg.png
  70. BIN
      static/images/mine/lcicon.png
  71. BIN
      static/images/mine/ldicon.png
  72. BIN
      static/images/mine/lnicon.png
  73. BIN
      static/images/mine/lricon.png
  74. BIN
      static/images/mine/miconc.png
  75. BIN
      static/images/mine/miconf.png
  76. BIN
      static/images/mine/miconj.png
  77. BIN
      static/images/mine/miconl.png
  78. BIN
      static/images/mine/mnotic.png
  79. BIN
      static/images/mine/pcicon.png
  80. BIN
      static/images/mine/pnicon.png
  81. BIN
      static/images/mine/profile.png
  82. BIN
      static/images/mine/rimg.png
  83. BIN
      static/images/mine/success.png
  84. BIN
      static/images/mine/wrimg.png
  85. BIN
      static/images/noiconp.png
  86. BIN
      static/images/order/come/icon_lc_yy_jxz.png
  87. BIN
      static/images/order/come/icon_lc_yy_normal.png
  88. BIN
      static/images/order/come/icon_lc_yy_selected.png
  89. BIN
      static/images/order/come/icon_mrrr_sjts.png
  90. BIN
      static/images/order/come/icon_xl_wzrl.png
  91. BIN
      static/images/order/come/icon_yq_gly_tq_qt.png
  92. BIN
      static/images/order/come/icon_yq_yy_mr_gx.png
  93. BIN
      static/images/order/come/icon_yq_yy_mr_sj.png
  94. BIN
      static/images/order/come/icon_yq_yy_mr_zd.png
  95. BIN
      static/images/order/come/icon_yq_yy_mrrz.png
  96. BIN
      static/images/order/come/pic_lc_yy_xt_normal.png
  97. BIN
      static/images/order/come/pic_lc_yy_xt_selevted.png
  98. BIN
      static/images/order/come/pic_lfsj_jt.png
  99. BIN
      static/images/order/come/pic_mrrz_sbk.png
  100. BIN
      static/images/order/come/ucin_yq_yyts.png

+ 25 - 0
.gitignore

@@ -0,0 +1,25 @@
+######################################################################
+# Build Tools
+
+/unpackage/*
+/node_modules/*
+
+######################################################################
+# Development Tools
+
+/.idea/*
+/.vscode/*
+/.hbuilderx/*
+
+
+yarn.lock
+
+
+unpackage/
+
+
+/mp-weixin
+/unpackage
+
+.DS_Store
+node_modules/

+ 11 - 0
1.txt

@@ -0,0 +1,11 @@
+包名:zs.lyreservation.app
+
+
+证书别名:__uni__6c93067
+证书私钥密码:4Qa89til
+
+SHA1: 66:B8:5D:7C:0A:02:18:C5:24:46:EF:12:A1:4C:0A:D7:07:B8:4E:8D
+
+高德key:14b0dd93ed792fe585d89f173e4e511d
+
+极光appkey:

BIN
5737962ffdab946953097e82dea72efd.keystore


+ 186 - 0
App.vue

@@ -0,0 +1,186 @@
+<script>
+  import config from './config'
+  import store from '@/store'
+  import { getToken } from '@/utils/auth'
+import {updateUserProfile,findVersion} from "@/api/system/user.js"
+  const baseUrl = config.baseUrl
+  export default {
+	data(){
+		return{
+			platform:'Android'  
+		}
+	},
+    onLaunch: function() {
+	  // #ifdef APP
+	  this.onlineWgt(); //版本更新
+	  // var url=baseUrl; 
+	  // if(url.indexOf('https://lyyy.qs163.cn')!=-1){
+	  	
+	  	
+	  // }else{
+	  // } 
+	  // #endif
+    },
+    methods: {
+		//热更新
+		// this.getJGtuifn()
+		// 在线跟新
+		onlineWgt() {
+			let that = this;
+			plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
+				that.comparisonVersionNo(widgetInfo.versionCode);
+			});
+			// that.comparisonVersionNo()
+		},
+		comparisonVersionNo(versionCode) {
+			let that = this;
+			// console.log("aaaaaaa===versionCode", versionCode);
+			const parmas = {
+				model: that.platform
+			}   
+			findVersion(parmas).then(res => {
+				// console.log(res)  
+				if (res.code == "200") {
+					let versionNos = res.data.code;
+					// console.log(versionNos,'versionNos')
+					let filePath = res.data.path;
+					if (Number(versionNos) > Number(versionCode)) { //服务器返回1更新,0则不更新
+						uni.showModal({
+							title: '提示',
+							content: '发现新版本,是否升级',
+							success: function(res) {
+								// console.log(widgetInfo.version);
+								if (res.confirm) {
+									console.log('用户点击确定');
+									that.getProperty(filePath);
+								} else if (res.cancel) {
+									console.log('用户点击取消');
+								}
+							}
+						});
+					}
+				}
+			}).catch(error=>{
+				uni.hideLoading()
+				console.log(error)
+			})
+		},
+		getProperty(getProperty) {
+			// console.log("bbbbbbbbb----------->", getProperty)
+			let that = this;
+			// console.log(baseUrl + getProperty)
+			// 在线升级app/热更新
+			that.showwri = true;
+			const downloadTask = uni.downloadFile({ //下载文件
+				url: baseUrl + getProperty,
+				success: (downloadResult) => {
+					// console.log(downloadResult);
+					if (downloadResult.statusCode == 200) {
+						// 更新升级
+						plus.runtime.install(downloadResult.tempFilePath, {
+							force: true
+						}, function() {
+							// console.log('install success...');
+							that.showwri = false;
+							plus.nativeUI.alert("应用资源更新完成!", function() {
+								plus.runtime.restart();
+							});
+						}, function(e) {
+							that.showwri = false;
+							plus.nativeUI.alert("更新失败,请稍后再试");
+						});
+					}
+				}
+			});
+			downloadTask.onProgressUpdate((res) => { //下载文件的进度
+				that.totalBytesWritten = res.totalBytesWritten; //当前下载大小
+				that.progress = res.progress; //当前下载比例
+				that.totalBytesExpectedToWrite = res.totalBytesExpectedToWrite; //
+			});
+		},
+		// 极光推送
+		getJGtuifn(){ 
+			//#ifdef APP-PLUS
+				var jpushModule = uni.requireNativePlugin("JG-JPush");
+				jpushModule.setLoggerEnable(true);
+				// 初始化函数
+				jpushModule.initJPushService();
+				jpushModule.addConnectEventListener(result=>{
+					let connectEnable = result.connectEnable
+					// console.log("jpush连接", connectEnable)
+				})
+				jpushModule.getRegistrationID(result => {
+					// console.log("注册ID.....",result)
+					this.registerID = result.registerID;
+					if(getToken()){
+						var params={
+							jgId:this.registerID,
+						}
+						updateUserProfile(params).then(res=>{
+							if(rtes.code==200){
+								console.log(res,9)
+							}
+						})
+					}	
+				})
+				jpushModule.isPushStopped(result=>{
+					let code = result.code
+					console.log('连接状态回调',result)
+				});
+				// 设置别名
+				jpushModule.setAlias({
+					'alias' : 'coder',
+					'sequence': 1
+				})
+				jpushModule.addNotificationListener(result=>{
+					let notificationEventType = result.notificationEventType
+					let messageID = result.messageID
+					let title = result.title
+					let content = result.content
+					let extras = result.extras
+					console.log('通知事件回调',result)
+					// 推送一个本地通知
+					jpushModule.addLocalNotification({
+						messageID,
+						title,
+						content,
+						extras
+					})
+				})
+				jpushModule.addNotificationListener(result => {
+				console.log(result)
+				if (result.notificationEventType == "notificationOpened") {
+				  //点击窗口通知栏推送的消息 跳转指定页面
+					uni.reLaunch({
+						url:'/pages/login'
+					})
+				}
+		 
+			});
+			//#endif 
+		},
+      // 初始化应用
+      initApp() {
+        // 初始化应用配置
+        this.initConfig()
+        // 检查用户登录状态
+        //#ifdef H5
+        this.checkLogin()
+        //#endif
+      },
+      initConfig() {
+        this.globalData.config = config
+      },
+      checkLogin() {
+        // if (!getToken()) {
+        //   this.$tab.reLaunch('/pages/login') 
+        // }
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  @import '@/static/scss/index.scss';
+  @import "@/static/style.css";
+</style>

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2022 若依
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 52 - 0
README.md

@@ -0,0 +1,52 @@
+<p align="center">
+	<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-43e3941654fa3054c9684bf53d1b1d356a1.png">
+</p>
+<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v1.1.0</h1>
+<h4 align="center">基于UniApp开发的轻量级移动端框架</h4>
+<p align="center">
+	<a href="https://gitee.com/y_project/RuoYi-App/stargazers"><img src="https://gitee.com/y_project/RuoYi-App/badge/star.svg?theme=dark"></a>
+	<a href="https://gitee.com/y_project/RuoYi-App"><img src="https://img.shields.io/badge/RuoYi-v1.1.0-brightgreen.svg"></a>
+	<a href="https://gitee.com/y_project/RuoYi-App/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
+</p>
+
+## 平台简介
+
+RuoYi App 移动解决方案,采用uniapp框架,一份代码多终端适配,同时支持APP、小程序、H5!实现了与[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue)、[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)完美对接的移动解决方案!目前已经实现登录、我的、工作台、编辑资料、头像修改、密码修改、常见问题、关于我们等基础功能。
+
+* 配套后端代码仓库地址[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 或 [RuoYi-Cloud](https://github.com/yangzongzhuan/RuoYi-Cloud) 版本。
+* 应用框架基于[uniapp](https://uniapp.dcloud.net.cn/),支持小程序、H5、Android和IOS。
+* 前端组件采用[uni-ui](https://github.com/dcloudio/uni-ui),全端兼容的高性能UI框架。
+* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)&nbsp;&nbsp;
+* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)&nbsp;&nbsp;
+
+
+## 技术文档
+
+- 官网网站:[http://ruoyi.vip](http://ruoyi.vip)
+- 文档地址:[http://doc.ruoyi.vip](http://doc.ruoyi.vip)
+- H5页体验:[http://h5.ruoyi.vip](http://h5.ruoyi.vip)
+- QQ交流群: ①133713780(满)、②146013835
+- 小程序体验
+
+<img src="https://oscimg.oschina.net/oscnet/up-26c76dc90b92acdbd9ac8cd5252f07c8ad9.jpg" alt="小程序演示"/>
+ 
+
+## 演示图
+
+<table>
+    <tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-3ea20e447ac621a161e395fb53ccc683d84.png"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-a6f23cf9a371a30165e135eff6d9ae89a9d.png"/></td>
+		<td><img src="https://oscimg.oschina.net/oscnet/up-ff5f62016bf6624c1ff27eee57499dccd44.png"/></td>
+    </tr>
+	<tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-b9a582fdb26ec69d407fabd044d2c8494df.png"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-96427ee08fca29d77934cfc8d1b1a637cef.png"/></td>
+		<td><img src="https://oscimg.oschina.net/oscnet/up-5fdadc582d24cccd7727030d397b63185a3.png"/></td>
+    </tr>
+	<tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-0a36797b6bcc50c36d40c3c782665b89efc.png"/></td>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-d77995cc00687cedd00d5ac7d68a07ea276.png"/></td>
+		<td><img src="https://oscimg.oschina.net/oscnet/up-fa8f5ab20becf59b4b38c1b92a9989e7109.png"/></td>
+    </tr>
+</table>

+ 287 - 0
a/code.vue

@@ -0,0 +1,287 @@
+<template>
+  <view>
+	  <view v-if="nodataflag" class="nodata">
+		  <image :src="noiconpimg" class="img"></image>
+		  <view class="tit">暂无预约信息</view>
+	  </view>
+	<view class="ytbox" v-else>
+		<view class="code_box">
+			<view class="cdet" v-if="yy_code">
+				<view class="ctit">通行码</view>
+				<view class="ycode">
+					<!-- <view class="tit">请向工作人员出示该二维码即可扫码通行</view> -->
+					<view class="img">
+						<image :src="yy_code" class="codeimg" @click.stop="getPreview"></image>
+						<view class="usebox" v-if="useflag">
+							<image :src="useimg" class="useimg"></image>
+						</view>
+						
+					</view>
+					<view class="txt txta" v-if="useflag">通行码已使用</view>
+					<view class="txt" v-else>点击二维码可放大哦</view>
+				</view>
+			</view> 
+			<!-- 预约失败 -->
+			<view class="cdet">
+				<view class="ctit">预约信息</view>
+				<view class="yerror" v-if="yyerror">
+					<image :src="errorimg"></image>
+					<view>审核失败</view>
+				</view>
+				<view class="cbox">
+					<view class="ctxt">预约时间</view>
+					<view class="ctlist">
+						<view class="tit">参观日期:</view>
+						<view class="txt">{{datainfo.visitDate||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">参观时间:</view>
+						<view class="txt">{{datainfo.visitTime||''}}</view>
+					</view>
+				</view>
+				<view class="cbox">
+					<view class="ctxt">登记信息</view>
+					<view class="ctlist">
+						<view class="tit">游客类型:</view>
+						<view class="txt" v-if="datainfo.reservatType">{{datainfo.reservatType=='2'?'散客':'团队'}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">单位名称:</view>
+						<view class="txt">{{datainfo.visitUnitName||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">参观人数:</view>
+						<view class="txt">{{datainfo.visitNum||''}}人</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">联系人:</view>
+						<view class="txt">{{datainfo.visitName||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">联系电话:</view>
+						<view class="txt">{{datainfo.visitPhone||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">是否接待:</view>
+						<view class="txt">{{datainfo.isReception=='Y'?'是':'否'||''}}</view>
+					</view>
+					<block v-if="datainfo.isReception=='Y'">
+						<view class="ctlist" v-if="datainfo.receptionName">
+							<view class="tit">接待人:</view>
+							<view class="txt">{{datainfo.receptionName||''}}</view>
+						</view>
+						<view class="ctlist" v-if="datainfo.receptionPhone">
+							<view class="tit">接待电话:</view>
+							<view class="txt">{{datainfo.receptionPhone||''}}</view>
+						</view>
+					</block>
+					<view class="ctlist">
+						<view class="tit">备注信息:</view>
+						<view class="txt">{{datainfo.visitRemark||''}}</view>
+					</view>
+				</view>
+			</view> 
+		</view>
+		<view class="code_btn" v-if="!useflag">
+			<view class="btn btn2 flex1" @click="getFail" >取消预约</view>
+		</view> 
+	</view>
+	
+	<!-- 弹窗 -->
+	<pop-up :type="type" @getClose="getClose"></pop-up>
+  </view>
+</template>
+
+<script>
+	import * as base64 from "base-64"
+	import popUp from "@/components/order/popup.vue"
+	import {getReservatDetail,getReservatDel} from "@/api/mine/order.js"
+	import QR from "@/utils/wxqrcode.js" // 二维码生成器 
+	import config from '@/config'
+	const baseUrlimg = config.baseUrlimg
+  export default {
+	  components:{popUp},
+	data(){
+		return{
+			codeimg:require('@/static/images/order/comes/code.png'),
+			useimg:require('@/static/images/order/comes/use.png'),
+			errorimg:require('@/static/images/order/comes/error.png'),
+			noiconpimg:require("@/static/images/noiconp.png"),
+			//status:  填写状态  0:未填   1:在填  2:填完
+			steps:[{tit:'预约时间',status:1,val:0},{tit:'信息登记',status:1,val:1},{tit:'等待审核',status:0,val:2},{tit:'审核结果',status:0,val:3}],
+			fixedflag:true,
+			fixedflag:true,
+			useflag:false,
+			type:0,
+			yy_code:'',
+			id:'',
+			yyerror:false,
+			nodataflag:false,
+			datainfo:{
+				
+			},
+
+		}
+	},
+	onLoad: function(e) {
+		this.id=base64.decode(e.id);
+		this.getDataFn()
+	},
+	methods:{
+		getClose(){
+			this.type=0;
+		},
+		getFail(){
+			var that=this;
+			uni.showModal({
+				title: '确认取消',
+				content: "是否确认取消该预约",
+				cancelText: '取消',
+				confirmText: '确认',
+				success: function(res) {
+					if (res.confirm) {
+						getReservatDel(that.id).then(res=>{
+							if(res.code==200){
+								that.$toast('取消成功')
+								setTimeout(function(){
+									that.getDataFn()
+								},1500)
+								
+							}else{
+								that.$toast(res.msg)
+							}
+						})
+					} else if (res.cancel) {
+						// console.log('用户点击取消');
+					}
+				}
+			});
+			
+		},
+		getPreview() {
+			var newArr=[];
+			var url=this.yy_code
+			newArr.push(url)
+			uni.previewImage({
+				urls: newArr,
+				current:0,
+				success: function(data) {
+					
+				},
+				fail: function(err) {
+					
+				}
+			});
+		},
+		getDataFn(){
+			getReservatDetail(this.id).then(res=>{
+				if(res.code==200){
+					if(res.data){
+						this.datainfo=res.data;
+						if(res.data.visitStatus&&res.data.visitStatus==2){
+							this.useflag=true;
+						}
+						var type=res.data.visitType;
+						var reservatType=res.data.reservatType
+						if(reservatType==2){
+							this.steps[2].status=2;
+							this.steps[3].status=2;
+							this.steps[3].tit='预约成功';
+							this.yy_code = QR.createQrCodeImg(this.id, {
+								size: parseInt(240),//二维码大小 
+								typeNumber:10
+							})
+						}else{
+							//visitType":"预约状态 1:等待审核 2:拒绝 3:同意",
+							if(type==1){
+								this.steps[2].status=2;
+							}else if(type==2){
+								this.steps[2].status=2;
+								this.steps[3].status=2;
+								this.steps[3].tit='预约失败';
+								this.yyerror=true
+							}else if(type==3){
+								this.steps[2].status=2;
+								this.steps[3].status=2;
+								this.steps[2].tit='审核完成';
+								this.steps[3].tit='预约成功';
+								this.yy_code = QR.createQrCodeImg(this.id, {
+									size: parseInt(240),//二维码大小 
+									typeNumber:10
+								})
+							}
+						}
+					}else{
+						this.nodataflag=true
+					}
+					
+					
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+		}
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.ytbox{padding:40rpx 0 32rpx;}
+// .nodata{width: 100%;min-height: 100vh;background-color: #FFFFFF;padding-top: 200rpx;box-sizing: border-box;
+// 	.img{width: 426rpx;height: 475rpx;margin:0 auto 40rpx;}
+// 	.tit{font-size: 32rpx;text-align: center;}
+// }
+.nodata{
+	display: flex;flex-direction: column;align-items: center;box-sizing: border-box;padding-top: 200rpx;min-height: 100vh;box-sizing: border-box;background-color: #FFFFFF;
+	.img{width: 456rpx;height: 178rpx;margin-bottom: 28rpx;}
+	.tit{font-size: 30rpx;color: #AAAAAA;font-weight: bold;}
+}	
+.code_box{
+	width: 684rpx;background: #FFFFFF;border-radius: 6rpx;margin: 0 auto;padding:40rpx 60rpx;box-sizing: border-box;flex: 1;
+	.cdet{
+		.ctit{font-size: 32rpx;font-weight: bold;color: #161616;position: relative;
+				&::before{width: 6rpx;height: 34rpx;background: $com-cd3;border-radius: 2rpx;content: '';left: -26rpx;top: 3rpx;position: absolute;bottom: 3rpx;}
+		}
+		.cbox{padding: 36rpx 0 12rpx;}
+		.ctxt{font-size: 30rpx;font-weight: bold;
+color: $com-cd3;margin-bottom: 16rpx;}
+		.ctlist{padding: 10rpx 0;display: flex;justify-content: space-between;
+			.tit{font-size: 30rpx;font-weight: 500;
+			color: #AAAAAA;flex:0 0 auto;margin-right: 20rpx;}
+			.txt{font-size: 30rpx;font-weight: 500;color: #161616;flex: 1;text-align: right;	}
+		}
+		.yerror{padding: 14rpx 0 30rpx;
+			image{width: 296rpx;height: 330rpx;margin: 0 auto 16rpx;}
+			view{font-size: 24rpx;font-weight: bold;color: #D32C26;text-align: center;}
+		}
+		
+	}
+	
+	// 二维码
+	.ycode{text-align: center;padding: 34rpx 0 30rpx;
+		.tit{font-size: 28rpx;font-weight: bold;
+color: #FFB132;}
+		.img{width: 270rpx;height: 270rpx;margin: 6rpx auto;padding: 10rpx;box-sizing: border-box;position: relative;
+			.codeimg{width: 100%;height: 100%;}
+			.usebox{
+				position: absolute;left: 0;right: 0;top: 0;bottom: 0;background-color: rgba(255, 255, 255, 0.8);
+			}
+			.useimg{width: 132rpx;height: 86rpx;position: absolute;bottom: 50rpx;right: 40rpx;}
+		}
+		.txt{font-size: 24rpx;font-weight: bold;color: $com-cd3;
+			&.txta{color: #AAAAAA;}
+		}
+	}
+}
+.code_btn{flex: 0 0 auto;padding: 40rpx 32rpx;display: flex;align-items: center;justify-content: space-between;
+	.btn{width: 320rpx;height: 80rpx;border-radius: 40rpx;box-sizing: border-box;font-size: 32rpx;font-weight: 500;text-align: center;line-height: 80rpx;
+		&.btn1{background: #FFFFFF;border: 2rpx solid $com-cd3;color: $com-cd3;}
+		&.btn2{background: $com-cd3;color: #FFFFFF;}
+	}
+
+}
+
+
+
+</style>

+ 65 - 0
api/login.js

@@ -0,0 +1,65 @@
+import request from '@/utils/request'
+// 登录方法
+export function login(username, password, code, uuid) {
+  const data = {
+    username,
+    password,
+    code,
+    uuid
+  }
+  return request({
+    'url': '/login',
+    headers: {
+      isToken: false
+    },
+    'method': 'post',
+    'data': data
+  })
+}
+
+// 注册方法
+export function register(data) {
+  return request({
+    url: '/register',
+    headers: {
+      isToken: false
+    },
+    method: 'post',
+    data: data
+  })
+}
+
+// 获取用户详细信息
+export function getInfo() {
+  return request({
+    'url': '/getInfo',
+    'method': 'get'
+  })
+}
+
+// 退出方法
+export function logout() {
+  return request({
+    'url': '/logout',
+    'method': 'post'
+  })
+}
+
+// 获取验证码
+export function getCodeImg() {
+  return request({
+    'url': '/captchaImage',
+    headers: {
+      isToken: false
+    },
+    method: 'get',
+    timeout: 20000
+  })
+}
+// 获取手机验证码
+export function sendSmsFn(data) {
+  return request({
+    'url': '/sendSms/'+data,
+    'method': 'get'
+  })
+}

+ 40 - 0
api/mine/mine.js

@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+//获取子部门列表system:dept:list
+export function getDeptList(data) {
+  return request({
+    'url': '/system/dept/list/'+data,
+    'method': 'get',
+  })
+}
+export function getDeptListparent(data) {
+  return request({
+    'url': '/system/dept/old/list',
+    'method': 'get',
+	'data':data
+  })
+}
+export function getDeptListmine(data) {
+  return request({
+    // 'url': '/system/dept/list',
+    'url': '/system/dept/noAuthority/list',
+    'method': 'get',
+	// 'data':data
+  })
+}
+//app查看所属自己的部门信息
+export function getselfList(data) {
+  return request({
+    'url': '/system/dept/app/self/list',
+    'method': 'get',
+	'data':data
+  })
+}
+//详情 
+export function getDeptdetFn(data) {
+  return request({
+    'url': '/system/dept/'+data,
+    'method': 'get',
+  })
+}
+
+

+ 72 - 0
api/mine/order.js

@@ -0,0 +1,72 @@
+import request from '@/utils/request'
+// 查询陵园预约信息列表
+export function getReservatList(data) {
+  return request({
+    'url': '/system/reservat/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// 查询陵园预约配置信息列表
+export function getConfigList(data) {
+  return request({
+    'url': '/reservat/config/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// H5时段信息 日历
+export function getCalendarList(data) {
+  return request({
+    'url': '/boman/common/reservatConfig/calendar',
+    'method': 'post',
+	'data':data
+  })
+}
+// 新增预约
+export function getReservatAdd(data) {
+  return request({
+    'url': '/system/reservat',
+    'method': 'post',
+	'data':data
+  })
+}
+// 预约详情
+export function getReservatDetail(data) {
+  return request({
+    'url': '/system/reservat/'+data,
+    'method': 'get',
+  })
+}
+// 取消预约
+export function getReservatDel(data) {
+  return request({
+    'url': '/system/reservat/delete/'+data,
+    'method': 'get',
+  })
+}
+// 预约首页统计 system:reservat:add
+export function getReservatcountl(data) {
+  return request({
+    'url': '/boman/common/indexStatistics',
+    'method': 'post',
+	'data':data
+  })
+}
+// 预约信息核销 system:reservat:cav
+export function getReservatvav(data) {
+  return request({
+    'url': '/system/reservat/hx',
+    'method': 'get',
+	'data':data
+  })
+}
+// 预约须知
+export function getNewsList(data) {
+  return request({
+    'url': '/system/news/list',
+    'method': 'get',
+	'data':data
+  })
+}
+// 新的end

+ 75 - 0
api/mine/register.js

@@ -0,0 +1,75 @@
+import request from '@/utils/request'
+
+
+// 字典值yzdqId
+export function getDictionaryFn(data) {
+  return request({
+    url: '/system/dict/data/type/'+data,
+    method: 'get',
+	type:true
+  })
+}
+// 参数设置
+export function getconfigKeyFn(data) {
+  return request({
+    url: '/system/config/scoreWatermark/'+data,
+    method: 'get',
+	type:true
+  })
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+// // 流程发起时获取下一节点
+// export function getflowableNextRegFn(data) {
+//   return request({
+//     'url': '/flowable/task/nextFlowNodeByStart',
+//     'method': 'post',
+// 	data:data
+//   })
+// }
+// // 发起流程
+// export function getflowableRegFn(id,data) {
+//   return request({
+//     'url': '/flowable/definition/start/'+id,
+//     'method': 'post',
+// 	data:data
+//   })
+// }
+
+// //获取流程定义列表
+// export function getflowlistFn(data) {
+//   return request({
+//     'url': '/flowable/definition/list',
+//     'method': 'get',
+// 	'data':data
+//   })
+// }
+// //获取自己发起的流程
+// export function getflowMyFn(data) {
+//   return request({
+//     'url': '/flowable/task/myProcess',
+//     'method': 'get',
+// 	'data':data
+//   })
+// }

+ 65 - 0
api/system/user.js

@@ -0,0 +1,65 @@
+import upload from '@/utils/upload'
+import request from '@/utils/request'
+
+// 用户密码重置
+export function updateUserPwd(oldPassword, newPassword) {
+  const data = {
+    oldPassword,
+    newPassword
+  }
+  return request({
+    url: '/system/user/profile/updatePwd',
+    method: 'put',
+    params: data
+  })
+}
+// 忘记密码发送短信
+export function getappForgetPW(data) {
+  return request({
+    url: '/applet/appForgetPW/'+data,
+    method: 'get',
+  })
+}
+// 重置密码
+export function getappCheck(data) {
+  return request({
+    url: '/applet/appCheck',
+    method: 'get',
+	'data':data
+  })
+}
+
+// 查询用户个人信息
+export function getUserProfile() {
+  return request({
+    url: '/system/user/profile',
+    method: 'get'
+  })
+}
+
+// 修改用户个人信息
+export function updateUserProfile(data) {
+  return request({
+    url: '/system/user/profile',
+    method: 'put',
+    data: data
+  })
+}
+
+// 用户头像上传
+export function uploadAvatar(data) {
+  return upload({
+    url: '/system/user/profile/avatar',
+    name: data.name,
+    filePath: data.filePath
+  })
+}
+
+// 下载版本更新
+export function findVersion(data) {
+  return request({
+    url: '/system/app/new',
+    method: 'get',
+    data: data
+  })
+}

+ 61 - 0
components/footer/footer.vue

@@ -0,0 +1,61 @@
+<template>
+	<view>
+		
+	
+	<view style="height: 100rpx;"></view>
+    <view class="com_footer">
+        <view class="in_item" v-for="(item,k) in footlist" :key="k" @click="gotopage(item)">
+			<image class="in_img" v-if="active == item.module" :src="item.icon_checked" mode="scaleToFill"></image>
+			<image class="in_img" v-else :src="item.icon_nochecked" mode="scaleToFill"></image>
+			<view class="in_txt" v-if="active == item.module" :style="'color: #'+color_checked">{{item.title}}</view>
+			<view class="in_txt" v-else :style="'color: #'+color_nochecked">{{item.title}}</view>
+        </view>
+    </view>
+	</view>
+</template>
+
+<script>
+	// import api from '../../api/api.js'
+	// import plugins from '../../commen/js/plugin.js'
+    export default {
+		props:[
+			'footlist',
+			'footerindex',
+			'color_checked',
+			'color_nochecked',
+			'isHomeIndex'
+		],
+        data () {
+            return{
+				active :'',
+            }
+        },
+		mounted() {
+			var that = this;
+			this.active = this.footerindex;
+		},
+        methods:{
+            // 跳转底部导航页面
+			gotopage(e){
+				var that = this;
+				let link = e.link, module = e.module, def = e.default, title = e.title;
+				if(module == 'home'){
+					this.$tab.reLaunch('/pages/index/index')
+				}else if(module == 'mine'){
+					this.$tab.reLaunch('/pages/mine/index')
+				}
+			},
+			
+        }
+    }
+</script>
+
+
+
+<style type="text/css">
+    .com_footer{ display: flex;position: fixed;box-sizing: border-box;z-index: 99;width: 100%;height: 100rpx;bottom: 0;left: 0;background-color: #fff;overflow: hidden;box-shadow: 0px 0px 16rpx 0px rgba(87,87,87,0.41);}
+	.com_footer .in_item{ display: block;flex: 1;padding: 12rpx 0 0 0;overflow: hidden; }
+	.com_footer .in_img{ display: block;width: 44rpx;height: 44rpx;margin: 0 auto; }
+	.com_footer .in_txt{ font-size: 26rpx;color: #999;text-align: center; font-weight: bold;}
+	.com_footer .in_txt_on{ color: #20AD20; }
+</style>

+ 768 - 0
components/lunc-calendar/calendar.js

@@ -0,0 +1,768 @@
+/**
+ * @1900-2100区间内的公历、农历互转
+ * @charset UTF-8
+ * @Author  Jea杨(JJonline@JJonline.Cn)
+ * @Time    2014-7-21
+ * @Time    2016-8-13 Fixed 2033hex、Attribution Annals
+ * @Time    2016-9-25 Fixed lunar LeapMonth Param Bug
+ * @Time    2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year
+ * @Version 1.0.3
+ * @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0]
+ * @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0]
+ */
+export var calendar = {
+
+	/**
+	 * 农历1900-2100的润大小信息表
+	 * @Array Of Property
+	 * @return Hex
+	 */
+	lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0,
+		0x055d2, //1900-1909
+		0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, //1910-1919
+		0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, //1920-1929
+		0x06566, 0x0d4a0, 0x0ea50, 0x16a95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, //1930-1939
+		0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, //1940-1949
+		0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, //1950-1959
+		0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, //1960-1969
+		0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, //1970-1979
+		0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, //1980-1989
+		0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, //1990-1999
+		0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, //2000-2009
+		0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, //2010-2019
+		0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, //2020-2029
+		0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, //2030-2039
+		0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, //2040-2049
+		/**Add By JJonline@JJonline.Cn**/
+		0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, //2050-2059
+		0x092e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, //2060-2069
+		0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, //2070-2079
+		0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, //2080-2089
+		0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, //2090-2099
+		0x0d520
+	], //2100
+
+	/**
+	 * 公历每个月份的天数普通表
+	 * @Array Of Property
+	 * @return Number
+	 */
+	solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
+
+	/**
+	 * 天干地支之天干速查表
+	 * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
+	 * @return Cn string
+	 */
+	Gan: ["\u7532", "\u4e59", "\u4e19", "\u4e01", "\u620a", "\u5df1", "\u5e9a", "\u8f9b", "\u58ec", "\u7678"],
+
+	/**
+	 * 天干地支之地支速查表
+	 * @Array Of Property
+	 * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
+	 * @return Cn string
+	 */
+	Zhi: ["\u5b50", "\u4e11", "\u5bc5", "\u536f", "\u8fb0", "\u5df3", "\u5348", "\u672a", "\u7533", "\u9149",
+		"\u620c",
+		"\u4ea5"
+	],
+
+	/**
+	 * 天干地支之地支速查表<=>生肖
+	 * @Array Of Property
+	 * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
+	 * @return Cn string
+	 */
+	Animals: ["\u9f20", "\u725b", "\u864e", "\u5154", "\u9f99", "\u86c7", "\u9a6c", "\u7f8a", "\u7334", "\u9e21",
+		"\u72d7", "\u732a"
+	],
+
+	/**
+	 * 阳历节日
+	 */
+	festival: {
+		'1-1': {
+			title: '元旦'
+		},
+		'2-14': {
+			title: '情人节'
+		},
+		'3-8': {
+			title: '妇女节'
+		},
+		'3-12': {
+			title: '植树节'
+		},
+		'4-1': {
+			title: '愚人节'
+		},
+		'4-5': {
+			title: '清明节'
+		},
+		'5-1': {
+			title: '劳动节'
+		},
+		'5-4': {
+			title: '青年节'
+		},
+		'5-12': {
+			title: '护士节'
+		},
+		'6-1': {
+			title: '儿童节'
+		},
+		'7-1': {
+			title: '建党节'
+		},
+		'8-1': {
+			title: '建军节'
+		},
+		'9-10': {
+			title: '教师节'
+		},
+		'10-1': {
+			title: '国庆节'
+		},
+		'12-24': {
+			title: '平安夜'
+		},
+		'12-25': {
+			title: '圣诞节'
+		},
+	},
+
+	/**
+	 * 农历节日
+	 */
+	lfestival: {
+		'12-30': {
+			title: '除夕'
+		},
+		'1-1': {
+			title: '春节'
+		},
+		'1-15': {
+			title: '元宵节'
+		},
+		'2-2': {
+			title: '龙抬头'
+		},
+		'5-5': {
+			title: '端午节'
+		},
+		'7-7': {
+			title: '七夕节'
+		},
+		'7-15': {
+			title: '中元节'
+		},
+		'8-15': {
+			title: '中秋节'
+		},
+		'9-9': {
+			title: '重阳节'
+		},
+		'10-1': {
+			title: '寒衣节'
+		},
+		'10-15': {
+			title: '下元节'
+		},
+		'12-8': {
+			title: '腊八节'
+		},
+		'12-23': {
+			title: '北方小年'
+		},
+		'12-24': {
+			title: '南方小年'
+		},
+	},
+
+	/**
+	 * 返回默认定义的阳历节日
+	 */
+	getFestival() {
+		return this.festival
+	},
+
+	/**
+	 * 返回默认定义的内容里节日
+	 */
+	getLunarFestival() {
+		return this.lfestival
+	},
+
+	/**
+	 * 
+	 * @param {Object} 按照festival的格式输入数据,设置阳历节日
+	 */
+	setFestival(param = {}) {
+		this.festival = param
+	},
+
+	/**
+	 * 
+	 * @param {Object} 按照lfestival的格式输入数据,设置农历节日
+	 */
+	setLunarFestival(param = {}) {
+		this.lfestival = param
+	},
+
+	/**
+	 * 24节气速查表
+	 * @Array Of Property
+	 * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
+	 * @return Cn string
+	 */
+	solarTerm: ["\u5c0f\u5bd2", "\u5927\u5bd2", "\u7acb\u6625", "\u96e8\u6c34", "\u60ca\u86f0", "\u6625\u5206",
+		"\u6e05\u660e", "\u8c37\u96e8", "\u7acb\u590f", "\u5c0f\u6ee1", "\u8292\u79cd", "\u590f\u81f3",
+		"\u5c0f\u6691",
+		"\u5927\u6691", "\u7acb\u79cb", "\u5904\u6691", "\u767d\u9732", "\u79cb\u5206", "\u5bd2\u9732",
+		"\u971c\u964d",
+		"\u7acb\u51ac", "\u5c0f\u96ea", "\u5927\u96ea", "\u51ac\u81f3"
+	],
+
+	/**
+	 * 1900-2100各年的24节气日期速查表
+	 * @Array Of Property
+	 * @return 0x string For splice
+	 */
+	sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c3598082c95f8c965cc920f',
+		'97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
+		'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
+		'97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
+		'97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
+		'97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
+		'97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
+		'97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+		'97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
+		'7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+		'97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
+		'977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
+		'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
+		'7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
+		'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
+		'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
+		'7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
+		'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
+		'665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
+		'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'
+	],
+
+	/**
+	 * 数字转中文速查表
+	 * @Array Of Property
+	 * @trans ['日','一','二','三','四','五','六','七','八','九','十']
+	 * @return Cn string
+	 */
+	nStr1: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d",
+		"\u5341"
+	],
+
+	/**
+	 * 日期转农历称呼速查表
+	 * @Array Of Property
+	 * @trans ['初','十','廿','卅']
+	 * @return Cn string
+	 */
+	nStr2: ["\u521d", "\u5341", "\u5eff", "\u5345"],
+
+	/**
+	 * 月份转农历称呼速查表
+	 * @Array Of Property
+	 * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
+	 * @return Cn string
+	 */
+	nStr3: ["\u6b63", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341",
+		"\u51ac",
+		"\u814a"
+	],
+
+	/**
+	 * 返回农历y年一整年的总天数
+	 * @param lunar Year
+	 * @return Number
+	 * @eg:var count = calendar.lYearDays(1987) ;//count=387
+	 */
+	lYearDays: function(y) {
+		var i, sum = 348;
+		for (i = 0x8000; i > 0x8; i >>= 1) {
+			sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0;
+		}
+		return (sum + this.leapDays(y));
+	},
+
+	/**
+	 * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+	 * @param lunar Year
+	 * @return Number (0-12)
+	 * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+	 */
+	leapMonth: function(y) { //闰字编码 \u95f0
+		return (this.lunarInfo[y - 1900] & 0xf);
+	},
+
+	/**
+	 * 返回农历y年闰月的天数 若该年没有闰月则返回0
+	 * @param lunar Year
+	 * @return Number (0、29、30)
+	 * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+	 */
+	leapDays: function(y) {
+		if (this.leapMonth(y)) {
+			return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29);
+		}
+		return (0);
+	},
+
+	/**
+	 * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+	 * @param lunar Year
+	 * @return Number (-1、29、30)
+	 * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+	 */
+	monthDays: function(y, m) {
+		if (m > 12 || m < 1) {
+			return -1
+		} //月份参数从1至12,参数错误返回-1
+		return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29);
+	},
+
+	/**
+	 * 返回公历(!)y年m月的天数
+	 * @param solar Year
+	 * @return Number (-1、28、29、30、31)
+	 * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
+	 */
+	solarDays: function(y, m) {
+		if (m > 12 || m < 1) {
+			return -1
+		} //若参数错误 返回-1
+		var ms = m - 1;
+		if (ms == 1) { //2月份的闰平规律测算后确认返回28或29
+			return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28);
+		} else {
+			return (this.solarMonth[ms]);
+		}
+	},
+
+	/**
+	 * 农历年份转换为干支纪年
+	 * @param  lYear 农历年的年份数
+	 * @return Cn string
+	 */
+	toGanZhiYear: function(lYear) {
+		var ganKey = (lYear - 3) % 10;
+		var zhiKey = (lYear - 3) % 12;
+		if (ganKey == 0) ganKey = 10; //如果余数为0则为最后一个天干
+		if (zhiKey == 0) zhiKey = 12; //如果余数为0则为最后一个地支
+		return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1];
+
+	},
+
+	/**
+	 * 公历月、日判断所属星座
+	 * @param  cMonth [description]
+	 * @param  cDay [description]
+	 * @return Cn string
+	 */
+	toAstro: function(cMonth, cDay) {
+		var s =
+			"\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf";
+		var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22];
+		return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + "\u5ea7"; //座
+	},
+
+	/**
+	 * 传入offset偏移量返回干支
+	 * @param offset 相对甲子的偏移量
+	 * @return Cn string
+	 */
+	toGanZhi: function(offset) {
+		return this.Gan[offset % 10] + this.Zhi[offset % 12];
+	},
+
+	/**
+	 * 传入公历(!)y年获得该年第n个节气的公历日期
+	 * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+	 * @return day Number
+	 * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+	 */
+	getTerm: function(y, n) {
+		if (y < 1900 || y > 2100) {
+			return -1;
+		}
+		if (n < 1 || n > 24) {
+			return -1;
+		}
+		var _table = this.sTermInfo[y - 1900];
+		var _info = [
+			parseInt('0x' + _table.substr(0, 5)).toString(),
+			parseInt('0x' + _table.substr(5, 5)).toString(),
+			parseInt('0x' + _table.substr(10, 5)).toString(),
+			parseInt('0x' + _table.substr(15, 5)).toString(),
+			parseInt('0x' + _table.substr(20, 5)).toString(),
+			parseInt('0x' + _table.substr(25, 5)).toString()
+		];
+		var _calday = [
+			_info[0].substr(0, 1),
+			_info[0].substr(1, 2),
+			_info[0].substr(3, 1),
+			_info[0].substr(4, 2),
+
+			_info[1].substr(0, 1),
+			_info[1].substr(1, 2),
+			_info[1].substr(3, 1),
+			_info[1].substr(4, 2),
+
+			_info[2].substr(0, 1),
+			_info[2].substr(1, 2),
+			_info[2].substr(3, 1),
+			_info[2].substr(4, 2),
+
+			_info[3].substr(0, 1),
+			_info[3].substr(1, 2),
+			_info[3].substr(3, 1),
+			_info[3].substr(4, 2),
+
+			_info[4].substr(0, 1),
+			_info[4].substr(1, 2),
+			_info[4].substr(3, 1),
+			_info[4].substr(4, 2),
+
+			_info[5].substr(0, 1),
+			_info[5].substr(1, 2),
+			_info[5].substr(3, 1),
+			_info[5].substr(4, 2),
+		];
+		return parseInt(_calday[n - 1]);
+	},
+
+	/**
+	 * 传入农历数字月份返回汉语通俗表示法
+	 * @param lunar month
+	 * @return Cn string
+	 * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+	 */
+	toChinaMonth: function(m) { // 月 => \u6708
+		if (m > 12 || m < 1) {
+			return -1
+		} //若参数错误 返回-1
+		var s = this.nStr3[m - 1];
+		s += "\u6708"; //加上月字
+		return s;
+	},
+
+	/**
+	 * 传入农历日期数字返回汉字表示法
+	 * @param lunar day
+	 * @return Cn string
+	 * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
+	 */
+	toChinaDay: function(d) { //日 => \u65e5
+		var s;
+		switch (d) {
+			case 10:
+				s = '\u521d\u5341';
+				break;
+			case 20:
+				s = '\u4e8c\u5341';
+				break;
+			case 30:
+				s = '\u4e09\u5341';
+				break;
+			default:
+				s = this.nStr2[Math.floor(d / 10)];
+				s += this.nStr1[d % 10];
+		}
+		return (s);
+	},
+
+	/**
+	 * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+	 * @param y year
+	 * @return Cn string
+	 * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔'
+	 */
+	getAnimal: function(y) {
+		return this.Animals[(y - 4) % 12]
+	},
+
+	/**
+	 * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+	 * @param y  solar year
+	 * @param m  solar month
+	 * @param d  solar day
+	 * @return JSON object
+	 * @eg:console.log(calendar.solar2lunar(1987,11,01));
+	 */
+	solar2lunar: function(y, m, d) { //参数区间1900.1.31~2100.12.31
+		y = parseInt(y)
+		m = parseInt(m)
+		d = parseInt(d)
+		//年份限定、上限
+		if (y < 1900 || y > 2100) {
+			return -1; // undefined转换为数字变为NaN
+		}
+		//公历传参最下限
+		if (y == 1900 && m == 1 && d < 31) {
+			return -1;
+		}
+		//未传参  获得当天
+		if (!y) {
+			var objDate = new Date();
+		} else {
+			var objDate = new Date(y, parseInt(m) - 1, d)
+		}
+		var i, leap = 0,
+			temp = 0;
+		//修正ymd参数
+		var y = objDate.getFullYear(),
+			m = objDate.getMonth() + 1,
+			d = objDate.getDate();
+		var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0,
+				31)) /
+			86400000;
+		for (i = 1900; i < 2101 && offset > 0; i++) {
+			temp = this.lYearDays(i);
+			offset -= temp;
+		}
+		if (offset < 0) {
+			offset += temp;
+			i--;
+		}
+
+		//是否今天
+		var isTodayObj = new Date(),
+			isToday = false;
+		if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+			isToday = true;
+		}
+		//星期几
+		var nWeek = objDate.getDay(),
+			cWeek = this.nStr1[nWeek];
+		//数字表示周几顺应天朝周一开始的惯例
+		if (nWeek == 0) {
+			nWeek = 7;
+		}
+		//农历年
+		var year = i;
+		var leap = this.leapMonth(i); //闰哪个月
+		var isLeap = false;
+
+		//效验闰月
+		for (i = 1; i < 13 && offset > 0; i++) {
+			//闰月
+			if (leap > 0 && i == (leap + 1) && isLeap == false) {
+				--i;
+				isLeap = true;
+				temp = this.leapDays(year); //计算农历闰月天数
+			} else {
+				temp = this.monthDays(year, i); //计算农历普通月天数
+			}
+			//解除闰月
+			if (isLeap == true && i == (leap + 1)) {
+				isLeap = false;
+			}
+			offset -= temp;
+		}
+		// 闰月导致数组下标重叠取反
+		if (offset == 0 && leap > 0 && i == leap + 1) {
+			if (isLeap) {
+				isLeap = false;
+			} else {
+				isLeap = true;
+				--i;
+			}
+		}
+		if (offset < 0) {
+			offset += temp;
+			--i;
+		}
+		//农历月
+		var month = i;
+		//农历日
+		var day = offset + 1;
+		//天干地支处理
+		var sm = m - 1;
+		var gzY = this.toGanZhiYear(year);
+
+		// 当月的两个节气
+		// bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year`
+		var firstNode = this.getTerm(y, (m * 2 - 1)); //返回当月「节」为几日开始
+		var secondNode = this.getTerm(y, (m * 2)); //返回当月「节」为几日开始
+
+		// 依据12节气修正干支月
+		var gzM = this.toGanZhi((y - 1900) * 12 + m + 11);
+		if (d >= firstNode) {
+			gzM = this.toGanZhi((y - 1900) * 12 + m + 12);
+		}
+
+		//传入的日期的节气与否
+		var isTerm = false;
+		var Term = null;
+		if (firstNode == d) {
+			isTerm = true;
+			Term = this.solarTerm[m * 2 - 2];
+		}
+		if (secondNode == d) {
+			isTerm = true;
+			Term = this.solarTerm[m * 2 - 1];
+		}
+		//日柱 当月一日与 1900/1/1 相差天数
+		var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10;
+		var gzD = this.toGanZhi(dayCyclical + d - 1);
+		//该日期所属的星座
+		var astro = this.toAstro(m, d);
+
+		var solarDate = y + '-' + m + '-' + d
+		var lunarDate = year + '-' + month + '-' + day
+
+		var festival = this.festival
+		var lfestival = this.lfestival
+
+		var festivalDate = m + '-' + d
+		var lunarFestivalDate = month + '-' + day
+
+		return {
+			// date: solarDate,
+			// lunarDate: lunarDate,
+			festival: festival[festivalDate] ? festival[festivalDate].title : null,
+			lunarFestival: lfestival[lunarFestivalDate] ? lfestival[lunarFestivalDate].title : null,
+			'lYear': year,
+			'lMonth': month,
+			'lDay': day,
+			'Animal': this.getAnimal(year),
+			'IMonthCn': (isLeap ? "\u95f0" : '') + this.toChinaMonth(month),
+			'IDayCn': this.toChinaDay(day),
+			// 'cYear': y,
+			// 'cMonth': m,
+			// 'cDay': d,
+			'gzYear': gzY,
+			'gzMonth': gzM,
+			'gzDay': gzD,
+			// 'isToday': isToday,
+			// 'isLeap': isLeap,
+			// 'nWeek': nWeek,
+			// 'ncWeek': "\u661f\u671f" + cWeek,
+			// 'isTerm': isTerm,
+			'Term': Term,
+			'astro': astro
+		};
+	},
+
+	/**
+	 * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
+	 * @param y  lunar year
+	 * @param m  lunar month
+	 * @param d  lunar day
+	 * @param isLeapMonth  lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
+	 * @return JSON object
+	 * @eg:console.log(calendar.lunar2solar(1987,9,10));
+	 */
+	lunar2solar: function(y, m, d, isLeapMonth) { //参数区间1900.1.31~2100.12.1
+		y = parseInt(y)
+		m = parseInt(m)
+		d = parseInt(d)
+		var isLeapMonth = !!isLeapMonth;
+		var leapOffset = 0;
+		var leapMonth = this.leapMonth(y);
+		var leapDay = this.leapDays(y);
+		if (isLeapMonth && (leapMonth != m)) {
+			return -1;
+		} //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+		if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) {
+			return -1;
+		} //超出了最大极限值
+		var day = this.monthDays(y, m);
+		var _day = day;
+		//bugFix 2016-9-25
+		//if month is leap, _day use leapDays method
+		if (isLeapMonth) {
+			_day = this.leapDays(y, m);
+		}
+		if (y < 1900 || y > 2100 || d > _day) {
+			return -1;
+		} //参数合法性效验
+
+		//计算农历的时间差
+		var offset = 0;
+		for (var i = 1900; i < y; i++) {
+			offset += this.lYearDays(i);
+		}
+		var leap = 0,
+			isAdd = false;
+		for (var i = 1; i < m; i++) {
+			leap = this.leapMonth(y);
+			if (!isAdd) { //处理闰月
+				if (leap <= i && leap > 0) {
+					offset += this.leapDays(y);
+					isAdd = true;
+				}
+			}
+			offset += this.monthDays(y, i);
+		}
+		//转换闰月农历 需补充该年闰月的前一个月的时差
+		if (isLeapMonth) {
+			offset += day;
+		}
+		//1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
+		var stmap = Date.UTC(1900, 1, 30, 0, 0, 0);
+		var calObj = new Date((offset + d - 31) * 86400000 + stmap);
+		var cY = calObj.getUTCFullYear();
+		var cM = calObj.getUTCMonth() + 1;
+		var cD = calObj.getUTCDate();
+
+		return this.solar2lunar(cY, cM, cD);
+	}
+};
+export default calendar;

+ 921 - 0
components/lunc-calendar/lunc-calendar.vue

@@ -0,0 +1,921 @@
+<template>
+	<view class="lunc-calendar">
+		<!-- 头部上下月按钮及月份 -->
+		<view class="header">
+			<text class="day_tit" >选择日期</text>
+			<text class="head-icon head-pre-month nocheck"  v-if="showChangeBtn&&!isshowPrev"></text>
+			<text class="head-icon head-pre-month" v-if="showChangeBtn&&isshowPrev" @click="changeMonthOrWeek('prev')"></text>
+			<text class="head-month">{{selDate.year+'年'+(selDate.month<10?'0'+selDate.month:selDate.month)+'月'}}</text>
+			<text class="head-icon head-next-month" v-if="showChangeBtn" @click="changeMonthOrWeek('next')"></text>
+			<text class="go-to-today" v-if="showToday" @click="goToday">今天</text>
+		</view>
+		<!-- 星期 -->
+		<view class="week-area" :class="firstDayOfWeek=='sunday'?'week-tit':''">
+			<text class="week-font" v-for="(item, index) in weekArr" :key="index ">{{ getWeekType + '' + item }}</text>
+		</view>
+		<!-- 日历 -->
+		<swiper class="calendar-data" :current="shrinkType?tranCurrent:tranIndex" circular :duration="tranDuration"
+			@change="swiperChange" @animationfinish="swiperEndChange" :style="{height:shrinkType?'112rpx':'532rpx'}">
+			<swiper-item class="swiper-item swiper-prev-item" v-for="(a, i) in getAllData" :key="i">
+				<text class="month-bg" v-if="showMonthBg">{{ getMontBg }}</text>
+				<view class="month-days" :class="[shrinkType?'item-week':'']">
+					<view class="week-days" v-for="(b, j) in a" :key="j">
+						<view class="day" v-for="(c, k) in b" :key="k" @click="clickDay(c)">
+							<!-- 法定不可约,周六日不可约  不可约优先级高于节假日-->
+							<view class="day-info" :class="[c.dayClass, getIsSelDay(c)&&'is-sel', c.dayType!='normal'&&'un-month',
+							c.sign && c.sign.length > 0&&c.sign[0].title!='可预约'||c.sign.length==0 || configWeek.indexOf(c.week)!=-1 || c.isHoliday&&configHoliday=='N'?'day-infoa':''
+							]">
+								<text class="day-solar">{{ c.day }}</text>
+								<template v-if="showLunar || c.sign && c.sign.length > 0 || c.isHoliday">
+									<!-- <text class="day-tag" v-if="c.sign && c.sign.length > 0"></text> -->
+									<text class="day-sign"  v-if="c.sign && c.sign.length > 0">
+									<!-- 节假日 -->
+										<block v-if="c.isHoliday">{{c.dayLunar}}</block>
+										<block v-else>{{ configWeek.indexOf(c.week)==-1?c.sign[0].title:'不可约' }}</block>
+									</text>
+									<text class="day-lunar" v-else>{{c.dayLunar}}</text>
+								</template>
+							</view>
+						</view>
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+		<!-- 收缩按钮 -->
+		<view class="shrink" v-if="showShrink" @click="changeShrink">
+			<image :src="upimg" class="shrink-img" :class="[shrinkType?'shrink-open':'shrink-close']"></image>
+			<!-- <text class="shrink-btn" ></text> -->
+		</view>
+	</view>
+</template>
+<script>
+	let { calendar } = require("./calendar.js");
+	/**
+	 * @property {Boolean} showLunar = [true|false] 是否显示农历,默认false
+	 * @property {Boolean} showMonthBg = [true|false] 是否显示月份背景,默认true
+	 * @property {Boolean} showChangeBtn = [true|false] 是否显示上月下月箭头按钮,默认true
+	 * @property {String} firstDayOfWeek = [monday|sunday] 周几为每周的第一天,默认monday
+	 *  @value monday 每周从周一开始(默认)
+	 *  @value sunday 每周从周日开始
+	 * @property {String} weekType = [''|周|星期] 星期的前缀;如周一周二或星期一星期二,为空则只显示一、二等;不用预设值时可自定义前缀,填的值即为星期前缀;默认周
+	 *  @value '' 星期显示:只显示一、二等
+	 *  @value 周 星期显示:周一、周二等(默认)
+	 *  @value 星期 星期显示:星期一、星期二等
+	 * @property {Boolean} weekend = [true|false] 周末标红(周六周日日期用红色字体),默认true
+	 * @property {Boolean} showShrink = [true|false] 是否显示收缩按钮,可显示一周的日期,默认false
+	 * @property {String} shrinkState = [week|month] 收缩状态,默认month
+	 *  @value week 默认打开显示周数据(收起状态)
+	 *  @value month 默认打开显示月数据(展开状态)
+	 * @property {Array} signList 标记数组,若当前有多个标记,则显示最后一个,期待格式[{date: '2021-09-10', title: '生日', info: '八月初四张三生日'}]
+	 * @event {Function()} dayChange 点击日期触发事件,返回参数e={year,month,day,week,date,lunar,daySign},详情参数见文档
+	 * @event {Function()} monthChange 切换月份触发事件,返回参数e={year,month,type},详情参数见文档
+	 * @event {Function()} shrinkClick 收缩和展开时触发事件,返回参数e=week|month
+	 */
+	export default {
+		name: 'LuncCalendar',
+		props: {
+			//是否显示农历
+			showLunar: {
+				type: Boolean,
+				default: false
+			},
+			//是否显示月份背景
+			showMonthBg: {
+				type: Boolean,
+				default: true
+			},
+			//是否显示上月下月按钮
+			showChangeBtn: {
+				type: Boolean,
+				default: true
+			},
+			//每周的周几为第一天
+			firstDayOfWeek: {
+				type: String,
+				default: 'monday'
+			},
+			//每周的周几为第一天
+			weekType: {
+				type: String,
+				default: '周'
+			},
+			//周末标红
+			weekend: {
+				type: Boolean,
+				default: true
+			},
+			//是否可收缩,收起来后以周显示
+			showShrink: {
+				type: Boolean,
+				default: false
+			},
+			// 默认打开状态(收起或展开)
+			shrinkState:{
+				type: String,
+				default: 'month'
+			},
+			//标记
+			signList: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// 周几不可约
+			configWeek:{
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// 节假日预约
+			configHoliday:{
+				type: String,
+				default () {
+					return 'Y'
+				}
+			},
+		},
+		data() {
+			return {
+				upimg:require("@/static/images/order/comes/up.png"),
+				weekArr: ['一', '二', '三', '四', '五', '六', '日'], //星期数组
+				today: {}, //今天日期 -> year, month, day
+				selDate: {}, //选中日期信息 -> year, month, day
+
+				allMonthList: [], // 月份数据 -> [[[周],[周]],[月],[月]]
+				tranIndex: 1, // 月份轮播所在位置
+				allWeekList: [], // 周月份数据 -> [[[周]],[月],[月]]
+				tranCurrent: 1, // 周轮播所在位置
+				tranDuration: 300, //轮播时间(单位毫秒)
+
+				signArr: this.signList, // 标记列表
+				showToday: false, //显示回到今天(非当月才显示)
+				isshowPrev:false,//切换当月的上一个月
+				shrinkType: false, // 收缩状态,true:收起(显示周),false展开(显示月)
+				deterChange: true, // 防止切换月份过快
+			}
+		},
+		created() {
+			let nd = new Date();
+			this.today = {
+				year: nd.getFullYear(),
+				month: nd.getMonth() + 1,
+				day: nd.getDate()
+			}
+			if (this.firstDayOfWeek == "sunday") this.weekArr = ['日', '一', '二', '三', '四', '五', '六'];
+			this.initDate();
+		},
+		watch: {
+			signList(nList, oList){
+				this.signArr = nList;
+				this.setSignList();
+			}
+		},
+		computed: {
+			getAllData() { // 切换周或月时,展示的数据不同
+				return this.shrinkType ? this.allWeekList : this.allMonthList;
+			},
+			getMontBg() { // 获取当前月背景
+				let monthBg = this.selDate.month;
+				return !this.shrinkType ? (monthBg < 10 ? '0' + monthBg : monthBg) : '';
+			},
+			getIsSelDay(c) { // 判断是否是选中日期
+				return (d) => {
+					let { year, month, day } = this.selDate;
+					if(year == d.year && month == d.month && day == d.day){
+						this.$emit('getIsSelDayFn',d)
+					}
+					return year == d.year && month == d.month && day == d.day
+				}
+			},
+			getWeekType(){
+				let weekType = this.weekType;
+				if(weekType && weekType != "true" && weekType != "''" && weekType != '""'){
+					return weekType
+				}else{
+					return ''
+				}
+			}
+		},
+		methods: {
+			initDate() { // 初始化日期
+				this.selDate = JSON.parse(JSON.stringify(this.today));
+				let monthList = this.getMonthData(this.selDate); // 获取当月数据
+				let prevMonthList = this.getMonthData(this.getMonthDate(this.selDate, -1)); // 上月数据
+				let nextMonthList = this.getMonthData(this.getMonthDate(this.selDate)); // 下月数据
+				this.allMonthList = [prevMonthList, monthList, nextMonthList]
+				this.tranIndex = 1;
+				if(this.shrinkState == "week" && !this.shrinkType) this.changeShrink();
+			},
+			/**
+			 * 根据指定日期获取当月的数据
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 */
+			getMonthData(date) {
+				const { year, month, day } = date; //指定的日期
+				let maxDay = new Date(year, month, 0).getDate(); //当前月最大日期
+				let firstWeek = new Date(year + "/" + month + "/1").getDay(); //月份1号的星期数
+				if (this.firstDayOfWeek == "monday") firstWeek = firstWeek - 1 < 0 ? 6 : firstWeek - 1;
+				let list = [];
+				//每月显示42天,6周,每周7天
+				for (var i = 0; i < 42; i++) {
+					let dayInfo = {}; // 每天的详细信息
+					if (i < firstWeek) { //指定月份上月的最后几天
+						let { year, month } = this.getMonthDate(date, -1);
+						let preMaxDay = new Date(year, month, 0).getDate(); //上月最大日期
+						let day = preMaxDay - firstWeek + i + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'prev');
+					} else if (i > maxDay + firstWeek - 1) { //指定月份下月的前几天
+						let { year, month } = this.getMonthDate(date);
+						let day = i - maxDay - firstWeek + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'next');
+					} else {
+						let day = i - firstWeek + 1;
+						dayInfo = this.getDayInfo({ year, month, day }, 'normal');
+					}
+					if (i % 7 == 0) list.push(new Array());
+					list[list.length - 1].push(dayInfo);
+				}
+				return list;
+			},
+			/**
+			 * 获取指定日期的详细信息,包括农历节假日等
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 * @param {String} dayType = [prev|next|normal] 日期类型,上月|下月|当前月
+			 */
+			getDayInfo(date, dayType) {
+				const { year, month, day } = date;
+				let isToday = false; //是否今天
+				if (year == this.today.year && month == this.today.month && day == this.today.day) isToday = true;
+				let week = new Date(year + "/" + month + "/" + day).getDay(); //星期数
+				let lunar = calendar.solar2lunar(year, month, day); //农历
+				let dayLunar = lunar.IDayCn == '初一' ? lunar.IMonthCn + lunar.IDayCn : lunar.IDayCn;
+				if (lunar.festival) dayLunar = lunar.festival; // 阳历节日
+				else if (lunar.lunarFestival) dayLunar = lunar.lunarFestival; // 农历节日
+				else if (lunar.Term) dayLunar = lunar.Term; // 节气
+				let holidayArr = ["元旦", "春节", "清明节", "劳动节", "端午节", "中秋节", "国庆节"];
+				let isHoliday = false;
+				if (holidayArr.indexOf(dayLunar) != -1) isHoliday = true;
+				let dayInfo = {
+					date: year + "-" + month + "-" + day,
+					year, month, day, week,
+					lunar, // 农历
+					dayLunar, // 显示的农历
+					isToday, // 是否是今日
+					isHoliday, // 是否是节假日
+					dayType, // 日期类型,上月、下月或当前月
+					sign: this.getSignByDate(date)
+				}
+				let dayClass = this.getDayClass(dayInfo);
+				dayInfo["dayClass"] = dayClass;
+				return dayInfo;
+			},
+			/**
+			 * 根据日期详细信息添加对应的class
+			 * @param {Object} dayInfo 日期详情
+			 */
+			getDayClass(dayInfo) {
+				let dClass = "";
+				if (dayInfo.isToday) dClass += ' is-today'; // 今天日期
+				if (dayInfo.isHoliday) dClass += ' is-holiday'; // 法定假日
+				if (this.weekend && (dayInfo.week == 0 || dayInfo.week == 6)) dClass += ' week-end'; // 周末标红
+				return dClass;
+			},
+			/**
+			 * 根据日期获取日期对应的事件
+			 * @param {Object} date = { year, month, day } 指定的日期
+			 */
+			getSignByDate(date) {
+				const { year, month, day } = date;
+				let dayDateS = new Date(year + "/" + month + "/" + day + " 00:00:00").getTime();
+				let dayDateE = new Date(year + "/" + month + "/" + day + " 23:59:59").getTime();
+				let daySign = [];
+				this.signArr.map(sign => {
+					let signDate = sign.date.replace(/-/g, '/');
+					let signTimes = new Date(sign.date).getTime();
+					if (signTimes >= dayDateS && signTimes <= dayDateE) daySign.push(sign)
+				})
+				return daySign;
+			},
+
+			/**
+			 * 获取月份数据
+			 * @param {String} type=[pre|next]
+			 */
+			getOtherData(type) {
+				let nowMont = this.getMonthDate(this.selDate, type == 'prev' ? -1 : 1); // 获取当前月份
+				this.selDate = nowMont; // 切换月份后设置选中的日期
+				let monthData = this.getMonthData(this.getMonthDate(nowMont, type == 'prev' ? -1 : 1));
+				// 获取上月或下月轮播所在位置
+				let current = this.getTranIndex().prevNum;
+				if (type == "next") current = this.getTranIndex().nextNum;
+				this.allMonthList.splice(current, 1, monthData);
+				this.judgeShowToday();
+				this.returnMonthChange(type);
+			},
+			/**
+			 * 获取周数据
+			 * @param {String} type=[pre|next]
+			 */
+			getOtherWeekData(type) {
+				let oldSel = this.selDate; // 原选中的日期
+				let newSel = this.getDateByDateAndDay(oldSel, type == 'prev' ? -7 : 7); // 获取7天前或后的日期
+				if (oldSel.month != newSel.month) { // 跨月,先设置跨月后的月历
+					// 设置月轮播位置
+					let current = this.getTranIndex("month").prevNum;
+					if (type == "next") current = this.getTranIndex("month").nextNum;
+					this.tranIndex = current;
+					this.getOtherData(type);
+				}
+				this.selDate = newSel;
+				this.getWeekData(type);
+				this.judgeShowToday();
+			},
+
+			// 从月历中获取周数据,切换周后获取上周或下周数据
+			getWeekData(type) {
+				const { prevNum: prevIndex, nowNum: nowIndex, nextNum: nextIndex } = this.getTranIndex("month");
+				const { prevNum: prevCurrent, nowNum: nowCurrent, nextNum: nextCurrent } = this.getTranIndex("week");
+				const { year: selYear, month: selMonth, day: selDay } = this.selDate;
+				let sDate = selYear + "-" + selMonth + "-" + selDay
+				let prevMonthList = this.allMonthList[prevIndex];
+				let nowMonthList = this.allMonthList[nowIndex];
+				let nextMonthList = this.allMonthList[nextIndex];
+				for (let i = 0; i < nowMonthList.length; i++) {
+					for (let j = 0; j < nowMonthList[i].length; j++) {
+						if (sDate == nowMonthList[i][j].date) {
+							this.returnDayChange(nowMonthList[i][j]); // 返回选中的日期
+							if (type == "next") {
+								this.allWeekList.splice(nextCurrent, 1, [nowMonthList[i + 1]]);
+								if (i == 5) this.allWeekList.splice(nextCurrent, 1, [nextMonthList[1]]);
+							} else {
+								this.allWeekList.splice(prevCurrent, 1, [nowMonthList[i - 1]]);
+								if (i == 0) {
+									for (let k = prevMonthList.length - 1; k >= 0; k--) {
+										if (prevMonthList[k][6].dayType == "normal") {
+											this.allWeekList.splice(prevCurrent, 1, [prevMonthList[k]]);
+											break;
+										}
+									}
+								}
+							}
+							break;
+						}
+					}
+				}
+			},
+			// 根据月份数据获取周数据,相当初始化周数据
+			getAllWeekData() {
+				const { prevNum, nowNum, nextNum } = this.getTranIndex("month");
+				const { year: selYear, month: selMonth, day: selDay } = this.selDate;
+				let sDate = selYear + "-" + selMonth + "-" + selDay; // 选中的日期
+				let allWeekList = [[],[],[]];
+				let prevMonthList = this.allMonthList[prevNum];
+				let nowMonthList = this.allMonthList[nowNum];
+				let nextMonthList = this.allMonthList[nextNum];
+				for (let i = 0; i < nowMonthList.length; i++) {
+					for (let j = 0; j < nowMonthList[i].length; j++) {
+						if (sDate == nowMonthList[i][j].date) {
+							allWeekList[0][0] = nowMonthList[i - 1];
+							allWeekList[1][0] = nowMonthList[i];
+							allWeekList[2][0] = nowMonthList[i + 1];
+							if (i == 5) {
+								allWeekList[2][0] = nextMonthList[1];
+							} else if (i == 0) {
+								for (let k = prevMonthList.length - 1; k >= 0; k--) {
+									if (prevMonthList[k][6].dayType == "normal") {
+										allWeekList[0][0] = prevMonthList[k];
+										break;
+									}
+								}
+							}
+							break;
+						}
+					}
+				}
+				this.allWeekList = allWeekList;
+			},
+			// 滑动切换结束
+			swiperEndChange() {
+				this.tranDuration = 300;
+			},
+			// 滑动切换月份或周
+			swiperChange(e) {
+				let current = e.detail.current;
+				let oldIndex = this.shrinkType ? this.tranCurrent : this.tranIndex;
+				let type = (oldIndex - current == -1 || oldIndex - current == 2) ? 'next' : 'prev';
+				if (this.shrinkType) {
+					this.tranCurrent = current;
+					if (current != oldIndex) this.getOtherWeekData(type);
+				} else {
+					this.tranIndex = current;
+					if (current != oldIndex) this.getOtherData(type);
+				}
+			},
+			// 点击切换月份或周(上月下月切换或上周下周切换)type = [prev|next] 切换类型
+			changeMonthOrWeek(type) {
+				if (!this.deterChange) return;
+				this.deterChange = false;
+				setTimeout(_ => {
+					this.deterChange = true;
+				}, 400); // 防止点击过快
+				this.tranDuration = 300;
+				let tranType = this.shrinkType ? 'week' : 'month';
+				let current = this.getTranIndex(tranType).prevNum;
+				if (type == "next") current = this.getTranIndex(tranType).nextNum;
+				if (tranType == "week") {
+					this.tranCurrent = current; 
+					this.getOtherWeekData(type);
+				} else {
+					this.tranIndex = current;
+					this.getOtherData(type);
+				}
+			},
+			// 点击收缩按钮,切换显示月份或显示周
+			changeShrink() {
+				this.shrinkType = !this.shrinkType;
+				if (this.tranDuration != 0) this.tranDuration = 0;
+				if (this.shrinkType) {
+					this.tranCurrent = 1;
+					this.getAllWeekData();
+				}
+				this.returnShrinkChange();
+				this.judgeShowToday();
+			},
+			// 点击回到今天
+			goToday() {
+				if (this.tranDuration != 0) this.tranDuration = 0;
+				let oldDate = JSON.parse(JSON.stringify(this.selDate));
+				this.initDate();
+				if (this.shrinkType) {
+					this.tranCurrent = 1;
+					this.getAllWeekData();
+					let today = this.today;
+					// 判断是否需要触发改变月份事件
+					if(oldDate.year != today.year || oldDate.month != today.month){
+						this.returnMonthChange("today");
+					}else{
+						this.returnDayChange(this.today);
+					}
+				} else {
+					this.returnMonthChange("today"); // 事件
+				}
+				this.judgeShowToday();
+			},
+			// 点击日期
+			clickDay(dayInfo) {
+				var isweek=this.configWeek.indexOf(dayInfo.week)
+				if(dayInfo.sign && dayInfo.sign.length > 0&&dayInfo.sign[0].title!='可预约'||dayInfo.sign.length==0||isweek!=-1||dayInfo.isHoliday&&this.configHoliday=='N'){
+					return
+				}
+				
+				let { year, month, day } = this.selDate;
+				if (day == dayInfo.day && month == dayInfo.month && year == dayInfo.year) return;
+				let oldSel = JSON.parse(JSON.stringify(this.selDate));
+				this.selDate.day = dayInfo.day;
+				if (oldSel.month != dayInfo.month) {
+					if (!this.shrinkType) {
+						this.changeMonthOrWeek(dayInfo.dayType);
+						return;
+					} else {
+						this.selDate.year = dayInfo.year;
+						this.selDate.month = dayInfo.month;
+						let nowSel = JSON.parse(JSON.stringify(this.selDate));
+						let type = "nowNum"
+						if (nowSel.year > oldSel.year || (nowSel.year === oldSel.year && nowSel.month > oldSel.month)){
+							type = "nextNum"
+						} else if (nowSel.year < oldSel.year || (nowSel.year === oldSel.year && nowSel.month < oldSel.month)){
+							type = "prevNum"
+						}
+						this.tranIndex = this.getTranIndex("month")[type];
+						let monthData = this.getMonthData(this.getMonthDate(this.selDate, type == 'prevNum' ? -1 : 1));
+						let current = this.getTranIndex("month")[type];
+						this.allMonthList.splice(current, 1, monthData); // 设置上月或下月数据
+					}
+					this.returnMonthChange(dayInfo.dayType);
+				} else {
+					this.returnDayChange(dayInfo);
+				}
+			},
+			// 判断是否需要显示回到今天(非本月或本周时显示)
+			judgeShowToday() {
+				const { year, month, day } = this.today;
+				const { year: selYeat, month: selMonth, day: selDay } = this.selDate;
+				if (this.shrinkType) { // 显示的周
+					let selTimes = new Date(selYeat, selMonth - 1, selDay).getTime(); // 选中日期的时间戳
+					let week = new Date(year, month - 1, day).getDay(); // 今天星期
+					let firstWD = this.getDateByDateAndDay(this.today, -week + (this.firstDayOfWeek == "monday" ? 1 : 0));
+					let lastWD = this.getDateByDateAndDay(this.today, 6 - week + (this.firstDayOfWeek == "monday" ? 1 : 0));
+					let firstTimes = new Date(firstWD.year, firstWD.month - 1, firstWD.day).getTime();
+					let lastTimes = new Date(lastWD.year, lastWD.month - 1, lastWD.day).getTime();
+					if (selTimes > lastTimes || selTimes < firstTimes) this.showToday = true;
+					else this.showToday = false;
+					if(selTimes > lastTimes) this.isshowPrev=true;
+					else this.isshowPrev=false;
+				} else {
+					if (year != selYeat || month != selMonth) this.showToday = true;
+					else this.showToday = false;
+					// 判断是并不是当前月上一个月
+					if(Number(selYeat)>Number(year)||Number(selMonth)>Number(month)) this.isshowPrev=true;
+					else this.isshowPrev=false;
+				}
+			},
+
+			// 重新设置标记
+			setSignList() {
+				this.allMonthList.map(month => {
+					month.map(week => {
+						week.map(day => {
+							day.sign = this.getSignByDate({ year: day.year, month: day.month, day: day.day })
+						})
+					})
+				})
+			},
+			/**
+			 * 添加标记
+			 * @param {Array} list 需要添加的标记
+			 */
+			addSignList(list) {
+				let signArr = this.signArr.concat(list);
+				this.signArr = signArr;
+				this.setSignList();
+			},
+			/**
+			 * 删除标记
+			 * 根据date和title共同判断是否删除
+			 * @param {Array} list 需要删除的标记
+			 */
+			deleteSignList(list) {
+				let signArr = this.signArr;
+				signArr = signArr.filter(s => {
+					if (list.find(l => l.date == s.date && l.title == s.title)) return false
+					else return true;
+				})
+				this.signArr = signArr;
+				this.setSignList();
+			},
+			/**
+			 * 事件 - 设置返回日期
+			 * @param {Object} dayInfo 日期详情
+			 */
+			returnDayChange(dayInfo) {
+				let { year, month, day } = dayInfo;
+				let dayDate = year + "-" + (month < 10 ? '0' + month : month) + "-" + (day < 10 ? '0' + day : day)
+				let returnData = {
+					date: dayDate,
+					year: year,
+					month: month,
+					day: day,
+					week: dayInfo.week,
+					daySign: dayInfo.sign
+				}
+				if (this.showLunar) returnData["lunar"] = dayInfo.lunar;
+				this.$emit("dayChange", returnData);
+			},
+			/**
+			 * 事件 - 设置返回月份
+			 * @param {String} type 类型
+			 */
+			returnMonthChange(type) {
+				let selDate = this.selDate.year + "-" + this.selDate.month + "-" + this.selDate.day;
+				let monthList = this.allMonthList.flat().flat(); // 二维转一维
+				let dayInfo = monthList.find(day => day.date == selDate);
+				this.returnDayChange(dayInfo)
+				this.$emit("monthChange", {
+					year: dayInfo.year,
+					month: dayInfo.month,
+					type: type
+				});
+			},
+			/**
+			 * 事件 - 返回收缩状态
+			 */
+			returnShrinkChange() {
+				let type = this.shrinkType ? 'week' : 'month'
+				this.$emit("shrinkClick", type);
+			},
+			/**
+			 * 获取上一个或下一个轮播位置
+			 * @param {String} type = [month|week] 轮播类型,月轮播(tranIndex),周轮播(tranCurrent)
+			 * @returns {Object} {prevNum, nowNum, nextNum}
+			 */
+			getTranIndex(type = 'month') {
+				let current = this.tranIndex;
+				if (type == "week") current = this.tranCurrent;
+				let prevNum = current - 1 < 0 ? 2 : current - 1;
+				let nowNum = current;
+				let nextNum = current + 1 > 2 ? 0 : current + 1;
+				return { prevNum, nowNum, nextNum }
+			},
+			/**
+			 * 根据日期获取几天后的日期
+			 * @param {Object} date = {year, month, day} 当前日期
+			 * @param {Number} day 当前日期的几天前或几天后(负数)
+			 * @returns {Object} {year, month, day}
+			 */
+			getDateByDateAndDay(date, num) {
+				let dTime = new Date(date.year + "/" + date.month + "/" + date.day).getTime() + num * 24 * 60 * 60 * 1000;
+				let nd = new Date(dTime);
+				return {
+					year: nd.getFullYear(),
+					month: nd.getMonth() + 1,
+					day: nd.getDate()
+				}
+			},
+			/**
+			 * 获取几个月前或后的日期
+			 * @param {Object} date = {year, month, day} 当前日期
+			 * @param {Number} num 当前日期的num月前或后,默认1月后(下月)
+			 * @returns {Object} {year, month, day}
+			 */
+			getMonthDate(date, num = 1) {
+				let nextMonth = date.month + num;
+				let diffYear = parseInt(Math.abs(nextMonth) / 12);
+				let year = date.year;
+				let month = nextMonth;
+				if (nextMonth > 12) {
+					year = date.year + diffYear;
+					month = nextMonth % 12;
+				} else if (nextMonth < 1) {
+					year = date.year - (diffYear + 1);
+					month = nextMonth + 12 * (diffYear + 1);
+				}
+				let monthMaxDay = new Date(year, month, 0).getDate(); // 月份最大日期
+				let day = date.day > monthMaxDay ? monthMaxDay : date.day;
+				return { year, month, day }
+			},
+		}
+	}
+</script>
+<style lang="scss">
+	.lunc-calendar {
+		background-color: #FFF;
+
+		// 头部
+		.header {
+			display: flex;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+			position: relative;
+			height: 88rpx;
+			line-height: 88rpx;
+			border-bottom: 2rpx solid $com-cd3;
+
+			.head-month {
+				font-size: 30rpx;
+				padding: 0 40rpx;
+				font-weight: bold;
+			}
+			.day_tit{
+				position: absolute;
+				left: 0rpx;
+				top: 26rpx;
+				font-size: 30rpx;
+				line-height: 36rpx;
+				color:  #161616;
+				text-align: center;
+				font-weight: bold;
+			}
+			.go-to-today {
+				position: absolute;
+				right: 16rpx;
+				top: 26rpx;
+				font-size: 24rpx;
+				line-height: 36rpx;
+				color: $com-cd3;
+				text-align: center;
+				width: 80rpx;
+				height: 36rpx;
+				border: 2rpx solid $com-cd3;
+				border-radius: 18rpx;
+				box-sizing: border-box;
+			}
+
+			.head-icon {
+				content: '';
+				display: flex;
+				width: 22rpx;
+				height: 22rpx;
+				border-top: 2rpx solid $com-cd3;
+				border-left: 2rpx solid $com-cd3;
+			}
+
+			.head-icon.head-pre-month {
+				transform: rotate(-45deg);
+			}
+
+			.head-icon.head-next-month {
+				transform: rotate(135deg);
+			}
+			.head-icon.nocheck {
+				border-top: 2rpx solid #aaaaaa;
+				border-left: 2rpx solid #aaaaaa;
+			}
+		}
+
+		// 星期
+		.week-area {
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			// border-bottom: 1px solid #EEE;
+			padding: 16rpx 0;
+			// margin: 0 10rpx;
+
+			.week-font {
+				flex: 1;
+				text-align: center;
+				color: #161616;
+				font-size: 30rpx;
+				font-weight: bold;
+			}
+			&.week-tit{
+				.week-font:first-child{color: #aaaaaa;}
+				.week-font:last-child{color: #aaaaaa;}
+			}
+		}
+
+		// 日历
+		.calendar-data {
+			// transition: all 300ms;
+
+			.swiper-item {
+				position: relative;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				flex-direction: row;
+
+				.month-bg {
+					position: absolute;
+					font-size: 460rpx;
+					color: #EEE;
+					font-weight: bold;
+					opacity: 0.4;
+					z-index: -1;
+				}
+
+				.month-days {
+					flex: 1;
+					// margin-top: 10rpx;
+					position: relative;
+
+					.week-days {
+						display: flex;
+						flex-direction: row;
+
+						.day {
+							flex: 1;
+							width: 14.28%;
+							text-align: center;
+							// height: 84rpx;
+							height: 88rpx;
+							color: #000;
+							/* #ifndef APP-NVUE */
+							padding: 0 6rpx;
+							/* #endif */
+							// box-sizing: border-box;
+							display: flex;
+
+							.day-info {
+								flex: 1;
+								display: flex;
+								flex-direction: column;
+								justify-content: flex-start;
+								align-items: center;
+								position: relative;
+								
+								.day-solar {
+									display: flex;
+									font-size: 34rpx;
+									line-height: 34rpx;
+									margin-top: 2rpx;
+									width: calc(100% - 4rpx);
+									height: 50rpx;
+									padding-top: 10rpx;
+									border-radius: 16rpx 16rpx 0 0;
+									color: #D32C26;
+									box-sizing: border-box;
+									background:#ffffff;display: block;
+								}
+
+								.day-lunar,
+								.day-sign {
+									color: #161616;
+									font-size: 24rpx;
+									line-height: 24rpx;
+									transform: scale(0.8);
+									white-space: nowrap;
+									margin-top: 6rpx;
+								}
+
+								.day-sign {
+									color: #161616 !important;
+								}
+
+								.day-tag {
+									content: "";
+									position: absolute;
+									top: 8rpx;
+									right: 8rpx;
+									width: 10rpx;
+									height: 10rpx;
+									border-radius: 6rpx;
+									background-color: #F75858;
+								}
+							}
+							// 非当月日期
+							.day-info.un-month {
+								opacity: 0.25;
+								transition: opacity 300ms;
+							}
+
+							// 今天日期
+							.is-today .day-solar,
+							.is-today .day-sign,
+							.is-today .day-lunar {
+								color: $com-cd3;
+							}
+
+							// 周末
+							.week-end .day-solar {
+								// color: #FF9595;
+							}
+
+							// 法定假日
+							.is-holiday .day-solar,
+							.is-holiday .day-sign,
+							.is-holiday .day-lunar {
+								color: #161616 !important;
+							}
+							//不能预约的日期
+							.day-infoa,{
+								.day-solar{color: #AAAAAA !important;}
+								.day-sign{color: #AAAAAA !important;}
+								.day-lunar{color: #AAAAAA !important;}
+							}
+							// .is-holiday{
+							// 	.day-solar{color: #AAAAAA !important;}
+							// 	.day-sign{color: #AAAAAA !important;}
+							// }
+							// 当前选中的日期
+							.is-sel {
+								background-color: $com-cd3;
+								border-radius: 16rpx;
+								.day-solar{color: $com-cd3 !important;}
+								.day-sign{color: #ffffff !important;}
+							}
+						}
+					}
+
+					// .week-days.week-hide {
+					// 	display: none;
+					// }
+				}
+
+				.item-week {
+					.un-month {
+						opacity: 1 !important;
+					}
+				}
+			}
+		}
+
+		// 收缩按钮
+		.shrink {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 60rpx;
+			// border-top: 1px solid #DDD;
+			.shrink-img{width: 32rpx;height: 18rpx;}
+			/* #ifndef APP-NVUE */
+			.shrink-btn {
+				width: 32rpx;
+				height: 32rpx;
+				background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAMhJREFUOE/dky8LAkEQxd9w0WjV72KxWXfggmAyWWzXxHbNYjIJhoOZarvid9FqNB4jCyes3h9OLghu3fceb36zS+h5qKcf/xYgIisAayJKnHMa8lFVZ2YpgB0z7193FQYisgCwAXA3s8QLicgbhwC2zHwMgxshBkFeXzE2Nvh2rW8NsiybRFE0ZuZTXZCIzIuiuMZxfKltICJTAAciegDwIM9eqKozAKmZDQAsmTlvHSGY/1YKR00cWl9iGYRP8p220BXm7//CE8WyQBHBXZb9AAAAAElFTkSuQmCC);
+			}
+			.shrink-close {
+				transform: rotate(180deg);
+			}
+			/* #endif */
+			/* #ifdef APP-NVUE */
+			.shrink-btn{
+				content: '';
+				display: flex;
+				width: 18rpx;
+				height: 18rpx;
+				border-top: 2rpx solid #606266;
+				border-left: 2rpx solid #606266;
+				transform: rotate(-135deg);
+			}
+
+			.shrink-close {
+				transform: rotate(45deg);
+			}
+			/* #endif */
+		}
+	}
+</style>

+ 126 - 0
components/lunc-calendar/readme.md

@@ -0,0 +1,126 @@
+## 日历组件
+### 简单介绍
+- 组件需要依赖 sass 插件 ,请自行安装;
+- 本组件依赖 uni-app内置组件`swiper`组件,请与`swiper`组件配合使用;
+- nvue页面中的`swiper`组件部分功能不支持,详情见[uni-app内置组件:swiper](https://uniapp.dcloud.net.cn/component/swiper.html)
+- 通过uni_modules引用组件,在页面template中即可直接使用,无需在页面中import和注册components;
+- 可设置显示收缩按钮,收缩后只显示一个星期的日期,展开后显示一个月的日期;可以通过触摸屏幕左右滑动切换月份或切换周;
+- 可根据需要选择是否显示农历日期,且会显示节日,如春节、端午、国庆、腊八节等;
+- 本组件农历转换使用的js是 [@1900-2100区间内的公历、农历互转](https://github.com/jjonline/calendar.js)
+- 欢迎大家下载使用,项目源码示例:[https://gitee.com/lunc9932/calendar](https://gitee.com/lunc9932/calendar)
+- 若有插件导入失败,重启编辑器;
+
+### API
+#### 属性说明
+| 属性名           | 类型     | 默认值   | 说明              |
+|-----------------|----------|----------|-----------------------|
+| showLunar       | Boolean  | false    | 是否显示农历             |
+| firstDayOfWeek  | String   | monday   | 周几为每周的第一天,可选值:monday / sunday<br>monday:每周从周一开始;sunday:每周从周日开始           |
+| showMonthBg     | Boolean  | true     | 是否显示月份背景               |
+| weekend         | Boolean  | true     | 周末标红(周六周日日期用红色字体)  |
+| shouChangeBtn   | Boolean  | true     | 是否显示上月下月箭头按钮      |
+| weekType        | Boolean  | 周       | 星期的前缀,如星期一星期二,或周一周二,也可以只显示一、二等      |
+| showShrink      | Boolean  | false    | 是否显示收缩按钮      |
+| shrinkState     | String   | month    | 默认显示周数据还是月数据(收起或展开),可选值:week / month<br>week:默认打开显示周数据(收起状态);month:默认打开显示月数据(展开状态)      |
+| signList        | Array    | []       | 标记数组,若同日期有多个标记,则显示最后一个<br>期待格式[{date: '2021-09-10', title: '生日', info: '八月初四张三生日'}]  |
+
+注意:
+1. 标记日期会在日期下方显示“title”内容,建议“title”内容不超过4个汉字;
+2. 农历日期、节日、标记日期,只会显示其一,优先级 标记 > 节日 > 农历日期;
+3. `showShrink`表示是否显示收缩按钮,并不是表示收起或展开状态;
+
+#### 方法说明
+| 方法名          | 说明        | 参数 |
+|-----------------|------------|--------|
+| addSignList     | 添加标记    | (Array:list),传入需要添加的标记数组,日期相同不会覆盖,只显示第一个出现的标记         |
+| deleteSignList  | 删除标记    | (Array:list),传入需要删除的标记数组,根据 date 和 title 同时判断进行删除         |
+
+方法使用:在组件上添加 `ref` 属性,在调用对应的方法:`this.$refs.calendar.addSignList([])` 即可,详情见下方的基本用法;<br>
+**原 setSignList() 方法已弃用;**
+
+
+#### 事件说明
+| 事件名        | 说明                | 返回值 |
+|---------------|--------------------|--------|
+| @dayChange    | 选中日期改变时触发,包括点击日期、切换月份和切换周都会改变选中日期 | dayInfo,详情见下方说明 |
+| @monthChange  | 切换月份时触发,包括点击切换月份按钮、选中日期时切换的月份等都会改变触发 | monthInfo,详情见下方说明 |
+| @shrinkClick   | 收缩和展开时触发事件 | 返回当前状态:week / month<br>week:当前显示的一个星期(收起);month:当前显示的一个月(展开) |
+
+#### @dayChange 返回值 dayInfo 说明
+| 值      | 类型    | 说明  |
+| ------- | ------ | ----- |
+| date    | String | 日期,格式“yyyy-MM-dd” |
+| year    | Number | 年    |
+| month   | Number | 月    |
+| day     | Number | 日    |
+| week    | Number | 星期几 |
+| daySign | Array  | 当前日期的标记,若没有则为空数组 |
+| lunar   | Object | 农历信息,包含农历日期、节日、生肖等;<br>只有属性 showLunar 设置为 true 时才会返回此值; |
+
+#### @monthChange 返回值 monthInfo 说明
+| 值    | 类型    | 说明  |
+| ----- | ------ | ----- |
+| year  | Number | 年    |
+| month | Number | 月    |
+| type  | String | 返回类型:today / pre / next<br>today:当前月份,pre:上个月,next:下个月 |
+
+
+### 基本用法
+在`template`中使用组件
+
+```
+<view class="content">
+  <view class="content-item">
+    <lunc-calendar ref="calendar" :showLunar="true" :showMonthBg="true" :showShrink="true" :signList="signList"
+      @dayChange="dayChange" weekType="星期" @monthChange="monthChange" @shrinkClick="shrinkClick">
+    <view class="operation">
+      <view class="button" @click="addSign">新增标记</view>
+      <view class="button" @click="updateSign">修改标记</view>
+    </view>
+  </view>
+  <view class="content-item">
+    <lunc-calendar :showShrink="true" shrinkState="week"></lunc-calendar>
+  </view>
+</view>
+```
+在`script`中使用
+
+```
+export default {
+  data() {
+    return {
+      signList: [{date: "2023-06-25",title: "生日",info: "张三生日"},
+        {date: "2023-06-19",title: "朋友聚会"}, 
+        {date: "2023-07-22",title: "纪念日"}, 
+        {date: "2023-04-11",title: "聚会"}, 
+        {date: "2023-07-23",title: "郊游"}, 
+        {date: "2023-08-19",title: "游玩"}],
+    }
+  },
+  methods: {
+    dayChange(dayInfo) { // 点击日期
+      console.log("点击日期", JSON.parse(JSON.stringify(dayInfo)));
+    },
+    monthChange(monthInfo) { // 切换月份
+      console.log("切换月份", JSON.parse(JSON.stringify(monthInfo)));
+    },
+    shrinkClick(type) {
+      console.log("当前状态", type);
+    },
+
+    addSign() { // 添加标记
+      let addList = [{date: "2023-06-28",title: "休息"}, 
+        {date: "2023-06-01",title: "上班"}];
+      // 调用 addSignList 方法,传入需要添加的标记数组
+      this.$refs.calendar.addSignList(addList);
+    },
+    deleteSign() { // 删除标记
+      let deleteList = [{date: "2023-06-01",title: "上班"}];
+      // 调用 deleteSignList 方法,传入需要删除的标记数组
+      this.$refs.calendar.deleteSignList(deleteList);
+    }
+  }
+}
+```
+
+

+ 39 - 0
components/nodata/nodata.vue

@@ -0,0 +1,39 @@
+<template>
+	<view class="nodata" :style="'padding-top:'+padtop+'rpx'">
+		<image :src="noiconpimg"></image>
+		<view>{{notxt}}</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		props:{
+			notxt:{
+				type: String,
+				default () {
+					return '暂无数据'
+				}
+			},
+			padtop:{
+				type: Number,
+				default () {
+					return 200
+				}
+			}
+		},
+		data(){
+			return{
+				noiconpimg:require("@/static/images/noiconp.png"),
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+// 无数据
+.nodata{
+	display: flex;flex-direction: column;align-items: center;box-sizing: border-box;
+	image{width: 456rpx;height: 178rpx;margin-bottom: 28rpx;}
+	view{font-size: 30rpx;color: #AAAAAA;font-weight: bold;}
+}	
+</style>

+ 151 - 0
components/order/list.vue

@@ -0,0 +1,151 @@
+<template>
+  <view>
+	<view v-if="datalist.length>0">
+		<!-- 预约 -->
+		<block v-if="type==1">
+			<view class="ylist" v-for="(ite,idx) in datalist" :key='idx' @click="getDetail(ite.reservatId)">
+				<view class="ytop">
+					<image :src="topbg" class="ytbg"></image>
+					<view class="ytime flexc"><view class="flex0">预约时间:</view>
+						<view class="lh18">{{ite.visitDate}} {{typeFn(ite.visitTime)}}</view>
+						<view class="ytype" v-if="ite.reservatType==1">团体</view>
+						<view class="ytype" v-if="ite.reservatType==2">散客</view>
+					</view>
+					<view class="ytip">
+						<block v-if="ite.visitStatus==1&&ite.reservatType==2">
+							<image :src="dbg"></image>
+							<view >待参观</view>
+						</block>
+						<block v-if="ite.visitStatus==1&&ite.reservatType==1&&ite.visitType==3">
+							<image :src="dbg"></image>
+							<view>待参观</view>
+						</block>
+						<block v-if="ite.visitStatus==1&&ite.reservatType==1&&ite.visitType!=3">
+							<view class="tsbtn co1" v-if="ite.visitType==1">待审核</view>
+							<view class="tsbtn co3" v-if="ite.visitType==2">已拒绝</view>
+						</block>
+						<block v-if="ite.visitStatus==2">
+							<image :src="ybg"></image>
+							<view>已参观</view>
+						</block>
+					</view>
+				</view>
+				<view class="ybox">
+					<view class="yblist w50" v-if="ite.reservatType==1"><text>单位名称:</text>{{ite.visitUnitName||''}}</view>
+					<view class="yblist w50"><text>参观人数:</text>{{ite.visitNum||''}}人</view>
+					<view class="yblist w50"><text>联系人:</text>{{ite.visitName||''}}</view>
+					<view class="yblist w50"><text>联系电话:</text>{{ite.visitPhone||''}}</view>
+					<view class="yblist">
+						<view class="line"></view>
+					</view>
+					<view class="yblist w50"><text>是否接待:</text>{{ite.isReception=='Y'?'是':'否'||''}}</view>
+					<view class="yblist w50" v-if="ite.isReception=='Y'"><text>接待人:</text>{{ite.receptionName||''}}</view>
+					<view class="yblist w50" v-if="ite.isReception=='Y'"><text>接待电话:</text>{{ite.receptionPhone||''}}</view>
+				</view>
+			</view>
+		</block>
+		<view class="shax" v-if="wtdt">{{wtdt}}</view>
+	</view>
+	<block v-else>
+		<no-data></no-data>
+	</block>
+  </view>
+</template>
+
+<script>
+	import noData from "@/components/nodata/nodata.vue"
+  export default {
+	props:{
+		datalist: {
+			type: Array,
+			default () {
+				return []
+			}
+		},
+		wtdt:{
+			type: String,
+			default () {
+				return ''
+			}
+		},
+		type:{
+			type: [String,Number],
+			default () {
+				return ''
+			}
+		},
+	},
+	components:{
+		noData
+	},
+	data(){
+		return{
+			topbg:require("@/static/images/order/staffs/topbg.png"), 
+			dbg:require("@/static/images/order/staffs/dbg.png"), 
+			dsbg:require("@/static/images/order/staffs/dsbg.png"), 
+			ybg:require("@/static/images/order/staffs/ybg.png"), 
+		}
+	},
+	onLoad: function() {
+	},
+	methods:{
+		getDetail(e){
+			this.$emit('getDetail',e)
+		},
+		typeFn(data){
+			if(data){
+				var newArr=[]
+				var astr=data.split('-')
+				astr.forEach(ite=>{
+					var a=ite.substring(0,5);
+					newArr.push(a)
+				})
+				return newArr.join('-')
+			}else{
+				return ''
+			}
+			
+			
+		},
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+// 预约
+.ylist{background: #FFFFFF;box-shadow: 0px 2rpx 4rpx 0px rgba(205,205,205,0.8);border-radius: 14rpx;margin-bottom: 20rpx;
+	.ytop{position: relative;
+		.ytbg{width: 100%;height: 76rpx;}
+		.ytime{padding: 4rpx 100rpx 4rpx 36rpx;font-size: 28rpx;font-weight: bold;box-sizing: border-box;
+color: #161616;position: absolute;left: 0;right: 0;bottom: 0;top: 0;
+			.ytype{min-width: 56rpx;padding: 0 12rpx;flex:0 0 auto;
+height: 40rpx;color: #FE5A0E;font-size: 18rpx;text-align: center;box-sizing: border-box;line-height: 36rpx;
+background: #FFFFFF;
+border: 2rpx solid #FE5A0E;
+border-radius: 20rpx;margin-left: 16rpx;}
+}
+		.ytip{width: 88rpx;height: 66rpx;position: absolute;right: 0;top:0;
+			image{width: 100%;height: 100%;}
+			view{font-size: 24rpx;font-weight: 500;
+color: #FFFFFF;text-align: center;margin-top: 10rpx;position: absolute;left: 0;top: 0;bottom: 0;right: 0;}
+			.tsbtn{min-width: 90rpx;height: 36rpx;border-radius: 4rpx;box-sizing: border-box;font-size: 24rpx;line-height: 36rpx;margin-top: 20rpx;
+				&.co1{background: #FFEDDF;color: #E19301;}
+				&.co2{background: #D3F7E5;color: #24D725;}
+				&.co3{background: #FDE2E3;color: #EC1134;}
+			}
+		}
+	}
+	.ybox{
+		padding: 22rpx 32rpx;display: flex;flex-wrap: wrap;
+		.yblist{display: flex;font-size: 30rpx;font-weight: 400;color: #161616;width: 100%;line-height: 40rpx;padding: 4rpx 0;
+		text{font-weight: normal;color: #aaa;flex: 0 0 auto;}
+		}
+		.line{width: 56rpx;
+height: 2rpx;
+background: #CDCDCD;margin: 32rpx auto 24rpx;}
+	}
+
+}
+
+</style>

+ 72 - 0
components/order/popup.vue

@@ -0,0 +1,72 @@
+<template>
+	<view>
+		<!-- 弹窗 -->
+		<view class="bgbox" @click="getClose" v-if="type"></view>
+
+		<!-- 提示 -->
+		<view class="tips" v-if="type==1">
+			<image :src="bgimg" class="bgimg"></image>
+			<view class="tipa">
+				<view class="tit mb12">温馨提示</view>
+				<view class="txt">您当前已有<text>1</text>条预约申请</view>
+				<view class="txt">可前往查看详情</view>
+				<view class="flexcj mt16">
+					<view class="tbtn btn1" @click="getClose">查看详情</view>
+					<view class="tbtn btn2" @click="getClose">我知道了</view>	
+				</view>
+			</view>
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		props:{
+			type: {
+				type: Number,
+				default () {
+					return 0
+				}
+			},
+		},
+		watch:{
+		},
+		data(){
+			return{
+				// type:0,
+				bgimg:require("@/static/images/order/comes/ytbg.png"),
+				
+			}
+		},
+		mounted() {
+		},
+		methods:{
+			getClose(){
+				this.$emit("getClose")
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	// 公共
+		
+// end
+.tips{
+	position: fixed;left: 100rpx;right: 100rpx;height: 494rpx;top: 50%;margin-top: -280rpx;border-radius: 14rpx;z-index: 10;background: #FEFEFE;
+	padding-bottom: 36rpx;box-sizing: border-box;
+	.bgimg{width: 100%;height: 204rpx;}
+	
+	.tipa{padding:4rpx 40rpx 0;
+		.tit{font-size: 30rpx;font-weight: bold;color: #000000;text-align: center;}
+		.txt{font-size: 30rpx;font-weight: 500;color: #666666;text-align: center;
+			text{color: $com-cd3;padding: 0 4rpx;}
+		}
+		.tbtn{text-align: center;font-size: 30rpx;font-weight: 500;flex:0 0 auto;width: 214rpx;height: 70rpx;border-radius: 35rpx;line-height: 70rpx;
+			&.btn1{color: #666666;;border: 2rpx solid #E6E6E6;}
+			&.btn2{color: $com-cd3;border: 1px solid $com-cd3;}
+		}
+	}	
+}
+</style>

+ 76 - 0
components/order/stepbar.vue

@@ -0,0 +1,76 @@
+<template>
+  <view class="stepbar" :class="fixeda?'sfixed':''">
+	  <block v-for="(ite,idx) in steps" :key="idx">
+		  <view class="steps" :class="ite.status>0?'act':''" v-if="reservatType!=2&&ite.val==2||ite.val!=2">
+		  	<image :src="filln" class="img" v-if="ite.status==0"></image>
+		  	<image :src="fillin" class="img" v-if="ite.status==1"></image>
+		  	<image :src="fillf" class="img" v-if="ite.status==2"></image>
+		  	<view class="tit">{{ite.tit}}</view>
+		  	<view class="line"></view>
+		  </view>
+	  </block>
+  </view>
+</template>
+
+<script>
+//fixeda   固定
+  export default {
+	props:{
+		steps: {
+			type: Array,
+			default () {
+				return []
+			}
+		},
+		fixeda:{
+			type: Boolean,
+			default () {
+				return false
+			}
+		},
+		reservatType:{
+			type: [Number,String],
+			default () {
+				return 1
+			}
+		}
+	},
+	components:{
+		
+	},
+	data(){
+		return{
+			fillin:require("@/static/images/order/comes/fillin.png"),//填写
+			fillf:require("@/static/images/order/comes/fillf.png"), //完成
+			filln:require("@/static/images/order/comes/filln.png"),//未填
+		}
+	},
+	onLoad: function() {
+	},
+	methods:{
+		getDetail(e){
+			this.$emit('getDetail')
+		} 
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.sfixed{position: fixed;left: 0;right: 0;top: 0;z-index: 10;}
+.stepbar{background: #ffffff;display: flex;align-items: center;padding: 30rpx 0rpx;flex: 0 0 auto;
+	.steps{display: flex;flex-direction: column;flex: 1;align-items: center;position: relative;
+		.img{width: 46rpx;height: 46rpx;margin-bottom: 14rpx;}
+		.tit{font-size: 24rpx;font-weight: bold;color: #CDCDCD;
+
+		}
+		.line{position: absolute;width: 60%;border-bottom: 2rpx dashed #CDCDCD;top: 22rpx;right: 0;transform: translateX(50%);}
+		&:last-of-type{.line{display: none;}}
+		&.act{
+			.line{border-color: $com-cd3;}
+			.tit{color: $com-cd3;}
+		}
+	}
+
+}
+</style>

+ 52 - 0
components/order/zan.vue

@@ -0,0 +1,52 @@
+<template>
+  <view>
+	
+  </view>
+</template>
+
+<script>
+  export default {
+	props:{
+		datalist: {
+			type: Array,
+			default () {
+				return []
+			}
+		},
+		wtdt:{
+			type: String,
+			default () {
+				return ''
+			}
+		},
+		type:{
+			type: [String,Number],
+			default () {
+				return ''
+			}
+		},
+	},
+	components:{
+		noData
+	},
+	data(){
+		return{
+			topbg:require("@/static/images/order/staffs/topbg.png"), 
+			dbg:require("@/static/images/order/staffs/dbg.png"), 
+			ybg:require("@/static/images/order/staffs/ybg.png"), 
+		}
+	},
+	onLoad: function() {
+	},
+	methods:{
+		getDetail(e){
+			this.$emit('getDetail')
+		} 
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 176 - 0
components/toptab/phonebtn.vue

@@ -0,0 +1,176 @@
+<template>
+  <view>
+	  <view class="box_hei" @click="getClose" v-if="type">
+	  	<view @click.stop="btns"  class="hei_box">
+	  		<view class="box_top">
+	  			<view class="box_title">
+	  				<view>
+	  					智能校管家 申请使用
+	  				</view>
+	  			</view>
+	  			<view class="box_nameq">你的手机号码</view>
+	  		</view>
+	  		<!-- <view class="boxs"></view> -->
+	  		<view class="box_btns">
+	  			<view @click="getClose" class="box_btn box_btn1">拒绝</view>
+	  			<button class="box_btn box_btn2" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">允许</button>
+	  		</view>
+	  	</view>
+	  </view>
+  </view>
+</template>
+
+<script>
+	// import tabSearch from "@/components/toptab/search.vue"
+	import {getweChatOpenid} from "@/api/login.js"
+  export default {
+	  props:{
+		type:{
+			type:Boolean,
+			default () {
+				return true
+			}
+		},
+	  },
+	data(){
+		return{
+			sucimg:require("@/static/images/mine/success.png") 
+		}
+	},
+	methods:{
+		getClose(){
+			this.$emit("getClose")
+		},
+		btns(){
+			
+		},
+		async getPhoneNumber(e){
+			const {iv,encryptedData} = e.detail;
+			var that=this;
+			uni.login({
+			    provider: 'weixin',
+			    success: (res) => {
+			        // 获取用户信息
+					if(res.code) {
+						var params={
+							iv: iv,
+							encryptedData: encryptedData,
+							code : res.code,
+						}
+						// 登录还是注册
+						that.$emit("getPhoneNumber",params)
+						
+					}
+			    }
+			})			
+		}, 
+	},
+	onLoad: function() {
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+.box_hei{
+		width: 100%;
+		height: 100%;
+		background: rgba(0,0,0,.8);
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 3;
+		.hei_box{
+			background: #fff;
+			border-radius:22upx 22upx 0 0;
+			height: 440upx;
+			padding: 52upx 28upx 104upx;
+			position: absolute;
+			bottom:0;
+			width: 100%;
+			box-sizing: border-box;
+			.box_top{
+				padding: 0 18upx 62upx;
+				.box_title{
+					display: flex;
+					justify-content: space-between;
+					font-size: 30upx;
+					margin-bottom: 30upx;
+					view{
+						display: flex;
+						align-items: center;
+						color: #333333;
+					}
+					.img{
+						margin-right: 14upx;
+						width: 180upx;
+						height: 48upx;
+					}
+					.imgs{
+						width: 40upx;
+						height: 40upx;
+					}
+				}
+				.box_nameq{
+					color: #333333;
+					font-size: 44upx;
+					font-weight: bold;
+				}
+			}
+			.box_phone{
+				height: 106upx;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				font-size: 28upx;
+				color: #A6A6A6;
+				border-bottom: 1upx solid #EBEBEB;
+				border-top: 1upx solid #EBEBEB;
+				view{
+					display: flex;
+					align-items: center;
+				}
+				.img{
+					width: 26upx;
+					height: 22upx;
+				}
+				span{
+					color: #333333;
+					font-size: 32upx;
+					padding-right: 18upx;
+					font-weight: bold;
+				}
+			}
+			.box_qita{
+				height: 106upx;
+				font-size: 28upx;
+				color: #7CA4FC;
+				line-height: 106upx;
+			}
+			.boxs{
+				height: 50upx;
+			}
+			.box_btns{
+				margin-top: 10upx;
+				display: flex;
+				justify-content: space-between;
+				.box_btn{
+					width: 324upx;
+					height: 82upx;
+					font-size: 32upx;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					border-radius: 4upx;
+				}
+				.box_btn1{
+					background: #F3F3F3;
+					color: #33B925;
+				}
+				.box_btn2{
+					background: #37962B;
+					color: #FFFFFF;
+				}
+			}
+		}
+	}
+</style>

+ 99 - 0
components/toptab/tab.vue

@@ -0,0 +1,99 @@
+<template>
+	<view class="listtopb flexc" >
+		<block v-for="(ite,idx) in tablist" :key='idx'>
+			<block v-if='ite.limt'>
+				<view class="tit" :style="'height:'+height+'rpx'" :class="tabidx==ite.val?'act':''" @click="getTab(ite.val)" v-if="checkPermi([ite.limt])">
+					<view class="f16 fw mb6 tits" >{{ite.tit}}</view>
+					<view class="f500 f14 txt" v-if="ite.txt||ite.txt==0">{{ite.txt}}</view>
+					<image :src="tapline" class="line"></image>
+				</view>
+			</block>
+			<block v-else>
+				<view class="tit" :style="'height:'+height+'rpx'" :class="tabidx==ite.val?'act':''" @click="getTab(ite.val)" >
+					<view class="f16 fw mb6 tits" >{{ite.tit}}</view>
+					<view class="f500 f14 txt" v-if="ite.txt||ite.txt==0">{{ite.txt}}</view>
+					<image :src="tapline" class="line"></image>
+				</view>
+				
+			</block>
+		</block>
+		<!-- 切换按钮 -->
+		<view :style="'height:'+height+'rpx'" class="chebox" @click="getroleFn" v-if="checkPermi(['register:teacher:list'])&&tabbtn">
+			<image :src="micone"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		props:{
+			tablist:{
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			height:{
+				type: Number,
+				default () {
+					return 100
+				}
+			},
+			tabbtn:{
+				type:Boolean,
+				default () {
+					return false
+				}
+			},
+			tabidx:{
+				type: Number,
+				default () {
+					return 0
+				}
+			}
+		},
+		data(){
+			return{
+				// :0,
+				tapline:require("@/static/images/hline.png"), 
+				micone:require("@/static/images/micone.png"),
+			}
+		},
+		mounted() {
+			// this.tabidxs=this.tabidx
+		},
+		methods:{
+			checkPermi, checkRole,
+			getTab(idx){
+				// this.tabidxs=idx;
+				this.$emit('getCheck',idx)
+			},
+			getroleFn(){
+				this.$emit('getroleFn')
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.listtopb{
+		background-color: #ffffff;
+		 .tit{flex: 1;display: flex;flex-direction: column;justify-content: center;position: relative;
+			view{text-align: center;}
+			.tits{color: #AAAAAA ;}
+			.txt{color: #aaaaaa;}
+			.line{width: 40rpx;height: 12rpx;position: absolute;left: 50%;margin-left: -20rpx;bottom: 6rpx;display: none;}
+		 &.act{
+			 // &::after{content: '';width: 100rpx;height: 6rpx;background:#FE5706 ;position: absolute;left: 50%;margin-left: -50rpx;bottom: 0;}
+			.tits{color: #161616;}
+			.txt{color: #FE5706;}
+			.line{display: block;}
+			}
+		 }
+		.chebox{width: 96rpx;background: #FFFFFF;
+box-shadow: -10rpx 0rpx 10rpx 0rpx rgba(196,191,191,0.22);display: flex;align-items: center;justify-content: center;
+			image{width: 30rpx;height: 26rpx;}
+		}
+	}
+</style>

+ 167 - 0
components/uni-section/uni-section.vue

@@ -0,0 +1,167 @@
+<template>
+	<view class="uni-section">
+		<view class="uni-section-header" @click="onClick">
+				<view class="uni-section-header__decoration" v-if="type" :class="type" />
+        <slot v-else name="decoration"></slot>
+
+        <view class="uni-section-header__content">
+          <text :style="{'font-size':titleFontSize,'color':titleColor}" class="uni-section__content-title" :class="{'distraction':!subTitle}">{{ title }}</text>
+          <text v-if="subTitle" :style="{'font-size':subTitleFontSize,'color':subTitleColor}" class="uni-section-header__content-sub">{{ subTitle }}</text>
+        </view>
+
+        <view class="uni-section-header__slot-right">
+          <slot name="right"></slot>
+        </view>
+		</view>
+
+		<view class="uni-section-content" :style="{padding: _padding}">
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+
+	/**
+	 * Section 标题栏
+	 * @description 标题栏
+	 * @property {String} type = [line|circle|square] 标题装饰类型
+	 * 	@value line 竖线
+	 * 	@value circle 圆形
+	 * 	@value square 正方形
+	 * @property {String} title 主标题
+	 * @property {String} titleFontSize 主标题字体大小
+	 * @property {String} titleColor 主标题字体颜色
+	 * @property {String} subTitle 副标题
+	 * @property {String} subTitleFontSize 副标题字体大小
+	 * @property {String} subTitleColor 副标题字体颜色
+	 * @property {String} padding 默认插槽 padding
+	 */
+
+	export default {
+		name: 'UniSection',
+    emits:['click'],
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			title: {
+				type: String,
+				required: true,
+				default: ''
+			},
+      titleFontSize: {
+        type: String,
+        default: '14px'
+      },
+			titleColor:{
+				type: String,
+				default: '#333'
+			},
+			subTitle: {
+				type: String,
+				default: ''
+			},
+      subTitleFontSize: {
+        type: String,
+        default: '12px'
+      },
+      subTitleColor: {
+        type: String,
+        default: '#999'
+      },
+			padding: {
+				type: [Boolean, String],
+				default: false
+			}
+		},
+    computed:{
+      _padding(){
+        if(typeof this.padding === 'string'){
+          return this.padding
+        }
+
+        return this.padding?'10px':''
+      }
+    },
+		watch: {
+			title(newVal) {
+				if (uni.report && newVal !== '') {
+					uni.report('title', newVal)
+				}
+			}
+		},
+    methods: {
+			onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+<style lang="scss" >
+	$uni-primary: #2979ff !default;
+
+	.uni-section {
+		background-color: #fff;
+    .uni-section-header {
+      position: relative;
+      /* #ifndef APP-NVUE */
+      display: flex;
+      /* #endif */
+      flex-direction: row;
+      align-items: center;
+      padding: 12px 10px;
+      font-weight: normal;
+
+      &__decoration{
+        margin-right: 6px;
+        background-color: $uni-primary;
+        &.line {
+          width: 4px;
+          height: 12px;
+          border-radius: 10px;
+        }
+
+        &.circle {
+          width: 8px;
+          height: 8px;
+          border-top-right-radius: 50px;
+          border-top-left-radius: 50px;
+          border-bottom-left-radius: 50px;
+          border-bottom-right-radius: 50px;
+        }
+
+        &.square {
+          width: 8px;
+          height: 8px;
+        }
+      }
+
+      &__content {
+        /* #ifndef APP-NVUE */
+        display: flex;
+        /* #endif */
+        flex-direction: column;
+        flex: 1;
+        color: #333;
+
+        .distraction {
+          flex-direction: row;
+          align-items: center;
+        }
+        &-sub {
+          margin-top: 2px;
+        }
+      }
+
+      &__slot-right{
+        font-size: 14px;
+      }
+    }
+
+    .uni-section-content{
+      font-size: 14px;
+    }
+	}
+</style>

+ 32 - 0
config.js

@@ -0,0 +1,32 @@
+// 应用全局配置
+module.exports = {
+  baseUrl: 'https://vue.ruoyi.vip/prod-api',
+  // baseUrl: 'https://lyyy.qs163.cn/prod-api',
+  // baseUrl: 'http://192.168.101.168:8089',
+  // baseUrl: 'http://192.168.101.11:8089',
+  // baseUrlimg: 'http://114.99.127.243:2001',
+  Clientid:'428a8310cd442757ae699df5d894f051',//
+ // https://xygl.cnzxy.cn h5链接地址
+  confirmflag:false,//是否有弹窗
+  // 应用信息
+  appInfo: {
+    // 应用名称
+    name: "ruoyi-app",
+    // 应用版本
+    version: "1.1.0",
+    // 应用logo
+    logo: "/static/logo.png",
+    // 官方网站
+    site_url: "http://ruoyi.vip",
+    // 政策协议
+    agreements: [{
+        title: "隐私政策",
+        url: "https://ruoyi.vip/protocol.html"
+      },
+      {
+        title: "用户服务协议",
+        url: "https://ruoyi.vip/protocol.html"
+      }
+    ]
+  }
+}

+ 19 - 0
main.js

@@ -0,0 +1,19 @@
+import Vue from 'vue'
+import App from './App'
+import store from './store' // store
+import plugins from './plugins' // plugins
+import './permission' // permission
+Vue.use(plugins)
+import {toast} from "@/utils/common.js"
+
+Vue.config.productionTip = false
+Vue.prototype.$store = store
+Vue.prototype.$toast=toast;
+
+App.mpType = 'app'
+
+const app = new Vue({
+  ...App
+})
+
+app.$mount()

+ 101 - 0
manifest.json

@@ -0,0 +1,101 @@
+{
+    "name" : "烈士陵园预约",
+    "appid" : "__UNI__6C93067",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : 100,
+    "transformPx" : false,
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueCompiler" : "uni-app",
+        "compatible" : {
+            "ignoreVersion" : true //true表示忽略版本检查提示框,HBuilderX1.9.0及以上版本支持
+        },
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        "modules" : {
+            "Geolocation" : {}
+        },
+        "distribute" : {
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            "ios" : {
+                "dSYMs" : false
+            },
+            "sdkConfigs" : {
+                "ad" : {},
+                "maps" : {
+                    "amap" : {
+                        "appkey_ios" : "",
+                        "appkey_android" : ""
+                    }
+                },
+                "geolocation" : {
+                    "amap" : {
+                        "__platform__" : [ "android" ],
+                        "appkey_ios" : "14b0dd93ed792fe585d89f173e4e511d",
+                        "appkey_android" : "14b0dd93ed792fe585d89f173e4e511d"
+                    }
+                }
+            },
+            "icons" : {
+                "android" : {
+                    "xhdpi" : "static/logo.png"
+                }
+            }
+        }
+    },
+    "quickapp" : {},
+    "mp-weixin" : {
+        "appid" : "wx694b1ba10320b8bc",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : false,
+            "minified" : true,
+            "postcss" : true
+        },
+        "optimization" : {
+            "subPackages" : true
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "获取当前位置"
+            }
+        }
+    },
+    "vueVersion" : "2",
+    "h5" : {
+        "template" : "static/index.html",
+        "title" : "智慧校园访客系统",
+        "router" : {
+            "mode" : "history",
+            "base" : ""
+        },
+        "devServer" : {
+            "https" : false,
+            "port" : 9090
+        }
+    }
+}

+ 35 - 0
package-lock.json

@@ -0,0 +1,35 @@
+{
+  "name": "qs_lyyuyue",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "base-64": "^1.0.0",
+        "utf8": "^3.0.0"
+      }
+    },
+    "node_modules/base-64": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz",
+      "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="
+    },
+    "node_modules/utf8": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+      "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
+    }
+  },
+  "dependencies": {
+    "base-64": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz",
+      "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="
+    },
+    "utf8": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz",
+      "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ=="
+    }
+  }
+}

+ 6 - 0
package.json

@@ -0,0 +1,6 @@
+{
+  "dependencies": {
+    "base-64": "^1.0.0",
+    "utf8": "^3.0.0"
+  }
+}

+ 196 - 0
pages.json

@@ -0,0 +1,196 @@
+{
+  "pages": [
+	  
+	{
+	"path": "pages/login",
+	"style": {
+		"navigationBarTitleText": "登录",
+		"h5":{
+			"titleNView":false
+			}
+		}
+	},
+	{
+	  "path": "pages/index/index",
+	  "style": {
+	    "navigationBarTitleText": "智慧访客预约系统",
+	    "navigationStyle": "custom"
+	  }},
+	// {
+	//   "path": "pages/order/search",
+	//   "style": {
+	//     "navigationBarTitleText": "预约查询",
+	// 			"h5":{
+	// 				"titleNView":false
+	// 		}
+	// 	}
+	// },
+	// {
+	//   "path": "pages/order/notice",
+	//   "style": {
+	//     "navigationBarTitleText": "预约须知",
+	// 			"h5":{
+	// 				"titleNView":false
+	// 		}
+	// 	}
+	// },
+	
+  {
+    "path": "pages/register",
+    "style": {
+      "navigationBarTitleText": "注册"
+    }
+  }, 
+	{
+	  "path": "pages/order/staffcode",
+	  "style": {
+	    "navigationBarTitleText": "扫码通行",
+		"h5":{
+			"titleNView":false
+			}
+		}
+	},
+	{
+	  "path": "pages/order/stafffail",
+	  "style": {
+	    "navigationBarTitleText": "提示",
+		"h5":{
+			"titleNView":false
+			}
+		}
+	},
+	 {
+	   "path": "pages/order/come",
+	   "style": {
+	     "navigationBarTitleText": "来访预约",
+			"h5":{
+				"titleNView":false
+	 		}
+	 	}
+	 },
+	 {
+	   "path": "pages/order/comedetail",
+	   "style": {
+	     "navigationBarTitleText": "预约信息",
+	 			"h5":{
+	 				"titleNView":false
+	 		}
+	 	}
+	 },
+	 {
+	   "path": "a/code",
+	   "style": {
+	     "navigationBarTitleText": "预约信息",
+	 			"h5":{
+	 				"titleNView":false
+	 		}
+	 	}
+	 },
+	 {
+	   "path": "pages/order/code",
+	   "style": {
+	     "navigationBarTitleText": "扫码通行",
+	 		"h5":{
+	 			"titleNView":false
+	 		}
+	 	}
+	 },
+	{
+	  "path": "pages/agreement",
+	  "style": {
+	    "navigationBarTitleText": "用户协议及隐私条款"
+	  }
+	},
+	
+  {
+    "path": "pages/work/index",
+    "style": {
+      "navigationBarTitleText": "工作台"
+    }
+	}, {
+    "path": "pages/mine/index",
+    "style": {
+      "navigationBarTitleText": "我的",
+	  "navigationStyle": "custom",
+	  "enablePullDownRefresh":true
+    }
+  }, {
+    "path": "pages/mine/avatar/index",
+    "style": {
+      "navigationBarTitleText": "修改头像"
+    }
+  }, {
+    "path": "pages/mine/info/index",
+    "style": {
+      "navigationBarTitleText": "个人信息"
+    }
+  }, {
+    "path": "pages/mine/info/edit",
+    "style": {
+      "navigationBarTitleText": "编辑资料"
+    }
+  }, {
+    "path": "pages/mine/pwd/index",
+    "style": {
+      "navigationBarTitleText": "修改密码"
+    }
+	}, {
+	  "path": "pages/mine/pwd/forgetpwd",
+	  "style": {
+	    "navigationBarTitleText": "忘记密码"
+	  }
+	}, {
+	  "path": "pages/mine/pwd/resetpwd",
+	  "style": {
+	    "navigationBarTitleText": "重置密码"
+	  }
+  }, {
+    "path": "pages/mine/setting/index",
+    "style": {
+      "navigationBarTitleText": "应用设置"
+    }
+  }, {
+    "path": "pages/mine/help/index",
+    "style": {
+      "navigationBarTitleText": "常见问题"
+    }
+  }, {
+    "path": "pages/mine/about/index",
+    "style": {
+      "navigationBarTitleText": "关于我们"
+    }
+  }, {
+    "path": "pages/common/webview/index",
+    "style": {
+      "navigationBarTitleText": "浏览网页"
+    }
+  }, {
+    "path": "pages/common/textview/index",
+    "style": {
+      "navigationBarTitleText": "浏览文本"
+    }
+  }],
+  // "tabBar": {
+  //   "color": "#000000",
+  //   "selectedColor": "#000000",
+  //   "borderStyle": "white",
+  //   "backgroundColor": "#ffffff",
+  //   "list": [{
+  //       "pagePath": "pages/index/index",
+  //       "iconPath": "static/images/tabbar/home.png",
+  //       "selectedIconPath": "static/images/tabbar/home_.png",
+  //       "text": "首页"
+  //     }, {
+  //       "pagePath": "pages/mine/index",
+  //       "iconPath": "static/images/tabbar/mine.png",
+  //       "selectedIconPath": "static/images/tabbar/mine_.png",
+  //       "text": "我的"
+  //     }
+  //   ]
+  // },
+  "globalStyle": {
+    "navigationBarTextStyle": "black",
+    "navigationBarTitleText": "RuoYi",
+    "navigationBarBackgroundColor": "#FFFFFF"
+  }
+}

+ 80 - 0
pages/agreement.vue

@@ -0,0 +1,80 @@
+<template>
+	<view class="agreen">
+		 <!-- <view class="tit">用户协议及隐私条款</view> -->
+		 <view class="txt tn2">尊敬的用户,欢迎使用中新云有限公司提供的服务。在使用前请您阅读如下服务协议,使用本应用即表示您同意接受本协议,本协议产生法律效力,特别涉及免除或者限制中新云有限公司责任的条款,请仔细阅读。如有任何问题,可向中新云有限公司咨询。</view>
+		 <view class="tits">1. 服务条款的确认和接受</view>
+		 <view class="txt tn2">通过访问或使用本应用,表示用户同意接受本协议的所有条件和条款</view>
+		 <view class="tits">2. 服务条款的变更和修改</view>
+		 <view class="txt tn2">中新云有限公司有权在必要时修改服务条款,服务条款一旦发生变更,将会在重要页面上提示修改内容。如果不同意所改动的内容,用户可以放弃获得的本应用信息服务。如果用户继续享用本应用的信息服务,则视为接受服务条款的变更。本应用保留随时修改或中断服务而不需要通知用户的权利。本应用行使修改或中断服务的权利,不需对用户或第三方负责。</view>
+		 <view class="tits">3.用户行为</view>
+		 <view class="txt tn2">中新云有限公司有权对用户使用中新云智APP的情况进行审查和监督,如用户在使用中新云智APP时违反任何以下规定,中新云有限公司或其授权的人有权要求用户改正或直接采取一切必要的措施以减轻用户不当行为造成的影响。</view>
+		 <view class="tits">3.1 用户账号、密码和安全</view>
+		 <view class="txt tn2">用户一旦注册成功,便成为中新云有限公司的合法用户,将得到一个密码和帐号。同时,此账号密码可登录中新云有限公司中新云智APP程序。因此用户应采取合理措施维护其密码和帐号的安全。用户对利用该密码和帐号所进行的一切活动负全部责任;由该等活动所导致的任何损失或损害由用户承担,中新云有限公司不承担任何责任。 用户的密码和帐号遭到未授权的使用或发生其他任何安全问题,用户可以立即通知中新云有限公司,中新云有限公司有权予以关闭并注销其内容。</view>
+		 <view class="tits">3.2 账号注册时的禁止行为</view>
+		 <view class="txt">(1)冒充任何人或机构,或以虚伪不实的方式谎称或使人误认为与任何人或任何机构有关的名称;</view>
+		 <view class="txt">(2)请勿注册不文明、不健康名字,或包含歧视、侮辱、猥亵类词语的名字;</view>
+		 <view class="txt">(3)请勿注册易产生歧义、引起他人误解的名字;</view>
+		 <view class="tits">3.3 用户在本应用上不得发布下列违法信息和照片:</view>
+		 <view class="txt">(1)反对宪法所确定的基本原则的;</view>
+		 <view class="txt">(2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;</view>
+		 <view class="txt">(3)损害国家荣誉和利益的;</view>
+		 <view class="txt">(4)煽动民族仇恨、民族歧视,破坏民族团结的;</view>
+		 <view class="txt">(5)破坏国家宗教政策,宣扬邪教和封建迷信的;</view>
+		 <view class="txt">(6)散布谣言,扰乱社会秩序,破坏社会稳定的;</view>
+		 <view class="txt">(7)散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;</view>
+		 <view class="txt">(8)侮辱或者诽谤他人,侵害他人合法权益的;</view>
+		 <view class="txt">(9)含有法律、行政法规禁止的其他内容的;</view>
+		 <view class="txt">(10)禁止骚扰、毁谤、威胁、仿冒网站其他用户;</view>
+		 <view class="txt">(11)严禁煽动非法集会、结社、游行、示威、聚众扰乱社会秩序;</view>
+		 <view class="txt">(12)严禁发布可能会妨害第三方权益的文件或者信息,例如(包括但不限于):病毒代码、黑客程序、软件破解注册信息。</view>
+		 <view class="txt">(13)禁止上传他人作品。其中包括你从互联网上下载、截图或收集的他人的作品;</view>
+		 <view class="txt">(14)禁止上传广告、横幅、标志等网络图片;</view>
+		 <view class="tits">3.4 账号盗用</view>
+		 <view class="txt tn2">盗取他人用户账号或利用网络通讯骚扰他人,均属于非法行为。用户不得采用测试、欺骗等任何非法手段,盗取其他用户的账号和对他人进行骚扰。</view>
+		 
+		  <view class="tit">隐私条款</view>
+		 <view class="tits">1.用户信息公开情况说明</view>
+		 <view class="txt tn2">尊重用户个人隐私是中新云有限公司的一项基本政策。所以,中新云有限公司不会在未经合法用户授权时公开、编辑或透露其注册资料及保存在本应用中的非公开内容,除非有下列情况:</view>
+		 <view class="txt">(1)有关法律规定或中新云有限公司合法服务程序规定;</view>
+		 <view class="txt">(2)在紧急情况下,为维护用户及公众的权益;</view>
+		 <view class="txt">(3)为维护中新云有限公司的商标权、专利权及其他任何合法权益;</view>
+		 <view class="txt">(4)其他需要公开、编辑或透露个人信息的情况;</view>
+		 <view class="txt tn2">在以下(包括但不限于)几种情况下,中新云有限公司有权使用用户的个人信息:</view>
+		 <view class="txt">(1)在进行促销或抽奖时,中新云有限公司可能会与赞助商共享用户的个人信息,在这些情况下中新云有限公司会在发送用户信息之前进行提示,并且用户可以通过不参与来终止传送过程;</view>
+		 <view class="txt">(2)中新云有限公司可以将用户信息与第三方数据匹配;</view>
+		 <view class="txt">(3)中新云有限公司会通过透露合计用户统计数据,向未来的合作伙伴、广告商及其他第三方以及为了其他合法目的而描述中新云有限公司的服务;</view>
+
+		 <view class="tits">2.隐私权政策适用范围</view>
+		 <view class="txt">(1)用户在登录本应用服务器时留下的个人身份信息;</view>
+		 <view class="txt">(2)用户通过本应用服务器与其他用户或非用户之间传送的各种资讯;</view>
+		 <view class="txt">(3)本应用与商业伙伴共享的其他用户或非用户的各种信息;</view>
+		 <view class="tits">3.资讯公开与共享</view>
+		 <view class="txt tn2">中新云有限公司不会将用户的个人信息和资讯故意透露、出租或出售给任何第三方。但以下情况除外:</view>
+		 <view class="txt">(1)用户本人同意与第三方共享信息和资讯;</view>
+		 <view class="txt">(2)只有透露用户的个人信息和资讯,才能提供用户所要求的某种产品和服务;</view>
+		 <view class="txt">(3)应代表本应用提供产品或服务的主体的要求提供(除非我们另行通知,否则该等主体无权将相关用户个人信息和资讯用于提供产品和服务之外的其他用途):根据法律法规或行政命令的要求提供;因外部审计需要而提供;用户违反了本应用服务条款或任何其他产品及服务的使用规定;经本站评估,用户的帐户存在风险,需要加以保护。</view>
+		 <view class="tits">4.账户删除申请</view>
+		 <view class="txt tn2">用户有权在任何时候编辑用户在中新云有限公司的帐户信息和资讯,用户也可以填写相关申请表格,要求删除个人帐户,但是用户无条件同意在你的帐户删除后,该帐户内及与该帐户相关的信息和资讯仍然保留在本网站档案记录中,除上述第三条规定的情况外,中新云有限公司将为用户保密。</view>
+		 
+	</view>
+</template>
+
+<script>
+	export default{
+		data(){
+			return{
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+.agreen{padding: 40rpx 32rpx;box-sizing: border-box;background-color: #ffffff;}
+	.tit{font-size: 40rpx;color: #333333;font-weight: bold;text-align: center;margin-bottom: 36rpx;}
+	.tits{font-size: 32rpx;color: #333333;font-weight: 500;line-height: 68rpx;}
+	.txt{font-size: 30rpx;color: #343434;text-indent: 2em;margin-bottom: 20rpx;
+	&.tn2{text-indent: 0;}
+	}
+	
+</style>

+ 43 - 0
pages/common/textview/index.vue

@@ -0,0 +1,43 @@
+<template>
+  <view>
+    <uni-card class="view-title" :title="title">
+      <text class="uni-body view-content">{{ content }}</text>
+    </uni-card>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        title: '',
+        content: ''
+      }
+    },
+    onLoad(options) {
+      this.title = options.title
+      this.content = options.content
+      uni.setNavigationBarTitle({
+        title: options.title
+      })
+    }
+  }
+</script>
+
+<style scoped>
+  page {
+    background-color: #ffffff;
+  }
+
+  .view-title {
+    font-weight: bold;
+  }
+
+  .view-content {
+    font-size: 26rpx;
+    padding: 12px 5px 0;
+    color: #333;
+    line-height: 24px;
+    font-weight: normal;
+  }
+</style>

+ 34 - 0
pages/common/webview/index.vue

@@ -0,0 +1,34 @@
+<template>
+  <view v-if="params.url">
+    <web-view :webview-styles="webviewStyles" :src="`${params.url}`"></web-view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        params: {},
+        webviewStyles: {
+          progress: {
+            color: "#FF3333"
+          }
+        }
+      }
+    },
+    props: {
+      src: {
+        type: [String],
+        default: null
+      }
+    },
+    onLoad(event) {
+      this.params = event
+      if (event.title) {
+        uni.setNavigationBarTitle({
+          title: event.title
+        })
+      }
+    }
+  }
+</script>

+ 37 - 0
pages/index.vue

@@ -0,0 +1,37 @@
+<template>
+	<view class="zan">
+		<view @click="geta">保安</view>
+		<view @click="getb">被访者</view>
+		<view @click="getc">来访者</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		data(){
+			return{
+				
+			}
+		},
+		methods:{
+			geta(){
+				this.$tab.navigateTo('/pages/order/staff')
+			},
+			getb(){
+				this.$tab.navigateTo('/pages/order/notice')
+			},
+			getc(){
+				this.$tab.navigateTo('/pages/order/come')
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.zan{
+	display: flex;align-items: center;
+	view{
+		font-size: 32rpx;padding: 0 20rpx;flex: 1;
+	}
+}
+</style>

+ 394 - 0
pages/index/index.vue

@@ -0,0 +1,394 @@
+<template>
+  <view class="staff" :style="'padding-top:'+statop+'px;'">
+	  <view class="pfixed">
+		<view class="staff_top  flexcj" :style="'padding-top:'+tops+'px;'">
+			<image :src="titimg" class="topl flex0"></image>
+			<view class="topr" v-if="city">
+				<view class="f14 co16 fw flexc lh20">{{city}}<image :src="weathericon" class="weaimg"></image>
+				</view>
+				<view class="f12 co16">{{weather}} {{temperature}}­°C</view>
+			</view>
+		</view>
+		<view class="sy_box plr15" :style="topflag?'display: block;':'display: none;'" >
+			<view class="sy_tit flexcj">
+				<view class="sy_txt">预约登记信息</view>
+				<!-- <image :src="rimg" class="sy_rimg"></image> -->
+			</view>
+					<!-- tab -->
+			<view class="tab flexcj">
+				<view class="list" :class="tabidx==ite.val?'act':''" v-for="(ite,idx) in tablist" :key="idx" @click="getTab(ite.val)">{{ite.tit}}</view>
+			</view>
+		</view>  
+	  </view>
+	  
+	  <view class="staff_box">
+		  <view class="s_count">
+			  <image :src="bgimg" class="bgimg"></image>
+			  <view class="s_counta">
+				  <view class="s_coua flexcj">
+					  <view class="f14 fw cof1 lh20">陵园参观预约统计</view>
+					  <i class="f14 fw cof1">{{kaTime}}</i>
+				  </view>
+				  <view class="flexc s_clist">
+					<view class="list">
+						<view class="num">{{conuntinfo.canGuan}}</view>
+						<view class="tit">参观数(位)</view>
+					</view>
+					<view class="list">
+						<view class="num">{{conuntinfo.yuYue}}</view>
+						<view class="tit">已预约(位)</view>
+					</view>
+					<view class="list">
+						<view class="num">{{conuntinfo.todayYuYue}}</view>
+						<view class="tit">今日预约(位)</view>
+					</view>
+					<view class="list">
+						<view class="num">{{conuntinfo.todayCanGuan}}</view>
+						<view class="tit">今日参观(位)</view>
+					</view>
+				  </view>
+				  <!-- v-if="checkPermi(['system:reservat:cav'])" -->
+				  <view class="flexcc s_cbtn" @click="getCode" >
+					  <image :src="scanimg" class="scanimg"></image>
+					  扫码通行
+				  </view>
+			  </view>
+		  </view>
+		  <!-- 预约客户信息 -->
+		  <view class="sy_box" >
+			<view class="sy_tit flexcj">
+				<view class="sy_txt">预约登记信息</view>
+				<!-- <image :src="rimg" class="sy_rimg"></image> -->
+			</view>
+			<!-- tab -->
+			<view class="tab flexcj">
+				<view class="list" :class="tabidx==ite.val?'act':''" v-for="(ite,idx) in tablist" :key="idx" @click="getTab(ite.val)">{{ite.tit}}</view>
+			</view>
+		  </view>
+		<!-- 列表 -->
+		<view class="pt8" :style="'min-height: ' + minheight + 'px;'"><y-list :datalist="list" :wtdt="wtdt" :type="type" @getDetail='getDetail'></y-list></view>
+	  </view>
+	  
+	<footers v-if="isfootflag" :footlist="footlist" :footerindex="footerindex" :color_checked="color_checked" :color_nochecked="color_nochecked" :isHomeIndex="true"></footers>
+  </view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import self from '@/utils/location.js';
+	import yList from "@/components/order/list.vue"
+	import {getReservatcountl,getReservatList,getReservatvav} from "@/api/mine/order.js"
+	import footers from '@/components/footer/footer.vue'
+  export default {
+	components:{yList,footers},
+	data(){
+		return{
+			tops:12,
+			backgroundColor: "#ffffff",
+			weather:require("@/static/images/order/staffs/weather.png"), 
+			titimg:require("@/static/images/order/staffs/tit.png"), 
+			bgimg:require("@/static/images/order/staffs/bg.png"), 
+			scanimg:require("@/static/images/order/staffs/scan.png"),
+			rimg:require("@/static/images/order/staffs/rimg.png"),
+			footlist:[
+				{module:'home',title:'首页',icon_checked:require('@/static/images/tabbar/home_.png'),icon_nochecked:require('@/static/images/tabbar/home.png')},
+				{module:'mine',title:'我的',icon_checked:require('@/static/images/tabbar/mine_.png'),icon_nochecked:require('@/static/images/tabbar/mine.png')},
+				],
+			footerindex:'home',
+			isfootflag:true,
+			color_checked :'161616',
+			color_nochecked :'666666',
+			statop:48,
+			dingtop:0,
+			tabidx:1,
+			tablist:[{tit:'今天',val:'1'},{tit:'昨天',val:'2'},{tit:'近7天',val:'3'},{tit:'近30天',val:'4'},{tit:'全部',val:'5'}],
+			pageSize: 10,
+			pageNum: 1,
+			reachflag: true,
+			topflag:false,
+			wtdt:'',
+			list:[],
+			type:'1',
+			conuntinfo:{},
+			timefn:'',
+			kaTime:'',
+			minheight:0,
+			city:'',
+			weather:'',
+			temperature:'',
+			weathericon:require("@/static/images/weather/weaionc.png"),
+			
+		}
+	},
+	onLoad: function() {
+		uni.$on('refreshdatalist',(e) => {
+			this.reachflag=true;
+			this.pageNum=1;
+			this.list=[];
+			this.getDataFn();
+			this.getcount();
+		})
+		uni.getSystemInfo({
+			success: (e) => {
+				this.tops = Number(e.statusBarHeight)+12;
+				this.statop=this.tops+48;
+				this.minheight = e.screenHeight - this.statop - 80;
+			}
+		})
+		this.getcount()
+		this.getDataFn()
+		
+	},
+	onUnload() {
+		uni.$off('refreshdatalist')
+		clearInterval(this.timefn)
+	},
+	onHide() {
+		clearInterval(this.timefn)
+	},
+	onShow() {
+		clearInterval(this.timefn)
+		this.gettimeFn();
+		var that=this;
+		// #ifndef H5
+		self.getLocation(function(res){
+			if(res==-1){
+				that.setflag=true
+			}else{
+				// that.getAdrinfoFn(res)
+				// that.location = `${res.lng},${res.lat}`
+				that.city=res.city;
+				that.temperature=res.temperature;
+				that.weather=res.weather;
+				that.weathericon=res.icon;
+			}			
+		})
+		// #endif
+	},
+	mounted() {
+		this.ceheiFn()
+	},
+	onPageScroll(e) {
+		let that = this;
+		if(e.scrollTop >= that.dingtop + 10){
+			that.topflag = true;
+		}else{
+			that.topflag = false;
+		}
+	},
+	// 上拉触底加载更多触发事件
+	onReachBottom() {
+		if (this.reachflag) {
+			this.pageNum++
+			this.getDataFn()
+		}
+	},
+	methods:{
+		checkPermi, checkRole,
+		gettimeFn() {
+			var that = this;
+			clearInterval(this.timefn)
+			that.time();
+			// var stime = this.shuatime
+			that.timefn = setInterval(function() {
+				// if (stime <= 1) {
+				// 	that.shuiux()
+				// 	stime = that.shuatime
+				// }
+				// stime = stime - 1;
+				that.time();
+			}, 1000);
+		},
+		time() {
+			var date = new Date();
+			var y = date.getFullYear();
+			var m = date.getMonth() + 1;
+			var d = date.getDate();
+			var h = date.getHours();
+			var min = date.getMinutes();
+			var s = date.getSeconds();
+			var week = date.getDay(); //获取当前星期X(0-6,0代表星期天)
+			var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
+			var yearStr = y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d)
+			var timeStr = (h < 10 ? ('0' + h) : h) + ':' + (min < 10 ? ('0' + min) : min) + ':' + (s < 10 ? (
+				'0' + s) : s);
+			this.kaTime = yearStr + ' ' + timeStr;
+		},
+		getcount(){
+			
+			getReservatcountl().then(res=>{
+				if(res.code==200){
+					this.conuntinfo=res.data
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+		},
+		getTab(e){
+			
+			this.tabidx=e;
+			this.reachflag=false;
+			this.pageNum=1;
+			this.list=[];
+			this.totopFn();
+			this.getDataFn();
+		},
+		ceheiFn(){
+			var that = this;
+			let cehei = uni.createSelectorQuery().in(this);
+			cehei.select(".s_count").boundingClientRect(function(res){
+				that.dingtop = res.height;
+			}).exec();
+		},
+		getDetail(data){
+			this.$tab.navigateTo('/pages/order/staffcode?type=look&id='+data)
+		},
+		getCode(){
+			var that = this;
+			uni.scanCode({
+				onlyFromCamera: true,
+				autoZoom:false,
+				scanType: ['qrCode'],
+				success: function(red) {
+					let result = red.result;
+					if (typeof result == 'string') {
+						try {
+						
+						} catch (e) {
+							uni.navigateBack({
+								delta: 1
+							})
+							uni.showToast({
+								title: '扫码查询失败,请检查二维码是否正确',
+								icon: "none"
+							})
+							return
+						}
+					}
+					var id = red.result
+					var params = {
+						"reservatId": id,
+					}
+					getReservatvav(params).then(res => {
+						if (res.code == 200) {
+							
+							if(res.msg=='核销失败'){
+								that.$tab.navigateTo('/pages/order/stafffail')
+							}else{
+								uni.$emit('refreshdatalist')
+								that.$tab.navigateTo('/pages/order/staffcode?id='+id)
+							}
+							
+						} else {
+							uni.showToast({
+								title: res.msg,
+								duration: 1000,
+								icon: 'none'
+							});
+						
+						}
+					})
+				},
+				fail: function(e) {
+					if (e && e.errMsg && e.errMsg.indexOf('scanCode:fail cancel') != -1) {
+						return;
+					}
+					uni.showToast({
+						title: '扫码失败',
+						icon: "none"
+					})
+				},
+			});
+			// this.$tab.navigateTo('/pages/order/code')
+		},
+		totopFn(){
+			var that = this;
+			uni.pageScrollTo({
+				duration: 0,
+				scrollTop: that.dingtop + 12
+			})
+		},
+		getDataFn(){
+			var params={
+				pageSize:this.pageSize,
+				pageNum: this.pageNum,
+				// visitType:3
+			}
+			if(this.tabidx!=5){
+				params.dataType=this.tabidx
+			}
+			getReservatList(params).then(res=>{
+				if(res.code==200){
+					if (res.rows.length < this.pageSize) {
+						this.reachflag = false
+						this.wtdt = '到底了~';
+					} else {
+						var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+						if (num < res.total) {
+							this.reachflag = true
+							this.wtdt = '上拉加载更多'
+						} else {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						}
+					}
+					if (this.pageNum == 1) {
+						this.list = res.rows;
+					} else {
+						this.list = this.list.concat(res.rows)
+					}
+				}else{
+					this.$toast(res.msg)
+				}
+			}) 
+			
+		},
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.yfixed{position: fixed;z-index: 5;left: 0;top: 0;right: 0;background: #ffffff;padding: 0 30rpx;}
+.staff_top{padding: 24rpx 32rpx;box-sizing: border-box;box-sizing: border-box;
+	.topl{width: 272rpx;height: 56rpx;}
+	.topr{
+		.weaimg{width: 40rpx;height: 40rpx;}
+	}
+}
+.staff_box{padding:8px 30rpx 0;
+	.s_count{position: relative;min-height: 380rpx;
+		.bgimg{position: absolute;left: 0;top: 0;right: 0;bottom: 0;z-index: -1;width: 100%;height: 100%;}
+		.s_counta{padding: 36rpx 0 20rpx;width: 100%;
+			.s_coua{margin: 0 36rpx;}
+			.s_clist{padding: 36rpx 0;
+				.list{width: 25%;display: flex;flex-direction: column;align-items: center;position: relative;
+					.num{font-size: 42rpx;font-weight: 500;color: #F1F1F1;margin-bottom: 14rpx;}
+					.tit{font-size: 24rpx;font-weight: bold;color: #F2B5B2;}
+					&::after{content: '';width: 2rpx;height: 36rpx;background: #B7C9F9;position: absolute;right: 0;top: 50%;margin-top: -18rpx;border-radius: 4rpx;}
+					&:last-of-type::after{display: none;}
+				}
+			}
+			.s_cbtn{margin: 14rpx 58rpx 0;height: 76rpx;background: #FFFFFF;box-shadow: 0px 2rpx 6rpx 0px rgba(35,68,152,0.63);border-radius: 38rpx;
+				font-size: 30rpx;font-weight: bold;color: $com-cd3;
+				.scanimg{width: 44rpx;height: 44rpx;margin-right: 30rpx;}
+			}
+			
+		}
+	}
+}
+.sy_box{
+		.sy_tit{padding: 32rpx 0;
+			.sy_txt{font-size: 30rpx;font-weight: bold;color: #161616;position: relative;padding-left: 26rpx;
+				&::before{width: 6rpx;height: 34rpx;background: $com-cd3;border-radius: 4rpx;content: '';left: 0;top: 3rpx;position: absolute;bottom: 3rpx;}
+			}
+			.sy_rimg{width: 16rpx;height: 28rpx;flex: 0 0 auto;marign-left:20rpx}
+		}
+		.tab{padding-bottom: 24rpx;
+			.list{min-width: 112rpx;height: 52rpx;background: #E6E4E4;border-radius: 26rpx;display: flex;align-items: center;font-size: 26rpx;font-weight: 500;
+color: #666666;justify-content: center;box-sizing: border-box;padding: 0 28rpx;line-height: 48rpx;
+				&.act{color: $com-cd3;background: #FFFFFF;border: 2rpx solid $com-cd3;}
+			}
+		}
+	}
+</style>

+ 409 - 0
pages/login.vue

@@ -0,0 +1,409 @@
+<template>
+  <view class="regbox pregbox flexdc" v-if="loginflag" style="padding-top: 60rpx;">
+	  <image :src="headimg" class="headimg flex0"></image>
+	   
+	  <view class="flex1" style="position: relative;">
+		  <!-- #ifdef APP-PLUS -->
+		  <!-- <image :src="ldicon" class="mzimg flex0"></image>
+			<view class="mb24 mt50">
+				<view class="f25 c16 fw5 mb30 txc">133****0756</view>
+				<view class="rbtn">本机号码一键登录</view>
+			</view> -->
+		  <!-- #endif -->
+		  <!-- #ifdef MP-WEIXIN -->
+		   <!-- #endif -->
+		  <view class="tab flexcc">
+			  <block v-for="(ite,idx) in tablist" :key="idx">
+				  <view v-if="ite.val!=1"  class="tabtit" :class="tabidx==ite.val?'act':''" @click="getTab(ite.val)">
+				  {{ite.tit}}</view> 
+			  </block>
+			 
+		  </view>
+		  <!-- 手机号登录 -->
+		  <view class="login-form-content" v-if="tabidx!=1">
+
+		  	<view class="input-item">
+		  		<view class="login_tit">账号</view>
+		  		<view class="login_box">
+		  			<!-- <view class="login_boxl">+86</view> -->
+		  			 <input  v-model="loginForm.username" class="input" type="text" placeholder="请输入登录账号" maxlength="30" />
+		  		</view>
+		  	</view>
+		  	<block v-if="tabidx==2">
+		  		<view class="input-item" >
+					<view class="flexcj">
+						<view class="login_tit">密码</view>
+						<view class="login_jz" @click="jzflag=!jzflag">
+							<image :src="pcicon" v-if="jzflag"></image>
+							<image :src="pnicon" v-else></image>
+							<view>记住密码</view>
+						</view>
+					</view>
+		  			
+		  			 <view class="login_box">
+		  				 <input v-if="checkeye" v-model="loginForm.password" type="text"  class="input" placeholder="请输入密码" maxlength="20" />
+		  				 <input v-else v-model="loginForm.password" type="password"  class="input" placeholder="请输入密码" maxlength="20" />
+						 <view class="line flex0"></view>
+						 <view class="login_txt" @click="getForget"><text>忘记密码</text></view>
+		  			 </view>
+		  		</view>
+		  		<view class="input-item flex align-center" style="width: 60%;margin: 0px;margin-bottom: 24rpx;" v-if="captchaEnabled">
+		  		  <input v-model="tucode" type="number" class="input" placeholder="请输入验证码" maxlength="4" />
+		  		  <view class="login-code"> 
+		  		    <image :src="codeUrl" @click="getCode" class="login-code-img"></image>
+		  		  </view  >
+		  		</view>
+		  		 
+		  	</block>
+		  	<!-- <view v-if="tabidx==0" class="input-item" style="margin-bottom: 24rpx;" >
+		  		<view class="login_tit">验证码</view>
+		  		 <view style="display: flex;align-items: center;">
+		  			 <input v-model="duancode" type="code" class="input" placeholder="请输入短信验证码" maxlength="20" />
+		  			 <view v-if="timefalg" class="codes">重新发送{{time}}s</view>
+		  			 <view v-else class="codess" @click="getsendCode">发送验证码</view>
+		  		 </view>
+		  	</view> -->
+		    <button v-if="captchaEnabled"  type="primary" class=" rbtn mb24 mt50" :class="tucode&&loginForm.username&&loginForm.password?'btn2':'btn'"  @click="getLogin">登录</button>
+		    <button v-else type="primary" class=" rbtn mb24 mt50" :class="loginForm.username&&loginForm.password?'btn2':'btn'"   @click="getLogin">登录</button>
+		  </view>
+		  <!-- 微信登录 -->
+		  <block v-if="tabidx==1">
+			  <button  type="primary" class="rbtn mb24 mt50" open-type="getUserInfo" @getuserinfo="getuserinfo" >
+			  	<text class="btn-txt">快捷登录</text>
+			  </button>
+		  </block>
+		  
+		  
+		  <!-- 账号密码登录 -->
+			<view class="lread" @click="checkflag=!checkflag">
+				<view class="lreadl">
+					<image :src="checkimg" v-if="checkflag"></image>
+					<image :src="ncheckimg" v-else></image>
+				</view>
+				<view class="tit">登录即代表您已阅读并同意<text @click.stop="handlePrivacy">用户协议</text>及<text @click.stop="handlePrivacy">隐私政策</text></view>
+			</view>
+			 <view class="bbcode">版本号:ZXY_YY_1.3</view>
+	  </view>
+	 
+	    
+	  <!-- <view class="rtxt mt26" @click="getregister">还没账号?去申请注册</view> -->
+	  <phone-btn :type="typeflag" @getPhoneNumber='getPhoneNumber' @getClose="getClose"></phone-btn>
+  </view>
+</template>
+
+<script>
+	import {getweChatLogin,getInfo,getweChatOpenid,getCodeImg,getCode,sendSmsOnly} from "@/api/login.js"
+	import {getUserProfile} from "@/api/system/user.js"
+	import { getToken } from '@/utils/auth'
+	import phoneBtn from "@/components/toptab/phonebtn.vue"
+  export default {
+	  components:{
+		  phoneBtn
+	  },
+	data(){
+		return{
+			headimg:require('@/static/images/mine/lricon.png'),
+			ldicon:require('@/static/images/mine/ldicon.png'),
+			checkimg:require('@/static/images/mine/lcicon.png'),
+			ncheckimg:require('@/static/images/mine/lnicon.png'),
+			rimg:require('@/static/images/mine/rimg.png'),
+			pcicon:require('@/static/images/mine/pcicon.png'),
+			pnicon:require('@/static/images/mine/pnicon.png'),
+			checkflag:false,
+			typeflag: false,
+			loginflag:false,
+			captchaEnabled: false,
+			duancode:'',//短信验证码
+			checkeye:false,
+			tucode:'',
+			codeUrl:'',
+			time:'',
+			timefalg:'',
+			tabidx:2,
+			tablist:[{tit:'微信登录',val:1},{tit:'密码登录',val:2},],
+			loginForm: {
+				username: "",
+				code: "",
+				password:'',
+			},
+			voList:[],
+			voindex:0,
+			jzflag:false
+		}
+	},
+	
+	methods:{
+		getTab(idx){
+			this.tabidx=idx;
+		},
+
+		// 获取图形验证码
+		getCode() {
+		  getCodeImg().then(res => {
+		    this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled
+		    if (this.captchaEnabled) {
+		      this.codeUrl = 'data:image/gif;base64,' + res.img
+		      this.loginForm.uuid = res.uuid
+		    }
+		  })
+		},
+		getForget(){
+			this.$tab.navigateTo(`/pages/mine/pwd/forgetpwd`)
+		},
+		getSchoolFn(){
+			this.$tab.navigateTo(`/mine/pages/mine/school?id=`+this.loginForm.school)
+		},
+		 getregister(){
+			 this.$tab.navigateTo(`/mine/pages/login/register`)
+			 // this.$tab.navigateTo(`/mine/pages/mine/applyregister`)
+			 // this.$tab.navigateTo(`/mine/pages/mine/auth`)
+		 },
+		 getLogin(){
+			 if(!this.loginForm.username||!this.loginForm.password||(!this.tucode&& this.captchaEnabled)){
+			 	 return
+			 }
+			// let regphone = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
+			// if(!regphone.test(this.loginForm.username)){
+			// 	this.$toast('请输入正确的手机号')
+			// 	return
+			// }
+			 // if(!this.checkflag){
+			 // 	this.$toast("请同意用户协议")
+			 // 	return
+			 // }
+			 this.loginForm.code=this.tucode;
+			 this.pwdLogin()
+		 },
+		 // 密码登录
+		 async pwdLogin() {
+		 	var that=this;
+			
+		   this.$store.dispatch('Login', this.loginForm).then((res) => {
+			   // 判断是否记住密码
+			  if(that.jzflag){
+			  	var newObj={
+			  		username:that.loginForm.username,
+			  		password:that.loginForm.password,
+			  	}					  
+			  	uni.setStorageSync('account', JSON.parse(JSON.stringify(newObj)))
+			  }else{
+			  	uni.removeStorageSync('account')
+			  } 
+		     this.$modal.closeLoading()
+		 		  this.$toast('登录成功')
+		 		  setTimeout(function(){
+		 			  that.loginSuccess()
+		 		  },1500)
+		     
+		   }).catch((error) => {
+		    setTimeout(function(){
+		 		if (that.captchaEnabled&&that.tabidx==2) {
+		 			that.getCode()
+				}
+		 	},1000)
+		   })
+		 },
+		 handlePrivacy(){
+			this.$tab.navigateTo(`/pages/agreement`)  
+		 },
+		 getClose() {
+		 	this.typeflag = false
+		 },
+		 btns() {
+		 	
+		 },
+		 getPhoneNumber(data){
+			 var that=this;
+			 var params=data
+			 params.tenantId=this.loginForm.tenantId
+			 that.$store.dispatch('Login', params).then(() => {
+			   that.$modal.closeLoading()
+			 	that.$toast('登录成功')
+				that.typeflag=false;
+			   that.loginSuccess(data)
+			 }).catch(() => {
+			   // if (this.captchaEnabled) {
+			   //   this.getCode()
+			   // }
+			 })
+		 },
+		 // 登录成功后,处理函数
+		 loginSuccess(result) {
+		   // 设置用户信息
+		   var that=this;
+		   this.$store.dispatch('GetInfo').then(res => {
+			   this.$tab.reLaunch('/pages/index/index') 
+			   // 判断有几个角色 进入选择页面
+			   // var roles=that.$store.state.user.roles;
+			   // var userroles=that.$store.state.user.userroles;
+			   // if(roles.length>0){
+				  //  // 默认选择学校 老师 家长
+				  //  var a,b,c,type;
+				  //  if(roles.includes('school')){
+						// type='school'
+				  //  }else if(roles.includes('teacher')){
+					 //   type='teacher'
+				  //  }else if(roles.includes('parents')){
+					 //   type='parents'
+				  //  }else{
+					 //  that.$tab.reLaunch('/pages/index/index')
+					 //   return
+				  //  }
+				  // Object.keys(userroles).some((key) => {
+				  // 	if (userroles[key].roleKey == ('' + type)) {
+				  // 		that.$store.dispatch('checkRole', userroles[key]).then(() => {
+				  // 		  that.$tab.reLaunch('/pages/index/index') 
+				  // 		}).catch(() => {
+				  		 
+				  // 		})
+				  // 		return true;
+				  // 	}
+				  // })
+			   // }else{
+				  // this.$tab.reLaunch('/pages/index/index') 
+			   // }
+		   })
+		 },
+		 
+		 async getuserinfo(e) {
+			 // if(!this.checkflag){
+				//  this.$toast("请同意用户协议")
+				//  return
+			 // }
+			 // 判断是不是有学校
+		 	const {iv,encryptedData} = e.detail
+		 	const {nickName, avatarUrl, ...userInfo} = e.detail.userInfo
+			// console.log(e.detail)
+		 	try{
+				uni.login({
+                    provider: 'weixin',
+                    success: (res) => {
+                        // 获取用户信息
+						if(res.code){
+							this.avatarUrl = avatarUrl
+							this.nickName = nickName
+							this.code = res.code
+							this.userInfo =e.detail.userInfo
+							uni.setStorageSync('userInfo', e.detail.userInfo)
+							uni.setStorageSync('lcheckflag',true)
+							this.typeflag=true;
+						}
+                    }
+                })
+		 	} catch(e){
+		 		//TODO handle the exception
+		 	}
+		 },
+	},
+	
+	onLoad: function() {
+		this.getCode()
+		if (getToken()) {
+			this.$tab.reLaunch('/pages/index/index') 
+			// 判断有什么角色
+		} else {
+			this.loginflag=true;
+			// this.getCode()
+			if(uni.getStorageSync('lcheckflag')){
+				this.checkflag=true
+			}else{
+				this.checkflag=false
+			}
+		  if(uni.getStorageSync('account')){
+		  	var newObj=JSON.parse(JSON.stringify(uni.getStorageSync('account')))
+		  	this.loginForm.username=newObj.username;
+		  	this.loginForm.password=newObj.password;
+		  	this.jzflag=true;
+		  }
+		  
+		}	
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+.headimg{width: 136rpx;height: 136rpx;margin:0 auto 36rpx;}
+.mzimg{width: 100rpx;height: 44rpx;margin: 0 auto ;}
+.rtxt{font-size: 32rpx;font-weight: 500;
+color: $com-cd3;text-align: center;}
+.bbcode{position: absolute;width: 100%;text-align: center;left: 0;bottom: -80rpx;font-size: 24rpx;color: #666666;}
+.lread{
+	display: flex;align-items: flex-start;justify-content: center;
+	.lreadl{padding-top: 4rpx;
+		image{width: 28rpx;height: 28rpx;margin-right: 14rpx;}
+	}
+	.tit{font-size: 26rpx;font-weight: 500;color: #666666;line-height: 40rpx;
+	text{color:$com-cd3;text-decoration: underline;padding: 0 6rpx;}
+}
+}
+.tab{
+	.tabtit{font-size: 32rpx;font-weight: 500;color: #666666;padding: 0 24rpx;position: relative;
+	&.act{color: $com-cd3;font-weight: bold;}
+		&::before{content: '';position: absolute;left: 0;top: 50%;margin-top: -10rpx;width: 2rpx;height: 20rpx;background: #DADADA;}
+		&:first-child::before{display: none;}
+	}
+	
+}
+.rbtn {
+		&.btn{background: #9a9c9e;color: #ffffff;}
+		&.btn2{background: $com-cd3;color: #ffffff;}
+      }
+.login-form-content {
+      margin: 0 auto;
+      width: 100%;
+		
+      .input-item {
+        // margin-bottom:48rpx;
+        border-bottom: 2rpx solid #CDCDCD;
+		padding: 40rpx 0 0rpx;
+        .icon {
+          font-size: 40rpx;
+          margin-left: 10px;
+          color: #999;
+        }
+		.login_tit{
+			font-size: 34rpx;
+			font-weight: bold;
+			color: #343434;margin-bottom: 10rpx;
+		}
+		.login_box{display: flex;align-items: center;
+			.rimgs{width: 18rpx;height: 30rpx;flex: 0 0 auto;margin-left: 20rpx;}
+		}
+        .input {
+          width: 100%;
+          font-size: 34rpx;
+		  height: 80rpx;
+		  line-height: 80rpx;
+        }
+
+      }
+
+      
+      .login-code {
+        height: 38px;
+        float: right;
+      
+        .login-code-img {
+          height: 38px;
+          position: absolute;
+          margin-left: 10px;
+          width: 200rpx;
+        }
+      }
+    }
+// .image{width: 32rpx;height: 32rpx;margin-right: 14rpx;}
+.input_ye image{width: 34rpx;height: 18rpx;}
+.codess{font-size: 34rpx;color: $com-cd3;flex: 0 0 auto;min-width: 200rpx;text-align: center;border-left: 2rpx solid #CDCDCD;}
+.codes{background: none;font-size: 28rpx;flex: 0 0 auto;width: 180rpx;text-align: center;border-left: 2rpx solid #CDCDCD;}
+.login_box{display: flex;align-items: center;}
+.login_boxl{width:130rpx;font-size: 34rpx;color: #343434;border-right: 2rpx solid #CDCDCD;}
+.login_txt{text-align: right;flex: 0 0 auto; padding:0 24rpx;
+	text{font-size: 30rrpx;color:#666666;}
+}
+.line{width: 2rpx;height: 24rpx;background: #CDCDCD;margin: 0 10rpx;}
+.login_jz{display: flex;align-items: center;justify-content: flex-end;flex: 0 0 auto;
+	image{width: 30rpx;height: 30rpx;margin-right: 12rpx;}
+	view{color: #666666;font-size: 28rpx;}
+}
+// app
+</style>

+ 75 - 0
pages/mine/about/index.vue

@@ -0,0 +1,75 @@
+<template>
+  <view class="about-container">
+    <view class="header-section text-center">
+      <image style="width: 150rpx;height: 150rpx;" src="/static/logo.png" mode="widthFix">
+      </image>
+      <uni-title type="h2" title="智能校管家"></uni-title>
+    </view>
+
+    <view class="content-section">
+      <view class="menu-list">
+        <view class="list-cell list-cell-arrow">
+          <view class="menu-item-box">
+            <view>版本信息</view>
+            <view class="text-right">v{{version}}</view>
+          </view>
+        </view>
+        <view class="list-cell list-cell-arrow">
+          <view class="menu-item-box">
+            <view>官方邮箱</view>
+            <view class="text-right">ruoyi@xx.com</view>
+          </view>
+        </view>
+        <view class="list-cell list-cell-arrow">
+          <view class="menu-item-box">
+            <view>服务热线</view>
+            <view class="text-right">400-999-9999</view>
+          </view>
+        </view>
+        <view class="list-cell list-cell-arrow">
+          <view class="menu-item-box">
+            <view>公司网站</view>
+            <view class="text-right">
+              <uni-link :href="url" :text="url" showUnderLine="false"></uni-link>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+
+    <view class="copyright">
+      <view>Copyright &copy; 2022 ruoyi.vip All Rights Reserved.</view>
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        url: getApp().globalData.config.appInfo.site_url,
+        version: getApp().globalData.config.appInfo.version
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #f8f8f8;
+  }
+
+  .copyright {
+    margin-top: 50rpx;
+    text-align: center;
+    line-height: 60rpx;
+    color: #999;
+  }
+
+  .header-section {
+    display: flex;
+    padding: 30rpx 0 0;
+    flex-direction: column;
+    align-items: center;
+  }
+</style>

+ 636 - 0
pages/mine/avatar/index.vue

@@ -0,0 +1,636 @@
+<template>
+	<view class="container">
+		<view class="page-body uni-content-info">
+			<view class='cropper-content'>
+				<view v-if="isShowImg" class="uni-corpper" :style="'width:'+cropperInitW+'px;height:'+cropperInitH+'px;background:#000'">
+					<view class="uni-corpper-content" :style="'width:'+cropperW+'px;height:'+cropperH+'px;left:'+cropperL+'px;top:'+cropperT+'px'">
+						<image  :src="imageSrc" :style="'width:'+cropperW+'px;height:'+cropperH+'px'"></image>
+						<view class="uni-corpper-crop-box" @touchstart.stop="contentStartMove" @touchmove.stop="contentMoveing" @touchend.stop="contentTouchEnd"
+						    :style="'left:'+cutL+'px;top:'+cutT+'px;right:'+cutR+'px;bottom:'+cutB+'px'">
+							<view class="uni-cropper-view-box">
+								<view class="uni-cropper-dashed-h"></view>
+								<view class="uni-cropper-dashed-v"></view>
+								<view class="uni-cropper-line-t" data-drag="top" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
+								<view class="uni-cropper-line-r" data-drag="right" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
+								<view class="uni-cropper-line-b" data-drag="bottom" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
+								<view class="uni-cropper-line-l" data-drag="left" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
+								<view class="uni-cropper-point point-t" data-drag="top" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
+								<view class="uni-cropper-point point-tr" data-drag="topTight"></view>
+								<view class="uni-cropper-point point-r" data-drag="right" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
+								<view class="uni-cropper-point point-rb" data-drag="rightBottom" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
+								<view class="uni-cropper-point point-b" data-drag="bottom" @touchstart.stop="dragStart" @touchmove.stop="dragMove" @touchend.stop="dragEnd"></view>
+								<view class="uni-cropper-point point-bl" data-drag="bottomLeft"></view>
+								<view class="uni-cropper-point point-l" data-drag="left" @touchstart.stop="dragStart" @touchmove.stop="dragMove"></view>
+								<view class="uni-cropper-point point-lt" data-drag="leftTop"></view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class='cropper-config'>
+				<button type="primary reverse" @click="getImage" style='margin-top: 30rpx;'> 选择头像 </button>
+				<button type="warn" @click="getImageInfo" style='margin-top: 30rpx;'> 提交 </button>
+			</view>
+			<canvas canvas-id="myCanvas" :style="'position:absolute;border: 1px solid red; width:'+imageW+'px;height:'+imageH+'px;top:-9999px;left:-9999px;'"></canvas>
+		</view>
+	</view>
+</template>
+
+<script>
+  import config from '@/config'
+  import store from "@/store"
+  import { uploadAvatar } from "@/api/system/user"
+  
+  const baseUrl = config.baseUrl
+	let sysInfo = uni.getSystemInfoSync()
+	let SCREEN_WIDTH = sysInfo.screenWidth
+	let PAGE_X, // 手按下的x位置
+		PAGE_Y, // 手按下y的位置 
+		PR = sysInfo.pixelRatio, // dpi
+		T_PAGE_X, // 手移动的时候x的位置
+		T_PAGE_Y, // 手移动的时候Y的位置
+		CUT_L, // 初始化拖拽元素的left值
+		CUT_T, // 初始化拖拽元素的top值
+		CUT_R, // 初始化拖拽元素的
+		CUT_B, // 初始化拖拽元素的
+		CUT_W, // 初始化拖拽元素的宽度
+		CUT_H, //  初始化拖拽元素的高度
+		IMG_RATIO, // 图片比例
+		IMG_REAL_W, // 图片实际的宽度
+		IMG_REAL_H, // 图片实际的高度
+		DRAFG_MOVE_RATIO = 1, //移动时候的比例,
+		INIT_DRAG_POSITION = 100, // 初始化屏幕宽度和裁剪区域的宽度之差,用于设置初始化裁剪的宽度
+		DRAW_IMAGE_W = sysInfo.screenWidth // 设置生成的图片宽度
+
+	export default {
+		/**
+		 * 页面的初始数据
+		 */
+		data() {
+			return {
+				imageurl: store.getters.avatar,
+				avatarimg:require("@/static/images/mine/profile.png"),
+				imageSrc:'',
+				isShowImg: false,
+				// 初始化的宽高
+				cropperInitW: SCREEN_WIDTH,
+				cropperInitH: SCREEN_WIDTH,
+				// 动态的宽高
+				cropperW: SCREEN_WIDTH,
+				cropperH: SCREEN_WIDTH,
+				// 动态的left top值
+				cropperL: 0,
+				cropperT: 0,
+
+				transL: 0,
+				transT: 0,
+
+				// 图片缩放值
+				scaleP: 0,
+				imageW: 0,
+				imageH: 0,
+
+				// 裁剪框 宽高
+				cutL: 0,
+				cutT: 0,
+				cutB: SCREEN_WIDTH,
+				cutR: '100%',
+				qualityWidth: DRAW_IMAGE_W,
+				innerAspectRadio: DRAFG_MOVE_RATIO
+			}
+		},
+		/**
+		 * 生命周期函数--监听页面初次渲染完成
+		 */
+		onReady: function () {
+			this.loadImage()
+		},
+		onLoad:function(){
+			this.imageSrc=this.imageurl?this.imageurl:this.avatarimg
+		},
+		methods: {
+			setData: function (obj) {
+				let that = this
+				Object.keys(obj).forEach(function (key) {
+					that.$set(that.$data, key, obj[key])
+				})
+			},
+			getImage: function () {
+				var _this = this
+				uni.chooseImage({
+					success: function (res) {
+						_this.setData({
+							imageSrc: res.tempFilePaths[0],
+						})
+						_this.loadImage()
+					},
+				})
+			},
+			loadImage: function () {
+				var _this = this
+				
+				uni.getImageInfo({
+					src: _this.imageSrc,
+					success: function success(res) {
+						IMG_RATIO = 1 / 1
+						if (IMG_RATIO >= 1) {
+							IMG_REAL_W = SCREEN_WIDTH
+							IMG_REAL_H = SCREEN_WIDTH / IMG_RATIO
+						} else {
+							IMG_REAL_W = SCREEN_WIDTH * IMG_RATIO
+							IMG_REAL_H = SCREEN_WIDTH
+						}
+						let minRange = IMG_REAL_W > IMG_REAL_H ? IMG_REAL_W : IMG_REAL_H
+						INIT_DRAG_POSITION = minRange > INIT_DRAG_POSITION ? INIT_DRAG_POSITION : minRange
+						// 根据图片的宽高显示不同的效果   保证图片可以正常显示
+						if (IMG_RATIO >= 1) {
+							let cutT = Math.ceil((SCREEN_WIDTH / IMG_RATIO - (SCREEN_WIDTH / IMG_RATIO - INIT_DRAG_POSITION)) / 2)
+							let cutB = cutT
+							let cutL = Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH + INIT_DRAG_POSITION) / 2)
+							let cutR = cutL
+							_this.setData({
+								cropperW: SCREEN_WIDTH,
+								cropperH: SCREEN_WIDTH / IMG_RATIO,
+								// 初始化left right
+								cropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),
+								cropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH / IMG_RATIO) / 2),
+								cutL: cutL,
+								cutT: cutT,
+								cutR: cutR,
+								cutB: cutB,
+								// 图片缩放值
+								imageW: IMG_REAL_W,
+								imageH: IMG_REAL_H,
+								scaleP: IMG_REAL_W / SCREEN_WIDTH,
+								qualityWidth: DRAW_IMAGE_W,
+								innerAspectRadio: IMG_RATIO
+							})
+						} else {
+							let cutL = Math.ceil((SCREEN_WIDTH * IMG_RATIO - (SCREEN_WIDTH * IMG_RATIO)) / 2)
+							let cutR = cutL
+							let cutT = Math.ceil((SCREEN_WIDTH - INIT_DRAG_POSITION) / 2)
+							let cutB = cutT
+							_this.setData({
+								cropperW: SCREEN_WIDTH * IMG_RATIO,
+								cropperH: SCREEN_WIDTH,
+								// 初始化left right
+								cropperL: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH * IMG_RATIO) / 2),
+								cropperT: Math.ceil((SCREEN_WIDTH - SCREEN_WIDTH) / 2),
+
+								cutL: cutL,
+								cutT: cutT,
+								cutR: cutR,
+								cutB: cutB,
+								// 图片缩放值
+								imageW: IMG_REAL_W,
+								imageH: IMG_REAL_H,
+								scaleP: IMG_REAL_W / SCREEN_WIDTH,
+								qualityWidth: DRAW_IMAGE_W,
+								innerAspectRadio: IMG_RATIO
+							})
+						}
+						_this.setData({
+							isShowImg: true
+						})
+						uni.hideLoading()
+					}
+				})
+			},
+			// 拖动时候触发的touchStart事件
+			contentStartMove(e) {
+				PAGE_X = e.touches[0].pageX
+				PAGE_Y = e.touches[0].pageY
+			},
+
+			// 拖动时候触发的touchMove事件
+			contentMoveing(e) {
+				var _this = this
+				var dragLengthX = (PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
+				var dragLengthY = (PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
+				// 左移
+				if (dragLengthX > 0) {
+					if (this.cutL - dragLengthX < 0) dragLengthX = this.cutL
+				} else {
+					if (this.cutR + dragLengthX < 0) dragLengthX = -this.cutR
+				}
+
+				if (dragLengthY > 0) {
+					if (this.cutT - dragLengthY < 0) dragLengthY = this.cutT
+				} else {
+					if (this.cutB + dragLengthY < 0) dragLengthY = -this.cutB
+				}
+				this.setData({
+					cutL: this.cutL - dragLengthX,
+					cutT: this.cutT - dragLengthY,
+					cutR: this.cutR + dragLengthX,
+					cutB: this.cutB + dragLengthY
+				})
+
+				PAGE_X = e.touches[0].pageX
+				PAGE_Y = e.touches[0].pageY
+			},
+
+			contentTouchEnd() {
+
+			},
+
+			// 获取图片
+			getImageInfo() {
+				var _this = this
+				uni.showLoading({
+					title: '图片生成中...',
+				})
+				// 将图片写入画布
+				const ctx = uni.createCanvasContext('myCanvas')
+				ctx.drawImage(_this.imageSrc, 0, 0, IMG_REAL_W, IMG_REAL_H)
+				ctx.draw(true, () => {
+					// 获取画布要裁剪的位置和宽度   均为百分比 * 画布中图片的宽度    保证了在微信小程序中裁剪的图片模糊  位置不对的问题 canvasT = (_this.cutT / _this.cropperH) * (_this.imageH / pixelRatio)
+					var canvasW = ((_this.cropperW - _this.cutL - _this.cutR) / _this.cropperW) * IMG_REAL_W
+					var canvasH = ((_this.cropperH - _this.cutT - _this.cutB) / _this.cropperH) * IMG_REAL_H
+					var canvasL = (_this.cutL / _this.cropperW) * IMG_REAL_W
+					var canvasT = (_this.cutT / _this.cropperH) * IMG_REAL_H
+					uni.canvasToTempFilePath({
+						x: canvasL,
+						y: canvasT,
+						width: canvasW,
+						height: canvasH,
+						destWidth: canvasW,
+						destHeight: canvasH,
+						quality: 0.5,
+						canvasId: 'myCanvas',
+						success: function (res) {
+							uni.hideLoading()
+							let data = {name: 'avatarfile', filePath: res.tempFilePath}
+							uploadAvatar(data).then(response => {
+								store.commit('SET_AVATAR', baseUrl + response.imgUrl)
+								uni.showToast({ title: "修改成功", icon: 'success' })
+								uni.navigateBack()
+							})
+						}
+					})
+				})
+			},
+			// 设置大小的时候触发的touchStart事件
+			dragStart(e) {
+				T_PAGE_X = e.touches[0].pageX
+				T_PAGE_Y = e.touches[0].pageY
+				CUT_L = this.cutL
+				CUT_R = this.cutR
+				CUT_B = this.cutB
+				CUT_T = this.cutT
+			},
+
+			// 设置大小的时候触发的touchMove事件
+			dragMove(e) {
+				var _this = this
+				var dragType = e.target.dataset.drag
+				switch (dragType) {
+					case 'right':
+						var dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
+						if (CUT_R + dragLength < 0) dragLength = -CUT_R
+						this.setData({
+							cutR: CUT_R + dragLength
+						})
+						break
+					case 'left':
+						var dragLength = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
+						if (CUT_L - dragLength < 0) dragLength = CUT_L
+						if ((CUT_L - dragLength) > (this.cropperW - this.cutR)) dragLength = CUT_L - (this.cropperW - this.cutR)
+						this.setData({
+							cutL: CUT_L - dragLength
+						})
+						break
+					case 'top':
+						var dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
+						if (CUT_T - dragLength < 0) dragLength = CUT_T
+						if ((CUT_T - dragLength) > (this.cropperH - this.cutB)) dragLength = CUT_T - (this.cropperH - this.cutB)
+						this.setData({
+							cutT: CUT_T - dragLength
+						})
+						break
+					case 'bottom':
+						var dragLength = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
+						if (CUT_B + dragLength < 0) dragLength = -CUT_B
+						this.setData({
+							cutB: CUT_B + dragLength
+						})
+						break
+					case 'rightBottom':
+						var dragLengthX = (T_PAGE_X - e.touches[0].pageX) * DRAFG_MOVE_RATIO
+						var dragLengthY = (T_PAGE_Y - e.touches[0].pageY) * DRAFG_MOVE_RATIO
+
+						if (CUT_B + dragLengthY < 0) dragLengthY = -CUT_B
+						if (CUT_R + dragLengthX < 0) dragLengthX = -CUT_R
+						let cutB = CUT_B + dragLengthY
+						let cutR = CUT_R + dragLengthX
+
+						this.setData({
+							cutB: cutB,
+							cutR: cutR
+						})
+						break
+					default:
+						break
+				}
+			}
+		}
+	}
+</script>
+
+<style>
+	/* pages/uni-cropper/index.wxss */
+
+	.uni-content-info {
+		/* position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		display: block;
+		align-items: center;
+		flex-direction: column; */
+	}
+
+	.cropper-config {
+		padding: 20rpx 40rpx;
+	}
+
+	.cropper-content {
+		min-height: 750rpx;
+		width: 100%;
+	}
+
+	.uni-corpper {
+		position: relative;
+		overflow: hidden;
+		-webkit-user-select: none;
+		-moz-user-select: none;
+		-ms-user-select: none;
+		user-select: none;
+		-webkit-tap-highlight-color: transparent;
+		-webkit-touch-callout: none;
+		box-sizing: border-box;
+	}
+
+	.uni-corpper-content {
+		position: relative;
+	}
+
+	.uni-corpper-content image {
+		display: block;
+		width: 100%;
+		min-width: 0 !important;
+		max-width: none !important;
+		height: 100%;
+		min-height: 0 !important;
+		max-height: none !important;
+		image-orientation: 0deg !important;
+		margin: 0 auto;
+	}
+	/* 移动图片效果 */
+
+	.uni-cropper-drag-box {
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		cursor: move;
+		background: rgba(0, 0, 0, 0.6);
+		z-index: 1;
+	}
+	/* 内部的信息 */
+
+	.uni-corpper-crop-box {
+		position: absolute;
+		background: rgba(255, 255, 255, 0.3);
+		z-index: 2;
+	}
+
+	.uni-corpper-crop-box .uni-cropper-view-box {
+		position: relative;
+		display: block;
+		width: 100%;
+		height: 100%;
+		overflow: visible;
+		outline: 1rpx solid #69f;
+		outline-color: rgba(102, 153, 255, .75)
+	}
+	/* 横向虚线 */
+
+	.uni-cropper-dashed-h {
+		position: absolute;
+		top: 33.33333333%;
+		left: 0;
+		width: 100%;
+		height: 33.33333333%;
+		border-top: 1rpx dashed rgba(255, 255, 255, 0.5);
+		border-bottom: 1rpx dashed rgba(255, 255, 255, 0.5);
+	}
+	/* 纵向虚线 */
+
+	.uni-cropper-dashed-v {
+		position: absolute;
+		left: 33.33333333%;
+		top: 0;
+		width: 33.33333333%;
+		height: 100%;
+		border-left: 1rpx dashed rgba(255, 255, 255, 0.5);
+		border-right: 1rpx dashed rgba(255, 255, 255, 0.5);
+	}
+	/* 四个方向的线  为了之后的拖动事件*/
+
+	.uni-cropper-line-t {
+		position: absolute;
+		display: block;
+		width: 100%;
+		background-color: #69f;
+		top: 0;
+		left: 0;
+		height: 1rpx;
+		opacity: 0.1;
+		cursor: n-resize;
+	}
+
+	.uni-cropper-line-t::before {
+		content: '';
+		position: absolute;
+		top: 50%;
+		right: 0rpx;
+		width: 100%;
+		-webkit-transform: translate3d(0, -50%, 0);
+		transform: translate3d(0, -50%, 0);
+		bottom: 0;
+		height: 41rpx;
+		background: transparent;
+		z-index: 11;
+	}
+
+	.uni-cropper-line-r {
+		position: absolute;
+		display: block;
+		background-color: #69f;
+		top: 0;
+		right: 0rpx;
+		width: 1rpx;
+		opacity: 0.1;
+		height: 100%;
+		cursor: e-resize;
+	}
+
+	.uni-cropper-line-r::before {
+		content: '';
+		position: absolute;
+		top: 0;
+		left: 50%;
+		width: 41rpx;
+		-webkit-transform: translate3d(-50%, 0, 0);
+		transform: translate3d(-50%, 0, 0);
+		bottom: 0;
+		height: 100%;
+		background: transparent;
+		z-index: 11;
+	}
+
+	.uni-cropper-line-b {
+		position: absolute;
+		display: block;
+		width: 100%;
+		background-color: #69f;
+		bottom: 0;
+		left: 0;
+		height: 1rpx;
+		opacity: 0.1;
+		cursor: s-resize;
+	}
+
+	.uni-cropper-line-b::before {
+		content: '';
+		position: absolute;
+		top: 50%;
+		right: 0rpx;
+		width: 100%;
+		-webkit-transform: translate3d(0, -50%, 0);
+		transform: translate3d(0, -50%, 0);
+		bottom: 0;
+		height: 41rpx;
+		background: transparent;
+		z-index: 11;
+	}
+
+	.uni-cropper-line-l {
+		position: absolute;
+		display: block;
+		background-color: #69f;
+		top: 0;
+		left: 0;
+		width: 1rpx;
+		opacity: 0.1;
+		height: 100%;
+		cursor: w-resize;
+	}
+
+	.uni-cropper-line-l::before {
+		content: '';
+		position: absolute;
+		top: 0;
+		left: 50%;
+		width: 41rpx;
+		-webkit-transform: translate3d(-50%, 0, 0);
+		transform: translate3d(-50%, 0, 0);
+		bottom: 0;
+		height: 100%;
+		background: transparent;
+		z-index: 11;
+	}
+
+	.uni-cropper-point {
+		width: 5rpx;
+		height: 5rpx;
+		background-color: #69f;
+		opacity: .75;
+		position: absolute;
+		z-index: 3;
+	}
+
+	.point-t {
+		top: -3rpx;
+		left: 50%;
+		margin-left: -3rpx;
+		cursor: n-resize;
+	}
+
+	.point-tr {
+		top: -3rpx;
+		left: 100%;
+		margin-left: -3rpx;
+		cursor: n-resize;
+	}
+
+	.point-r {
+		top: 50%;
+		left: 100%;
+		margin-left: -3rpx;
+		margin-top: -3rpx;
+		cursor: n-resize;
+	}
+
+	.point-rb {
+		left: 100%;
+		top: 100%;
+		-webkit-transform: translate3d(-50%, -50%, 0);
+		transform: translate3d(-50%, -50%, 0);
+		cursor: n-resize;
+		width: 36rpx;
+		height: 36rpx;
+		background-color: #69f;
+		position: absolute;
+		z-index: 1112;
+		opacity: 1;
+	}
+
+	.point-b {
+		left: 50%;
+		top: 100%;
+		margin-left: -3rpx;
+		margin-top: -3rpx;
+		cursor: n-resize;
+	}
+
+	.point-bl {
+		left: 0%;
+		top: 100%;
+		margin-left: -3rpx;
+		margin-top: -3rpx;
+		cursor: n-resize;
+	}
+
+	.point-l {
+		left: 0%;
+		top: 50%;
+		margin-left: -3rpx;
+		margin-top: -3rpx;
+		cursor: n-resize;
+	}
+
+	.point-lt {
+		left: 0%;
+		top: 0%;
+		margin-left: -3rpx;
+		margin-top: -3rpx;
+		cursor: n-resize;
+	}
+	/* 裁剪框预览内容 */
+
+	.uni-cropper-viewer {
+		position: relative;
+		width: 100%;
+		height: 100%;
+		overflow: hidden;
+	}
+
+	.uni-cropper-viewer image {
+		position: absolute;
+		z-index: 2;
+	}
+</style>

+ 112 - 0
pages/mine/help/index.vue

@@ -0,0 +1,112 @@
+<template>
+  <view class="help-container">
+    <view v-for="(item, findex) in list" :key="findex" :title="item.title" class="list-title">
+      <view class="text-title">
+        <view :class="item.icon"></view>{{ item.title }}
+      </view>
+      <view class="childList">
+        <view v-for="(child, zindex) in item.childList" :key="zindex" class="question" hover-class="hover"
+          @click="handleText(child)">
+          <view class="text-item">{{ child.title }}</view>
+          <view class="line" v-if="zindex !== item.childList.length - 1"></view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        list: [{
+            icon: 'iconfont icon-github',
+            title: '若依问题',
+            childList: [{
+              title: '若依开源吗?',
+              content: '开源'
+            }, {
+              title: '若依可以商用吗?',
+              content: '可以'
+            }, {
+              title: '若依官网地址多少?',
+              content: 'http://ruoyi.vip'
+            }, {
+              title: '若依文档地址多少?',
+              content: 'http://doc.ruoyi.vip'
+            }]
+          },
+          {
+            icon: 'iconfont icon-help',
+            title: '其他问题',
+            childList: [{
+              title: '如何退出登录?',
+              content: '请点击[我的] - [应用设置] - [退出登录]即可退出登录',
+            }, {
+              title: '如何修改用户头像?',
+              content: '请点击[我的] - [选择头像] - [点击提交]即可更换用户头像',
+            }, {
+              title: '如何修改登录密码?',
+              content: '请点击[我的] - [应用设置] - [修改密码]即可修改登录密码',
+            }]
+          }
+        ]
+      }
+    },
+    methods: {
+      handleText(item) {
+        this.$tab.navigateTo(`/pages/common/textview/index?title=${item.title}&content=${item.content}`)
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  page {
+    background-color: #f8f8f8;
+  }
+
+  .help-container {
+    margin-bottom: 100rpx;
+    padding: 30rpx;
+  }
+
+  .list-title {
+    margin-bottom: 30rpx;
+  }
+
+  .childList {
+    background: #ffffff;
+    box-shadow: 0px 0px 10rpx rgba(193, 193, 193, 0.2);
+    border-radius: 16rpx;
+    margin-top: 10rpx;
+  }
+
+  .line {
+    width: 100%;
+    height: 1rpx;
+    background-color: #F5F5F5;
+  }
+
+  .text-title {
+    color: #303133;
+    font-size: 32rpx;
+    font-weight: bold;
+    margin-left: 10rpx;
+
+    .iconfont {
+      font-size: 16px;
+      margin-right: 10rpx;
+    }
+  }
+
+  .text-item {
+    font-size: 28rpx;
+    padding: 24rpx;
+  }
+
+  .question {
+    color: #606266;
+    font-size: 28rpx;
+  }
+</style>

+ 502 - 0
pages/mine/index.vue

@@ -0,0 +1,502 @@
+<template>
+  <view class="mine-container" >
+    <!--顶部个人信息栏-->
+		<view class="home_top">
+		  <uni-nav-bar title="我的" :background-color="backgroundColor" :border="navborder" statusBar='true' fixed="true">
+			  <!-- checkPermi(['system:notice:list']) -->
+			  <!-- <block slot="left" >
+			  		<view class="min_top" @click="getMessage">
+			  			<image :src="noticimg"></image>
+						<view class="circ"></view>
+			  		</view>
+			  </block> -->
+		  </uni-nav-bar> 
+	  </view>
+	  <image :src="abg" class="abg"></image>
+	 
+	<view style="margin-top: -487rpx;position: relative;padding:0 34rpx 20rpx;">
+		<view class="header_top flexc mb6" @click="handleToinfo">
+			<image v-if="avatar" @click.stop="handleToAvatar" :src="avatar" class="flex0 limg" mode="aspectFill"></image>
+			<image v-else @click.stop="handleToAvatar" :src="avatarimg" class="flex0 limg" mode="aspectFill"></image>
+			<view class="flex1 hcen">
+				<view class="f17 fw c16 mb8 flexc">{{name}}
+				<text v-if="choseroles=='teacher'">老师</text>
+				<text v-if="choseroles=='school'">学校管理员</text>
+				<text v-if="choseroles=='parents'">家长</text>
+				</view>
+				<view class="f15 co6" v-if="choseroles=='teacher'">{{schoolName}}/{{discipline}}</view>
+				<view class="f15 co6" v-else-if="choseroles!='parents'" >{{schoolName}}</view>
+			</view>
+			<image :src="rimg" class="flex0 rimg"></image>
+		</view>
+		<view class="mnbox">
+			<view class="mn_tit">账号设置</view>
+			<view class="mn_list">
+				<view class="mlist flexc"  @click="handleUpassword">
+					<view class="mlistl"><image :src="miconj" class="imgh"></image></view>
+					<view class="mlistc">修改密码</view>
+				</view>
+				<view class="mlist flexc"  @click="handlePrivacy">
+					<view class="mlistl"><image :src="miconf" class="imgd"></image></view>
+					<view class="mlistc">用户协议</view>
+				</view>
+				<view class="mlist flexc"  @click="handleLogout">
+					<view class="mlistl"><image :src="miconl" class="imgc"></image></view>
+					<view class="mlistc">退出登录</view>
+				</view>
+			</view>
+		</view>
+	</view>
+	<footers v-if="isfootflag" :footlist="footlist" :footerindex="footerindex" :color_checked="color_checked" :color_nochecked="color_nochecked" :isHomeIndex="true"></footers>
+ </view>
+</template>
+
+<script>
+	import footers from '@/components/footer/footer.vue'
+  import config from '@/config'
+  const baseUrl = config.baseUrl
+  import storage from '@/utils/storage'
+  import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+  import {getInfo } from '@/api/login'
+  
+  export default {
+	components:{footers},
+    data() {
+      return {
+		  footlist:[
+		  	{module:'home',title:'首页',icon_checked:require('@/static/images/tabbar/home_.png'),icon_nochecked:require('@/static/images/tabbar/home.png')},
+		  	{module:'mine',title:'我的',icon_checked:require('@/static/images/tabbar/mine_.png'),icon_nochecked:require('@/static/images/tabbar/mine.png')},
+		  	],
+		  footerindex:'mine',
+		  isfootflag:true,
+		  color_checked :'161616',
+		  color_nochecked :'666666',
+		  abg:require('@/static/images/mine/habg.png'),
+		  noticimg:require('@/static/images/mine/mnotic.png'),
+		  rimg:require('@/static/images/mine/rimg.png'),
+		  wrimg:require('@/static/images/mine/wrimg.png'),	 
+		  miconf:require('@/static/images/mine/miconf.png'),
+		  miconj:require('@/static/images/mine/miconj.png'),
+		  miconl:require('@/static/images/mine/miconl.png'),
+		
+		type:0,
+		confdat:{tit:'系统提示',txt:"确定注销并退出系统吗?",closetxt:'取消',suretxt:'确认'},
+		  backgroundColor:"transparent",
+		  navborder:false,
+		  timetit:'',
+		  timelist:[],
+		  timetype:'',
+		  discipline:'',
+		  schoolName:'',
+		  schoolId:'',
+		  classId:'',
+		  
+		  teacherClass:[],
+		  roles:'',
+		  baseUrl:'',
+        name: this.$store.state.user.name,
+		avatarimg:require("@/static/images/mine/profile.png"),
+        // version: getApp().globalData.config.appInfo.version
+      }
+    },
+    computed: {
+      avatar() {
+        return this.$store.state.user.avatar
+      },
+	  choseroles() {
+	    return this.$store.state.user.choseroles
+	  },
+      windowHeight() {
+        return uni.getSystemInfoSync().windowHeight - 50
+      }
+    },
+	onUnload(){
+		uni.$off('refreshdatalis')
+	},
+	onPullDownRefresh:function(){
+		this.init();
+		this.getClassFn();
+		setTimeout(function () {
+			uni.stopPullDownRefresh();
+		}, 1000);
+	},
+	onShow() {
+		var choseroles=this.$store.state.user.choseroles;
+		if(this.roles&&choseroles&&this.roles!=choseroles){
+			this.roles=choseroles;
+			this.schoolName=this.$store.state.user.deptName
+			// 当前人的角色
+			if(uni.getStorageSync('checkclass')&&choseroles=='teacher'){
+				var newobj=JSON.parse(JSON.stringify(uni.getStorageSync('checkclass')))
+				this.discipline=newobj.discipline;
+				this.schoolName=newobj.schoolName;
+				this.schoolId=newobj.schoolId;
+				this.classId=newobj.classId;
+			}
+		}
+	},
+	onLoad() {
+		this.baseUrl=baseUrl;
+		// var choseroles=this.$store.state.user.choseroles;
+		// this.roles=choseroles;
+		// this.schoolName=this.$store.state.user.deptName
+		// // 当前人的角色
+		// if(uni.getStorageSync('checkclass')&&choseroles=='teacher'){
+		// 	var newobj=JSON.parse(JSON.stringify(uni.getStorageSync('checkclass')))
+		// 	this.discipline=newobj.discipline;
+		// 	this.schoolName=newobj.schoolName;
+		// 	this.schoolId=newobj.schoolId;
+		// 	this.classId=newobj.classId;
+		// }
+
+			
+		
+		// uni.$on('refreshdatalis',(e) => {
+		// 	this.getClassFn();
+		// })
+		// this.getClassFn()
+	},
+	onPageScroll(e) {
+		var scrollTop=Number(e.scrollTop);
+		if(scrollTop>0){
+			this.backgroundColor='#c4defb'
+		}else{
+			this.backgroundColor='transparent'
+		}
+	},
+    methods: {
+		checkPermi, checkRole,
+		handleLogout() {
+				  this.type=1
+		  // this.$modal.confirm('确定注销并退出系统吗?').then(() => {
+		  //   this.$store.dispatch('LogOut').then(() => {
+		  //     this.$tab.reLaunch('/pages/index/index')
+		  //   })
+		  // })
+		},
+		getConfirm(){
+			this.$store.dispatch('LogOut').then(() => {
+			  this.$tab.reLaunch('/pages/index/index')
+			})
+		},
+		getClassFn(){
+			var that=this;
+			var choseroles=this.$store.state.user.choseroles||'';
+			if(choseroles=='school'){
+				that.classId='';
+				that.schoolId=that.$store.state.user.deptId;
+				that.getclassListFn()
+			}else{
+				// this.$store.dispatch('GetInforoles').then(resd => {
+				// 	if(resd.code==200){
+				// 		var roles=that.$store.state.user.choseroles;
+				// 		that.roles=roles;
+				// 		var res=resd.data;
+				// 		if(roles=='teacher'){
+				// 		 if(res.user&&res.user.teacherClass&&res.user.teacherClass.length){
+				// 			var newArr=res.user.teacherClass;
+				// 			that.teacherClass = newArr.map(v => {
+				// 				return {
+				// 					dictLabel: v.className,
+				// 					dictValue: v.classId
+				// 				}
+				// 			})
+				// 		 }
+				// 		}else if(roles=='parents'){
+				// 		}else{
+				// 			// 学校
+				// 			that.classId='';
+				// 			that.schoolId=that.$store.state.user.deptId;
+				// 			that.getclassListFn()
+				// 		}
+				// 	}
+					
+				// })
+			}
+			
+			// getInfo().then(res=>{
+			// 	if(res.code==200){
+			// 		if(res.user&&res.user.teacherClass&&res.user.teacherClass.length){
+			// 			var newArr=res.user.teacherClass;
+			// 			that.teacherClass = newArr.map(v => {
+			// 				return {
+			// 					dictLabel: v.className,
+			// 					dictValue: v.classId
+			// 				}
+			// 			})
+			// 		}
+			// 	}
+			// })
+		},
+		// 班级
+		getclassListFn(){
+			getDeptList(this.schoolId).then(res=>{
+				if(res.code==200){
+					this.teacherClass = res.data.map(v => {
+						return {
+							dictLabel: v.deptName,
+							dictValue:v.deptId
+						}
+					})
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+		},
+		handleAuth(){
+			var roles=this.$store.state.user.roles;
+			if(roles.length>0){
+				this.$tab.navigateTo('/mine/pages/mine/auth') 
+			}else{
+				//当前只有一种身份
+				this.$toast("您当前只有一种身份")
+				// this.$tab.reLaunch('/pages/index/index') 
+			}
+		},
+		handleaddAuth(){
+			this.$tab.navigateTo('/mine/pages/mine/auth?type=add') 
+		},
+		handleCollect(){
+			 this.$tab.navigateTo('/mine/pages/trends/mycollect')
+		},
+		handleToinfo(){
+			 this.$tab.navigateTo('/mine/pages/mine/exit')
+		},
+		handlePrivacy(){
+			this.$tab.navigateTo(`/pages/agreement`)  
+		},
+		handleUpassword(){
+			this.$tab.navigateTo(`/pages/mine/pwd/index`)  
+		},
+		handleSchool(){
+			var id=this.$store.state.user.deptId
+			this.$tab.navigateTo('/mine/pages/mine/applyregister?type=update&id='+id)
+			// this.$tab.navigateTo('/mine/pages/mine/applyteacher')
+		},
+		handleWord(){
+			this.$tab.navigateTo('/mine/pages/mine/word')
+		},
+		handleQuery(){
+			this.$tab.navigateTo('/mine/pages/login/query?from=mine')
+		},
+		handleClass(){
+			this.$tab.navigateTo('/mine/pages/mine/addclass')
+		},
+		handlelimit(){
+			this.$tab.navigateTo('/mine/pages/mine/limit')
+		},
+		handleClassSet(){
+			this.$tab.navigateTo('/mine/pages/mine/setclass')
+		},
+		handleaddStu(){
+			this.$tab.navigateTo('/mine/pages/mine/setstuent')
+		},
+		handleTime(e){
+			this.type=5;
+			this.timetype=e;
+		},
+		getKeyNext(data){
+			this.type=3;
+			this.classId=data;
+			this.getConfigKey(data)
+		},
+		handleZhaccount(){
+			this.$tab.navigateTo('/work/pages/examine/zhaccount')
+		},
+		handleTkcourse(){
+			this.$tab.navigateTo('/work/pages/examine/tkcourse')
+		},
+		handleToAvatar() {
+		  this.$tab.navigateTo('/pages/mine/avatar/index')
+		},
+		getKeyFn(data){
+			var params={
+				'configKey':this.classId,
+				'configValue':data,
+				"configType":this.timetype
+			}
+			getupdConfigKey(params).then(res=>{
+				if(res.code==200){
+					this.$toast('修改成功')
+					this.type=0;
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+		},
+		getClose(){
+			this.type=0
+		},
+		getConfigKey(e){
+			var params={
+				configType:this.timetype,
+				configKey:e
+			}
+			//班级id
+			// configType "1:准备下课 2:延迟下课",
+			getConfigKey(params).then(res=>{
+				if(res.code==200){
+					this.type=3
+					this.timetit=res.msg||5;
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+		},
+		
+		
+      handleToInfo() {
+        this.$tab.navigateTo('/pages/mine/info/index')
+      },
+      handleToEditInfo() {
+        this.$tab.navigateTo('/pages/mine/info/edit')
+      },
+      handleToSetting() {
+        this.$tab.navigateTo('/pages/mine/setting/index')
+      },
+      handleToLogin() {
+        this.$tab.reLaunch('/pages/login')
+      },
+      
+      handleLogout() {
+        this.$modal.confirm('确定注销并退出系统吗?').then(() => {
+          this.$store.dispatch('LogOut').then(() => {
+            this.$tab.reLaunch('/pages/index/index')
+          })
+        })
+      },
+      handleHelp() {
+        this.$tab.navigateTo('/pages/mine/help/index')
+      },
+      handleAbout() {
+        this.$tab.navigateTo('/pages/mine/about/index')
+      },
+      handleJiaoLiuQun() {
+        this.$modal.showToast('QQ群:133713780')
+      },
+      handleBuilding() {
+        this.$modal.showToast('模块建设中~')
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #f5f6f7;
+  }
+  .home_top /deep/ .uni-navbar__placeholder{height: 0 !important;}
+.abg{width: 100%;height: 622rpx;}
+.min_top{position: relative;width: 40rpx;height: 40rpx;display: flex;align-items: center;justify-content: center;
+	image{width: 32rpx;height: 32rpx;}
+	.circ{width: 12rpx;height: 12rpx;background: #EB5663;border-radius: 50%;position: absolute;right: 4rpx;top: 4rpx;}
+}
+.header_top{padding: 34rpx 26rpx;
+	.limg{width: 120rpx;height: 120rpx;border-radius: 50%;margin-right: 26rpx;}
+	.rimg{width: 14rpx;height: 24rpx;margin-left: 26rpx;}
+	.hcen{
+		text{height: 34rpx;background: #89A8F6;border-radius: 16rpx;line-height: 34rpx;font-weight: normal;font-size: 24rpx;color: #ffffff;display: inline-block;min-width: 78rpx;padding: 0 10rpx;box-sizing: border-box;margin-left: 24rpx;}
+	}
+}
+.bgf{
+	.mlist{padding:30rpx 34rpx;
+		.mlistl{width: 40rpx;height: 40rpx;display: flex;align-items: center;justify-content: center;margin-right: 16rpx;
+			.imga{width: 38rpx;height: 38rpx;}
+			.imgb{width: 32rpx;height: 32rpx;}
+			.imgc{width: 30rpx;height: 30rpx;}
+			.imgd{width: 32rpx;height: 34rpx;}
+			.imge{width: 32rpx;height: 26rpx;}
+			.imgf{width: 32rpx;height: 30rpx;}
+			.imgg{width: 34rpx;height: 34rpx;}
+			.imgi{width: 34rpx;height: 34rpx;}
+			.imgk{width: 32rpx;height: 30rpx;}
+		}
+		.mlistc{flex: 1;font-size: 32rpx;font-weight: 500;
+	color: #161616;}
+		.mlistr{width: 14rpx;height: 24rpx;marign-left:16rpx}
+	}
+}
+
+.mnbox{
+	background: #FFFFFF;border-radius: 18rpx;margin-bottom: 24rpx;padding: 40rpx 0 16rpx;
+	.mn_tit{font-size: 32rpx;font-weight: bold;
+color: #161616;padding-left: 68rpx;position: relative;margin-bottom: 12rpx;
+		&::before{width: 6rpx;background: $com-cd3;border-radius: 4rpx;position: absolute;left: 36rpx;top: 4rpx;content: '';bottom: 4rpx;}
+	}
+	.mn_list{display: flex;flex-wrap: wrap;
+		.mlist{width: 25%;box-sizing: border-box;display: flex;flex-direction: column;align-items: center;padding: 26rpx 0;
+			.mlistl{width: 50rpx;height: 50rpx;display: flex;align-items: center;justify-content: center;margin-bottom: 16rpx;
+				.imga{width: 42rpx;height: 44rpx;}
+				.imgb{width: 44rpx;height: 44rpx;}
+				.imgc{width: 44rpx;height: 42rpx;}
+				.imgd{width: 42rpx;height: 44rpx;}
+				.imge{width: 44rpx;height: 42rpx;}
+				.imgf{width: 32rpx;height: 30rpx;}
+				.imgg{width: 44rpx;height: 44rpx;}
+				.imgh{width: 40rpx;height: 44rpx;}
+				.imgk{width: 40rpx;height: 42rpx;}
+			}
+			.mlistc{flex: 1;font-size: 30rpx;font-weight: 500;color: #666666;}
+		}
+	}
+	
+}
+
+
+  .mine-container {
+    width: 100%;
+    height: 100%;
+
+
+    .header-section {
+      padding: 15px 15px 45px 15px;
+      color: white;
+
+      .login-tip {
+        font-size: 18px;
+        margin-left: 10px;
+      }
+
+      .cu-avatar {
+        border: 2px solid #eaeaea;
+
+        .icon {
+          font-size: 40px;
+        }
+      }
+
+      .user-info {
+        margin-left: 15px;
+
+        .u_title {
+          font-size: 18px;
+          line-height: 30px;
+        }
+      }
+    }
+
+    .content-section {
+      position: relative;
+      top: -50px;
+
+      .mine-actions {
+        margin: 15px 15px;
+        padding: 20px 0px;
+        border-radius: 8px;
+        background-color: white;
+
+        .action-item {
+          .icon {
+            font-size: 28px;
+          }
+
+          .text {
+            display: block;
+            font-size: 13px;
+            margin: 8px 0px;
+          }
+        }
+      }
+    }
+  }
+</style>

+ 127 - 0
pages/mine/info/edit.vue

@@ -0,0 +1,127 @@
+<template>
+  <view class="container">
+    <view class="example">
+      <uni-forms ref="form" :model="user" labelWidth="80px">
+        <uni-forms-item label="用户昵称" name="nickName">
+          <uni-easyinput v-model="user.nickName" placeholder="请输入昵称" />
+        </uni-forms-item>
+        <uni-forms-item label="手机号码" name="phonenumber">
+          <uni-easyinput v-model="user.phonenumber" placeholder="请输入手机号码" />
+        </uni-forms-item>
+        <uni-forms-item label="邮箱" name="email">
+          <uni-easyinput v-model="user.email" placeholder="请输入邮箱" />
+        </uni-forms-item>
+        <uni-forms-item label="性别" name="sex" required>
+          <uni-data-checkbox v-model="user.sex" :localdata="sexs" />
+        </uni-forms-item>
+      </uni-forms>
+      <button type="primary" @click="submit">提交</button>
+    </view>
+  </view>
+</template>
+
+<script>
+  import { getUserProfile } from "@/api/system/user"
+  import { updateUserProfile } from "@/api/system/user"
+
+  export default {
+    data() {
+      return {
+        user: {
+          nickName: "",
+          phonenumber: "",
+          email: "",
+          sex: ""
+        },
+        sexs: [{
+          text: '男',
+          value: "0"
+        }, {
+          text: '女',
+          value: "1"
+        }],
+        rules: {
+          nickName: {
+            rules: [{
+              required: true,
+              errorMessage: '用户昵称不能为空'
+            }]
+          },
+          phonenumber: {
+            rules: [{
+              required: true,
+              errorMessage: '手机号码不能为空'
+            }, {
+              pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
+              errorMessage: '请输入正确的手机号码'
+            }]
+          },
+          email: {
+            rules: [{
+              required: true,
+              errorMessage: '邮箱地址不能为空'
+            }, {
+              format: 'email',
+              errorMessage: '请输入正确的邮箱地址'
+            }]
+          }
+        }
+      }
+    },
+    onLoad() {
+      this.getUser()
+    },
+    onReady() {
+      this.$refs.form.setRules(this.rules)
+    },
+    methods: {
+      getUser() {
+        getUserProfile().then(response => {
+          this.user = response.data
+        })
+      },
+      submit(ref) {
+        this.$refs.form.validate().then(res => {
+          updateUserProfile(this.user).then(response => {
+            this.$modal.msgSuccess("修改成功")
+          })
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #ffffff;
+  }
+
+  .example {
+    padding: 15px;
+    background-color: #fff;
+  }
+
+  .segmented-control {
+    margin-bottom: 15px;
+  }
+
+  .button-group {
+    margin-top: 15px;
+    display: flex;
+    justify-content: space-around;
+  }
+
+  .form-item {
+    display: flex;
+    align-items: center;
+    flex: 1;
+  }
+
+  .button {
+    display: flex;
+    align-items: center;
+    height: 35px;
+    line-height: 35px;
+    margin-left: 10px;
+  }
+</style>

+ 44 - 0
pages/mine/info/index.vue

@@ -0,0 +1,44 @@
+<template>
+  <view class="container">
+    <uni-list>
+      <uni-list-item showExtraIcon="true" :extraIcon="{type: 'person-filled'}" title="昵称" :rightText="user.nickName" />
+      <uni-list-item showExtraIcon="true" :extraIcon="{type: 'phone-filled'}" title="手机号码" :rightText="user.phonenumber" />
+      <uni-list-item showExtraIcon="true" :extraIcon="{type: 'email-filled'}" title="邮箱" :rightText="user.email" />
+      <uni-list-item showExtraIcon="true" :extraIcon="{type: 'auth-filled'}" title="岗位" :rightText="postGroup" />
+      <uni-list-item showExtraIcon="true" :extraIcon="{type: 'staff-filled'}" title="角色" :rightText="roleGroup" />
+      <uni-list-item showExtraIcon="true" :extraIcon="{type: 'calendar-filled'}" title="创建日期" :rightText="user.createTime" />
+    </uni-list>
+  </view>
+</template>
+
+<script>
+  import { getUserProfile } from "@/api/system/user"
+
+  export default {
+    data() {
+      return {
+        user: {},
+        roleGroup: "",
+        postGroup: ""
+      }
+    },
+    onLoad() {
+      this.getUser()
+    },
+    methods: {
+      getUser() {
+        getUserProfile().then(response => {
+          this.user = response.data
+          this.roleGroup = response.roleGroup
+          this.postGroup = response.postGroup
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #ffffff;
+  }
+</style>

+ 121 - 0
pages/mine/pwd/forgetpwd.vue

@@ -0,0 +1,121 @@
+<template>
+  <view class="pwd-retrieve-container pwd">
+    <uni-forms ref="form" :value="user" >
+      <uni-forms-item name="phonenumber" label="手机号码">
+        <uni-easyinput :inputBorder="false" type="number"  v-model="phonenumber" placeholder="请输入您的手机号码" />
+      </uni-forms-item>
+      <uni-forms-item name="code" label="验证码">
+        <uni-easyinput :inputBorder="false" v-model="code" placeholder="请输入验证码" />
+		<view class="line flex0"></view>
+		<view v-if="timefalg" class="code act">{{time}}秒</view>
+		<view v-else @click="getCode" class="code">发送验证码</view>
+	  </uni-forms-item>
+      <view class="rbtn" @click="submit">下一步</view>
+    </uni-forms>
+  </view>
+</template>
+
+<script>
+  import { getappForgetPW } from "@/api/system/user"
+
+  export default {
+    data() {
+      return {
+		timefalg:false,
+		time:'',
+		phonenumber:'',
+		code:'',
+		newcode:'',//验证码
+		user:{},
+      }
+    },
+    onReady() {
+    },
+    methods: {
+		getCode(){
+			var that=this;
+			if (!this.phonenumber ) {
+				that.$toast("请输入手机号")
+				return
+			}
+			let regphone = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
+			if (this.phonenumber && !regphone.test(this.phonenumber)) {
+				that.$toast("请输入正确的手机号")
+				return
+			}
+			getappForgetPW(this.phonenumber).then(res=>{
+				if (res.code == 200) {
+					// 发送验证码
+					that.$toast("发送成功")
+					that.newcode=res.msg
+					that.time=60;
+					that.timefalg=true;
+					that.setTimein()
+				} else {
+					that.$toast(res.msg)
+				}
+				// 判断是不是对等的
+				// that.getCodesend(that.phonenumber)
+			})
+		},
+		// 验证码倒计时
+		setTimein(){
+			var that=this;
+			clearInterval(that.timer)
+			that.timer=setInterval(()=>{
+				if(that.time<=1){
+					that.timefalg=false;
+					that.time=60;
+					clearInterval(that.timer)
+				}
+				that.time=that.time-1;
+			},1000)
+		},
+      submit() {
+		var that = this;
+		if (!this.phonenumber ) {
+			that.$toast("请输入手机号")
+			return
+		}
+		if (!this.code ) {
+			that.$toast("请输入验证码")
+			return
+		}
+		if(this.code!=this.newcode){
+			that.$toast("验证码错误,请重新输入")
+			return
+		}
+		let regphone = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
+		if (this.phonenumber && !regphone.test(this.phonenumber)) {
+			that.$toast("请输入正确的手机号")
+			return
+		}
+		this.$tab.navigateTo(`/pages/mine/pwd/resetpwd?phone=`+this.phonenumber+'&code='+this.code)
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #f5f5f5;
+  }
+  .line{width: 2rpx;height: 24rpx;background: #CDCDCD;margin: 0 24rpx;}
+	.code{font-size: 30rpx;color: $com-cd3;
+		&.act{color: #666666;}
+	}
+  .pwd-retrieve-container {
+    padding: 10rpx 36rpx;
+  }
+  .pwd .rbtn{width: 100%;height: 98rpx;background: $com-cd3;border-radius: 49rpx;text-align: center;line-height: 98rpx;font-size: 32rpx;font-weight: bold;color: #FFFEFE;margin-top: 68rpx;}
+  .pwd /deep/ .uni-forms-item{height: 126rpx;background: #FFFFFF;border-radius: 18rpx;margin-top: 30rpx;padding: 0 40rpx;box-sizing: border-box;display: flex;align-items: center;margin-bottom: 0;}
+  .pwd /deep/ .uni-forms-item__label{font-size: 32rpx;font-weight: 500;
+color: #161616;flex: 0 0 auto;width: auto !important;}
+  .pwd /deep/ .uni-easyinput{flex: 1;text-align: right;font-size: 32rpx;color: #161616;}
+  .pwd /deep/ .uni-forms-item__content{display: flex;align-items: center;flex-direction: row;}
+  .pwd /deep/ .uni-easyinput__placeholder-class{font-size: 30rpx;}
+  .pwd /deep/ .uni-easyinput__content-input{font-size: 30rpx;}
+   .pwd /deep/ .uni-forms-item__error{margin-top:20rpx;left: auto;right: 0;}
+  
+
+</style>

+ 99 - 0
pages/mine/pwd/index.vue

@@ -0,0 +1,99 @@
+<template>
+  <view class="pwd-retrieve-container pwd">
+    <uni-forms ref="form" :value="user" >
+      <uni-forms-item name="oldPassword" label="旧密码">
+        <uni-easyinput :inputBorder="false" type="password" v-model="user.oldPassword" placeholder="请输入旧密码" />
+      </uni-forms-item>
+      <uni-forms-item name="newPassword" label="新密码">
+        <uni-easyinput :inputBorder="false" type="password" v-model="user.newPassword" placeholder="请输入新密码" />
+      </uni-forms-item>
+      <uni-forms-item name="confirmPassword" label="确认密码">
+        <uni-easyinput :inputBorder="false" type="password" v-model="user.confirmPassword" placeholder="请确认新密码" />
+      </uni-forms-item>
+      <view class="rbtn" @click="submit">提交</view>
+    </uni-forms>
+  </view>
+</template>
+
+<script>
+  import { updateUserPwd } from "@/api/system/user"
+
+  export default {
+    data() {
+      return {
+        user: {
+          oldPassword: undefined,
+          newPassword: undefined,
+          confirmPassword: undefined
+        },
+        rules: {
+          oldPassword: {
+            rules: [{
+              required: true,
+              errorMessage: '旧密码不能为空'
+            }]
+          },
+          newPassword: {
+            rules: [{
+                required: true,
+                errorMessage: '新密码不能为空',
+              },
+              {
+                minLength: 6,
+                maxLength: 20,
+                errorMessage: '长度在 6 到 20 个字符'
+              }
+            ]
+          },
+          confirmPassword: {
+            rules: [{
+                required: true,
+                errorMessage: '确认密码不能为空'
+              }, {
+                validateFunction: (rule, value, data) => data.newPassword === value,
+                errorMessage: '两次输入的密码不一致'
+              }
+            ]
+          }
+        }
+      }
+    },
+    onReady() {
+      this.$refs.form.setRules(this.rules)
+    },
+    methods: {
+      submit() {
+		var that = this;
+        this.$refs.form.validate().then(res => {
+          updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
+            that.$toast("修改成功")
+            setTimeout(function(){
+            	that.$tab.reLaunch('/pages/mine/index')
+            },1500)
+          })
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #f5f5f5;
+  }
+
+  .pwd-retrieve-container {
+    padding: 10rpx 36rpx;
+  }
+  .pwd .rbtn{width: 100%;height: 98rpx;background: $com-cd3;border-radius: 49rpx;text-align: center;line-height: 98rpx;font-size: 32rpx;font-weight: bold;color: #FFFEFE;margin-top: 68rpx;}
+  .pwd /deep/ .uni-forms-item{height: 126rpx;background: #FFFFFF;border-radius: 18rpx;margin-top: 30rpx;padding: 0 40rpx;box-sizing: border-box;display: flex;align-items: center;margin-bottom: 0;}
+  .pwd /deep/ .uni-forms-item__label{font-size: 32rpx;font-weight: 500;
+color: #161616;flex: 0 0 auto;width: auto !important;}
+  .pwd /deep/ .uni-easyinput{flex: 1;text-align: right;font-size: 32rpx;color: #161616;}
+  .pwd /deep/ .uni-forms-item__content{display: flex;align-items: center;flex-direction: row;}
+  .pwd /deep/ .uni-easyinput__placeholder-class{font-size: 30rpx;}
+  .pwd /deep/ .uni-easyinput__content-input{font-size: 30rpx;}
+   .pwd /deep/ .uni-forms-item__error{margin-top:20rpx;left: auto;right: 0;z-index: 1;}
+  
+
+</style>

+ 100 - 0
pages/mine/pwd/resetpwd.vue

@@ -0,0 +1,100 @@
+<template>
+  <view class="pwd-retrieve-container pwd">
+    <uni-forms ref="form" :value="user" >
+      <uni-forms-item name="newPassword" label="新密码">
+        <uni-easyinput :inputBorder="false" type="password" v-model="user.newPassword" placeholder="请输入新密码" />
+      </uni-forms-item>
+      <uni-forms-item name="confirmPassword" label="确认密码">
+        <uni-easyinput :inputBorder="false" type="password" v-model="user.confirmPassword" placeholder="请确认新密码" />
+      </uni-forms-item>
+      <view class="rbtn" @click="submit">提交</view>
+    </uni-forms>
+  </view>
+</template>
+
+<script>
+  import { getappCheck } from "@/api/system/user"
+
+  export default {
+    data() {
+      return {
+		  phone:'',
+		  code:'',
+        user: {
+          newPassword: undefined,
+          confirmPassword: undefined
+        },
+        rules: {
+          newPassword: {
+            rules: [{
+                required: true,
+                errorMessage: '新密码不能为空',
+              },
+              {
+                minLength: 6,
+                maxLength: 20,
+                errorMessage: '长度在 6 到 20 个字符'
+              }
+            ]
+          },
+          confirmPassword: {
+            rules: [{
+                required: true,
+                errorMessage: '确认密码不能为空'
+              }, {
+                validateFunction: (rule, value, data) => data.newPassword === value,
+                errorMessage: '两次输入的密码不一致'
+              }
+            ]
+          }
+        }
+      }
+    },
+    onReady() {
+      this.$refs.form.setRules(this.rules)
+    },
+	onLoad(e) {
+		this.phone=e.phone;
+		this.code=e.code;
+	},
+    methods: {
+      submit() {
+		var that = this;
+        this.$refs.form.validate().then(res => {
+			var params={
+				phone:this.phone,
+				code:this.code,
+				password:this.user.newPassword
+			}
+          getappCheck(params).then(response => {
+            that.$toast("重置成功")
+            setTimeout(function(){
+            	that.$tab.reLaunch('/pages/login') 
+            },1500)
+          })
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #f5f5f5;
+  }
+
+  .pwd-retrieve-container {
+    padding: 10rpx 36rpx;
+  }
+  .pwd .rbtn{width: 100%;height: 98rpx;background: $com-cd3;border-radius: 49rpx;text-align: center;line-height: 98rpx;font-size: 32rpx;font-weight: bold;color: #FFFEFE;margin-top: 68rpx;}
+  .pwd /deep/ .uni-forms-item{height: 126rpx;background: #FFFFFF;border-radius: 18rpx;margin-top: 30rpx;padding: 0 40rpx;box-sizing: border-box;display: flex;align-items: center;margin-bottom: 0;}
+  .pwd /deep/ .uni-forms-item__label{font-size: 32rpx;font-weight: 500;
+color: #161616;flex: 0 0 auto;width: auto !important;}
+  .pwd /deep/ .uni-easyinput{flex: 1;text-align: right;font-size: 32rpx;color: #161616;}
+  .pwd /deep/ .uni-forms-item__content{display: flex;align-items: center;flex-direction: row;}
+  .pwd /deep/ .uni-easyinput__placeholder-class{font-size: 30rpx;}
+  .pwd /deep/ .uni-easyinput__content-input{font-size: 30rpx;}
+   .pwd /deep/ .uni-forms-item__error{margin-top:20rpx;left: auto;right: 0;}
+  
+
+</style>

+ 78 - 0
pages/mine/setting/index.vue

@@ -0,0 +1,78 @@
+<template>
+  <view class="setting-container" :style="{height: `${windowHeight}px`}">
+    <view class="menu-list">
+      <view class="list-cell list-cell-arrow" @click="handleToPwd">
+        <view class="menu-item-box">
+          <view class="iconfont icon-password menu-icon"></view>
+          <view>修改密码</view>
+        </view>
+      </view>
+      <view class="list-cell list-cell-arrow" @click="handleToUpgrade">
+        <view class="menu-item-box">
+          <view class="iconfont icon-refresh menu-icon"></view>
+          <view>检查更新</view>
+        </view>
+      </view>
+      <view class="list-cell list-cell-arrow" @click="handleCleanTmp">
+        <view class="menu-item-box">
+          <view class="iconfont icon-clean menu-icon"></view>
+          <view>清理缓存</view>
+        </view>
+      </view>
+    </view>
+    <view class="cu-list menu">
+      <view class="cu-item item-box">
+        <view class="content text-center" @click="handleLogout">
+          <text class="text-black">退出登录</text>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        windowHeight: uni.getSystemInfoSync().windowHeight
+      }
+    },
+    methods: {
+      handleToPwd() {
+        this.$tab.navigateTo('/pages/mine/pwd/index')
+      },
+      handleToUpgrade() {
+        this.$modal.showToast('模块建设中~')
+      },
+      handleCleanTmp() {
+        this.$modal.showToast('模块建设中~')
+      },
+      handleLogout() {
+        this.$modal.confirm('确定注销并退出系统吗?').then(() => {
+          this.$store.dispatch('LogOut').then(() => {
+            this.$tab.reLaunch('/pages/index/index')
+          })
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+  .page {
+    background-color: #f8f8f8;
+  }
+
+  .item-box {
+    background-color: #FFFFFF;
+    margin: 30rpx;
+    display: flex;
+    flex-direction: row;
+    justify-content: center;
+    align-items: center;
+    padding: 10rpx;
+    border-radius: 8rpx;
+    color: #303133;
+    font-size: 32rpx;
+  }
+</style>

+ 141 - 0
pages/order/code.vue

@@ -0,0 +1,141 @@
+<template>
+	<view class="sub">
+	</view>
+</template>
+
+<script>
+	import {
+		getReservatvav
+	} from "@/api/mine/order.js"
+	export default {
+		data() {
+			return {};
+		},
+		onLoad() {
+			this.scanAction()
+		},
+		onShow() {},
+		onHide() {},
+		methods: {
+
+			//扫码功能
+			scanAction() {
+				var that = this;
+				uni.scanCode({
+					onlyFromCamera: true,
+					autoZoom:false,
+					scanType: ['qrCode'],
+					success: function(red) {
+						let result = red.result;
+						if (typeof result == 'string') {
+							try {
+								var obj = result;
+								if (typeof obj == 'string' && obj) {
+								} else {
+									uni.showToast({
+										title: '扫码查询失败,请检查二维码是否正确',
+										icon: "none"
+									})
+									uni.navigateBack({
+										delta: 1
+									})
+									return;
+								}
+
+							} catch (e) {
+								uni.navigateBack({
+									delta: 1
+								})
+								uni.showToast({
+									title: '扫码查询失败,请检查二维码是否正确',
+									icon: "none"
+								})
+								return
+							}
+						}
+						var id = red.result
+						var params = {
+							"reservatId": id,
+						}
+						getReservatvav(params).then(res => {
+							if (res.code == 200) {
+								// 刷新页面
+								if(res.msg=='核销失败'){
+									that.$tab.redirectTo('/pages/order/stafffail')
+								}else{
+									uni.$emit('refreshdatalist')
+									that.$tab.redirectTo('/pages/order/staffcode?id='+id)
+								}
+								
+							} else {
+								uni.navigateBack({
+									delta: 1
+								})
+								uni.showToast({
+									title: res.msg,
+									duration: 1000,
+									icon: 'none'
+								});
+
+							}
+						}).catch(re=>{
+							if(re=='500'){
+								uni.navigateBack({
+									delta: 1
+								})
+							}
+						})
+					},
+					fail: function(e) {
+						console.log(e)
+						if (e && e.errMsg && e.errMsg.indexOf('scanCode:fail cancel') != -1) {
+							return;
+						}
+						uni.showToast({
+							title: '扫码失败',
+							icon: "none"
+						})
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.sub {
+		box-sizing: border-box;
+		width: 100%;
+		min-height: 100vh;
+	}
+
+	.jhyyes {
+		display: flex;
+		justify-content: center;
+		margin-top: 200upx;
+	}
+
+	.img {
+		width: 258upx;
+		height: 251upx;
+		// margin:  auto;
+		// margin-left: 50%;
+		// transform: translateX(-50%);
+	}
+
+
+	.naver {
+		width: 416rpx;
+		height: 84rpx;
+		width: 208px;
+		height: 42px;
+		background: linear-gradient(90deg, #A00517, #E93030);
+		border-radius: 21px;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 30rpx;
+		color: #ffffff;
+		margin: 150rpx auto 0;
+	}
+</style>

+ 584 - 0
pages/order/come.vue

@@ -0,0 +1,584 @@
+<template>
+  <view>
+	  <!-- 顶部选填情况 -->
+	<step-bar :steps="steps" :datainfo="datainfo" :fixeda="fixedflag" :reservatType="yktypes"></step-bar>
+	<view class="ytbox" :style="fixedflag?'padding-top: 152rpx;':''">
+		<uni-forms ref="form" class="ytforms" :rules="rules" :modelValue="datainfo">
+			<view v-for="(ite,idx) in steps" :key="idx" @click="getInFn(ite.val)">
+
+				<!-- <block v-if="showflag"> -->
+					<view class="yttit" v-if="ite.val!=2&&ite.val!=3">{{ite.tit}}</view>
+					<view class="ytsbox boxb" v-if="ite.val==0" >
+						<!-- 日历 -->
+						<lunc-calendar ref="calendar" :showLunar="false" :configWeek="configWeek" :configHoliday="configHoliday" :firstDayOfWeek="firstDayOfWeek" :showMonthBg="false" :showShrink="true" :signList="signList"
+							@dayChange="dayChange" weekType="" @monthChange="monthChange" @getIsSelDayFn="getIsSelDayFn" @shrinkClick="shrinkClick">
+						</lunc-calendar>
+						<view class="ytime">
+							<view class="ytimea">
+								<view class="ytimel">选择时间</view>
+								<view class="lread" @click="getTimeFn(1)">
+									<view class="lreadl">
+										<image :src="choseimg" v-if="timeType==1"></image>
+										<image :src="nchoseimg" v-else></image>
+									</view>
+									<view class="tit">上午</text></view>
+								</view>
+								<view class="lread" @click="getTimeFn(2)">
+									<view class="lreadl">
+										<image :src="choseimg" v-if="timeType==2"></image>
+										<image :src="nchoseimg" v-else></image>
+									</view>
+									<view class="tit">下午</text></view>
+								</view>
+							</view>
+							<view class="ytimeb">
+								<view class="list" :class="[ite.reservatConfigStatus=='Y'?'box3':'box1',timeid==ite.reservatConfigTimeId?'box2':'']" v-for="(ite,idx) in timeList" :key="idx" @click="getChose(ite)">
+									<view class="tit">{{typeFn(ite.reservatConfigTimeBegin)}}-{{typeFn(ite.reservatConfigTimeEnd)}}</view>
+									<view class="txt">{{ite.reservatConfigStatus=='Y'?'可预约':'已约满'}}</view>
+								</view>
+							</view>
+						</view>
+					</view>
+					
+					<view class="ytsbox" v-if="ite.val==1" >
+						<uni-forms-item label="人员类型" required name="visitName">
+							<view class="flexc ytchose">
+								<view class="lread" @click="yktypes=1">
+									<view class="lreadl">
+										<image :src="choseimg" v-if="yktypes==1"></image>
+										<image :src="nchoseimg" v-else></image>
+									</view>
+									<view class="tit">团队</text></view>
+								</view>
+								<view class="lread" @click="yktypes=2">
+									<view class="lreadl">
+										<image :src="choseimg" v-if="yktypes==2"></image>
+										<image :src="nchoseimg" v-else></image>
+									</view>
+									<view class="tit">散客</text></view>
+								</view>
+							</view>
+						</uni-forms-item>
+						<uni-forms-item label="单位名称" required name="visitUnitName" v-if="yktypes==1">
+							<uni-easyinput :inputBorder="false"  v-model="datainfo.visitUnitName" placeholder="请输入单位名称">
+							</uni-easyinput>
+						</uni-forms-item>
+						<uni-forms-item label="参观人数" required >
+							<view class=" ytchose">
+								<view class="flexc">
+									<image :src="downimg" class="numbtn" @click="_calcValue('minus')"></image>
+										<input  type="number"	v-model="inputValue" class="numinp" />
+									<image :src="upimg" class="numbtn" @click="_calcValue('plus')"></image>
+								</view>
+								
+							</view>
+							</uni-easyinput>
+						</uni-forms-item>
+						<uni-forms-item label="联系人" required name="visitName">
+							<uni-easyinput :inputBorder="false" v-model="datainfo.visitName" placeholder="请输入联系人">
+							</uni-easyinput>
+						</uni-forms-item>
+						<uni-forms-item label="联系电话" required name="visitPhone">
+							<uni-easyinput :inputBorder="false" type="number" v-model="datainfo.visitPhone" placeholder="请输入正确的手机号码">
+							</uni-easyinput>
+						</uni-forms-item>
+						<uni-forms-item label="是否接待" required name="visitName" v-if="yktypes==1">
+							<view class="flexc ytchose">
+								<view class="lread" @click="getisReceptionFn">
+									<view class="lreadl">
+										<image :src="choseimg" v-if="isReception=='Y'"></image>
+										<image :src="nchoseimg" v-else></image>
+									</view>
+									<view class="tit">是</text></view>
+								</view>
+								<view class="lread" @click="isReception='N'">
+									<view class="lreadl">
+										<image :src="choseimg" v-if="isReception=='N'"></image>
+										<image :src="nchoseimg" v-else></image>
+									</view>
+									<view class="tit">否</text></view>
+								</view>
+							</view>
+						</uni-forms-item>
+						</uni-forms-item>
+						<uni-forms-item label="备注信息"  name="visitRemark">
+							<textarea placeholder="可补充填写"  v-model="datainfo.visitRemark" placeholder-style="color:#aaa;" :auto-height="autoHeight"  ></textarea>
+						</uni-forms-item>
+					</view>
+				<!-- </block> -->
+				
+				
+				
+			</view>
+			
+		</uni-forms>
+		
+		<view class="ybtn flexcc" @click="getSubmit">提交预约</view>
+		<!-- <view class="ybtn btn1 flexcc" v-else>提交预约</view> -->
+		  <!-- 日历 -->
+		  
+		  <!-- 来访时间 -->
+		  
+		  <!-- 来访者信息 -->
+		  <!-- <picker range-key='dictLabel'  :value="xkindex" :range="classval" @change='bindDateChangeb'>
+		  	<uni-forms-item label="班级" required name="className">
+		  		<view class="f16  flex1 txr" :class="datainfo.className?'co16':'coa'">
+		  			{{datainfo.className||"请选择班级"}}
+		  		</view>
+		  	</uni-forms-item>
+		  </picker> -->
+		  <!-- 被访者信息 -->
+		  
+	</view>
+  </view>
+</template>
+
+<script>
+	import stepBar from "@/components/order/stepbar.vue"
+	import luncCalendar from "@/components/lunc-calendar/lunc-calendar.vue"
+	import {getCalendarList,getReservatAdd,getConfigList} from "@/api/mine/order.js"
+  export default {
+	  components:{stepBar,luncCalendar},
+	data(){
+		return{
+			
+			choseimg:require("@/static/images/order/comes/chose.png"),
+			nchoseimg:require("@/static/images/order/comes/nchosec.png"),
+			downimg:require("@/static/images/order/comes/down.png"),
+			upimg:require("@/static/images/order/comes/add.png"),
+			checkflag:false,
+			yktypes:1,//人员类型 1:团队 2:散客
+			isReception:'Y',//是否需要接待 N:不需要 Y:需要
+			//status:  填写状态  0:未填   1:在填  2:填完
+			steps:[{tit:'预约时间',status:1,val:0},{tit:'信息登记',status:0,val:1},{tit:'等待审核',status:0,val:2},{tit:'审核结果',status:0,val:3}],
+			fixedflag:true,
+			rules: {
+				// visitPhone: {rules: [{required: true,errorMessage: '请输入联系电话'},{pattern:"^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$",errorMessage: '请输入正确的联系方式'}]},
+			},
+			autoHeight:true,
+			disabled:false,
+			intype:0,
+			datainfo:{},
+			inputValue:1,
+			step:1,
+			min:1,
+			signList: [],
+			configWeek:[],
+			configHoliday:'Y',
+			firstDayOfWeek:'sunday',
+			dayflag:false,
+			month:'',
+			year:'',
+			kaTime:'',
+			changetime:'',//改变的日期
+			timeday:'',//选择的日期
+			visitDate:'',
+			showflag:false,
+			id:'',
+			timeType:1,//1: AM 2: PM",
+			timeList:[],//时间段
+			timeid:'',
+			jdryflag:true,//当前时间段是否能接待
+		}
+	},
+	watch:{
+		intype(val){
+			var data=this.datainfo;
+			if(val!=0){
+				if(data.visitDate&&data.visitTime) this.steps[0].status=2;
+				else if(!data.visitDate||!data.visitTime) this.steps[0].status=0;
+			}
+			if(val!=1){
+				if(this.yktypes==1){
+					if(this.inputValue&&data.visitPhone&&data.visitName&&data.visitUnitName) this.steps[1].status=2;
+					else if(!this.inputValue||!data.visitPhone||!data.visitName||!data.visitUnitName) this.steps[1].status=0;
+				}else{
+					if(this.inputValue&&data.visitPhone&&data.visitName) this.steps[1].status=2;
+					else if(!this.inputValue||!data.visitPhone) this.steps[1].status=0;
+				}
+				
+			}
+		}
+	},
+	onLoad: function(e) {
+		// this.id=e.id;
+		this.id='881659';
+		this.time();
+		this.getCalendarList();
+		this.getConfigList()
+	},
+	methods:{
+		_calcValue(type) {
+			// if (this.disabled) {
+			// 	return;
+			// }
+			const scale = this._getDecimalScale();
+			let value = this.inputValue * scale;
+			let step = this.step * scale;
+			if (type === "minus") {
+				value -= step;
+				if (value < (this.min * scale)) {
+					return;
+				}
+				if (value > (this.max * scale)) {
+					value = this.max * scale
+				}
+			}
+		
+			if (type === "plus") {
+				value += step;
+				if (value > (this.max * scale)) {
+					return;
+				}
+				if (value < (this.min * scale)) {
+					value = this.min * scale
+				}
+			}
+		
+			this.inputValue = (value / scale).toFixed(String(scale).length - 1);
+		},
+		_getDecimalScale() {
+		
+			let scale = 1;
+			// 浮点型
+			if (~~this.step !== this.step) {
+				scale = Math.pow(10, String(this.step).split(".")[1].length);
+			}
+			return scale;
+		},
+		typeFn(data){
+			return data?data.substring(0,5):''
+		},
+		getChose(ite){
+			if(ite.reservatConfigStatus=='Y'){
+				this.timeid=ite.reservatConfigTimeId;
+				this.datainfo.visitTime=ite.reservatConfigTimeBegin+'-'+ite.reservatConfigTimeEnd;
+				this.datainfo.reservatConfigTimeId=ite.reservatConfigTimeId;
+				// 判断当前时间段是否有接待员
+				if(ite.receptionPersonnelType=='N'){
+					this.jdryflag=true
+				}else{
+					this.jdryflag=false
+					this.isReception='N'
+				}
+				
+			}
+		},
+		getisReceptionFn(){
+			if(this.jdryflag){
+				this.isReception='Y'
+			}else{
+				this.$toast('当前时间段暂无预约人员')
+			}
+		},
+		getTimeFn(type){
+			if(type==1){
+				this.timeType=1;
+				this.timeList=this.amList;
+			}else{
+				this.timeType=2;
+				this.timeList=this.pmList;
+			}
+		},
+		getConfigList(){
+			getConfigList().then(res=>{
+				if(res.code==200){
+					if(res.rows&&res.rows.length){
+						var week=res.rows[0].reservatConfigWeek;
+						var weeka=week.split(',');
+						var weekarr=[]
+						weeka.forEach(ite=>{
+							weekarr.push(Number(ite))
+						})
+						this.configWeek=weekarr;
+						this.configHoliday=res.rows[0].reservatConfigHoliday;
+					}
+				}
+			})
+		},
+		getCalendarList(itime){
+			var time=this.kaTime
+			if(itime){
+				time=itime
+			}
+			var params={
+				reservatConfigDate:time
+			}
+			getCalendarList(params).then(res=>{
+				if(res.code==200){
+					if(res.data&&res.data.signList){
+						this.signList=res.data.signList;
+					}
+				}
+			})
+		},
+		getInFn(idx){
+			this.intype=idx;
+			this.steps[idx].status=1
+		},
+		time() {
+			var date = new Date();
+			var y = date.getFullYear();
+			var m = date.getMonth() + 1;
+			var d = date.getDate();
+			var h = date.getHours();
+			var min = date.getMinutes();
+			var s = date.getSeconds();
+			var week = date.getDay(); //获取当前星期X(0-6,0代表星期天)
+			var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
+			var yearStr = y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d)
+			var timeStr = (h < 10 ? ('0' + h) : h) + ':' + (min < 10 ? ('0' + min) : min) + ':' + (s < 10 ? (
+				'0' + s) : s);
+			this.kaTime = yearStr;
+			this.year=y;
+			this.month=m;
+		},
+		clearboth(){
+			// var time=this.datainfo.visitDate
+			this.datainfo={};
+			this.steps[0].status=1;
+			this.steps[1].status=0;
+			this.steps[2].status=0;
+			this.steps[3].status=0;
+			this.timeid='';
+			this.inputValue=1;
+			this.timeType=1;
+			this.timeday='';
+			this.timeList=[];
+			this.jdryflag=true
+			// this.datainfo.visitDate=time;
+			// 获取预约时间
+			this.signList=[];
+			this.getCalendarList(this.changetime)
+		},
+		getSubmit(){
+			var that=this;
+			// that.clearboth()
+			// console.log(this.datainfo)
+			// return
+			if(!this.dayflag){
+				this.$toast('当前日期不可预约')
+				return
+			}
+			if(!this.datainfo.visitDate){
+				this.$toast('请选择预约日期')
+				return
+			}
+			if(!this.datainfo.visitTime){
+				this.$toast('请选择时间')
+				return
+			}
+			var str='预约成功'
+			if(this.yktypes==1){
+				str='提交成功,请等待审核'
+				if(!this.datainfo.visitUnitName){
+					this.$toast('请输入单位名称')
+					return
+				}
+				if(this.inputValue==0){
+					this.$toast('请输入参观人数')
+					return
+				}
+			}else{
+				if(this.inputValue==0){
+					this.$toast('请输入参观人数')
+					return
+				}
+			}
+			if(this.inputValue<0){
+				this.$toast('请输入正确的参观人数')
+				return
+			}
+			if(!this.datainfo.visitName){
+				this.$toast('请输入联系人')
+				return
+			}
+			var phone=this.datainfo.visitPhone
+			if(!phone){
+				this.$toast('请输入联系电话')
+				return
+			}
+			let regphone = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
+			if (phone && !regphone.test(phone)) {
+				that.$toast("请输入正确的手机号")
+				return
+			}
+			// that.clearboth()
+			// console.log(this.datainfo)
+			// return
+			this.$refs.form.validate().then(res => {
+				var params={};
+				params=this.datainfo
+				if(this.yktypes==1){
+					params.isReception=this.isReception;
+				}else{
+					params.isReception=''
+					params.visitUnitName=''
+				}
+				params.visitNum=this.inputValue;
+				params.reservatType=this.yktypes;
+				// console.log(params)
+				// return
+				getReservatAdd(params).then(res=>{
+					if(res.code==200){
+						this.$toast(str)
+						setTimeout(function(){
+							// 团队审核
+							if(that.yktypes==1){ //团队
+								that.clearboth()
+							}else{ //散客
+								// 个人直接跳详情页
+								var id=res.data
+								that.$tab.navigateTo('/a/code?id='+id)
+							}
+						},1500)
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+			})
+			
+		},
+		dayChange(e){
+			// if(e.daySign&&e.daySign.length){
+			// 	var daySign=e.daySign[0];
+			// 	this.amList=daySign.amList||[];
+			// 	this.pmList=daySign.pmList||[];
+			// 	if(this.reservatConfigType==1){
+			// 		this.timeList=this.amList;
+			// 	}else if(this.reservatConfigType==2){
+			// 		this.timeList=this.pmList;
+			// 	}
+			// 	this.timeid='';
+			// 	this.datainfo.visitDate=daySign.date;
+			// 	this.datainfo.visitTime='';
+			// }
+		},
+		monthChange(e){
+			var y=e.year;
+			var m=e.month;
+			if(y==this.year&&m==this.month){
+				this.getCalendarList()
+				this.changetime='';
+			}else{
+				var time=y + '-' + m + '-' + '01'
+				this.changetime=time
+				this.getCalendarList(time)
+			}
+		},
+		// 选中的日期
+		getIsSelDayFn(e){
+			if(e.sign&&e.sign.length&&this.timeday!=e.date){
+				this.timeday=e.date;
+				if(this.configWeek.indexOf(e.week)!=-1 || e.isHoliday&&this.configHoliday=='N'){
+					this.dayflag=false;
+				}else{
+					if(e.sign&&e.sign.length){
+						var sign=JSON.parse(JSON.stringify(e.sign))
+						var signes=JSON.parse(JSON.stringify(sign[0]));
+						var amList=JSON.parse(JSON.stringify(signes.amList))||[];
+						var pmList=JSON.parse(JSON.stringify(signes.pmList))||[];
+						this.jdryflag=true;
+						if(this.timeType==1){
+							this.timeList=amList;
+						}else{
+							this.timeList=pmList;
+						}
+						this.amList=amList
+						this.pmList=pmList
+						this.timeid='';
+						var y=e.year;
+						var m=e.month;
+						var d=e.day;
+						this.datainfo.visitDate=y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d);
+						this.datainfo.visitTime='';
+						if(signes.title=='可预约'){
+							this.dayflag=true;
+						}else{
+							this.dayflag=false;
+						}
+						
+					}	
+				}
+			}
+			
+		},
+		shrinkClick(e){
+			console.log(e,3)
+		},
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.ytbox /deep/ .uni-forms .uni-forms-item{padding: 20rpx 16rpx 20rpx;border-bottom: 2rpx solid #E6E6E6;margin-bottom: 0;}
+.ytbox /deep/ .uni-forms-item__label{flex: 0 0 auto;width: auto !important;font-size: 30rpx;font-weight: bold;position: relative;color: #343434;}
+.ytbox /deep/ .uni-forms-item__label .is-required{position: absolute;right: 0;color: #F10C31;margin-top: 16rpx;}
+.ytbox /deep/ uni-textarea{flex: 1;width: auto;text-align: right;}
+.ytbox /deep/ .uni-textarea-placeholder{font-size: 28rpx;color: #DDDDDD !important;}
+.ytbox /deep/ .uni-easyinput__placeholder-class{font-size: 28rpx;color: #DDDDDD;}
+.ytbox /deep/ .uni-forms-item__content{display: flex;align-items: center;flex-direction: row;}
+.ytbox /deep/ .uni-easyinput{flex: 1;text-align: right;}
+.ytsbox /deep/  .uni-forms-item:last-child{border-bottom: none;}
+.ytbox /deep/ .uni-easyinput__content-input{font-size: 30rpx;}
+ .ytbox /deep/ .uni-forms-item__error{margin-top:20rpx;left: auto;right: 0;}
+ .ytbox{padding-bottom: 46rpx;}
+.ytforms{
+	.yttit{font-size: 30rpx;font-weight: bold;background-color: #f1f1f1;
+color: $com-cd3;min-height: 76rpx;display: flex;align-items: center;padding: 0rpx 60rpx;box-sizing: border-box;position: relative;
+		&::before{content: '';width: 6rpx;height: 34rpx;background: $com-cd3;border-radius: 4rpx;position: absolute;top: 50%;transform: translateY(-50%);left: 34rpx;}
+	}
+	.ytsbox{background-color: #ffffff;padding: 0 32rpx;
+		&.boxa{padding: 24rpx 48rpx;}
+		&.boxb{padding-bottom:10rpx;}
+		
+		.ytime{padding:60rpx 0 0;
+			.ytimea{display: flex;align-items: center;margin-bottom: 32rpx;
+				.ytimel{font-size: 30rpx;font-weight: bold;color: #161616;flex:1;}
+			}
+			.ytimeb{
+				display: flex;align-items: center;flex-wrap: wrap;
+				.list{
+					width: 216rpx;
+					height: 120rpx;
+					display: flex;align-items: center;justify-content: center;flex-direction: column;
+					border-radius:6rpx;margin-bottom: 30rpx;margin-right: 18rpx;box-sizing: border-box;
+					&:nth-of-type(3n){margin-right: 0;}
+					&.box1{background: #F3F3F3;
+						view{color: #AAAAAA;}
+					}
+					&.box2{border: 1px solid $com-cd3 !important;
+						.tit{color: $com-cd3 !important;}
+					}
+					&.box3{border: 1px solid #DADADA;
+					}
+					view{font-size: 28rpx;font-weight: 500;color: #161616;font-family: PingFang SC;}
+					.tit{margin-bottom: 6rpx;}
+				}
+			}
+		}
+		.ytchose{flex: 1; display: flex;align-items: center;justify-content: flex-end;
+			.numbtn{width: 32rpx;height: 32rpx;flex: 0 0 auto;}
+			.numinp{margin: 0 28rpx;width: 124rpx;height: 56rpx;background: #FFFFFF;border: 2rpx solid #D32C26;border-radius: 2rpx;text-align: center;box-sizing: border-box;}
+		}
+	}
+	
+	
+	.lread{
+		display: flex;align-items: flex-start;justify-content: center;margin-left: 40rpx;
+		.lreadl{padding-top: 4rpx;
+			image{width: 28rpx;height: 28rpx;margin-right: 26rpx;}
+		}
+		.tit{font-size: 28rpx;font-weight: 500;color: #666666;
+		}
+	}
+}
+// 按钮
+	.ybtn{width: 684rpx;height: 90rpx;background: $com-cd3;border-radius: 42rpx;margin: 60rpx auto 0;font-size: 32rpx;font-weight: 500;color: #FFFFFF;
+		&.btn1{background-color: #9a9c9e;}
+	}
+
+
+
+</style>

+ 274 - 0
pages/order/comedetail.vue

@@ -0,0 +1,274 @@
+<template>
+  <view>
+	  <!-- 顶部选填情况 -->
+	<step-bar :steps="steps" :fixeda="fixedflag" :reservatType="datainfo.reservatType"></step-bar>
+	<view class="ytbox" :style="fixedflag?'padding-top: 152rpx;':''">
+		<view class="code_box">
+			<view class="cdet" v-if="yy_code">
+				<view class="ctit">通行码</view>
+				<view class="ycode">
+					<!-- <view class="tit">请向工作人员出示该二维码即可扫码通行</view> -->
+					<view class="img">
+						<image :src="yy_code" class="codeimg" @click.stop="getPreview"></image>
+						<view class="usebox" v-if="useflag">
+							<image :src="useimg" class="useimg"></image>
+						</view>
+						
+					</view>
+					<view class="txt txta" v-if="useflag">通行码已使用</view>
+					<view class="txt" v-else>点击二维码可放大哦</view>
+				</view>
+			</view> 
+			<!-- 预约失败 -->
+			<view class="cdet">
+				<view class="ctit">预约信息</view>
+				<view class="yerror" v-if="yyerror">
+					<image :src="errorimg"></image>
+					<view>审核失败</view>
+				</view>
+				<view class="cbox">
+					<view class="ctxt">预约时间</view>
+					<view class="ctlist">
+						<view class="tit">参观日期:</view>
+						<view class="txt">{{datainfo.visitDate||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">参观时间:</view>
+						<view class="txt">{{datainfo.visitTime||''}}</view>
+					</view>
+				</view>
+				<view class="cbox">
+					<view class="ctxt">登记信息</view>
+					<view class="ctlist">
+						<view class="tit">游客类型:</view>
+						<view class="txt" v-if="datainfo.reservatType">{{datainfo.reservatType=='2'?'散客':'团队'}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">单位名称:</view>
+						<view class="txt">{{datainfo.visitUnitName||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">参观人数:</view>
+						<view class="txt">{{datainfo.visitNum||''}}人</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">联系人:</view>
+						<view class="txt">{{datainfo.visitName||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">联系电话:</view>
+						<view class="txt">{{datainfo.visitPhone||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">是否接待:</view>
+						<view class="txt">{{datainfo.isReception=='Y'?'是':'否'||''}}</view>
+					</view>
+					<block v-if="datainfo.isReception=='Y'">
+						<view class="ctlist" v-if="datainfo.receptionName">
+							<view class="tit">接待人:</view>
+							<view class="txt">{{datainfo.receptionName||''}}</view>
+						</view>
+						<view class="ctlist" v-if="datainfo.receptionPhone">
+							<view class="tit">接待电话:</view>
+							<view class="txt">{{datainfo.receptionPhone||''}}</view>
+						</view>
+					</block>
+					<view class="ctlist">
+						<view class="tit">备注信息:</view>
+						<view class="txt">{{datainfo.visitRemark||''}}</view>
+					</view>
+				</view>
+			</view> 
+		</view>
+		  
+	</view>
+	<view class="code_btn" v-if="!useflag">
+		<view class="btn btn2 flex1" @click="getFail" >取消预约</view>
+	</view>
+	<!-- 弹窗 -->
+	<pop-up :type="type" @getClose="getClose"></pop-up>
+  </view>
+</template>
+
+<script>
+	import * as base64 from "base-64"
+	import stepBar from "@/components/order/stepbar.vue"
+	import popUp from "@/components/order/popup.vue"
+	import {getReservatDetail,getReservatDel} from "@/api/mine/order.js"
+	import QR from "@/utils/wxqrcode.js" // 二维码生成器 
+	import config from '@/config'
+	const baseUrlimg = config.baseUrlimg
+  export default {
+	  components:{stepBar,popUp},
+	data(){
+		return{
+			codeimg:require('@/static/images/order/comes/code.png'),
+			useimg:require('@/static/images/order/comes/use.png'),
+			errorimg:require('@/static/images/order/comes/error.png'),
+			//status:  填写状态  0:未填   1:在填  2:填完
+			steps:[{tit:'预约时间',status:1,val:0},{tit:'信息登记',status:1,val:1},{tit:'等待审核',status:0,val:2},{tit:'审核结果',status:0,val:3}],
+			fixedflag:true,
+			fixedflag:true,
+			useflag:false,
+			type:0,
+			yy_code:'',
+			id:'',
+			yyerror:false,
+			datainfo:{
+				
+			},
+
+		}
+	},
+	onLoad: function(e) {
+		this.id=base64.decode(e.id);
+		this.getDataFn()
+		
+	},
+	methods:{
+		getClose(){
+			this.type=0;
+		},
+		getFail(){
+			var that=this;
+			uni.showModal({
+				title: '确认取消',
+				content: "是否确认取消该预约",
+				cancelText: '取消',
+				confirmText: '确认',
+				success: function(res) {
+					if (res.confirm) {
+						getReservatDel(that.id).then(res=>{
+							if(res.code==200){
+								that.$toast('取消成功')
+								setTimeout(function(){
+									uni.$emit('refreshrelist')
+									uni.navigateBack({
+										delta:1
+									})
+								},1500)
+								
+							}else{
+								that.$toast(res.msg)
+							}
+						})
+					} else if (res.cancel) {
+						// console.log('用户点击取消');
+					}
+				}
+			});
+			
+		},
+		getPreview() {
+			var newArr=[];
+			var url=this.yy_code
+			newArr.push(url)
+			uni.previewImage({
+				urls: newArr,
+				current:0,
+				success: function(data) {
+					
+				},
+				fail: function(err) {
+					
+				}
+			});
+		},
+		getDataFn(){
+			getReservatDetail(this.id).then(res=>{
+				if(res.code==200){
+					this.datainfo=res.data;
+					if(res.data.visitStatus&&res.data.visitStatus==2){
+						this.useflag=true;
+					}
+					var type=res.data.visitType;
+					var reservatType=res.data.reservatType
+					if(reservatType==2){
+						this.steps[2].status=2;
+						this.steps[3].status=2;
+						this.steps[3].tit='预约成功';
+						this.yy_code = QR.createQrCodeImg(this.id, {
+							size: parseInt(240),//二维码大小 
+							typeNumber:10
+						})
+					}else{
+						//visitType":"预约状态 1:等待审核 2:拒绝 3:同意",
+						if(type==1){
+							this.steps[2].status=2;
+						}else if(type==2){
+							this.steps[2].status=2;
+							this.steps[3].status=2;
+							this.steps[3].tit='预约失败';
+							this.yyerror=true
+						}else if(type==3){
+							this.steps[2].status=2;
+							this.steps[3].status=2;
+							this.steps[2].tit='审核完成';
+							this.steps[3].tit='预约成功';
+							this.yy_code = QR.createQrCodeImg(this.id, {
+								size: parseInt(240),//二维码大小 
+								typeNumber:10
+							})
+						}
+					}
+					
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+		}
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.ytbox{padding-bottom: 32rpx;}
+.code_box{
+	width: 684rpx;background: #FFFFFF;border-radius: 6rpx;margin: 40rpx auto 0;padding:40rpx 60rpx;box-sizing: border-box;flex: 1;
+	.cdet{
+		.ctit{font-size: 32rpx;font-weight: bold;color: #161616;position: relative;
+				&::before{width: 6rpx;height: 34rpx;background: $com-cd3;border-radius: 2rpx;content: '';left: -26rpx;top: 3rpx;position: absolute;bottom: 3rpx;}
+		}
+		.cbox{padding: 36rpx 0 12rpx;}
+		.ctxt{font-size: 30rpx;font-weight: bold;
+color: $com-cd3;margin-bottom: 16rpx;}
+		.ctlist{padding: 10rpx 0;display: flex;justify-content: space-between;
+			.tit{font-size: 30rpx;font-weight: 500;
+			color: #AAAAAA;flex:0 0 auto;margin-right: 20rpx;}
+			.txt{font-size: 30rpx;font-weight: 500;color: #161616;flex: 1;text-align: right;	}
+		}
+		.yerror{padding: 14rpx 0 30rpx;
+			image{width: 296rpx;height: 330rpx;margin: 0 auto 16rpx;}
+			view{font-size: 24rpx;font-weight: bold;color: #D32C26;text-align: center;}
+		}
+		
+	}
+	
+	// 二维码
+	.ycode{text-align: center;padding: 34rpx 0 30rpx;
+		.tit{font-size: 28rpx;font-weight: bold;
+color: #FFB132;}
+		.img{width: 270rpx;height: 270rpx;margin: 6rpx auto;padding: 10rpx;box-sizing: border-box;position: relative;
+			.codeimg{width: 100%;height: 100%;}
+			.usebox{
+				position: absolute;left: 0;right: 0;top: 0;bottom: 0;background-color: rgba(255, 255, 255, 0.8);
+			}
+			.useimg{width: 132rpx;height: 86rpx;position: absolute;bottom: 50rpx;right: 40rpx;}
+		}
+		.txt{font-size: 24rpx;font-weight: bold;color: $com-cd3;
+			&.txta{color: #AAAAAA;}
+		}
+	}
+}
+.code_btn{flex: 0 0 auto;padding: 40rpx 32rpx;display: flex;align-items: center;justify-content: space-between;
+	.btn{width: 320rpx;height: 80rpx;border-radius: 40rpx;box-sizing: border-box;font-size: 32rpx;font-weight: 500;text-align: center;line-height: 80rpx;
+		&.btn1{background: #FFFFFF;border: 2rpx solid $com-cd3;color: $com-cd3;}
+		&.btn2{background: $com-cd3;color: #FFFFFF;}
+	}
+
+}
+
+
+
+</style>

+ 26 - 0
pages/order/index.vue

@@ -0,0 +1,26 @@
+<template>
+  <view>
+	  
+  </view>
+</template>
+
+<script>
+	// import tabSearch from "@/components/toptab/search.vue"
+  export default {
+	data(){
+		return{
+			sucimg:require("@/static/images/order/staffs/success.png"), 
+		}
+	},
+	onLoad: function() {
+	},
+	methods:{
+		 
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 96 - 0
pages/order/notice.vue

@@ -0,0 +1,96 @@
+<template>
+  <view class="nobox">
+	  <view class="notice">
+		  <view class="not_box">
+			  <rich-text :nodes="content"></rich-text>
+		  </view>
+		  <view class="not_btns flexcj">
+			  <view class="not_btn btn1" @click="getSearchFn">预约查询</view>
+			  <view class="not_btn btn2" @click="getOrderFn">在线预约</view>
+		  </view>
+		  <view>
+			  <view class="lread" @click="checkflag=!checkflag">
+			  	<view class="lreadl">
+			  		<image :src="choseimg" v-if="checkflag"></image>
+			  		<image :src="nchoseimg" v-else></image>
+			  	</view>
+			  	<view class="tit">我已仔细阅读并知晓预约须知,确认进入在线预约</text></view>
+			  </view>
+		  </view>
+		  <image :src="jdiconimg" @click="getJiFn" class="jdimg"></image>
+		  <view class="bbcode">版本号:ZXY_YY_1.3</view>
+	  </view>
+  </view>
+</template>
+
+<script>
+	import {getNewsList} from "@/api/mine/order.js"
+  export default {
+	data(){
+		return{
+			choseimg:require("@/static/images/order/comes/chose.png"), 
+			nchoseimg:require("@/static/images/order/comes/nchose.png"),
+			jdiconimg:require("@/static/images/order/comes/jdicon.png"),
+			checkflag:false,
+			content:'',
+			jdurl:'https://www.chinamartyrs.gov.cn/x_lsyml/dqlsyml/dqlsymlnamelist/index.html?id=340882000000,%25E5%25AE%2589%25E5%25BE%25BD%25E7%259C%2581-%25E5%25AE%2589%25E5%25BA%2586%25E5%25B8%2582-%25E6%25BD%259C%25E5%25B1%25B1%25E5%25B8%2582',
+		}
+	},
+	onLoad: function() {
+		this.getNewsList()
+	},
+	methods:{
+		getSearchFn(){
+			this.$tab.navigateTo('/pages/order/search')
+		},
+		getJiFn(){
+			window.open(this.jdurl,'_blank')
+		},
+		getNewsList(){
+			var params={
+				type:5
+			}
+			getNewsList(params).then(res=>{
+				if(res.code==200){
+					var list=res.rows;
+					if(list&&list.length){
+						this.content=list[0].content
+					}
+				}
+			})
+		},
+		getOrderFn(){
+			if(this.checkflag){
+				this.$tab.navigateTo('/pages/order/come')
+			}else{
+				this.$toast('请同意预约须知')
+			}
+			
+		}
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.nobox{padding-top: 20rpx;}
+.bbcode{position: absolute;width: 100%;text-align: center;left: 0;bottom: 16rpx;font-size: 24rpx;color: #666666;}
+.notice{min-height: calc(100vh - 20rpx);background: #ffffff;padding: 80rpx 64rpx;box-sizing: border-box;position: relative;
+	.not_box{font-size: 28rpx;font-weight: 500;color: #161616;margin-bottom: 80rpx;}
+	.not_btns{margin-bottom: 42rpx;
+		.not_btn{width: 278rpx;height: 90rpx;border-radius: 46rpx;display: flex;align-items: center;justify-content: center;font-size: 28rpx;font-weight: 500;
+			&.btn1{background: #FFFFFF;border: 2rpx solid $com-cd3;color: $com-cd3;}
+			&.btn2{background: $com-cd3;color: #ffffff;}
+		}
+	}
+}
+.jdimg{position: fixed;right: 22rpx;bottom: 72rpx;width: 156rpx;height: 156rpx;}
+.lread{
+	display: flex;align-items: flex-start;justify-content: center;
+	.lreadl{padding-top: 4rpx;
+		image{width: 24rpx;height: 24rpx;margin-right: 20rpx;}
+	}
+	.tit{font-size: 22rpx;font-weight: 500;color: #666666;
+	}
+}
+</style>

+ 217 - 0
pages/order/search.vue

@@ -0,0 +1,217 @@
+<template>
+  <view class="ysec">
+    <uni-forms ref="form" :value="user" >
+		<view class="yttit">查询预约</view>
+		<view class="ysecbox">
+			<uni-forms-item name="phonenumber" label="预约电话">
+			  <uni-easyinput :inputBorder="false" type="number"  v-model="phonenumber" placeholder="请输入预约的手机号码" />
+			</uni-forms-item>
+			<uni-forms-item name="code" label="验证码">
+			  <uni-easyinput :inputBorder="false" v-model="code" placeholder="请输入验证码" />
+					<view class="line flex0"></view>
+					<view v-if="timefalg" class="code act">{{time}}秒</view>
+					<view v-else @click="getCode" class="code">获取验证码</view>
+			</uni-forms-item>
+		</view>
+      
+      <view class="rbtn" @click="submit">查询</view>
+    </uni-forms>
+	<!-- 列表 -->
+	<view class="searchlist" v-if="listflag">
+		<y-list :datalist="list" :wtdt="wtdt" :type="type" @getDetail='getDetail'></y-list>
+	</view>
+	
+  </view>
+</template>
+
+<script>
+	import * as base64 from "base-64"
+	import { getReservatList } from "@/api/mine/order.js"
+	import {sendSmsFn} from "@/api/login.js"
+	import yList from "@/components/order/list.vue"
+  export default {
+	  components:{yList},
+    data() {
+      return {
+		timefalg:false,
+		time:'',
+		phonenumber:'17856919066',
+		code:'',
+		newcode:'',//验证码1419
+		user:{},
+		list:[],
+		type:'1',
+		pageSize: 10,
+		pageNum: 1,
+		reachflag: true,
+		wtdt:'',
+		listflag:false,
+		backflag:false
+      }
+    },
+    onReady() {
+    },
+	onLoad:function(){
+		uni.$on('refreshrelist',(e) => {
+			this.reachflag=true;
+			this.pageNum=1;
+			this.list=[];
+			this.backflag=true;
+			this.getDataFn();
+		})
+	},
+	onUnload() {
+		uni.$off('refreshrelist')
+	},
+	// 上拉触底加载更多触发事件
+	onReachBottom() {
+		if (this.reachflag) {
+			this.pageNum++
+			this.getDataFn()
+		}
+	},
+    methods: {
+		getDetail(data){
+			var s=base64.encode(data)
+			this.$tab.navigateTo('/pages/order/comedetail?id='+s)
+		},
+		getCode(){
+			var that=this;
+			if (!this.phonenumber ) {
+				that.$toast("请输入手机号")
+				return
+			}
+			let regphone = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
+			if (this.phonenumber && !regphone.test(this.phonenumber)) {
+				that.$toast("请输入正确的手机号")
+				return
+			}
+			sendSmsFn(this.phonenumber).then(res=>{
+				if (res.code == 200) {
+					// 发送验证码
+					that.$toast("发送成功")
+					that.newcode=res.msg
+					that.time=60;
+					that.timefalg=true;
+					that.setTimein()
+				} else {
+					that.$toast(res.msg)
+				}
+				// 判断是不是对等的
+				// that.getCodesend(that.phonenumber)
+			})
+		},
+		// 验证码倒计时
+		setTimein(){
+			var that=this;
+			clearInterval(that.timer)
+			that.timer=setInterval(()=>{
+				if(that.time<=1){
+					that.timefalg=false;
+					that.time=60;
+					clearInterval(that.timer)
+				}
+				that.time=that.time-1;
+			},1000)
+		},
+		getDataFn(){
+			var params={
+				visitPhone:this.phonenumber,
+				pageSize:this.pageSize,
+				pageNum: this.pageNum,
+			}
+			getReservatList(params).then(res=>{
+				if(res.code==200){
+					var list=res.rows;
+					this.listflag=true;
+					if(list&&list.length){
+						var len=list.length;
+						if(len==1&&!this.backflag&&this.pageNum==1){
+							var id=list[0].reservatId
+							this.$tab.navigateTo('/pages/order/comedetail?id='+base64.encode(id))
+						}else{
+							if (res.rows.length < this.pageSize) {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							} else {
+								var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+								if (num < res.total) {
+									this.reachflag = true
+									this.wtdt = '上拉加载更多'
+								} else {
+									this.reachflag = false
+									this.wtdt = '到底了~';
+								}
+							}
+							if (this.pageNum == 1) {
+								this.list = res.rows;
+							} else {
+								this.list = this.list.concat(res.rows)
+							}
+						}
+					}else{
+						this.$toast('暂无预约信息')
+					}
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+		},
+      submit() {
+		var that = this;
+		this.reachflag=false;
+		this.pageNum=1;
+		this.list=[];
+		this.getDataFn()
+		return
+		if (!this.phonenumber ) {
+			that.$toast("请输入手机号")
+			return
+		}
+		if (!this.code ) {
+			that.$toast("请输入验证码")
+			return
+		}
+		if(this.code!=this.newcode){
+			that.$toast("验证码错误,请重新输入")
+			return
+		}
+		let regphone = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/
+		if (this.phonenumber && !regphone.test(this.phonenumber)) {
+			that.$toast("请输入正确的手机号")
+			return
+		}
+		this.getDataFn()
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  // page {
+  //   background-color: #f5f5f5;
+  // }
+  .ysec{padding-top: 10rpx; 
+	.rbtn{width: 680rpx;height: 90rpx;background: $com-cd3;border-radius: 42rpx;text-align: center;line-height: 90rpx;font-size: 28rpx;font-weight: bold;color: #FFFEFE;margin: 70rpx auto 0;}
+	.yttit{font-size: 28rpx;font-weight: bold;background-color: #f1f1f1;color: $com-cd3;min-height: 72rpx;display: flex;align-items: center;padding: 0rpx 60rpx;box-sizing: border-box;position: relative;
+		&::before{content: '';width: 6rpx;height: 34rpx;background: $com-cd3;border-radius: 4rpx;position: absolute;top: 50%;transform: translateY(-50%);left: 34rpx;}
+	}
+	.ysecbox{padding:0 34rpx;background: #ffffff;}
+  }
+  .searchlist{
+	  padding: 0 30rpx;margin-top: 30rpx;
+  }
+  .line{width: 2rpx;height: 24rpx;background: #CDCDCD;margin: 0 24rpx;}
+	.code{font-size: 26rpx;color: $com-cd3;font-weight: 500;
+		&.act{color: #666666;}
+	} 
+.ysec /deep/ .uni-forms .uni-forms-item{padding: 20rpx 16rpx 20rpx;border-bottom: 2rpx solid #E6E6E6;margin-bottom: 0;}
+.ysec /deep/ .uni-forms-item__label{flex: 0 0 auto;width: auto !important;font-size: 28rpx;font-weight: bold;position: relative;color: #343434;}
+.ysec /deep/ .uni-textarea-placeholder{font-size: 28rpx;color: #DDDDDD !important;}
+.ysec /deep/ .uni-easyinput__placeholder-class{font-size: 28rpx;color: #DDDDDD;}
+.ysec /deep/ .uni-forms-item__content{display: flex;align-items: center;flex-direction: row;}
+.ysec /deep/ .uni-easyinput{flex: 1;text-align: right;}
+.ysec /deep/  .uni-forms-item:last-child{border-bottom: none;}
+.ysec /deep/ .uni-easyinput__content-input{font-size: 28rpx;}
+ .ysec /deep/ .uni-forms-item__error{margin-top:20rpx;left: auto;right: 0;}
+</style>

+ 203 - 0
pages/order/staffcode.vue

@@ -0,0 +1,203 @@
+<template>
+  <view class="code pt8">
+	<view class="code_box">
+		<view class="code_suc" v-if="type=='code'">
+			<image :src="sucimg"></image>
+			<view class="f16 fw co16 txc">扫码成功</view>
+		</view>
+		<view class="cdet">
+			<view class="ctit">预约信息</view>
+			<view class="cbox">
+				<view class="ctxt">预约时间</view>
+				<view class="ctlist">
+					<view class="tit">参观日期:</view>
+					<view class="txt">{{datainfo.visitDate||''}}</view>
+				</view>
+				<view class="ctlist">
+					<view class="tit">参观时间:</view>
+					<view class="txt">{{datainfo.visitTime||''}}</view>
+				</view>
+			</view>
+			<view class="cbox">
+				<view class="ctxt">登记信息</view>
+				<view class="ctlist">
+					<view class="tit">游客类型:</view>
+					<view class="txt" v-if="datainfo.reservatType">{{datainfo.reservatType=='2'?'散客':'团队'}}</view>
+				</view>
+				<view class="ctlist">
+					<view class="tit">单位名称:</view>
+					<view class="txt">{{datainfo.visitUnitName||''}}</view>
+				</view>
+				<view class="ctlist">
+					<view class="tit">参观人数:</view>
+					<view class="txt">{{datainfo.visitNum||''}}人</view>
+				</view>
+				<view class="ctlist">
+					<view class="tit">联系人:</view>
+					<view class="txt">{{datainfo.visitName||''}}</view>
+				</view>
+				<view class="ctlist">
+					<view class="tit">联系电话:</view>
+					<view class="txt">{{datainfo.visitPhone||''}}</view>
+				</view>
+				<view class="ctlist">
+					<view class="tit">是否接待:</view>
+					<view class="txt">{{datainfo.isReception=='Y'?'是':'否'||''}}</view>
+				</view>
+				<block v-if="datainfo.isReception=='Y'">
+					<view class="ctlist">
+						<view class="tit">接待人:</view>
+						<view class="txt">{{datainfo.receptionName||''}}</view>
+					</view>
+					<view class="ctlist">
+						<view class="tit">接待电话:</view>
+						<view class="txt">{{datainfo.receptionPhone||''}}</view>
+					</view>
+				</block>
+				
+				<!-- <view class="ctlist">
+					<view class="tit">任务指派:</view>
+					<view class="txt">{{datainfo.visitRemark||''}}</view>
+				</view> -->
+				<view class="ctlist">
+					<view class="tit">备注信息:</view>
+					<view class="txt">{{datainfo.visitRemark||''}}</view>
+				</view>
+			</view>
+		</view> 
+	</view>
+	<view class="code_btn">
+		<!-- v-if="checkPermi(['system:reservat:cav'])" -->
+		<view class="btn btn1" @click="getFail" >继续扫码</view>
+		<view class="btn btn2 flex1" @click="getBack">返回首页</view>
+	</view>
+  </view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import {getReservatDetail,getReservatvav} from "@/api/mine/order.js"
+  export default {
+	data(){
+		return{
+			sucimg:require("@/static/images/order/staffs/success.png"),
+			datainfo:{},
+			id:'',
+			type:'code'
+		}
+	},
+	onLoad: function(e) {
+		this.id=e.id;
+		if(e.type){
+			this.type=e.type
+		}
+		this.getDataFn()
+	},
+	methods:{
+		checkPermi, checkRole,
+		getFail(){
+			var that = this;
+			uni.scanCode({
+				onlyFromCamera: true,
+				autoZoom:false,
+				scanType: ['qrCode'],
+				success: function(red) {
+					let result = red.result;
+					if (typeof result == 'string') {
+						try {
+						
+						} catch (e) {
+							uni.navigateBack({
+								delta: 1
+							})
+							uni.showToast({
+								title: '扫码查询失败,请检查二维码是否正确',
+								icon: "none"
+							})
+							return
+						}
+					}
+					var id = red.result
+					var params = {
+						"reservatId": id,
+					}
+					getReservatvav(params).then(res => {
+						if (res.code == 200) {
+							// 刷新页面
+							if(res.msg=='核销失败'){
+								that.$tab.redirectTo('/pages/order/stafffail')
+							}else{
+								uni.$emit('refreshdatalist')
+								that.$tab.redirectTo('/pages/order/staffcode?id='+id)
+							}
+							
+						} else {
+							uni.showToast({
+								title: res.msg,
+								duration: 1000,
+								icon: 'none'
+							});
+						
+						}
+					})
+				},
+				fail: function(e) {
+					if (e && e.errMsg && e.errMsg.indexOf('scanCode:fail cancel') != -1) {
+						return;
+					}
+					uni.showToast({
+						title: '扫码失败',
+						icon: "none"
+					})
+				},
+			});
+		},
+		getBack(){
+			this.$tab.reLaunch('/pages/index/index')
+		},
+		getDataFn(){
+			getReservatDetail(this.id).then(res=>{
+				if(res.code==200){
+					this.datainfo=res.data;
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+		}
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.code{display: flex;flex-direction: column;height: 100vh;box-sizing: border-box;}
+.code_box{
+	width: 684rpx;background: #FFFFFF;border-radius: 6rpx;margin: 0 auto;padding:64rpx 60rpx 40rpx;box-sizing: border-box;flex: 1;
+	.code_suc{
+		margin-bottom: 48rpx;
+		image{width: 138rpx;height: 148rpx;margin: 0 auto 32rpx;}
+	}
+	.cdet{
+		.ctit{font-size: 32rpx;font-weight: bold;color: #161616;position: relative;
+				&::before{width: 6rpx;height: 34rpx;background: $com-cd3;border-radius: 2rpx;content: '';left: -26rpx;top: 3rpx;position: absolute;bottom: 3rpx;}
+		}
+		.cbox{padding: 36rpx 0 12rpx;}
+		.ctxt{font-size: 30rpx;font-weight: bold;
+color: $com-cd3;margin-bottom: 16rpx;}
+		.ctlist{padding: 10rpx 0;display: flex;justify-content: space-between;
+			.tit{font-size: 30rpx;font-weight: 500;
+			color: #AAAAAA;flex:0 0 auto;margin-right: 20rpx;}
+			.txt{font-size: 30rpx;font-weight: 500;color: #161616;flex: 1;text-align: right;}
+		}
+		
+	}
+}
+
+.code_btn{flex: 0 0 auto;padding: 40rpx 32rpx;display: flex;align-items: center;justify-content: space-between;
+	.btn{width: 320rpx;height: 80rpx;border-radius: 40rpx;box-sizing: border-box;font-size: 32rpx;font-weight: 500;text-align: center;line-height: 80rpx;
+		&.btn1{background: #FFFFFF;border: 2rpx solid $com-cd3;color: $com-cd3;margin-right: 44rpx;}
+		&.btn2{background: $com-cd3;color: #FFFFFF;}
+	}
+
+}
+</style>

+ 138 - 0
pages/order/stafffail.vue

@@ -0,0 +1,138 @@
+<template>
+  <view class="code pt8 pb15">
+	<view class="code_box pt80 flexdc">
+		<view class="code_fail flex0">
+			<image :src="failimg"></image>
+			<view class="f16 fw co16 txc">核销失败</view>
+		</view>
+		<view class="txc code_tip flex1">
+			<view>该通行码已使用</view>
+			<view>请告知来访者重新预约</view>	 
+		</view>
+		<view class="code_btn code_btna flex0">
+			<view class="btn btn1" @click="getFail" v-if="checkPermi(['system:reservat:cav'])">继续扫码</view>
+			<view class="btn btn2 " @click="getBack">返回首页</view>
+		</view>
+	</view>
+	
+  </view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import {getReservatvav} from "@/api/mine/order.js"
+  export default {
+	data(){
+		return{
+			failimg:require("@/static/images/order/staffs/fail.png") 
+		}
+	},
+	onLoad: function() {
+	},
+	methods:{
+		checkPermi, checkRole,
+		getFail(){
+			var that = this;
+			uni.scanCode({
+				onlyFromCamera: true,
+				autoZoom:false,
+				scanType: ['qrCode'],
+				success: function(red) {
+					let result = red.result;
+					if (typeof result == 'string') {
+						try {
+						
+						} catch (e) {
+							uni.navigateBack({
+								delta: 1
+							})
+							uni.showToast({
+								title: '扫码查询失败,请检查二维码是否正确',
+								icon: "none"
+							})
+							return
+						}
+					}
+					var id = red.result
+					var params = {
+						"reservatId": id,
+					}
+					getReservatvav(params).then(res => {
+						if (res.code == 200) {
+							// 刷新页面
+							if(res.msg=='核销失败'){
+								that.$tab.redirectTo('/pages/order/stafffail')
+							}else{
+								uni.$emit('refreshdatalist')
+								that.$tab.redirectTo('/pages/order/staffcode?id='+id)
+							}
+							
+						} else {
+							uni.showToast({
+								title: res.msg,
+								duration: 1000,
+								icon: 'none'
+							});
+						
+						}
+					})
+				},
+				fail: function(e) {
+					if (e && e.errMsg && e.errMsg.indexOf('scanCode:fail cancel') != -1) {
+						return;
+					}
+					uni.showToast({
+						title: '扫码失败',
+						icon: "none"
+					})
+				},
+			});
+		},
+		getBack(){
+			this.$tab.reLaunch('/pages/index/index')
+		}, 
+	},
+	
+  }
+</script>
+
+<style lang="scss" scoped>
+.code{display: flex;flex-direction: column;height: 100vh;box-sizing: border-box;}
+.code_box{
+	width: 684rpx;background: #FFFFFF;border-radius: 6rpx;margin: 0 auto;padding:64rpx 60rpx 40rpx;box-sizing: border-box;flex: 1;
+	&.pt80{padding-top: 160rpx;}
+	.code_suc{
+		image{width: 138rpx;height: 148rpx;margin: 0 auto 32rpx;}
+	}
+	.code_fail{
+		image{width: 172rpx;height: 172rpx;margin: 0 auto 32rpx;}
+	}
+	.cdet{padding-top: 48rpx;
+		.ctit{font-size: 32rpx;font-weight: bold;color: #161616;position: relative;
+				&::before{width: 6rpx;height: 34rpx;background: $com-cd3;border-radius: 2rpx;content: '';left: -26rpx;top: 3rpx;position: absolute;bottom: 3rpx;}
+		}
+		.cbox{padding: 36rpx 0 12rpx;}
+		.ctxt{font-size: 30rpx;font-weight: bold;
+color: $com-cd3;margin-bottom: 16rpx;}
+		.ctlist{padding: 10rpx 0;display: flex;justify-content: space-between;
+			.tit{font-size: 30rpx;font-weight: 500;
+			color: #AAAAAA;flex:0 0 auto;margin-right: 20rpx;}
+			.txt{font-size: 30rpx;font-weight: 500;color: #161616;flex: 1;text-align: right;}
+		}
+		
+	}
+}
+.code_tip {margin-top: 60rpx;
+	view{font-size: 30rpx;font-weight: 500;color: #161616;}
+}
+.code_btn{flex: 0 0 auto;padding: 40rpx 32rpx;display: flex;align-items: center;justify-content: space-between;
+	&.code_btna{padding: 0;display: block;padding-bottom: 72rpx;
+		.btn{width: 100%;margin-bottom:20rpx;}
+	}
+	.btn{width: 320rpx;height: 80rpx;border-radius: 40rpx;box-sizing: border-box;font-size: 32rpx;font-weight: 500;text-align: center;line-height: 80rpx;
+		&.btn1{background: #FFFFFF;border: 2rpx solid $com-cd3;color: $com-cd3;}
+		&.btn2{background: $com-cd3;color: #FFFFFF;}
+	}
+
+}
+</style>

+ 196 - 0
pages/register.vue

@@ -0,0 +1,196 @@
+<template>
+  <view class="normal-login-container">
+    <view class="logo-content align-center justify-center flex">
+      <image style="width: 100rpx;height: 100rpx;" :src="globalConfig.appInfo.logo" mode="widthFix">
+      </image>
+      <text class="title">若依移动端注册</text>
+    </view>
+    <view class="login-form-content">
+      <view class="input-item flex align-center">
+        <view class="iconfont icon-user icon"></view>
+        <input v-model="registerForm.username" class="input" type="text" placeholder="请输入账号" maxlength="30" />
+      </view>
+      <view class="input-item flex align-center">
+        <view class="iconfont icon-password icon"></view>
+        <input v-model="registerForm.password" type="password" class="input" placeholder="请输入密码" maxlength="20" />
+      </view>
+      <view class="input-item flex align-center">
+        <view class="iconfont icon-password icon"></view>
+        <input v-model="registerForm.confirmPassword" type="password" class="input" placeholder="请输入重复密码" maxlength="20" />
+      </view>
+      <view class="input-item flex align-center" style="width: 60%;margin: 0px;" v-if="captchaEnabled">
+        <view class="iconfont icon-code icon"></view>
+        <input v-model="registerForm.code" type="number" class="input" placeholder="请输入验证码" maxlength="4" />
+        <view class="login-code"> 
+          <image :src="codeUrl" @click="getCode" class="login-code-img"></image>
+        </view>
+      </view>
+      <view class="action-btn">
+        <button @click="handleRegister()" class="register-btn cu-btn block bg-blue lg round">注册</button>
+      </view>
+    </view>
+    <view class="xieyi text-center">
+      <text @click="handleUserLogin" class="text-blue">使用已有账号登录</text>
+    </view>
+  </view>
+</template>
+
+<script>
+  import { getCodeImg, register } from '@/api/login'
+
+  export default {
+    data() {
+      return {
+        codeUrl: "",
+        captchaEnabled: true,
+        globalConfig: getApp().globalData.config,
+        registerForm: {
+          username: "",
+          password: "",
+          confirmPassword: "",
+          code: "",
+          uuid: ''
+        }
+      }
+    },
+    created() {
+      this.getCode()
+    },
+    methods: {
+      // 用户登录
+      handleUserLogin() {
+        this.$tab.navigateTo(`/pages/login`)
+      },
+      // 获取图形验证码
+      getCode() {
+        getCodeImg().then(res => {
+          this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled
+          if (this.captchaEnabled) {
+            this.codeUrl = 'data:image/gif;base64,' + res.img
+            this.registerForm.uuid = res.uuid
+          }
+        })
+      },
+      // 注册方法
+      async handleRegister() {
+        if (this.registerForm.username === "") {
+          this.$modal.msgError("请输入您的账号")
+        } else if (this.registerForm.password === "") {
+          this.$modal.msgError("请输入您的密码")
+        } else if (this.registerForm.confirmPassword === "") {
+          this.$modal.msgError("请再次输入您的密码")
+        } else if (this.registerForm.password !== this.registerForm.confirmPassword) {
+          this.$modal.msgError("两次输入的密码不一致")
+        } else if (this.registerForm.code === "" && this.captchaEnabled) {
+          this.$modal.msgError("请输入验证码")
+        } else {
+          this.$modal.loading("注册中,请耐心等待...")
+          this.register()
+        }
+      },
+      // 用户注册
+      async register() {
+        register(this.registerForm).then(res => {
+          this.$modal.closeLoading()
+          uni.showModal({
+          	title: "系统提示",
+          	content: "恭喜你,您的账号 " + this.registerForm.username + " 注册成功!",
+          	success: function (res) {
+          		if (res.confirm) {
+                uni.redirectTo({ url: `/pages/login` });
+          		}
+          	}
+          })
+        }).catch(() => {
+          if (this.captchaEnabled) {
+            this.getCode()
+          }
+        })
+      },
+      // 注册成功后,处理函数
+      registerSuccess(result) {
+        // 设置用户信息
+        this.$store.dispatch('GetInfo').then(res => {
+          this.$tab.reLaunch('/pages/index')
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #ffffff;
+  }
+
+  .normal-login-container {
+    width: 100%;
+
+    .logo-content {
+      width: 100%;
+      font-size: 21px;
+      text-align: center;
+      padding-top: 15%;
+
+      image {
+        border-radius: 4px;
+      }
+
+      .title {
+        margin-left: 10px;
+      }
+    }
+
+    .login-form-content {
+      text-align: center;
+      margin: 20px auto;
+      margin-top: 15%;
+      width: 80%;
+
+      .input-item {
+        margin: 20px auto;
+        background-color: #f5f6f7;
+        height: 45px;
+        border-radius: 20px;
+
+        .icon {
+          font-size: 38rpx;
+          margin-left: 10px;
+          color: #999;
+        }
+
+        .input {
+          width: 100%;
+          font-size: 14px;
+          line-height: 20px;
+          text-align: left;
+          padding-left: 15px;
+        }
+
+      }
+
+      .register-btn {
+        margin-top: 40px;
+        height: 45px;
+      }
+
+      .xieyi {
+        color: #333;
+        margin-top: 20px;
+      }
+      
+      .login-code {
+        height: 38px;
+        float: right;
+      
+        .login-code-img {
+          height: 38px;
+          position: absolute;
+          margin-left: 10px;
+          width: 200rpx;
+        }
+      }
+    }
+  }
+
+</style>

+ 37 - 0
pages/work/index.vue

@@ -0,0 +1,37 @@
+<template>
+	<view class="zan">
+		<!-- <view @click="geta">保安</view>
+		<view @click="getb">被访者</view> -->
+		<view @click="getc">来访者</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		data(){
+			return{
+				
+			}
+		},
+		methods:{
+			geta(){
+				this.$tab.navigateTo('/pages/order/staff')
+			},
+			getb(){
+				this.$tab.navigateTo('/pages/order/notice')
+			},
+			getc(){
+				this.$tab.navigateTo('/pages/order/come')
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.zan{
+	display: flex;align-items: center;
+	view{
+		font-size: 32rpx;padding: 0 20rpx;flex: 1;
+	}
+}
+</style>

+ 39 - 0
permission.js

@@ -0,0 +1,39 @@
+import { getToken } from '@/utils/auth'
+
+// 登录页面
+const loginPage = "/pages/login"
+  
+// 页面白名单
+const whiteList = ['/pages/mine/pwd/resetpwd','/pages/mine/pwd/forgetpwd','/pages/order/notice','/pages/order/search','/a/code',
+  '/pages/login', '/pages/register', '/pages/common/webview/index','/pages/agreement','/pages/order/come','/pages/order/comedetail',
+]
+
+// 检查地址白名单
+function checkWhite(url) {
+  const path = url.split('?')[0]
+  return whiteList.indexOf(path) !== -1
+}
+
+// 页面跳转验证拦截器
+let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"]
+list.forEach(item => {
+  uni.addInterceptor(item, {
+    invoke(to) {
+      if (getToken()) {
+        if (to.url === loginPage) {
+          uni.reLaunch({ url: "/" })
+        }
+        return true
+      } else {
+        if (checkWhite(to.url)) {
+          return true
+        }
+        uni.reLaunch({ url: loginPage })
+        return false
+      }
+    },
+    fail(err) {
+      console.log(err)
+    }
+  })
+})

+ 31 - 0
plugins/amap-wx.130.js

@@ -0,0 +1,31 @@
+function AMapWX(a){this.key=a.key;this.requestConfig={key:a.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};this.MeRequestConfig={key:a.key,serviceName:"https://restapi.amap.com/rest/me"}}
+AMapWX.prototype.getWxLocation=function(a,b){wx.getLocation({type:"gcj02",success:function(c){c=c.longitude+","+c.latitude;wx.setStorage({key:"userLocation",data:c});b(c)},fail:function(c){wx.getStorage({key:"userLocation",success:function(d){d.data&&b(d.data)}});a.fail({errCode:"0",errMsg:c.errMsg||""})}})};
+AMapWX.prototype.getMEKeywordsSearch=function(a){if(!a.options)return a.fail({errCode:"0",errMsg:"\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.city&&(d.city=b.city);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&(d.pageSize=b.pageSize);b.sig&&(d.sig=
+b.sig);wx.request({url:c.serviceName+"/cpoint/datasearch/local",data:d,method:"GET",header:{"content-type":"application/json"},success:function(e){(e=e.data)&&e.status&&"1"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:"0",errMsg:e})},fail:function(e){a.fail({errCode:"0",errMsg:e.errMsg||""})}})};
+AMapWX.prototype.getMEIdSearch=function(a){if(!a.options)return a.fail({errCode:"0",errMsg:"\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};b.layerId&&(d.layerId=b.layerId);b.id&&(d.id=b.id);b.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+"/cpoint/datasearch/id",data:d,method:"GET",header:{"content-type":"application/json"},success:function(e){(e=e.data)&&e.status&&"1"===e.status&&
+0===e.code?a.success(e.data):a.fail({errCode:"0",errMsg:e})},fail:function(e){a.fail({errCode:"0",errMsg:e.errMsg||""})}})};
+AMapWX.prototype.getMEPolygonSearch=function(a){if(!a.options)return a.fail({errCode:"0",errMsg:"\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.polygon&&(d.polygon=b.polygon);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&(d.pageSize=b.pageSize);
+b.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+"/cpoint/datasearch/polygon",data:d,method:"GET",header:{"content-type":"application/json"},success:function(e){(e=e.data)&&e.status&&"1"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:"0",errMsg:e})},fail:function(e){a.fail({errCode:"0",errMsg:e.errMsg||""})}})};
+AMapWX.prototype.getMEaroundSearch=function(a){if(!a.options)return a.fail({errCode:"0",errMsg:"\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.center&&(d.center=b.center);b.radius&&(d.radius=b.radius);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&
+(d.pageSize=b.pageSize);b.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+"/cpoint/datasearch/around",data:d,method:"GET",header:{"content-type":"application/json"},success:function(e){(e=e.data)&&e.status&&"1"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:"0",errMsg:e})},fail:function(e){a.fail({errCode:"0",errMsg:e.errMsg||""})}})};
+AMapWX.prototype.getGeo=function(a){var b=this.requestConfig,c=a.options;b={key:this.key,extensions:"all",s:b.s,platform:b.platform,appname:this.key,sdkversion:b.sdkversion,logversion:b.logversion};c.address&&(b.address=c.address);c.city&&(b.city=c.city);c.batch&&(b.batch=c.batch);c.sig&&(b.sig=c.sig);wx.request({url:"https://restapi.amap.com/v3/geocode/geo",data:b,method:"GET",header:{"content-type":"application/json"},success:function(d){(d=d.data)&&d.status&&"1"===d.status?a.success(d):a.fail({errCode:"0",
+errMsg:d})},fail:function(d){a.fail({errCode:"0",errMsg:d.errMsg||""})}})};
+AMapWX.prototype.getRegeo=function(a){function b(d){var e=c.requestConfig;wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:c.key,location:d,extensions:"all",s:e.s,platform:e.platform,appname:c.key,sdkversion:e.sdkversion,logversion:e.logversion},method:"GET",header:{"content-type":"application/json"},success:function(g){if(g.data.status&&"1"==g.data.status){g=g.data.regeocode;var h=g.addressComponent,f=[],k=g.roads[0].name+"\u9644\u8fd1",m=d.split(",")[0],n=d.split(",")[1];if(g.pois&&
+g.pois[0]){k=g.pois[0].name+"\u9644\u8fd1";var l=g.pois[0].location;l&&(m=parseFloat(l.split(",")[0]),n=parseFloat(l.split(",")[1]))}h.provice&&f.push(h.provice);h.city&&f.push(h.city);h.district&&f.push(h.district);h.streetNumber&&h.streetNumber.street&&h.streetNumber.number?(f.push(h.streetNumber.street),f.push(h.streetNumber.number)):f.push(g.roads[0].name);f=f.join("");a.success([{iconPath:a.iconPath,width:a.iconWidth,height:a.iconHeight,name:f,desc:k,longitude:m,latitude:n,id:0,regeocodeData:g}])}else a.fail({errCode:g.data.infocode,
+errMsg:g.data.info})},fail:function(g){a.fail({errCode:"0",errMsg:g.errMsg||""})}})}var c=this;a.location?b(a.location):c.getWxLocation(a,function(d){b(d)})};
+AMapWX.prototype.getWeather=function(a){function b(g){var h="base";a.type&&"forecast"==a.type&&(h="all");wx.request({url:"https://restapi.amap.com/v3/weather/weatherInfo",data:{key:d.key,city:g,extensions:h,s:e.s,platform:e.platform,appname:d.key,sdkversion:e.sdkversion,logversion:e.logversion},method:"GET",header:{"content-type":"application/json"},success:function(f){if(f.data.status&&"1"==f.data.status)if(f.data.lives){if((f=f.data.lives)&&0<f.length){f=f[0];var k={city:{text:"\u57ce\u5e02",data:f.city},
+weather:{text:"\u5929\u6c14",data:f.weather},temperature:{text:"\u6e29\u5ea6",data:f.temperature},winddirection:{text:"\u98ce\u5411",data:f.winddirection+"\u98ce"},windpower:{text:"\u98ce\u529b",data:f.windpower+"\u7ea7"},humidity:{text:"\u6e7f\u5ea6",data:f.humidity+"%"}};k.liveData=f;a.success(k)}}else f.data.forecasts&&f.data.forecasts[0]&&a.success({forecast:f.data.forecasts[0]});else a.fail({errCode:f.data.infocode,errMsg:f.data.info})},fail:function(f){a.fail({errCode:"0",errMsg:f.errMsg||""})}})}
+function c(g){wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:d.key,location:g,extensions:"all",s:e.s,platform:e.platform,appname:d.key,sdkversion:e.sdkversion,logversion:e.logversion},method:"GET",header:{"content-type":"application/json"},success:function(h){if(h.data.status&&"1"==h.data.status){h=h.data.regeocode;if(h.addressComponent)var f=h.addressComponent.adcode;else h.aois&&0<h.aois.length&&(f=h.aois[0].adcode);b(f)}else a.fail({errCode:h.data.infocode,errMsg:h.data.info})},
+fail:function(h){a.fail({errCode:"0",errMsg:h.errMsg||""})}})}var d=this,e=d.requestConfig;a.city?b(a.city):d.getWxLocation(a,function(g){c(g)})};
+AMapWX.prototype.getPoiAround=function(a){function b(e){e={key:c.key,location:e,s:d.s,platform:d.platform,appname:c.key,sdkversion:d.sdkversion,logversion:d.logversion};a.querytypes&&(e.types=a.querytypes);a.querykeywords&&(e.keywords=a.querykeywords);wx.request({url:"https://restapi.amap.com/v3/place/around",data:e,method:"GET",header:{"content-type":"application/json"},success:function(g){if(g.data.status&&"1"==g.data.status){if((g=g.data)&&g.pois){for(var h=[],f=0;f<g.pois.length;f++){var k=0==
+f?a.iconPathSelected:a.iconPath;h.push({latitude:parseFloat(g.pois[f].location.split(",")[1]),longitude:parseFloat(g.pois[f].location.split(",")[0]),iconPath:k,width:22,height:32,id:f,name:g.pois[f].name,address:g.pois[f].address})}a.success({markers:h,poisData:g.pois})}}else a.fail({errCode:g.data.infocode,errMsg:g.data.info})},fail:function(g){a.fail({errCode:"0",errMsg:g.errMsg||""})}})}var c=this,d=c.requestConfig;a.location?b(a.location):c.getWxLocation(a,function(e){b(e)})};
+AMapWX.prototype.getStaticmap=function(a){function b(e){c.push("location="+e);a.zoom&&c.push("zoom="+a.zoom);a.size&&c.push("size="+a.size);a.scale&&c.push("scale="+a.scale);a.markers&&c.push("markers="+a.markers);a.labels&&c.push("labels="+a.labels);a.paths&&c.push("paths="+a.paths);a.traffic&&c.push("traffic="+a.traffic);e="https://restapi.amap.com/v3/staticmap?"+c.join("&");a.success({url:e})}var c=[];c.push("key="+this.key);var d=this.requestConfig;c.push("s="+d.s);c.push("platform="+d.platform);
+c.push("appname="+d.appname);c.push("sdkversion="+d.sdkversion);c.push("logversion="+d.logversion);a.location?b(a.location):this.getWxLocation(a,function(e){b(e)})};
+AMapWX.prototype.getInputtips=function(a){var b=Object.assign({},this.requestConfig);a.location&&(b.location=a.location);a.keywords&&(b.keywords=a.keywords);a.type&&(b.type=a.type);a.city&&(b.city=a.city);a.citylimit&&(b.citylimit=a.citylimit);wx.request({url:"https://restapi.amap.com/v3/assistant/inputtips",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.tips&&a.success({tips:c.data.tips})},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||
+""})}})};
+AMapWX.prototype.getDrivingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);a.strategy&&(b.strategy=a.strategy);a.waypoints&&(b.waypoints=a.waypoints);a.avoidpolygons&&(b.avoidpolygons=a.avoidpolygons);a.avoidroad&&(b.avoidroad=a.avoidroad);wx.request({url:"https://restapi.amap.com/v3/direction/driving",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths,
+taxi_cost:c.data.route.taxi_cost||""})},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||""})}})};
+AMapWX.prototype.getWalkingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);wx.request({url:"https://restapi.amap.com/v3/direction/walking",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths})},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||""})}})};
+AMapWX.prototype.getTransitRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);a.strategy&&(b.strategy=a.strategy);a.city&&(b.city=a.city);a.cityd&&(b.cityd=a.cityd);wx.request({url:"https://restapi.amap.com/v3/direction/transit/integrated",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.route&&(c=c.data.route,a.success({distance:c.distance||"",taxi_cost:c.taxi_cost||
+"",transits:c.transits}))},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||""})}})};
+AMapWX.prototype.getRidingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);wx.request({url:"https://restapi.amap.com/v3/direction/riding",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths})},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||""})}})};module.exports.AMapWX=AMapWX;

+ 60 - 0
plugins/auth.js

@@ -0,0 +1,60 @@
+import store from '@/store'
+
+function authPermission(permission) {
+  const all_permission = "*:*:*"
+  const permissions = store.getters && store.getters.permissions
+  if (permission && permission.length > 0) {
+    return permissions.some(v => {
+      return all_permission === v || v === permission
+    })
+  } else {
+    return false
+  }
+}
+
+function authRole(role) {
+  const super_admin = "admin"
+  const roles = store.getters && store.getters.roles
+  if (role && role.length > 0) {
+    return roles.some(v => {
+      return super_admin === v || v === role
+    })
+  } else {
+    return false
+  }
+}
+
+export default {
+  // 验证用户是否具备某权限
+  hasPermi(permission) {
+    return authPermission(permission)
+  },
+  // 验证用户是否含有指定权限,只需包含其中一个
+  hasPermiOr(permissions) {
+    return permissions.some(item => {
+      return authPermission(item)
+    })
+  },
+  // 验证用户是否含有指定权限,必须全部拥有
+  hasPermiAnd(permissions) {
+    return permissions.every(item => {
+      return authPermission(item)
+    })
+  },
+  // 验证用户是否具备某角色
+  hasRole(role) {
+    return authRole(role)
+  },
+  // 验证用户是否含有指定角色,只需包含其中一个
+  hasRoleOr(roles) {
+    return roles.some(item => {
+      return authRole(item)
+    })
+  },
+  // 验证用户是否含有指定角色,必须全部拥有
+  hasRoleAnd(roles) {
+    return roles.every(item => {
+      return authRole(item)
+    })
+  }
+}

+ 14 - 0
plugins/index.js

@@ -0,0 +1,14 @@
+import tab from './tab'
+import auth from './auth'
+import modal from './modal'
+
+export default {
+  install(Vue) {
+    // 页签操作
+    Vue.prototype.$tab = tab
+    // 认证对象
+    Vue.prototype.$auth = auth
+    // 模态框对象
+    Vue.prototype.$modal = modal
+  }
+}

+ 74 - 0
plugins/modal.js

@@ -0,0 +1,74 @@
+export default {
+  // 消息提示
+  msg(content) {
+    uni.showToast({
+      title: content,
+      icon: 'none'
+    })
+  },
+  // 错误消息
+  msgError(content) {
+    uni.showToast({
+      title: content,
+      icon: 'error'
+    })
+  },
+  // 成功消息
+  msgSuccess(content) {
+    uni.showToast({
+      title: content,
+      icon: 'success'
+    })
+  },
+  // 隐藏消息
+  hideMsg(content) {
+    uni.hideToast()
+  },
+  // 弹出提示
+  alert(content, title) {
+    uni.showModal({
+      title: title || '系统提示',
+      content: content,
+      showCancel: false
+    })
+  },
+  // 确认窗体
+  confirm(content, title) {
+    return new Promise((resolve, reject) => {
+      uni.showModal({
+        title: title || '系统提示',
+        content: content,
+        cancelText: '取消',
+        confirmText: '确定',
+        success: function(res) {
+          if (res.confirm) {
+            resolve(res.confirm)
+          }
+        }
+      })
+    })
+  },
+  // 提示信息
+  showToast(option) {
+    if (typeof option === "object") {
+      uni.showToast(option)
+    } else {
+      uni.showToast({
+        title: option,
+        icon: "none",
+        duration: 2500
+      })
+    }
+  },
+  // 打开遮罩层
+  loading(content) {
+    uni.showLoading({
+      title: content,
+      icon: 'none'
+    })
+  },
+  // 关闭遮罩层
+  closeLoading() {
+    uni.hideLoading()
+  }
+}

+ 30 - 0
plugins/tab.js

@@ -0,0 +1,30 @@
+export default {
+  // 关闭所有页面,打开到应用内的某个页面
+  reLaunch(url) {
+    return uni.reLaunch({
+      url: url
+    })
+  },
+  // 跳转到tabBar页面,并关闭其他所有非tabBar页面
+  switchTab(url) {
+    return uni.switchTab({
+      url: url
+    })
+  },
+  // 关闭当前页面,跳转到应用内的某个页面
+  redirectTo(url) {
+    return uni.redirectTo({
+      url: url
+    })
+  },
+  // 保留当前页面,跳转到应用内的某个页面
+  navigateTo(url) {
+    return uni.navigateTo({
+      url: url
+    })
+  },
+  // 关闭当前页面,返回上一页面或多级页面
+  navigateBack() {
+    return uni.navigateBack()
+  }
+}

BIN
static/favicon.ico


+ 90 - 0
static/font/iconfont.css

@@ -0,0 +1,90 @@
+@font-face {
+  font-family: "iconfont";
+  src: url('@/static/font/iconfont.ttf') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  display: inline-block;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-user:before {
+  content: "\e7ae";
+}
+
+.icon-password:before {
+  content: "\e8b2";
+}
+
+.icon-code:before {
+  content: "\e699";
+}
+
+.icon-setting:before {
+  content: "\e6cc";
+}
+
+.icon-share:before {
+  content: "\e739";
+}
+
+.icon-edit:before {
+  content: "\e60c";
+}
+
+.icon-version:before {
+  content: "\e63f";
+}
+
+.icon-service:before {
+  content: "\e6ff";
+}
+
+.icon-friendfill:before {
+  content: "\e726";
+}
+
+.icon-community:before {
+  content: "\e741";
+}
+
+.icon-people:before {
+  content: "\e736";
+}
+
+.icon-dianzan:before {
+  content: "\ec7f";
+}
+
+.icon-right:before {
+  content: "\e7eb";
+}
+
+.icon-logout:before {
+  content: "\e61d";
+}
+
+.icon-help:before {
+  content: "\e616";
+}
+
+.icon-github:before {
+  content: "\e628";
+}
+
+.icon-aixin:before {
+  content: "\e601";
+}
+
+.icon-clean:before {
+  content: "\e607";
+}
+
+.icon-refresh:before {
+  content: "\e604";
+}
+

BIN
static/font/iconfont.ttf


BIN
static/images/banner/banner01.jpg


BIN
static/images/banner/banner02.jpg


BIN
static/images/banner/banner03.jpg


BIN
static/images/mine/habg.png


BIN
static/images/mine/lcicon.png


BIN
static/images/mine/ldicon.png


BIN
static/images/mine/lnicon.png


BIN
static/images/mine/lricon.png


BIN
static/images/mine/miconc.png


BIN
static/images/mine/miconf.png


BIN
static/images/mine/miconj.png


BIN
static/images/mine/miconl.png


BIN
static/images/mine/mnotic.png


BIN
static/images/mine/pcicon.png


BIN
static/images/mine/pnicon.png


BIN
static/images/mine/profile.png


BIN
static/images/mine/rimg.png


BIN
static/images/mine/success.png


BIN
static/images/mine/wrimg.png


BIN
static/images/noiconp.png


BIN
static/images/order/come/icon_lc_yy_jxz.png


BIN
static/images/order/come/icon_lc_yy_normal.png


BIN
static/images/order/come/icon_lc_yy_selected.png


BIN
static/images/order/come/icon_mrrr_sjts.png


BIN
static/images/order/come/icon_xl_wzrl.png


BIN
static/images/order/come/icon_yq_gly_tq_qt.png


BIN
static/images/order/come/icon_yq_yy_mr_gx.png


BIN
static/images/order/come/icon_yq_yy_mr_sj.png


BIN
static/images/order/come/icon_yq_yy_mr_zd.png


BIN
static/images/order/come/icon_yq_yy_mrrz.png


BIN
static/images/order/come/pic_lc_yy_xt_normal.png


BIN
static/images/order/come/pic_lc_yy_xt_selevted.png


BIN
static/images/order/come/pic_lfsj_jt.png


BIN
static/images/order/come/pic_mrrz_sbk.png


BIN
static/images/order/come/ucin_yq_yyts.png


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov