Browse Source

登录注册

lihongxiao 1 năm trước cách đây
mục cha
commit
3364c69e91
47 tập tin đã thay đổi với 3204 bổ sung112 xóa
  1. 5 2
      api/api.js
  2. 3 1
      common/router/index.js
  3. 33 0
      common/router/modules/routes.js
  4. 2 1
      common/service/config.service.js
  5. 11 3
      common/service/service.js
  6. 12 0
      node_modules/.package-lock.json
  7. 4 0
      node_modules/@amap/amap-jsapi-loader/.vscode/settings.json
  8. 111 0
      node_modules/@amap/amap-jsapi-loader/README.md
  9. 11 0
      node_modules/@amap/amap-jsapi-loader/dist/index.js
  10. 69 0
      node_modules/@amap/amap-jsapi-loader/example/AMapUI.html
  11. 76 0
      node_modules/@amap/amap-jsapi-loader/example/Loca.html
  12. 94 0
      node_modules/@amap/amap-jsapi-loader/example/Multi.html
  13. 36 0
      node_modules/@amap/amap-jsapi-loader/example/example-es6.html
  14. 46 0
      node_modules/@amap/amap-jsapi-loader/example/example.html
  15. 0 0
      node_modules/@amap/amap-jsapi-loader/example/libs/chai.min.js
  16. 0 0
      node_modules/@amap/amap-jsapi-loader/example/libs/mocha.min.css
  17. 0 0
      node_modules/@amap/amap-jsapi-loader/example/libs/mocha.min.js
  18. 287 0
      node_modules/@amap/amap-jsapi-loader/example/test.html
  19. 15 0
      node_modules/@amap/amap-jsapi-loader/index.d.ts
  20. 37 0
      node_modules/@amap/amap-jsapi-loader/package.json
  21. 25 0
      node_modules/@amap/amap-jsapi-loader/rollup.config.js
  22. 5 0
      node_modules/@amap/amap-jsapi-loader/src/global.d.ts
  23. 367 0
      node_modules/@amap/amap-jsapi-loader/src/index.ts
  24. 17 0
      node_modules/@amap/amap-jsapi-loader/test/demo.ts
  25. 7 0
      node_modules/@amap/amap-jsapi-loader/test/test.ts
  26. 10 37
      package-lock.json
  27. 5 0
      package.json
  28. 16 0
      pages.json
  29. 1 1
      pages/common/helloWorld.vue
  30. 44 0
      pages/component/map.vue
  31. 137 65
      pages/login/login.vue
  32. 398 0
      pages/login/mimi.vue
  33. 413 0
      pages/login/register.vue
  34. 276 0
      pages/login/resetpassword.vue
  35. 407 0
      pages/login/settled.vue
  36. 222 0
      pages/login/xieyi.vue
  37. BIN
      static/login/Frame (26).png
  38. BIN
      static/login/Frame (27).png
  39. BIN
      static/login/Frame (28).png
  40. BIN
      static/login/bejing.png
  41. BIN
      static/login/code1.png
  42. BIN
      static/login/code2.png
  43. BIN
      static/login/code3.png
  44. BIN
      static/login/yingye2.png
  45. BIN
      static/login/yingyezhizhao.png
  46. BIN
      static/logo1.png
  47. 2 2
      store/index.js

+ 5 - 2
api/api.js

@@ -5,8 +5,11 @@ const apiService = {
 	 /**
 	  * 登录
 	  */
-	login(params) {
-		return http.post('/sys/mLogin',params)	
+	login(passWord,phone) {
+		console.log(passWord,phone,888888888);
+		
+		// return http.get('/merchant/app/loginPassWord',params)	
+		return http.get('/merchant/app/loginPassWord?passWord='+passWord+'&phone='+phone)	
 	},
 	/**
 	  * 手机号码登录

+ 3 - 1
common/router/index.js

@@ -11,7 +11,7 @@ const router = new Router({
     routes: [...modules]//路由表
 });
 
-const whiteList = ['/pages/login/login','/pages/login/loginOauth2']
+const whiteList = ['/pages/login/login','/pages/login/loginOauth2','/pages/login/xieyi','/pages/login/mimi','/pages/login/resetpassword','/pages/login/settled','/pages/login/register']
 //全局路由前置守卫
 router.beforeEach((to, from, next) => {
 	if(to.path == '/oauth2-app/login'){
@@ -30,6 +30,7 @@ router.beforeEach((to, from, next) => {
 		}
 		next()
 	}else{
+
 		if (whiteList.indexOf(to.path) !== -1) {
 		  // 在免登录白名单,如果进入的页面是login页面并且当前是OAuth2app环境,就进入OAuth2登录页面
 		  if (to.path === '/pages/login/login' && isOAuth2AppEnv()) {
@@ -37,6 +38,7 @@ router.beforeEach((to, from, next) => {
 		  } else {
 			// 在免登录白名单,直接进入
 			next()
+
 		  }
 		}else{
 			// 如果当前是在OAuth2APP环境,就跳转到OAuth2登录页面

+ 33 - 0
common/router/modules/routes.js

@@ -5,6 +5,39 @@ const routes = [
 		 meta: {
 			 title: '登录',
 		 },
+	},{
+	path: "/pages/login/xieyi",
+	name: 'xieyi',
+		meta: {
+			title: '用户协议',
+		},
+	},{
+	path: "/pages/login/mimi",
+	name: 'mimi',
+		meta: {
+			title: '隐秘协议',
+		},
+	},
+	{
+	path: "/pages/login/resetpassword",
+	name: 'resetpassword',
+		meta: {
+			title: '忘记密码',
+		},
+	},
+	{
+	path: "/pages/login/register",
+	name: 'register',
+		meta: {
+			title: '注册',
+		},
+	},
+	{
+		path: "/pages/login/settled",
+		name: 'settled',
+		meta: {
+			title: '申请入驻',
+		},
 	},
 	{
 		path: "/pages/login/loginOauth2",

+ 2 - 1
common/service/config.service.js

@@ -2,7 +2,8 @@ let BASE_URL = ''
 
 
 if (process.env.NODE_ENV == 'development') {
-    BASE_URL = 'https://test.baoxianzhanggui.com/locallive-java' // 开发环境
+    BASE_URL = 'http://192.168.0.52:8080/jeecg-boot' // 开发环境
+    // BASE_URL = 'https://test.baoxianzhanggui.com/locallive-java' // 开发环境
 } else {
 	BASE_URL = 'http://boot.jeecg.org:8080/jeecg-boot' // 生产环境
 }

+ 11 - 3
common/service/service.js

@@ -39,10 +39,18 @@ http.validateStatus = (statusCode) => {
 }
 
 http.interceptor.request((config, cancel) => { /* 请求之前拦截器 */
-  config.header = {
-    ...config.header,
-     'X-Access-Token':getTokenStorage()
+  if(getTokenStorage()){
+    config.header = {
+      ...config.header,
+       'X-Access-Token':getTokenStorage()
+    }
   }
+  else{
+    config.header = {
+      ...config.header,
+    }
+  }
+
   /*
   if (!token) { // 如果token不存在,调用cancel 会取消本次请求,但是该函数的catch() 仍会执行
     cancel('token 不存在') // 接收一个参数,会传给catch((err) => {}) err.errMsg === 'token 不存在'

+ 12 - 0
node_modules/.package-lock.json

@@ -0,0 +1,12 @@
+{
+  "name": "LocalLivingServicesUniapp",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "node_modules/@amap/amap-jsapi-loader": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
+      "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw=="
+    }
+  }
+}

+ 4 - 0
node_modules/@amap/amap-jsapi-loader/.vscode/settings.json

@@ -0,0 +1,4 @@
+{
+  "editor.tabSize": 4,
+  "prettier.tabWidth": 4
+}

+ 111 - 0
node_modules/@amap/amap-jsapi-loader/README.md

@@ -0,0 +1,111 @@
+# amap-jsapi-loader
+amap-jsapi-loader 是高德开放平台官网提供的地图 JSAPI 的加载器,可帮助开发者快速定位、有效避免加载引用地图 JSAPI 各种错误用法。
+
+
+该加载器具有以下特性:
+* 支持以 普通JS 和 npm包 两种方式使用;
+* 有效避免错误异步加载导致的 JSAPI 资源加载不完整问题;
+* 对于加载混用多个版本 JSAPI 的错误用法给予报错处理;
+* 对于不合法加载引用 JSAPI 给予报错处理;
+* 支持指定 JSAPI 版本;
+* 支持插件加载;
+* 允许多次执行加载操作,网络资源不会重复请求,便于大型工程模块管理;
+
+
+# USAGE
+
+## AMapLoader.load方法参数说明
+```js
+AMapLoader.load({
+    "key": "",              // 申请好的Web端开发者Key,首次调用 load 时必填
+    "version": "2.0",   // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
+    "plugins": []           // 需要使用的的插件列表,如比例尺'AMap.Scale'等
+    "AMapUI": {             // 是否加载 AMapUI,缺省不加载
+        "version": '1.1',   // AMapUI 缺省 1.1
+        "plugins":[],       // 需要加载的 AMapUI ui插件
+    },
+    "Loca":{                // 是否加载 Loca, 缺省不加载
+        "version": '1.3.2'  // Loca 版本,缺省 1.3.2
+    },
+}).then(()=>{
+    window.AMap.xx;
+    window.AMapUI.xx;
+    window.Loca.xx
+});
+
+```
+
+## AMapUI
+
+AMapUI 用法和官网有一点点区别。通过 AMapUI.xx 来获取组件
+```js
+AMapLoader.load({
+    key: '',//首次load必填
+    version: '2.0',
+    AMapUI: {
+        version: '1.1',
+        plugins: ['overlay/SimpleMarker'],
+    }
+}).then((AMap) => {
+    map = new AMap.Map('container');
+
+    // !!! 通过 AMap.SimpleMarker 获取组件
+    new AMapUI.SimpleMarker({
+        //前景文字
+        iconLabel: 'A',
+        //图标主题
+        iconTheme: 'default',
+        //背景图标样式
+        iconStyle: 'red',
+        map: map,
+        position: map.getCenter()
+    });
+}).catch((e) => {
+    console.error(e);
+});
+```
+
+
+# 使用
+#### 以普通 JS 方式使用 Loader
+尚未发布在线Loader,可将 dist/index.js 复制到项目下
+```
+<script src="../dist/index.js"></script>
+<script>
+    AMapLoader.load({
+        key:'',//首次load必填
+        version:'2.0',
+        plugins:['AMap.Scale']
+    }).then((AMap)=>{
+        map = new AMap.Map('container');
+        map.addControl(new AMap.Scale())
+    }).catch((e)=>{
+        console.error(e);
+    });   
+</script>
+```
+#### 以 NPM 包方式使用 Loader
+安装
+```
+tnpm i @alife/amap-jsapi-loader --save-dev
+```
+使用
+```
+import AMapLoader from '@alife/amap-jsapi-loader';
+
+AMapLoader.load().then((AMap)=>{
+    map = new AMap.Map('container');
+}).catch(e=>{
+    console.log(e);
+})
+
+```
+
+# 相关链接:
+地&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 JSAPI:  &nbsp;&nbsp;[示例中心](https://lbs.amap.com/demo-center/js-api)&nbsp;&nbsp;&nbsp;&nbsp;[教程](https://lbs.amap.com/api/javascript-api/summary)&nbsp;&nbsp;&nbsp;&nbsp;[参考手册](https://lbs.amap.com/api/javascript-api/reference/map)
+
+
+
+数据可视化 JSAPI:  &nbsp;&nbsp;[示例中心](https://lbs.amap.com/demo-center/loca-api)&nbsp;&nbsp;&nbsp;&nbsp;[教程](https://lbs.amap.com/api/loca-api/prod_intro)&nbsp;&nbsp;&nbsp;&nbsp;[参考手册](https://lbs.amap.com/api/loca-api/guide/baselayer)
+
+

+ 11 - 0
node_modules/@amap/amap-jsapi-loader/dist/index.js

@@ -0,0 +1,11 @@
+'use strict';(function(m,p){"object"===typeof exports&&"undefined"!==typeof module?module.exports=p():"function"===typeof define&&define.amd?define(p):(m=m||self,m.AMapLoader=p())})(this,function(){function m(a){var b=[];a.AMapUI&&b.push(p(a.AMapUI));a.Loca&&b.push(r(a.Loca));return Promise.all(b)}function p(a){return new Promise(function(h,c){var f=[];if(a.plugins)for(var e=0;e<a.plugins.length;e+=1)-1==d.AMapUI.plugins.indexOf(a.plugins[e])&&f.push(a.plugins[e]);if(g.AMapUI===b.failed)c("\u524d\u6b21\u8bf7\u6c42 AMapUI \u5931\u8d25");
+else if(g.AMapUI===b.notload){g.AMapUI=b.loading;d.AMapUI.version=a.version||d.AMapUI.version;e=d.AMapUI.version;var l=document.body||document.head,k=document.createElement("script");k.type="text/javascript";k.src="https://webapi.amap.com/ui/"+e+"/main.js";k.onerror=function(a){g.AMapUI=b.failed;c("\u8bf7\u6c42 AMapUI \u5931\u8d25")};k.onload=function(){g.AMapUI=b.loaded;if(f.length)window.AMapUI.loadUI(f,function(){for(var a=0,b=f.length;a<b;a++){var c=f[a].split("/").slice(-1)[0];window.AMapUI[c]=
+arguments[a]}for(h();n.AMapUI.length;)n.AMapUI.splice(0,1)[0]()});else for(h();n.AMapUI.length;)n.AMapUI.splice(0,1)[0]()};l.appendChild(k)}else g.AMapUI===b.loaded?a.version&&a.version!==d.AMapUI.version?c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c AMapUI \u6df7\u7528"):f.length?window.AMapUI.loadUI(f,function(){for(var a=0,b=f.length;a<b;a++){var c=f[a].split("/").slice(-1)[0];window.AMapUI[c]=arguments[a]}h()}):h():a.version&&a.version!==d.AMapUI.version?c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c AMapUI \u6df7\u7528"):
+n.AMapUI.push(function(a){a?c(a):f.length?window.AMapUI.loadUI(f,function(){for(var a=0,b=f.length;a<b;a++){var c=f[a].split("/").slice(-1)[0];window.AMapUI[c]=arguments[a]}h()}):h()})})}function r(a){return new Promise(function(h,c){if(g.Loca===b.failed)c("\u524d\u6b21\u8bf7\u6c42 Loca \u5931\u8d25");else if(g.Loca===b.notload){g.Loca=b.loading;d.Loca.version=a.version||d.Loca.version;var f=d.Loca.version,e=d.AMap.version.startsWith("2"),l=f.startsWith("2");if(e&&!l||!e&&l)c("JSAPI \u4e0e Loca \u7248\u672c\u4e0d\u5bf9\u5e94\uff01\uff01");
+else{e=d.key;l=document.body||document.head;var k=document.createElement("script");k.type="text/javascript";k.src="https://webapi.amap.com/loca?v="+f+"&key="+e;k.onerror=function(a){g.Loca=b.failed;c("\u8bf7\u6c42 AMapUI \u5931\u8d25")};k.onload=function(){g.Loca=b.loaded;for(h();n.Loca.length;)n.Loca.splice(0,1)[0]()};l.appendChild(k)}}else g.Loca===b.loaded?a.version&&a.version!==d.Loca.version?c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c Loca \u6df7\u7528"):h():a.version&&a.version!==d.Loca.version?
+c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c Loca \u6df7\u7528"):n.Loca.push(function(a){a?c(a):c()})})}if(!window)throw Error("AMap JSAPI can only be used in Browser.");var b;(function(a){a.notload="notload";a.loading="loading";a.loaded="loaded";a.failed="failed"})(b||(b={}));var d={key:"",AMap:{version:"1.4.15",plugins:[]},AMapUI:{version:"1.1",plugins:[]},Loca:{version:"1.3.2"}},g={AMap:b.notload,AMapUI:b.notload,Loca:b.notload},n={AMap:[],AMapUI:[],Loca:[]},q=[],t=function(a){"function"==typeof a&&
+(g.AMap===b.loaded?a(window.AMap):q.push(a))};return{load:function(a){return new Promise(function(h,c){if(g.AMap==b.failed)c("");else if(g.AMap==b.notload){var f=a.key,e=a.version,l=a.plugins;f?(window.AMap&&"lbs.amap.com"!==location.host&&c("\u7981\u6b62\u591a\u79cdAPI\u52a0\u8f7d\u65b9\u5f0f\u6df7\u7528"),d.key=f,d.AMap.version=e||d.AMap.version,d.AMap.plugins=l||d.AMap.plugins,g.AMap=b.loading,e=document.body||document.head,window.___onAPILoaded=function(d){delete window.___onAPILoaded;if(d)g.AMap=
+b.failed,c(d);else for(g.AMap=b.loaded,m(a).then(function(){h(window.AMap)})["catch"](c);q.length;)q.splice(0,1)[0]()},l=document.createElement("script"),l.type="text/javascript",l.src="https://webapi.amap.com/maps?callback=___onAPILoaded&v="+d.AMap.version+"&key="+f+"&plugin="+d.AMap.plugins.join(","),l.onerror=function(a){g.AMap=b.failed;c(a)},e.appendChild(l)):c("\u8bf7\u586b\u5199key")}else if(g.AMap==b.loaded)if(a.key&&a.key!==d.key)c("\u591a\u4e2a\u4e0d\u4e00\u81f4\u7684 key");else if(a.version&&
+a.version!==d.AMap.version)c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c JSAPI \u6df7\u7528");else{f=[];if(a.plugins)for(e=0;e<a.plugins.length;e+=1)-1==d.AMap.plugins.indexOf(a.plugins[e])&&f.push(a.plugins[e]);if(f.length)window.AMap.plugin(f,function(){m(a).then(function(){h(window.AMap)})["catch"](c)});else m(a).then(function(){h(window.AMap)})["catch"](c)}else if(a.key&&a.key!==d.key)c("\u591a\u4e2a\u4e0d\u4e00\u81f4\u7684 key");else if(a.version&&a.version!==d.AMap.version)c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c JSAPI \u6df7\u7528");
+else{var k=[];if(a.plugins)for(e=0;e<a.plugins.length;e+=1)-1==d.AMap.plugins.indexOf(a.plugins[e])&&k.push(a.plugins[e]);t(function(){if(k.length)window.AMap.plugin(k,function(){m(a).then(function(){h(window.AMap)})["catch"](c)});else m(a).then(function(){h(window.AMap)})["catch"](c)})}})},reset:function(){delete window.AMap;delete window.AMapUI;delete window.Loca;d={key:"",AMap:{version:"1.4.15",plugins:[]},AMapUI:{version:"1.1",plugins:[]},Loca:{version:"1.3.2"}};g={AMap:b.notload,AMapUI:b.notload,
+Loca:b.notload};n={AMap:[],AMapUI:[],Loca:[]}}}})

+ 69 - 0
node_modules/@amap/amap-jsapi-loader/example/AMapUI.html

@@ -0,0 +1,69 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <title>JSAPI Loader</title>
+    <style>
+        html,
+        body,
+        #container {
+            height: 100%;
+            width: 100%;
+            margin: 0;
+        }
+    </style>
+</head>
+
+<body>
+    <div id="container" tabindex="0"></div>
+
+    <script src="../dist/index.js"></script>
+    <script>
+        AMapLoader.load({
+            key: '',//首次load必填
+            version: '2.0Beta',
+            plugins: ['AMap.Scale'],
+            AMapUI: {
+                plugins: ['overlay/SimpleMarker'],
+            }
+        }).then((AMap) => {
+            map = new AMap.Map('container');
+            map.addControl(new AMap.Scale());
+            new AMapUI.SimpleMarker({
+
+                //前景文字
+                iconLabel: 'A',
+
+                //图标主题
+                iconTheme: 'default',
+
+                //背景图标样式
+                iconStyle: 'red',
+
+                //...其他Marker选项...,不包括content
+                map: map,
+                position: map.getCenter()
+            });
+        }).catch((e) => {
+            console.error(e);
+        });
+        setTimeout(function () {
+            AMapLoader.load({
+                plugins: ['AMap.MapType']
+            }).then((AMap) => {
+                map.addControl(new AMap.MapType())
+            }).catch((e) => {
+                console.error(e);
+            });
+        }, 5000);
+
+    </script>
+
+
+    </script>
+</body>
+
+</html>

+ 76 - 0
node_modules/@amap/amap-jsapi-loader/example/Loca.html

@@ -0,0 +1,76 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <title>JSAPI Loader</title>
+    <style>
+        html,
+        body,
+        #container {
+            height: 100%;
+            width: 100%;
+            margin: 0;
+        }
+    </style>
+</head>
+
+<body>
+    <div id="container" tabindex="0"></div>
+    <script src="https://a.amap.com/Loca/static/mock/districts.js"></script>
+    <script src="../dist/index.js"></script>
+    <script>
+        AMapLoader.load({
+            key: 'd3c5511c8a102496b1fdb985e6ca1cd7',//首次load必填
+            // version: '2.0',
+            Loca: {
+                version: '2.0.0beta'
+            }
+        }).then((AMap) => {
+            var map = new AMap.Map('container', {
+                zoom: 4,
+                center: [107.4976, 32.1697],
+                features: ['bg', 'road'],
+                // Loca 自 1.2.0 起 viewMode 模式默认为 3D,如需 2D 模式,请显示配置。
+                // viewMode: '3D'
+            });
+
+            var layer = new Loca.PointLayer({
+                map: map
+            });
+
+            layer.setData(districts, {
+                // 指定经纬度所在字段
+                lnglat: 'center'
+            });
+
+            layer.setOptions({
+                style: {
+                    // 圆形半径,单位像素
+                    radius: 5,
+                    // 填充颜色
+                    color: '#07E8E4',
+                    // 描边颜色
+                    borderColor: '#5DFBF9',
+                    // 描边宽度,单位像素
+                    borderWidth: 1,
+                    // 透明度 [0-1]
+                    opacity: 0.9,
+                }
+            });
+
+            layer.render();
+
+        }).catch((e) => {
+            console.error(e);
+        });
+
+    </script>
+
+
+    </script>
+</body>
+
+</html>

+ 94 - 0
node_modules/@amap/amap-jsapi-loader/example/Multi.html

@@ -0,0 +1,94 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <title>JSAPI Loader</title>
+    <style>
+        html,
+        body,
+        #container {
+            height: 100%;
+            width: 100%;
+            margin: 0;
+        }
+    </style>
+</head>
+
+<body>
+    <div id="container" tabindex="0"></div>
+    <script src="https://a.amap.com/Loca/static/mock/districts.js"></script>
+    <script src="../dist/index.js"></script>
+    <script>
+        AMapLoader.load({
+            key: '',//首次load必填
+            version: '1.4.15',
+            AMapUI: {
+                plugins: ['overlay/SimpleMarker'],
+            },
+            Loca: {
+                version: '1.3.2'
+            }
+        }).then((AMap) => {
+            var map = new AMap.Map('container', {
+                zoom: 4,
+                center: [107.4976, 32.1697],
+                features: ['bg', 'road'],
+                // Loca 自 1.2.0 起 viewMode 模式默认为 3D,如需 2D 模式,请显示配置。
+                // viewMode: '3D'
+            });
+
+            new AMapUI.SimpleMarker({
+
+                //前景文字
+                iconLabel: 'A',
+
+                //图标主题
+                iconTheme: 'default',
+
+                //背景图标样式
+                iconStyle: 'red',
+
+                //...其他Marker选项...,不包括content
+                map: map,
+                position: map.getCenter()
+            });
+            var layer = new Loca.PointLayer({
+                map: map
+            });
+
+            layer.setData(districts, {
+                // 指定经纬度所在字段
+                lnglat: 'center'
+            });
+
+            layer.setOptions({
+                style: {
+                    // 圆形半径,单位像素
+                    radius: 5,
+                    // 填充颜色
+                    color: '#07E8E4',
+                    // 描边颜色
+                    borderColor: '#5DFBF9',
+                    // 描边宽度,单位像素
+                    borderWidth: 1,
+                    // 透明度 [0-1]
+                    opacity: 0.9,
+                }
+            });
+
+            layer.render();
+
+        }).catch((e) => {
+            console.error(e);
+        });
+
+    </script>
+
+
+    </script>
+</body>
+
+</html>

+ 36 - 0
node_modules/@amap/amap-jsapi-loader/example/example-es6.html

@@ -0,0 +1,36 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <title>JSAPI Loader - ES6</title>
+    <style>
+        html, body, #container {
+            height: 100%;
+            width: 100%;
+            margin: 0;
+        }
+    </style>
+</head>
+<body>
+<div id="container" tabindex="0"></div>
+<script type="module">
+    import AMapLoader from '../src/index.js';
+    AMapLoader.load({
+        key:'',//必填
+        version:'2.0',
+        plugins:['AMap.Scale']
+    }).then((AMap)=>{
+        debugger
+        var map = new AMap.Map('container');
+        map.addControl(new AMap.Scale())
+    }).catch((e)=>{
+        console.error(e);
+    });
+</script>
+
+
+</script>
+</body>
+</html>

+ 46 - 0
node_modules/@amap/amap-jsapi-loader/example/example.html

@@ -0,0 +1,46 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <title>AMap JSAPI Loader</title>
+    <style>
+        html, body, #container {
+            height: 100%;
+            width: 100%;
+            margin: 0;
+        }
+    </style>
+</head>
+<body>
+<div id="container" tabindex="0"></div>
+
+<script src="https://webapi.amap.com/loader.js"></script>
+<script>
+    AMapLoader.load({ //首次调用 load
+        key:'你申请的高德开放平台 Web 端 key',//首次load key为必填
+        version:'2.0',
+        plugins:['AMap.Scale','AMap.ToolBar']
+    }).then((AMap)=>{
+        map = new AMap.Map('container');
+        map.addControl(new AMap.Scale())
+        map.addControl(new AMap.ToolBar())
+        map.add(new AMap.Marker({
+            position:map.getCenter()
+        }));
+    }).catch((e)=>{
+        console.error(e);
+    });
+   
+    AMapLoader.load({ //可多次调用load
+        plugins:['AMap.MapType']
+    }).then((AMap)=>{
+        map.addControl(new AMap.MapType())
+    }).catch((e)=>{
+        console.error(e);
+    });
+   
+</script>
+</body>
+</html>

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
node_modules/@amap/amap-jsapi-loader/example/libs/chai.min.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
node_modules/@amap/amap-jsapi-loader/example/libs/mocha.min.css


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
node_modules/@amap/amap-jsapi-loader/example/libs/mocha.min.js


+ 287 - 0
node_modules/@amap/amap-jsapi-loader/example/test.html

@@ -0,0 +1,287 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
+    <title>JSAPI Loader</title>
+    <style>
+        html,
+        body,
+        #container {
+            height: 100%;
+            width: 100%;
+            margin: 0;
+        }
+    </style>
+</head>
+
+<body>
+    <div id="mocha"></div>
+
+    <link rel="stylesheet" href="./libs/mocha.min.css" />
+    <script src="./libs/chai.min.js"></script>
+    <script src="./libs/mocha.min.js"></script>
+
+    <script>
+        mocha.setup('bdd');
+        mocha.traceIgnores = ['mocha.min.js', 'chai.min.js'];
+        expect = chai.expect;
+    </script>
+    <div id="container" tabindex="0"></div>
+
+    <script src="../dist/index.js"></script>
+    <script>
+        // 请把 key 写在这里
+        const JSAPIKey = '';
+        const chai = window.chai;
+        const mocha = window.mocha;
+        mocha.setup({
+            timeout: '5000',
+            ui: 'bdd',
+        });
+        const expect = chai.expect;
+        describe('JSAPI', () => {
+            beforeEach(function () {
+                AMapLoader.reset()
+            });
+
+            it('Simple', (done) => {
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '2.0',
+                    plugins: ['AMap.Scale'],
+                    AMapUI: {
+                        plugins: ['overlay/SimpleMarker']
+                    }
+                }).then(() => {
+                    expect(Boolean(window.AMap)).eq(true)
+                    expect(Boolean(window.AMapUI)).eq(true)
+                    expect(Boolean(window.AMapUI.SimpleMarker)).eq(true)
+                    expect(Boolean(window.Loca)).eq(false)
+                    done();
+                });
+
+            });
+            it('Request with AMapUI Loca', (done) => {
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '1.4.15',
+                    plugins: ['AMap.Scale'],
+                    AMapUI: {
+                        plugins: ['overlay/SimpleMarker']
+                    },
+                    Loca: {
+                        version: '1.3.2'
+                    }
+                }).then(() => {
+                    expect(Boolean(window.AMap)).eq(true)
+                    expect(Boolean(window.AMapUI)).eq(true)
+                    expect(Boolean(window.AMapUI.SimpleMarker)).eq(true)
+
+                    expect(Boolean(window.Loca)).eq(true)
+                    done();
+                });
+
+            });
+            it('fail with multi version', (done) => {
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '2.0',
+                }).then(() => {
+                    done()
+                });
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '1.4.15',
+                }).then(() => {
+                    done(Error('should not here'))
+                })
+                    .catch(err => {
+                        try {
+                            expect(err).eq('不允许多个版本 JSAPI 混用')
+
+                        } catch (error) {
+                            done(error)
+                        }
+                    })
+
+            });
+            it('fail with multi key', (done) => {
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '2.0',
+                }).then(() => {
+                    done()
+                });
+                AMapLoader.load({
+                    key: 'asdfas',//首次load必填
+                }).then(() => {
+                    done(Error('should not here'))
+                })
+                    .catch(err => {
+                        try {
+                            expect(err).eq('多个不一致的 key')
+
+                        } catch (error) {
+                            done(error)
+                        }
+                    })
+
+            });
+        })
+
+
+        describe('AMapUI', () => {
+            beforeEach(function () {
+                AMapLoader.reset()
+            });
+
+            it('version', (done) => {
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '1.4.15',
+                    AMapUI: {
+                        version: '1.1',
+                        plugins: ['misc/PathSimplifier']
+                    }
+                }).then(() => {
+                    expect(Boolean(window.AMap)).eq(true)
+                    expect(Boolean(window.AMapUI)).eq(true)
+                    expect(Boolean(window.AMapUI.PathSimplifier)).eq(true)
+                    expect(Boolean(window.AMapUI.version.startsWith('1.1'))).eq(true)
+                    done();
+                }).catch(done);
+            });
+
+            it('async', (done) => {
+                console.log(window.AMap);
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '1.4.15',
+                    AMapUI: {
+                        version: '1.0',
+                        plugins: ['overlay/SimpleMarker']
+                    }
+                }).then(() => {
+                    AMapLoader.load({
+                        AMapUI: {
+                            plugins: ['overlay/SimpleInfoWindow']
+                        }
+                    }).then(() => {
+                        expect(Boolean(window.AMap)).eq(true)
+                        expect(Boolean(window.AMapUI.version.startsWith('1.0'))).eq(true)
+                        expect(Boolean(window.AMapUI.SimpleMarker)).eq(true)
+                        expect(Boolean(window.AMapUI.SimpleInfoWindow)).eq(true)
+                        done()
+                    });
+                }).catch(done);
+            })
+        });
+
+        describe('Loca', () => {
+            beforeEach(function () {
+                AMapLoader.reset()
+            });
+
+            it('version', (done) => {
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '1.4.15',
+                    Loca: {
+                        version: '1.3.1'
+                    }
+                }).then(() => {
+                    expect(Boolean(window.AMap)).eq(true)
+                    expect(Boolean(window.Loca)).eq(true)
+                    expect(window.Loca.version).eq('1.3.1')
+                    done()
+                }).catch(done);
+            });
+            it('fail with jsapi2.0', (done) => {
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '2.0',
+                    Loca: {
+                        version: '1.3.1'
+                    }
+                }).then(() => {
+                    done(Error('should not here'))
+                }).catch(err => {
+                    try {
+                        expect(err).eq("Loca 暂不适配 JSAPI 2.0,请使用 1.4.15")
+                        done()
+                    } catch (error) {
+                        done(error)
+                    }
+                });
+            });
+
+
+            it('async', (done) => {
+                AMapLoader.load({
+                    key: JSAPIKey,//首次load必填
+                    version: '1.4.15',
+                    Loca: {
+                        version: '1.2.1'
+                    }
+                }).then(() => {
+                    expect(Boolean(window.AMap)).eq(true)
+                    expect(Boolean(window.Loca)).eq(true)
+                    expect(window.Loca.version).eq('1.2.1')
+                    AMapLoader.load({
+                        Loca: {
+                            version: '1.2.1'
+                        }
+                    }).then(() => {
+                        expect(Boolean(window.AMap)).eq(true)
+                        expect(Boolean(window.Loca)).eq(true)
+                        expect(window.Loca.version).eq('1.2.1')
+                        done()
+                    }).catch(done);
+
+                });
+            })
+        });
+
+
+        describe('Advance', () => {
+            beforeEach(function () {
+                AMapLoader.reset()
+            });
+            it('Multi', (done) => {
+                AMapLoader.load({ key: JSAPIKey, version: '1.4.15' }).then(() => {
+                    expect(Boolean(window.AMap)).eq(true);
+                    expect(window.AMap.v).eq('1.4.15');
+
+                    expect(Boolean(window.AMapUI)).eq(false);
+                    expect(Boolean(window.Loca)).eq(false);
+                    AMapLoader.load({ AMapUI: {} }).then(() => {
+                        expect(Boolean(window.AMap)).eq(true);
+                        expect(window.AMap.v).eq('1.4.15');
+
+                        expect(Boolean(window.AMapUI)).eq(true);
+                        expect(window.AMapUI.version.startsWith('1.1')).eq(true);
+                        expect(Boolean(window.Loca)).eq(false);
+                        AMapLoader.load({ Loca: {} }).then(() => {
+                            expect(Boolean(window.AMap)).eq(true);
+                            expect(window.AMap.v).eq('1.4.15');
+                            expect(Boolean(window.AMapUI)).eq(true);
+                            expect(window.AMapUI.version.startsWith('1.1')).eq(true);
+                            expect(Boolean(window.Loca)).eq(true);
+                            expect(window.Loca.version).eq('1.3.2');
+                            done()
+                        })
+                    })
+                }).catch(done)
+            })
+        })
+        mocha.run()
+    </script>
+
+
+    </script>
+</body>
+
+</html>

+ 15 - 0
node_modules/@amap/amap-jsapi-loader/index.d.ts

@@ -0,0 +1,15 @@
+declare var load: (options: {
+    key: string; // 申请好的Web端开发者Key,首次调用 load 时必填
+    version: string; // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
+    plugins?: string[]; //插件列表
+    // 是否加载 AMapUI,缺省不加载
+    AMapUI?: {
+        version?: string; // AMapUI 缺省 1.1
+        plugins?: string[]; // 需要加载的 AMapUI ui插件
+    };
+    // 是否加载 Loca, 缺省不加载
+    Loca?: {
+        version?: string; // Loca 版本,缺省 1.3.2
+    };
+}) => Promise<any>;
+export { load };

+ 37 - 0
node_modules/@amap/amap-jsapi-loader/package.json

@@ -0,0 +1,37 @@
+{
+  "name": "@amap/amap-jsapi-loader",
+  "version": "1.0.1",
+  "description": "高德官网提供的地图JSAPI加载器,可以避免多种异步加载API的错误用法",
+  "main": "dist/index.js",
+  "types": "index.d.ts",
+  "directories": {
+    "test": "test"
+  },
+  "scripts": {
+    "build": "rollup -c rollup.config.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git@gitlab.alibaba-inc.com:amap-web/amap-jsapi-loader.git"
+  },
+  "keywords": [
+    "amap",
+    "jsapi",
+    "sdk",
+    "loader",
+    "地图",
+    "高德"
+  ],
+  "author": "mengmeng.du@alibaba-inc.com",
+  "license": "MIT",
+  "devDependencies": {
+    "@ampproject/rollup-plugin-closure-compiler": "^0.23.0",
+    "@babel/core": "^7.8.7",
+    "@babel/preset-env": "^7.8.7",
+    "rollup": "^1.32.0",
+    "rollup-plugin-babel": "^4.3.3",
+    "rollup-plugin-server": "^0.7.0",
+    "rollup-plugin-typescript2": "^0.27.1",
+    "typescript": "^3.9.7"
+  }
+}

+ 25 - 0
node_modules/@amap/amap-jsapi-loader/rollup.config.js

@@ -0,0 +1,25 @@
+import server from "rollup-plugin-server";
+import babel from "rollup-plugin-babel";
+import compiler from "@ampproject/rollup-plugin-closure-compiler";
+import rollupTypescript from 'rollup-plugin-typescript2';
+
+export default {
+    input: "src/index.ts",
+    output: {
+        file: "dist/index.js",
+        format: "umd",
+        name: "AMapLoader",
+    },
+    plugins: [
+        rollupTypescript(),
+        babel({
+            presets: [["@babel/env", { targets: { ie: 9 } }]],
+        }),
+        compiler(),
+        server({
+            contentBase: "./",
+            host: "127.0.0.1",
+            port: 3601,
+        }),
+    ],
+};

+ 5 - 0
node_modules/@amap/amap-jsapi-loader/src/global.d.ts

@@ -0,0 +1,5 @@
+declare var AMap: any;
+declare var AMapUI: any;
+declare var Loca: any;
+
+declare var ___onAPILoaded: any;

+ 367 - 0
node_modules/@amap/amap-jsapi-loader/src/index.ts

@@ -0,0 +1,367 @@
+if (!window) {
+    throw Error("AMap JSAPI can only be used in Browser.");
+}
+enum LoadStatus {
+    notload = "notload",
+    loading = "loading",
+    loaded = "loaded",
+    failed = "failed",
+}
+let config = {
+    key: "",
+    AMap: {
+        version: "1.4.15",
+        plugins: [],
+    },
+    AMapUI: {
+        version: "1.1",
+        plugins: [],
+    },
+    Loca: {
+        version: "1.3.2",
+    },
+};
+
+let Status = {
+    AMap: LoadStatus.notload,
+    AMapUI: LoadStatus.notload,
+    Loca: LoadStatus.notload,
+};
+let Callback = {
+    AMap: [],
+    AMapUI: [],
+    Loca: [],
+};
+
+let onloadCBKs = [];
+const onload = function (callback) {
+    if (typeof callback == "function") {
+        if (Status.AMap === LoadStatus.loaded) {
+            callback(window.AMap);
+            return;
+        }
+        onloadCBKs.push(callback);
+    }
+};
+
+interface LoadOption {
+    key: string;
+    version?: string;
+    plugins?: string[];
+    AMapUI?: {
+        version?: string;
+        plugins?: string[];
+    };
+    Loca?: {
+        version?: string;
+    };
+}
+function appendOther(option: LoadOption): Promise<any> {
+    let pros: Promise<void>[] = [];
+    if (option.AMapUI) {
+        pros.push(loadAMapUI(option.AMapUI));
+    }
+    if (option.Loca) {
+        pros.push(loadLoca(option.Loca));
+    }
+    return Promise.all(pros);
+}
+function loadAMapUI(params: { version?: string; plugins?: string[] }): Promise<void> {
+    return new Promise((res, rej) => {
+        const newPlugins: string[] = [];
+        if (params.plugins) {
+            for (var i = 0; i < params.plugins.length; i += 1) {
+                if (config.AMapUI.plugins.indexOf(params.plugins[i]) == -1) {
+                    newPlugins.push(params.plugins[i]);
+                }
+            }
+        }
+        if (Status.AMapUI === LoadStatus.failed) {
+            rej("前次请求 AMapUI 失败");
+        } else if (Status.AMapUI === LoadStatus.notload) {
+            Status.AMapUI = LoadStatus.loading;
+            config.AMapUI.version = params.version || config.AMapUI.version;
+            const version = config.AMapUI.version;
+            const parentNode = document.body || document.head;
+            const script = document.createElement("script");
+            script.type = "text/javascript";
+            script.src = `https://webapi.amap.com/ui/${version}/main.js`;
+
+            script.onerror = (e) => {
+                Status.AMapUI = LoadStatus.failed;
+                rej("请求 AMapUI 失败");
+            };
+            script.onload = () => {
+                Status.AMapUI = LoadStatus.loaded;
+                if (newPlugins.length) {
+                    window.AMapUI.loadUI(newPlugins, function () {
+                        for (let i = 0, len = newPlugins.length; i < len; i++) {
+                            const path = newPlugins[i];
+                            const name = path.split("/").slice(-1)[0];
+                            window.AMapUI[name] = arguments[i];
+                        }
+                        res();
+                        while (Callback.AMapUI.length) {
+                            Callback.AMapUI.splice(0, 1)[0]();
+                        }
+                    });
+                } else {
+                    res();
+                    while (Callback.AMapUI.length) {
+                        Callback.AMapUI.splice(0, 1)[0]();
+                    }
+                }
+            };
+            parentNode.appendChild(script);
+        } else if (Status.AMapUI === LoadStatus.loaded) {
+            if (params.version && params.version !== config.AMapUI.version) {
+                rej("不允许多个版本 AMapUI 混用");
+            } else {
+                if (newPlugins.length) {
+                    window.AMapUI.loadUI(newPlugins, function () {
+                        for (let i = 0, len = newPlugins.length; i < len; i++) {
+                            const path = newPlugins[i];
+                            const name = path.split("/").slice(-1)[0];
+                            window.AMapUI[name] = arguments[i];
+                        }
+                        res();
+                    });
+                } else {
+                    res();
+                }
+            }
+        } else {
+            if (params.version && params.version !== config.AMapUI.version) {
+                rej("不允许多个版本 AMapUI 混用");
+            } else {
+                Callback.AMapUI.push((err) => {
+                    if (err) {
+                        rej(err);
+                    } else {
+                        if (newPlugins.length) {
+                            window.AMapUI.loadUI(newPlugins, function () {
+                                for (let i = 0, len = newPlugins.length; i < len; i++) {
+                                    const path = newPlugins[i];
+                                    const name = path.split("/").slice(-1)[0];
+                                    window.AMapUI[name] = arguments[i];
+                                }
+                                res();
+                            });
+                        } else {
+                            res();
+                        }
+                    }
+                });
+            }
+        }
+    });
+}
+
+function loadLoca(params: { version?: string }): Promise<void> {
+    return new Promise((res, rej) => {
+        if (Status.Loca === LoadStatus.failed) {
+            rej("前次请求 Loca 失败");
+        } else if (Status.Loca === LoadStatus.notload) {
+            Status.Loca = LoadStatus.loading;
+            config.Loca.version = params.version || config.Loca.version;
+            const version = config.Loca.version;
+            const isApiV2 = config.AMap.version.startsWith("2");
+            const isLocaV2 = version.startsWith("2");
+            if ((isApiV2 && !isLocaV2) || (!isApiV2 && isLocaV2)) {
+                rej("JSAPI 与 Loca 版本不对应!!");
+                return;
+            }
+            const key = config.key;
+            const parentNode = document.body || document.head;
+            const script = document.createElement("script");
+            script.type = "text/javascript";
+            script.src = `https://webapi.amap.com/loca?v=${version}&key=${key}`;
+
+            script.onerror = (e) => {
+                Status.Loca = LoadStatus.failed;
+                rej("请求 AMapUI 失败");
+            };
+            script.onload = () => {
+                Status.Loca = LoadStatus.loaded;
+                res();
+                while (Callback.Loca.length) {
+                    Callback.Loca.splice(0, 1)[0]();
+                }
+            };
+            parentNode.appendChild(script);
+        } else if (Status.Loca === LoadStatus.loaded) {
+            if (params.version && params.version !== config.Loca.version) {
+                rej("不允许多个版本 Loca 混用");
+            } else {
+                res();
+            }
+        } else {
+            if (params.version && params.version !== config.Loca.version) {
+                rej("不允许多个版本 Loca 混用");
+            } else {
+                Callback.Loca.push((err) => {
+                    if (err) {
+                        rej(err);
+                    } else {
+                        rej();
+                    }
+                });
+            }
+        }
+    });
+}
+
+const load = function (options: LoadOption) {
+    return new Promise((resolve, reject) => {
+        if (Status.AMap == LoadStatus.failed) {
+            reject("");
+        } else if (Status.AMap == LoadStatus.notload) {
+            //初次加载
+            let { key, version, plugins } = options;
+            if (!key) {
+                reject("请填写key");
+                return;
+            }
+            if (window.AMap && location.host !== "lbs.amap.com") {
+                reject("禁止多种API加载方式混用");
+            }
+            config.key = key;
+            config.AMap.version = version || config.AMap.version;
+            config.AMap.plugins = plugins || config.AMap.plugins;
+            Status.AMap = LoadStatus.loading;
+
+            const parentNode = document.body || document.head;
+
+            window.___onAPILoaded = function (err) {
+                delete window.___onAPILoaded;
+                if (err) {
+                    Status.AMap = LoadStatus.failed;
+                    reject(err);
+                } else {
+                    Status.AMap = LoadStatus.loaded;
+                    appendOther(options)
+                        .then(() => {
+                            resolve(window.AMap);
+                        })
+                        .catch(reject);
+                    while (onloadCBKs.length) {
+                        onloadCBKs.splice(0, 1)[0]();
+                    }
+                }
+            };
+            const script = document.createElement("script");
+            script.type = "text/javascript";
+
+            script.src =
+                "https://webapi.amap.com/maps?callback=___onAPILoaded&v=" +
+                config.AMap.version +
+                "&key=" +
+                key +
+                "&plugin=" +
+                config.AMap.plugins.join(",");
+            script.onerror = (e) => {
+                Status.AMap = LoadStatus.failed;
+                reject(e);
+            };
+            parentNode.appendChild(script);
+        } else if (Status.AMap == LoadStatus.loaded) {
+            //deal multi load
+            if (options.key && options.key !== config.key) {
+                reject("多个不一致的 key");
+                return;
+            }
+            if (options.version && options.version !== config.AMap.version) {
+                reject("不允许多个版本 JSAPI 混用");
+                return;
+            }
+            const newPlugins = [];
+            if (options.plugins) {
+                for (var i = 0; i < options.plugins.length; i += 1) {
+                    if (config.AMap.plugins.indexOf(options.plugins[i]) == -1) {
+                        newPlugins.push(options.plugins[i]);
+                    }
+                }
+            }
+            if (newPlugins.length) {
+                window.AMap.plugin(newPlugins, () => {
+                    appendOther(options)
+                        .then(() => {
+                            resolve(window.AMap);
+                        })
+                        .catch(reject);
+                });
+            } else {
+                appendOther(options)
+                    .then(() => {
+                        resolve(window.AMap);
+                    })
+                    .catch(reject);
+            }
+        } else {
+            // loading
+            if (options.key && options.key !== config.key) {
+                reject("多个不一致的 key");
+                return;
+            }
+            if (options.version && options.version !== config.AMap.version) {
+                reject("不允许多个版本 JSAPI 混用");
+                return;
+            }
+            const newPlugins = [];
+            if (options.plugins) {
+                for (var i = 0; i < options.plugins.length; i += 1) {
+                    if (config.AMap.plugins.indexOf(options.plugins[i]) == -1) {
+                        newPlugins.push(options.plugins[i]);
+                    }
+                }
+            }
+            onload(() => {
+                if (newPlugins.length) {
+                    window.AMap.plugin(newPlugins, () => {
+                        appendOther(options)
+                            .then(() => {
+                                resolve(window.AMap);
+                            })
+                            .catch(reject);
+                    });
+                } else {
+                    appendOther(options)
+                        .then(() => {
+                            resolve(window.AMap);
+                        })
+                        .catch(reject);
+                }
+            });
+        }
+    });
+};
+function reset() {
+    delete window.AMap;
+    delete window.AMapUI;
+    delete window.Loca;
+    config = {
+        key: "",
+        AMap: {
+            version: "1.4.15",
+            plugins: [],
+        },
+        AMapUI: {
+            version: "1.1",
+            plugins: [],
+        },
+        Loca: {
+            version: "1.3.2",
+        },
+    };
+    Status = {
+        AMap: LoadStatus.notload,
+        AMapUI: LoadStatus.notload,
+        Loca: LoadStatus.notload,
+    };
+    Callback = {
+        AMap: [],
+        AMapUI: [],
+        Loca: [],
+    };
+}
+export default { load, reset };

+ 17 - 0
node_modules/@amap/amap-jsapi-loader/test/demo.ts

@@ -0,0 +1,17 @@
+import AMapLoader from "../";
+// import {  } from "@ali/test-amap-jsapi";
+
+AMapLoader.load({
+  key: "test",
+  version: "2.0"
+}).then(() => {
+  new AMap.Circle({})
+  const map = new AMap.Map("div");
+  map.on("complete", () => {
+    const circle = new AMap.Circle({
+      center: [135, 45],
+      radius: 40
+    });
+    map.add(circle);
+  });
+});

+ 7 - 0
node_modules/@amap/amap-jsapi-loader/test/test.ts

@@ -0,0 +1,7 @@
+import AMapLoader from "../";
+import "@amap/amap-jsapi-loader";
+
+AMapLoader.load({
+  key: "test",
+  version: "2.0"
+}).then(() => {});

+ 10 - 37
package-lock.json

@@ -1,44 +1,17 @@
 {
+  "name": "LocalLivingServicesUniapp",
+  "lockfileVersion": 3,
   "requires": true,
-  "lockfileVersion": 1,
-  "dependencies": {
-    "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
-    },
-    "prettier": {
-      "version": "1.12.1",
-      "resolved": "http://registry.npm.taobao.org/prettier/download/prettier-1.12.1.tgz",
-      "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU="
-    },
-    "query-string": {
-      "version": "6.12.1",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.12.1.tgz",
-      "integrity": "sha512-OHj+zzfRMyj3rmo/6G8a5Ifvw3AleL/EbcHMD27YA31Q+cO5lfmQxECkImuNVjcskLcvBRVHNAB3w6udMs1eAA==",
-      "requires": {
-        "decode-uri-component": "^0.2.0",
-        "split-on-first": "^1.0.0",
-        "strict-uri-encode": "^2.0.0"
+  "packages": {
+    "": {
+      "dependencies": {
+        "@amap/amap-jsapi-loader": "^1.0.1"
       }
     },
-    "split-on-first": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
-      "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw=="
-    },
-    "strict-uri-encode": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
-      "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
-    },
-    "uni-simple-router": {
-      "version": "1.5.5",
-      "resolved": "https://registry.npmjs.org/uni-simple-router/-/uni-simple-router-1.5.5.tgz",
-      "integrity": "sha512-VjBnwhvmWYHVNsj2zcPjYBwb9TqG7miR87qLBBLI4gHOnJVYmCyjZK/bj06f9slvTMbWXrze7LJ9/Hi/8DB0ag==",
-      "requires": {
-        "query-string": "^6.12.1"
-      }
+    "node_modules/@amap/amap-jsapi-loader": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/@amap/amap-jsapi-loader/-/amap-jsapi-loader-1.0.1.tgz",
+      "integrity": "sha512-nPyLKt7Ow/ThHLkSvn2etQlUzqxmTVgK7bIgwdBRTg2HK5668oN7xVxkaiRe3YZEzGzfV2XgH5Jmu2T73ljejw=="
     }
   }
 }

+ 5 - 0
package.json

@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "@amap/amap-jsapi-loader": "^1.0.1"
+  }
+}

+ 16 - 0
pages.json

@@ -4,6 +4,22 @@
 		{
 			"path": "pages/login/login",
 			"style": {}
+		},{
+			"path": "pages/login/mimi",
+			"style": {}
+		}, {
+			"path": "pages/login/xieyi",
+			"style": {}
+		},  {
+			"path": "pages/login/register",
+			"style": {}
+		},   
+		{
+			"path": "pages/login/resetpassword",
+			"style": {}
+		},{
+			"path": "pages/login/settled",
+			"style": {}
 		}, {
 			"path": "pages/login/loginOauth2",
 			"style": {}

+ 1 - 1
pages/common/helloWorld.vue

@@ -2,7 +2,7 @@
 	<view>
 		<scroll-view :scroll-y="modalName==null" class="page" :class="modalName!=null?'show':''">
 			<cu-custom bgColor="bg-gradual-pink" :isBack="true">
-				<block slot="content">helloWorld</block>
+				<block slot="content">helloWorld11</block>
 			</cu-custom>
 			
 			<view class="padding flex flex-direction">

+ 44 - 0
pages/component/map.vue

@@ -0,0 +1,44 @@
+<template>
+    <view class="content">
+        <map id="amap" style="width: 100%; height: 300px;"></map>
+    </view>
+</template>
+
+<script>
+import AMapLoader from '@amap/amap-jsapi-loader';
+
+export default {
+    data() {
+        return {
+            map: null,
+        };
+    },
+    onReady() {
+        this.initMap();
+    },
+    methods: {
+        initMap() {
+            AMapLoader.load({
+                key: '你的高德地图Key', // 在高德地图开放平台申请的Key
+                version: '2.0', // 指定要加载的API的版本号,默认为 1.4.15
+            }).then((AMap) => {
+                this.map = new AMap.Map('amap', {
+                    resizeEnable: true,
+                    zoom: 11, // 初始化地图层级
+                    center: [116.397428, 39.90923], // 初始化地图中心点位置
+                });
+            }).catch(e => {
+                console.error(e);
+            });
+        }
+    }
+}
+</script>
+
+<style scoped>
+.content {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+}
+</style>

+ 137 - 65
pages/login/login.vue

@@ -1,55 +1,51 @@
   <template>
 	<view class="zai-box">
-        <scroll-view scroll-y class="page">
-            <view class="text-center" :style="[{animation: 'show ' + 0.4+ 's 1'}]">
+        <!-- <scroll-view scroll-y class="page"> -->
+            <!-- <view class="text-center" :style="[{animation: 'show ' + 0.4+ 's 1'}]"> -->
+			<!-- <image src="../../static/login/bejing.png" mode='aspectFit' class="zai-header "></image> -->
+			<view class="zai-header"></view>
+			<!-- <view class="text-center" >
 				<image src="https://static.jeecg.com/upload/test/login4_1595818039175.png" mode='aspectFit' class="zai-logo "></image>
-				<view class="zai-title text-shadow ">JEECG BOOT </view>
-			</view>
-            <view class="box padding-lr-xl login-paddingtop" :style="[{animation: 'show ' + 0.6+ 's 1'}]">
-				<block v-if="loginWay==1">
-					<view class="cu-form-group margin-top  shadow-warp" :class="[shape=='round'?'round':'']">
-						<view class="title"><text class="cuIcon-people margin-right-xs"></text>账号:</view>
-						<input placeholder="请输入账号" name="input" v-model="userName"></input>
+				<view class="zai-title text-shadow ">本地生活 </view>
+			</view> -->
+            <view class="box padding-lr-xl login-paddingtop" >
+				<block >
+					<view class="box-user flex align-center " style="border-bottom: 1px solid #EFEFEF;" :class="[shape=='round'?'round':'']">
+						<!-- <view class="title"><text class="cuIcon-people margin-right-xs"></text>手机号:</view> -->
+						<image src="../../static/login/Frame (27).png" mode='aspectFit' class="zai-logo "></image>
+						<input placeholder="请输入手机号" name="input" v-model="userName"></input>
 					</view>
-					<view class="cu-form-group margin-top shadow-warp" :class="[shape=='round'?'round':'']">
-						<view class="title"><text class="cuIcon-lock margin-right-xs"></text>密码:</view>
-						<input class="uni-input" placeholder="请输入密码" :password="!showPassword" v-model="password" />
+					<view class="box-user flex align-center" :class="[shape=='round'?'round':'']">
+						<!-- <view class="title"><text class="cuIcon-lock margin-right-xs"></text>密码:</view>
+						<input class="uni-input" placeholder="请输入密码" :password="!showPassword" v-model="password" /> -->
+						<image src="../../static/login/Frame (26).png" mode='aspectFit' class="zai-logo "></image>
+						<input placeholder="请输入密码"  :password="!showPassword" v-model="password" ></input>
 						<view class="action text-lg">
 						    <text :class="[showPassword ? 'cuIcon-attention' : 'cuIcon-attentionforbid']" @click="changePassword"></text>
 						</view>
 					</view>
-					<view class="padding text-center margin-top">
-						<button class="cu-btn bg-blue lg margin-right shadow" :loading="loading" :class="[shape=='round'?'round':'']"
+					<view style="margin-top:30%">
+						<button  class="cu-btn round lg  bg-blue " style="display: flex;" :loading="loading" :class="[shape=='round'?'round':'']"
 							@tap="onLogin"><text space="emsp">{{loading ? "登录中...":" 登录 "}}</text>
 						</button>
-						<button class="cu-btn line-blue lg margin-left shadow" :loading="loading" :class="[shape=='round'?'round':'']"
-							@tap="loginWay=3-loginWay">短信登录
-						</button>
+						<!-- <button class="cu-btn line-blue lg margin-left shadow" :loading="loading" :class="[shape=='round'?'round':'']"
+							@tap="loginWay=3-loginWay">注册
+						</button> -->
+					</view>
+					<view class="flex align-center" style="margin-top:10px;color: #858585;font-size:11px">
+						<uni-data-checkbox	multiple  :localdata="sex" v-model="checked"  active-color="#FF852D "></uni-data-checkbox>
+						请您阅读并同意<view> <text @tap="nav('xieyi')" class="text-color"> 用户协议</text> 和 <text
+								class="text-color" @tap="nav('mimi')">隐私政策</text></view>
+					</view>
+					<view class="footer">
+						<view class="text-color" @tap="nav('register')">去注册</view>
+						<text style="margin-top: 5px;" @tap="nav('resetpassword')">忘记密码</text>
 					</view>
 				</block>
-                <block v-else>
-                	<view class="cu-form-group margin-top  shadow-warp" :class="[shape=='round'?'round':'']">
-                		<view class="title"><text class="cuIcon-mobile margin-right-xs"></text>手机号:</view>
-                		<input placeholder="请输入手机号" type="number" maxlength="11" v-model="phoneNo"></input>
-                	</view>
-                	<view class="cu-form-group margin-top shadow-warp" :class="[shape=='round'?'round':'']">
-                		<view class="title"><text class="cuIcon-lock margin-right-xs"></text>验证码:</view>
-                		<input class="uni-input" placeholder="请输入验证码" v-model="smsCode"/>
-                		<view class="action">
-                			<button class="cu-btn line-blue sm" :disabled="!isSendSMSEnable" @click="onSMSSend"> {{ getSendBtnText }}</button>
-                		</view>
-                	</view>
-                	<view class="padding text-center margin-top">
-                		<button class="cu-btn bg-blue lg margin-right shadow" :loading="loading" :class="[shape=='round'?'round':'']"
-                			@tap="onSMSLogin"><text space="emsp">{{loading ? "登录中...":" 登录 "}}</text>
-                		</button>
-                		<button class="cu-btn line-blue lg margin-left shadow" :loading="loading" :class="[shape=='round'?'round':'']"
-                			@tap="loginWay=1">账户登录
-                		</button>
-                	</view>
-                </block>
-				
+             
+			
 	
+				
 				<!-- #ifdef APP-PLUS -->
 				<view class="padding flex flex-direction  text-center">
 					当前版本:{{version}}
@@ -57,7 +53,8 @@
 				<!-- #endif -->
 				
             </view>
-        </scroll-view>
+        <!-- </scroll-view> -->
+	
 		<!-- 登录加载弹窗 -->
 		<view class="cu-load load-modal" v-if="loading">
 			<!-- <view class="cuIcon-emojifill text-orange"></view> -->
@@ -76,9 +73,14 @@
     export default {
         data() {
             return {
+				sex: [{
+					text: '',
+					value: 1
+				}],
+				checked:[],
 				shape:'',//round 圆形
 				loading: false,
-				userName: 'admin',
+				userName: '18956455265',
 				password: '123456',
 				phoneNo: '',
 				smsCode: '',
@@ -108,6 +110,7 @@
 			// #endif
 		},
 		computed: {
+		
 		      isSendSMSEnable() {
 		        return this.smsCountDown <= 0 && this.phoneNo.length > 4;
 		      },
@@ -127,9 +130,21 @@
 		},
         methods: {
 			 ...mapActions([ "mLogin","PhoneLogin","ThirdLogin" ]),
+			 nav(url) {
+				this.$Router.push({name:url})
+				// uni.navigateTo({
+				// 	url: url
+				// });
+			},
+			//  登录
 			onLogin: function (){
+				
+					if(!this.checked || this.checked.length==0){
+			          this.$tip.toast('请阅读后勾选并同意《平台协议》及《隐私协议》政策');
+			          return;
+			        }
 			        if(!this.userName || this.userName.length==0){
-			          this.$tip.toast('请填写用户名');
+			          this.$tip.toast('请填写手机号');
 			          return;
 			        }
 			        if(!this.password || this.password.length==0){
@@ -137,10 +152,11 @@
 			          return;
 			        }
 			        let loginParams = {
-			          username:this.userName,
-			          password:this.password
+						phone:this.userName,
+						passWord:this.password
 			        }
 					this.loading=true;
+				
 			        this.mLogin(loginParams).then((res) => {
 					  this.loading=false;
 			          if(res.data.success){
@@ -154,13 +170,13 @@
 						}else{
 			              this.$tip.alert(res.data.message);
 			            }
-			        }).catch((err) => {
+			        }).catch((err) => { 
 			          let msg = err.data.message || "请求出现错误,请稍后再试"
 			          this.loading=false;
 					  this.$tip.alert(msg);
 			        }).finally(()=>{
 					  this.loading=false;
-				})
+					})
 			},
 			saveClientId(){
 				var info = plus.push.getClientInfo();
@@ -175,19 +191,19 @@
 				this.showPassword = !this.showPassword;
 			},
 			onSMSSend() {
-				let smsParams = {};
-				smsParams.mobile=this.phoneNo;
-				smsParams.smsmode="0";
+				// let smsParams = {};
+				// smsParams.phone=this.phoneNo;
+				// smsParams.smsmode="0";
 				let checkPhone = new RegExp(/^[1]([3-9])[0-9]{9}$/);
-                if(!smsParams.mobile || smsParams.mobile.length==0){
+                if(!this.phoneNo || this.phoneNo.length==0){
 					this.$tip.toast('请输入手机号');
 					return false
 				}
-				if(!checkPhone.test(smsParams.mobile)){
+				if(!checkPhone.test(this.phoneNo)){
 					this.$tip.toast('请输入正确的手机号');
 					return false
 				}
-				this.$http.post("/sys/sms",smsParams).then(res=>{
+				this.$http.get("/merchant/app/sendMsg",{params:{phone:this.phoneNo}}).then(res=>{
 				  if(res.data.success){
 					this.smsCountDown = 60;
 					this.startSMSTimer();
@@ -207,7 +223,7 @@
 			},
 			onSMSLogin() {
 				let checkPhone = new RegExp(/^[1]([3-9])[0-9]{9}$/);
-				
+			
 				if(!this.phoneNo || this.phoneNo.length==0){
 				  this.$tip.toast('请填写手机号');
 				  return;
@@ -220,15 +236,19 @@
 				  this.$tip.toast('请填短信验证码');
 				  return;
 				}
+				if(!this.checked || this.checked.length==0){
+					this.$tip.toast('请阅读后勾选并同意《平台协议》及《隐私协议》政策');
+					return;
+				}
 				let loginParams = {
 				  mobile:this.phoneNo,
 				  captcha:this.smsCode
 				};
-				this.PhoneLogin(loginParams).then((res) => {
-				  console.log("res====》",res)
+				this.$http.get("/merchant/app/checkCode",{params:{phone:this.phoneNo, code:this.smsCode}}).then(res=>{
 				  if(res.data.success){
-					this.$tip.success('登录成功!')
-					this.$Router.replaceAll({name:'index'})
+					this.nav('settled')
+					// this.$tip.success('登录成功!')
+					// this.$Router.replaceAll({name:'index'})
 				  }else{
 					this.$tip.error(res.data.message);
 				  }
@@ -236,6 +256,18 @@
 				  let msg = ((err.response || {}).data || {}).message || err.data.message || "请求出现错误,请稍后再试"
 				  this.$tip.error(msg);
 				});
+				// this.PhoneLogin(loginParams).then((res) => {
+				//   console.log("res====》",res)
+				//   if(res.data.success){
+				// 	// this.$tip.success('登录成功!')
+				// 	// this.$Router.replaceAll({name:'index'})
+				//   }else{
+				// 	this.$tip.error(res.data.message);
+				//   }
+				// }).catch((err) => {
+				//   let msg = ((err.response || {}).data || {}).message || err.data.message || "请求出现错误,请稍后再试"
+				//   this.$tip.error(msg);
+				// });
 			},
 			loginSuccess() {
 			  // 登陆成功,重定向到主页
@@ -253,22 +285,62 @@
     }
 </script>
 
-<style>
+<style scoped lang="scss">
+page{
+	background: #FFFFFF;
+		height: 100%;
+}
+	.uni-data-checklist{
+		flex:none;
+		/deep/.checklist-group .checklist-box{
+			margin-right: 0 !important;
+		}
+	}
+	.footer{
+		position: fixed;
+		bottom: 20px;
+		font-size: 14px;
+		color: #999999;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+	.text-color {
+		color: #449AFF ;
+		margin: 0 5px;
+	}
     .login-paddingtop {
-        padding-top: 100upx;
+        // padding-top: 100upx;
+		padding: 50px 17px 28px 17px;
     }
 
     .zai-box {
-        padding: 0 20upx;
-        padding-top: 100upx;
-        position: relative;
+		background: #FFFFFF;
+		height: 100%;
+		.zai-header{
+			width: 100%;
+			height: 225px;
+			background-image: url(../../static/login/bejing.png);
+			background-size: cover;
+		}
+        // padding: 0 20upx;
+        // padding-top: 100upx;
+        // position: relative;
     }
 
     .zai-logo {
-        width: 200upx;
-        height: 150px;
+        width: 20px;
+        height: 20px;
     }
-
+.box-user{
+	min-height: 45px;
+	image{
+		margin-right: 10px;
+	}
+	input{
+	font-size: 14px;
+		flex: 1;
+	}
+}
     .zai-title {
        font-size: 58upx;
        color: #000000;

+ 398 - 0
pages/login/mimi.vue

@@ -0,0 +1,398 @@
+<template>
+	<view style="font-size: 14px;line-height: 26px;padding: 32rpx;background: #FFFFFF;" class="home1">
+		<!-- 公共组件-每个页面必须引入 -->
+		<view class="u-f-ajc" style="font-size: 16px;font-weight: bold">晋掌柜本地生活隐私政策</view>
+		<view style="text-align: left;margin-top: 15rpx;">更新日期: 2024年06月24日</view>
+		<view style="text-align: left;margin-bottom: 15rpx;">生效日期: 2024年06月24日</view>
+		<view style="text-align: left;text-indent: 2rem;"> 掌柜科技移动设备客户端(掌柜科技APP)网络运营平台以下简称“合伙人)
+			由山西掌柜鼎科技有公司(以下简称”我们”或“掌柜科技”。注册地址:山西转型综合改革示范区科技创新城化章北街1号山西数据流量生态园4号楼4层4408-176,)运营本政策适用合伙人所提供的保险信息服务、养车服务、网上购物服务、车圈动态服务,以及其他增值服多(以下统称“我们的产品和/或服务"),包括各类保险产品息服务及洗车美容、维修保养、违章查询、充值服务、代驾、
+			预约停车、一键救援、U驾服务、选座观影、车损测算及我们在合伙人页面所展示的相关产品和/或服务。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;text-decoration: underline;">
+			需要特别说明的是,本政策不适用合伙人中已另立设置隐私政策的产品和/或服务,亦不适用您通过我们的产品或服务而接入的由其他第三方提供的产品和/或服务。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">本政策将帮助您了解以下内容:
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">1、我们如何收集和使用您的个人信息
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">2、我们如何使用Cookie和同类技术
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">3、我们如何共享、转让、公开披露您的个人信息
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">4、我们如何保护您的个人信息
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">5、您如何管理您的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">6、我们如何处理儿童的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">7、我们如何存储您的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">8、本政策如何更新</view>
+		<view style="text-align: left;text-indent: 2rem;">9、如何联系我们</view>
+		<view style="text-align: left;text-indent: 2rem;">10、本政策中关键词说明</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;text-decoration: underline;">
+			我们深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,在收集及使用您的个人信息时恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则。同时,我们承诺,我们将按业界成熟的安全标准,采取相应的安全保护措施来保护您的个人信息。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;text-decoration: underline;">
+			请在使用我们的产品与/或服务前,仔细阅读并了解本《隐私政策》。我们努力用通俗易懂、简明扼要的文字表达,并对本政策中与您的权益有重大关系的条款,采用粗体字进行标注,以提示您注意。</view>
+		<view style="font-size: 16px;font-weight: bold">一、我们如何收集和使用您的个人信息</view>
+		<view style="text-indent: 2rem;">
+			我们的产品与/或服务包括核心业务功能和附加业务功能,核心功能包括【向您提供用于查询保险产品信息、传递投保意向与保险有关的辅助信息服务,以及向您推荐并提供由我们合作方提供的洗车美容、维修保养、违章查询、加油、代驾、预约停车、一键救援、
+			U驾服务、选座观影、车损测算及合伙人展示的除前述之外的养车用车服务、网上购物服务及车圈动态服务】。我们仅会出于本政策所述的以下目的,收集和使用您的个人信息:</view>
+		<view style="text-align: left;text-indent: 2rem;">(一)您使用我们的核心业务功能须授权我们收集和使用您个人信息的情形</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;text-decoration: underline;">
+			我们的产品与/或服务包括一些核心功能,
+			这些功能包含了保险信息服务、养车用车服务、车损测算服务、网上购物服务及其他所必须的功能、改进我们的产品与/或服务所必须的功能及保障交易安全所必须的功能。我们可能会收集、保存和使用下列与您有关的信息才能实现上述这些功能。如果您不提供相关信息,您将无法享受我们提供的核心业务功能。这些情形包括:
+		</view>
+		<view style="font-weight: bold;text-indent: 2rem;">1、实现保险信息服务、养车用车服务、网上购物服务所必须的情形</view>
+		<view style="font-weight: bold;text-indent: 2rem;">(1)注册成为用户</view>
+		<view style="font-weight: bold;text-indent: 2rem;text-decoration: underline;">
+			为完成创建账号,您需提供您本人的手机号码,我们将通过发送短信验证码的方式来验证您的身份是否有效。</view>
+		<view style="text-indent: 2rem;">在注册过程中,如果您提供以下额外信息,将有助于我们给您提供更好地服务和体验: <text
+				style="font-weight: bold;text-decoration: underline;">地址信息、车牌号码、微信账号、微信头像及合伙人相应页面显示您可填写的其余信息。</text>但如果您不提供这些补充信息,将不会影响您浏览我们的服务,但可能会在服务阶段要求您补充相关信息。
+		</view>
+
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(2)保险信息服务
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			当您需要了解保险服务时,您可以通过我们的网络运营平台向与我们合作的保险机构进行保险产品的询价。为实现此项服务,你需要向与我们合作的保险机构<text
+				style="font-weight: bold;text-decoration: underline;">提供车牌号码、车主姓名、手机号码。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(3)违章查询
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">为向您提供违章查询服务,您可能需要提供<text
+				style="font-weight: bold;text-decoration: underline;">车牌号码、车架号码、发动机号、行驶证照片</text>信息,以便我们为您提供准确的违章信息查询服务。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(4) 洗车、美容、快修服务</view>
+		<view style="text-align: left;text-indent: 2rem;">为向您提供更便捷的洗车美容快修服务,您可能需要提供<text
+				style="font-weight: bold;text-decoration: underline;">您的位置信息</text>,以便我们为您提供附近的服务门店信息、预约登记及相关周边服务。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(5)代驾服务</view>
+		<view style="text-align: left;text-indent: 2rem;">为向您提供更便捷的代驾服务,您可能需要提供您的<text
+				style="font-weight: bold;text-decoration: underline;">位置信息、且的地信息、手机号码,</text>以便我们的合作方为您提供代驾服务。</view>
+		<view style="text-align: left;text-indent: 2rem;">(6) 预约停车服务</view>
+		<view style="text-align: left;text-indent: 2rem;">为向您提供更便捷的预约停车服务,您可能需要提供<text
+				style="font-weight: bold;text-decoration: underline;">您的停车地点、停车时间信息,</text>以便我们的合作方为您提供代驾服务。</view>
+
+		<view style="text-align: left;text-indent: 2rem;">(7) U驾服务</view>
+		<view style="text-align: left;text-indent: 2rem;">为向您提供U驾服务,您可能需要提供<text
+				style="font-weight: bold;text-decoration: underline;">行政区域、车牌号码、车架号码、发动机号、品牌型号、注册日期信息,</text>以便我们的合作方为您提供U驾服务。
+		</view>
+
+		<view style="text-align: left;text-indent: 2rem;">(8)线上购物服务</view>
+		<view style="text-align: left;text-indent: 2rem;">在接受线上购物服务过程中,您需要提供<text
+				style="font-weight: bold;text-decoration: underline;">收货人姓名、联系电话、所在地区、详细地址作为您的收货地址信息,</text>以便我们安排第三方配送公司向您配送商品。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(9)支付功能</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			在您下单后,您可以选择与我们合作的银行或第三方支付机构提供支付服务。完成支付功能时,我们本身并不收集您的个人信息,但我们需要将您的<text
+				style="font-weight: bold;text-decoration: underline;">您的订单号、消费金额、服务类型</text>及为完成支付所必要的信息与这些支付机构共享以实现其确认您的支付指令并完成支付。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(10)选座观影</view>
+		<view style="text-align: left;text-indent: 2rem;">在您下单后,您需要提供<text
+				style="font-weight: bold;text-decoration: underline;">您的手机号码</text>用于收取观影凭证短信。</view>
+		<view style="text-align: left;text-indent: 2rem;">(11) 车损测算</view>
+		<view style="text-align: left;text-indent: 2rem;">您使用该功能,需要您允许开启您手机的<text
+				style="font-weight: bold;text-decoration: underline;">相机(摄像头)、相册(图片库)权限。</text></view>
+		<view style="text-align: left;text-indent: 2rem;">(12)车圈动态</view>
+		<view style="text-align: left;text-indent: 2rem;">当您在车圈发表贴子或问答时,需要您的<text
+				style="font-weight: bold;text-decoration: underline;">相机(摄像头)、相册(图片库)权限</text>用于发布内容添加图片。</view>
+		<view style="text-align: left;text-indent: 2rem;">(13)车辆年检服务</view>
+		<view style="text-align: left;text-indent: 2rem;">当您使用该功能,需要您的<text
+				style="font-weight: bold;text-decoration: underline;">车牌号、车架号、发动机号、行驶本正副本照片,身份证正反面照片</text>用于享受该服务。如需邮寄年检标志,还需要收货人姓名、联系电话、所在地区、详细地址作为您的收货地址信息。
+		</view>
+
+		<view style="text-align: left;text-indent: 2rem;">(14)充值服务</view>
+		<view style="text-align: left;text-indent: 2rem;">当您使用充值服务时,您需要提供<text
+				style="font-weight: bold;text-decoration: underline;">油卡卡号(油卡充值)、手机号码(话费充值)。</text></view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">2、开展数据分析和研究,改进我们的产品与/或服务所必需的功能</view>
+		<view style="text-align: left;text-indent: 2rem;"><text
+				style="font-weight: bold;text-decoration: underline;">我们可能会收集您的订单信息、设备信息及您因使用合伙人所产生的必要信息进行数据分析以形成用户画像,用来将您可能感兴趣的产品与/或服务信息在合伙人展示给您;或在合伙人上您搜索时向您展示您可能希望找到的产品与/或服务。</text>对于从您的各种设备上收集到的信息,包括您的设备信息(设备型号、崩溃日志、性能日志)及其他相关信息,我们可能会将它们进行关联,以便可以改进我们的产品或服务,并能在这些设备上为您提供一致的服务。
+		</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">3、保障交易安全所必须的功能</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			为提高您使用我们的产品与/或服务时系统的安全性,更准确地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入的安全风险和保护账户安全,我们可能会通过了解您的<text
+				style="font-weight: bold;text-decoration: underline;">浏览信息、搜索信息、订单信息、您常用的软件信息、设备信息</text>的手段来判断您的账户风险,并可能会记录一些我们认为有风险的链接("URL),我们也可能会收集您的<text
+				style="font-weight: bold;text-decoration: underline;">设备信息(包括设备型号、设备ID、操作系统、IMEI、IMSI、设备MAC地址、无线网络名称、SIM序列号、唯一设备标识符、登陆IP地址、接入网络方式、类型和状态、网络质量数据、操作日志、服务故障信息),</text>以便于对合伙人遇到的问题进行原因分析、流量统计并排查可能存在的风险,在您选择向我们发送异常信息时予以排查。
+		</view>
+		<view style="text-align: left;text-indent: 2rem; ">4、其他功能</view>
+		<view style="text-align: left;text-indent: 2rem;">(1)当您需要通过合伙人拨打在线客服电话时,我们会调用<text
+				style="font-weight: bold;text-decoration: underline;">拨打电话</text>的权限。</view>
+		<view style="text-align: left;text-indent: 2rem;">(2)为了便捷您发现周边服务网点的信息。</view>
+
+		<view style="text-align: left;text-indent: 2rem;">我们会基于您的地理位置为您提供服务(LBS) 。当您开启设备定位功能并使用我们的LBS时,我们<text
+				style="font-weight: bold;text-decoration: underline;">可能会收集和使用您的位置信息</text>,以实现我们为您提供本地周边服务的目的。我们会使用有关技术对您的实际位置进行定位,这些技术包括<text
+				style="font-weight: bold;text-decoration: underline;">IP地址、GPS以及能够提供相关信息的Wi-Fi接入点、蓝牙、陀螺仪和基站及其他传感器技术。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">(二)您可选择是否授权我们收集和使用您的个人信息的情形</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			1、为给您提供更丰富更便捷的产品与/或服务,从而提升您的客户体验,我们的以下附加功能中可能会收集和使用您的个人信息。<text
+				style="font-weight: bold;text-decoration: underline;">如果您不提供这些个人信息,您依然可以使用我们的核心功能,但您可能无法使用这些可以为您带来便捷服务的相关功能。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">这些附加业务功能包括:积分兑换及其他附加业务功能。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">上述附加功能可能需要您在您的设备中向我们开启<text
+				style="font-weight: bold;text-decoration: underline;">您的地理位置(位置信息)
+				、相机(摄像头)、相册(图片库)、传感器、麦克风以及通讯录的访问权限,</text>以实现这些功能所涉及的信息的收集和使用。您可以在您的设备中通过”设置"一"权限管理”逐项查看您上述权限的开启状态,并可以决定将这些权限随时的开启或关闭。请您注意,您开启这些权限即代表您授权我们可以收集和使用这些个人信息来实现上述的功能,您关闭权限即代表您取消了这些授权,则我们将不再继续收集和使用您的这些个人信息,也无法为您提供上述与这些授权所对应的功能。您关闭权限的决定不会影响此前基于您的授权所进行的个人信息的处理。
+		</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">2、我们从第三方获得您个人信息的情形</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			为向您提供更优质、全面的服务,您授权我们在法律及相关规定允许的范围内,从我们的关联方、服务提供方及第三方处接收、存储和处理您的相关个人信息,以改善您的服务体验或者为之赋予个性化。如您拒绝授权,可能无法使用全面服务,但不影响您使用合伙人的核心功能。
+		</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">(三)您充分知晓,以下情形中,我们收集、使用您的个人信息无需征得您的授权同意:
+		</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			1、与国家安全、国防安全直接相关的;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			2、与公共安全、公共卫生、重大公共利益直接相关的;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			3、与犯罪侦查、起诉、审判和判决执行等直接相关的</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			4、出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			5、所收集的个人信息是个人信息主体自行向社会公众公开的;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			6、从合法公开披露的信息中收集的您的个人信息的,如合法的新闻报道、政府信息公开等渠道;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			7、根据您的要求签订和履行合同所必需的;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			8、用于维护所提供的产品与/或服务的安全稳定运行所必需的,发现、处置产品与/或服务的故障;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			9、为开展合法的新闻报道所必需的;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">
+			10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所包含的个人信息进行去标识化处理的;</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;text-decoration: underline;">11、法律法规规定的其他情形。
+		</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">(四)您个人信息使用的规则</view>
+		<view style="text-align: left;text-indent: 2rem;">1、我们会根据本隐私政策的约定并为实现我们的产品与/或服务功能对所收集的个人信息进行使用。</view>
+		<view style="text-align: left;text-indent: 2rem;">2、在收集您的个人信息后,我们将通过技术手段对数据进行去标识化处理,去标识化处理的信息将无法识别主体<text
+				style="font-weight: bold;text-decoration: underline;">请您了解并同意,在此情况下我们有权使用已经去标识化的信息;并在不透露您个人信息的前提下,对用户数据库进行分析并予以商业化的利用。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem;"><text
+				style="font-weight: bold;text-decoration: underline;">3、根据网络服务实名制管理要求,为保证我们为您提供服务的连续性、真实性,我们可能需要将您的身份信息、联系信息、财产信息提交给我们委托的第三方对您的个人信息进行核验。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			4、我们可在得到您的同意之后,将您的个人信息用于不时地将我们的产品与/或服务、特别活动或推广通知予您,为您处理您在线上所下的任何订单,就您的兴趣偏好及对我们的服务与/产品的意见向您进行市场调研,或者将该信息用于特别通知予您的其他目的。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;"><text
+				style="font-weight: bold;text-decoration: underline;">5、请您注意,您在使用我们的产品与/或服务时所提供的所有个人信息,除非您刑除或通过系统设置拒绝我们收集,否则将在您使用我们的产品与/或服务期间持续授权我们使用。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">6、当我们展示您的个人信息时,我们会采用包括内容替换、匿名处理方式对您的信息进行脱敏,以保护您的信息安全。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			7、我们会对我们的产品与/或服务使用情况进行统计,并可能会与公众、行业组织、相关监管机构或其他第三方共享这些信息,以展示我们的产品与/或服务的整体使用趋势。但这些信息不包含您的任何身份识别信息。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			8、当我们要将您的个人信息用于本政策未载明的其它用途时,或基于特定目的收集而来的信息用于其他目的时,会通过让您主动做出勾选的形式事先征求您的同意。</view>
+
+		<view style="font-size: 16px;font-weight: bold">二、 我们如何使用Cookie和同类技术</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">(一) Cookie的使用</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			为确保网站正常运转,我们会在您的计算机或移动设备上存储名为Cookie的小数据文件。Cookie通常包含标识符、站点名称以及一些号码和字符。借助于Cookie,网站能够存储您的偏好或购物篮内的商品的数据。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			我们不会将Cookie用于本政策所述目的之外的任何用途。您可根据自己的偏好管理或删除Cookie。您可以清除计算机上保存的所有Cookie,大部分网络浏览器都设有阻止Cookie的功能。但如果您这么做,则需要在每一次访问我们的网站时亲自更改用户设置。
+		</view>
+		<view style="text-align: left;text-indent: 2rem; font-weight: bold;">(二)网站信标和像素标签的使用</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			除Cookie外,我们]还会在网站上使用网站信标和像素标签及其他同类技术。我们向您发送的电子邮件可能含有链接至我们网站内容的点击URL。如果您点击该链接,我们则会跟踪此次点击,帮助我们了解您的产品或服务偏好并改善客户服务。网站信标通常是一种嵌入到网站或电子邮件中的透明图像。借助于电子邮件中的像素标签,我们能够获知电子邮件是否被打开。如果您不希望自己的活动以这种方式被追踪,则可以随时从我们的寄信名单中退订。
+		</view>
+		<view style="font-size: 16px; text-align: left;text-indent: 2rem; font-weight: bold;">三、我们如何共享、转让、公开披露您的个人信息
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(一)共享</view>
+		<view style="text-align: left;text-indent: 2rem;">我们不会与平台运营者以外的任何公司、组织和个人分享您的个人信息,但以下情况除外:</view>
+		<view style="text-align: left;text-indent: 2rem;">1、在获取明确同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的个人信息。</view>
+		<view style="text-align: left;text-indent: 2rem;">2、我们可能会根据法律法规规定,或按政府主管部门的合法要求,对外共享您的个人信息。</view>
+		<view style="text-align: left;text-indent: 2rem;">3、与我们的关联方共享:我们会将您的个人信息与我们的关联方(此处的关联方仅指华农财产保险、恒邦财产保险)进行共享。<text
+				style="font-weight: bold;text-decoration: underline;">我们只会出于为您提供一体化的金融产品与/或服务,更高效的风险防控服务,更优质的金融科技应用体验之目的,共享与前述且的和服务相关的您的必要个人信息。前述关联公司如要改变个人信息的处理目的,将再次征求您的授权同意。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			4、与授权合作伙伴共享:仅为实现本政策中声明的目的,我们的某些服务将由授权合作伙伴提供。我们可能会与授权合作伙伴共享您的某些个人信息,以便我们及合作伙伴为您提供更好的客户服务和用户体验。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。我们的授权合作伙伴无权将共享的个人信息用于任何其他用途。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">目前,我们的授权合作伙伴包括以下四大类型:</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			1)协助提供或推广保险服务类的授权合作伙伴。包括但不限于保险公司、保险经纪公司、保险代理公司以及提供广告和分析服务的合作伙伴。为了您能享受更好的保险服务体验,我们会与提供保险服务类的合作伙伴共享您的<text
+				style="font-weight: bold;text-decoration: underline;">车牌号码、车主姓名、手机号码及相关必要信息。</text>我们会与提供广告投放、推广和统计分析的合作伙伴共享信息,但我们仅会向这些合作伙伴提供广告推广的覆盖面、有效性以及统计类等信息,而不会共享可以识别您身份的个人信息,否则我们会对这些信息进行去标识化处理以避免对您身份的识别。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			2)与运营服务相关的授权合作伙伴。包括但不限于加油服务商、洗车美容服务商、汽车维修服务商、违章查询服务商以及与我们合作的银行、第三方支付机构和配送公司。我们可能共享的信息为本协议”<text
+				style="font-weight: bold;text-decoration: underline;">”一、我们如何收集和使用您的个人信息"项下所收集的与相关产品、服务或功能对应的且与我们的合作伙伴所拟提供服务相匹配的您的必要个人信息。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			3)与运营保障相关的授权合作伙伴。包括但不限于数据分析、挖掘、核验机构、风险管理和咨询机构、电讯通信、计算机处理、软件技术服务商。<text
+				style="font-weight: bold;text-decoration: underline;">我们目前使用了第三方的SDK,包括高德SDK
+				(获取GPS信息,用于提供附近服务门店服务,会共享您的设备信息、位置信息)、支付宝支付,SDK/微信支付SDK (用于您支付时使用,会共享您的设备信息(可能包括IMEI、IMSI、
+				设备MAC地址、AndroidID、
+				设备型号、网络类型、无线网络列表、无线网络MAC地址、无线网络名称、传感器信息、SIM序列号信息)、位信息、手机号、已安装APP信息、粘贴板、OAID)、微信分享SDK/腾讯分享SDK/友盟分享SDK
+				(用于微信好友、朋友圈、QQ空间、新浪微博及其他社交平台分享,会收集您的您的设备信息(可能包括IMEI、 设备MAC 地址、Android
+				ID、设备型号、无线网络MAC地址、无线网络名称、SIM序列号、手机序列号信息)、位置信息)、Talking Data SDK
+				(用于分析app崩溃情况,会收集您的您的设备信息,可能包括设备型号、崩溃日志、性能日志)、Growing 10 SDK (用于用户行为分析,根据软件情况涉及共享您使用掌柜科技过程中产生的目志数据)、极光SDK
+				(用于APP消息推送、一键登录功能,我们会共享您的设备信息、网络信息、地理位置以及用户在使用开发者应用集成认证服务SDK的功能时所产生的相关数据和信息。极光SDK的隐私政策链接为https://www.jiguang.cn/license/privacy、阿里云盾SDK
+				(用于安全认证,会共享包括设备信息(IMEI、设备MAC地址、Android ID、设备型号、无线网络MAC地址、无线网络名称、SIM序列号、手机序列号信息)、网络信息) ,爱保科技SDK
+				(用于车损理赔图像识别,您可能要提供您的驾驶证、行驶证及必要的车辆信息)。</text>目前使用的第三方SDK仅为了实现业务功能开发所需,目的是为了保障我们能够快速安全地开发和迭代应用程序。如我们的授权合作伙伴需要通过API、SDK获取您的信息,我们会对其进行严格的监控,并按照本协议及与授权伙伴约定的数据保护措施严格执行。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			4)提供增值服务的授权合作伙伴。包括但不限于积分商城服务商、电影票服务商。为了提供增值服务,我们可能共享的信息为您的必要个人信息<text
+				style="font-weight: bold;">(包括联系人、手机号、收货地址及与服务目的相关的必要信息)。</text>
+		</view>
+
+		<view style="text-align: left;text-indent: 2rem;">
+			对我们与之共享个人信息的公司、组织和个人,我们会与其签署严格的保密协定,要求他们]按照我们的说明、本隐私政策以及其他任何相关的保密和安全措施来处理个人信息。如果我们发现他们违反法律法规要求或双方约定处理所共享的个人信息的,我们会立即要求他们停止相关行为,且采取或要求他们采取有效补救措施控制或消除您的个人信息面临的安全风险;必要时我们会解除与他们的业务关系,并要求他们及时删除从我们这里获得的您的个人信息。涉及触犯了相关法律法规需承担责任的,由责任方承担相应的安全和法律责任。
+		</view>
+
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(二)转让</view>
+		<view style="text-align: left;text-indent: 2rem;">我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</view>
+		<view style="text-align: left;text-indent: 2rem;">1、在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息;</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			2、在涉及合并、收购或破产清算时,如涉及到个人信息转让,我们会在要求新的持有您个人信息的公司、组织继续受此隐私政策的约束,否则我们将要求该公司、组织重新向您征求授权同意。</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(三)公开披露</view>
+		<view style="text-align: left;text-indent: 2rem;">我们仅会在以下情况下,公开披露您的个人信息:</view>
+		<view style="text-align: left;text-indent: 2rem;">1、获得您明确同意后;</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			2、基于法律的披露:在法律、法律程序、诉讼或政府主管部门要求的情况下,我们可能会公开披露您的个人信息。</view>
+		<view style="font-size: 16px; text-align: left;text-indent: 2rem; font-weight: bold;">四、我们如何保护您的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(一)我们已使用符合业界标准的安全防护措施保护您提供的个人信息,防止数据遭到未经授权访问、公开披露、使用、修改、损坏或丢失。我们会采取一切合理可行的措施,保护您的个人信息。在您的浏览器与“服务“之间交换数据时受SSL加密保护;我们会使用加密技术确保数据的保密性;我们会使用受信赖的保护机制防止数据遭到恶意攻击;我们会部署访问控制机制,确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(二)我们会采取一切合理可行的措施,确保末收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(三)互联网并非绝对安全的环境,而且电子邮件、即时通讯、社交软件与其他用户的交流方式无法确定是否完全加密,我们强烈建议您不要通过此类方式发送个人信息。请使用复杂密码,协助我们保证您的账号安全。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(四)如上所述,我们将使用各种安全技术、程序和制度防止用户个人信息的丢失、不当使用、未经授权的阅览或披露。但您充分理解并同意:由于技术的限制以及可能存在的各种恶意手段,在互联网行业,即便竭尽所能加强安全措施,也不可能始终保证信息百分之百的安全。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(五)在不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施及其他相关信息。我们将及时将事件相关情况以邮件、信函、电话、短信或推送通知的方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告,由责任方承担相应的责任。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			同时,我们还将按照监管部]要求,主动上报个人信息安全事件的处置情况。</view>
+		<view style="font-size: 16px; text-align: left;text-indent: 2rem; font-weight: bold;">五、您如何管理您的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			合伙人非常重视您对个人信息的关注,并尽全力保护您对于个人信息访问、更正、删除以及撤回同意的权利,以使您拥有充分的能力保障您的隐私和安全。您的权利包括:</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(一)访问您的个人资料</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			您有权访问您的个人资料,法律法规规定的例外情况除外。如果您想行使数据访问权,可以通过以下方式自行访问:</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			账户信息--如果您希望访问或编辑您的账户中的个人资料信息、更改您的密码的,您可以通过手机APP的“我的-个人资料”执行此类操作</view>
+		<view style="text-align: left;text-indent: 2rem;">订单信息--您可以在手机APP中“我的我的订单”访问您的订单信息。</view>
+		<view style="text-align: left;text-indent: 2rem;"> 车辆信息--您可以在APP中“爱车*******”访问您的车辆信息。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			如果您无法通过上述路径访问这些个人信息,您可以发送电子邮件至690068578@qq.com,我们将在15天内回复您的访问请求。对于您在使用我们的产品与/或服务过程中产生的其他个人信息,您需要访问的,我们会根据下述”(六)响应您的上述请求"的规定响应您的请求。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(二)更正您的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正。您可以通过前述" (一)
+			访问您的个人资料”中罗列的方式更正您的个人信息。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			如果您无法通过上述路径更正这些个人信息,您可以发送电子邮件至690068578@qq.com.我们将在15天内回复您的更正请求。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(三)删除您的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">在以下情形中,您可以向我们提出删除个人信息的请求</view>
+		<view style="text-align: left;text-indent: 2rem;">1、如果我们处理个人信息的行为违反法律法规;</view>
+		<view style="text-align: left;text-indent: 2rem;">2、如果我们收集、使用您的个人信息,却未征得您的同意;</view>
+		<view style="text-align: left;text-indent: 2rem;">3、如果我们处理个人信息的行为违反了与您的约定;</view>
+		<view style="text-align: left;text-indent: 2rem;">4、 如果您不再使用我们的产品或服务,或您注销了账号;</view>
+		<view style="text-align: left;text-indent: 2rem;">5、如果我们不再为您提供产品或服务。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			若我们决定响应您的删除请求,我们还将同时通知从我们获得您的个人信息的实体,要求其及时删除,除非法律法规另有规定,或这些实体获得您的独立授权。</view>
+		<view style="text-align: left;text-indent: 2rem;">当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除这些信息。</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(四)改变您授权同意的范围</view>
+		<view style="text-align: left;text-indent: 2rem;">对附加业务功能所需收集的个人敏感信息,您可以随时给予或收回您的授权同意。</view>
+		<view style="text-align: left;text-indent: 2rem;">您可以在您的设备中通过“设置”-“权限管理”逐项查看上述权限的开启状态,并可以决定将这些权限随时的开启或关闭。</view>
+		<view style="text-align: left;text-indent: 2rem;">当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			如果您不想接受我们给您发送的商业广告,您随时可通过以下方式取消:根据短信退订指引要求我们停止发送推广短信,或在移动端设备中进行设置,不再接受我们推送的消息;但我们依法律规定或单项服务的服务协议约定发送消息的情形除外。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(五)您如何注销账户</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			您随时可注销此前注册的账户,您可以通过合伙人的“设置"“账号与安全".”账号注销"功能注销您在合伙人的账户。若注销存在疑问,您可发送电子邮件至
+			690068578@qq.com,我们会在15个工作日内联系您处理。在您注销账户之后,我们将停止为您提供产品或服务。并依据您的要求,删除您的个人信息,法律法规另有规定或本协议、账号注销协议另有约定的除外。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">(六)响应您的上述请求</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			如果您无法通过上述方式访问、更正、删除您的个人信息,或您需要访问您在使用我们的产品与/或服务过程中产生的其他个人信息,或者您认为合伙人存在违法违规行为,您均可发送电子邮件至690068578@qq.com或通过本协议中列明的其他方式与我们联系。为保障安全,我们可能需要您提供书面请求,或提供您的身份证明文件,然后再处理您的请求。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">我们将在十五天内做出答复。如您不满意,可以发送电子邮件至690068578@qq.com进行投诉。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情收取一-定成本费用。对于那些无端重复、需要过多技术手段开发新系统或从根本上改变现行惯例的、给他人合法权益带来风险或者非常不切实际的请求,我们可能会予以拒绝。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">在以下情形中,按照法律法规要求,我们将无法响应您的请求:</view>
+		<view style="text-align: left;text-indent: 2rem;">1、与国家安全、国防安全直接相关的;</view>
+		<view style="text-align: left;text-indent: 2rem;">2、与公共安全、公共卫生、重大公共利益直接相关的;</view>
+		<view style="text-align: left;text-indent: 2rem;">3、与犯罪侦查、起诉、审判和判决执行等直接相关的;</view>
+		<view style="text-align: left;text-indent: 2rem;">4、有充分证据表明您存在主观恶意或滥用权利的;</view>
+		<view style="text-align: left;text-indent: 2rem;">5、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;</view>
+		<view style="text-align: left;text-indent: 2rem;">6、涉及商业秘密的。</view>
+
+		<view style="font-size: 16px; text-align: left;text-indent: 2rem; font-weight: bold;">六、我们如何处理儿童的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">我们的网络运营平台主要面向成人。如果没有父母或监护人的同意,儿童不得创建自己的用户账户。</view>
+		<view style="text-align: left;text-indent: 2rem;">对于经监护人同意而收集儿童个人信息的情况,我们只会在法律允许、监护人明确同意或者保护儿童所必要的情况下使用或公开披露此信息
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">儿童指不满十四周岁的任何人。</view>
+		<view style="text-align: left;text-indent: 2rem;">如果我们发现自己在未事先获得可证实的监护人同意的情况下收集了儿童的个人信息,则会设法尽快删除相关数据。</view>
+
+		<view style="font-size: 16px; text-align: left;text-indent: 2rem; font-weight: bold;">七、我们如何存储您的个人信息</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			我们依照法律法规的规定,将在中华人民共和国境内收集和产生的个人信息,并存储在境内,当前我们不会将您的信息传输至境外;如果需跨境传输,我们将会单独征得您的授权同意并遵守相关国家规定。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			在您使用我们的产品/服务期间,您的个人信息将在为了实现本政策所述目的之期限内保存。当您自主删除个人信息或注销账户的,除法律法规另有规定或跟您另有约定外,我们将在法律法规规定的最短期限内保留您的个人信息;当您的个人信息超出上述保存期限,我们将会对其进行依法删除或进行匿名化处理。
+		</view>
+
+		<view style="font-size: 16px; text-align: left;text-indent: 2rem; font-weight: bold;">八、本政策如何更新</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			1、我们的隐私政策可能变更。未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会通过包括但不限于弹窗、站内信、公告、邮件、短信的方式及时提示您更新的情况,若您继续使用我们的产品与/或服务,即意味着您同意本隐私政策(含更新版本)内容,并且同意我们按照本隐私政策收集、使用、保存和共享您的相关信息。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			1、我们的隐私政策可能变更。未经您明确同意,我们不会削减您按照本隐私政策所应享有的权利。我们会通过包括但不限于弹窗、站内信、公告、邮件、短信的方式及时提示您更新的情况,若您继续使用我们的产品与/或服务,即意味着您同意本隐私政策(含更新版本)内容,并且同意我们按照本隐私政策收集、使用、保存和共享您的相关信息。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			2、对于重大变更,我们还会提供更为显著的通知(我们会通过包括但不限于邮件、短信、推送通知或在浏览页面做特别提示的方式,说明隐私政策的具体变更内容)。</view>
+		<view style="text-align: left;text-indent: 2rem;">本政策所指的重大变更包括但不限于:</view>
+		<view style="text-align: left;text-indent: 2rem;">1)我们的服务模式发生重大变化。包括不限于处理个人信息的目的、处理的个人信息类型、个人信息的使用方式的;</view>
+		<view style="text-align: left;text-indent: 2rem;">2)我们在所有权结构、组织架构及其他方面发生重大变化。包括不限于业务调整、破产并购引起的所有者变更的;</view>
+		<view style="text-align: left;text-indent: 2rem;">3)个人信息共享、转让或公开披露的主要对象发生变化;</view>
+		<view style="text-align: left;text-indent: 2rem;">4)您参与个人信息处理方面的权利及其行使方式发生重大变化;</view>
+		<view style="text-align: left;text-indent: 2rem;">5) 我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时:</view>
+		<view style="text-align: left;text-indent: 2rem;">6)个人信息安全影响评估报告表明存在高风险时。</view>
+		<view style="text-align: left;text-indent: 2rem;">我们还会将本政策的旧版本存档,供您查阅。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			如果您对本隐私政策有任何疑问或任何相关的投诉、意见,请发送电子邮件至690068578@qq.com,我们的个人信息保护专职部门(或个人信息保护专员)会在十五天内回复您。</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			如果您对我们的回复不满意,特别是我们的个人信息处理行为损害了您的合法权益,您还可以向网信办、消费者保护协会等监管部门进行投诉或举报,投诉方式如下:</view>
+		<view style="text-align: left;text-indent: 2rem;">国家网信办举报中心: 12377</view>
+		<view style="text-align: left;text-indent: 2rem;">消费者投诉举报电话: 12315</view>
+
+		<view style="font-size: 16px; text-align: left;text-indent: 2rem; font-weight: bold;">九、如何联系我们</view>
+
+		<view style="font-size: 16px; text-align: left;text-indent: 2rem; font-weight: bold;">十、本政策中关键词说明</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			关联方:指控制掌柜科技、被掌柜科技控制或者掌柜科技能够<text
+				style="font-weight: bold;">施加重大影响的</text>、或与掌柜科技同受其他实体控制的任何其他实体。"控制"指直接或者间接持有某实体超过50%的股权或者最大投票权,或有权委派该实体超过半数的董事会或其他类似决策机构的成员。<text
+				style="font-weight: bold;">“重大影响”指对某实体的财务和经营政策有参与决策的权力,但并不能够控制或者与其他方一起共同控制这些政策的制定。</text></view>
+		<view style="text-align: left;text-indent: 2rem;">个人信息:指以电子或者其他方式记录的能够单独或者与其他信息结台识别特定自然人身份或者反映特定自然人活动情况的各种信息。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			<text style="font-weight: bold;">个人敏感信息</text>:指一旦泄露、非法提供或滥用可能危害人身和财产安全,极易导致个人名誉、身心健康受到损害或歧视性待遇的个人信息。包括<text
+				style="font-weight: bold;">身份证件信息、网络身份标识信息、通信记录、个人生物识别信息、财产信息、行踪轨迹、健康生理信息、14岁以下(含)儿童的个人信息等。</text>
+		</view>
+		<view style="font-weight: bold;text-align: left;text-indent: 2rem"> 本协议自签订之日起生效。
+			本协议签订之日,即用户注册时,点击‘同意’的当天,视为合同已签订生效。
+		</view>
+		<view style="text-align: right;margin-right: 8px;font-weight: bold;margin-top: 16px"> 山西省掌柜鼎科技有限公司
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {}
+		},
+		methods: {}
+	}
+</script>
+
+<style>
+	page {
+		background: #FFFFFF;
+	}
+</style>

+ 413 - 0
pages/login/register.vue

@@ -0,0 +1,413 @@
+  <template>
+	<view class="zai-box">
+        <!-- <scroll-view scroll-y class="page"> -->
+            <!-- <view class="text-center" :style="[{animation: 'show ' + 0.4+ 's 1'}]"> -->
+			<!-- <image src="../../static/login/bejing.png" mode='aspectFit' class="zai-header "></image> -->
+			<view class="zai-header"></view>
+			<!-- <view class="text-center" >
+				<image src="https://static.jeecg.com/upload/test/login4_1595818039175.png" mode='aspectFit' class="zai-logo "></image>
+				<view class="zai-title text-shadow ">本地生活 </view>
+			</view> -->
+            <view class="box padding-lr-xl login-paddingtop" >
+				<block v-if="loginWay==1">
+					<view class="box-user flex align-center " style="border-bottom: 1px solid #EFEFEF;" :class="[shape=='round'?'round':'']">
+						<image src="../../static/login/Frame (27).png" mode='aspectFit' class="zai-logo "></image>
+						<input placeholder="请输入手机号" name="input" v-model="phoneNo"></input>
+					</view>
+					<view class="box-user flex align-center" style="border-bottom: 1px solid #EFEFEF;" :class="[shape=='round'?'round':'']">
+						<image src="../../static/login/Frame (28).png" mode='aspectFit' class="zai-logo "></image>
+                		<input class="uni-input" placeholder="请输入验证码" v-model="smsCode"/>
+                		<view class="action">
+                			<text class="text-color" :disabled="!isSendSMSEnable" @click="onSMSSend"> {{ getSendBtnText }}</text>
+                		</view>
+                	</view>
+					<view class="box-user flex align-center" style="border-bottom: 1px solid #EFEFEF;" :class="[shape=='round'?'round':'']">
+						<image src="../../static/login/Frame (26).png" mode='aspectFit' class="zai-logo "></image>
+						<input placeholder="请输入新密码"  :password="!showPassword" v-model="password" ></input>
+						<view class="action text-lg">
+						    <text :class="[showPassword ? 'cuIcon-attention' : 'cuIcon-attentionforbid']" @click="changePassword"></text>
+						</view>
+					</view>
+					<view class="box-user flex align-center"  :class="[shape=='round'?'round':'']">
+						<image src="../../static/login/Frame (26).png" mode='aspectFit' class="zai-logo "></image>
+						<input placeholder="请再次输入新密码"  :password="!showPassword1" v-model="password1" ></input>
+						<view class="action text-lg">
+						    <text :class="[showPassword1 ? 'cuIcon-attention' : 'cuIcon-attentionforbid']" @click="changePassword1"></text>
+						</view>
+					</view>
+					<view style="margin-top:30%">
+						<button  class="cu-btn round lg  bg-blue " style="display: flex;" :loading="loading" :class="[shape=='round'?'round':'']"
+							@tap="onSMSLogin"><text space="emsp">{{loading ? "注册中...":" 注册 "}}</text>
+						</button>
+					</view>
+					<view class="flex align-center" style="margin-top:10px;color: #858585;font-size:11px">
+						<uni-data-checkbox	multiple  :localdata="sex" v-model="checked"  active-color="#FF852D "></uni-data-checkbox>
+						请您阅读并同意<view> <text @tap="nav('xieyi')" class="text-color"> 用户协议</text> 和 <text
+								class="text-color" @tap="nav('mimi')">隐私政策</text></view>
+					</view>
+				</block>
+                <block v-else>
+                	<view class="cu-form-group margin-top  shadow-warp" :class="[shape=='round'?'round':'']">
+                		<view class="title"><text class="cuIcon-mobile margin-right-xs"></text>手机号:</view>
+                		<input placeholder="请输入手机号" type="number" maxlength="11" v-model="phoneNo"></input>
+                	</view>
+                	<view class="cu-form-group margin-top shadow-warp" :class="[shape=='round'?'round':'']">
+                		<view class="title"><text class="cuIcon-lock margin-right-xs"></text>验证码:</view>
+                		<input class="uni-input" placeholder="请输入验证码" v-model="smsCode"/>
+                		<view >
+                			<text class="text-color" :disabled="!isSendSMSEnable" @click="onSMSSend"> {{ getSendBtnText }}</text>
+                		</view>
+                	</view>
+                	<view class="padding text-center margin-top">
+                		<button class="cu-btn bg-blue lg margin-right shadow" :loading="loading" :class="[shape=='round'?'round':'']"
+                			@tap="onSMSLogin"><text space="emsp">{{loading ? "注册中...":" 注册 "}}</text>
+                		</button>
+                		<button class="cu-btn line-blue lg margin-left shadow" :loading="loading" :class="[shape=='round'?'round':'']"
+                			@tap="loginWay=1">账户登录
+                		</button>
+                	</view>
+                </block>
+			
+	
+				
+				<!-- #ifdef APP-PLUS -->
+				<view class="padding flex flex-direction  text-center">
+					当前版本:{{version}}
+				</view>
+				<!-- #endif -->
+				
+            </view>
+        <!-- </scroll-view> -->
+	
+		<!-- 登录加载弹窗 -->
+		<view class="cu-load load-modal" v-if="loading">
+			<!-- <view class="cuIcon-emojifill text-orange"></view> -->
+			<image src="https://static.jeecg.com/upload/test/login4_1595818039175.png" mode="aspectFit" class="round"></image>
+			<view class="gray-text">登录中...</view>
+		</view>
+    </view>
+
+</template>
+
+<script>
+	import { ACCESS_TOKEN,USER_NAME,USER_INFO } from "@/common/util/constants"
+	import { mapActions } from "vuex"
+    import configService from '@/common/service/config.service.js';
+	
+    export default {
+        data() {
+            return {
+				sex: [{
+					text: '',
+					value: 1
+				}],
+				checked:[],
+				shape:'',//round 圆形
+				loading: false,
+				userName: '18956455265',
+				password1: '',
+				password: '',
+				phoneNo: '',
+				smsCode: '',
+				showPassword: false, //是否显示明文
+				showPassword1: false, //是否显示明文
+				loginWay: 1, //1: 账密,2:验证码
+				smsCountDown: 0,
+				smsCountInterval: null,
+				toggleDelay: false,
+				version:'',
+				//第三方登录相关信息
+				thirdType:"",
+				thirdLoginInfo:"",
+				thirdLoginState:false,
+				bindingPhoneModal:false,
+				thirdUserUuid:'',
+				url: {
+					bindingThirdPhone: '/sys/thirdLogin/bindingThirdPhone'
+				}
+            };
+        },
+		onLoad:function(){
+			// #ifdef APP-PLUS
+			var that=this
+			plus.runtime.getProperty( plus.runtime.appid, function ( wgtinfo ) {
+				that.version=wgtinfo.version
+			});
+			// #endif
+		},
+		computed: {
+		
+		      isSendSMSEnable() {
+		        return this.smsCountDown <= 0 && this.phoneNo.length > 4;
+		      },
+		      getSendBtnText() {
+		        if (this.smsCountDown > 0) {
+		          return this.smsCountDown + '秒后发送';
+		        } else {
+		          return '发送验证码';
+		        }
+		      },
+		      canSMSLogin() {
+		        return this.userName.length > 4 && this.smsCode.length > 4;
+		      },
+		      canPwdLogin() {
+		        return this.userName.length > 4 && this.password.length > 4;
+		      },
+		},
+        methods: {
+			 ...mapActions([ "mLogin","PhoneLogin","ThirdLogin" ]),
+			 nav(url) {
+				this.$Router.push({name:url})
+				// uni.navigateTo({
+				// 	url: url
+				// });
+			},
+			//  登录
+			onLogin: function (){
+				
+					if(!this.checked || this.checked.length==0){
+			          this.$tip.toast('请阅读后勾选并同意《平台协议》及《隐私协议》政策');
+			          return;
+			        }
+			        if(!this.userName || this.userName.length==0){
+			          this.$tip.toast('请填写手机号');
+			          return;
+			        }
+			        if(!this.password || this.password.length==0){
+			           this.$tip.toast('请填写密码');
+			          return;
+			        }
+			        let loginParams = {
+						phone:this.userName,
+						passWord:this.password
+			        }
+					this.loading=true;
+				
+			        this.mLogin(loginParams).then((res) => {
+					  this.loading=false;
+			          if(res.data.success){
+						 // #ifdef APP-PLUS
+						  this.saveClientId()
+						 // #endif
+						 // #ifndef APP-PLUS
+						  this.$tip.success('登录成功!')
+						  this.$Router.replaceAll({name:'index'})
+						 // #endif
+						}else{
+			              this.$tip.alert(res.data.message);
+			            }
+			        }).catch((err) => { 
+			          let msg = err.data.message || "请求出现错误,请稍后再试"
+			          this.loading=false;
+					  this.$tip.alert(msg);
+			        }).finally(()=>{
+					  this.loading=false;
+					})
+			},
+			saveClientId(){
+				var info = plus.push.getClientInfo();
+				var cid = info.clientid;
+				this.$http.get("/sys/user/saveClientId",{params:{clientId:cid}}).then(res=>{
+					console.log("res::saveClientId>",res)
+					this.$tip.success('登录成功!')
+					this.$Router.replaceAll({name:'index'})
+				})
+			},
+			changePassword() {
+				this.showPassword = !this.showPassword;
+			},
+			changePassword1() {
+				this.showPassword1 = !this.showPassword1;
+			},
+			onSMSSend() {
+				// let smsParams = {};
+				// smsParams.phone=this.phoneNo;
+				// smsParams.smsmode="0";
+				let checkPhone = new RegExp(/^[1]([3-9])[0-9]{9}$/);
+                if(!this.phoneNo || this.phoneNo.length==0){
+					this.$tip.toast('请输入手机号');
+					return false
+				}
+				if(!checkPhone.test(this.phoneNo)){
+					this.$tip.toast('请输入正确的手机号');
+					return false
+				}
+				this.$http.get("/merchant/app/sendMsg",{params:{phone:this.phoneNo}}).then(res=>{
+				  if(res.data.success){
+					this.smsCountDown = 60;
+					this.startSMSTimer();
+				  }else{
+					this.smsCountDown = 0;
+					this.$tip.toast(res.data.message);
+				  }
+				});
+			  },
+			startSMSTimer() {
+				this.smsCountInterval = setInterval(() => {
+				  this.smsCountDown--;
+				  if (this.smsCountDown <= 0) {
+					clearInterval(this.smsCountInterval);
+				  }
+				}, 1000);
+			},
+			onSMSLogin() {
+				let checkPhone = new RegExp(/^[1]([3-9])[0-9]{9}$/);
+			
+				if(!this.phoneNo || this.phoneNo.length==0){
+				  this.$tip.toast('请填写手机号');
+				  return;
+				}
+				if(!checkPhone.test(this.phoneNo)){
+					this.$tip.toast('请输入正确的手机号');
+					return false
+				}
+				if(!this.smsCode || this.smsCode.length==0){
+				  this.$tip.toast('请填短信验证码');
+				  return;
+				}
+				if(this.password !== this.password1){
+				  this.$tip.toast('请确定密码是否一致');
+				  return;
+				}
+				if(!this.checked || this.checked.length==0){
+					this.$tip.toast('请阅读后勾选并同意《平台协议》及《隐私协议》政策');
+					return;
+				}
+				
+				this.$http.get("/merchant/app/checkCode",{params:{phone:this.phoneNo, code:this.smsCode}}).then(res=>{
+				  if(res.data.success){
+					// this.nav('settled')
+					uni.setStorageSync('phone', this.phoneNo)
+					uni.setStorageSync('password', this.password)
+					uni.navigateTo({
+						url: '/pages/login/settled'
+					});
+					// this.$tip.success('登录成功!')
+					// this.$Router.replaceAll({name:'index'})
+				  }else{
+					this.$tip.error(res.data.message);
+				  }
+				}).catch((err) => {
+				  let msg = ((err.response || {}).data || {}).message || err.data.message || "请求出现错误,请稍后再试"
+				  this.$tip.error(msg);
+				});
+				// this.PhoneLogin(loginParams).then((res) => {
+				//   console.log("res====》",res)
+				//   if(res.data.success){
+				// 	// this.$tip.success('登录成功!')
+				// 	// this.$Router.replaceAll({name:'index'})
+				//   }else{
+				// 	this.$tip.error(res.data.message);
+				//   }
+				// }).catch((err) => {
+				//   let msg = ((err.response || {}).data || {}).message || err.data.message || "请求出现错误,请稍后再试"
+				//   this.$tip.error(msg);
+				// });
+			},
+			loginSuccess() {
+			  // 登陆成功,重定向到主页
+			  this.$Router.replace({name:'index'})
+			},
+			requestFailed(err) {
+			  this.$message.warning("登录失败")
+			},
+        },
+		beforeDestroy() {
+		    if (this.smsCountInterval) {
+		        clearInterval(this.smsCountInterval);
+		    }
+		},
+    }
+</script>
+
+<style scoped lang="scss">
+page{
+	background: #FFFFFF;
+		height: 100%;
+}
+	.uni-data-checklist{
+		flex:none;
+		/deep/.checklist-group .checklist-box{
+			margin-right: 0 !important;
+		}
+	}
+	.footer{
+		position: fixed;
+		bottom: 20px;
+		font-size: 14px;
+		color: #999999;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+	.text-color {
+		color: #449AFF ;
+		margin: 0 5px;
+	}
+    .login-paddingtop {
+        // padding-top: 100upx;
+		padding: 50px 17px 28px 17px;
+    }
+
+    .zai-box {
+		background: #FFFFFF;
+		height: 100%;
+		.zai-header{
+			width: 100%;
+			height: 225px;
+			background-image: url(../../static/login/bejing.png);
+			background-size: cover;
+		}
+        // padding: 0 20upx;
+        // padding-top: 100upx;
+        // position: relative;
+    }
+
+    .zai-logo {
+        width: 20px;
+        height: 20px;
+    }
+.box-user{
+	min-height: 45px;
+	image{
+		margin-right: 10px;
+	}
+	input{
+	font-size: 14px;
+		flex: 1;
+	}
+}
+    .zai-title {
+       font-size: 58upx;
+       color: #000000;
+       text-align: center;
+    }
+
+    .input-placeholder, .zai-input {
+        color: #94afce;
+    }
+
+    .zai-label {
+        padding: 60upx 0;
+        text-align: center;
+        font-size: 30upx;
+        color: #a7b6d0;
+    }
+
+    .zai-btn {
+        background: #ff65a3;
+        color: #fff;
+        border: 0;
+        border-radius: 100upx;
+        font-size: 36upx;
+    }
+
+    .zai-btn:after {
+        border: 0;
+    }
+
+    /*按钮点击效果*/
+    .zai-btn.button-hover {
+        transform: translate(1upx, 1upx);
+    }
+
+</style>

+ 276 - 0
pages/login/resetpassword.vue

@@ -0,0 +1,276 @@
+<template>
+
+    <view>
+        <!-- 基础表单校验 -->
+        <cu-custom :isBack="true">
+            <block slot="content">忘记密码</block>
+        </cu-custom>
+        <view class="box  ">
+            <view class="box-user flex align-center " style="border-bottom: 1px solid #EFEFEF;"
+                :class="[shape == 'round' ? 'round' : '']">
+                <image src="../../static/login/Frame (27).png" mode='aspectFit' class="zai-logo "></image>
+                <input placeholder="请输入手机号" name="input" v-model="phoneNo"></input>
+            </view>
+            <view class="box-user flex align-center" style="border-bottom: 1px solid #EFEFEF;"
+                :class="[shape == 'round' ? 'round' : '']">
+                <image src="../../static/login/Frame (28).png" mode='aspectFit' class="zai-logo "></image>
+                <input class="uni-input" placeholder="请输入验证码" v-model="smsCode" />
+                <view class="action">
+                    <text class="text-color" :disabled="!isSendSMSEnable" @click="onSMSSend"> {{ getSendBtnText
+                        }}</text>
+                </view>
+            </view>
+            <view class="box-user flex align-center" style="border-bottom: 1px solid #EFEFEF;"
+                :class="[shape == 'round' ? 'round' : '']">
+                <image src="../../static/login/Frame (26).png" mode='aspectFit' class="zai-logo "></image>
+                <input placeholder="请输入新密码" :password="!showPassword" v-model="password"></input>
+                <view class="action text-lg">
+                    <text :class="[showPassword ? 'cuIcon-attention' : 'cuIcon-attentionforbid']"
+                        @click="changePassword"></text>
+                </view>
+            </view>
+            <view class="box-user flex align-center" :class="[shape == 'round' ? 'round' : '']">
+                <image src="../../static/login/Frame (26).png" mode='aspectFit' class="zai-logo "></image>
+                <input placeholder="请再次输入新密码" :password="!showPassword1" v-model="password1"></input>
+                <view class="action text-lg">
+                    <text :class="[showPassword1 ? 'cuIcon-attention' : 'cuIcon-attentionforbid']"
+                        @click="changePassword1"></text>
+                </view>
+            </view>
+            <view class="footer">
+                <button type="primary" class="p-button round" @click="onSMSLogin()">确认修改并登录</button>
+
+                <!-- <button  class="cu-btn round lg  bg-blue " style="display: flex;" :loading="loading" :class="[shape=='round'?'round':'']"
+							@tap="onSMSLogin"><text space="emsp">{{loading ? "注册中...":" 注册 "}}</text>
+						</button> -->
+            </view>
+
+        </view>
+        <!-- <view  class="example">
+        <uni-forms ref="valiForm" :rules="rules" :modelValue="valiFormData" label-width="100px">
+            <uni-forms-item label="手机号" required name="phoneNo">
+                <view class="cu-form-group   shadow-warp" >
+                    <input class="u-input" placeholder="请输入手机号" v-model="valiFormData.phoneNo"/>
+                </view>
+            </uni-forms-item>
+            <uni-forms-item label="验证码" required name="smsCode">
+            <view class="cu-form-group   shadow-warp" >
+                <input class="u-input" placeholder="请输入验证码" v-model="valiFormData.smsCode"/>
+                <text style="color: #0081ff;" :disabled="!isSendSMSEnable" @click="onSMSSend">{{ getSendBtnText }}</text>
+            </view>
+            </uni-forms-item>
+            <uni-forms-item label="新密码" required name="age">
+                <view class="cu-form-group   shadow-warp" >
+                    <input class="u-input" placeholder="请输入新密码" v-model="valiFormData.phoneNo"/>
+                </view>
+            </uni-forms-item>
+            <uni-forms-item label="确认密码" required name="age">
+                <view class="cu-form-group   shadow-warp" >
+                    <input class="u-input" placeholder="请输入新密码" v-model="valiFormData.phoneNo"/>
+                </view>
+            </uni-forms-item>
+        </uni-forms>
+        <button type="primary"  class="p-button"  @click="submit('valiForm')">确认修改并登录</button>
+    </view> -->
+    </view>
+
+</template>
+<script>
+export default {
+    computed: {
+
+        isSendSMSEnable() {
+            return this.smsCountDown <= 0 && this.valiFormData.phoneNo.length > 4;
+        },
+        getSendBtnText() {
+            if (this.smsCountDown > 0) {
+                return this.smsCountDown + '秒后发送';
+            } else {
+                return '发送验证码';
+            }
+        },
+
+    },
+    data() {
+        return {
+            showPassword: false, //是否显示明文
+            showPassword1: false, //是否显示明文
+            shape: '',//round 圆形
+            smsCountDown: 0,
+            // 校验表单数据
+            valiFormData: {
+                phoneNo: '',
+                smsCode: '',
+                introduction: '',
+            },
+            // 校验规则
+            rules: {
+                phoneNo: {
+                    rules: [{
+                        required: true,
+                        errorMessage: '姓名不能为空'
+                    }]
+                },
+                smsCode: {
+                    rules: [{
+                        required: true,
+                        errorMessage: '年龄不能为空'
+                    }, {
+                        format: 'number',
+                        errorMessage: '年龄只能输入数字'
+                    }]
+                }
+            },
+            password1: '',
+            password: '',
+            phoneNo: '',
+            smsCode: '',
+        }
+    },
+    methods: {
+        changePassword() {
+            this.showPassword = !this.showPassword;
+        },
+        changePassword1() {
+            this.showPassword1 = !this.showPassword1;
+        },
+        onSMSSend() {
+            // let smsParams = {};
+            // smsParams.phone=this.phoneNo;
+            // smsParams.smsmode="0";
+            let checkPhone = new RegExp(/^[1]([3-9])[0-9]{9}$/);
+            if (!this.phoneNo || this.phoneNo.length == 0) {
+                this.$tip.toast('请输入手机号');
+                return false
+            }
+            if (!checkPhone.test(this.phoneNo)) {
+                this.$tip.toast('请输入正确的手机号');
+                return false
+            }
+            this.$http.get("/merchant/app/sendMsg", { params: { phone: this.phoneNo } }).then(res => {
+                if (res.data.success) {
+                    this.smsCountDown = 60;
+                    this.startSMSTimer();
+                } else {
+                    this.smsCountDown = 0;
+                    this.$tip.toast(res.data.message);
+                }
+            });
+        },
+        startSMSTimer() {
+            this.smsCountInterval = setInterval(() => {
+                this.smsCountDown--;
+                if (this.smsCountDown <= 0) {
+                    clearInterval(this.smsCountInterval);
+                }
+            }, 1000);
+        },
+        onSMSLogin() {
+            let checkPhone = new RegExp(/^[1]([3-9])[0-9]{9}$/);
+
+            if (!this.phoneNo || this.phoneNo.length == 0) {
+                this.$tip.toast('请填写手机号');
+                return;
+            }
+            if (!checkPhone.test(this.phoneNo)) {
+                this.$tip.toast('请输入正确的手机号');
+                return false
+            }
+            if (!this.smsCode || this.smsCode.length == 0) {
+                this.$tip.toast('请填短信验证码');
+                return;
+            }
+            if (this.password !== this.password1) {
+                this.$tip.toast('请确定密码是否一致');
+                return;
+            }
+            let loginParams = {
+                phone: this.phoneNo,
+                passWord: this.password,
+                code: this.smsCode
+            };
+            this.$http.post("/merchant/app/updatePassWord", loginParams).then(res => {
+                if (res.data.success) {
+                    this.$Router.push({name:"login"})
+                } else {
+                    this.$tip.error(res.data.message);
+                }
+            }).catch((err) => {
+                let msg = ((err.response || {}).data || {}).message || err.data.message || "请求出现错误,请稍后再试"
+                this.$tip.error(msg);
+            });
+        },
+        submit(ref) {
+            this.$refs[ref].validate().then(res => {
+                console.log('success', res);
+                uni.showToast({
+                    title: `校验通过`
+                })
+            }).catch(err => {
+                console.log('err', err);
+            })
+        },
+    }
+
+}
+</script>
+<style scoped lang="scss">
+page {
+    background: #FFFFFF;
+    height: 100%;
+}
+
+.text-color {
+    color: #449AFF;
+    margin: 0 5px;
+}
+
+.zai-logo {
+    width: 20px;
+    height: 20px;
+}
+.box{
+    padding: 30px 17px;
+}
+.box-user {
+    min-height: 45px;
+
+    image {
+        margin-right: 10px;
+    }
+
+    input {
+        font-size: 14px;
+        flex: 1;
+    }
+}
+
+.example {
+    padding: 20px;
+}
+
+.shadow-warp {
+    min-height: 38px;
+    font-size: 12px;
+}
+
+.u-input {
+    font-size: 12px;
+    color: #999;
+}
+
+.p-button {
+    background: #449AFF;
+    font-size: 14px;
+}
+.footer{
+		position: fixed;
+		bottom: 30px;
+        width: 92%;
+  text-align: center; /* 按钮居中 */
+		// font-size: 14px;
+		// color: #999999;
+		// left: 50%;
+		// transform: translateX(-50%);
+	}
+</style>

+ 407 - 0
pages/login/settled.vue

@@ -0,0 +1,407 @@
+<template>
+    <view>
+        <cu-custom :isBack="true">
+            <block slot="content">申请入驻</block>
+        </cu-custom>
+        <view v-if="tab == 1">
+            <form>
+                <view class="cu-form-group ">
+                    <!-- <mySelect label="选择所属供应商" ></mySelect> -->
+                    <view class="title">选择所属供应商</view>
+                    <picker @change="PickerChange" :value="form.purveyorId" range-key="purveyorName"
+                        :range="supplierOption">
+                        <view class="picker">
+                            {{ form.purveyorId ? supplierOption.find(e => e.id == form.purveyorId).purveyorName : '请选择'
+                            }}
+                        </view>
+                    </picker>
+                </view>
+                <view class="flex cu-form-group margin-top">
+                    <view class="content ">
+                        <text class="text-bold">账户信息</text>
+                    </view>
+                    <view class="action">
+                        <text class="text-bold">1/3</text>
+                    </view>
+                </view>
+                <view class="cu-form-group">
+                    <view class="title">姓名</view>
+                    <input placeholder="请输入联系人姓名" v-model="form.name" name="input"></input>
+                </view>
+            </form>
+            <view class="padding flex flex-direction">
+                <button class="cu-btn bg-blue " @click="tab = 2">保存并下一步</button>
+            </view>
+        </view>
+        <view v-if="tab == 2">
+            <form>
+                <view class="flex cu-form-group margin-top">
+                    <view class="content ">
+                        <text class="text-bold">提交经营主体资料</text>
+                    </view>
+                    <view class="action">
+                        <text class="text-bold">2/3</text>
+                    </view>
+                </view>
+                <view class="cu-form-group">
+                    <view class="title">主体类型</view>
+                    <radio-group @change="typeChang($event, 'type')" v-model="form.type">
+                        <label class="margin-left-sm">
+                            <radio class="blue radio" value="1" checked></radio>
+                            <text class="margin-left-sm">普通企业</text>
+                        </label>
+                        <label class="margin-left-sm">
+                            <radio class="blue radio" value="2"></radio>
+                            <text class="margin-left-sm">个体工商户</text>
+                        </label>
+                    </radio-group>
+                </view>
+                <view class="cu-form-group">
+                    <view class="title">公司名称</view>
+                    <input placeholder="请输入公司名称" v-model="form.corporateName" name="input"></input>
+                </view>
+                <view class="cu-form-group">
+                    <view class="title">统一社会信用代码</view>
+                    <input placeholder="请输入统一社会信用代码" v-model="form.creditCode" name="input"></input>
+                </view>
+                <view class="cu-form-group">
+                    <view class="title">有效期</view>
+                    <radio-group @change="typeChang($event, 'lifespan')" v-model="form.lifespan">
+                        <label class="margin-left-sm">
+                            <radio class="blue radio" value="1" checked></radio>
+                            <text class="margin-left-sm">长期有效</text>
+                        </label>
+                        <label class="margin-left-sm">
+                            <radio class="blue radio" value="2"></radio>
+                            <text class="margin-left-sm">固定期限</text>
+                        </label>
+                    </radio-group>
+                </view>
+                <view class="cu-form-group" v-if="form.lifespan == 2">
+                    <view class="title">日期开始时间</view>
+                    <picker mode="date" :value="form.lifespanBegin" @change="typeChang($event, 'lifespanBegin')">
+                        <view class="picker">
+                            {{ form.lifespanBegin ? form.lifespanBegin : '请选择' }}
+                        </view>
+                    </picker>
+                </view>
+                <view class="cu-form-group" v-if="form.lifespan == 2">
+                    <view class="title">日期结束时间</view>
+                    <picker mode="date" :value="form.lifespanEnd" @change="typeChang($event, 'lifespanEnd')">
+                        <view class="picker">
+                            {{ form.lifespanEnd ? form.lifespanEnd : '请选择' }}
+
+                        </view>
+                    </picker>
+                </view>
+                <view class="customize">
+                    <view class="title">营业执照</view>
+                    <view class="business-img flex align-center">
+                        <image :src="businessLicenseImg ? businessLicenseImg : '/static/login/yingyezhizhao.png'" mode=""
+                            @click="businessChange('businessLicense')">
+                        </image>
+                    </view>
+                </view>
+                <view class="cu-form-group  margin-top">
+                    <view class="title">法人姓名</view>
+                    <input placeholder="请输入法人姓名" v-model="form.legalPerson" name="input"></input>
+                </view>
+                <view class="cu-form-group">
+                    <view class="title">法人证件号</view>
+                    <input placeholder="请输入法人证件号" v-model="form.legalPersonCode" name="input"></input>
+                </view>
+                <view class="customize">
+                    <view class="title">法人证件照片</view>
+                    <view class="flex upload justify-between">
+                        <view class="imgOcr-border">
+                            <image :src="identityOneImg ? identityOneImg : '/static/login/code1.png'" mode=""
+                                @click="businessChange('identityOne')"></image>
+                        </view>
+                        <view class="imgOcr-border">
+                            <image :src="identityTwoImg ? identityTwoImg : '/static/login/code2.png'" mode=""
+                                @click="businessChange('identityTwo')"></image>
+                        </view>
+                    </view>
+
+                </view>
+            </form>
+            <view class="padding flex justify-around ">
+                <button class="cu-btn bg-blue " @click="tab = 1">上一步</button>
+                <button class="cu-btn bg-blue " @click="tab = 3">保存并下一步</button>
+            </view>
+        </view>
+        <view v-if="tab == 3">
+            <form>
+                <view class="flex cu-form-group margin-top">
+                    <view class="content ">
+                        <text class="text-bold">提交门店信息</text>
+                    </view>
+                    <view class="action">
+                        <text class="text-bold">3/3</text>
+                    </view>
+                </view>
+                <view class="cu-form-group">
+                    <view class="title">门店名称</view>
+                    <input placeholder="实际经营门店信息" v-model="form.storeName" name="input"></input>
+                </view>
+                <view class="cu-form-group" @click="$refs.picker.show()">
+                    <view class="title">所在地区</view>
+                    <input placeholder="请输入所在地区" name="input" v-model="country" disabled="true"></input>
+                    <w-picker :visible.sync="visible" ref="picker" mode="region" :value="country"
+                        @confirm="onConfirm($event, 'region')"></w-picker>
+                </view>
+                <view class="cu-form-group">
+                    <view class="title">门店地址</view>
+                    <input placeholder="请输入门店地址详细地址" v-model="form.address" name="input"></input>
+                </view>
+                <view class="customize">
+                    <view class="title">门头照片</view>
+                    <view class="grid col-4 grid-square flex-sub img-border">
+                        <view class="bg-img" v-for="(item, index) in imgList" :key="index" @tap="ViewImage"
+                            :data-url="imgList[index]">
+                            <image :src="imgList[index]" mode="aspectFill"></image>
+                            <view class="cu-tag bg-red" @tap.stop="DelImg" :data-index="index">
+                                <text class='cuIcon-close'></text>
+                            </view>
+                        </view>
+                        <view class="solids" @tap="ChooseImage" v-if="imgList.length < 4">
+                            <text class='cuIcon-cameraadd'></text>
+                        </view>
+                    </view>
+                </view>
+            </form>
+            <view class="padding flex justify-around ">
+                <button class="cu-btn bg-blue " @click="tab = 2">上一步</button>
+                <button class="cu-btn bg-blue " @click="sumbit">提交申请</button>
+            </view>
+        </view>
+    </view>
+</template>
+<script>
+import configService from '../../common/service/config.service'
+import { ACCESS_TOKEN } from '@/common/util/constants.js'
+import regionPicker from "../../components/w-picker/region-picker.vue"
+
+export default {
+    components: {
+        regionPicker,
+    },
+    data() {
+        return {
+            form: {
+                purveyorId: 0,
+                type: 1,
+                lifespan: 1,
+                lifespanBegin: null,
+                lifespanEnd: null,
+                headPhoto: null,
+                passWord:uni.getStorageSync('password'),
+                phone:uni.getStorageSync('phone'),
+            },
+            tab: 1,
+            supplierOption: [],
+            businessLicenseImg: '',
+            identityOneImg: '',
+            identityTwoImg: '',
+            visible: false,
+            imgList: [],
+            imgList1: [],
+            index: -1,
+            country: '',
+        }
+    },
+   
+    async onLoad() {
+        let res = await this.$http.get("/merchant/app/allList")
+        if (res.data.success) {
+            this.supplierOption = res.data.result
+        } else {
+            this.$tip.toast(res.data.message);
+        }
+
+    },
+    methods: {
+        ChooseImage() {
+            uni.chooseImage({
+                // count: 4, //默认9
+                sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+                sourceType: ['album'], //从相册选择
+                success: (res) => {
+                    if (res) {
+                        // this[type + 'Img'] = chooseImageRes.tempFilePaths[0];
+                        uni.uploadFile({
+                            url: configService.apiUrl + '/sys/common/upload',
+                            filePath: res.tempFilePaths[0],
+                            name: "file",
+                            success: (files) => {
+                                let data = JSON.parse(files.data);
+                                if (data.success) {
+                                    if (this.imgList.length != 0) {
+                                        this.imgList = this.imgList.concat(res.tempFilePaths)
+                                        this.form.headPhoto.push(data.message)
+                                    } else {
+                                        this.imgList = res.tempFilePaths
+                                        this.form.headPhoto=[data.message]
+                                    }
+
+                                    // this.form.headPhoto =this.form.headPhoto+'/'+ data.message
+                                }
+                            }
+                        })
+                    }
+                    
+                }
+            });
+        },
+        ViewImage(e) {
+            uni.previewImage({
+                urls: this.imgList,
+                current: e.currentTarget.dataset.url
+            });
+        },
+        DelImg(e) {
+            uni.showModal({
+                title: '提示',
+                content: '确定要删除?',
+                cancelText: '取消',
+                confirmText: '确定',
+                success: res => {
+                    if (res.confirm) {
+                        this.imgList.splice(e.currentTarget.dataset.index, 1)
+                        this.form.headPhoto.splice(e.currentTarget.dataset.index, 1)
+
+                    }
+                }
+            })
+        },
+        onConfirm(e) {
+            console.log("confirm", e)
+            this.country = e.result
+            this.form.country = e.value[e.value.length - 1]
+        },
+        PickerChange(e) {
+            this.form.purveyorId = this.supplierOption[e.detail.value].id
+        },
+        typeChang(e, val) {
+            this.form[val] = e.detail.value
+        },
+
+        async businessChange(type) {
+            let [chooseImageErr, chooseImageRes] = await uni.chooseImage({
+                count: 1,
+                sizeType: ['compressed']
+            });
+            let size = chooseImageRes.tempFiles[0].size / 1024 / 1024 < 5;
+            if (!size) {
+                this.$refs.uToast.show({
+                    title: '上传图片大小不能超过 5MB!',
+                    type: 'error',
+                })
+                return false
+            }
+
+            if (chooseImageRes) {
+                this[type + 'Img'] = chooseImageRes.tempFilePaths[0];
+                uni.uploadFile({
+                    url: configService.apiUrl + '/sys/common/upload',
+                    filePath: chooseImageRes.tempFilePaths[0],
+                    name: "file",
+                    success: (files) => {
+                        let data = JSON.parse(files.data);
+                        if (data.success) {
+                            this.form[type] = data.message
+                            // uni.uploadFile({
+                            //     url: this.$base.baseUrl + '/order/identify/drivingPermit',
+                            //     filePath: chooseImageRes.tempFilePaths[0],
+                            //     name: "image2",
+                            //     header: {
+                            //         Authorization: store.state.token,
+                            //     },
+                            //     success: (uploadFileRes) => {
+
+                            //         let data1 = JSON.parse(uploadFileRes.data).data;
+                            //         this.carback = {
+                            //             vehicleweight: data1.carInfo
+                            //                 .grossMass, //总质量
+                            //             completeKerbMass: data1.carInfo
+                            //                 .unladenMass, //整备质量
+                            //             seatCount: data1.carInfo
+                            //                 .approvedPassengersCapacity, //核定载客数
+                            //             limitLoad: data1.carInfo
+                            //                 .limitLoad, //核定载质量
+                            //         }
+                            //         this.lodingshow = false;
+                            //     }
+                            // });
+                        }
+                    }
+                });
+            } else {
+            }
+        },
+        sumbit() {
+            let headPhoto=this.form.headPhoto?this.form.headPhoto.join('/'):null
+            this.$http.post('/merchant/app/add',{...this.form,source:2,headPhoto}).then(res=>{
+                if(res.data.success){
+					this.$tip.success(res.data.result||'成功')
+                    this.$Router.push({name:"login"})
+                }
+                else{
+					this.$tip.error(res.data.message);
+				  }
+
+            })
+
+        }
+    }
+}
+</script>
+<style scoped lang="scss">
+.customize {
+    background-color: #fff;
+    border-top: 0.5px solid #eee;
+
+    .title {
+        font-size: 15px;
+        padding-right: 15px;
+        padding: 15px;
+        padding-bottom: 0;
+    }
+}
+.business-img{
+    height: 218upx;
+    width: 360upx;
+    padding: 14upx;
+    background: url('/static/login/yingye2.png');
+    image {
+            width: 100%;
+            height: 100%;
+        }
+}
+.img-border{
+    padding: 15px 20px;
+
+}
+.upload {
+    width: 100%;
+    height: 182upx;
+    // padding: 15px 20px;
+    background-color: white;
+
+    .imgOcr-border {
+        position: relative;
+        width: 48%;
+        height: 100%;
+        padding: 12upx;
+        // background-color: #fff;
+        background: url('/static/login/code3.png');
+        // box-shadow: 0px 4px 10px 0px #DAE3F4;
+
+        image {
+            width: 100%;
+            // border-radius: 4px;
+            height: 100%;
+        }
+    }
+}
+</style>

+ 222 - 0
pages/login/xieyi.vue

@@ -0,0 +1,222 @@
+<template>
+	<view style="font-size: 14px;line-height: 26px;padding: 32upx;background: #FFFFFF;" class="home1">
+		<view class="u-f-ajc" style="font-size: 16px;font-weight: bold">晋掌柜本地生活服务协议</view>
+		<view style="text-align: left;margin-top: 15upx;">更新日期: 2024年07月01日</view>
+		<view style="text-align: left;margin-bottom: 15upx;">生效日期: 2024年07月01日</view>
+		<view style="text-align: left;text-indent: 2rem;"> 掌柜科技移动设备客户端(合伙人APP) 网络运营平台(以下简称“合伙人)
+			由山西省掌柜鼎科技有公司(以下简称”我们”或“掌柜科技”。注册地址:山西转型综合改革示范区科技创新城化章北街1号山西数据流量生态园4号楼4层4408-176,))运营。掌柜科技是一款为车主提供电商、社交与资讯一体化综合服务的APP。<text
+				style="font-weight: bold;">本服务协议构成我们与掌柜科技用户(以下称“用户"或"您")之间就掌柜科技提供的全部服务(以下称“掌柜科技服务”)等事宜而订立的契约,请仔细阅读本服务协议,特别是以粗体标识的条款(这些条款可能会明确您应履行的义务或对您的权利有所限制)。如您不同意以下任何内容,请立刻停止访问掌柜科技或使用掌柜科技服务。</text>
+		</view>
+		<view style="font-size: 16px;font-weight: bold">1、总则</view>
+		<view style="text-align: left;text-indent: 2rem;">1.1
+			本协议内容包括协议正文及其他我们已经发布的或将来可能发布的各类规则,包括但不限于隐私政策、规则、页面信息、操作流程、公告、通知等其他协议及条款(“其他条款")。如果本协议与"其他条款”有不一致之处,则以“其他条款"为准。除另行明确声明外,任何掌柜科技服务均受本协议约束。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">1.2
+			您应该定期登陆本页面及其他相关页面,了解最新的协议内容。变更后的协议在本页面及相关页面公布后七天,将自动生效。如您不同意相关变更,应当立即停止使用掌柜科技服务。若您在本协议变更七日后继续使用掌柜科技服务的,即表示您接受变更后的协议。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">1.3
+			您访问本站,下载并注册成为掌柜科技用户,即表示您确认您自身具备与使用掌柜科技服务相适应的行为能力,同意接受本服务协议及与本服务协议的约束。
+		</view>
+
+		<view style="font-size: 16px;font-weight: bold">2、掌柜科技账户注册规则</view>
+		<view style="text-align: left;text-indent: 2rem;">2.1按照注册页面提示,完整、准确填写相关信息,阅读并同意本协议且完成注册程序后,您可成为掌柜科技用户。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			2.2您授权并同意我们依据相关法律法规的规定对您进行基于移动电话号码、微信账户等真实身份信息的认证。<text
+				style="font-weight: bold;">对于拒绝进行真实身份信息认证或以虚假信息骗取账户注册的用户,我们保留拒绝此用户使用掌柜科技服务的权利并有权对用户进行包括但不限于限制服务使用、关闭账号等的处理。</text>
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			2.3您应妥善保管您的账户(用户名)和密码,通过您的账户(用户名)和密码操作或实施的行为,将视为您本人的行为,由您本人承担相应的责任和后果。<text
+				style="font-weight: bold;">如果您发现他人不当使用您的账户或有任何其他可能危及您的账户安全的情形时,您应当立即以书面、有效方式通知我们,要求我们暂停相关服务。在此,您理解我们对您的请求采取行动需要合理时间,我们对在采取行动前已经产生的后果(包括但不限于您的任何损失)不承担任何责任。</text>
+		</view>
+
+
+		<view style="font-size: 16px;font-weight: bold">3、用户管理</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			3.1用户必须遵守中华人民共和国法律法规的规定,独立对其发布的内容(包括但不限于文字、图片等)承担责任。用户承诺:
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(1)用户在使用我们提供的服务或在本站发布信息时必须符合中华人民共和国相关法律法规的规定,不得在本站制作、复制、发布、传播以下内容或信息:
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(a)违反宪法确定的基本原则的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(b)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(c)损害国家荣誉和利益的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(d)煽动民族仇恨、民族歧视,破坏民族团结的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(e)破坏国家宗教政策,宣扬邪教和封建迷信的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(f)散布谣言,扰乱社会秩序,破坏社会稳定的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(g)散布淫秽、色情、赌博、暴力、恐怖或者教唆犯罪的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(h)侮辱或者诽谤他人,侵害他人合法权益的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(i)煽动非法集会、结社、游行、示威、聚众扰乱社会秩序的;
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(j)以非法民间组织名义活动的
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(k)含有法律、行政法规禁止的其他内容或违反掌柜科技的其他规定的。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			3.3用户不得以任何方式干扰掌柜科技服务且不得通过本站发布任何形式的广告,掌柜科技对用户发布的广告内容有权进行包括但不限于删除内容直至关闭账号的处理。因网络信息传播在时间上的即时性及空间上的广泛性,我们不可能在第一时间对用户发布广告的行为进行处理,在此提请用户需对此种广告的内容自行甄别,因用户受此种广告内容的影响而产生的任何损失,均与我们无关。掌柜科技鼓励用户对上述广告发布行为进行举报,我们会在收到举报后及时处理。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			3.4用户不得对掌柜科技上的任何数据作商业性利用,包括但不限于在未经我们事先书面同意的情况下,以复制、传播等任何方式使用掌柜科技上展示的资料。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			3.5用户不得进行违反诚实信用原则的不正当竞争行为,或恶意下订单或虚假交易等其他恶意扰乱掌柜科技交易秩序的行为。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			3.6责任承担
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(1)用户须对自己在使用掌柜科技服务过程中的行为承担法律责任。用户承担法律责任的形式包括但不限于:对因用户行为发生被侵害者索赔事件,以及我们因用户行为遭受行政处罚或侵权损害赔偿后,用户应给予我们等额的赔偿。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(2)用户理解,如果我们发现其发布的信息明显属于本协议第3.1款所列内容之一,依据中华人民共和国现行相关法律,本站有义务立即停止传输,保存有关记录,向国家有关机关报告,并且删除含有该内容的地址、目录或关闭服务器。
+		</view>
+
+		<view style="font-size: 16px;font-weight: bold">4、 掌柜科技服务</view>
+
+		<view style="text-align: left;text-indent: 2rem;"> 掌柜科技服务包括但不限于如下内容:
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			(1)保险信息服务
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			您可以通过掌柜科技获知相关保险机构对于保险产品及推荐套餐的报价,并可通过掌柜科技与保险机构建立联系,以完成保险产品投保,若发生保险事故,您可通过掌柜科技提供的报案电话将出险情况通知保险机构,进行理赔报案。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;"> (2)违章信息、行使信息查询、跟踪
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">您可以通过掌柜科技获取相关违章信息,通过绑定您的爱车,获取您的行驶信息。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(3)养车、用车服务</view>
+		<view style="text-align: left;text-indent: 2rem;">您可以通过掌柜科技购买洗车美容、维修保养、加油、代驾、预约停车、一键救援等服务(具体服务内容以掌柜科技上线功能为准)。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">(4)网上购物</view>
+		<view style="text-align: left;text-indent: 2rem;">您可以通过掌柜科技进行网上购物。</view>
+
+
+		<view style="text-align: left;text-indent: 2rem;"> (5)社交
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">您可通过掌柜科技发布相关信息,与其他用户交流、线上互动,或参与掌柜科技组织的相关活动。
+		</view>
+
+
+		<view style="font-size: 16px;font-weight: bold"> 5、商品与服务的购买
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			5.1商品/服务信息,包括但不限于数量、内容/性能介绍等随时都有可能发生变动,掌柜科技不作特别通知,请用户至商品销售页面自行查看。我们会尽最大努力保证您所浏览的商品信息的准确性,但由于商品种类繁多且商品信息的数量较大,加之互联网技术因素等客观原因存在,本站显示的信息可能会有一定的滞后性或差错。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			5.2在您提交订单时,请仔细确认所购服务/商品的名称、价格、数量、型号、规格、尺寸、收货人、电话、收货地址等信息。您提交订单即表示对订单中所确认的订购服务/商品、收货地址等信息的准确性负责。如果您填写的收货人联系电话、地址等信息错误,导致我们/合作方(或我们/合作方委托的配送公司)无法配送、配送延时、错误的,由此造成的损失需由您自行承担。如收货人与您本人不一致的,收货人的行为与意思表示视为您的行为和意思表示,您对收货人的行为与意思表示的法律后果承担连带责任。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;font-weight: bold;">
+			5.3您理解并同意,掌柜科技展示的商品/服务信息及价格仅作为要约邀请,您提交订单视为您发出了合同要约,只有您支付相应价款后,方视为购买合同成立。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			5.4您同意,我们拥有通过邮件、短信、电话形式,向在本站注册、交易用户、收货人发送订单信息、促销活动等告知信息的权利。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			5.5为回馈用户的支持,我们会不定期向用户发放优惠券或代金券,上述优惠券或代金券的发放数量及规则由掌柜科技自行决定,且由掌柜科技享有解释权和修改权。您有权按照优惠券或代金券的使用规则在本站购物时使用,严禁转卖掌柜科技优惠券或代金券或利用掌柜科技账户进行其他经营性行为等。您理解并认可该等优惠券或代金券以及相关产品具有期限性,超出期限的,您将无法使用该等优惠券或代金券以及相关产品;不论是否过期,您均无权要求我们将该等优惠券或代金券折算为现金向您支付。如您违反本协议约定、优惠券/代金券使用规则或诚实信用原则使用优惠券或代金券的,所涉及的订单/合同无效,我们可不予履行,如因此造成我们损失的,您应承担全部赔偿责任。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			5.6关于支付形式、商品退换货、售后服务等相关问题,请以商品销售页面展示信息为准。若您在商品购买过程中遇到任何问题,均可发送邮件至*********,我们的客服人员会及时与您取得联系井帮助您解决问题。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			由于掌柜科技上第三方供应商或服务商对您提供产品或服务而产生纠纷均的,均由第三方承担责任,与本站技术提供方和运营主体无关,但我们会进行协助解决。
+		</view>
+
+		<view style="font-size: 16px;font-weight: bold"> 6、用户隐私制度
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			用户知悉并同意,为了给用户提供更好的使用体验,我们在您自愿的前提下收集您的个人信息并将这些信息进行整合。具体的收集、使用、保护、共享、跨境传输规则详见《合伙人隐私政策》。
+		</view>
+
+		<view style="font-size: 16px;font-weight: bold"> 7、所有权及知识产权条款
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			7.1用户一旦接受本服务协议,即表明该用户主动将其在本站发表的任何形式的信息内容(包括但不限于用户评论、用户咨询、各类话题文章、图片等)的财产性权利等任何可转让的权利,如著作权财产权(包括但不限于:复制权、发行权、出租权、展览权、表演权、放映权、广播权、信息网络传播权、摄制权、改编权、翻译权、汇编权以及应当由著作权人享有<text
+				style="background:red">的其他科转让权</text>利)等,全部免费、永久、独家排他且不可撤销地转让给我们所有,并允许我们再授权,用户同意我们有权就任何主体侵权而单独提起诉讼并获得赔偿
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			7.
+			2本协议已经构成《中华人民共和国著作权法》第二十五条(条文序号依照2011年版著作权法确定)及相关法律规定的著作财产权等权利转让书面协议,其效力及于用户在掌柜科技发布的任何受著作权法保护的作品内容,无论该等内容形成于本协议订立前还是本协议订立后。对于您提供的其他资料及数据信息,您授予掌柜科技及其关联公司全球通用的、永久的、免费的许可使用权利(并有权在多个层面对该权利进行再授权)。此外,掌柜科技及其关联公司有权(<text
+				style="background:red">全部或部份地</text>)使用、复制、修订、改写、发布、翻译、分发、执行和展示您的全部资料数据(包括但不限于交易行为数据及全部展示于掌柜科技的各类信息)或制作其派生作品,并以现在已知或日后开发的任何形式、媒体或技术,将上述信息纳入我们作品内。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			7.3用户同意并已充分了解本协议的条款,承诺不将已发表于本站的信息,以任何形式发布或授权其它主体以任何方式使用(包括但限于在各类网站、媒体上使用)。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			7.4对于您通过掌柜科技而上传的任何在公开区域可获取的并受著作权保护的内容,您应对该等内容的真实性、合法性负责,保证对该等内容拥有完整的、无瑕疵的所有权和知识产权或拥有完整的授权,并不存在任何侵犯第三方合法权益的情形,包括但不限于著作权、肖像权、商标权、专利权、企业名称权、商号权、商业秘密、个人隐私、合同权利等权利。所有因用户违法上传内容而给任何第三方或我们造成的损害均由用户个人承担全部的责任,我们不承担任何责任,且我们有义务配合第三方、司法机关或行政机关完成相关的取证,并根据法律、主管部门或司法部门的要求将用户注册信息给予披露。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			7.5除明显归属于合作伙伴、第三方所有的信息资料外,我们拥有掌柜科技内所有内容,包括但不限于文字、图片、图形、表格、动画、程序、软件等单独或组合的版权。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			7.6除法律另有强制性规定外,未经我们明确的特别书面许可,任何单位或个人不得以任何方式非法地全部或部分复制、转载、引用、链接、抓取或以其他方式使用本站的信息内容,否则,我们有权追究其法律责任。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			7.7本站所刊登的资料信息(诸如文字、图表、标识、按钮图标、图像、声音文件片段、数字下载、数据编辑和软件),均是掌柜科技或其内容提供者的财产,受中国和国际版权法的保护。本站上所有内容的汇编是掌柜科技的排他财产,受中国和国际版权法的保护。本站上所有软件都是掌柜科技或其关联公司或其软件供应商的财产,受中国和国际版权法的保护。
+		</view>
+
+		<view style="font-size: 16px;font-weight: bold"> 8、责任限制及不承诺担保</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			8.1除非另有明确的书面说明,本站及其所包含的或以其它方式通过本站提供给您的全部信息、内容、材料、产品(包括软件)和服务,均是在"按现状"和按现有"的基础上提供的。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			8.2除非另有明确的书面说明,我们不对本站的运营及其包含在本网站上的信息、内容、材料、产品(包括软件)或服务作任何形式的、明示或默示的声明或担保(根据中华人民共和国法律另有规定的以外)。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			8.3我们不担保本站所包含的或以其它方式通过本站提供给您的全部信息、内容、材料、产品(包括软件)和服务、其服务器或从本站发出的电子信件、信息没有病毒或其他有害成分。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			8.4如因不可抗力或其它本站无法控制的原因使本站销售系统崩渍或无法正常使用导致网上交易无法完成或丢失有关的信息、记录等,我们会合理地尽力协助处理善后事宜。
+		</view>
+
+
+		<view style="font-size: 16px;font-weight: bold"> 9、法律管辖和适用</view>
+		<view style="text-align: left;text-indent: 2rem;">本协议的订立、执行和解释及争议的解决均应适用中华人民共和国法律。<text
+				style="font-weight: bold;">如双方就本协议内容或其执行发生任何争议,双方应尽量友好协商解决;协商不成时,任何方均可向掌柜科技所在地的人民法院提起诉讼。</text>
+		</view>
+
+
+		<view style="font-size: 16px;font-weight: bold"> 10、其他</view>
+		<view style="text-align: left;text-indent: 2rem;">10.1掌柜科技所有者是指在政府部门依法许可或备案的掌柜科技经营主体。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">
+			10.2我们尊重用户和消费者的合法权利,本协议及本网站上发布的各类规则、声明等其他内容,均是为了更好的、更加便利的为用户和消费者提供服务。本站欢迎用户和社会各界捉出意见和建议,我们将虚心接受并适时修改本协议及本站上的各类规则。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">10.3本协议内容中以黑体、加租、下划线、斜体等方式显著标识的条款,请用户看重阅读。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">10.4我们未行使或执行本服务协议任何权利或规定,不构成对前述权利或权利之放弃。
+		</view>
+		<view style="text-align: left;text-indent: 2rem;">10.5如本协议中的任何条款无论因何种原因完全或部分无效或不具有执行力,本协议的其余条软仍应有效并且有约束力。
+		</view>
+		<view style="font-weight: bold;text-align: left;text-indent: 2rem"> 本协议自签订之日起生效。
+			本协议签订之日,即用户注册时,点击‘同意’的当天,视为合同已签订生效。
+		</view>
+		<view style="text-align: right;margin-right: 8px;font-weight: bold;margin-top: 16px"> 山西省掌柜鼎科技有限公司
+		</view>
+
+
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {}
+		},
+		methods: {}
+	}
+</script>
+
+<style>
+	page {
+		background: #FFFFFF;
+	}
+</style>

BIN
static/login/Frame (26).png


BIN
static/login/Frame (27).png


BIN
static/login/Frame (28).png


BIN
static/login/bejing.png


BIN
static/login/code1.png


BIN
static/login/code2.png


BIN
static/login/code3.png


BIN
static/login/yingye2.png


BIN
static/login/yingyezhizhao.png


BIN
static/logo1.png


+ 2 - 2
store/index.js

@@ -30,9 +30,9 @@ export default new Vuex.Store({
   },
   actions: {
     // 登录
-    mLogin({ commit }, userInfo) {
+    mLogin({ commit }, param) {
       return new Promise((resolve, reject) => {
-       api.login(userInfo).then(response => {
+       api.login(param.passWord,param.phone).then(response => {
           if(response.data.code ==200){ 
             const result = response.data.result
             const userInfo = result.userInfo

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác