默认提交
Showing
12 changed files
with
392 additions
and
71 deletions
... | @@ -18,15 +18,16 @@ | ... | @@ -18,15 +18,16 @@ |
18 | "co": "^4.6.0", | 18 | "co": "^4.6.0", |
19 | "core-js": "^2.6.5", | 19 | "core-js": "^2.6.5", |
20 | "crypto-js": "^4.0.0", | 20 | "crypto-js": "^4.0.0", |
21 | "jsencrypt": "^3.0.0-rc.1", | ||
22 | "moment": "^2.29.1", | ||
23 | "glob": "^7.1.4", | 21 | "glob": "^7.1.4", |
24 | "js-cookie": "^2.2.1", | 22 | "js-cookie": "^2.2.1", |
23 | "jsencrypt": "^3.0.0-rc.1", | ||
25 | "mockjs": "^1.0.1-beta3", | 24 | "mockjs": "^1.0.1-beta3", |
25 | "moment": "^2.29.1", | ||
26 | "postcss-px2rem": "^0.3.0", | 26 | "postcss-px2rem": "^0.3.0", |
27 | "postcss-pxtorem": "^4.0.1", | 27 | "postcss-pxtorem": "^4.0.1", |
28 | "sass-resources-loader": "^2.0.3", | 28 | "sass-resources-loader": "^2.0.3", |
29 | "vant": "^2.2.11", | 29 | "vant": "^2.2.11", |
30 | "vconsole": "^3.15.1", | ||
30 | "vue": "^2.6.10", | 31 | "vue": "^2.6.10", |
31 | "vue-router": "^3.0.3", | 32 | "vue-router": "^3.0.3", |
32 | "vuex": "^3.0.1" | 33 | "vuex": "^3.0.1" | ... | ... |
... | @@ -4,9 +4,8 @@ | ... | @@ -4,9 +4,8 @@ |
4 | <head> | 4 | <head> |
5 | <meta charset="utf-8"> | 5 | <meta charset="utf-8"> |
6 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> | 6 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
7 | <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> --> | ||
8 | <meta name="viewport" | 7 | <meta name="viewport" |
9 | content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no"> | 8 | content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" /> |
10 | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> | 9 | <link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
11 | <!-- <script src="<%= BASE_URL %>static/js/weixin/jweixin-1.6.0.js"></script> | 10 | <!-- <script src="<%= BASE_URL %>static/js/weixin/jweixin-1.6.0.js"></script> |
12 | <script src="<%= BASE_URL %>static/js/kd/kd-sdk.1.0.0.js"></script> | 11 | <script src="<%= BASE_URL %>static/js/kd/kd-sdk.1.0.0.js"></script> | ... | ... |
1 | module.exports = { | 1 | module.exports = { |
2 | 2 | ||
3 | login: '/front/userApi/login', // 登录 | 3 | login: '/front/userApi/login', // 登录 |
4 | code2session: "/front/wxApi/code2session", // code2session | ||
4 | profile: '/front/userApi/profile', // 个人信息 | 5 | profile: '/front/userApi/profile', // 个人信息 |
5 | uploadProfile: '/front/userApi/uploadProfile', // 更新头像昵称 | 6 | uploadProfile: '/front/userApi/uploadProfile', // 更新头像昵称 |
6 | 7 | ||
8 | oauthLink: "/front/wxApi/oauthLink", // 获取oauth授权地址 | ||
9 | wxJsSign: "/front/wxApi/jsSign", // 微信jsSign签名接口 | ||
10 | |||
7 | 11 | ||
8 | upload: '/common/upload', // 上传文件 [x] | 12 | upload: '/common/upload', // 上传文件 [x] |
9 | list: "xxx", | 13 | list: "xxx", | ... | ... |
... | @@ -3,6 +3,8 @@ import axios from 'axios'; | ... | @@ -3,6 +3,8 @@ import axios from 'axios'; |
3 | import { | 3 | import { |
4 | Toast | 4 | Toast |
5 | } from 'vant'; | 5 | } from 'vant'; |
6 | Toast.allowMultiple(); | ||
7 | let loadingToast; | ||
6 | 8 | ||
7 | import router from '@/router' | 9 | import router from '@/router' |
8 | import { | 10 | import { |
... | @@ -21,25 +23,43 @@ import api from '@/api/api'; | ... | @@ -21,25 +23,43 @@ import api from '@/api/api'; |
21 | // axios的默认url | 23 | // axios的默认url |
22 | // axios.defaults.baseURL = "" | 24 | // axios.defaults.baseURL = "" |
23 | let base = process.env.VUE_APP_BASE_API; | 25 | let base = process.env.VUE_APP_BASE_API; |
24 | const ENV = process.env.VUE_APP_ENV; | 26 | let MODULE_CODE = process.env.VUE_APP_MODULE_CODE; |
25 | const MODULE_CODE = process.env.VUE_APP_MODULE_CODE; | ||
26 | const IS_POST_ENC = process.env.VUE_APP_IS_POST_ENC; | 27 | const IS_POST_ENC = process.env.VUE_APP_IS_POST_ENC; |
28 | let ENV = process.env.VUE_APP_ENV; | ||
29 | |||
30 | // 配置环境 | ||
31 | // let host = location.host; | ||
32 | if (location.host.indexOf("192.168.") != -1 || location.host.indexOf("172.20.") != -1 || location.host.indexOf('dev.h5.kdao.xin') != -1) { | ||
33 | // 测试环境 | ||
34 | ENV = "demo"; | ||
35 | } else { | ||
36 | // if (location.host.indexOf("prod.h5.kdao.xin") != -1) { | ||
37 | // // 恪道正式环境 | ||
38 | // } | ||
39 | } | ||
40 | |||
41 | |||
27 | // 默认超时 | 42 | // 默认超时 |
28 | axios.defaults.timeout = 5000; | 43 | axios.defaults.timeout = 5000; |
29 | 44 | ||
30 | 45 | ||
31 | // 请求拦截器 | 46 | // 请求拦截器 |
32 | // axios.interceptors.request.use( | 47 | axios.interceptors.request.use( |
33 | // config => { | 48 | config => { |
34 | // // 每次发送请求之前判断是否存在token,如果存在,则统一在http请求的header都加上token,不用每次请求都手动添加了 | 49 | let { |
35 | // // 即使本地存在token,也有可能token是过期的,所以在响应拦截器中要对返回状态进行判断 | 50 | opt |
36 | // const token = "token"; //这里写入token | 51 | } = config; |
37 | // token && (config.headers.Authorization = token); | 52 | if (opt && opt.loading) { |
38 | // return config; | 53 | loadingToast = Toast.loading({ |
39 | // }, | 54 | message: '加载中...', |
40 | // error => { | 55 | forbidClick: true, |
41 | // return Promise.error(error); | 56 | }); |
42 | // }) | 57 | } |
58 | return config; | ||
59 | }, | ||
60 | error => { | ||
61 | return Promise.error(error); | ||
62 | }) | ||
43 | 63 | ||
44 | // 响应拦截器 | 64 | // 响应拦截器 |
45 | axios.interceptors.response.use( | 65 | axios.interceptors.response.use( |
... | @@ -50,6 +70,8 @@ axios.interceptors.response.use( | ... | @@ -50,6 +70,8 @@ axios.interceptors.response.use( |
50 | let { | 70 | let { |
51 | opt | 71 | opt |
52 | } = config; | 72 | } = config; |
73 | if (loadingToast) loadingToast.clear(); | ||
74 | |||
53 | // 服务器状态码 | 75 | // 服务器状态码 |
54 | if (response.status === 200) { | 76 | if (response.status === 200) { |
55 | 77 | ||
... | @@ -71,6 +93,15 @@ axios.interceptors.response.use( | ... | @@ -71,6 +93,15 @@ axios.interceptors.response.use( |
71 | removeToken(); | 93 | removeToken(); |
72 | break; | 94 | break; |
73 | 95 | ||
96 | case 3001: | ||
97 | app.router.replace({ | ||
98 | name: "errorTips", | ||
99 | query: { | ||
100 | code: 3001 | ||
101 | } | ||
102 | }) | ||
103 | break; | ||
104 | |||
74 | default: | 105 | default: |
75 | break; | 106 | break; |
76 | } | 107 | } |
... | @@ -113,7 +144,7 @@ function analysisParams(params) { | ... | @@ -113,7 +144,7 @@ function analysisParams(params) { |
113 | method | 144 | method |
114 | } = params; | 145 | } = params; |
115 | if (IS_POST_ENC == 'true') { | 146 | if (IS_POST_ENC == 'true') { |
116 | if (method == 'post') { | 147 | if (method == 'post' || method == 'delete' || method == 'DELETE') { |
117 | data = makeEncrypt(data); | 148 | data = makeEncrypt(data); |
118 | } | 149 | } |
119 | } else { | 150 | } else { |
... | @@ -184,6 +215,20 @@ export const httpPost = params => { | ... | @@ -184,6 +215,20 @@ export const httpPost = params => { |
184 | opt | 215 | opt |
185 | }).then(res => res.data.content); | 216 | }).then(res => res.data.content); |
186 | } | 217 | } |
218 | export const httpDelete = params => { | ||
219 | params.method = 'delete'; | ||
220 | let { | ||
221 | reqUrl, | ||
222 | data, | ||
223 | headers, | ||
224 | opt, | ||
225 | method | ||
226 | } = analysisParams(params); | ||
227 | return axios.delete(reqUrl, { | ||
228 | data: data, | ||
229 | headers: headers, | ||
230 | }).then(res => res.data.content); | ||
231 | } | ||
187 | 232 | ||
188 | 233 | ||
189 | /** | 234 | /** |
... | @@ -232,6 +277,31 @@ export const formdata = params => { | ... | @@ -232,6 +277,31 @@ export const formdata = params => { |
232 | } | 277 | } |
233 | 278 | ||
234 | 279 | ||
280 | /** | ||
281 | * 获取bolb对象的图片 | ||
282 | * @param {*} params | ||
283 | * @returns | ||
284 | */ | ||
285 | export const getBlob = params => { | ||
286 | let { | ||
287 | reqUrl, | ||
288 | data, | ||
289 | headers, | ||
290 | } = analysisParams(params); | ||
291 | |||
292 | return axios({ | ||
293 | url: reqUrl, | ||
294 | method: 'get', | ||
295 | params: data, | ||
296 | headers: headers, | ||
297 | responseType: 'blob' // 改参数会以blob流格式返回 | ||
298 | }).then((res) => { | ||
299 | let blob = new Blob([res.data]) | ||
300 | let url = URL.createObjectURL(blob); | ||
301 | return url; | ||
302 | }); | ||
303 | } | ||
304 | |||
235 | 305 | ||
236 | 306 | ||
237 | /** | 307 | /** | ... | ... |
src/assets/images/common/d.jpeg
0 → 100644
2.05 KB
src/assets/images/common/user-default.png
0 → 100644
2.94 KB
... | @@ -7,6 +7,8 @@ import api from '@/api/api' | ... | @@ -7,6 +7,8 @@ import api from '@/api/api' |
7 | import { | 7 | import { |
8 | httpGet, | 8 | httpGet, |
9 | httpPost, | 9 | httpPost, |
10 | httpDelete, | ||
11 | getBlob, | ||
10 | formdata | 12 | formdata |
11 | } from '@/api/fetch-api.js' | 13 | } from '@/api/fetch-api.js' |
12 | 14 | ||
... | @@ -20,6 +22,9 @@ import { | ... | @@ -20,6 +22,9 @@ import { |
20 | import 'amfe-flexible/index.js' | 22 | import 'amfe-flexible/index.js' |
21 | import vant from '@/utils/vant-util' | 23 | import vant from '@/utils/vant-util' |
22 | 24 | ||
25 | // 微信签名 | ||
26 | import wechat from '@/utils/wechat.js' | ||
27 | |||
23 | import '@/styles/index.scss' // global css | 28 | import '@/styles/index.scss' // global css |
24 | import '@/styles/fonticon.scss' // 图标字体 | 29 | import '@/styles/fonticon.scss' // 图标字体 |
25 | import '@/assets/fonts/font.scss' // 字体引入 | 30 | import '@/assets/fonts/font.scss' // 字体引入 |
... | @@ -27,16 +32,40 @@ import '@/assets/fonts/font.scss' // 字体引入 | ... | @@ -27,16 +32,40 @@ import '@/assets/fonts/font.scss' // 字体引入 |
27 | 32 | ||
28 | Vue.config.productionTip = false | 33 | Vue.config.productionTip = false |
29 | 34 | ||
35 | |||
36 | // vconsole 组件 | ||
37 | import Vconsole from 'vconsole'; | ||
38 | if (getQuery("test") || process.env.NODE_ENV == "development") { | ||
39 | const vConsole = new Vconsole(); | ||
40 | } | ||
41 | |||
42 | function setHtmlFontSize() { | ||
43 | // 最大缩放单元 | ||
44 | const MAX_REM_UNIT = 54; | ||
45 | let htmlDom = document.querySelector('html'); | ||
46 | let fontSize = window.innerWidth / 10; | ||
47 | fontSize = fontSize > MAX_REM_UNIT ? MAX_REM_UNIT : fontSize; | ||
48 | htmlDom.style.fontSize = fontSize + 'px' | ||
49 | htmlDom.style.maxWidth = (MAX_REM_UNIT * 10) + "px" | ||
50 | htmlDom.style.position = "relative"; | ||
51 | htmlDom.style.margin = "0 auto"; | ||
52 | htmlDom.style.backgroundColor = "#f7f8fa"; | ||
53 | } | ||
54 | |||
55 | // 重新设置大小 | ||
56 | window.onresize = () => { | ||
57 | return (() => { | ||
58 | setHtmlFontSize(); | ||
59 | })() | ||
60 | } | ||
61 | setHtmlFontSize() | ||
62 | |||
30 | import { | 63 | import { |
31 | Dialog, | 64 | Dialog, |
32 | Toast | 65 | Toast |
33 | } from "vant"; | 66 | } from "vant"; |
34 | 67 | ||
35 | 68 | ||
36 | // 原app节点请通过 document.getElementById('app') 获取 | ||
37 | // routes里的component组件需要以import方式引入,否则页面创建的时候,app还没挂载。 | ||
38 | |||
39 | |||
40 | let util = require('@/utils/utils'); | 69 | let util = require('@/utils/utils'); |
41 | let func = require('@/utils/func'); | 70 | let func = require('@/utils/func'); |
42 | 71 | ||
... | @@ -44,6 +73,8 @@ let func = require('@/utils/func'); | ... | @@ -44,6 +73,8 @@ let func = require('@/utils/func'); |
44 | app.api = api; | 73 | app.api = api; |
45 | app.get = httpGet; | 74 | app.get = httpGet; |
46 | app.post = httpPost; | 75 | app.post = httpPost; |
76 | app.delete = httpDelete; | ||
77 | app.getBlob = getBlob; | ||
47 | app.uploadFile = formdata; | 78 | app.uploadFile = formdata; |
48 | app.router = router; | 79 | app.router = router; |
49 | app.util = util; | 80 | app.util = util; |
... | @@ -53,6 +84,8 @@ app.vant = { | ... | @@ -53,6 +84,8 @@ app.vant = { |
53 | Toast | 84 | Toast |
54 | } | 85 | } |
55 | window.app = app; | 86 | window.app = app; |
87 | // 原app节点请通过 document.getElementById('app') 获取 | ||
88 | // routes里的component组件需要以import方式引入,否则页面创建的时候,app还没挂载。 | ||
56 | 89 | ||
57 | 90 | ||
58 | function initVue() { | 91 | function initVue() { |
... | @@ -70,6 +103,11 @@ function initVue() { | ... | @@ -70,6 +103,11 @@ function initVue() { |
70 | }, | 103 | }, |
71 | render: h => h(VueApp) | 104 | render: h => h(VueApp) |
72 | }).$mount('#app') | 105 | }).$mount('#app') |
106 | |||
107 | // 微信初始化,微信签名,需要在index.html 引入 jweixin-1.6.0 | ||
108 | // wechat.init().then(() => { | ||
109 | // // wx.wxShare("","","",""); | ||
110 | // }); | ||
73 | } | 111 | } |
74 | 112 | ||
75 | // 微信授权 | 113 | // 微信授权 | ... | ... |
... | @@ -5,12 +5,28 @@ Vue.use(Vuex) | ... | @@ -5,12 +5,28 @@ Vue.use(Vuex) |
5 | 5 | ||
6 | export default new Vuex.Store({ | 6 | export default new Vuex.Store({ |
7 | state: { | 7 | state: { |
8 | 8 | profile: null, | |
9 | }, | 9 | }, |
10 | mutations: { | 10 | mutations: { |
11 | 11 | basicMutation(state, payload) { | |
12 | Object.assign(state, payload); | ||
13 | }, | ||
12 | }, | 14 | }, |
13 | actions: { | 15 | actions: { |
14 | 16 | // 获取用户身份 | |
17 | async getProfile({ | ||
18 | commit | ||
19 | }, payload) { | ||
20 | let res = await app.get({ | ||
21 | url: app.api.profile, | ||
22 | data: {}, | ||
23 | opt: { | ||
24 | toast: false | ||
25 | } | ||
26 | }) | ||
27 | commit('basicMutation', { | ||
28 | profile: res | ||
29 | }) | ||
30 | }, | ||
15 | } | 31 | } |
16 | }) | 32 | }) |
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
... | @@ -160,6 +160,49 @@ export function getObjByListKeyValue(value, key, list) { | ... | @@ -160,6 +160,49 @@ export function getObjByListKeyValue(value, key, list) { |
160 | return result; | 160 | return result; |
161 | } | 161 | } |
162 | 162 | ||
163 | |||
164 | |||
165 | /** | ||
166 | * 根据某个标识,树状数组 | ||
167 | * @param {*} list | ||
168 | * @param {*} key | ||
169 | * @param {*} value | ||
170 | * @returns | ||
171 | * | ||
172 | * - 传入原始数组 | ||
173 | * - 分类检索值 | ||
174 | * | ||
175 | * 输出 | ||
176 | * - keys | ||
177 | * - 树状列表 | ||
178 | */ | ||
179 | export function getTreeByListKeyValue(list, key) { | ||
180 | let keys = []; | ||
181 | let result = []; | ||
182 | list.forEach(element => { | ||
183 | if (keys.indexOf(element[key]) == -1) { | ||
184 | keys.push(element[key]); | ||
185 | result.push({ | ||
186 | text: element[key], | ||
187 | children: [] | ||
188 | }) | ||
189 | } | ||
190 | }); | ||
191 | list.forEach(element => { | ||
192 | result.forEach(eleRes => { | ||
193 | if (element[key] == eleRes.text) { | ||
194 | eleRes.children.push(element); | ||
195 | } | ||
196 | }); | ||
197 | }); | ||
198 | |||
199 | return { | ||
200 | keys, | ||
201 | result | ||
202 | } | ||
203 | } | ||
204 | |||
205 | |||
163 | /** | 206 | /** |
164 | * 获取环境信息 | 207 | * 获取环境信息 |
165 | * @return {Object} 环境信息对象 | 208 | * @return {Object} 环境信息对象 |
... | @@ -219,7 +262,7 @@ export function setTitle(title) { | ... | @@ -219,7 +262,7 @@ export function setTitle(title) { |
219 | $iframe.onload = function onIframeLoad() { | 262 | $iframe.onload = function onIframeLoad() { |
220 | setTimeout(function () { | 263 | setTimeout(function () { |
221 | $iframe.onload = null; | 264 | $iframe.onload = null; |
222 | onIframeLoad = null; | 265 | // onIframeLoad = null; |
223 | document.body.removeChild($iframe); | 266 | document.body.removeChild($iframe); |
224 | $iframe = null; | 267 | $iframe = null; |
225 | }, 0); | 268 | }, 0); |
... | @@ -279,10 +322,13 @@ export function formatBr(str) { | ... | @@ -279,10 +322,13 @@ export function formatBr(str) { |
279 | * @param {date} date 日期时间 | 322 | * @param {date} date 日期时间 |
280 | * @param {string} fmt 格式,如:'yyyy-MM-dd hh:mm:ss' | 323 | * @param {string} fmt 格式,如:'yyyy-MM-dd hh:mm:ss' |
281 | */ | 324 | */ |
282 | export function formatDate(date, fmt) { | 325 | export function formatDate(date, fmt = "yyyy-MM-dd hh:mm:ss") { |
283 | if (!date) return '-' | 326 | if (!date) return '-' |
284 | // 把-换成/ 避免iOS和安卓真机问题 | 327 | // 把-换成/ 避免iOS和安卓真机问题 |
285 | var reg = /-/g; | 328 | var reg = /-/g; |
329 | if (typeof date == 'string' && date.length == 13 && !isNaN(date)) { | ||
330 | date = parseInt(date) | ||
331 | } | ||
286 | if (typeof date == 'object') { | 332 | if (typeof date == 'object') { |
287 | date += ""; | 333 | date += ""; |
288 | date = date && date.replace(reg, '/'); | 334 | date = date && date.replace(reg, '/'); | ... | ... |
1 | import Vue from 'vue' | 1 | import Vue from 'vue' |
2 | 2 | ||
3 | import { | 3 | import { |
4 | Search, | ||
5 | Button, | ||
4 | Swipe, | 6 | Swipe, |
5 | SwipeItem, | 7 | SwipeItem, |
6 | Lazyload, | 8 | Lazyload, |
7 | Tab, | 9 | Tab, |
8 | Tabs, | 10 | Tabs, |
11 | Tag, | ||
9 | Sticky, | 12 | Sticky, |
10 | Popup, | 13 | Popup, |
11 | Tabbar, | 14 | Tabbar, |
12 | TabbarItem, | 15 | TabbarItem, |
13 | Icon, | 16 | Icon, |
14 | Uploader, | 17 | Loading, |
18 | Circle, | ||
19 | CountDown, | ||
20 | GoodsAction, | ||
21 | GoodsActionIcon, | ||
22 | GoodsActionButton, | ||
23 | Divider, | ||
24 | Rate, | ||
25 | Field, | ||
26 | Form, | ||
15 | Area, | 27 | Area, |
28 | RadioGroup, | ||
29 | Radio, | ||
16 | List, | 30 | List, |
31 | ImagePreview, | ||
32 | Step, | ||
33 | Steps, | ||
34 | Skeleton, | ||
17 | Toast, | 35 | Toast, |
18 | Button | 36 | Dialog, |
37 | Cell, | ||
38 | CellGroup, | ||
39 | AddressList, | ||
40 | AddressEdit, | ||
41 | Checkbox, | ||
42 | CheckboxGroup, | ||
43 | Stepper, | ||
44 | Switch, | ||
45 | Badge, | ||
46 | Picker, | ||
47 | DatetimePicker, | ||
48 | Empty, | ||
49 | Sidebar, | ||
50 | SidebarItem, | ||
51 | SubmitBar, | ||
52 | IndexBar, | ||
53 | IndexAnchor, | ||
54 | Calendar, | ||
55 | ActionSheet | ||
56 | } from 'vant'; | ||
57 | |||
58 | |||
59 | import { | ||
60 | Image as VanImage | ||
19 | } from 'vant'; | 61 | } from 'vant'; |
20 | 62 | ||
21 | Vue.use(Swipe).use(SwipeItem) | 63 | Vue.use(Swipe).use(SwipeItem) |
64 | .use(Search) | ||
65 | .use(Button) | ||
22 | .use(Lazyload) | 66 | .use(Lazyload) |
23 | .use(Tab).use(Tabs) | 67 | .use(Tab).use(Tabs) |
24 | .use(Sticky) | 68 | .use(Sticky) |
69 | .use(Tag) | ||
25 | .use(Popup) | 70 | .use(Popup) |
26 | .use(Tabbar).use(TabbarItem) | 71 | .use(Tabbar).use(TabbarItem) |
72 | .use(VanImage) | ||
27 | .use(Icon) | 73 | .use(Icon) |
28 | .use(Uploader) | 74 | .use(Loading) |
75 | .use(Circle) | ||
76 | .use(CountDown) | ||
77 | .use(GoodsAction) | ||
78 | .use(GoodsActionIcon) | ||
79 | .use(GoodsActionButton) | ||
80 | .use(Divider) | ||
81 | .use(Rate) | ||
82 | .use(Field) | ||
83 | .use(Form) | ||
29 | .use(Area) | 84 | .use(Area) |
85 | .use(Radio) | ||
86 | .use(RadioGroup) | ||
30 | .use(List) | 87 | .use(List) |
31 | .use(Button) | 88 | .use(ImagePreview) |
32 | .use(Toast); | 89 | .use(Step) |
90 | .use(Steps) | ||
91 | .use(Skeleton) | ||
92 | .use(Cell) | ||
93 | .use(CellGroup) | ||
94 | .use(Toast) | ||
95 | .use(Dialog) | ||
96 | .use(AddressList) | ||
97 | .use(AddressEdit) | ||
98 | .use(Checkbox) | ||
99 | .use(CheckboxGroup) | ||
100 | .use(Stepper) | ||
101 | .use(Switch) | ||
102 | .use(Badge) | ||
103 | .use(Picker) | ||
104 | .use(DatetimePicker) | ||
105 | .use(Empty) | ||
106 | .use(Sidebar) | ||
107 | .use(SidebarItem) | ||
108 | .use(IndexBar) | ||
109 | .use(IndexAnchor) | ||
110 | .use(ActionSheet) | ||
111 | .use(Calendar) | ||
112 | .use(SubmitBar); | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
1 | import wx from 'weixin-js-sdk'; | 1 | import { |
2 | 2 | isWeiXin | |
3 | wx.ready(function () { //通过ready接口处理成功验证 | 3 | } from '@/utils/utils'; |
4 | // config信息验证成功后会执行ready方法 | 4 | |
5 | wx.onMenuShareAppMessage({ // 分享给朋友 ,在config里面填写需要使用的JS接口列表,然后这个方法才可以用 | 5 | function wxSign() { |
6 | title: '这里是标题', // 分享标题 | 6 | return new Promise((resolve, reject) => { |
7 | desc: 'This is a test!', // 分享描述 | 7 | app.post({ |
8 | link: '链接', // 分享链接 | 8 | url: app.api.wxJsSign, |
9 | imgUrl: '图片', // 分享图标 | 9 | data: { |
10 | type: '', // 分享类型,music、video或link,不填默认为link | 10 | url: location.href |
11 | dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 | ||
12 | success: function () { | ||
13 | // 用户确认分享后执行的回调函数 | ||
14 | }, | 11 | }, |
15 | cancel: function () { | 12 | // mode: "custom" |
16 | // 用户取消分享后执行的回调函数 | 13 | }).then(res => { |
14 | if (!window.wx) { | ||
15 | return | ||
16 | } | ||
17 | wx.config({ | ||
18 | debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 | ||
19 | appId: res.appId, // 必填,公众号的唯一标识 | ||
20 | timestamp: res.timestamp, // 必填,生成签名的时间戳 | ||
21 | nonceStr: res.nonceStr, // 必填,生成签名的随机串 | ||
22 | signature: res.signature, // 必填,签名,见附录1 | ||
23 | jsApiList: [ | ||
24 | "updateAppMessageShareData", | ||
25 | "updateTimelineShareData", | ||
26 | "onMenuShareTimeline", | ||
27 | "onMenuShareAppMessage", | ||
28 | "chooseWXPay", | ||
29 | ] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 | ||
30 | }); | ||
31 | wx.ready(() => { | ||
32 | resolve() | ||
33 | }) | ||
34 | }); | ||
35 | }) | ||
36 | } | ||
37 | |||
38 | function setShare(title, description, image, url) { | ||
39 | wx.updateAppMessageShareData({ | ||
40 | title: title, // 分享标题 | ||
41 | desc: description, // 分享描述 | ||
42 | link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 | ||
43 | imgUrl: image, // 分享图标 | ||
44 | success() { | ||
45 | // 设置成功 | ||
46 | } | ||
47 | }); | ||
48 | |||
49 | |||
50 | wx.updateTimelineShareData({ | ||
51 | title: title, // 分享标题 | ||
52 | link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 | ||
53 | imgUrl: image, // 分享图标 | ||
54 | success() { | ||
55 | // 设置成功 | ||
56 | } | ||
57 | }); | ||
58 | } | ||
59 | |||
60 | |||
61 | let wechat = { | ||
62 | init() { | ||
63 | return new Promise((resolve, reject) => { | ||
64 | if (isWeiXin()) { | ||
65 | wxSign().then(() => { | ||
66 | resolve(); | ||
67 | }).catch(e => { | ||
68 | resolve(); | ||
69 | }); | ||
70 | } else { | ||
71 | resolve(); | ||
17 | } | 72 | } |
18 | }); | 73 | }); |
19 | wx.onMenuShareTimeline({ //分享朋友圈 | ||
20 | title: '标题', // 分享标题 | ||
21 | link: '链接', | ||
22 | imgUrl: '图片', // 分享图标 | ||
23 | success: function () { | ||
24 | // 用户确认分享后执行的回调函数 | ||
25 | }, | 74 | }, |
26 | cancel: function () { | 75 | wxShare(title, description, image, url) { |
27 | // 用户取消分享后执行的回调函数 | 76 | title = title || process.env.VUE_APP_MALL_NAME + ""; |
77 | description = description || ""; | ||
78 | image = image || ""; | ||
79 | url = url || location.href; | ||
80 | |||
81 | return new Promise((resolve, reject) => { | ||
82 | if (isWeiXin()) { | ||
83 | wx.onMenuShareAppMessage({ | ||
84 | title: title, // 分享标题 | ||
85 | desc: description, // 分享描述 | ||
86 | link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 | ||
87 | imgUrl: image, // 分享图标 | ||
88 | success: function () { | ||
89 | // 分享成功 | ||
90 | // alert("ShareApp") | ||
91 | resolve("ShareApp") | ||
92 | } | ||
93 | }); | ||
94 | |||
95 | wx.onMenuShareTimeline({ | ||
96 | title: title, // 分享标题 | ||
97 | link: url, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致 | ||
98 | imgUrl: image, // 分享图标 | ||
99 | success: function () { | ||
100 | // 分享成功 | ||
101 | // alert("ShareTimeline") | ||
102 | resolve("ShareTimeline") | ||
103 | } | ||
104 | }); | ||
28 | } | 105 | } |
29 | }); | 106 | }); |
30 | }); | ||
31 | wx.error(function (res) {//通过error接口处理失败验证 | ||
32 | // config信息验证失败会执行error函数 | ||
33 | }); | ||
34 | 107 | ||
108 | // if (isWeiXin()) { | ||
109 | // setShare(title, description, image, url); | ||
110 | // } | ||
111 | } | ||
112 | }; | ||
35 | 113 | ||
36 | wx.config({ | 114 | export default wechat; |
37 | debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 | ||
38 | appId: '', // 必填,公众号的唯一标识 | ||
39 | timestamp: '', // 必填,生成签名的时间戳 | ||
40 | nonceStr: '', // 必填,生成签名的随机串 | ||
41 | signature: '',// 必填,签名,见附录1 | ||
42 | jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 | ||
43 | }); | ||
... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or sign in to post a comment