From dfecc5efaa6fa81dbcf307f1e1b6759f3084e0d0 Mon Sep 17 00:00:00 2001 From: YOS-DRVOGPU6U78\Administrator <chenky0613@qq.com> Date: 星期一, 17 七月 2023 12:20:40 +0800 Subject: [PATCH] 增加utils工具 --- utils/common.js | 56 ++++++++ utils/upload.js | 70 +++++++++++ utils/request.js | 63 ++++++---- utils/storage.js | 32 +++++ pages/login/login.vue | 32 +++- utils/auth.js | 13 ++ utils/permission.js | 51 ++++++++ utils/errorCode.js | 6 + utils/constant.js | 8 + api/login.js | 16 ++ 10 files changed, 306 insertions(+), 41 deletions(-) diff --git a/api/login.js b/api/login.js index 039543a..13a4feb 100644 --- a/api/login.js +++ b/api/login.js @@ -1,8 +1,16 @@ -import request from "request"; - -export function login(account,passward) { +import request from '@/utils/request.js' +export function login(account, password) { return request({ 'url': '/login', - 'method' : 'post' + 'method': 'post', + 'data': { + 'username': account, + 'password': password + }, + 'header': { + 'Content-Type': 'application/json', + 'dataType': 'json', + 'Accept': 'application/json' + } }) } \ No newline at end of file diff --git a/pages/login/login.vue b/pages/login/login.vue index ce61a34..0ffba34 100644 --- a/pages/login/login.vue +++ b/pages/login/login.vue @@ -8,8 +8,8 @@ <u-form-item label="鐢ㄦ埛鍚�" labelWidth=65 prop="userInfo.account" borderBottom> <u--input v-model="userInfo.account" border="none" placeholder="璇疯緭鍏ョ敤鎴峰悕"></u--input> </u-form-item> - <u-form-item label="瀵嗙爜" labelWidth=65 prop="userInfo.passward"> - <u--input v-model="userInfo.passward" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" border="none" :password="showPassward" + <u-form-item label="瀵嗙爜" labelWidth=65 prop="userInfo.password"> + <u--input v-model="userInfo.password" placeholder="璇疯緭鍏ョ敤鎴峰瘑鐮�" border="none" :password="showPassward" @click="this.showPassward = !this.showPassward " suffixIcon="eye-fill" suffixIconStyle="color: #909399"></u--input> </u-form-item> @@ -21,13 +21,16 @@ </template> <script> + import { + login + } from '../../api/login' export default { data() { return { showPassward: true, userInfo: { account: '', - passward: '' + password: '' } } }, @@ -41,21 +44,32 @@ }) return } - - if (this.userInfo.passward == null || this.userInfo.passward == '') { + + if (this.userInfo.password == null || this.userInfo.password == '') { this.$refs.uToast.show({ message: '瀵嗙爜涓虹┖', type: 'error' }) return } - + console.log(this.userInfo) - - uni.navigateTo({ - url:'/pages/index/index' + login(this.userInfo.account, this.userInfo.password).then(response => { + console.log(response) + if (!response.result) { + this.$refs.uToast.show({ + message: response.msg, + type: 'error' + }) + return + } + uni.navigateTo({ + url:'/pages/index/index' + }) }) + + } } } diff --git a/utils/auth.js b/utils/auth.js new file mode 100644 index 0000000..9a7cc04 --- /dev/null +++ b/utils/auth.js @@ -0,0 +1,13 @@ +const TokenKey = 'App-Token' + +export function getToken() { + return uni.getStorageSync(TokenKey) +} + +export function setToken(token) { + return uni.setStorageSync(TokenKey, token) +} + +export function removeToken() { + return uni.removeStorageSync(TokenKey) +} diff --git a/utils/common.js b/utils/common.js index f447160..00d4137 100644 --- a/utils/common.js +++ b/utils/common.js @@ -1,6 +1,54 @@ +/** +* 鏄剧ず娑堟伅鎻愮ず妗� +* @param content 鎻愮ず鐨勬爣棰� +*/ export function toast(content) { - uni.showToast({ - icon:'none', - title:content - }) + uni.showToast({ + icon: 'none', + title: content + }) +} + +/** +* 鏄剧ず妯℃�佸脊绐� +* @param content 鎻愮ず鐨勬爣棰� +*/ +export function showConfirm(content) { + return new Promise((resolve, reject) => { + uni.showModal({ + title: '鎻愮ず', + content: content, + cancelText: '鍙栨秷', + confirmText: '纭畾', + success: function(res) { + resolve(res) + } + }) + }) +} + +/** +* 鍙傛暟澶勭悊 +* @param params 鍙傛暟 +*/ +export function tansParams(params) { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName] + var part = encodeURIComponent(propName) + "=" + if (value !== null && value !== "" && typeof (value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']' + var subPart = encodeURIComponent(params) + "=" + result += subPart + encodeURIComponent(value[key]) + "&" + } + } + } else { + result += part + encodeURIComponent(value) + "&" + } + } + } + return result } \ No newline at end of file diff --git a/utils/constant.js b/utils/constant.js new file mode 100644 index 0000000..8becd84 --- /dev/null +++ b/utils/constant.js @@ -0,0 +1,8 @@ +const constant = { + avatar: 'vuex_avatar', + name: 'vuex_name', + roles: 'vuex_roles', + permissions: 'vuex_permissions' + } + + export default constant diff --git a/utils/errorCode.js b/utils/errorCode.js new file mode 100644 index 0000000..d2111ee --- /dev/null +++ b/utils/errorCode.js @@ -0,0 +1,6 @@ +export default { + '401': '璁よ瘉澶辫触锛屾棤娉曡闂郴缁熻祫婧�', + '403': '褰撳墠鎿嶄綔娌℃湁鏉冮檺', + '404': '璁块棶璧勬簮涓嶅瓨鍦�', + 'default': '绯荤粺鏈煡閿欒锛岃鍙嶉缁欑鐞嗗憳' +} diff --git a/utils/permission.js b/utils/permission.js new file mode 100644 index 0000000..17969f2 --- /dev/null +++ b/utils/permission.js @@ -0,0 +1,51 @@ +import store from '@/store' + +/** + * 瀛楃鏉冮檺鏍¢獙 + * @param {Array} value 鏍¢獙鍊� + * @returns {Boolean} + */ +export function checkPermi(value) { + if (value && value instanceof Array && value.length > 0) { + const permissions = store.getters && store.getters.permissions + const permissionDatas = value + const all_permission = "*:*:*" + + const hasPermission = permissions.some(permission => { + return all_permission === permission || permissionDatas.includes(permission) + }) + + if (!hasPermission) { + return false + } + return true + } else { + console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`) + return false + } +} + +/** + * 瑙掕壊鏉冮檺鏍¢獙 + * @param {Array} value 鏍¢獙鍊� + * @returns {Boolean} + */ +export function checkRole(value) { + if (value && value instanceof Array && value.length > 0) { + const roles = store.getters && store.getters.roles + const permissionRoles = value + const super_admin = "admin" + + const hasRole = roles.some(role => { + return super_admin === role || permissionRoles.includes(role) + }) + + if (!hasRole) { + return false + } + return true + } else { + console.error(`need roles! Like checkRole="['admin','editor']"`) + return false + } +} \ No newline at end of file diff --git a/utils/request.js b/utils/request.js index c2bd291..3cb3c0d 100644 --- a/utils/request.js +++ b/utils/request.js @@ -1,42 +1,57 @@ -const { error } = require("jquery") -const { toast } = require("./common") +import config from '@/config' +import { + getToken +} from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { + toast, + showConfirm, + tansParams +} from '@/utils/common' let timeout = 10000 const baseUrl = config.baseUrl const request = config => { - return new Promise((resolve,reject) => { + // 鏄惁闇�瑕佽缃� token + // const isToken = (config.headers || {}).isToken === false + // config.header = config.header || {} + // if (getToken() && !isToken) { + // config.header['Authorization'] = 'Bearer ' + getToken() + // } + // get璇锋眰鏄犲皠params鍙傛暟 + if (config.params) { + let url = config.url + '?' + tansParams(config.params) + url = url.slice(0, -1) + config.url = url + } + return new Promise((resolve, reject) => { uni.request({ - method:config.method || 'GET', - timeout:config.timeoue || timeout, - url:config.baseUrl || baseUrl + config.url, - data:config.data, - header: config.header || {'Content-Type': 'application/json'}, + method: config.method || 'get', + timeout: config.timeout || timeout, + url: config.baseUrl || baseUrl + config.url, + data: config.data, + header: config.header, dataType: 'json' }).then(response => { - let [error,res] = response - if(error) { - toast('缃戠粶寮傚父,璇风◢鍚庨噸璇�') - return + if (response.statusCode === 200) { + resolve(response.data) } - const result = res.data.result || true - const msg = errorCode[code] || res.data.msg || ErrorCode['defalut'] - - if(!res) { - toast(msg) - return - } - resolve(res.data) }).catch(error => { - let {message} = error - if(message === 'Network Error') { + let { + message + } = error + if (message === 'Network Error') { message = '鍚庣鎺ュ彛杩炴帴寮傚父' - } else if(message.includes('timeout')) { + } else if (message.includes('timeout')) { message = '绯荤粺鎺ュ彛璇锋眰瓒呮椂' } else if (message.includes('Request failed with status code')) { message = '绯荤粺鎺ュ彛' + message.substr(message.length - 3) + '寮傚父' } toast(message) + reject(error) }) }) -} \ No newline at end of file +} + +export default request \ No newline at end of file diff --git a/utils/storage.js b/utils/storage.js new file mode 100644 index 0000000..4c5fdec --- /dev/null +++ b/utils/storage.js @@ -0,0 +1,32 @@ +import constant from './constant' + +// 瀛樺偍鍙橀噺鍚� +let storageKey = 'storage_data' + +// 瀛樺偍鑺傜偣鍙橀噺鍚� +let storageNodeKeys = [constant.avatar, constant.name, constant.roles, constant.permissions] + +const storage = { + set: function(key, value) { + if (storageNodeKeys.indexOf(key) != -1) { + let tmp = uni.getStorageSync(storageKey) + tmp = tmp ? tmp : {} + tmp[key] = value + uni.setStorageSync(storageKey, tmp) + } + }, + get: function(key) { + let storageData = uni.getStorageSync(storageKey) || {} + return storageData[key] || "" + }, + remove: function(key) { + let storageData = uni.getStorageSync(storageKey) || {} + delete storageData[key] + uni.setStorageSync(storageKey, storageData) + }, + clean: function() { + uni.removeStorageSync(storageKey) + } +} + +export default storage diff --git a/utils/upload.js b/utils/upload.js new file mode 100644 index 0000000..740387e --- /dev/null +++ b/utils/upload.js @@ -0,0 +1,70 @@ +import store from '@/store' +import config from '@/config' +import { getToken } from '@/utils/auth' +import errorCode from '@/utils/errorCode' +import { toast, showConfirm, tansParams } from '@/utils/common' + +let timeout = 10000 +const baseUrl = config.baseUrl + +const upload = config => { + // 鏄惁闇�瑕佽缃� token + const isToken = (config.headers || {}).isToken === false + config.header = config.header || {} + if (getToken() && !isToken) { + config.header['Authorization'] = 'Bearer ' + getToken() + } + // get璇锋眰鏄犲皠params鍙傛暟 + if (config.params) { + let url = config.url + '?' + tansParams(config.params) + url = url.slice(0, -1) + config.url = url + } + return new Promise((resolve, reject) => { + uni.uploadFile({ + timeout: config.timeout || timeout, + url: baseUrl + config.url, + filePath: config.filePath, + name: config.name || 'file', + header: config.header, + formData: config.formData, + success: (res) => { + let result = JSON.parse(res.data) + const code = result.code || 200 + const msg = errorCode[code] || result.msg || errorCode['default'] + if (code === 200) { + resolve(result) + } else if (code == 401) { + showConfirm("鐧诲綍鐘舵�佸凡杩囨湡锛屾偍鍙互缁х画鐣欏湪璇ラ〉闈紝鎴栬�呴噸鏂扮櫥褰�?").then(res => { + if (res.confirm) { + store.dispatch('LogOut').then(res => { + uni.reLaunch({ url: '/pages/login/login' }) + }) + } + }) + reject('鏃犳晥鐨勪細璇濓紝鎴栬�呬細璇濆凡杩囨湡锛岃閲嶆柊鐧诲綍銆�') + } else if (code === 500) { + toast(msg) + reject('500') + } else if (code !== 200) { + toast(msg) + reject(code) + } + }, + fail: (error) => { + let { message } = error + if (message == 'Network Error') { + message = '鍚庣鎺ュ彛杩炴帴寮傚父' + } else if (message.includes('timeout')) { + message = '绯荤粺鎺ュ彛璇锋眰瓒呮椂' + } else if (message.includes('Request failed with status code')) { + message = '绯荤粺鎺ュ彛' + message.substr(message.length - 3) + '寮傚父' + } + toast(message) + reject(error) + } + }) + }) +} + +export default upload -- Gitblit v1.9.3