Forráskód Böngészése

用户初始页面

zouling 4 hónapja
szülő
commit
890bb4386a
100 módosított fájl, 5006 hozzáadás és 0 törlés
  1. 181 0
      user_ui/App.vue
  2. 21 0
      user_ui/LICENSE
  3. 51 0
      user_ui/README.md
  4. 73 0
      user_ui/api/login.js
  5. 49 0
      user_ui/api/system/user.js
  6. 82 0
      user_ui/components/footer/footer.vue
  7. 235 0
      user_ui/components/loading/loading.vue
  8. 39 0
      user_ui/components/nodata/nodata.vue
  9. 85 0
      user_ui/components/swiper/notice.vue
  10. 72 0
      user_ui/components/toptab/navbar.vue
  11. 176 0
      user_ui/components/toptab/phonebtn.vue
  12. 84 0
      user_ui/components/toptab/tab.vue
  13. 167 0
      user_ui/components/uni-section/uni-section.vue
  14. 28 0
      user_ui/config.js
  15. 36 0
      user_ui/main.js
  16. 69 0
      user_ui/manifest.json
  17. 24 0
      user_ui/package-lock.json
  18. 5 0
      user_ui/package.json
  19. 161 0
      user_ui/pages.json
  20. 80 0
      user_ui/pages/agreement.vue
  21. 43 0
      user_ui/pages/common/textview/index.vue
  22. 34 0
      user_ui/pages/common/webview/index.vue
  23. 344 0
      user_ui/pages/index.vue
  24. 88 0
      user_ui/pages/indexs.vue
  25. 151 0
      user_ui/pages/login.vue
  26. 75 0
      user_ui/pages/mine/about/index.vue
  27. 631 0
      user_ui/pages/mine/avatar/index.vue
  28. 112 0
      user_ui/pages/mine/help/index.vue
  29. 308 0
      user_ui/pages/mine/index.vue
  30. 127 0
      user_ui/pages/mine/info/edit.vue
  31. 44 0
      user_ui/pages/mine/info/index.vue
  32. 85 0
      user_ui/pages/mine/pwd/index.vue
  33. 78 0
      user_ui/pages/mine/setting/index.vue
  34. 283 0
      user_ui/pages/register.vue
  35. 395 0
      user_ui/pages/tlogin.vue
  36. 183 0
      user_ui/pages/work/index.vue
  37. 39 0
      user_ui/permission.js
  38. 60 0
      user_ui/plugins/auth.js
  39. 14 0
      user_ui/plugins/index.js
  40. 74 0
      user_ui/plugins/modal.js
  41. 30 0
      user_ui/plugins/tab.js
  42. BIN
      user_ui/static/favicon.ico
  43. 90 0
      user_ui/static/font/iconfont.css
  44. BIN
      user_ui/static/font/iconfont.ttf
  45. BIN
      user_ui/static/images/banner/banner01.jpg
  46. BIN
      user_ui/static/images/banner/banner02.jpg
  47. BIN
      user_ui/static/images/banner/banner03.jpg
  48. BIN
      user_ui/static/images/home/adr.png
  49. BIN
      user_ui/static/images/home/adra.png
  50. BIN
      user_ui/static/images/home/adrbg.png
  51. BIN
      user_ui/static/images/home/conta.png
  52. BIN
      user_ui/static/images/home/contb.png
  53. BIN
      user_ui/static/images/home/contc.png
  54. BIN
      user_ui/static/images/home/contd.png
  55. BIN
      user_ui/static/images/home/htaba.png
  56. BIN
      user_ui/static/images/home/htabb.png
  57. BIN
      user_ui/static/images/home/htabc.png
  58. BIN
      user_ui/static/images/home/htabd.png
  59. BIN
      user_ui/static/images/home/htabe.png
  60. BIN
      user_ui/static/images/home/htabf.png
  61. BIN
      user_ui/static/images/home/htabg.png
  62. BIN
      user_ui/static/images/home/htabh.png
  63. BIN
      user_ui/static/images/home/htabi.png
  64. BIN
      user_ui/static/images/home/htabj.png
  65. BIN
      user_ui/static/images/home/htabk.png
  66. BIN
      user_ui/static/images/home/htabl.png
  67. BIN
      user_ui/static/images/home/htabm.png
  68. BIN
      user_ui/static/images/home/htabn.png
  69. BIN
      user_ui/static/images/home/htabo.png
  70. BIN
      user_ui/static/images/home/htabp.png
  71. BIN
      user_ui/static/images/home/rimg.png
  72. BIN
      user_ui/static/images/home/tips.png
  73. BIN
      user_ui/static/images/home/up.png
  74. BIN
      user_ui/static/images/mine/fbg.png
  75. BIN
      user_ui/static/images/mine/habg.png
  76. BIN
      user_ui/static/images/mine/head.png
  77. BIN
      user_ui/static/images/mine/icon_dl_xs.png
  78. BIN
      user_ui/static/images/mine/icon_dl_yc.png
  79. BIN
      user_ui/static/images/mine/icon_dlzc_sjhm_xl.png
  80. BIN
      user_ui/static/images/mine/lbg.png
  81. BIN
      user_ui/static/images/mine/lcicon.png
  82. BIN
      user_ui/static/images/mine/ldicon.png
  83. BIN
      user_ui/static/images/mine/lnicon.png
  84. BIN
      user_ui/static/images/mine/pcicon.png
  85. BIN
      user_ui/static/images/mine/pnicon.png
  86. BIN
      user_ui/static/images/mine/profile.png
  87. BIN
      user_ui/static/images/mine/rimg.png
  88. BIN
      user_ui/static/images/mine/success.png
  89. BIN
      user_ui/static/images/mine/vxtab.png
  90. BIN
      user_ui/static/images/mine/zhtab.png
  91. BIN
      user_ui/static/images/navbg.png
  92. BIN
      user_ui/static/images/profile.jpg
  93. BIN
      user_ui/static/images/tabbar/health.png
  94. BIN
      user_ui/static/images/tabbar/health_.png
  95. BIN
      user_ui/static/images/tabbar/home.png
  96. BIN
      user_ui/static/images/tabbar/home_.png
  97. BIN
      user_ui/static/images/tabbar/mine.png
  98. BIN
      user_ui/static/images/tabbar/mine_.png
  99. BIN
      user_ui/static/images/tabbar/store.png
  100. BIN
      user_ui/static/images/tabbar/store_.png

+ 181 - 0
user_ui/App.vue

@@ -0,0 +1,181 @@
+<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(); //版本更新
+		// #endif
+		this.initApp()
+    },
+    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/style.css";
+  @import '@/static/scss/index.scss'
+</style>

+ 21 - 0
user_ui/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.

+ 51 - 0
user_ui/README.md

@@ -0,0 +1,51 @@
+<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;
+
+
+## 技术文档
+
+- 官网网站:[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(满)、③189091635
+- 小程序体验
+
+<img src="https://oscimg.oschina.net/oscnet/up-26c76dc90b92acdbd9ac8cd5252f07c8ad9.jpg" alt="小程序演示"/>
+ 
+
+## 演示图
+
+<table>
+    <tr>
+        <td><img src="https://oscimg.oschina.net/oscnet/up-21f6f842fdc94540469b4eb43fdadbaf7f8.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>

+ 73 - 0
user_ui/api/login.js

@@ -0,0 +1,73 @@
+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 getRegisterFn(data) {
+  return request({
+    'url': '/register/common',
+    'method': 'post',
+	'data':data
+  })
+}
+export function sendSmszcOnly(data) {
+  return request({
+    'url': '/sendSms/sendRegisterSms',
+    '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
+  })
+}

+ 49 - 0
user_ui/api/system/user.js

@@ -0,0 +1,49 @@
+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',
+    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
+  })
+}

+ 82 - 0
user_ui/components/footer/footer.vue

@@ -0,0 +1,82 @@
+<template>
+	<view>
+		
+	
+	<view style="height: 100rpx;"></view>
+    <view class="com_footer">
+		<block v-for="(item,k) in footlist" :key="k">
+			<!-- v-if="!item.limit||item.limit&&checkPermi([item.limit])" -->
+			<view class="in_item"   @click="gotopage(item)">
+				<view class="im_imgs">
+					<image class="in_img" :class="item.img" v-if="active == item.module" :src="item.icon_checked" mode="scaleToFill"></image>
+					<image class="in_img" :class="item.img" v-else :src="item.icon_nochecked" mode="scaleToFill"></image>
+				</view>
+				<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>
+		</block>
+    </view>
+	</view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission";
+    export default {
+		props:[
+			'footerindex'
+		],
+        data () {
+            return{
+				active :'',
+				footlist:[
+					// limit:'system:camera:video',
+					{module:'home',title:'首页',img:"imga",icon_checked:require('@/static/images/tabbar/home_.png'),icon_nochecked:require('@/static/images/tabbar/home.png')},
+					{module:'health',title:'康养',img:"imgb",icon_checked:require('@/static/images/tabbar/health_.png'),icon_nochecked:require('@/static/images/tabbar/health.png')},
+					{module:'store',title:'商圈',img:"imgc",icon_checked:require('@/static/images/tabbar/store_.png'),icon_nochecked:require('@/static/images/tabbar/store.png')},
+					{module:'mine',title:'我的',img:"imgd",icon_checked:require('@/static/images/tabbar/mine_.png'),icon_nochecked:require('@/static/images/tabbar/mine.png')},
+					],
+				color_checked :'272727',
+				color_nochecked :'666666',
+            }
+        },
+		mounted() {
+			var that = this;
+			this.active = this.footerindex;
+		},
+        methods:{
+			checkPermi, checkRole,
+            // 跳转底部导航页面
+			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 == 'health'){
+					this.$tab.reLaunch('/pages/video/index')
+				}else if(module == 'store'){
+					this.$tab.reLaunch('/pages/video/index')
+				}else if(module == 'mine'){
+					this.$tab.reLaunch('/pages/mine/index')
+				}
+			},
+			
+        }
+    }
+</script>
+
+
+
+<style type="text/css" lang="scss" scoped>
+    .com_footer{ display: flex;position: fixed;box-sizing: border-box;z-index: 98;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: 24rpx;color: #999;text-align: center; font-weight: bold;}
+	.com_footer .in_txt_on{ color: #20AD20; }
+	.im_imgs{width: 48rpx;height: 48rpx;display: flex;align-items: center;justify-content: center;margin: 0 auto;}
+	.in_img{
+		&.imga{width: 44rpx;height: 42rpx;}
+		&.imgb{width: 44rpx;height: 40rpx;}
+		&.imgc{width: 44rpx;height: 44rpx;}
+		&.imgd{width: 42rpx;height: 44rpx;}
+	}
+</style>

+ 235 - 0
user_ui/components/loading/loading.vue

@@ -0,0 +1,235 @@
+<!-- <template>
+	<view>
+		
+		<view class="loading" v-if="is_loading">
+			
+			<image class="load_img" :src="waimai ? '../../../static/loading/loading2.gif' : '../../static/loading/loading2.gif'" mode=""></image>
+			
+		</view>
+		
+	</view>
+</template> -->
+
+<template>
+	<view class="" v-if="is_loading">
+		<view class="loader">
+				
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: ["waimai"],
+		data() {
+			return {
+				
+			}
+		},
+		methods:{
+			switch_loading(){
+				this.$store.commit("switch_loading")
+			}
+		},
+		//实测直接在标签属性里写  $store.state.XX  拿不到数据  所以这里通过 计算属性去监听一下
+		computed:{
+			is_loading(){
+				return this.$store.state.user.loading
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.loading{position: fixed;top: 0;left: 0;bottom: 0;right: 0;display: flex;align-items: center;justify-content: space-around;z-index: 1001;background: transparent;}
+	.load_img{width: 640rpx;height: 490rpx;}
+	
+	.loader,
+	.loader:before,
+	.loader:after {
+	  -webkit-animation: load1 1s infinite ease-in-out;
+	  animation: load1 1s infinite ease-in-out;
+	  width: 1em;
+	  height: 3em;
+	}
+	.loader {
+	  color: #FF8080;
+	  background: #FF8080;
+	  text-indent: -9999em;
+	  margin: 88px auto;
+	  position: fixed;
+	  font-size: 16upx;
+	  -webkit-transform: translateZ(0);
+	  -ms-transform: translateZ(0);
+	  transform: translateZ(0);
+	  -webkit-animation-delay: -0.16s;
+	  animation-delay: -0.16s;
+	  top: 30%;left: 0;bottom: 0;right: 0;
+	}
+	.loader:before,
+	.loader:after {
+	  position: absolute;
+	  top: 0;
+	  content: '';
+	}
+	.loader:before {
+	  left: -1.5em;
+	  -webkit-animation-delay: -0.32s;
+	  animation-delay: -0.32s;
+	  background: #FF9999;
+	  color: #FF9999;
+	}
+	.loader:after {
+	  left: 1.5em;
+	  background: #FE6666;
+	  color: #FE6666;
+	}
+	@-webkit-keyframes load1 {
+	  0%,
+	  80%,
+	  100% {
+		box-shadow: 0 0;
+		height: 2em;
+	  }
+	  40% {
+		box-shadow: 0 -2em;
+		height: 3em;
+	  }
+	}
+	@keyframes load1 {
+	  0%,
+	  80%,
+	  100% {
+		box-shadow: 0 0;
+		height: 2em;
+	  }
+	  40% {
+		box-shadow: 0 -2em;
+		height: 3em;
+	  }
+	}
+	
+	/* .loader,
+	.loader:before,
+	.loader:after {
+	  border-radius: 50%;
+	  width: 2.5em;
+	  height: 2.5em;
+	  -webkit-animation-fill-mode: both;
+	  animation-fill-mode: both;
+	  -webkit-animation: load7 1.8s infinite ease-in-out;
+	  animation: load7 1.8s infinite ease-in-out;
+	}
+	.loader {
+	  color: #000;
+	  font-size: 10px;
+	  margin: 80px auto;
+	  position: fixed;
+	  text-indent: -9999em;
+	  -webkit-transform: translateZ(0);
+	  -ms-transform: translateZ(0);
+	  transform: translateZ(0);
+	  -webkit-animation-delay: -0.16s;
+	  animation-delay: -0.16s;
+	  top: 30%;left: 0;bottom: 0;right: 0;
+	}
+	.loader:before,
+	.loader:after {
+	  content: '';
+	  position: absolute;
+	  top: 0;
+	}
+	.loader:before {
+	  left: -3.5em;
+	  -webkit-animation-delay: -0.32s;
+	  animation-delay: -0.32s;
+	}
+	.loader:after {
+	  left: 3.5em;
+	}
+	@-webkit-keyframes load7 {
+	  0%,
+	  80%,
+	  100% {
+		box-shadow: 0 2.5em 0 -1.3em;
+	  }
+	  40% {
+		box-shadow: 0 2.5em 0 0;
+	  }
+	}
+	@keyframes load7 {
+	  0%,
+	  80%,
+	  100% {
+		box-shadow: 0 2.5em 0 -1.3em;
+	  }
+	  40% {
+		box-shadow: 0 2.5em 0 0;
+	  }
+	} */
+	
+	/* .loader {
+	  font-size: 10px;
+	  margin: 50px auto;
+	  text-indent: -9999em;
+	  width: 8em;
+	  height: 8em;
+	  border-radius: 50%;
+	  background: transparent ;
+	  background: -moz-linear-gradient(left, #CCCCCC 10%, rgba(255, 255, 255, 0) 42%);
+	  background: -webkit-linear-gradient(left, #CCCCCC 10%, rgba(255, 255, 255, 0) 42%);
+	  background: -o-linear-gradient(left, #CCCCCC 10%, rgba(255, 255, 255, 0) 42%);
+	  background: -ms-linear-gradient(left, #CCCCCC 10%, rgba(255, 255, 255, 0) 42%);
+	  background: linear-gradient(to right, #CCCCCC 10%, rgba(255, 255, 255, 0) 42%);
+	  position: fixed;
+	  top: 30%;left: 0;bottom: 0;right: 0;
+	  -webkit-animation: load3 1.4s infinite linear;
+	  animation: load3 1.4s infinite linear;
+	  -webkit-transform: translateZ(0);
+	  -ms-transform: translateZ(0);
+	  transform: translateZ(0);
+	}
+	.loader:before {
+	  width: 50%;
+	  height: 50%;
+	  background: transparent ;
+	  border-radius: 100% 0 0 0;
+	  position: absolute;
+	  top: 0;
+	  left: 0;
+	  content: '';
+	}
+	.loader:after {
+	  background: #FFFFFF ;
+	  width: 75%;
+	  height: 75%;
+	  border-radius: 50%;
+	  content: '';
+	  margin: auto;
+	  position: absolute;
+	  top: 0;
+	  left: 0;
+	  bottom: 0;
+	  right: 0;
+	}
+	@-webkit-keyframes load3 {
+	  0% {
+		-webkit-transform: rotate(0deg);
+		transform: rotate(0deg);
+	  }
+	  100% {
+		-webkit-transform: rotate(360deg);
+		transform: rotate(360deg);
+	  }
+	}
+	@keyframes load3 {
+	  0% {
+		-webkit-transform: rotate(0deg);
+		transform: rotate(0deg);
+	  }
+	  100% {
+		-webkit-transform: rotate(360deg);
+		transform: rotate(360deg);
+	  }
+	} */
+</style>

+ 39 - 0
user_ui/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 100
+				}
+			}
+		},
+		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;padding-bottom: 100rpx;
+	image{width: 456rpx;height: 178rpx;margin-bottom: 28rpx;}
+	view{font-size: 30rpx;color: #AAAAAA;font-weight: bold;}
+}	
+</style>

+ 85 - 0
user_ui/components/swiper/notice.vue

@@ -0,0 +1,85 @@
+<template>
+  <view v-if="noticelist.length">
+	  <view class="hswip flexc" >
+	  		<image :src="tztip" class="tipimg"></image>
+			<!-- :indicator-color="nactiveColor" :indicator-active-color="activeColor" -->
+			<swiper class="swiper" circular :autoplay="autoplay" :interval="interval" :duration="duration" vertical='true'>
+				<swiper-item v-for="(ite,idx) in noticelist" :key="">
+					<view class="flexc swipers" @click="getDetail(ite.noticeId)">
+						<view class="tit over">{{ite.noticeTitle}}</view>
+						<view class="num flexcc">{{ite.num}}</view>
+						<image :src="rimg" class="rimg"></image>
+						<!-- <view class="time">{{ite.issuerTime}}</view> -->
+						<!-- <view class="time" v-if="ite.createTime">{{ite.createTime.substring(0,10)}}</view> -->
+					</view>
+				</swiper-item>
+			</swiper>
+	  		
+	  </view>
+  </view>
+</template>
+
+<script>
+  export default {
+	  props:{
+	  	autoplay: {
+	  		type: Boolean,
+	  		default () {
+	  			return false
+	  		}
+	  	},
+	  	confdat:{},
+		activeColor:{
+			type:String,
+			default () {
+				return '#000000'
+			}
+		},
+		nactiveColor:{
+			type:String,
+			default () {
+				return 'rgba(0, 0, 0, .3)'
+			}
+		},
+		noticelist:{
+			type: Array,
+			default () {
+				return []
+			}
+		}
+	  },
+	data(){
+		return{
+			tztip:require('@/static/images/home/tips.png'),
+			rimg:require('@/static/images/home/rimg.png'),
+            interval: 2000,
+            duration: 500
+		}
+	},
+	methods:{
+		 getRoad(){
+		 	console.log(1)
+		 },
+		 getDetail(e){
+			 this.$emit('getNoticeDet',e)
+		 }
+	},
+	onLoad: function() {
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+.hswip /deep/ .uni-swiper-dots-vertical{right: 0;}
+.hswip /deep/  .uni-swiper-dot{width: 10rpx; height: 10rpx;}
+.hswip{width: 100%;background: #ffffff;border-radius: 20rpx;height: 100rpx;padding: 0 24rpx 0 26rpx;box-sizing: border-box;box-shadow: 0px 0px 3px 0px #DEDEDE;
+	.tipimg{width: 38rpx;height: 40rpx;flex: 0 0 auto;margin-right: 22rpx;}
+	.swiper{flex: 1;height: 100rpx;
+	.swipers{height: 100rpx;}
+		.tit{flex: 1;font-weight: 500;font-size: 26rpx;color: #272707;}
+		.num{font-weight: bold;
+font-size: 22rpx;min-width: 30rpx;height: 30rpx;padding: 0 4rpx;box-sizing: border-box;background: #D32C26;border-radius: 30rpx;color: #FFFFFF;margin-left: 14rpx;}
+		.rimg{width: 14rpx;height: 24rpx;margin-left: 14rpx;}
+	}
+}
+</style>

+ 72 - 0
user_ui/components/toptab/navbar.vue

@@ -0,0 +1,72 @@
+<template>
+	<view>
+		<image :src="navbg" class="navbg"></image>
+		<uni-nav-bar :left-icon="leftflag?'left':''" :title="navtit" color="#ffffff"  :background-color="bgColor" :border="navborder" statusBar='true' fixed="true" @clickLeft='getBack' @clickRight='getDetail'>
+			<block slot="right" v-if="rtype&&rtype=='come'">
+				<view class="right">
+					<view>预约信息</view>
+				</view>
+			</block>
+		</uni-nav-bar>
+	</view>
+</template>
+
+<script>
+	export default{
+		props:{
+			bgColor:{
+				type: String,
+				default () {
+					return 'transparent'
+				}
+			},
+			navborder:{
+				type: Boolean,
+				default () {
+					return false
+				}
+			},
+			rtype:{
+				type: String,
+				default () {
+					return ''
+				}
+			},
+			navtit:'',
+			leftflag:{
+				type: Boolean,
+				default () {
+					return false
+				}
+			}
+		},
+		data(){
+			return{
+				navbg:require("@/static/images/navbg.png"),
+				backgroundColor: "transparent",
+			}
+		},
+		methods:{
+			getBack(){
+				if(this.leftflag){
+					uni.navigateBack({
+						delta:1
+					})
+				}
+				
+			},
+			getDetail(){
+				this.$emit('getDetail')
+			},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.navbg{width: 100%;height: 692rpx;position: fixed;left: 0;right: 0;top: 0;z-index: 1;}
+.navtit{display: flex;align-items: center;justify-content: center;font-size: 30rpx;color: #ffffff;width: 100%;
+}
+.right{position: absolute;right: 0;padding: 0 16rpx 0 26rpx;border-radius: 28rpx 0 0 28rpx;height: 56rpx;line-height: 56rpx;font-weight: bold;
+font-size: 24rpx;background-color: #7DC7FE;
+color: #FFFFFF;}
+</style>

+ 176 - 0
user_ui/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>

+ 84 - 0
user_ui/components/toptab/tab.vue

@@ -0,0 +1,84 @@
+<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])">
+					{{ite.tit}}
+				</view>
+			</block>
+			<block v-else>
+				<view class="tit" :style="'height:'+height+'rpx'" :class="tabidx==ite.val?'act':''" @click="getTab(ite.val)" >
+					{{ite.tit}}
+				</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: [String,Number],
+				default () {
+					return ''
+				}
+			}
+		},
+		data(){
+			return{
+				// :0,
+			}
+		},
+		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:#00A9F0;
+		 .tit{flex: 1;display: flex;justify-content: center;position: relative;font-weight: 500;align-items: center;
+font-size: 26rpx;
+color: #FFFFFF;
+			&.act{font-weight: bold;font-size: 30rpx;
+			 &::after{content: '';width: 30rpx;height: 10rpx;background:#FFFFFF;position: absolute;left: 50%;margin-left: -10rpx;bottom: 16rpx;border-radius: 4rpx;}
+			
+			}
+		 }
+	}
+</style>

+ 167 - 0
user_ui/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>

+ 28 - 0
user_ui/config.js

@@ -0,0 +1,28 @@
+// 应用全局配置
+module.exports = {
+  baseUrl: 'https://vue.ruoyi.vip/prod-api',
+  // baseUrl: 'http://47.99.82.249:5010/prod-api',
+  // baseUrl: 'http://192.168.101.245:8065',
+  // baseUrlimg: 'http://114.99.127.243:2001',
+  // 应用信息
+  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"
+      }
+    ]
+  }
+}

+ 36 - 0
user_ui/main.js

@@ -0,0 +1,36 @@
+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"
+/** 
+ * 引用全局加载 loading
+ * */
+import loading from "./components/loading/loading.vue"
+Vue.component('loading',loading);
+//是否显示加载中 的方法 调用store中的mutations方法
+function loadings(tf){
+    /* if(tf){
+        store.commit("switch_loading",tf)
+    }else{
+        store.commit("switch_loading")
+    } */
+	store.commit("switch_loading",tf);
+}
+//也挂在到原型链上 方便在每个页面中  使用 this.$loading()  去显示加载中
+Vue.prototype.$loading = loadings;
+
+
+Vue.config.productionTip = false
+Vue.prototype.$store = store
+Vue.prototype.$toast=toast;
+App.mpType = 'app'
+
+const app = new Vue({
+  ...App
+})
+
+app.$mount()
+export default app

+ 69 - 0
user_ui/manifest.json

@@ -0,0 +1,69 @@
+{
+    "name" : "若依移动端",
+    "appid" : "__UNI__25A9D80",
+    "description" : "",
+    "versionName" : "1.1.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueCompiler" : "uni-app",
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        "modules" : {},
+        "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" : {},
+            "sdkConfigs" : {}
+        }
+    },
+    "quickapp" : {},
+    "mp-weixin" : {
+        "appid" : "wxccd7e2a0911b3397",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : false,
+            "minified" : true,
+            "postcss" : true
+        },
+        "optimization" : {
+            "subPackages" : true
+        },
+        "usingComponents" : true
+    },
+    "vueVersion" : "2",
+    "h5" : {
+        "template" : "static/index.html",
+        "devServer" : {
+            "port" : 9090,
+            "https" : false
+        },
+        "title" : "RuoYi-App",
+        "router" : {
+            "mode" : "history",
+            "base" : ""
+        }
+    }
+}

+ 24 - 0
user_ui/package-lock.json

@@ -0,0 +1,24 @@
+{
+  "name": "property_ui",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "base-64": "^1.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=="
+    }
+  },
+  "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=="
+    }
+  }
+}

+ 5 - 0
user_ui/package.json

@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "base-64": "^1.0.0"
+  }
+}

+ 161 - 0
user_ui/pages.json

@@ -0,0 +1,161 @@
+{
+  "pages": [
+	  {
+	    "path": "pages/index",
+	    "style": {
+	      "navigationBarTitleText": "若依移动端框架",
+	      "navigationStyle": "custom"
+	    }
+	  },
+	  {
+    "path": "pages/login",
+    "style": {
+      "navigationBarTitleText": "登录",
+	  "navigationStyle": "custom"
+    }
+  }, 
+  {
+    "path": "pages/tlogin",
+    "style": {
+      "navigationBarTitleText": "登录",
+  	  "navigationStyle": "custom"
+    }
+  }, 
+  {
+    "path": "pages/register",
+    "style": {
+      "navigationBarTitleText": "注册",
+	  "navigationStyle": "custom"
+    }
+  },  
+  {
+    "path": "pages/agreement",
+    "style": {
+      "navigationBarTitleText": "用户协议及隐私条款"
+    }
+  },
+  
+  {
+    "path": "pages/work/index",
+    "style": {
+      "navigationBarTitleText": "工作台"
+    }
+  }, {
+    "path": "pages/mine/index",
+    "style": {
+      "navigationBarTitleText": "我的"
+    }
+  }, {
+    "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/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": "浏览文本"
+    }
+  }],
+  "subPackages": [
+  	{
+  		"root": "work",
+		"pages": [
+			{
+				"path": "pages/car/index",
+				"style": {
+					"navigationBarTitleText": "车辆管控",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/car/carku",
+				"style": {
+					"navigationBarTitleText": "车库管理",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/car/carcheck",
+				"style": {
+					"navigationBarTitleText": "外来车辆登记",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/car/illegalParking",
+				"style": {
+					"navigationBarTitleText": "违停管理",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/car/illegalcheck",
+				"style": {
+					"navigationBarTitleText": "违停登记",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			}
+		]
+  	}
+  ],
+  "preloadRule":{
+	"pages/index": {
+		"network": "all",
+		"packages": ["work"]
+	}, 
+	"pages/login": {
+	 	"network": "all",
+	 	"packages": ["work"]
+	}
+  },
+  "globalStyle": {
+    "navigationBarTextStyle": "black",
+    "navigationBarTitleText": "RuoYi",
+    "navigationBarBackgroundColor": "#FFFFFF"
+  }
+}

+ 80 - 0
user_ui/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
user_ui/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
user_ui/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>

+ 344 - 0
user_ui/pages/index.vue

@@ -0,0 +1,344 @@
+<template>
+  <view :style="'padding-top:'+nvaHeight+'px;'">
+		<view class="navbox">
+			<uni-nav-bar  color="#ffffff" leftWidth='400rpx'  :background-color="backgroundColor" :border="false" statusBar='true' fixed="true">
+				<block slot="left">
+					<view class="topl flexc">
+						<image :src="adrimg" ></image>
+						<view class="over">{{city}}</view>
+					</view>
+				</block>
+			</uni-nav-bar>
+		</view>
+		<!-- 主体 -->
+		<image :src="navbg" class="navbg"></image>
+		<view class="wymain" >
+			<view class="adrbox">
+				<view class="flexc mb14">
+					<image :src="adraimg" class="adr"></image>
+					<view class="adrtit">智慧<text>社区</text></view>
+				</view>
+				<view class="adrtxt flexc mb4">
+					<view class="over">嗨~刘源禧!</view><text>经理</text>
+				</view>
+				<view class="adrtip">幸福小区物业办公室</view>
+				<image :src="adrbgimg" class="adrbgimg"></image>
+			</view>
+			<view class="mb22">
+				<notice :noticelist="noticelist"  :autoplay='autoplay' @getNoticeDet="getNoticeDet"></notice>
+			</view>
+			<!-- 统计 -->
+			<view class="contbox">
+				<view class="cont flexc">
+					<image :src="conta"></image>
+					<view>今日数据统计</view>
+				</view>
+				<view class="lists">
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">空闲车位</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">空闲充电桩</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">进入车辆</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">离开车辆</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">外来车辆</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">违停登记</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">外来人员</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">进入人员</view>
+					</view>
+					<block v-if="zhanflag">
+						<view class="list">
+							<view class="tit ca">21</view>
+							<view class="txt">已巡更</view>
+						</view>
+						<view class="list">
+							<view class="tit ca">21</view>
+							<view class="txt">未巡更</view>
+						</view>
+						<view class="list">
+							<view class="tit cb">21</view>
+							<view class="txt">家政订单</view>
+						</view>
+						<view class="list">
+							<view class="tit cb">21</view>
+							<view class="txt">完成订单</view>
+						</view>
+						<view class="list">
+							<view class="tit cc">21</view>
+							<view class="txt">今日报修</view>
+						</view>
+						<view class="list">
+							<view class="tit cc">21</view>
+							<view class="txt">已派报修</view>
+						</view>
+						<view class="list">
+							<view class="tit cc">21</view>
+							<view class="txt">投诉建议</view>
+						</view>
+						<view class="list">
+							<view class="tit cc">21</view>
+							<view class="txt">已回投诉</view>
+						</view>
+					</block>
+				</view>
+				<view class="upbox" @click="getZhanFn">
+					<image :src="upimg" :class="zhanflag?'':'zhe'"></image>
+					<view>{{zhanflag?'收起':'展开'}}</view>
+				</view>
+			</view>
+			<view class="contbox mb16">
+				<view class="cont flexc mb9">
+					<image :src="contb"></image>
+					<view>物业管理</view>
+				</view>
+				<view class="lists">
+					<view class="list bimga" @click="getCarFn">
+						<view class="imgs"><image :src="htaba" class="imga"></image></view>
+						<view class="txt">车辆管控</view>
+					</view>
+					<view class="list bimga" @click="getCarKuFn">
+						<view class="imgs"><image :src="htabb" class="imgb"></image></view>
+						<view class="txt">车库管理</view>
+					</view>
+					<view class="list bimga" @click="getCarCheckFn">
+						<view class="imgs"><image :src="htabc" class="imgc"></image></view>
+						<view class="txt">外来车辆登记</view>
+					</view>
+					<view class="list bimga" @click="getillegalParkFn">
+						<view class="imgs"><image :src="htabd" class="imgd"></image></view>
+						<view class="txt">违停管理</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabe" class="imge"></image></view>
+						<view class="txt">人员管理</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabf" class="imgf"></image></view>
+						<view class="txt">来访管理</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabg" class="imgd"></image></view>
+						<view class="txt">物业费管理</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabh" class="imgd"></image></view>
+						<view class="txt">房屋管理</view>
+					</view>
+				</view>
+			</view>
+			<view class="contbox mb16">
+				<view class="cont flexc mb9">
+					<image :src="contc"></image>
+					<view>物业服务</view>
+				</view>
+				<view class="lists">
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabi" class="imgg"></image></view>
+						<view class="txt">今日巡更</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabj" class="imgb"></image><view class="tips">3</view>
+						</view>
+						<view class="txt">物业报修</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabk" class="imgb"></image></view>
+						<view class="txt">维修人员管理</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabl" class="imga"></image><view class="tips">1</view></view>
+						<view class="txt">投诉建议</view>
+					</view>
+				</view>
+			</view>
+			<view class="contbox mb16">
+				<view class="cont flexc mb9">
+					<image :src="contd"></image>
+					<view>社区管理</view>
+				</view>
+				<view class="lists">
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabm" class="imgh"></image></view>
+						<view class="txt">党建信息</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabn" class="imgi"></image><view class="tips">27</view></view>
+						<view class="txt">社区资讯</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabo" class="imgf"></image></view>
+						<view class="txt">员工培训</view>
+					</view>
+					<view class="list bimga">
+						<view class="imgs"><image :src="htabp" class="imgi"></image></view>
+						<view class="txt">社区资产</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	<loading></loading>
+	 <footers v-if="isfootflag"  :footerindex="footerindex"></footers>
+  </view>
+</template>
+
+<script>
+import footers from '@/components/footer/footer.vue'
+import notice from '@/components/swiper/notice.vue'
+  export default {
+	components:{footers,notice},
+	data(){
+		return{
+			footerindex:'home',
+			isfootflag:true,
+			nvaHeight:44,
+			// activeColor:'#A7CDF9',
+			// nactiveColor:'#DADADA',
+			backgroundColor: "transparent",
+			navbg:require("@/static/images/navbg.png"),
+			adrimg:require("@/static/images/home/adr.png"),
+			adraimg:require("@/static/images/home/adra.png"),
+			adrbgimg:require("@/static/images/home/adrbg.png"),
+			conta:require("@/static/images/home/conta.png"),
+			contb:require("@/static/images/home/contb.png"),
+			contc:require("@/static/images/home/contc.png"),
+			contd:require("@/static/images/home/contd.png"),
+			htaba:require("@/static/images/home/htaba.png"),
+			htabb:require("@/static/images/home/htabb.png"),
+			htabc:require("@/static/images/home/htabc.png"),
+			htabd:require("@/static/images/home/htabd.png"),
+			htabe:require("@/static/images/home/htabe.png"),
+			htabf:require("@/static/images/home/htabf.png"),
+			htabg:require("@/static/images/home/htabg.png"),
+			htabh:require("@/static/images/home/htabh.png"),
+			htabi:require("@/static/images/home/htabi.png"),
+			htabj:require("@/static/images/home/htabj.png"),
+			htabk:require("@/static/images/home/htabk.png"),
+			htabl:require("@/static/images/home/htabl.png"),
+			htabm:require("@/static/images/home/htabm.png"),
+			htabn:require("@/static/images/home/htabn.png"),
+			htabo:require("@/static/images/home/htabo.png"),
+			htabp:require("@/static/images/home/htabp.png"),
+			upimg:require("@/static/images/home/up.png"),
+			city:'幸福大街',
+			autoplay:false,
+			zhanflag:true,
+			noticelist:[{noticeTitle:"您有1条报修信息,请及时查看处理!",num:'4'},{noticeTitle:"您有1条报修信息,请及时查看处理!",num:'12'}]
+		}
+	},
+	onPageScroll(e) {
+		var scrollTop = Number(e.scrollTop);
+		if (scrollTop > 0) {
+			this.backgroundColor = '#C3EDFF'
+		} else {
+			this.backgroundColor = 'transparent'
+		}
+	},
+    onLoad: function() {
+		uni.getSystemInfo({
+			success: (e) => {
+				this.nvaHeight = Number(e.statusBarHeight)+44;
+			}
+		})
+    },
+	methods:{
+		getNoticeDet(){
+			
+		},
+		getZhanFn(){
+			this.zhanflag=!this.zhanflag
+		},
+		getCarFn(){//车辆管控
+			this.$tab.navigateTo(`/work/pages/car/index`) 
+		},
+		getCarKuFn(){//车库管理
+			this.$tab.navigateTo(`/work/pages/car/carku`) 
+		},
+		getCarCheckFn(){//外来车辆登记
+			this.$tab.navigateTo(`/work/pages/car/carcheck`) 
+		},
+		getillegalParkFn(){//违停管理
+			this.$tab.navigateTo(`/work/pages/car/illegalParking`) 
+		},
+	}
+  }
+</script>
+<style lang="scss" scoped>
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.navbg{width: 100%;height: 782rpx;}
+.wymain{z-index: 2;position: relative;padding: 0 24rpx;}
+.topl{overflow: hidden;padding-left: 16rpx;
+	image{width: 18rpx;height: 22rpx;margin-right: 14rpx;flex: 0 0 auto;}
+	view{font-weight: bold;font-size: 26rpx;color: #272727;}
+}
+.adrbox{position: relative;padding:8rpx 240rpx 16rpx 36rpx;margin-bottom: 14rpx;
+	.adr{width: 36rpx;height: 34rpx;margin-right: 14rpx;}
+	.adrtit{font-size: 17px;color: #272727;font-weight: bold;
+		text{color: #0256FD;}
+	}
+	.adrtxt{font-size: 16px;color: #272727;font-weight: bold;
+		text{font-size: 10px;color: #3F7EFD;display: inline-flex;background: rgba(119, 171, 184, 0.3);margin-left: 22rpx;min-width: 66rpx;height: 30rpx;padding: 0 14rpx;box-sizing: border-box;flex: 0 0 auto;border-radius: 8px;align-items: center;justify-content: center;}
+	}
+	.adrtip{font-weight: 500;font-size: 24rpx;color: #828282;}
+
+	.adrbgimg{width: 212rpx;height: 236rpx;position: absolute;right: 20rpx;top: -70rpx;}
+}
+.contbox{
+	.cont{padding-left: 24rpx;margin-bottom: 12rpx;
+		image{width: 32rpx;height: 32rpx;margin-right: 16rpx;}
+		view{font-size: 15px;color: #272727;font-weight: bold;}
+	}
+	.lists{
+		display: flex;align-items: center;flex-wrap: wrap;
+		.list{padding: 8rpx 0;
+			width: 25%;display: flex;flex-direction: column;align-items: center;
+			.tit{font-weight: bold;font-size: 30rpx;color: #3565ED;line-height: 60rpx;font-style: italic;margin-bottom: 8rpx;
+				&.ca{color: #FF7E00;}
+				&.cb{color: #28C529;}
+				&.cc{color: #FF3737;}
+			}
+			.txt{font-weight: 500;font-size: 26rpx;color: #272727;}
+			&.bimga{padding: 16rpx 0;}
+			.imgs{display: flex;align-items: center;justify-content: center;width: 48rpx;height: 48rpx;margin-bottom: 18rpx;position: relative;
+				.imga{width: 48rpx;height: 38rpx;}
+				.imgb{width: 48rpx;height: 46rpx;}
+				.imgc{width: 44rpx;height: 48rpx;}
+				.imgd{width: 48rpx;height: 42rpx;}
+				.imge{width: 46rpx;height: 46rpx;}
+				.imgf{width: 48rpx;height: 48rpx;}
+				.imgg{width: 42rpx;height: 48rpx;}
+				.imgh{width: 44rpx;height: 44rpx;}
+				.imgi{width: 48rpx;height: 44rpx;}
+				.tips{position: absolute;min-width: 20rpx;top: -4rpx;left: 36rpx;box-sizing: border-box;
+height: 20rpx;padding: 0 4rpx;display: flex;align-items: center;justify-content: center;font-weight: bold;font-size: 16rpx;color: #FCF9F1;background: #D32C26;border-radius: 10rpx;
+				}
+			}
+		}
+	}
+	.upbox{display: flex;align-items: center;justify-content: center;flex-direction: column;margin-top: 8rpx;padding-top: 8rpx;margin-bottom: 6rpx;
+		image{width: 24rpx;height: 20rpx;margin-bottom: 8rpx;transition: all 0.3s;
+			&.zhe{transform: rotate(-180deg);}
+		}
+		view{font-weight: 500;font-size: 22rpx;color: #AAAAAA;}
+	}
+}
+</style>

+ 88 - 0
user_ui/pages/indexs.vue

@@ -0,0 +1,88 @@
+<template>
+	<view>
+		
+	<loading></loading>	
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{},
+		data(){
+			return{
+				hrimg:require('@/statics/logo.png'),
+				list:[],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+			}
+		},
+		onLoad: function() {
+		
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			// var listTop=Number(this.listTop)-Number(this.nvaHeight)
+			if(scrollTop>2){
+				this.scroflag=true
+			}else{
+				this.scroflag=false
+			}
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			// getNextFn(){
+			// 	this.$tab.navigateTo("/work/pages/business/add")
+			// },
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(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>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+
+</style>

+ 151 - 0
user_ui/pages/login.vue

@@ -0,0 +1,151 @@
+<template>
+	<view class="regbox" v-if="loginflag">
+		<image :src="lbg" class="navbg"></image>
+		<image :src="fbg" class="fbg"></image>
+		<view class="wymain">
+			<image :src="headimg" class="headimg"></image>
+			<!-- 微信登录 -->
+			<button type="primary" class="rbtn" open-type="getUserInfo" @getuserinfo="getuserinfo">
+				<image :src="vxtab" class="vxtab"></image>
+				<text class="btn-txt">微信一键登录</text>
+			</button>
+			<button type="primary" class=" rbtn" @click="getlogin">
+				<image :src="zhtab" class="zhtab"></image>
+				<text class="btn-txt">账号密码登录</text>
+			</button>
+			<view class="line"></view>
+			<view class="rbtn btna" @click="getregister">还没账号?去注册</view>
+		</view>
+
+		
+		<phone-btn :type="typeflag" @getPhoneNumber='getPhoneNumber' @getClose="getClose"></phone-btn>
+	</view>
+</template>
+
+<script>
+	import * as base64 from "base-64"
+	// 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 {
+				lbg: require('@/static/images/mine/lbg.png'),
+				fbg: require('@/static/images/mine/fbg.png'),
+				vxtab: require('@/static/images/mine/vxtab.png'),
+				zhtab: require('@/static/images/mine/zhtab.png'),
+				fbg: require('@/static/images/mine/fbg.png'),
+				headimg: require('@/static/logo.png'),
+				typeflag: false,
+				loginflag: false,
+				loginForm: {
+					username: "",
+					code: "",
+					password: '',
+				},
+			}
+		},
+
+		methods: {
+			handlePrivacy() {
+				this.$tab.navigateTo(`/pages/agreement`)
+			},
+			getlogin(){
+				this.$tab.navigateTo(`/pages/tlogin`)
+			},
+			getregister(){
+				this.$tab.navigateTo(`/pages/register`)
+			},
+			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
+				}
+		 },
+			getClose() {
+				this.typeflag = false
+			},
+		 getPhoneNumber(data) {
+				var that = this;
+				var params = data
+				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')
+				})
+			},
+		},
+
+		onLoad: function() {
+			if (getToken()) {
+				this.$tab.reLaunch('/pages/index')
+				// 判断有什么角色
+			} else {
+				this.loginflag = true;
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+.navbg{width: 100%;height: 100vh;}
+.fbg{width: 100%;height: 750rpx;position: absolute;bottom: 0;left: 0;}
+.wymain{z-index: 2;position: relative;padding: 320rpx 60rpx;}
+.headimg{width: 110rpx;height: 110rpx;margin:0 auto 128rpx;display: block;}
+
+.rbtn {height: 84rpx;margin-bottom:60rpx;font-weight: bold;font-size: 28rpx;color: #FFFFFF;display: flex;align-items: center;justify-content: center;background: #0156FE;
+border-radius: 10rpx;
+	.vxtab{width: 38rpx;height: 32rpx;margin-right: 18rpx;}
+	.zhtab{width: 30rpx;height: 34rpx;margin-right: 22rpx;}
+	&.btna{background: #D9E6FF;color: #0156FE;}
+}
+.line{width: 60rpx;height: 6rpx;background: #CDCDCD;margin: 0 auto 60rpx;}
+</style>

+ 75 - 0
user_ui/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/logo200.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>

+ 631 - 0
user_ui/pages/mine/avatar/index.vue

@@ -0,0 +1,631 @@
+<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 {
+				imageSrc: store.getters.avatar,
+				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()
+		},
+		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
user_ui/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>

+ 308 - 0
user_ui/pages/mine/index.vue

@@ -0,0 +1,308 @@
+<template>
+  <view class="mine-container" :style="{height: `${windowHeight}px`}">
+    <!--顶部个人信息栏-->
+    <view class="header-section">
+      <view class="flex padding justify-between">
+        <view class="flex align-center">
+          <view v-if="!avatar" class="cu-avatar xl round bg-white">
+            <view class="iconfont icon-people text-gray icon"></view>
+          </view>
+          <image v-if="avatar" @click="handleToAvatar" :src="avatar" class="cu-avatar xl round" mode="widthFix">
+          </image>
+          <view v-if="!name" @click="handleToLogin" class="login-tip">
+            点击登录
+          </view>
+          <view v-if="name" @click="handleToInfo" class="user-info">
+            <view class="u_title">
+              用户名:{{ name }}
+            </view>
+          </view>
+        </view>
+        <view @click="handleToInfo" class="flex align-center">
+          <text>个人信息</text>
+          <view class="iconfont icon-right"></view>
+        </view>
+      </view>
+    </view>
+
+    <view class="content-section">
+      <view class="mine-actions grid col-4 text-center">
+        <view class="action-item" @click="handleJiaoLiuQun">
+          <view class="iconfont icon-friendfill text-pink icon"></view>
+          <text class="text">交流群</text>
+        </view>
+        <view class="action-item" @click="handleBuilding">
+          <view class="iconfont icon-service text-blue icon"></view>
+          <text class="text">在线客服</text>
+        </view>
+        <view class="action-item" @click="handleBuilding">
+          <view class="iconfont icon-community text-mauve icon"></view>
+          <text class="text">反馈社区</text>
+        </view>
+        <view class="action-item" @click="handleBuilding">
+          <view class="iconfont icon-dianzan text-green icon"></view>
+          <text class="text">点赞我们</text>
+        </view>
+      </view>
+
+      <view class="menu-list">
+        <view class="list-cell list-cell-arrow" @click="handleToEditInfo">
+          <view class="menu-item-box">
+            <view class="iconfont icon-user menu-icon"></view>
+            <view>编辑资料</view>
+          </view>
+        </view>
+        <view class="list-cell list-cell-arrow" @click="handleHelp">
+          <view class="menu-item-box">
+            <view class="iconfont icon-help menu-icon"></view>
+            <view>常见问题</view>
+          </view>
+        </view>
+        <view class="list-cell list-cell-arrow" @click="handleAbout">
+          <view class="menu-item-box">
+            <view class="iconfont icon-aixin menu-icon"></view>
+            <view>关于我们</view>
+          </view>
+        </view>
+        <view class="list-cell list-cell-arrow" @click="handleToSetting">
+          <view class="menu-item-box">
+            <view class="iconfont icon-setting menu-icon"></view>
+            <view>应用设置</view>
+          </view>
+        </view>
+		<!-- #ifdef APP-PLUS -->
+		
+		<!-- #endif -->
+		<view class="list-cell list-cell-arrow" @click="onlineWgt">
+		  <view class="menu-item-box">
+		    <view class="iconfont icon-setting menu-icon"></view>
+		    <view>版本号{{wgtcode}}</view>
+		  </view>
+		</view>
+      </view>
+
+    </view>
+	<footers v-if="isfootflag" :footerindex="footerindex" :isHomeIndex="false"></footers>
+  </view>
+</template>
+
+<script>
+  import storage from '@/utils/storage'
+  import footers from '@/components/footer/footer.vue'
+  import {findVersion} from "@/api/system/user.js"
+  import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+  import config from '@/config'
+  const baseUrl = config.baseUrl
+  export default {
+    data() {
+      return {
+        name: this.$store.state.user.name,
+        version: getApp().globalData.config.appInfo.version,
+		footerindex: 'mine',
+		isfootflag: true,
+		wgtcode: this.$store.state.user.wgtcode,
+		platform: 'Android',
+      }
+    },
+	components: {
+		footers
+	},
+    computed: {
+      avatar() {
+        return this.$store.state.user.avatar
+      },
+      windowHeight() {
+        return uni.getSystemInfoSync().windowHeight - 50
+      }
+    },
+	onLoad() {
+		var that=this;
+		this.nvaHeight=uni.getSystemInfoSync().statusBarHeight+44;
+		// #ifdef APP-PLUS
+		plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
+			that.$store.dispatch('SetwgtFn', widgetInfo.version).then(() => {
+				that.wgtcode=widgetInfo.version
+			})
+		});
+		// #endif
+	},
+    methods: {
+		checkPermi,checkRole,
+      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')
+      },
+      handleToAvatar() {
+        this.$tab.navigateTo('/pages/mine/avatar/index')
+      },
+      handleLogout() {
+        this.$modal.confirm('确定注销并退出系统吗?').then(() => {
+          this.$store.dispatch('LogOut').then(() => {
+            this.$tab.reLaunch('/pages/index')
+          })
+        })
+      },
+      handleHelp() {
+        this.$tab.navigateTo('/pages/mine/help/index')
+      },
+      handleAbout() {
+        this.$tab.navigateTo('/pages/mine/about/index')
+      },
+      handleJiaoLiuQun() {
+        this.$modal.showToast('QQ群:①133713780(满)、②146013835(满)、③189091635')
+      },
+      handleBuilding() {
+        this.$modal.showToast('模块建设中~')
+      },
+	  onlineWgt() {
+	  	let that = this;
+	  	plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
+	  		that.$store.dispatch('SetwgtFn', widgetInfo.version).then(() => {
+	  			that.wgtcode=widgetInfo.version
+	  		})
+	  		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 => {
+	  		if (res.code == "200") {
+	  			let versionNos = res.data.code;
+	  			console.log(versionNos, 'versionNos')
+	  			// console.log(res.data.path);
+	  			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('用户点击取消');
+	  						}
+	  					}
+	  				});
+	  			} else {
+	  				this.$toast('该版本已是最新版')
+	  			}
+	  		}
+	  	}).catch(error => {
+	  		uni.hideLoading()
+	  		console.log(error)
+	  	})
+	  },
+	  getProperty(getProperty) {
+	  	// console.log("bbbbbbbbb----------->", getProperty)
+	  	let that = this;
+	  	// 在线升级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; //
+	  	});
+	  },
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #f5f6f7;
+  }
+
+  .mine-container {
+    width: 100%;
+    height: 100%;
+
+
+    .header-section {
+      padding: 15px 15px 45px 15px;
+      background-color: #3c96f3;
+      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
user_ui/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
user_ui/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>

+ 85 - 0
user_ui/pages/mine/pwd/index.vue

@@ -0,0 +1,85 @@
+<template>
+  <view class="pwd-retrieve-container">
+    <uni-forms ref="form" :value="user" labelWidth="80px">
+      <uni-forms-item name="oldPassword" label="旧密码">
+        <uni-easyinput type="password" v-model="user.oldPassword" placeholder="请输入旧密码" />
+      </uni-forms-item>
+      <uni-forms-item name="newPassword" label="新密码">
+        <uni-easyinput type="password" v-model="user.newPassword" placeholder="请输入新密码" />
+      </uni-forms-item>
+      <uni-forms-item name="confirmPassword" label="确认密码">
+        <uni-easyinput type="password" v-model="user.confirmPassword" placeholder="请确认新密码" />
+      </uni-forms-item>
+      <button type="primary" @click="submit">提交</button>
+    </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() {
+        this.$refs.form.validate().then(res => {
+          updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
+            this.$modal.msgSuccess("修改成功")
+          })
+        })
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  page {
+    background-color: #ffffff;
+  }
+
+  .pwd-retrieve-container {
+    padding-top: 36rpx;
+    padding: 15px;
+  }
+</style>

+ 78 - 0
user_ui/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')
+          })
+        })
+      }
+    }
+  }
+</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>

+ 283 - 0
user_ui/pages/register.vue

@@ -0,0 +1,283 @@
+<template>
+  <view class="regbox">
+	  <image :src="lbg" class="navbg"></image>
+	  <image :src="fbg" class="fbg"></image>
+	  <view class="wymain">
+		  <view class="head">
+		  	<view class="htit">你好,</view>
+		  	<view class="htit">欢迎注册智慧社区平台</view>
+		  	<view class="htxt" @click="getlogin">已有账号?<text>立即登录</text></view>
+		  </view>
+		    <view class="flex1" style="position: relative;">
+		  	  <!-- 手机号登录 -->
+		  	  <view class="login-form-content">
+		  
+		  	  	<view class="input-item">
+		  	  		<view class="login_tit">手机号码</view>
+		  	  		<view class="login_box">
+		  	  			<!-- <view class="login_boxl">+86</view> -->
+		  	  			 <input  v-model="datainfo.username" class="input" type="text" placeholder="请输入登录账号" maxlength="30" />
+		  	  		</view>
+		  	  	</view>
+				<view  class="input-item">
+					<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>
+		  	  	<view class="input-item" >
+		  	  		<view class="login_tit">密码</view>
+		  	  		 <view class="login_box">
+		  	  			 <uni-easyinput :inputBorder="false" type="password" v-model="datainfo.password" placeholder="请输入密码" />
+		  	  		 </view>
+		  	  	</view>
+				<view class="titico">*密码必须包含数字、大小写字母、特殊符号且大于8位</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> -->
+		  	  	
+		  	    <button v-if="captchaEnabled"  type="primary" class=" rbtn " :class="tucode&&datainfo.username&&datainfo.password?'btn2':'btn'"  @click="getRegisterFn">注册</button>
+		  	    <button v-else type="primary" class=" rbtn" :class="datainfo.username&&datainfo.password?'btn2':'btn'"   @click="getRegisterFn">注册</button>
+		  	  </view>
+		  	  
+		  	  <!-- 账号密码登录 -->
+		  		<view class="lread" @click="checkflag=!checkflag">
+		  			<view class="lreadl">
+		  				<image :src="checkimg" v-if="checkflag"></image>
+		  				<image :src="pnicon" 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>
+	  <loading></loading>
+	  <!-- <view class="rtxt" @click="getregister">还没账号?去申请注册</view> -->
+  </view>
+</template>
+
+<script>
+	import {getRegisterFn,sendSmszcOnly} from "@/api/login.js"
+	import { getToken } from '@/utils/auth'
+  export default {
+	  components:{
+		  
+	  },
+	data(){
+		return{
+			lbg:require('@/static/images/mine/lbg.png'),
+			fbg:require('@/static/images/mine/fbg.png'),
+			ldicon:require('@/static/images/mine/ldicon.png'),
+			checkimg:require('@/static/images/mine/lcicon.png'),
+			rimg:require('@/static/images/mine/rimg.png'),
+			pnicon:require('@/static/images/mine/pnicon.png'),
+			checkflag:true,
+			captchaEnabled: false,
+			duancode:'',//短信验证码
+			checkeye:false,
+			tucode:'',
+			codeUrl:'',
+			time:'',
+			timefalg:'',
+			datainfo: {
+				username: "",
+				code: "",
+				password:'',
+			},
+			timer:""
+		}
+	},
+	
+	methods:{
+		getlogin(){
+			this.$tab.redirectTo(`/pages/tlogin`)
+		},
+		handlePrivacy(){
+			this.$tab.navigateTo(`/pages/agreement`)  
+		},
+		// 获取短信验证码
+		getsendCode(){
+			var that=this;
+			if (!this.datainfo.username ) {
+				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}$/
+			// 座机号
+			let reg1=/^(0\d{2,3})-?(\d{7,8})$/
+			if (this.datainfo.username && !regphone.test(this.datainfo.username)) {
+				that.$toast("请输入正确的手机号")
+				return
+			}
+			var params={
+				'username':this.datainfo.username
+			}
+				// getSMS();
+				return
+			sendSmszcOnly(params).then(res=>{
+				if (res.code == 200) {
+					// 发送验证码
+					that.$toast("发送成功")
+					that.time=60;
+					that.timefalg=true;
+					that.setTimein()
+				} else {
+					that.$toast(res.msg)
+				}
+			})
+		},
+		// 验证码倒计时
+		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)
+		},
+		getRegisterFn(){
+			var that=this;
+					var params=this.datainfo;
+					// if(!params.nickName){
+					// 	this.$toast("请输入用户名")
+					// 	return
+					// }
+					if(!params.phonenumber){
+						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(!regphone.test(params.phonenumber)){
+						this.$toast('请输入正确的手机号')
+						return
+					}
+					if(!params.password){
+						this.$toast("请输入密码")
+						return
+					}
+					params.userName=params.phonenumber;
+					getRegisterFn(params).then(res=>{
+						if(res.code==200){
+							that.$toast("注册成功")
+							setTimeout(function(){
+								that.$tab.reLaunch(`/pages/login`)
+							},1200)
+						}
+					})
+		},
+	},
+	
+	onLoad: function() {	
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+.navbg{width: 100%;height: 100vh;}
+.fbg{width: 100%;height: 750rpx;position: absolute;bottom: 0;left: 0;}
+.wymain{z-index: 2;position: relative;padding: 180rpx 60rpx;}
+.headimg{width: 136rpx;height: 136rpx;margin:0 auto 36rpx;}
+.titico{font-weight: 500;font-size: 24rpx;color: #FF6969;margin-top: 20rpx;}
+.head{margin-bottom: 64rpx;
+	.htit{font-weight: bold;font-size: 48rpx;color: #0156FE;line-height: 60rpx;}
+	.htxt{font-weight: 500;font-size: 24rpx;color: #666666;margin-top: 30rpx;
+		text{color: #0156FE;}
+	}
+}
+.mzimg{width: 100rpx;height: 44rpx;margin: 0 auto ;}
+.regbox /deep/ .uni-easyinput__content{background-color: transparent !important;}
+.regbox /deep/ .uni-easyinput__content-input{font-size: 30rpx !important;padding-left: 0 !important;line-height: 80rpx;height: 80rpx;}
+.regbox /deep/ .uni-input-placeholder{font-size: 30rpx !important;padding-left: 0 !important;color: #808080;}
+.rtxt{font-size: 30rpx;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: 22rpx;height: 22rpx;margin-right: 12rpx;}
+	}
+	.tit{font-size: 26rpx;font-weight: 500;color: #666666;
+	text{color:#4888FA;padding: 0 6rpx;font-weight: 500;}
+}
+}
+.tab{
+	.tabtit{font-size: 30rpx;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 {height: 84rpx;margin: 120rpx 0 24rpx;font-weight: bold;font-size: 28rpx;color: #FFFFFF;line-height: 84rpx;
+		&.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: 30rpx;
+			font-weight: bold;
+			color: #343434;margin-bottom: 8rpx;
+		}
+		.login_box{display: flex;align-items: center;
+			.rimgs{width: 18rpx;height: 30rpx;flex: 0 0 auto;margin-left: 20rpx;}
+		}
+        .input {
+          width: 100%;
+          font-size: 30rpx;
+		  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: 30rpx;height: 30rpx;margin-right: 14rpx;}
+.input_ye image{width: 34rpx;height: 18rpx;}
+.codess{font-size: 28rpx;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>

+ 395 - 0
user_ui/pages/tlogin.vue

@@ -0,0 +1,395 @@
+<template>
+  <view class="regbox" v-if="loginflag">
+	  <!-- <image :src="headimg" class="headimg flex0"></image> -->
+	  <image :src="lbg" class="navbg"></image>
+	  <image :src="fbg" class="fbg"></image>
+	  <view class="wymain">
+		  <view class="head">
+		  	<view class="htit">你好,</view>
+		  	<view class="htit">欢迎登录智慧社区平台</view>
+		  	<view class="htxt" @click="getregister">还没有账号?<text>立即注册</text></view>
+		  </view>
+		    <view class="flex1" style="position: relative;">
+		  
+		  	  <!-- <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">
+		  					 <uni-easyinput :inputBorder="false" type="password" v-model="loginForm.password" placeholder="请输入密码" />
+		  	  				<!-- <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" :class="tucode&&loginForm.username&&loginForm.password?'btn2':'btn'"  @click="getLogin">登录</button>
+		  	    <button v-else type="primary" class=" rbtn " :class="loginForm.username&&loginForm.password?'btn2':'btn'"   @click="getLogin">登录</button>
+		  	  </view>
+		  	  <!-- 微信登录 -->
+		  	  <block v-if="tabidx==1">
+		  		  <button  type="primary" class="rbtn" 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="pnicon" 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>
+	  <loading></loading>
+	  <!-- <view class="rtxt " @click="getregister">还没账号?去申请注册</view> -->
+	  <phone-btn :type="typeflag" @getPhoneNumber='getPhoneNumber' @getClose="getClose"></phone-btn>
+  </view>
+</template>
+
+<script>
+	import * as base64 from "base-64"
+	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{
+			lbg:require('@/static/images/mine/lbg.png'),
+			fbg:require('@/static/images/mine/fbg.png'),
+			headimg:require('@/static/logo.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:true,
+			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.redirectTo(`/pages/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:base64.encode(that.loginForm.password),
+					captchaEnabled:that.captchaEnabled,
+			  	}					  
+			  	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
+			 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') 
+		   })
+		 },
+		 
+		 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=base64.decode(newObj.password);
+		  	this.jzflag=true;
+		  }
+		  
+		}	
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+.navbg{width: 100%;height: 100vh;}
+.fbg{width: 100%;height: 750rpx;position: absolute;bottom: 0;left: 0;}
+.wymain{z-index: 2;position: relative;padding: 180rpx 60rpx;}
+.headimg{width: 136rpx;height: 136rpx;margin:0 auto 36rpx;}
+.head{margin-bottom: 64rpx;
+	.htit{font-weight: bold;font-size: 48rpx;color: #0156FE;line-height: 60rpx;}
+	.htxt{font-weight: 500;font-size: 24rpx;color: #666666;margin-top: 30rpx;
+		text{color: #0156FE;}
+	}
+}
+.mzimg{width: 100rpx;height: 44rpx;margin: 0 auto ;}
+.regbox /deep/ .uni-easyinput__content{background-color: transparent !important;}
+.regbox /deep/ .uni-easyinput__content-input{font-size: 30rpx !important;padding-left: 0 !important;line-height: 80rpx;height: 80rpx;}
+.regbox /deep/ .uni-input-placeholder{font-size: 30rpx !important;padding-left: 0 !important;color: #808080;}
+.rtxt{font-size: 30rpx;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: 22rpx;height: 22rpx;margin-right: 12rpx;}
+	}
+	.tit{font-size: 26rpx;font-weight: 500;color: #666666;
+	text{color:#4888FA;padding: 0 6rpx;font-weight: 500;}
+}
+}
+.tab{
+	.tabtit{font-size: 30rpx;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 {height: 84rpx;margin: 120rpx 0 24rpx;font-weight: bold;font-size: 28rpx;color: #FFFFFF;line-height: 84rpx;
+		&.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: 30rpx;
+			font-weight: bold;
+			color: #343434;margin-bottom: 8rpx;
+		}
+		.login_box{display: flex;align-items: center;
+			.rimgs{width: 18rpx;height: 30rpx;flex: 0 0 auto;margin-left: 20rpx;}
+		}
+        .input {
+          width: 100%;
+          font-size: 30rpx;
+		  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: 30rpx;height: 30rpx;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>

+ 183 - 0
user_ui/pages/work/index.vue

@@ -0,0 +1,183 @@
+<template>
+  <view class="work-container">
+    <!-- 轮播图 -->
+    <uni-swiper-dot class="uni-swiper-dot-box" :info="data" :current="current" field="content">
+      <swiper class="swiper-box" :current="swiperDotIndex" @change="changeSwiper">
+        <swiper-item v-for="(item, index) in data" :key="index">
+          <view class="swiper-item" @click="clickBannerItem(item)">
+            <image :src="item.image" mode="aspectFill" :draggable="false" />
+          </view>
+        </swiper-item>
+      </swiper>
+    </uni-swiper-dot>
+
+    <!-- 宫格组件 -->
+    <uni-section title="系统管理" type="line"></uni-section>
+    <view class="grid-body">
+      <uni-grid :column="4" :showBorder="false" @change="changeGrid">
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="person-filled" size="30"></uni-icons>
+            <text class="text">用户管理</text>
+          </view>
+        </uni-grid-item>
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="staff-filled" size="30"></uni-icons>
+            <text class="text">角色管理</text>
+          </view>
+        </uni-grid-item>
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="color" size="30"></uni-icons>
+            <text class="text">菜单管理</text>
+          </view>
+        </uni-grid-item>
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="settings-filled" size="30"></uni-icons>
+            <text class="text">部门管理</text>
+          </view>
+        </uni-grid-item>
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="heart-filled" size="30"></uni-icons>
+            <text class="text">岗位管理</text>
+          </view>
+        </uni-grid-item>
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="bars" size="30"></uni-icons>
+            <text class="text">字典管理</text>
+          </view>
+        </uni-grid-item>
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="gear-filled" size="30"></uni-icons>
+            <text class="text">参数设置</text>
+          </view>
+        </uni-grid-item>
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="chat-filled" size="30"></uni-icons>
+            <text class="text">通知公告</text>
+          </view>
+        </uni-grid-item>
+        <uni-grid-item>
+          <view class="grid-item-box">
+            <uni-icons type="wallet-filled" size="30"></uni-icons>
+            <text class="text">日志管理</text>
+          </view>
+        </uni-grid-item>
+      </uni-grid>
+    </view>
+  </view>
+</template>
+
+<script>
+  export default {
+    data() {
+      return {
+        current: 0,
+        swiperDotIndex: 0,
+        data: [{
+            image: '/static/images/banner/banner01.jpg'
+          },
+          {
+            image: '/static/images/banner/banner02.jpg'
+          },
+          {
+            image: '/static/images/banner/banner03.jpg'
+          }
+        ]
+      }
+    },
+    methods: {
+      clickBannerItem(item) {
+        console.info(item)
+      },
+      changeSwiper(e) {
+        this.current = e.detail.current
+      },
+      changeGrid(e) {
+        this.$modal.showToast('模块建设中~')
+      }
+    }
+  }
+</script>
+
+<style lang="scss">
+  /* #ifndef APP-NVUE */
+  page {
+    display: flex;
+    flex-direction: column;
+    box-sizing: border-box;
+    background-color: #fff;
+    min-height: 100%;
+    height: auto;
+  }
+
+  view {
+    font-size: 14px;
+    line-height: inherit;
+  }
+
+  /* #endif */
+
+  .text {
+    text-align: center;
+    font-size: 26rpx;
+    margin-top: 10rpx;
+  }
+
+  .grid-item-box {
+    flex: 1;
+    /* #ifndef APP-NVUE */
+    display: flex;
+    /* #endif */
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    padding: 15px 0;
+  }
+
+  .uni-margin-wrap {
+    width: 690rpx;
+    width: 100%;
+    ;
+  }
+
+  .swiper {
+    height: 300rpx;
+  }
+
+  .swiper-box {
+    height: 150px;
+  }
+
+  .swiper-item {
+    /* #ifndef APP-NVUE */
+    display: flex;
+    /* #endif */
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    color: #fff;
+    height: 300rpx;
+    line-height: 300rpx;
+  }
+
+  @media screen and (min-width: 500px) {
+    .uni-swiper-dot-box {
+      width: 400px;
+      /* #ifndef APP-NVUE */
+      margin: 0 auto;
+      /* #endif */
+      margin-top: 8px;
+    }
+
+    .image {
+      width: 100%;
+    }
+  }
+</style>

+ 39 - 0
user_ui/permission.js

@@ -0,0 +1,39 @@
+import { getToken } from '@/utils/auth'
+
+// 登录页面
+const loginPage = "/pages/login"
+  
+// 页面白名单
+const whiteList = ['/pages/index','/pages/agreement',
+  '/pages/login','/pages/tlogin', '/pages/register', '/pages/common/webview/index'
+]
+
+// 检查地址白名单
+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)
+    }
+  })
+})

+ 60 - 0
user_ui/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
user_ui/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
user_ui/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
user_ui/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
user_ui/static/favicon.ico


+ 90 - 0
user_ui/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
user_ui/static/font/iconfont.ttf


BIN
user_ui/static/images/banner/banner01.jpg


BIN
user_ui/static/images/banner/banner02.jpg


BIN
user_ui/static/images/banner/banner03.jpg


BIN
user_ui/static/images/home/adr.png


BIN
user_ui/static/images/home/adra.png


BIN
user_ui/static/images/home/adrbg.png


BIN
user_ui/static/images/home/conta.png


BIN
user_ui/static/images/home/contb.png


BIN
user_ui/static/images/home/contc.png


BIN
user_ui/static/images/home/contd.png


BIN
user_ui/static/images/home/htaba.png


BIN
user_ui/static/images/home/htabb.png


BIN
user_ui/static/images/home/htabc.png


BIN
user_ui/static/images/home/htabd.png


BIN
user_ui/static/images/home/htabe.png


BIN
user_ui/static/images/home/htabf.png


BIN
user_ui/static/images/home/htabg.png


BIN
user_ui/static/images/home/htabh.png


BIN
user_ui/static/images/home/htabi.png


BIN
user_ui/static/images/home/htabj.png


BIN
user_ui/static/images/home/htabk.png


BIN
user_ui/static/images/home/htabl.png


BIN
user_ui/static/images/home/htabm.png


BIN
user_ui/static/images/home/htabn.png


BIN
user_ui/static/images/home/htabo.png


BIN
user_ui/static/images/home/htabp.png


BIN
user_ui/static/images/home/rimg.png


BIN
user_ui/static/images/home/tips.png


BIN
user_ui/static/images/home/up.png


BIN
user_ui/static/images/mine/fbg.png


BIN
user_ui/static/images/mine/habg.png


BIN
user_ui/static/images/mine/head.png


BIN
user_ui/static/images/mine/icon_dl_xs.png


BIN
user_ui/static/images/mine/icon_dl_yc.png


BIN
user_ui/static/images/mine/icon_dlzc_sjhm_xl.png


BIN
user_ui/static/images/mine/lbg.png


BIN
user_ui/static/images/mine/lcicon.png


BIN
user_ui/static/images/mine/ldicon.png


BIN
user_ui/static/images/mine/lnicon.png


BIN
user_ui/static/images/mine/pcicon.png


BIN
user_ui/static/images/mine/pnicon.png


BIN
user_ui/static/images/mine/profile.png


BIN
user_ui/static/images/mine/rimg.png


BIN
user_ui/static/images/mine/success.png


BIN
user_ui/static/images/mine/vxtab.png


BIN
user_ui/static/images/mine/zhtab.png


BIN
user_ui/static/images/navbg.png


BIN
user_ui/static/images/profile.jpg


BIN
user_ui/static/images/tabbar/health.png


BIN
user_ui/static/images/tabbar/health_.png


BIN
user_ui/static/images/tabbar/home.png


BIN
user_ui/static/images/tabbar/home_.png


BIN
user_ui/static/images/tabbar/mine.png


BIN
user_ui/static/images/tabbar/mine_.png


BIN
user_ui/static/images/tabbar/store.png


BIN
user_ui/static/images/tabbar/store_.png


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott