فهرست منبع

1. 添加网络请求封装

Cee Yang 3 سال پیش
والد
کامیت
9fdaf5f1bf
12فایلهای تغییر یافته به همراه273 افزوده شده و 570 حذف شده
  1. 6 6
      api/api.js
  2. 7 3
      api/envs.js
  3. 35 0
      api/request.js
  4. 2 1
      i18n/index.js
  5. 5 4
      main.js
  6. 62 523
      package-lock.json
  7. 3 1
      package.json
  8. 6 0
      pages.json
  9. 51 0
      pages/login/env_page.vue
  10. 42 30
      pages/login/index.vue
  11. 10 2
      pages/mine/index.vue
  12. 44 0
      store/store.js

+ 6 - 6
api/api.js

@@ -1,12 +1,12 @@
-import Environments from "./environments.js"
+import request from './request'
 
 class Api {
 	
-	static defaultEnv = Environments.dev
-	
-	// var currentEnv = 
-	
-	static login = `${Api.defaultEnv.url}/api/v1/sso_v2/app_login`
+	/// 登录 { "account": lishuming, "password": 123456}
+	static login(data) { return request({url: '/api/v1/sso_v2/app_login', method: "POST", data: data}) }
+
+	/// LESON
+	static lessonDetail(id) { return request({ url: `/api/v1/lesson_detail/${id}` }) }
 }
 
 export default Api

+ 7 - 3
api/environments.js → api/envs.js

@@ -1,21 +1,25 @@
 /// 环境枚举
-const Environments = {
+const Envs = {
 	release: {
 	  index: 0,
-	  url: "https://api-eschool-slb.i2edu.net/api/v1"
+		name: '正式环境',
+	  url: "https://api-eschool-slb.i2edu.net"
 	},
 	test: {
 	  index: 1,
+		name: '测试环境',
 	  url: "http://api-test-eschool-slb.i2edu.net:31103"
 	},
   dev: {
     index: 2,
+		name: '开发环境',
     url: "http://api-test-eschool-slb.i2edu.net:31103"
   },
 	custom: {
 	  index: 3,
+		name: '自定义环境',
 	  url: ""
 	},
 }
 
-export default Environments
+export default Envs

+ 35 - 0
api/request.js

@@ -0,0 +1,35 @@
+import Envs from "./envs"
+import store from '../store/store'
+const debug = process.env.NODE_ENV !== 'production'
+
+/// 环境对象
+class Env {
+	static defaultEnv = debug ? Envs.dev : Envs.release
+	
+	static currentEnv() { return Object.values(Envs).find((e)=>e.index==store.state.selectedEnv) ?? Api.defaultEnv }
+}
+
+/// 公共请求处理
+const request = (config) => {
+	
+	config.url = Env.currentEnv().url + config.url
+	if(!config.data) config.data = {}
+	if(!config.method) config.method = 'GET'
+	console.log(JSON.stringify(config));
+	let promise = new Promise(function(resolve, reject) {
+		uni.request(config).then(responses => {
+			// 异常
+			if (responses[0]) {
+				reject({message : "网络超时"})
+			} else {
+				let response = responses[1].data // 如果返回的结果是data.data的,嫌麻烦可以用这个,return res,这样只返回一个data
+				resolve(response)
+			}
+		}).catch(error => {
+			reject(error)
+		})
+	})
+	return promise
+};
+
+export default request

+ 2 - 1
i18n/index.js

@@ -2,11 +2,12 @@ import en from './en.js'
 import zh from './zh.js'
 import VueI18n from 'vue-i18n'
 import Vue from 'vue'
+import store from '../store/store'
 
 Vue.use(VueI18n)
 
 const i18n = new VueI18n({
-	locale: 'zh',
+	locale: store.state.locale || 'zh',
 	messages: {
 		'zh': zh,
 		'en': en

+ 5 - 4
main.js

@@ -3,16 +3,17 @@ import Vue from 'vue'
 
 import cuCustom from './colorui/components/cu-custom.vue'
 import uView from '@/uni_modules/uview-ui'
-import i18n from './i18n/index.js'
-
+import i18n from './i18n/index'
+import store from './store/store'
+import request from './api/request.js'
 
 Vue.component('cu-custom',cuCustom)
 Vue.use(uView)
 Vue.config.productionTip = false
 App.mpType = 'app'
 const app = new Vue({
+		store,
 		i18n,
     ...App
-})
-// app.use(i18n)
+})
 app.$mount()

+ 62 - 523
package-lock.json

@@ -5,552 +5,91 @@
   "packages": {
     "": {
       "dependencies": {
-        "vue-i18n": "^9.2.0-beta.25"
+        "vue-i18n": "^8.26.7",
+        "vuex": "^3.6.2",
+        "vuex-persistedstate": "^4.1.0"
       }
     },
-    "node_modules/@babel/parser": {
-      "version": "7.16.6",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz",
-      "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==",
-      "peer": true,
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@intlify/core-base": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.25.tgz",
-      "integrity": "sha512-ReJ1qytJQ1pD3YIM474MFzAFIA/MNO3LiIogXQslK89WVFxCklAQOQQOe075AMAi90ng+fZM4/bp6hslQgjn4w==",
-      "dependencies": {
-        "@intlify/devtools-if": "9.2.0-beta.25",
-        "@intlify/message-compiler": "9.2.0-beta.25",
-        "@intlify/shared": "9.2.0-beta.25",
-        "@intlify/vue-devtools": "9.2.0-beta.25"
-      },
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/@intlify/devtools-if": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.25.tgz",
-      "integrity": "sha512-iqBKiQ4rRP0xbbkq00o/TmfmsEBQulnCMO8JuZ5kBBroXqwyp65dQ6DbwojjP+TG0ON5IFKL39JntF96sin1LQ==",
-      "dependencies": {
-        "@intlify/shared": "9.2.0-beta.25"
-      },
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/@intlify/message-compiler": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.25.tgz",
-      "integrity": "sha512-/YMG6LmQLvD8uHCJvWLaK0t8exYbek3ya4BZZ99AcM5+JC/JRdLIK8WiVJnGpfrvleQArxvHed4GokS+oWZ5rQ==",
-      "dependencies": {
-        "@intlify/shared": "9.2.0-beta.25",
-        "source-map": "0.6.1"
-      },
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/@intlify/shared": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.25.tgz",
-      "integrity": "sha512-I2L05aWh0azr5KwQjLV7gMTN0SrdglgMAfpJniT53Pvvc8l+OTs8IEhdPCQwsbgOravpWt14O7m3deOzw3ln6w==",
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/@intlify/vue-devtools": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.25.tgz",
-      "integrity": "sha512-47rmZmrM1FihTWQkixgYu3lOCBpT1NyGfYSxSYnUw1s2Ky8w84S81nYmbus2GZjfj/zAovkKyRNclETVTy6O2Q==",
-      "dependencies": {
-        "@intlify/core-base": "9.2.0-beta.25",
-        "@intlify/shared": "9.2.0-beta.25"
-      },
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/@vue/compiler-core": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.26.tgz",
-      "integrity": "sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==",
-      "peer": true,
-      "dependencies": {
-        "@babel/parser": "^7.16.4",
-        "@vue/shared": "3.2.26",
-        "estree-walker": "^2.0.2",
-        "source-map": "^0.6.1"
-      }
-    },
-    "node_modules/@vue/compiler-dom": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.26.tgz",
-      "integrity": "sha512-smBfaOW6mQDxcT3p9TKT6mE22vjxjJL50GFVJiI0chXYGU/xzC05QRGrW3HHVuJrmLTLx5zBhsZ2dIATERbarg==",
-      "peer": true,
-      "dependencies": {
-        "@vue/compiler-core": "3.2.26",
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "node_modules/@vue/compiler-sfc": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.26.tgz",
-      "integrity": "sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==",
-      "peer": true,
-      "dependencies": {
-        "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.26",
-        "@vue/compiler-dom": "3.2.26",
-        "@vue/compiler-ssr": "3.2.26",
-        "@vue/reactivity-transform": "3.2.26",
-        "@vue/shared": "3.2.26",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.25.7",
-        "postcss": "^8.1.10",
-        "source-map": "^0.6.1"
-      }
-    },
-    "node_modules/@vue/compiler-ssr": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.26.tgz",
-      "integrity": "sha512-2mywLX0ODc4Zn8qBoA2PDCsLEZfpUGZcyoFRLSOjyGGK6wDy2/5kyDOWtf0S0UvtoyVq95OTSGIALjZ4k2q/ag==",
-      "peer": true,
-      "dependencies": {
-        "@vue/compiler-dom": "3.2.26",
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "node_modules/@vue/devtools-api": {
-      "version": "6.0.0-beta.21.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.21.1.tgz",
-      "integrity": "sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw=="
-    },
-    "node_modules/@vue/reactivity": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.26.tgz",
-      "integrity": "sha512-h38bxCZLW6oFJVDlCcAiUKFnXI8xP8d+eO0pcDxx+7dQfSPje2AO6M9S9QO6MrxQB7fGP0DH0dYQ8ksf6hrXKQ==",
-      "peer": true,
-      "dependencies": {
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "node_modules/@vue/reactivity-transform": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.26.tgz",
-      "integrity": "sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==",
-      "peer": true,
-      "dependencies": {
-        "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.26",
-        "@vue/shared": "3.2.26",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.25.7"
-      }
-    },
-    "node_modules/@vue/runtime-core": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.26.tgz",
-      "integrity": "sha512-BcYi7qZ9Nn+CJDJrHQ6Zsmxei2hDW0L6AB4vPvUQGBm2fZyC0GXd/4nVbyA2ubmuhctD5RbYY8L+5GUJszv9mQ==",
-      "peer": true,
-      "dependencies": {
-        "@vue/reactivity": "3.2.26",
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "node_modules/@vue/runtime-dom": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.26.tgz",
-      "integrity": "sha512-dY56UIiZI+gjc4e8JQBwAifljyexfVCkIAu/WX8snh8vSOt/gMSEGwPRcl2UpYpBYeyExV8WCbgvwWRNt9cHhQ==",
-      "peer": true,
-      "dependencies": {
-        "@vue/runtime-core": "3.2.26",
-        "@vue/shared": "3.2.26",
-        "csstype": "^2.6.8"
-      }
-    },
-    "node_modules/@vue/server-renderer": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.26.tgz",
-      "integrity": "sha512-Jp5SggDUvvUYSBIvYEhy76t4nr1vapY/FIFloWmQzn7UxqaHrrBpbxrqPcTrSgGrcaglj0VBp22BKJNre4aA1w==",
-      "peer": true,
-      "dependencies": {
-        "@vue/compiler-ssr": "3.2.26",
-        "@vue/shared": "3.2.26"
-      },
-      "peerDependencies": {
-        "vue": "3.2.26"
-      }
-    },
-    "node_modules/@vue/shared": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.26.tgz",
-      "integrity": "sha512-vPV6Cq+NIWbH5pZu+V+2QHE9y1qfuTq49uNWw4f7FDEeZaDU2H2cx5jcUZOAKW7qTrUS4k6qZPbMy1x4N96nbA==",
-      "peer": true
-    },
-    "node_modules/csstype": {
-      "version": "2.6.19",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz",
-      "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==",
-      "peer": true
-    },
-    "node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "peer": true
-    },
-    "node_modules/magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
-      "peer": true,
-      "dependencies": {
-        "sourcemap-codec": "^1.4.4"
-      }
-    },
-    "node_modules/nanoid": {
-      "version": "3.1.30",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
-      "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
-      "peer": true,
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "peer": true
-    },
-    "node_modules/postcss": {
-      "version": "8.4.5",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
-      "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
-      "peer": true,
-      "dependencies": {
-        "nanoid": "^3.1.30",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.1"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/postcss/"
-      }
-    },
-    "node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+    "node_modules/deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
       "engines": {
         "node": ">=0.10.0"
       }
     },
-    "node_modules/source-map-js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
-      "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
-      "peer": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
+    "node_modules/shvl": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/shvl/-/shvl-2.0.3.tgz",
+      "integrity": "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw=="
     },
-    "node_modules/sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+    "node_modules/vue": {
+      "version": "2.6.14",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
+      "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==",
       "peer": true
     },
-    "node_modules/vue": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.26.tgz",
-      "integrity": "sha512-KD4lULmskL5cCsEkfhERVRIOEDrfEL9CwAsLYpzptOGjaGFNWo3BQ9g8MAb7RaIO71rmVOziZ/uEN/rHwcUIhg==",
-      "peer": true,
-      "dependencies": {
-        "@vue/compiler-dom": "3.2.26",
-        "@vue/compiler-sfc": "3.2.26",
-        "@vue/runtime-dom": "3.2.26",
-        "@vue/server-renderer": "3.2.26",
-        "@vue/shared": "3.2.26"
+    "node_modules/vue-i18n": {
+      "version": "8.26.7",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.26.7.tgz",
+      "integrity": "sha512-7apa5PvRg1YCLoraE3lOgpCG8hJGupLCtywQWedWsgBbvF0TOgFvhitqK9xRH0PBGG1G8aiJz9oklyNDFfDxLg=="
+    },
+    "node_modules/vuex": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
+      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==",
+      "peerDependencies": {
+        "vue": "^2.0.0"
       }
     },
-    "node_modules/vue-i18n": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.25.tgz",
-      "integrity": "sha512-l/A5W5KLuwnI5NHOV0WQrF79BwVku83ed7wHmq5NLm/Uofmsc8qmgJ95zw8EK3fmSBzb3F1NbjxxK2DZcg8c/g==",
+    "node_modules/vuex-persistedstate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
+      "integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==",
       "dependencies": {
-        "@intlify/core-base": "9.2.0-beta.25",
-        "@intlify/shared": "9.2.0-beta.25",
-        "@intlify/vue-devtools": "9.2.0-beta.25",
-        "@vue/devtools-api": "^6.0.0-beta.13"
-      },
-      "engines": {
-        "node": ">= 12"
+        "deepmerge": "^4.2.2",
+        "shvl": "^2.0.3"
       },
       "peerDependencies": {
-        "vue": "^3.0.0"
+        "vuex": "^3.0 || ^4.0.0-rc"
       }
     }
   },
   "dependencies": {
-    "@babel/parser": {
-      "version": "7.16.6",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz",
-      "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==",
-      "peer": true
-    },
-    "@intlify/core-base": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.0-beta.25.tgz",
-      "integrity": "sha512-ReJ1qytJQ1pD3YIM474MFzAFIA/MNO3LiIogXQslK89WVFxCklAQOQQOe075AMAi90ng+fZM4/bp6hslQgjn4w==",
-      "requires": {
-        "@intlify/devtools-if": "9.2.0-beta.25",
-        "@intlify/message-compiler": "9.2.0-beta.25",
-        "@intlify/shared": "9.2.0-beta.25",
-        "@intlify/vue-devtools": "9.2.0-beta.25"
-      }
+    "deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
     },
-    "@intlify/devtools-if": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.0-beta.25.tgz",
-      "integrity": "sha512-iqBKiQ4rRP0xbbkq00o/TmfmsEBQulnCMO8JuZ5kBBroXqwyp65dQ6DbwojjP+TG0ON5IFKL39JntF96sin1LQ==",
-      "requires": {
-        "@intlify/shared": "9.2.0-beta.25"
-      }
-    },
-    "@intlify/message-compiler": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.0-beta.25.tgz",
-      "integrity": "sha512-/YMG6LmQLvD8uHCJvWLaK0t8exYbek3ya4BZZ99AcM5+JC/JRdLIK8WiVJnGpfrvleQArxvHed4GokS+oWZ5rQ==",
-      "requires": {
-        "@intlify/shared": "9.2.0-beta.25",
-        "source-map": "0.6.1"
-      }
-    },
-    "@intlify/shared": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.0-beta.25.tgz",
-      "integrity": "sha512-I2L05aWh0azr5KwQjLV7gMTN0SrdglgMAfpJniT53Pvvc8l+OTs8IEhdPCQwsbgOravpWt14O7m3deOzw3ln6w=="
-    },
-    "@intlify/vue-devtools": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.0-beta.25.tgz",
-      "integrity": "sha512-47rmZmrM1FihTWQkixgYu3lOCBpT1NyGfYSxSYnUw1s2Ky8w84S81nYmbus2GZjfj/zAovkKyRNclETVTy6O2Q==",
-      "requires": {
-        "@intlify/core-base": "9.2.0-beta.25",
-        "@intlify/shared": "9.2.0-beta.25"
-      }
-    },
-    "@vue/compiler-core": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.26.tgz",
-      "integrity": "sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==",
-      "peer": true,
-      "requires": {
-        "@babel/parser": "^7.16.4",
-        "@vue/shared": "3.2.26",
-        "estree-walker": "^2.0.2",
-        "source-map": "^0.6.1"
-      }
-    },
-    "@vue/compiler-dom": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.26.tgz",
-      "integrity": "sha512-smBfaOW6mQDxcT3p9TKT6mE22vjxjJL50GFVJiI0chXYGU/xzC05QRGrW3HHVuJrmLTLx5zBhsZ2dIATERbarg==",
-      "peer": true,
-      "requires": {
-        "@vue/compiler-core": "3.2.26",
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "@vue/compiler-sfc": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.26.tgz",
-      "integrity": "sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==",
-      "peer": true,
-      "requires": {
-        "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.26",
-        "@vue/compiler-dom": "3.2.26",
-        "@vue/compiler-ssr": "3.2.26",
-        "@vue/reactivity-transform": "3.2.26",
-        "@vue/shared": "3.2.26",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.25.7",
-        "postcss": "^8.1.10",
-        "source-map": "^0.6.1"
-      }
-    },
-    "@vue/compiler-ssr": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.26.tgz",
-      "integrity": "sha512-2mywLX0ODc4Zn8qBoA2PDCsLEZfpUGZcyoFRLSOjyGGK6wDy2/5kyDOWtf0S0UvtoyVq95OTSGIALjZ4k2q/ag==",
-      "peer": true,
-      "requires": {
-        "@vue/compiler-dom": "3.2.26",
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "@vue/devtools-api": {
-      "version": "6.0.0-beta.21.1",
-      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.21.1.tgz",
-      "integrity": "sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw=="
-    },
-    "@vue/reactivity": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.26.tgz",
-      "integrity": "sha512-h38bxCZLW6oFJVDlCcAiUKFnXI8xP8d+eO0pcDxx+7dQfSPje2AO6M9S9QO6MrxQB7fGP0DH0dYQ8ksf6hrXKQ==",
-      "peer": true,
-      "requires": {
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "@vue/reactivity-transform": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.26.tgz",
-      "integrity": "sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==",
-      "peer": true,
-      "requires": {
-        "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.26",
-        "@vue/shared": "3.2.26",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.25.7"
-      }
-    },
-    "@vue/runtime-core": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.26.tgz",
-      "integrity": "sha512-BcYi7qZ9Nn+CJDJrHQ6Zsmxei2hDW0L6AB4vPvUQGBm2fZyC0GXd/4nVbyA2ubmuhctD5RbYY8L+5GUJszv9mQ==",
-      "peer": true,
-      "requires": {
-        "@vue/reactivity": "3.2.26",
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "@vue/runtime-dom": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.26.tgz",
-      "integrity": "sha512-dY56UIiZI+gjc4e8JQBwAifljyexfVCkIAu/WX8snh8vSOt/gMSEGwPRcl2UpYpBYeyExV8WCbgvwWRNt9cHhQ==",
-      "peer": true,
-      "requires": {
-        "@vue/runtime-core": "3.2.26",
-        "@vue/shared": "3.2.26",
-        "csstype": "^2.6.8"
-      }
-    },
-    "@vue/server-renderer": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.26.tgz",
-      "integrity": "sha512-Jp5SggDUvvUYSBIvYEhy76t4nr1vapY/FIFloWmQzn7UxqaHrrBpbxrqPcTrSgGrcaglj0VBp22BKJNre4aA1w==",
-      "peer": true,
-      "requires": {
-        "@vue/compiler-ssr": "3.2.26",
-        "@vue/shared": "3.2.26"
-      }
-    },
-    "@vue/shared": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.26.tgz",
-      "integrity": "sha512-vPV6Cq+NIWbH5pZu+V+2QHE9y1qfuTq49uNWw4f7FDEeZaDU2H2cx5jcUZOAKW7qTrUS4k6qZPbMy1x4N96nbA==",
-      "peer": true
-    },
-    "csstype": {
-      "version": "2.6.19",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz",
-      "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==",
-      "peer": true
-    },
-    "estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
-      "peer": true
-    },
-    "magic-string": {
-      "version": "0.25.7",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
-      "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
-      "peer": true,
-      "requires": {
-        "sourcemap-codec": "^1.4.4"
-      }
-    },
-    "nanoid": {
-      "version": "3.1.30",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
-      "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
-      "peer": true
-    },
-    "picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "peer": true
-    },
-    "postcss": {
-      "version": "8.4.5",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
-      "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
-      "peer": true,
-      "requires": {
-        "nanoid": "^3.1.30",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.1"
-      }
-    },
-    "source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-    },
-    "source-map-js": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
-      "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
-      "peer": true
-    },
-    "sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
-      "peer": true
+    "shvl": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/shvl/-/shvl-2.0.3.tgz",
+      "integrity": "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw=="
     },
     "vue": {
-      "version": "3.2.26",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.26.tgz",
-      "integrity": "sha512-KD4lULmskL5cCsEkfhERVRIOEDrfEL9CwAsLYpzptOGjaGFNWo3BQ9g8MAb7RaIO71rmVOziZ/uEN/rHwcUIhg==",
-      "peer": true,
-      "requires": {
-        "@vue/compiler-dom": "3.2.26",
-        "@vue/compiler-sfc": "3.2.26",
-        "@vue/runtime-dom": "3.2.26",
-        "@vue/server-renderer": "3.2.26",
-        "@vue/shared": "3.2.26"
-      }
+      "version": "2.6.14",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
+      "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==",
+      "peer": true
     },
     "vue-i18n": {
-      "version": "9.2.0-beta.25",
-      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.0-beta.25.tgz",
-      "integrity": "sha512-l/A5W5KLuwnI5NHOV0WQrF79BwVku83ed7wHmq5NLm/Uofmsc8qmgJ95zw8EK3fmSBzb3F1NbjxxK2DZcg8c/g==",
-      "requires": {
-        "@intlify/core-base": "9.2.0-beta.25",
-        "@intlify/shared": "9.2.0-beta.25",
-        "@intlify/vue-devtools": "9.2.0-beta.25",
-        "@vue/devtools-api": "^6.0.0-beta.13"
+      "version": "8.26.7",
+      "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.26.7.tgz",
+      "integrity": "sha512-7apa5PvRg1YCLoraE3lOgpCG8hJGupLCtywQWedWsgBbvF0TOgFvhitqK9xRH0PBGG1G8aiJz9oklyNDFfDxLg=="
+    },
+    "vuex": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
+      "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==",
+      "requires": {}
+    },
+    "vuex-persistedstate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz",
+      "integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==",
+      "requires": {
+        "deepmerge": "^4.2.2",
+        "shvl": "^2.0.3"
       }
     }
   }

+ 3 - 1
package.json

@@ -1,5 +1,7 @@
 {
   "dependencies": {
-    "vue-i18n": "^9.2.0-beta.25"
+    "vue-i18n": "^8.26.7",
+    "vuex": "^3.6.2",
+    "vuex-persistedstate": "^4.1.0"
   }
 }

+ 6 - 0
pages.json

@@ -11,6 +11,12 @@
 			"style": {
 				"navigationStyle":"custom"
 			}
+		},
+		{
+			"path": "pages/login/env_page",
+			"style": {
+				"navigationBarTitleText": "开发者工具"
+			}
 		}
 	],
 	"globalStyle": {

+ 51 - 0
pages/login/env_page.vue

@@ -0,0 +1,51 @@
+<template>
+	<view>
+		<view class="cu-list menu sm-border margin-tb-sm">
+			<view v-for="env in envs" :index="env.index" class="cu-item padding-sm radius shadow-blur" @click="changeEnv" :data-index="env.index">
+				<view class="content padding-tb-sm" :class="selectedEnv==env.index?'text-red':''">
+					<view> {{ env.name }} </view>
+					<view> {{ env.url }} </view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Envs from "../../api/envs"
+	import { mapState, mapMutations } from 'vuex'
+	import Api from '../../api/api'
+	export default {
+		data() {
+			return {
+				// envs: [],
+			}
+		},
+		computed: {  
+			...mapState(['selectedEnv',]),
+			envs() {
+				return Object.values(Envs)
+			}
+		},
+		mounted() {
+			// this.envs = 
+		},
+		methods: {
+			changeEnv(e) {
+				// console.log(this.selectedEnv)
+				var index = e.currentTarget.dataset.index
+				if (index == 3) {
+					// TODO: custom url
+					return
+				}
+				this.$store.commit('selecteEnv', index)
+			},
+			showModal(e) {
+				this.modalName = e.currentTarget.dataset.target
+			},
+		}
+	}
+</script>
+
+<style>
+</style>

+ 42 - 30
pages/login/index.vue

@@ -1,7 +1,7 @@
 <template>
 	<view class="login">
 		<view class="login-top">
-			<image class="login-bg" src="/static/login/login_top_backgroud.png"></image>
+			<image class="login-bg" src="/static/login/login_top_backgroud.png" @click="headerImageClick"/>
 			<view class="login-top-content">
 				<image class="login-icon" src="/static/logo.png"></image>
 				<text class="login-title"> {{ $t('login') }} </text>
@@ -47,22 +47,38 @@
 
 <script>
 	import Api from '../../api/api.js'
+	import { mapState, mapMutations } from 'vuex'  
 	export default {
 		data() {
 			return {
 				loading: false,
 				loginStr: '登录',
 				user: {
-					account: 'lishuming',
-					password: '12345',
+					account: '',
+					password: '',
 				},
 				animation: '',
 				aggred: true,
 			}
 		},
+		computed: {  
+			// 映射两个状态到页面示例中,可以直接访问,实时获取state的值,更多请自行了解vuex  
+			...mapState(['username','password', 'locale'])
+		},
+		mounted() {
+			this.user.account = this.username
+			this.user.password = this.password
+			
+			// this.$i18n.locale = this.locale
+		},
 		methods: {
-			startLogin() {
-				
+			async startLogin() {
+				if (this.verifyInput() !== true) return
+				await this.login()
+			},
+			
+			/// 校验账号密码
+			verifyInput() {
 				if (this.user.account == '') return uni.showToast({
 					icon:'none',
 					title: this.$i18n.t('pleaseInput') + this.$i18n.t('userName')
@@ -78,38 +94,34 @@
 					title: this.$i18n.t('pleaseReadAndAggreeThePrivacyPolicy')
 				})
 				
+				return true
+			},
+			
+			async login() {
 				this.loading = true
-				let _this = this
-				uni.request({
-					url: Api.login,
-				  data: this.user,
-				  method:"POST",
-				  header : {'content-type':'application/json'},
-				  success: function (res) {
-				    console.log(res.data);
-				  },
-					fail: (e) => {
-						console.log('fail')
-						console.log(e)
-					},
-					complete() {
-						console.log('complete')
-						_this.loading = false
-					}
-				});
-				
-				// setTimeout(() => {
-				// 	this.loading = false
-				// 	uni.navigateTo({
-				// 		url:'../index/index'
-				// 	})
-				// }, 2.0*1000);
+				var _this = this
+				Api.login(this.user).then(res => {
+					_this.loading = false
+					if (res.code !== 200) return
+					_this.$store.commit('setUserInfo', res.data)
+					_this.$store.commit('setUserName', _this.user.account)
+					_this.$store.commit('setPassword', _this.user.password)
+					uni.navigateTo({
+						url:'../index/index'
+					})
+				})
 			},
 			
+			headerImageClick() {
+				uni.navigateTo({
+					url:'./env_page'
+				})
+			},
 			
 			changeToEnglish() {
 				let locale = this.$i18n.locale
 				locale === 'zh' ? this.$i18n.locale = 'en' : this.$i18n.locale = 'zh'
+				this.$store.commit('setLocale', this.$i18n.locale)
 			},
 			/// 清除输入框
 			clearInput(isUserAccount) {

+ 10 - 2
pages/mine/index.vue

@@ -1,5 +1,8 @@
 <template>
-	<text> {{ $t('me') }} </text>
+	<view>
+		<text> {{ $t('me') }} </text>
+		<button class="u-button--primary" type="default" @click="back">back</button>
+	</view>
 </template>
 
 <script>
@@ -17,7 +20,12 @@
 			
 		},
 		methods: {
-			
+			back() {
+				uni.navigateTo({
+					url:'../login/index',
+					animationType:'fade-in'
+				})
+			}
 		}
 	}
 </script>

+ 44 - 0
store/store.js

@@ -0,0 +1,44 @@
+import Vue from 'vue'
+import Vuex from 'vuex';
+import createPersistedState from 'vuex-persistedstate';
+
+Vue.use(Vuex)
+
+const state = {
+  username: "",
+	password: "",
+	selectedEnv: 1,
+	userInfo: {},
+	locale: "",
+}  
+
+const store = new Vuex.Store({
+  state, /// 仓库数据本身
+  plugins: [  
+    // 可以有多个持久化实例  
+    createPersistedState({  
+      key: 'app_config_data',  // 状态保存到本地的 key   
+      storage: {  // 存储方式定义  
+        getItem: (key) => uni.getStorageSync(key), // 获取  
+        setItem: (key, value) => uni.setStorageSync(key, value), // 存储  
+        removeItem: (key) => uni.removeStorageSync(key) // 删除  
+      }  
+    })  
+  ],
+	/// 修改仓库数据的唯一方式 改变状态
+  mutations: {
+		selecteEnv: (state, value) => state.selectedEnv = value,
+		setUserName: (state, value) => state.username = value,
+		setPassword: (state, value) => state.password = value,
+		setUserInfo: (state, value) => state.userInfo = value,
+		setLocale: (state, value) => state.locale = value
+  },
+	/// 仓库中的计算属性
+	getters: {},
+	/// 异步修改仓库数据 最终只能还是mutations修改仓库数据
+	actions: {},
+	/// 模块化
+	modules: {},
+});
+
+export default store