@@ -0,0 +1,24 @@ | |||||
<script> | |||||
export default { | |||||
onLaunch: function() { | |||||
}, | |||||
onShow: function() { | |||||
}, | |||||
onHide: function() { | |||||
} | |||||
} | |||||
</script> | |||||
<style lang="scss"> | |||||
/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */ | |||||
@import "uview-ui/index.scss"; | |||||
.uni-tabbar-bottom{ | |||||
.uni-tabbar{ | |||||
box-shadow: 0px -3px 9px 0px rgba(0,0,0,0.06), 0px 4px 4px 0px rgba(0,0,0,0.01); | |||||
} | |||||
} | |||||
uni-page-body{ | |||||
height: 100%; | |||||
background-color: #F6F8FA; | |||||
} | |||||
</style> |
@@ -0,0 +1,10 @@ | |||||
import http from '@/http/api.js' | |||||
// 获取校历事件数据 | |||||
export const getSchoolCalendarlist = (params) => { | |||||
return http.request({ | |||||
url: '/api/blade-basic-data/semester/schoolCalendarlist', | |||||
method: 'get', | |||||
params | |||||
}) | |||||
} |
@@ -0,0 +1,102 @@ | |||||
import http from '@/http/api.js' | |||||
// 获取token | |||||
const token = (tenantId, username, password, type) => { | |||||
return http.request({ | |||||
url: '/api/blade-auth/oauth/token', | |||||
method: 'POST', | |||||
header: { | |||||
'Tenant-Id': tenantId | |||||
}, | |||||
params: { | |||||
tenantId, | |||||
username, | |||||
password, | |||||
grant_type: "password", | |||||
scope: "all", | |||||
type | |||||
} | |||||
}) | |||||
} | |||||
const getTenantId = (params) => { | |||||
return http.request({ | |||||
url: '/api/blade-auth/oauth/getTenantId', | |||||
method: 'get', | |||||
params: { | |||||
...params | |||||
} | |||||
}) | |||||
} | |||||
const refreshToken = (refresh_token, tenantId) => { | |||||
return http.request({ | |||||
url: '/api/blade-auth/oauth/token', | |||||
method: 'post', | |||||
header: { | |||||
'Tenant-Id': tenantId | |||||
}, | |||||
params: { | |||||
tenantId, | |||||
refresh_token, | |||||
grant_type: "refresh_token", | |||||
scope: "all", | |||||
} | |||||
}) | |||||
} | |||||
// 获取用户信息 | |||||
const userInfo = () => { | |||||
return http.request({ | |||||
url: '/api/blade-user/info', | |||||
method: 'GET', | |||||
}) | |||||
} | |||||
// 获取用户信息 | |||||
export const getUser = (id) => { | |||||
return http.request({ | |||||
url: '/api/blade-user/detail', | |||||
method: 'GET', | |||||
params: { id } | |||||
}) | |||||
} | |||||
export const getUserInfo = () => { | |||||
return http.request({ | |||||
url: '/api/blade-user/info', | |||||
method: 'get', | |||||
}) | |||||
} | |||||
/* 修改用户信息 */ | |||||
const updateInfo = (row) => { | |||||
return http.request({ | |||||
url: '/api/blade-user/update-info', | |||||
method: 'post', | |||||
data: row | |||||
}) | |||||
} | |||||
// 修改密码 | |||||
const updatePassword = (data) => { | |||||
return http.request({ | |||||
url: '/api/blade-user/update-password', | |||||
method: 'post', | |||||
params: data | |||||
}) | |||||
} | |||||
// 修改密码 | |||||
const passwordCheck = (data) => { | |||||
return http.request({ | |||||
url: '/api/blade-user/passwordCheck', | |||||
method: 'post', | |||||
params: data | |||||
}) | |||||
} | |||||
export default { | |||||
token, | |||||
userInfo, | |||||
refreshToken, | |||||
getTenantId, | |||||
updatePassword, | |||||
updateInfo, | |||||
passwordCheck | |||||
} |
@@ -0,0 +1,197 @@ | |||||
<script> | |||||
import http from '@/http/api.js' | |||||
import { | |||||
options | |||||
} from '@/http/config.js'; | |||||
import { | |||||
Base64 | |||||
} from '@/utils/base64.js'; | |||||
import { | |||||
clientId, | |||||
clientSecret | |||||
} from '@/common/setting' | |||||
export default{ | |||||
methods:{ | |||||
// 暂存一个跨页面变量 (与 this.GET_PARAM 成对使用) | |||||
SET_PARAM(val) { | |||||
this.SET_GLOBAL('pageParam', val) | |||||
}, | |||||
// 获取之前暂存的跨页面变量 (与 this.SET_PARAM 成对使用) | |||||
GET_PARAM() { | |||||
return this.GET_GLOBAL('pageParam') | |||||
}, | |||||
// 进入某个页面 | |||||
NAV_TO(url, param, usePageParam) { | |||||
uni.navigateTo({ | |||||
url: this.handleNav(url, param, usePageParam) | |||||
}) | |||||
}, | |||||
// 返回上个页面 | |||||
// delta 参数为返回的次数 | |||||
NAV_BACK(delta = 1) { | |||||
uni.navigateBack({ | |||||
delta | |||||
}) | |||||
}, | |||||
// 跳转到某个页面,跳转后无法返回 | |||||
JUMP_TO(url, param, usePageParam) { | |||||
uni.redirectTo({ | |||||
url: this.handleNav(url, param, usePageParam) | |||||
}) | |||||
}, | |||||
// 转到某个 Tab 页 | |||||
TAB_TO(url, param) { | |||||
uni.switchTab({ | |||||
url: this.handleNav(url, param, true) | |||||
}) | |||||
}, | |||||
// 【内部方法】处理页面跳转 url 和参数 | |||||
handleNav(url, param, usePageParam) { | |||||
let query = '' | |||||
if (param && usePageParam) { | |||||
this.SET_PARAM(param) | |||||
} else if (param && !usePageParam) { | |||||
query += '?' + Object.entries(param).filter(([k, v]) => k && v).map(([k, v]) => k + '=' + v).join('&') | |||||
} | |||||
return url + query | |||||
}, | |||||
// 设置页面标题 | |||||
SET_TITLE(title) { | |||||
uni.setNavigationBarTitle({ | |||||
title | |||||
}) | |||||
}, | |||||
// 监听一个全局事件 | |||||
ON(name, func) { | |||||
uni.$on(name, func) | |||||
}, | |||||
// 仅单次监听一个全局事件 | |||||
ONCE(name, func) { | |||||
uni.$once(name, func) | |||||
}, | |||||
// 触发一个全局事件 | |||||
EMIT(name, data) { | |||||
uni.$emit(name, data) | |||||
}, | |||||
// 移除全局事件监听器 | |||||
OFF(name, func) { | |||||
uni.$off(name, func) | |||||
}, | |||||
// 二次确认提示框 | |||||
CONFIRM(content='是否确认执行此操作?'){ | |||||
return new Promise((resolve)=>{ | |||||
uni.showModal({ | |||||
title: '提示信息', | |||||
content: content, | |||||
cancelText: "取消", | |||||
confirmText: "确认", | |||||
confirmColor: '#F2C827', | |||||
cancelColor: '#9E9E9E', | |||||
success: function (res) { | |||||
if (res.confirm) { | |||||
resolve(true) | |||||
} else if (res.cancel) { | |||||
resolve(false) | |||||
} | |||||
} | |||||
}); | |||||
}) | |||||
}, | |||||
TOAST(title){ | |||||
uni.showToast({ | |||||
icon: "none", | |||||
title, | |||||
duration: 2000, | |||||
}); | |||||
}, | |||||
UPLOAD_FILE(filePath){ | |||||
let that = this | |||||
// 假设有token值需要在头部需要携带 | |||||
let header = {} | |||||
let accessToken = uni.getStorageSync('accessToken'); | |||||
if (accessToken) { | |||||
header['Blade-Auth'] = 'bearer ' + accessToken; | |||||
} | |||||
// 客户端认证参数 | |||||
header['Authorization'] = 'Basic ' + Base64.encode(clientId + ':' + clientSecret); | |||||
console.log(filePath) | |||||
return new Promise(resovle=>{ | |||||
uni.uploadFile({ | |||||
url:options.baseURL + '/api/blade-resource/oss/endpoint/put-uplaod-file?bucketName=', | |||||
filePath, | |||||
name:'file', | |||||
header, | |||||
success(e){ | |||||
if(e.statusCode == 200){ | |||||
let res = JSON.parse(e.data) | |||||
if(res.code == 200){ | |||||
resovle(res.data) | |||||
}else{ | |||||
resovle(res.msg) | |||||
} | |||||
}else{ | |||||
resovle(false) | |||||
} | |||||
}, | |||||
fail(e){ | |||||
console.log('fail',e) | |||||
resovle(false) | |||||
}, | |||||
}) | |||||
}) | |||||
}, | |||||
DELETE_FILE(attachIds){ | |||||
return http.request({ | |||||
url: '/api/blade-resource/oss/endpoint/remove-file-attachIds', | |||||
method: 'post', | |||||
params:{attachIds} | |||||
}) | |||||
}, | |||||
// 显示 loading 提示框 | |||||
// title 为提示文字 | |||||
// mask 为是否禁止点击 | |||||
LOADING(title, mask = true) { | |||||
uni.showLoading({ | |||||
title, | |||||
mask | |||||
}) | |||||
}, | |||||
// 停止展示 loading 提示框 | |||||
HIDE_LOADING() { | |||||
uni.hideLoading() | |||||
}, | |||||
// url获取文件流 | |||||
DOWNLOAD_FILE(url){ | |||||
return uni.downloadFile({ | |||||
url | |||||
}) | |||||
}, | |||||
//复制链接 | |||||
COPYLINK(item){ | |||||
return new Promise((resolve)=>{ | |||||
uni.setClipboardData({ | |||||
data: item, // 要复制的路径 | |||||
success: function(res) { | |||||
resolve(true) | |||||
// uni.getClipboardData({ | |||||
// success: function(data) { | |||||
// resolve(true) | |||||
// }, | |||||
// fail: function(data1) { | |||||
// resolve(false) | |||||
// } | |||||
// }); | |||||
} | |||||
}); | |||||
}) | |||||
}, | |||||
}, | |||||
} | |||||
</script> |
@@ -0,0 +1,58 @@ | |||||
/** | |||||
* 全局变量配置 | |||||
*/ | |||||
// #ifdef H5 | |||||
let origin = window.location.origin | |||||
console.log(window.location.origin) | |||||
// #endif | |||||
module.exports = { | |||||
// 应用名 | |||||
name: 'Rider', | |||||
// 应用logo,支持本地路径和网络路径 | |||||
logo: '/static/images/icon/logo.png', | |||||
// 版本号 | |||||
version: '2.0.0', | |||||
version: '2.0.1', | |||||
// H5接口Url | |||||
// #ifdef H5 | |||||
devUrl: `${origin}/`, | |||||
prodUrl: `${origin}/`, | |||||
// #endif | |||||
// 小程序接口Url | |||||
// #ifndef H5 | |||||
// devUrl: 'http://192.168.10.46', | |||||
devUrl: 'https://www.bjjyp.org.cn/rider',//开发环境接口Url | |||||
prodUrl: `https://www.bjjyp.org.cn/rider`,//线上环境接口Url | |||||
// prodUrl: 'http://192.168.100.236:1888', | |||||
// prodUrl: 'http://114.255.136.189:1888', | |||||
// #endif | |||||
// 后端数据的接收方式application/json;charset=UTF-8或者application/x-www-form-urlencoded;charset=UTF-8 | |||||
contentType: 'application/json;charset=UTF-8', | |||||
// 后端返回状态码 | |||||
codeName: 'code', | |||||
// 操作正常code | |||||
successCode: 200, | |||||
// 登录失效code | |||||
invalidCode: 401, | |||||
// 客户端ID | |||||
clientId: 'rider', | |||||
// 客户端密钥 | |||||
clientSecret: 'rider_secret', | |||||
// token过期时间 | |||||
tokenTime: 3000, | |||||
switchMode: true, // 是否开启部门切换模式 | |||||
//本地 | |||||
previewUrl: 'http://cp.qjkjedu.com/onlinePreview', | |||||
//金隅生产 | |||||
// previewUrl: 'https://www.bjjyp.org.cn/preview/onlinePreview', | |||||
} |
@@ -0,0 +1,88 @@ | |||||
import { | |||||
devUrl, | |||||
clientId, | |||||
clientSecret | |||||
} from '@/common/setting' | |||||
import { | |||||
options | |||||
} from '@/http/config.js'; | |||||
import { | |||||
Base64 | |||||
} from '@/utils/base64.js'; | |||||
import Request from '@/utils/luch-request/index.js'; | |||||
const http = new Request(options); | |||||
http.interceptors.request.use((config) => { // 可使用async await 做异步操作 | |||||
// 假设有token值需要在头部需要携带 | |||||
let accessToken = uni.getStorageSync('accessToken'); | |||||
if (accessToken) { | |||||
config.header['Blade-Auth'] = 'bearer ' + accessToken; | |||||
} | |||||
// 客户端认证参数 | |||||
config.header['Authorization'] = 'Basic ' + Base64.encode(clientId + ':' + clientSecret); | |||||
// #ifndef H5 | |||||
let url = config.url | |||||
if (process.env.NODE_ENV == 'development' && !url.startsWith("http")) { | |||||
// url = url.substring(url.indexOf('/api') + 4) | |||||
config.url = url | |||||
} | |||||
// #endif | |||||
// 额外参数 | |||||
// config.data = config.data || {}; | |||||
// config.data.pf = uni.getSystemInfoSync().platform; | |||||
// config.data.sys = uni.getSystemInfoSync().system; | |||||
// 演示custom 用处 | |||||
// if (config.custom.auth) { | |||||
// config.header.token = 'token' | |||||
// } | |||||
// if (config.custom.loading) { | |||||
// uni.showLoading() | |||||
// } | |||||
/** | |||||
/* 演示 | |||||
if (!token) { // 如果token不存在,return Promise.reject(config) 会取消本次请求 | |||||
return Promise.reject(config) | |||||
} | |||||
**/ | |||||
return config | |||||
}, config => { // 可使用async await 做异步操作 | |||||
return Promise.reject(config) | |||||
}) | |||||
http.interceptors.response.use((response) => { | |||||
// 若有数据返回则通过 | |||||
if (response.data.access_token || response.data.key) { | |||||
return response.data | |||||
} | |||||
// 服务端返回的状态码不等于200,则reject() | |||||
if (response.data.code && response.data.code !== 200) { | |||||
setTimeout(()=>{ | |||||
uni.showToast({ | |||||
title: response.data.msg, | |||||
icon: 'none' | |||||
}); | |||||
}) | |||||
return Promise.reject(response); | |||||
} | |||||
return response.data; | |||||
}, (response) => { | |||||
/* 对响应错误做点什么 (statusCode !== 200)*/ | |||||
setTimeout(()=>{ | |||||
uni.showToast({ | |||||
title: response.data.msg || response.data.error_description || '网络错误', | |||||
icon: 'none' | |||||
}); | |||||
}) | |||||
if (response.statusCode == 401) { | |||||
const pages = getCurrentPages() | |||||
const currentPage = pages[pages.length - 1] | |||||
uni.redirectTo({ | |||||
url: `/pages/login/login?redirect=/${currentPage.route}` | |||||
}) | |||||
} | |||||
return Promise.reject(response) | |||||
}) | |||||
export default http; |
@@ -0,0 +1,49 @@ | |||||
import { | |||||
devUrl, | |||||
prodUrl, | |||||
contentType | |||||
} from '@/common/setting' | |||||
console.log('--',process.env.NODE_ENV) | |||||
var options = { | |||||
baseURL: process.env.NODE_ENV === 'development' ? devUrl : prodUrl, | |||||
header: { | |||||
'Content-Type': contentType | |||||
}, | |||||
method: 'POST', | |||||
dataType: 'json', | |||||
// #ifndef MP-ALIPAY || APP-PLUS | |||||
responseType: 'text', | |||||
// #endif | |||||
// 注:如果局部custom与全局custom有同名属性,则后面的属性会覆盖前面的属性,相当于Object.assign(全局,局部) | |||||
custom: {}, // 全局自定义参数默认值 | |||||
// #ifdef MP-ALIPAY || MP-WEIXIN | |||||
timeout: 30000, | |||||
// #endif | |||||
// #ifdef APP-PLUS | |||||
sslVerify: true, | |||||
// #endif | |||||
// #ifdef H5 | |||||
// 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+) | |||||
//withCredentials: false, | |||||
// #endif | |||||
// #ifdef APP-PLUS | |||||
firstIpv4: false, // DNS解析时优先使用ipv4 仅 App-Android 支持 (HBuilderX 2.8.0+) | |||||
// #endif | |||||
// 局部优先级高于全局,返回当前请求的task,options。请勿在此处修改options。非必填 | |||||
// getTask: (task, options) => { | |||||
// 相当于设置了请求超时时间500ms | |||||
// setTimeout(() => { | |||||
// task.abort() | |||||
// }, 500) | |||||
// }, | |||||
// 全局自定义验证器。参数为statusCode 且必存在,不用判断空情况。 | |||||
// validateStatus: (statusCode) => { // statusCode 必存在。此处示例为全局默认配置 | |||||
// return statusCode >= 200 && statusCode < 300 | |||||
// } | |||||
// 预览地址 | |||||
// previewUrl: 'https://www.bjjyp.org.cn/preview/onlinePreview', | |||||
// previewUrl: 'http://114.255.136.189:6696/onlinePreview', | |||||
// previewUrl: 'http://192.168.100.236:85/onlinePreview', | |||||
previewUrl: 'http://cp.qjkjedu.com/onlinePreview', | |||||
}; | |||||
export { options }; |
@@ -0,0 +1,18 @@ | |||||
// 获取api目录所有js文件 | |||||
const files = require.context('@/api', false, /\.js$/) | |||||
// 此处第二个参数vm,就是我们在页面使用的this,可以通过vm获取vuex等操作 | |||||
const install = (Vue, vm) => { | |||||
// 将各个定义的接口名称,统一放进对象挂载到vm.$u.api下(因为vm就是this,也即this.$u.api) | |||||
// 自动将所有api挂载到vm.$u.api中 | |||||
vm.$u.api = {} | |||||
files.keys().forEach(key => { | |||||
const api = files(key).default | |||||
for (let item in api) { | |||||
vm.$u.api[item] = api[item] | |||||
} | |||||
}) | |||||
} | |||||
export default { | |||||
install | |||||
} |
@@ -0,0 +1,20 @@ | |||||
<!DOCTYPE html> | |||||
<html lang="en"> | |||||
<head> | |||||
<meta charset="UTF-8" /> | |||||
<script> | |||||
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || | |||||
CSS.supports('top: constant(a)')) | |||||
document.write( | |||||
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + | |||||
(coverSupport ? ', viewport-fit=cover' : '') + '" />') | |||||
</script> | |||||
<title></title> | |||||
<!--preload-links--> | |||||
<!--app-context--> | |||||
</head> | |||||
<body> | |||||
<div id="app"><!--app-html--></div> | |||||
<script type="module" src="/main.js"></script> | |||||
</body> | |||||
</html> |
@@ -0,0 +1,46 @@ | |||||
import App from './App' | |||||
import Vue from 'vue' | |||||
import store from '@/store'; | |||||
import mixins from '@/common/mixins.vue' | |||||
Vue.mixin(mixins) | |||||
// 引入vuex | |||||
Vue.prototype.$u = {} | |||||
const vuexStore = require("@/store/$u.mixin.js"); | |||||
Vue.mixin(vuexStore); | |||||
// 引入uview-ui | |||||
import uView from "uview-ui"; | |||||
Vue.use(uView); | |||||
// #ifndef VUE3 | |||||
import './uni.promisify.adaptor' | |||||
Vue.config.productionTip = false | |||||
App.mpType = 'app' | |||||
const app = new Vue({ | |||||
...App | |||||
}) | |||||
app.$mount() | |||||
// #endif | |||||
// #ifdef VUE3 | |||||
import { createSSRApp } from 'vue' | |||||
export function createApp() { | |||||
const app = createSSRApp(App) | |||||
return { | |||||
app | |||||
} | |||||
} | |||||
// #endif | |||||
// 接口集中管理 | |||||
import httpInstall from '@/http/install.js' | |||||
Vue.use(httpInstall, app) | |||||
import http from '@/http/api.js' | |||||
Vue.prototype.$http = http | |||||
// 公共函数 | |||||
import globalFunc from '@/utils/func.js' | |||||
Vue.use(globalFunc, app); |
@@ -0,0 +1,72 @@ | |||||
{ | |||||
"name" : "monitorMobile", | |||||
"appid" : "", | |||||
"description" : "", | |||||
"versionName" : "1.0.0", | |||||
"versionCode" : "100", | |||||
"transformPx" : false, | |||||
/* 5+App特有相关 */ | |||||
"app-plus" : { | |||||
"usingComponents" : true, | |||||
"nvueStyleCompiler" : "uni-app", | |||||
"compilerVersion" : 3, | |||||
"splashscreen" : { | |||||
"alwaysShowBeforeRender" : true, | |||||
"waiting" : true, | |||||
"autoclose" : true, | |||||
"delay" : 0 | |||||
}, | |||||
/* 模块配置 */ | |||||
"modules" : {}, | |||||
/* 应用发布信息 */ | |||||
"distribute" : { | |||||
/* android打包配置 */ | |||||
"android" : { | |||||
"permissions" : [ | |||||
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", | |||||
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", | |||||
"<uses-permission android:name=\"android.permission.VIBRATE\"/>", | |||||
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>", | |||||
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", | |||||
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", | |||||
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", | |||||
"<uses-permission android:name=\"android.permission.CAMERA\"/>", | |||||
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", | |||||
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", | |||||
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", | |||||
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", | |||||
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", | |||||
"<uses-feature android:name=\"android.hardware.camera\"/>", | |||||
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" | |||||
] | |||||
}, | |||||
/* ios打包配置 */ | |||||
"ios" : {}, | |||||
/* SDK配置 */ | |||||
"sdkConfigs" : {} | |||||
} | |||||
}, | |||||
/* 快应用特有相关 */ | |||||
"quickapp" : {}, | |||||
/* 小程序特有相关 */ | |||||
"mp-weixin" : { | |||||
"appid" : "", | |||||
"setting" : { | |||||
"urlCheck" : false | |||||
}, | |||||
"usingComponents" : true | |||||
}, | |||||
"mp-alipay" : { | |||||
"usingComponents" : true | |||||
}, | |||||
"mp-baidu" : { | |||||
"usingComponents" : true | |||||
}, | |||||
"mp-toutiao" : { | |||||
"usingComponents" : true | |||||
}, | |||||
"uniStatistics" : { | |||||
"enable" : false | |||||
}, | |||||
"vueVersion" : "2" | |||||
} |
@@ -0,0 +1,10 @@ | |||||
{ | |||||
"dependencies": { | |||||
"uview-ui": "^2.0.36", | |||||
"vuex": "^3.6.2" | |||||
}, | |||||
"devDependencies": { | |||||
"sass": "^1.77.8", | |||||
"sass-loader": "^10.5.2" | |||||
} | |||||
} |
@@ -0,0 +1,93 @@ | |||||
{ | |||||
"easycom": { | |||||
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" | |||||
}, | |||||
"tabBar":{ | |||||
"color":"#777777", | |||||
"selectedColor":"#2388FF", | |||||
"backgroundColor":"#FFFFFF", | |||||
"borderStyle":"white", | |||||
"fontSize":"18rpx", | |||||
"list": [ | |||||
{ | |||||
"pagePath": "pages/home", | |||||
"iconPath": "/static/image/tabbar/home.png", | |||||
"selectedIconPath": "/static/image/tabbar/home.png", | |||||
"text": "首页" | |||||
}, | |||||
{ | |||||
"pagePath": "pages/attendanceCall/index", | |||||
"iconPath": "/static/image/tabbar/attendanceCall.png", | |||||
"selectedIconPath": "/static/image/tabbar/attendanceCall.png", | |||||
"text": "考勤点名" | |||||
}, | |||||
{ | |||||
"pagePath": "pages/earlyWarning/index", | |||||
"iconPath": "/static/image/tabbar/earlyWarning_active.png", | |||||
"selectedIconPath": "/static/image/tabbar/earlyWarning_active.png", | |||||
"text": "预警巡警" | |||||
}, | |||||
{ | |||||
"pagePath": "pages/my/index", | |||||
"iconPath": "/static/image/tabbar/my.png", | |||||
"selectedIconPath": "/static/image/tabbar/my.png", | |||||
"text": "我的" | |||||
} | |||||
] | |||||
}, | |||||
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages | |||||
// 首页 | |||||
{ | |||||
"path": "pages/home", | |||||
"style": { | |||||
"navigationBarTitleText": "首页" | |||||
} | |||||
}, | |||||
// 考勤点名 | |||||
{ | |||||
"path": "pages/attendanceCall/index", | |||||
"style": { | |||||
"navigationBarTitleText": "考勤点名" | |||||
} | |||||
}, | |||||
// { | |||||
// "path": "pages/attendanceCall/rollCall/index", | |||||
// "style": { | |||||
// "navigationBarTitleText": "点名" | |||||
// } | |||||
// }, | |||||
// { | |||||
// "path": "pages/attendanceCall/returnBed/index", | |||||
// "style": { | |||||
// "navigationBarTitleText": "归寝" | |||||
// } | |||||
// }, | |||||
// { | |||||
// "path": "pages/attendanceCall/passengerFlow/index", | |||||
// "style": { | |||||
// "navigationBarTitleText": "客流" | |||||
// } | |||||
// }, | |||||
// 预警巡警 | |||||
{ | |||||
"path": "pages/earlyWarning/index", | |||||
"style": { | |||||
"navigationBarTitleText": "预警巡警" | |||||
} | |||||
}, | |||||
// 我的 | |||||
{ | |||||
"path": "pages/my/index", | |||||
"style": { | |||||
"navigationBarTitleText": "我的" | |||||
} | |||||
} | |||||
], | |||||
"globalStyle": { | |||||
"navigationBarTextStyle": "black", | |||||
"navigationBarTitleText": "校园监控预警平台", | |||||
"navigationBarBackgroundColor": "#fff", | |||||
"backgroundColor": "#F8F8F8" | |||||
}, | |||||
"uniIdRouter": {} | |||||
} |
@@ -0,0 +1,48 @@ | |||||
<template> | |||||
<view style="height: 100%;"> | |||||
<u-tabs :list="tabsList" @click="tabsClick" :activeStyle="{ | |||||
color: '#000000', | |||||
}" itemStyle="height:84rpx;width:33.33%;box-sizing:border-box;background:#fff;border-top:1rpx solid rgba(0,0,0,0.03)"></u-tabs> | |||||
<view style="height: calc(100% - 84rpx);"> | |||||
<component :is="componentName"/> | |||||
</view> | |||||
</view> | |||||
</template> | |||||
<script> | |||||
import passengerFlow from "./passengerFlow/index.vue" | |||||
import returnBed from "./returnBed/index.vue" | |||||
import rollCall from "./rollCall/index.vue" | |||||
export default { | |||||
components:{ | |||||
passengerFlow,returnBed,rollCall | |||||
}, | |||||
data() { | |||||
return { | |||||
tabsList: [{ | |||||
name: "点名", | |||||
value: 'rollCall' | |||||
}, | |||||
{ | |||||
name: "归寝", | |||||
value: 'returnBed' | |||||
}, | |||||
{ | |||||
name: "客流", | |||||
value: 'passengerFlow' | |||||
}, | |||||
], | |||||
componentName:'rollCall' | |||||
} | |||||
}, | |||||
methods: { | |||||
tabsClick(item) { | |||||
this.componentName = item.value | |||||
} | |||||
} | |||||
} | |||||
</script> | |||||
<style> | |||||
</style> |
@@ -0,0 +1,22 @@ | |||||
<template> | |||||
<view> | |||||
客流 | |||||
</view> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
data() { | |||||
return { | |||||
} | |||||
}, | |||||
methods: { | |||||
}, | |||||
} | |||||
</script> | |||||
<style> | |||||
</style> |
@@ -0,0 +1,124 @@ | |||||
<template> | |||||
<view style="height: 100%;"> | |||||
<u-empty marginTop="100rpx" :show="false" mode="list" text="暂无数据"></u-empty> | |||||
<u-list @scrolltolower="scrolltolower" style="height: calc(100% - 0rpx);"> | |||||
<u-list-item v-for="(item, index) in list" :key="index"> | |||||
<view class="whiteCard"> | |||||
<view class="row1"> | |||||
<text class="room">寝室302</text> | |||||
<view class="peopleNum"> | |||||
<image src="@/static/image/peopleNum.png" mode=""></image> | |||||
<text>寝室人数:6</text> | |||||
</view> | |||||
</view> | |||||
<view class="row2"> | |||||
<text class="returnNum">归寝人数:4</text> | |||||
<text class="noReturnNum">未归寝人数:2</text> | |||||
</view> | |||||
<view class="bottom"> | |||||
<view class="returnConfirm"> | |||||
<image src="@/static/image/confirm.png" mode=""></image> | |||||
<text>归寝确认</text> | |||||
</view> | |||||
</view> | |||||
</view> | |||||
</u-list-item> | |||||
<u-loadmore :status="status" /> | |||||
</u-list> | |||||
</view> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
data() { | |||||
return { | |||||
list: [{},{},{},{},{},{},{},{},{},], | |||||
isLoading:false, | |||||
status:'loadmore',//loading正在加载 loadmore加载更多 nomore没有更多了 | |||||
} | |||||
}, | |||||
methods: { | |||||
scrolltolower() { | |||||
this.loadmore() | |||||
}, | |||||
loadmore() { | |||||
if(this.status != 'loadmore')return | |||||
this.status = 'loading' | |||||
setTimeout(()=>{ | |||||
for (let i = 0; i < 1; i++) { | |||||
this.list.push({},{}) | |||||
} | |||||
// 获取到的总条数>=接口总条数 | |||||
if(this.list.length>=14){ | |||||
this.status = 'nomore' | |||||
}else{ | |||||
this.status = 'loadmore' | |||||
} | |||||
},2000) | |||||
} | |||||
}, | |||||
onLoad() { | |||||
this.loadmore() | |||||
}, | |||||
} | |||||
</script> | |||||
<style lang="scss" scoped> | |||||
.whiteCard{ | |||||
background-color: #fff; | |||||
border-radius: 18rpx; | |||||
margin: 12rpx 28rpx; | |||||
padding: 30rpx; | |||||
color: #333333; | |||||
.row1{ | |||||
display: flex; | |||||
justify-content: space-between; | |||||
.room{ | |||||
font-size: 34rpx; | |||||
} | |||||
.peopleNum{ | |||||
uni-image{ | |||||
width: 34rpx; | |||||
height: 34rpx; | |||||
position: relative; | |||||
top: 6rpx; | |||||
margin-right: 6rpx; | |||||
} | |||||
uni-text{ | |||||
color: #2388FF; | |||||
font-size: 30rpx; | |||||
} | |||||
} | |||||
} | |||||
.row2{ | |||||
margin-top: 18rpx; | |||||
display: flex; | |||||
justify-content: space-between; | |||||
font-size: 30rpx; | |||||
.returnNum{ | |||||
} | |||||
.noReturnNum{ | |||||
} | |||||
} | |||||
.bottom{ | |||||
display: flex; | |||||
justify-content: center; | |||||
align-items: center; | |||||
border-top: 1rpx solid rgba(0, 0, 0, 0.1); | |||||
margin-top: 24rpx; | |||||
padding-top: 22rpx; | |||||
.returnConfirm{ | |||||
uni-image{ | |||||
width: 34rpx; | |||||
height: 34rpx; | |||||
position: relative; | |||||
top: 6rpx; | |||||
margin-right: 6rpx; | |||||
} | |||||
uni-text{ | |||||
font-size: 30rpx; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
</style> |
@@ -0,0 +1,22 @@ | |||||
<template> | |||||
<view> | |||||
点名 | |||||
</view> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
data() { | |||||
return { | |||||
} | |||||
}, | |||||
methods: { | |||||
} | |||||
} | |||||
</script> | |||||
<style> | |||||
</style> |
@@ -0,0 +1,22 @@ | |||||
<template> | |||||
<view> | |||||
预警巡警 | |||||
</view> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
data() { | |||||
return { | |||||
} | |||||
}, | |||||
methods: { | |||||
} | |||||
} | |||||
</script> | |||||
<style> | |||||
</style> |
@@ -0,0 +1,21 @@ | |||||
<template> | |||||
<view> | |||||
首页 | |||||
</view> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
data() { | |||||
return { | |||||
} | |||||
}, | |||||
methods: { | |||||
} | |||||
} | |||||
</script> | |||||
<style lang="scss" scoped> | |||||
</style> | |||||
<style> | |||||
</style> |
@@ -0,0 +1,22 @@ | |||||
<template> | |||||
<view> | |||||
我的 | |||||
</view> | |||||
</template> | |||||
<script> | |||||
export default { | |||||
data() { | |||||
return { | |||||
} | |||||
}, | |||||
methods: { | |||||
} | |||||
} | |||||
</script> | |||||
<style> | |||||
</style> |
@@ -0,0 +1,30 @@ | |||||
// $u.mixin.js | |||||
import { mapState } from 'vuex' | |||||
import store from "@/store" | |||||
// 尝试将用户在根目录中的store/index.js的vuex的state变量,全部加载到全局变量中 | |||||
let $uStoreKey = []; | |||||
try { | |||||
$uStoreKey = store.state ? Object.keys(store.state) : []; | |||||
} catch (e) { | |||||
} | |||||
module.exports = { | |||||
mounted() { | |||||
// 将vuex方法挂在到$u中 | |||||
// 使用方法为:如果要修改vuex的state中的user.name变量为"史诗" => this.$u.vuex('user.name', '史诗') | |||||
// 如果要修改vuex的state的version变量为1.0.1 => this.$u.vue x('version', '1.0.1') | |||||
this.$u.vuex = (name, value) => { | |||||
this.$store.commit('$uStore', { | |||||
name, | |||||
value | |||||
}) | |||||
} | |||||
}, | |||||
computed: { | |||||
// 将vuex的state中的所有变量,解构到全局混入的mixin中 | |||||
...mapState($uStoreKey) | |||||
} | |||||
} |
@@ -0,0 +1,75 @@ | |||||
import Vue from 'vue' | |||||
import Vuex from 'vuex' | |||||
Vue.use(Vuex) | |||||
let lifeData = {}; | |||||
try { | |||||
// 尝试获取本地是否存在lifeData变量,第一次启动APP时是不存在的 | |||||
lifeData = uni.getStorageSync('lifeData'); | |||||
} catch (e) { | |||||
} | |||||
// 需要永久存储,且下次APP启动需要取出的,在state中的变量名 | |||||
let saveStateKeys = []; | |||||
// 保存变量到本地存储中 | |||||
const saveLifeData = function(key, value) { | |||||
// 判断变量名是否在需要存储的数组中 | |||||
if (saveStateKeys.indexOf(key) != -1) { | |||||
// 获取本地存储的lifeData对象,将变量添加到对象中 | |||||
let tmp = uni.getStorageSync('lifeData'); | |||||
// 第一次打开APP,不存在lifeData变量,故放一个{}空对象 | |||||
tmp = tmp ? tmp : {}; | |||||
tmp[key] = value; | |||||
// 执行这一步后,所有需要存储的变量,都挂载在本地的lifeData对象中 | |||||
uni.setStorageSync(key, value); | |||||
uni.setStorageSync('lifeData', tmp); | |||||
} | |||||
if(key == 'refreshToken') { | |||||
uni.setStorageSync('token', { | |||||
content: value, | |||||
datetime: new Date().getTime() | |||||
}) | |||||
} | |||||
} | |||||
const store = new Vuex.Store({ | |||||
// 下面这些值仅为示例,使用过程中请删除 | |||||
state: { | |||||
// 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量 | |||||
userInfo: lifeData.userInfo ? lifeData.userInfo : { | |||||
avatar: '', | |||||
nick_name: '游客', | |||||
tenant_id: '暂无' | |||||
}, | |||||
accessToken: lifeData.accessToken ? lifeData.accessToken : '', | |||||
isLogin: lifeData.isLogin ? lifeData.isLogin : false, | |||||
// 如果version无需保存到本地永久存储,无需lifeData.version方式 | |||||
version: '1.0.0', | |||||
}, | |||||
mutations: { | |||||
$uStore(state, payload) { | |||||
// 判断是否多层级调用,state中为对象存在的情况,诸如user.info.score = 1 | |||||
let nameArr = payload.name.split('.'); | |||||
let saveKey = ''; | |||||
let len = nameArr.length; | |||||
if (nameArr.length >= 2) { | |||||
let obj = state[nameArr[0]]; | |||||
for (let i = 1; i < len - 1; i++) { | |||||
obj = obj[nameArr[i]]; | |||||
} | |||||
obj[nameArr[len - 1]] = payload.value; | |||||
saveKey = nameArr[0]; | |||||
} else { | |||||
// 单层级变量,在state就是一个普通变量的情况 | |||||
state[payload.name] = payload.value; | |||||
saveKey = payload.name; | |||||
} | |||||
// 保存变量到本地,见顶部函数定义 | |||||
saveLifeData(saveKey, state[saveKey]) | |||||
} | |||||
} | |||||
}) | |||||
export default store |
@@ -0,0 +1,10 @@ | |||||
uni.addInterceptor({ | |||||
returnValue (res) { | |||||
if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) { | |||||
return res; | |||||
} | |||||
return new Promise((resolve, reject) => { | |||||
res.then((res) => res[0] ? reject(res[0]) : resolve(res[1])); | |||||
}); | |||||
}, | |||||
}); |
@@ -0,0 +1,78 @@ | |||||
/** | |||||
* 这里是uni-app内置的常用样式变量 | |||||
* | |||||
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 | |||||
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App | |||||
* | |||||
*/ | |||||
/** | |||||
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 | |||||
* | |||||
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 | |||||
*/ | |||||
/* 颜色变量 */ | |||||
/* 行为相关颜色 */ | |||||
$uni-color-primary: #007aff; | |||||
$uni-color-success: #4cd964; | |||||
$uni-color-warning: #f0ad4e; | |||||
$uni-color-error: #dd524d; | |||||
/* 文字基本颜色 */ | |||||
$uni-text-color:#333;//基本色 | |||||
$uni-text-color-inverse:#fff;//反色 | |||||
$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 | |||||
$uni-text-color-placeholder: #808080; | |||||
$uni-text-color-disable:#c0c0c0; | |||||
/* 背景颜色 */ | |||||
$uni-bg-color:#ffffff; | |||||
$uni-bg-color-grey:#f8f8f8; | |||||
$uni-bg-color-hover:#f1f1f1;//点击状态颜色 | |||||
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 | |||||
/* 边框颜色 */ | |||||
$uni-border-color:#c8c7cc; | |||||
/* 尺寸变量 */ | |||||
/* 文字尺寸 */ | |||||
$uni-font-size-sm:12px; | |||||
$uni-font-size-base:14px; | |||||
$uni-font-size-lg:16; | |||||
/* 图片尺寸 */ | |||||
$uni-img-size-sm:20px; | |||||
$uni-img-size-base:26px; | |||||
$uni-img-size-lg:40px; | |||||
/* Border Radius */ | |||||
$uni-border-radius-sm: 2px; | |||||
$uni-border-radius-base: 3px; | |||||
$uni-border-radius-lg: 6px; | |||||
$uni-border-radius-circle: 50%; | |||||
/* 水平间距 */ | |||||
$uni-spacing-row-sm: 5px; | |||||
$uni-spacing-row-base: 10px; | |||||
$uni-spacing-row-lg: 15px; | |||||
/* 垂直间距 */ | |||||
$uni-spacing-col-sm: 4px; | |||||
$uni-spacing-col-base: 8px; | |||||
$uni-spacing-col-lg: 12px; | |||||
/* 透明度 */ | |||||
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 | |||||
/* 文章场景相关 */ | |||||
$uni-color-title: #2C405A; // 文章标题颜色 | |||||
$uni-font-size-title:20px; | |||||
$uni-color-subtitle: #555555; // 二级标题颜色 | |||||
$uni-font-size-subtitle:26px; | |||||
$uni-color-paragraph: #3F536E; // 文章段落颜色 | |||||
$uni-font-size-paragraph:15px; | |||||
@import 'uview-ui/theme.scss'; |
@@ -0,0 +1,235 @@ | |||||
/* | |||||
* base64.js | |||||
* | |||||
* Licensed under the BSD 3-Clause License. | |||||
* http://opensource.org/licenses/BSD-3-Clause | |||||
* | |||||
* References: | |||||
* http://en.wikipedia.org/wiki/Base64 | |||||
*/ | |||||
;(function (global, factory) { | |||||
typeof exports === 'object' && typeof module !== 'undefined' | |||||
? module.exports = factory(global) | |||||
: typeof define === 'function' && define.amd | |||||
? define(factory) : factory(global) | |||||
}(( | |||||
typeof self !== 'undefined' ? self | |||||
: typeof window !== 'undefined' ? window | |||||
: typeof global !== 'undefined' ? global | |||||
: this | |||||
), function(global) { | |||||
'use strict'; | |||||
// existing version for noConflict() | |||||
global = global || {}; | |||||
var _Base64 = global.Base64; | |||||
var version = "2.5.1"; | |||||
// if node.js and NOT React Native, we use Buffer | |||||
var buffer; | |||||
if (typeof module !== 'undefined' && module.exports) { | |||||
try { | |||||
buffer = eval("require('buffer').Buffer"); | |||||
} catch (err) { | |||||
buffer = undefined; | |||||
} | |||||
} | |||||
// constants | |||||
var b64chars | |||||
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | |||||
var b64tab = function(bin) { | |||||
var t = {}; | |||||
for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; | |||||
return t; | |||||
}(b64chars); | |||||
var fromCharCode = String.fromCharCode; | |||||
// encoder stuff | |||||
var cb_utob = function(c) { | |||||
if (c.length < 2) { | |||||
var cc = c.charCodeAt(0); | |||||
return cc < 0x80 ? c | |||||
: cc < 0x800 ? (fromCharCode(0xc0 | (cc >>> 6)) | |||||
+ fromCharCode(0x80 | (cc & 0x3f))) | |||||
: (fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) | |||||
+ fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) | |||||
+ fromCharCode(0x80 | ( cc & 0x3f))); | |||||
} else { | |||||
var cc = 0x10000 | |||||
+ (c.charCodeAt(0) - 0xD800) * 0x400 | |||||
+ (c.charCodeAt(1) - 0xDC00); | |||||
return (fromCharCode(0xf0 | ((cc >>> 18) & 0x07)) | |||||
+ fromCharCode(0x80 | ((cc >>> 12) & 0x3f)) | |||||
+ fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) | |||||
+ fromCharCode(0x80 | ( cc & 0x3f))); | |||||
} | |||||
}; | |||||
var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; | |||||
var utob = function(u) { | |||||
return u.replace(re_utob, cb_utob); | |||||
}; | |||||
var cb_encode = function(ccc) { | |||||
var padlen = [0, 2, 1][ccc.length % 3], | |||||
ord = ccc.charCodeAt(0) << 16 | |||||
| ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) | |||||
| ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)), | |||||
chars = [ | |||||
b64chars.charAt( ord >>> 18), | |||||
b64chars.charAt((ord >>> 12) & 63), | |||||
padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), | |||||
padlen >= 1 ? '=' : b64chars.charAt(ord & 63) | |||||
]; | |||||
return chars.join(''); | |||||
}; | |||||
var btoa = global.btoa ? function(b) { | |||||
return global.btoa(b); | |||||
} : function(b) { | |||||
return b.replace(/[\s\S]{1,3}/g, cb_encode); | |||||
}; | |||||
var _encode = buffer ? | |||||
buffer.from && Uint8Array && buffer.from !== Uint8Array.from | |||||
? function (u) { | |||||
return (u.constructor === buffer.constructor ? u : buffer.from(u)) | |||||
.toString('base64') | |||||
} | |||||
: function (u) { | |||||
return (u.constructor === buffer.constructor ? u : new buffer(u)) | |||||
.toString('base64') | |||||
} | |||||
: function (u) { return btoa(utob(u)) } | |||||
; | |||||
var encode = function(u, urisafe) { | |||||
return !urisafe | |||||
? _encode(String(u)) | |||||
: _encode(String(u)).replace(/[+\/]/g, function(m0) { | |||||
return m0 == '+' ? '-' : '_'; | |||||
}).replace(/=/g, ''); | |||||
}; | |||||
var encodeURI = function(u) { return encode(u, true) }; | |||||
// decoder stuff | |||||
var re_btou = new RegExp([ | |||||
'[\xC0-\xDF][\x80-\xBF]', | |||||
'[\xE0-\xEF][\x80-\xBF]{2}', | |||||
'[\xF0-\xF7][\x80-\xBF]{3}' | |||||
].join('|'), 'g'); | |||||
var cb_btou = function(cccc) { | |||||
switch(cccc.length) { | |||||
case 4: | |||||
var cp = ((0x07 & cccc.charCodeAt(0)) << 18) | |||||
| ((0x3f & cccc.charCodeAt(1)) << 12) | |||||
| ((0x3f & cccc.charCodeAt(2)) << 6) | |||||
| (0x3f & cccc.charCodeAt(3)), | |||||
offset = cp - 0x10000; | |||||
return (fromCharCode((offset >>> 10) + 0xD800) | |||||
+ fromCharCode((offset & 0x3FF) + 0xDC00)); | |||||
case 3: | |||||
return fromCharCode( | |||||
((0x0f & cccc.charCodeAt(0)) << 12) | |||||
| ((0x3f & cccc.charCodeAt(1)) << 6) | |||||
| (0x3f & cccc.charCodeAt(2)) | |||||
); | |||||
default: | |||||
return fromCharCode( | |||||
((0x1f & cccc.charCodeAt(0)) << 6) | |||||
| (0x3f & cccc.charCodeAt(1)) | |||||
); | |||||
} | |||||
}; | |||||
var btou = function(b) { | |||||
return b.replace(re_btou, cb_btou); | |||||
}; | |||||
var cb_decode = function(cccc) { | |||||
var len = cccc.length, | |||||
padlen = len % 4, | |||||
n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) | |||||
| (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) | |||||
| (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) | |||||
| (len > 3 ? b64tab[cccc.charAt(3)] : 0), | |||||
chars = [ | |||||
fromCharCode( n >>> 16), | |||||
fromCharCode((n >>> 8) & 0xff), | |||||
fromCharCode( n & 0xff) | |||||
]; | |||||
chars.length -= [0, 0, 2, 1][padlen]; | |||||
return chars.join(''); | |||||
}; | |||||
var _atob = global.atob ? function(a) { | |||||
return global.atob(a); | |||||
} : function(a){ | |||||
return a.replace(/\S{1,4}/g, cb_decode); | |||||
}; | |||||
var atob = function(a) { | |||||
return _atob(String(a).replace(/[^A-Za-z0-9\+\/]/g, '')); | |||||
}; | |||||
var _decode = buffer ? | |||||
buffer.from && Uint8Array && buffer.from !== Uint8Array.from | |||||
? function(a) { | |||||
return (a.constructor === buffer.constructor | |||||
? a : buffer.from(a, 'base64')).toString(); | |||||
} | |||||
: function(a) { | |||||
return (a.constructor === buffer.constructor | |||||
? a : new buffer(a, 'base64')).toString(); | |||||
} | |||||
: function(a) { return btou(_atob(a)) }; | |||||
var decode = function(a){ | |||||
return _decode( | |||||
String(a).replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' }) | |||||
.replace(/[^A-Za-z0-9\+\/]/g, '') | |||||
); | |||||
}; | |||||
var noConflict = function() { | |||||
var Base64 = global.Base64; | |||||
global.Base64 = _Base64; | |||||
return Base64; | |||||
}; | |||||
// export Base64 | |||||
global.Base64 = { | |||||
VERSION: version, | |||||
atob: atob, | |||||
btoa: btoa, | |||||
fromBase64: decode, | |||||
toBase64: encode, | |||||
utob: utob, | |||||
encode: encode, | |||||
encodeURI: encodeURI, | |||||
btou: btou, | |||||
decode: decode, | |||||
noConflict: noConflict, | |||||
__buffer__: buffer | |||||
}; | |||||
// if ES5 is available, make Base64.extendString() available | |||||
if (typeof Object.defineProperty === 'function') { | |||||
var noEnum = function(v){ | |||||
return {value:v,enumerable:false,writable:true,configurable:true}; | |||||
}; | |||||
global.Base64.extendString = function () { | |||||
Object.defineProperty( | |||||
String.prototype, 'fromBase64', noEnum(function () { | |||||
return decode(this) | |||||
})); | |||||
Object.defineProperty( | |||||
String.prototype, 'toBase64', noEnum(function (urisafe) { | |||||
return encode(this, urisafe) | |||||
})); | |||||
Object.defineProperty( | |||||
String.prototype, 'toBase64URI', noEnum(function () { | |||||
return encode(this, true) | |||||
})); | |||||
}; | |||||
} | |||||
// | |||||
// export Base64 to the namespace | |||||
// | |||||
if (global['Meteor']) { // Meteor.js | |||||
Base64 = global.Base64; | |||||
} | |||||
// module.exports and AMD are mutually exclusive. | |||||
// module.exports has precedence. | |||||
if (typeof module !== 'undefined' && module.exports) { | |||||
module.exports.Base64 = global.Base64; | |||||
} | |||||
else if (typeof define === 'function' && define.amd) { | |||||
// AMD. Register as an anonymous module. | |||||
define([], function(){ return global.Base64 }); | |||||
} | |||||
// that's it! | |||||
return {Base64: global.Base64} | |||||
})); |
@@ -0,0 +1,51 @@ | |||||
export const calcDate = (date1, date2) => { | |||||
let date3 = date2 - date1; | |||||
let days = Math.floor(date3 / (24 * 3600 * 1000)) | |||||
let leave1 = date3 % (24 * 3600 * 1000) //计算天数后剩余的毫秒数 | |||||
let hours = Math.floor(leave1 / (3600 * 1000)) | |||||
let leave2 = leave1 % (3600 * 1000) //计算小时数后剩余的毫秒数 | |||||
let minutes = Math.floor(leave2 / (60 * 1000)) | |||||
let leave3 = leave2 % (60 * 1000) //计算分钟数后剩余的毫秒数 | |||||
let seconds = Math.round(date3 / 1000) | |||||
return { | |||||
leave1, | |||||
leave2, | |||||
leave3, | |||||
days: days, | |||||
hours: hours, | |||||
minutes: minutes, | |||||
seconds: seconds, | |||||
} | |||||
} | |||||
/** | |||||
* 日期格式化 | |||||
*/ | |||||
export function dateFormat(date, format) { | |||||
format = format || 'yyyy-MM-dd hh:mm:ss'; | |||||
if (date !== 'Invalid Date') { | |||||
let o = { | |||||
"M+": date.getMonth() + 1, //month | |||||
"d+": date.getDate(), //day | |||||
"h+": date.getHours(), //hour | |||||
"m+": date.getMinutes(), //minute | |||||
"s+": date.getSeconds(), //second | |||||
"q+": Math.floor((date.getMonth() + 3) / 3), //quarter | |||||
"S": date.getMilliseconds() //millisecond | |||||
} | |||||
if (/(y+)/.test(format)) format = format.replace(RegExp.$1, | |||||
(date.getFullYear() + "").substr(4 - RegExp.$1.length)); | |||||
for (let k in o) | |||||
if (new RegExp("(" + k + ")").test(format)) | |||||
format = format.replace(RegExp.$1, | |||||
RegExp.$1.length === 1 ? o[k] : | |||||
("00" + o[k]).substr(("" + o[k]).length)); | |||||
return format; | |||||
} | |||||
return ''; | |||||
} |
@@ -0,0 +1,178 @@ | |||||
// 全局公共方法 | |||||
const install = (Vue, vm) => { | |||||
// 登录操作 | |||||
const login = (userInfo, redirect) => { | |||||
vm.$u.vuex('userInfo', userInfo) | |||||
vm.$u.vuex('accessToken', userInfo.access_token) | |||||
vm.$u.vuex('refreshToken', userInfo.refresh_token) | |||||
vm.$u.vuex('isLogin', true) | |||||
if(userInfo.user_type == 1) { | |||||
// 教师首页 | |||||
if (redirect) { | |||||
uni.redirectTo({ | |||||
url: redirect, | |||||
fail() { | |||||
uni.switchTab({ | |||||
url: redirect | |||||
}) | |||||
} | |||||
}) | |||||
} else uni.redirectTo({ | |||||
url: '/pages/home/index' | |||||
}) | |||||
} else if(userInfo.user_type == 2) { | |||||
// 学生首页 | |||||
if (redirect) { | |||||
uni.redirectTo({ | |||||
url: redirect, | |||||
fail() { | |||||
uni.switchTab({ | |||||
url: redirect | |||||
}) | |||||
} | |||||
}) | |||||
} else uni.navigateTo({ | |||||
url: '/pages-student/home/index' | |||||
}) | |||||
} | |||||
// if(userInfo) | |||||
// debugger | |||||
} | |||||
// 退出登录 | |||||
const logout = (callback) => { | |||||
// vm.$u.vuex('userInfo', { | |||||
// avatar: '', | |||||
// nick_name: '游客', | |||||
// tenant_id: '暂无' | |||||
// }) | |||||
// vm.$u.vuex('accessToken', '') | |||||
// vm.$u.vuex('isLogin', false) | |||||
// uni.redirectTo({ | |||||
// url: '/pages/login/login' | |||||
// }) | |||||
callback() | |||||
} | |||||
// 检查登录状态 | |||||
const checkLogin = (e = {}) => { | |||||
if (!vm.isLogin) { | |||||
uni.navigateTo({ | |||||
url: '/pages/login/login' | |||||
}) | |||||
return false | |||||
} | |||||
return true | |||||
} | |||||
// 跳转路由前检查登录状态 | |||||
const route = (url) => { | |||||
if (!vm.isLogin) { | |||||
uni.showToast({ | |||||
title: '请先登录', | |||||
icon: 'none' | |||||
}) | |||||
const pages = getCurrentPages() | |||||
const currentPage = pages[pages.length - 1] | |||||
setTimeout(() => { | |||||
uni.navigateTo({ | |||||
url: `/pages/login/login?redirect=/${currentPage.route}` | |||||
}) | |||||
}, 500) | |||||
return false | |||||
} | |||||
uni.navigateTo({ | |||||
url: url | |||||
}) | |||||
} | |||||
// URL参数转对象 | |||||
const paramsToObj = (url) => { | |||||
if (url.indexOf('?') != -1) { | |||||
let arr = url.split('?')[1] | |||||
} | |||||
let arr = url.split('&') | |||||
let obj = {} | |||||
for (let i of arr) { | |||||
obj[i.split('=')[0]] = i.split('=')[1] | |||||
} | |||||
return obj | |||||
} | |||||
// 刷新当前页面 | |||||
const refreshPage = () => { | |||||
const pages = getCurrentPages() | |||||
const currentPage = pages[pages.length - 1] | |||||
const path = '/' + currentPage.route + vm.$u.queryParams(currentPage.options) | |||||
if (vm.$u.test.contains(currentPage.route, 'tabbar')) { | |||||
uni.reLaunch({ | |||||
url: path, | |||||
fail: (err) => { | |||||
console.log(err) | |||||
} | |||||
}) | |||||
} else { | |||||
uni.redirectTo({ | |||||
url: path, | |||||
fail: (err) => { | |||||
console.log(err) | |||||
} | |||||
}) | |||||
} | |||||
} | |||||
// 提示 | |||||
const showToast = (data = {}) => { | |||||
if (typeof data == 'string') { | |||||
uni.showToast({ | |||||
title: data, | |||||
icon: 'none' | |||||
}) | |||||
} else { | |||||
uni.showToast({ | |||||
title: data.title, | |||||
icon: data.icon || 'none', | |||||
image: data.image || '', | |||||
mask: data.mask || false, | |||||
position: data.position || 'center', | |||||
duration: data.duration || 1500, | |||||
success: () => { | |||||
setTimeout(() => { | |||||
if (data.back) return uni.navigateBack() | |||||
data.success && data.success() | |||||
}, data.duration || 1500) | |||||
} | |||||
}) | |||||
} | |||||
} | |||||
// 刷新token | |||||
const refreshToken = (data) => { | |||||
return new Promise((resolve) => { | |||||
console.log('refreshTokenrefreshToken',data) | |||||
vm.$u.vuex('accessToken', data.access_token) | |||||
vm.$u.vuex('refreshToken', data.refresh_token) | |||||
resolve() | |||||
}) | |||||
} | |||||
// 将定义的方法挂载,使用this.$u.func.xx调用 | |||||
Vue.prototype.$u.func = { | |||||
login, | |||||
logout, | |||||
route, | |||||
checkLogin, | |||||
paramsToObj, | |||||
refreshPage, | |||||
showToast, | |||||
refreshToken | |||||
} | |||||
} | |||||
export default { | |||||
install | |||||
} |
@@ -0,0 +1,99 @@ | |||||
import buildURL from '../helpers/buildURL' | |||||
import buildFullPath from '../core/buildFullPath' | |||||
import settle from '../core/settle' | |||||
import { isUndefined } from "../utils" | |||||
/** | |||||
* 返回可选值存在的配置 | |||||
* @param {Array} keys - 可选值数组 | |||||
* @param {Object} config2 - 配置 | |||||
* @return {{}} - 存在的配置项 | |||||
*/ | |||||
const mergeKeys = (keys, config2) => { | |||||
let config = {} | |||||
keys.forEach(prop => { | |||||
if (!isUndefined(config2[prop])) { | |||||
config[prop] = config2[prop] | |||||
} | |||||
}) | |||||
return config | |||||
} | |||||
export default (config) => { | |||||
return new Promise((resolve, reject) => { | |||||
let fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params) | |||||
const _config = { | |||||
url: fullPath, | |||||
header: config.header, | |||||
complete: (response) => { | |||||
config.fullPath = fullPath | |||||
response.config = config | |||||
try { | |||||
// 对可能字符串不是json 的情况容错 | |||||
if (typeof response.data === 'string') { | |||||
response.data = JSON.parse(response.data) | |||||
} | |||||
// eslint-disable-next-line no-empty | |||||
} catch (e) { | |||||
} | |||||
settle(resolve, reject, response) | |||||
} | |||||
} | |||||
let requestTask | |||||
if (config.method === 'UPLOAD') { | |||||
delete _config.header['content-type'] | |||||
delete _config.header['Content-Type'] | |||||
let otherConfig = { | |||||
// #ifdef MP-ALIPAY | |||||
fileType: config.fileType, | |||||
// #endif | |||||
filePath: config.filePath, | |||||
name: config.name | |||||
} | |||||
const optionalKeys = [ | |||||
// #ifdef APP-PLUS || H5 | |||||
'files', | |||||
// #endif | |||||
// #ifdef H5 | |||||
'file', | |||||
// #endif | |||||
// #ifdef H5 || APP-PLUS | |||||
'timeout', | |||||
// #endif | |||||
'formData' | |||||
] | |||||
requestTask = uni.uploadFile({..._config, ...otherConfig, ...mergeKeys(optionalKeys, config)}) | |||||
} else if (config.method === 'DOWNLOAD') { | |||||
// #ifdef H5 || APP-PLUS | |||||
if (!isUndefined(config['timeout'])) { | |||||
_config['timeout'] = config['timeout'] | |||||
} | |||||
// #endif | |||||
requestTask = uni.downloadFile(_config) | |||||
} else { | |||||
const optionalKeys = [ | |||||
'data', | |||||
'method', | |||||
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN | |||||
'timeout', | |||||
// #endif | |||||
'dataType', | |||||
// #ifndef MP-ALIPAY | |||||
'responseType', | |||||
// #endif | |||||
// #ifdef APP-PLUS | |||||
'sslVerify', | |||||
// #endif | |||||
// #ifdef H5 | |||||
'withCredentials', | |||||
// #endif | |||||
// #ifdef APP-PLUS | |||||
'firstIpv4', | |||||
// #endif | |||||
] | |||||
requestTask = uni.request({..._config,...mergeKeys(optionalKeys, config)}) | |||||
} | |||||
if (config.getTask) { | |||||
config.getTask(requestTask, config) | |||||
} | |||||
}) | |||||
} |
@@ -0,0 +1,51 @@ | |||||
'use strict' | |||||
function InterceptorManager() { | |||||
this.handlers = [] | |||||
} | |||||
/** | |||||
* Add a new interceptor to the stack | |||||
* | |||||
* @param {Function} fulfilled The function to handle `then` for a `Promise` | |||||
* @param {Function} rejected The function to handle `reject` for a `Promise` | |||||
* | |||||
* @return {Number} An ID used to remove interceptor later | |||||
*/ | |||||
InterceptorManager.prototype.use = function use(fulfilled, rejected) { | |||||
this.handlers.push({ | |||||
fulfilled: fulfilled, | |||||
rejected: rejected | |||||
}) | |||||
return this.handlers.length - 1 | |||||
} | |||||
/** | |||||
* Remove an interceptor from the stack | |||||
* | |||||
* @param {Number} id The ID that was returned by `use` | |||||
*/ | |||||
InterceptorManager.prototype.eject = function eject(id) { | |||||
if (this.handlers[id]) { | |||||
this.handlers[id] = null | |||||
} | |||||
} | |||||
/** | |||||
* Iterate over all the registered interceptors | |||||
* | |||||
* This method is particularly useful for skipping over any | |||||
* interceptors that may have become `null` calling `eject`. | |||||
* | |||||
* @param {Function} fn The function to call for each interceptor | |||||
*/ | |||||
InterceptorManager.prototype.forEach = function forEach(fn) { | |||||
this.handlers.forEach(h => { | |||||
if (h !== null) { | |||||
fn(h) | |||||
} | |||||
}) | |||||
} | |||||
export default InterceptorManager |
@@ -0,0 +1,199 @@ | |||||
/** | |||||
* @Class Request | |||||
* @description luch-request http请求插件 | |||||
* @version 3.0.6 | |||||
* @Author lu-ch | |||||
* @Date 2021-05-10 | |||||
* @Email webwork.s@qq.com | |||||
* 文档: https://www.quanzhan.co/luch-request/ | |||||
* github: https://github.com/lei-mu/luch-request | |||||
* DCloud: http://ext.dcloud.net.cn/plugin?id=392 | |||||
* HBuilderX: beat-3.0.4 alpha-3.0.4 | |||||
*/ | |||||
import dispatchRequest from './dispatchRequest' | |||||
import InterceptorManager from './InterceptorManager' | |||||
import mergeConfig from './mergeConfig' | |||||
import defaults from './defaults' | |||||
import { isPlainObject } from '../utils' | |||||
export default class Request { | |||||
/** | |||||
* @param {Object} arg - 全局配置 | |||||
* @param {String} arg.baseURL - 全局根路径 | |||||
* @param {Object} arg.header - 全局header | |||||
* @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 全局默认请求方式 | |||||
* @param {String} arg.dataType = [json] - 全局默认的dataType | |||||
* @param {String} arg.responseType = [text|arraybuffer] - 全局默认的responseType。支付宝小程序不支持 | |||||
* @param {Object} arg.custom - 全局默认的自定义参数 | |||||
* @param {Number} arg.timeout - 全局默认的超时时间,单位 ms。默认60000。H5(HBuilderX 2.9.9+)、APP(HBuilderX 2.9.9+)、微信小程序(2.10.0)、支付宝小程序 | |||||
* @param {Boolean} arg.sslVerify - 全局默认的是否验证 ssl 证书。默认true.仅App安卓端支持(HBuilderX 2.3.3+) | |||||
* @param {Boolean} arg.withCredentials - 全局默认的跨域请求时是否携带凭证(cookies)。默认false。仅H5支持(HBuilderX 2.6.15+) | |||||
* @param {Boolean} arg.firstIpv4 - 全DNS解析时优先使用ipv4。默认false。仅 App-Android 支持 (HBuilderX 2.8.0+) | |||||
* @param {Function(statusCode):Boolean} arg.validateStatus - 全局默认的自定义验证器。默认statusCode >= 200 && statusCode < 300 | |||||
*/ | |||||
constructor(arg = {}) { | |||||
if (!isPlainObject(arg)) { | |||||
arg = {} | |||||
console.warn('设置全局参数必须接收一个Object') | |||||
} | |||||
this.config = {...defaults, ...arg} | |||||
this.interceptors = { | |||||
request: new InterceptorManager(), | |||||
response: new InterceptorManager() | |||||
} | |||||
} | |||||
/** | |||||
* @Function | |||||
* @param {Request~setConfigCallback} f - 设置全局默认配置 | |||||
*/ | |||||
setConfig(f) { | |||||
this.config = f(this.config) | |||||
} | |||||
middleware(config) { | |||||
config = mergeConfig(this.config, config) | |||||
let chain = [dispatchRequest, undefined] | |||||
let promise = Promise.resolve(config) | |||||
this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { | |||||
chain.unshift(interceptor.fulfilled, interceptor.rejected) | |||||
}) | |||||
this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { | |||||
chain.push(interceptor.fulfilled, interceptor.rejected) | |||||
}) | |||||
while (chain.length) { | |||||
promise = promise.then(chain.shift(), chain.shift()) | |||||
} | |||||
return promise | |||||
} | |||||
/** | |||||
* @Function | |||||
* @param {Object} config - 请求配置项 | |||||
* @prop {String} options.url - 请求路径 | |||||
* @prop {Object} options.data - 请求参数 | |||||
* @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 响应的数据类型 | |||||
* @prop {Object} [options.dataType = config.dataType] - 如果设为 json,会尝试对返回的数据做一次 JSON.parse | |||||
* @prop {Object} [options.header = config.header] - 请求header | |||||
* @prop {Object} [options.method = config.method] - 请求方法 | |||||
* @returns {Promise<unknown>} | |||||
*/ | |||||
request(config = {}) { | |||||
return this.middleware(config) | |||||
} | |||||
get(url, options = {}) { | |||||
return this.middleware({ | |||||
url, | |||||
method: 'GET', | |||||
...options | |||||
}) | |||||
} | |||||
post(url, data, options = {}) { | |||||
return this.middleware({ | |||||
url, | |||||
data, | |||||
method: 'POST', | |||||
...options | |||||
}) | |||||
} | |||||
// #ifndef MP-ALIPAY | |||||
put(url, data, options = {}) { | |||||
return this.middleware({ | |||||
url, | |||||
data, | |||||
method: 'PUT', | |||||
...options | |||||
}) | |||||
} | |||||
// #endif | |||||
// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU | |||||
delete(url, data, options = {}) { | |||||
return this.middleware({ | |||||
url, | |||||
data, | |||||
method: 'DELETE', | |||||
...options | |||||
}) | |||||
} | |||||
// #endif | |||||
// #ifdef H5 || MP-WEIXIN | |||||
connect(url, data, options = {}) { | |||||
return this.middleware({ | |||||
url, | |||||
data, | |||||
method: 'CONNECT', | |||||
...options | |||||
}) | |||||
} | |||||
// #endif | |||||
// #ifdef H5 || MP-WEIXIN || MP-BAIDU | |||||
head(url, data, options = {}) { | |||||
return this.middleware({ | |||||
url, | |||||
data, | |||||
method: 'HEAD', | |||||
...options | |||||
}) | |||||
} | |||||
// #endif | |||||
// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU | |||||
options(url, data, options = {}) { | |||||
return this.middleware({ | |||||
url, | |||||
data, | |||||
method: 'OPTIONS', | |||||
...options | |||||
}) | |||||
} | |||||
// #endif | |||||
// #ifdef H5 || MP-WEIXIN | |||||
trace(url, data, options = {}) { | |||||
return this.middleware({ | |||||
url, | |||||
data, | |||||
method: 'TRACE', | |||||
...options | |||||
}) | |||||
} | |||||
// #endif | |||||
upload(url, config = {}) { | |||||
config.url = url | |||||
config.method = 'UPLOAD' | |||||
return this.middleware(config) | |||||
} | |||||
download(url, config = {}) { | |||||
config.url = url | |||||
config.method = 'DOWNLOAD' | |||||
return this.middleware(config) | |||||
} | |||||
} | |||||
/** | |||||
* setConfig回调 | |||||
* @return {Object} - 返回操作后的config | |||||
* @callback Request~setConfigCallback | |||||
* @param {Object} config - 全局默认config | |||||
*/ |
@@ -0,0 +1,20 @@ | |||||
'use strict' | |||||
import isAbsoluteURL from '../helpers/isAbsoluteURL' | |||||
import combineURLs from '../helpers/combineURLs' | |||||
/** | |||||
* Creates a new URL by combining the baseURL with the requestedURL, | |||||
* only when the requestedURL is not already an absolute URL. | |||||
* If the requestURL is absolute, this function returns the requestedURL untouched. | |||||
* | |||||
* @param {string} baseURL The base URL | |||||
* @param {string} requestedURL Absolute or relative URL to combine | |||||
* @returns {string} The combined full path | |||||
*/ | |||||
export default function buildFullPath(baseURL, requestedURL) { | |||||
if (baseURL && !isAbsoluteURL(requestedURL)) { | |||||
return combineURLs(baseURL, requestedURL) | |||||
} | |||||
return requestedURL | |||||
} |
@@ -0,0 +1,30 @@ | |||||
/** | |||||
* 默认的全局配置 | |||||
*/ | |||||
export default { | |||||
baseURL: '', | |||||
header: {}, | |||||
method: 'GET', | |||||
dataType: 'json', | |||||
// #ifndef MP-ALIPAY | |||||
responseType: 'text', | |||||
// #endif | |||||
custom: {}, | |||||
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN | |||||
timeout: 60000, | |||||
// #endif | |||||
// #ifdef APP-PLUS | |||||
sslVerify: true, | |||||
// #endif | |||||
// #ifdef H5 | |||||
withCredentials: false, | |||||
// #endif | |||||
// #ifdef APP-PLUS | |||||
firstIpv4: false, | |||||
// #endif | |||||
validateStatus: function validateStatus(status) { | |||||
return status >= 200 && status < 300 | |||||
} | |||||
} |
@@ -0,0 +1,6 @@ | |||||
import adapter from '../adapters/index' | |||||
export default (config) => { | |||||
return adapter(config) | |||||
} |
@@ -0,0 +1,103 @@ | |||||
import {deepMerge, isUndefined} from '../utils' | |||||
/** | |||||
* 合并局部配置优先的配置,如果局部有该配置项则用局部,如果全局有该配置项则用全局 | |||||
* @param {Array} keys - 配置项 | |||||
* @param {Object} globalsConfig - 当前的全局配置 | |||||
* @param {Object} config2 - 局部配置 | |||||
* @return {{}} | |||||
*/ | |||||
const mergeKeys = (keys, globalsConfig, config2) => { | |||||
let config = {} | |||||
keys.forEach(prop => { | |||||
if (!isUndefined(config2[prop])) { | |||||
config[prop] = config2[prop] | |||||
} else if (!isUndefined(globalsConfig[prop])) { | |||||
config[prop] = globalsConfig[prop] | |||||
} | |||||
}) | |||||
return config | |||||
} | |||||
/** | |||||
* | |||||
* @param globalsConfig - 当前实例的全局配置 | |||||
* @param config2 - 当前的局部配置 | |||||
* @return - 合并后的配置 | |||||
*/ | |||||
export default (globalsConfig, config2 = {}) => { | |||||
const method = config2.method || globalsConfig.method || 'GET' | |||||
let config = { | |||||
baseURL: globalsConfig.baseURL || '', | |||||
method: method, | |||||
url: config2.url || '', | |||||
params: config2.params || {}, | |||||
custom: {...(globalsConfig.custom || {}), ...(config2.custom || {})}, | |||||
header: deepMerge(globalsConfig.header || {}, config2.header || {}) | |||||
} | |||||
const defaultToConfig2Keys = ['getTask', 'validateStatus'] | |||||
config = {...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2)} | |||||
// eslint-disable-next-line no-empty | |||||
if (method === 'DOWNLOAD') { | |||||
// #ifdef H5 || APP-PLUS | |||||
if (!isUndefined(config2.timeout)) { | |||||
config['timeout'] = config2['timeout'] | |||||
} else if (!isUndefined(globalsConfig.timeout)) { | |||||
config['timeout'] = globalsConfig['timeout'] | |||||
} | |||||
// #endif | |||||
} else if (method === 'UPLOAD') { | |||||
delete config.header['content-type'] | |||||
delete config.header['Content-Type'] | |||||
const uploadKeys = [ | |||||
// #ifdef APP-PLUS || H5 | |||||
'files', | |||||
// #endif | |||||
// #ifdef MP-ALIPAY | |||||
'fileType', | |||||
// #endif | |||||
// #ifdef H5 | |||||
'file', | |||||
// #endif | |||||
'filePath', | |||||
'name', | |||||
// #ifdef H5 || APP-PLUS | |||||
'timeout', | |||||
// #endif | |||||
'formData', | |||||
] | |||||
uploadKeys.forEach(prop => { | |||||
if (!isUndefined(config2[prop])) { | |||||
config[prop] = config2[prop] | |||||
} | |||||
}) | |||||
// #ifdef H5 || APP-PLUS | |||||
if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) { | |||||
config['timeout'] = globalsConfig['timeout'] | |||||
} | |||||
// #endif | |||||
} else { | |||||
const defaultsKeys = [ | |||||
'data', | |||||
// #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN | |||||
'timeout', | |||||
// #endif | |||||
'dataType', | |||||
// #ifndef MP-ALIPAY | |||||
'responseType', | |||||
// #endif | |||||
// #ifdef APP-PLUS | |||||
'sslVerify', | |||||
// #endif | |||||
// #ifdef H5 | |||||
'withCredentials', | |||||
// #endif | |||||
// #ifdef APP-PLUS | |||||
'firstIpv4', | |||||
// #endif | |||||
] | |||||
config = {...config, ...mergeKeys(defaultsKeys, globalsConfig, config2)} | |||||
} | |||||
return config | |||||
} |
@@ -0,0 +1,16 @@ | |||||
/** | |||||
* Resolve or reject a Promise based on response status. | |||||
* | |||||
* @param {Function} resolve A function that resolves the promise. | |||||
* @param {Function} reject A function that rejects the promise. | |||||
* @param {object} response The response. | |||||
*/ | |||||
export default function settle(resolve, reject, response) { | |||||
const validateStatus = response.config.validateStatus | |||||
const status = response.statusCode | |||||
if (status && (!validateStatus || validateStatus(status))) { | |||||
resolve(response) | |||||
} else { | |||||
reject(response) | |||||
} | |||||
} |
@@ -0,0 +1,69 @@ | |||||
'use strict' | |||||
import * as utils from './../utils' | |||||
function encode(val) { | |||||
return encodeURIComponent(val). | |||||
replace(/%40/gi, '@'). | |||||
replace(/%3A/gi, ':'). | |||||
replace(/%24/g, '$'). | |||||
replace(/%2C/gi, ','). | |||||
replace(/%20/g, '+'). | |||||
replace(/%5B/gi, '['). | |||||
replace(/%5D/gi, ']') | |||||
} | |||||
/** | |||||
* Build a URL by appending params to the end | |||||
* | |||||
* @param {string} url The base of the url (e.g., http://www.google.com) | |||||
* @param {object} [params] The params to be appended | |||||
* @returns {string} The formatted url | |||||
*/ | |||||
export default function buildURL(url, params) { | |||||
/*eslint no-param-reassign:0*/ | |||||
if (!params) { | |||||
return url | |||||
} | |||||
var serializedParams | |||||
if (utils.isURLSearchParams(params)) { | |||||
serializedParams = params.toString() | |||||
} else { | |||||
var parts = [] | |||||
utils.forEach(params, function serialize(val, key) { | |||||
if (val === null || typeof val === 'undefined') { | |||||
return | |||||
} | |||||
if (utils.isArray(val)) { | |||||
key = key + '[]' | |||||
} else { | |||||
val = [val] | |||||
} | |||||
utils.forEach(val, function parseValue(v) { | |||||
if (utils.isDate(v)) { | |||||
v = v.toISOString() | |||||
} else if (utils.isObject(v)) { | |||||
v = JSON.stringify(v) | |||||
} | |||||
parts.push(encode(key) + '=' + encode(v)) | |||||
}) | |||||
}) | |||||
serializedParams = parts.join('&') | |||||
} | |||||
if (serializedParams) { | |||||
var hashmarkIndex = url.indexOf('#') | |||||
if (hashmarkIndex !== -1) { | |||||
url = url.slice(0, hashmarkIndex) | |||||
} | |||||
url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams | |||||
} | |||||
return url | |||||
} |
@@ -0,0 +1,14 @@ | |||||
'use strict' | |||||
/** | |||||
* Creates a new URL by combining the specified URLs | |||||
* | |||||
* @param {string} baseURL The base URL | |||||
* @param {string} relativeURL The relative URL | |||||
* @returns {string} The combined URL | |||||
*/ | |||||
export default function combineURLs(baseURL, relativeURL) { | |||||
return relativeURL | |||||
? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') | |||||
: baseURL | |||||
} |
@@ -0,0 +1,14 @@ | |||||
'use strict' | |||||
/** | |||||
* Determines whether the specified URL is absolute | |||||
* | |||||
* @param {string} url The URL to test | |||||
* @returns {boolean} True if the specified URL is absolute, otherwise false | |||||
*/ | |||||
export default function isAbsoluteURL(url) { | |||||
// A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL). | |||||
// RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed | |||||
// by any combination of letters, digits, plus, period, or hyphen. | |||||
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url) | |||||
} |
@@ -0,0 +1,116 @@ | |||||
type AnyObject = Record<string | number | symbol, any> | |||||
type HttpPromise<T> = Promise<HttpResponse<T>>; | |||||
type Tasks = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask | |||||
export interface RequestTask { | |||||
abort: () => void; | |||||
offHeadersReceived: () => void; | |||||
onHeadersReceived: () => void; | |||||
} | |||||
export interface HttpRequestConfig<T = Tasks> { | |||||
/** 请求基地址 */ | |||||
baseURL?: string; | |||||
/** 请求服务器接口地址 */ | |||||
url?: string; | |||||
/** 请求查询参数,自动拼接为查询字符串 */ | |||||
params?: AnyObject; | |||||
/** 请求体参数 */ | |||||
data?: AnyObject; | |||||
/** 文件对应的 key */ | |||||
name?: string; | |||||
/** HTTP 请求中其他额外的 form data */ | |||||
formData?: AnyObject; | |||||
/** 要上传文件资源的路径。 */ | |||||
filePath?: string; | |||||
/** 需要上传的文件列表。使用 files 时,filePath 和 name 不生效,App、H5( 2.6.15+) */ | |||||
files?: Array<{ | |||||
name?: string; | |||||
file?: File; | |||||
uri: string; | |||||
}>; | |||||
/** 要上传的文件对象,仅H5(2.6.15+)支持 */ | |||||
file?: File; | |||||
/** 请求头信息 */ | |||||
header?: AnyObject; | |||||
/** 请求方式 */ | |||||
method?: "GET" | "POST" | "PUT" | "DELETE" | "CONNECT" | "HEAD" | "OPTIONS" | "TRACE" | "UPLOAD" | "DOWNLOAD"; | |||||
/** 如果设为 json,会尝试对返回的数据做一次 JSON.parse */ | |||||
dataType?: string; | |||||
/** 设置响应的数据类型,支付宝小程序不支持 */ | |||||
responseType?: "text" | "arraybuffer"; | |||||
/** 自定义参数 */ | |||||
custom?: AnyObject; | |||||
/** 超时时间,仅微信小程序(2.10.0)、支付宝小程序支持 */ | |||||
timeout?: number; | |||||
/** DNS解析时优先使用ipv4,仅 App-Android 支持 (HBuilderX 2.8.0+) */ | |||||
firstIpv4?: boolean; | |||||
/** 验证 ssl 证书 仅5+App安卓端支持(HBuilderX 2.3.3+) */ | |||||
sslVerify?: boolean; | |||||
/** 跨域请求时是否携带凭证(cookies)仅H5支持(HBuilderX 2.6.15+) */ | |||||
withCredentials?: boolean; | |||||
/** 返回当前请求的task, options。请勿在此处修改options。 */ | |||||
getTask?: (task: T, options: HttpRequestConfig<T>) => void; | |||||
/** 全局自定义验证器 */ | |||||
validateStatus?: (statusCode: number) => boolean | void; | |||||
} | |||||
export interface HttpResponse<T = any> { | |||||
config: HttpRequestConfig; | |||||
statusCode: number; | |||||
cookies: Array<string>; | |||||
data: T; | |||||
errMsg: string; | |||||
header: AnyObject; | |||||
} | |||||
export interface HttpUploadResponse<T = any> { | |||||
config: HttpRequestConfig; | |||||
statusCode: number; | |||||
data: T; | |||||
errMsg: string; | |||||
} | |||||
export interface HttpDownloadResponse extends HttpResponse { | |||||
tempFilePath: string; | |||||
} | |||||
export interface HttpError { | |||||
config: HttpRequestConfig; | |||||
statusCode?: number; | |||||
cookies?: Array<string>; | |||||
data?: any; | |||||
errMsg: string; | |||||
header?: AnyObject; | |||||
} | |||||
export interface HttpInterceptorManager<V, E = V> { | |||||
use( | |||||
onFulfilled?: (config: V) => Promise<V> | V, | |||||
onRejected?: (config: E) => Promise<E> | E | |||||
): void; | |||||
eject(id: number): void; | |||||
} | |||||
export abstract class HttpRequestAbstract { | |||||
constructor(config?: HttpRequestConfig); | |||||
config: HttpRequestConfig; | |||||
interceptors: { | |||||
request: HttpInterceptorManager<HttpRequestConfig, HttpRequestConfig>; | |||||
response: HttpInterceptorManager<HttpResponse, HttpError>; | |||||
} | |||||
middleware<T = any>(config: HttpRequestConfig): HttpPromise<T>; | |||||
request<T = any>(config: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
get<T = any>(url: string, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
upload<T = any>(url: string, config?: HttpRequestConfig<UniApp.UploadTask>): HttpPromise<T>; | |||||
delete<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
head<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
post<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
put<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
connect<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
options<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
trace<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>; | |||||
download(url: string, config?: HttpRequestConfig<UniApp.DownloadTask>): Promise<HttpDownloadResponse>; | |||||
setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void; | |||||
} | |||||
declare class HttpRequest extends HttpRequestAbstract { } | |||||
export default HttpRequest; |
@@ -0,0 +1,2 @@ | |||||
import Request from './core/Request' | |||||
export default Request |
@@ -0,0 +1,135 @@ | |||||
'use strict' | |||||
// utils is a library of generic helper functions non-specific to axios | |||||
var toString = Object.prototype.toString | |||||
/** | |||||
* Determine if a value is an Array | |||||
* | |||||
* @param {Object} val The value to test | |||||
* @returns {boolean} True if value is an Array, otherwise false | |||||
*/ | |||||
export function isArray (val) { | |||||
return toString.call(val) === '[object Array]' | |||||
} | |||||
/** | |||||
* Determine if a value is an Object | |||||
* | |||||
* @param {Object} val The value to test | |||||
* @returns {boolean} True if value is an Object, otherwise false | |||||
*/ | |||||
export function isObject (val) { | |||||
return val !== null && typeof val === 'object' | |||||
} | |||||
/** | |||||
* Determine if a value is a Date | |||||
* | |||||
* @param {Object} val The value to test | |||||
* @returns {boolean} True if value is a Date, otherwise false | |||||
*/ | |||||
export function isDate (val) { | |||||
return toString.call(val) === '[object Date]' | |||||
} | |||||
/** | |||||
* Determine if a value is a URLSearchParams object | |||||
* | |||||
* @param {Object} val The value to test | |||||
* @returns {boolean} True if value is a URLSearchParams object, otherwise false | |||||
*/ | |||||
export function isURLSearchParams (val) { | |||||
return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams | |||||
} | |||||
/** | |||||
* Iterate over an Array or an Object invoking a function for each item. | |||||
* | |||||
* If `obj` is an Array callback will be called passing | |||||
* the value, index, and complete array for each item. | |||||
* | |||||
* If 'obj' is an Object callback will be called passing | |||||
* the value, key, and complete object for each property. | |||||
* | |||||
* @param {Object|Array} obj The object to iterate | |||||
* @param {Function} fn The callback to invoke for each item | |||||
*/ | |||||
export function forEach (obj, fn) { | |||||
// Don't bother if no value provided | |||||
if (obj === null || typeof obj === 'undefined') { | |||||
return | |||||
} | |||||
// Force an array if not already something iterable | |||||
if (typeof obj !== 'object') { | |||||
/*eslint no-param-reassign:0*/ | |||||
obj = [obj] | |||||
} | |||||
if (isArray(obj)) { | |||||
// Iterate over array values | |||||
for (var i = 0, l = obj.length; i < l; i++) { | |||||
fn.call(null, obj[i], i, obj) | |||||
} | |||||
} else { | |||||
// Iterate over object keys | |||||
for (var key in obj) { | |||||
if (Object.prototype.hasOwnProperty.call(obj, key)) { | |||||
fn.call(null, obj[key], key, obj) | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 是否为boolean 值 | |||||
* @param val | |||||
* @returns {boolean} | |||||
*/ | |||||
export function isBoolean(val) { | |||||
return typeof val === 'boolean' | |||||
} | |||||
/** | |||||
* 是否为真正的对象{} new Object | |||||
* @param {any} obj - 检测的对象 | |||||
* @returns {boolean} | |||||
*/ | |||||
export function isPlainObject(obj) { | |||||
return Object.prototype.toString.call(obj) === '[object Object]' | |||||
} | |||||
/** | |||||
* Function equal to merge with the difference being that no reference | |||||
* to original objects is kept. | |||||
* | |||||
* @see merge | |||||
* @param {Object} obj1 Object to merge | |||||
* @returns {Object} Result of all merge properties | |||||
*/ | |||||
export function deepMerge(/* obj1, obj2, obj3, ... */) { | |||||
let result = {} | |||||
function assignValue(val, key) { | |||||
if (typeof result[key] === 'object' && typeof val === 'object') { | |||||
result[key] = deepMerge(result[key], val) | |||||
} else if (typeof val === 'object') { | |||||
result[key] = deepMerge({}, val) | |||||
} else { | |||||
result[key] = val | |||||
} | |||||
} | |||||
for (let i = 0, l = arguments.length; i < l; i++) { | |||||
forEach(arguments[i], assignValue) | |||||
} | |||||
return result | |||||
} | |||||
export function isUndefined (val) { | |||||
return typeof val === 'undefined' | |||||
} |
@@ -0,0 +1,685 @@ | |||||
/** | |||||
* [js-md5]{@link https://github.com/emn178/js-md5} | |||||
* | |||||
* @namespace md5 | |||||
* @version 0.7.3 | |||||
* @author Chen, Yi-Cyuan [emn178@gmail.com] | |||||
* @copyright Chen, Yi-Cyuan 2014-2017 | |||||
* @license MIT | |||||
*/ | |||||
(function () { | |||||
'use strict'; | |||||
var ERROR = 'input is invalid type'; | |||||
var WINDOW = typeof window === 'object'; | |||||
var root = WINDOW ? window : {}; | |||||
if (root.JS_MD5_NO_WINDOW) { | |||||
WINDOW = false; | |||||
} | |||||
var WEB_WORKER = !WINDOW && typeof self === 'object'; | |||||
var NODE_JS = !root.JS_MD5_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; | |||||
if (NODE_JS) { | |||||
root = global; | |||||
} else if (WEB_WORKER) { | |||||
root = self; | |||||
} | |||||
var COMMON_JS = !root.JS_MD5_NO_COMMON_JS && typeof module === 'object' && module.exports; | |||||
var AMD = typeof define === 'function' && define.amd; | |||||
var ARRAY_BUFFER = !root.JS_MD5_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined'; | |||||
var HEX_CHARS = '0123456789abcdef'.split(''); | |||||
var EXTRA = [128, 32768, 8388608, -2147483648]; | |||||
var SHIFT = [0, 8, 16, 24]; | |||||
var OUTPUT_TYPES = ['hex', 'array', 'digest', 'buffer', 'arrayBuffer', 'base64']; | |||||
var BASE64_ENCODE_CHAR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(''); | |||||
var blocks = [], buffer8; | |||||
if (ARRAY_BUFFER) { | |||||
var buffer = new ArrayBuffer(68); | |||||
buffer8 = new Uint8Array(buffer); | |||||
blocks = new Uint32Array(buffer); | |||||
} | |||||
if (root.JS_MD5_NO_NODE_JS || !Array.isArray) { | |||||
Array.isArray = function (obj) { | |||||
return Object.prototype.toString.call(obj) === '[object Array]'; | |||||
}; | |||||
} | |||||
if (ARRAY_BUFFER && (root.JS_MD5_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) { | |||||
ArrayBuffer.isView = function (obj) { | |||||
return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer; | |||||
}; | |||||
} | |||||
/** | |||||
* @method hex | |||||
* @memberof md5 | |||||
* @description Output hash as hex string | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {String} Hex string | |||||
* @example | |||||
* md5.hex('The quick brown fox jumps over the lazy dog'); | |||||
* // equal to | |||||
* md5('The quick brown fox jumps over the lazy dog'); | |||||
*/ | |||||
/** | |||||
* @method digest | |||||
* @memberof md5 | |||||
* @description Output hash as bytes array | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {Array} Bytes array | |||||
* @example | |||||
* md5.digest('The quick brown fox jumps over the lazy dog'); | |||||
*/ | |||||
/** | |||||
* @method array | |||||
* @memberof md5 | |||||
* @description Output hash as bytes array | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {Array} Bytes array | |||||
* @example | |||||
* md5.array('The quick brown fox jumps over the lazy dog'); | |||||
*/ | |||||
/** | |||||
* @method arrayBuffer | |||||
* @memberof md5 | |||||
* @description Output hash as ArrayBuffer | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {ArrayBuffer} ArrayBuffer | |||||
* @example | |||||
* md5.arrayBuffer('The quick brown fox jumps over the lazy dog'); | |||||
*/ | |||||
/** | |||||
* @method buffer | |||||
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead. | |||||
* @memberof md5 | |||||
* @description Output hash as ArrayBuffer | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {ArrayBuffer} ArrayBuffer | |||||
* @example | |||||
* md5.buffer('The quick brown fox jumps over the lazy dog'); | |||||
*/ | |||||
/** | |||||
* @method base64 | |||||
* @memberof md5 | |||||
* @description Output hash as base64 string | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {String} base64 string | |||||
* @example | |||||
* md5.base64('The quick brown fox jumps over the lazy dog'); | |||||
*/ | |||||
var createOutputMethod = function (outputType) { | |||||
return function (message) { | |||||
return new Md5(true).update(message)[outputType](); | |||||
}; | |||||
}; | |||||
/** | |||||
* @method create | |||||
* @memberof md5 | |||||
* @description Create Md5 object | |||||
* @returns {Md5} Md5 object. | |||||
* @example | |||||
* var hash = md5.create(); | |||||
*/ | |||||
/** | |||||
* @method update | |||||
* @memberof md5 | |||||
* @description Create and update Md5 object | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {Md5} Md5 object. | |||||
* @example | |||||
* var hash = md5.update('The quick brown fox jumps over the lazy dog'); | |||||
* // equal to | |||||
* var hash = md5.create(); | |||||
* hash.update('The quick brown fox jumps over the lazy dog'); | |||||
*/ | |||||
var createMethod = function () { | |||||
var method = createOutputMethod('hex'); | |||||
if (NODE_JS) { | |||||
method = nodeWrap(method); | |||||
} | |||||
method.create = function () { | |||||
return new Md5(); | |||||
}; | |||||
method.update = function (message) { | |||||
return method.create().update(message); | |||||
}; | |||||
for (var i = 0; i < OUTPUT_TYPES.length; ++i) { | |||||
var type = OUTPUT_TYPES[i]; | |||||
method[type] = createOutputMethod(type); | |||||
} | |||||
return method; | |||||
}; | |||||
var nodeWrap = function (method) { | |||||
var crypto = eval("require('crypto')"); | |||||
var Buffer = eval("require('buffer').Buffer"); | |||||
var nodeMethod = function (message) { | |||||
if (typeof message === 'string') { | |||||
return crypto.createHash('md5').update(message, 'utf8').digest('hex'); | |||||
} else { | |||||
if (message === null || message === undefined) { | |||||
throw ERROR; | |||||
} else if (message.constructor === ArrayBuffer) { | |||||
message = new Uint8Array(message); | |||||
} | |||||
} | |||||
if (Array.isArray(message) || ArrayBuffer.isView(message) || | |||||
message.constructor === Buffer) { | |||||
return crypto.createHash('md5').update(new Buffer(message)).digest('hex'); | |||||
} else { | |||||
return method(message); | |||||
} | |||||
}; | |||||
return nodeMethod; | |||||
}; | |||||
/** | |||||
* Md5 class | |||||
* @class Md5 | |||||
* @description This is internal class. | |||||
* @see {@link md5.create} | |||||
*/ | |||||
function Md5(sharedMemory) { | |||||
if (sharedMemory) { | |||||
blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] = | |||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] = | |||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] = | |||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; | |||||
this.blocks = blocks; | |||||
this.buffer8 = buffer8; | |||||
} else { | |||||
if (ARRAY_BUFFER) { | |||||
var buffer = new ArrayBuffer(68); | |||||
this.buffer8 = new Uint8Array(buffer); | |||||
this.blocks = new Uint32Array(buffer); | |||||
} else { | |||||
this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; | |||||
} | |||||
} | |||||
this.h0 = this.h1 = this.h2 = this.h3 = this.start = this.bytes = this.hBytes = 0; | |||||
this.finalized = this.hashed = false; | |||||
this.first = true; | |||||
} | |||||
/** | |||||
* @method update | |||||
* @memberof Md5 | |||||
* @instance | |||||
* @description Update hash | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {Md5} Md5 object. | |||||
* @see {@link md5.update} | |||||
*/ | |||||
Md5.prototype.update = function (message) { | |||||
if (this.finalized) { | |||||
return; | |||||
} | |||||
var notString, type = typeof message; | |||||
if (type !== 'string') { | |||||
if (type === 'object') { | |||||
if (message === null) { | |||||
throw ERROR; | |||||
} else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) { | |||||
message = new Uint8Array(message); | |||||
} else if (!Array.isArray(message)) { | |||||
if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) { | |||||
throw ERROR; | |||||
} | |||||
} | |||||
} else { | |||||
throw ERROR; | |||||
} | |||||
notString = true; | |||||
} | |||||
var code, index = 0, i, length = message.length, blocks = this.blocks; | |||||
var buffer8 = this.buffer8; | |||||
while (index < length) { | |||||
if (this.hashed) { | |||||
this.hashed = false; | |||||
blocks[0] = blocks[16]; | |||||
blocks[16] = blocks[1] = blocks[2] = blocks[3] = | |||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] = | |||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] = | |||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; | |||||
} | |||||
if (notString) { | |||||
if (ARRAY_BUFFER) { | |||||
for (i = this.start; index < length && i < 64; ++index) { | |||||
buffer8[i++] = message[index]; | |||||
} | |||||
} else { | |||||
for (i = this.start; index < length && i < 64; ++index) { | |||||
blocks[i >> 2] |= message[index] << SHIFT[i++ & 3]; | |||||
} | |||||
} | |||||
} else { | |||||
if (ARRAY_BUFFER) { | |||||
for (i = this.start; index < length && i < 64; ++index) { | |||||
code = message.charCodeAt(index); | |||||
if (code < 0x80) { | |||||
buffer8[i++] = code; | |||||
} else if (code < 0x800) { | |||||
buffer8[i++] = 0xc0 | (code >> 6); | |||||
buffer8[i++] = 0x80 | (code & 0x3f); | |||||
} else if (code < 0xd800 || code >= 0xe000) { | |||||
buffer8[i++] = 0xe0 | (code >> 12); | |||||
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f); | |||||
buffer8[i++] = 0x80 | (code & 0x3f); | |||||
} else { | |||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); | |||||
buffer8[i++] = 0xf0 | (code >> 18); | |||||
buffer8[i++] = 0x80 | ((code >> 12) & 0x3f); | |||||
buffer8[i++] = 0x80 | ((code >> 6) & 0x3f); | |||||
buffer8[i++] = 0x80 | (code & 0x3f); | |||||
} | |||||
} | |||||
} else { | |||||
for (i = this.start; index < length && i < 64; ++index) { | |||||
code = message.charCodeAt(index); | |||||
if (code < 0x80) { | |||||
blocks[i >> 2] |= code << SHIFT[i++ & 3]; | |||||
} else if (code < 0x800) { | |||||
blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; | |||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | |||||
} else if (code < 0xd800 || code >= 0xe000) { | |||||
blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; | |||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; | |||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | |||||
} else { | |||||
code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); | |||||
blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; | |||||
blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; | |||||
blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; | |||||
blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
this.lastByteIndex = i; | |||||
this.bytes += i - this.start; | |||||
if (i >= 64) { | |||||
this.start = i - 64; | |||||
this.hash(); | |||||
this.hashed = true; | |||||
} else { | |||||
this.start = i; | |||||
} | |||||
} | |||||
if (this.bytes > 4294967295) { | |||||
this.hBytes += this.bytes / 4294967296 << 0; | |||||
this.bytes = this.bytes % 4294967296; | |||||
} | |||||
return this; | |||||
}; | |||||
Md5.prototype.finalize = function () { | |||||
if (this.finalized) { | |||||
return; | |||||
} | |||||
this.finalized = true; | |||||
var blocks = this.blocks, i = this.lastByteIndex; | |||||
blocks[i >> 2] |= EXTRA[i & 3]; | |||||
if (i >= 56) { | |||||
if (!this.hashed) { | |||||
this.hash(); | |||||
} | |||||
blocks[0] = blocks[16]; | |||||
blocks[16] = blocks[1] = blocks[2] = blocks[3] = | |||||
blocks[4] = blocks[5] = blocks[6] = blocks[7] = | |||||
blocks[8] = blocks[9] = blocks[10] = blocks[11] = | |||||
blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0; | |||||
} | |||||
blocks[14] = this.bytes << 3; | |||||
blocks[15] = this.hBytes << 3 | this.bytes >>> 29; | |||||
this.hash(); | |||||
}; | |||||
Md5.prototype.hash = function () { | |||||
var a, b, c, d, bc, da, blocks = this.blocks; | |||||
if (this.first) { | |||||
a = blocks[0] - 680876937; | |||||
a = (a << 7 | a >>> 25) - 271733879 << 0; | |||||
d = (-1732584194 ^ a & 2004318071) + blocks[1] - 117830708; | |||||
d = (d << 12 | d >>> 20) + a << 0; | |||||
c = (-271733879 ^ (d & (a ^ -271733879))) + blocks[2] - 1126478375; | |||||
c = (c << 17 | c >>> 15) + d << 0; | |||||
b = (a ^ (c & (d ^ a))) + blocks[3] - 1316259209; | |||||
b = (b << 22 | b >>> 10) + c << 0; | |||||
} else { | |||||
a = this.h0; | |||||
b = this.h1; | |||||
c = this.h2; | |||||
d = this.h3; | |||||
a += (d ^ (b & (c ^ d))) + blocks[0] - 680876936; | |||||
a = (a << 7 | a >>> 25) + b << 0; | |||||
d += (c ^ (a & (b ^ c))) + blocks[1] - 389564586; | |||||
d = (d << 12 | d >>> 20) + a << 0; | |||||
c += (b ^ (d & (a ^ b))) + blocks[2] + 606105819; | |||||
c = (c << 17 | c >>> 15) + d << 0; | |||||
b += (a ^ (c & (d ^ a))) + blocks[3] - 1044525330; | |||||
b = (b << 22 | b >>> 10) + c << 0; | |||||
} | |||||
a += (d ^ (b & (c ^ d))) + blocks[4] - 176418897; | |||||
a = (a << 7 | a >>> 25) + b << 0; | |||||
d += (c ^ (a & (b ^ c))) + blocks[5] + 1200080426; | |||||
d = (d << 12 | d >>> 20) + a << 0; | |||||
c += (b ^ (d & (a ^ b))) + blocks[6] - 1473231341; | |||||
c = (c << 17 | c >>> 15) + d << 0; | |||||
b += (a ^ (c & (d ^ a))) + blocks[7] - 45705983; | |||||
b = (b << 22 | b >>> 10) + c << 0; | |||||
a += (d ^ (b & (c ^ d))) + blocks[8] + 1770035416; | |||||
a = (a << 7 | a >>> 25) + b << 0; | |||||
d += (c ^ (a & (b ^ c))) + blocks[9] - 1958414417; | |||||
d = (d << 12 | d >>> 20) + a << 0; | |||||
c += (b ^ (d & (a ^ b))) + blocks[10] - 42063; | |||||
c = (c << 17 | c >>> 15) + d << 0; | |||||
b += (a ^ (c & (d ^ a))) + blocks[11] - 1990404162; | |||||
b = (b << 22 | b >>> 10) + c << 0; | |||||
a += (d ^ (b & (c ^ d))) + blocks[12] + 1804603682; | |||||
a = (a << 7 | a >>> 25) + b << 0; | |||||
d += (c ^ (a & (b ^ c))) + blocks[13] - 40341101; | |||||
d = (d << 12 | d >>> 20) + a << 0; | |||||
c += (b ^ (d & (a ^ b))) + blocks[14] - 1502002290; | |||||
c = (c << 17 | c >>> 15) + d << 0; | |||||
b += (a ^ (c & (d ^ a))) + blocks[15] + 1236535329; | |||||
b = (b << 22 | b >>> 10) + c << 0; | |||||
a += (c ^ (d & (b ^ c))) + blocks[1] - 165796510; | |||||
a = (a << 5 | a >>> 27) + b << 0; | |||||
d += (b ^ (c & (a ^ b))) + blocks[6] - 1069501632; | |||||
d = (d << 9 | d >>> 23) + a << 0; | |||||
c += (a ^ (b & (d ^ a))) + blocks[11] + 643717713; | |||||
c = (c << 14 | c >>> 18) + d << 0; | |||||
b += (d ^ (a & (c ^ d))) + blocks[0] - 373897302; | |||||
b = (b << 20 | b >>> 12) + c << 0; | |||||
a += (c ^ (d & (b ^ c))) + blocks[5] - 701558691; | |||||
a = (a << 5 | a >>> 27) + b << 0; | |||||
d += (b ^ (c & (a ^ b))) + blocks[10] + 38016083; | |||||
d = (d << 9 | d >>> 23) + a << 0; | |||||
c += (a ^ (b & (d ^ a))) + blocks[15] - 660478335; | |||||
c = (c << 14 | c >>> 18) + d << 0; | |||||
b += (d ^ (a & (c ^ d))) + blocks[4] - 405537848; | |||||
b = (b << 20 | b >>> 12) + c << 0; | |||||
a += (c ^ (d & (b ^ c))) + blocks[9] + 568446438; | |||||
a = (a << 5 | a >>> 27) + b << 0; | |||||
d += (b ^ (c & (a ^ b))) + blocks[14] - 1019803690; | |||||
d = (d << 9 | d >>> 23) + a << 0; | |||||
c += (a ^ (b & (d ^ a))) + blocks[3] - 187363961; | |||||
c = (c << 14 | c >>> 18) + d << 0; | |||||
b += (d ^ (a & (c ^ d))) + blocks[8] + 1163531501; | |||||
b = (b << 20 | b >>> 12) + c << 0; | |||||
a += (c ^ (d & (b ^ c))) + blocks[13] - 1444681467; | |||||
a = (a << 5 | a >>> 27) + b << 0; | |||||
d += (b ^ (c & (a ^ b))) + blocks[2] - 51403784; | |||||
d = (d << 9 | d >>> 23) + a << 0; | |||||
c += (a ^ (b & (d ^ a))) + blocks[7] + 1735328473; | |||||
c = (c << 14 | c >>> 18) + d << 0; | |||||
b += (d ^ (a & (c ^ d))) + blocks[12] - 1926607734; | |||||
b = (b << 20 | b >>> 12) + c << 0; | |||||
bc = b ^ c; | |||||
a += (bc ^ d) + blocks[5] - 378558; | |||||
a = (a << 4 | a >>> 28) + b << 0; | |||||
d += (bc ^ a) + blocks[8] - 2022574463; | |||||
d = (d << 11 | d >>> 21) + a << 0; | |||||
da = d ^ a; | |||||
c += (da ^ b) + blocks[11] + 1839030562; | |||||
c = (c << 16 | c >>> 16) + d << 0; | |||||
b += (da ^ c) + blocks[14] - 35309556; | |||||
b = (b << 23 | b >>> 9) + c << 0; | |||||
bc = b ^ c; | |||||
a += (bc ^ d) + blocks[1] - 1530992060; | |||||
a = (a << 4 | a >>> 28) + b << 0; | |||||
d += (bc ^ a) + blocks[4] + 1272893353; | |||||
d = (d << 11 | d >>> 21) + a << 0; | |||||
da = d ^ a; | |||||
c += (da ^ b) + blocks[7] - 155497632; | |||||
c = (c << 16 | c >>> 16) + d << 0; | |||||
b += (da ^ c) + blocks[10] - 1094730640; | |||||
b = (b << 23 | b >>> 9) + c << 0; | |||||
bc = b ^ c; | |||||
a += (bc ^ d) + blocks[13] + 681279174; | |||||
a = (a << 4 | a >>> 28) + b << 0; | |||||
d += (bc ^ a) + blocks[0] - 358537222; | |||||
d = (d << 11 | d >>> 21) + a << 0; | |||||
da = d ^ a; | |||||
c += (da ^ b) + blocks[3] - 722521979; | |||||
c = (c << 16 | c >>> 16) + d << 0; | |||||
b += (da ^ c) + blocks[6] + 76029189; | |||||
b = (b << 23 | b >>> 9) + c << 0; | |||||
bc = b ^ c; | |||||
a += (bc ^ d) + blocks[9] - 640364487; | |||||
a = (a << 4 | a >>> 28) + b << 0; | |||||
d += (bc ^ a) + blocks[12] - 421815835; | |||||
d = (d << 11 | d >>> 21) + a << 0; | |||||
da = d ^ a; | |||||
c += (da ^ b) + blocks[15] + 530742520; | |||||
c = (c << 16 | c >>> 16) + d << 0; | |||||
b += (da ^ c) + blocks[2] - 995338651; | |||||
b = (b << 23 | b >>> 9) + c << 0; | |||||
a += (c ^ (b | ~d)) + blocks[0] - 198630844; | |||||
a = (a << 6 | a >>> 26) + b << 0; | |||||
d += (b ^ (a | ~c)) + blocks[7] + 1126891415; | |||||
d = (d << 10 | d >>> 22) + a << 0; | |||||
c += (a ^ (d | ~b)) + blocks[14] - 1416354905; | |||||
c = (c << 15 | c >>> 17) + d << 0; | |||||
b += (d ^ (c | ~a)) + blocks[5] - 57434055; | |||||
b = (b << 21 | b >>> 11) + c << 0; | |||||
a += (c ^ (b | ~d)) + blocks[12] + 1700485571; | |||||
a = (a << 6 | a >>> 26) + b << 0; | |||||
d += (b ^ (a | ~c)) + blocks[3] - 1894986606; | |||||
d = (d << 10 | d >>> 22) + a << 0; | |||||
c += (a ^ (d | ~b)) + blocks[10] - 1051523; | |||||
c = (c << 15 | c >>> 17) + d << 0; | |||||
b += (d ^ (c | ~a)) + blocks[1] - 2054922799; | |||||
b = (b << 21 | b >>> 11) + c << 0; | |||||
a += (c ^ (b | ~d)) + blocks[8] + 1873313359; | |||||
a = (a << 6 | a >>> 26) + b << 0; | |||||
d += (b ^ (a | ~c)) + blocks[15] - 30611744; | |||||
d = (d << 10 | d >>> 22) + a << 0; | |||||
c += (a ^ (d | ~b)) + blocks[6] - 1560198380; | |||||
c = (c << 15 | c >>> 17) + d << 0; | |||||
b += (d ^ (c | ~a)) + blocks[13] + 1309151649; | |||||
b = (b << 21 | b >>> 11) + c << 0; | |||||
a += (c ^ (b | ~d)) + blocks[4] - 145523070; | |||||
a = (a << 6 | a >>> 26) + b << 0; | |||||
d += (b ^ (a | ~c)) + blocks[11] - 1120210379; | |||||
d = (d << 10 | d >>> 22) + a << 0; | |||||
c += (a ^ (d | ~b)) + blocks[2] + 718787259; | |||||
c = (c << 15 | c >>> 17) + d << 0; | |||||
b += (d ^ (c | ~a)) + blocks[9] - 343485551; | |||||
b = (b << 21 | b >>> 11) + c << 0; | |||||
if (this.first) { | |||||
this.h0 = a + 1732584193 << 0; | |||||
this.h1 = b - 271733879 << 0; | |||||
this.h2 = c - 1732584194 << 0; | |||||
this.h3 = d + 271733878 << 0; | |||||
this.first = false; | |||||
} else { | |||||
this.h0 = this.h0 + a << 0; | |||||
this.h1 = this.h1 + b << 0; | |||||
this.h2 = this.h2 + c << 0; | |||||
this.h3 = this.h3 + d << 0; | |||||
} | |||||
}; | |||||
/** | |||||
* @method hex | |||||
* @memberof Md5 | |||||
* @instance | |||||
* @description Output hash as hex string | |||||
* @returns {String} Hex string | |||||
* @see {@link md5.hex} | |||||
* @example | |||||
* hash.hex(); | |||||
*/ | |||||
Md5.prototype.hex = function () { | |||||
this.finalize(); | |||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; | |||||
return HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] + | |||||
HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] + | |||||
HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] + | |||||
HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] + | |||||
HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] + | |||||
HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] + | |||||
HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] + | |||||
HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] + | |||||
HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] + | |||||
HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] + | |||||
HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] + | |||||
HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] + | |||||
HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] + | |||||
HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] + | |||||
HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] + | |||||
HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F]; | |||||
}; | |||||
/** | |||||
* @method toString | |||||
* @memberof Md5 | |||||
* @instance | |||||
* @description Output hash as hex string | |||||
* @returns {String} Hex string | |||||
* @see {@link md5.hex} | |||||
* @example | |||||
* hash.toString(); | |||||
*/ | |||||
Md5.prototype.toString = Md5.prototype.hex; | |||||
/** | |||||
* @method digest | |||||
* @memberof Md5 | |||||
* @instance | |||||
* @description Output hash as bytes array | |||||
* @returns {Array} Bytes array | |||||
* @see {@link md5.digest} | |||||
* @example | |||||
* hash.digest(); | |||||
*/ | |||||
Md5.prototype.digest = function () { | |||||
this.finalize(); | |||||
var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3; | |||||
return [ | |||||
h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 24) & 0xFF, | |||||
h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 24) & 0xFF, | |||||
h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 24) & 0xFF, | |||||
h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 24) & 0xFF | |||||
]; | |||||
}; | |||||
/** | |||||
* @method array | |||||
* @memberof Md5 | |||||
* @instance | |||||
* @description Output hash as bytes array | |||||
* @returns {Array} Bytes array | |||||
* @see {@link md5.array} | |||||
* @example | |||||
* hash.array(); | |||||
*/ | |||||
Md5.prototype.array = Md5.prototype.digest; | |||||
/** | |||||
* @method arrayBuffer | |||||
* @memberof Md5 | |||||
* @instance | |||||
* @description Output hash as ArrayBuffer | |||||
* @returns {ArrayBuffer} ArrayBuffer | |||||
* @see {@link md5.arrayBuffer} | |||||
* @example | |||||
* hash.arrayBuffer(); | |||||
*/ | |||||
Md5.prototype.arrayBuffer = function () { | |||||
this.finalize(); | |||||
var buffer = new ArrayBuffer(16); | |||||
var blocks = new Uint32Array(buffer); | |||||
blocks[0] = this.h0; | |||||
blocks[1] = this.h1; | |||||
blocks[2] = this.h2; | |||||
blocks[3] = this.h3; | |||||
return buffer; | |||||
}; | |||||
/** | |||||
* @method buffer | |||||
* @deprecated This maybe confuse with Buffer in node.js. Please use arrayBuffer instead. | |||||
* @memberof Md5 | |||||
* @instance | |||||
* @description Output hash as ArrayBuffer | |||||
* @returns {ArrayBuffer} ArrayBuffer | |||||
* @see {@link md5.buffer} | |||||
* @example | |||||
* hash.buffer(); | |||||
*/ | |||||
Md5.prototype.buffer = Md5.prototype.arrayBuffer; | |||||
/** | |||||
* @method base64 | |||||
* @memberof Md5 | |||||
* @instance | |||||
* @description Output hash as base64 string | |||||
* @returns {String} base64 string | |||||
* @see {@link md5.base64} | |||||
* @example | |||||
* hash.base64(); | |||||
*/ | |||||
Md5.prototype.base64 = function () { | |||||
var v1, v2, v3, base64Str = '', bytes = this.array(); | |||||
for (var i = 0; i < 15;) { | |||||
v1 = bytes[i++]; | |||||
v2 = bytes[i++]; | |||||
v3 = bytes[i++]; | |||||
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] + | |||||
BASE64_ENCODE_CHAR[(v1 << 4 | v2 >>> 4) & 63] + | |||||
BASE64_ENCODE_CHAR[(v2 << 2 | v3 >>> 6) & 63] + | |||||
BASE64_ENCODE_CHAR[v3 & 63]; | |||||
} | |||||
v1 = bytes[i]; | |||||
base64Str += BASE64_ENCODE_CHAR[v1 >>> 2] + | |||||
BASE64_ENCODE_CHAR[(v1 << 4) & 63] + | |||||
'=='; | |||||
return base64Str; | |||||
}; | |||||
var exports = createMethod(); | |||||
if (COMMON_JS) { | |||||
module.exports = exports; | |||||
} else { | |||||
/** | |||||
* @method md5 | |||||
* @description Md5 hash function, export to global in browsers. | |||||
* @param {String|Array|Uint8Array|ArrayBuffer} message message to hash | |||||
* @returns {String} md5 hashes | |||||
* @example | |||||
* md5(''); // d41d8cd98f00b204e9800998ecf8427e | |||||
* md5('The quick brown fox jumps over the lazy dog'); // 9e107d9d372bb6826bd81d3542a419d6 | |||||
* md5('The quick brown fox jumps over the lazy dog.'); // e4d909c290d0fb1ca068ffaddf22cbd0 | |||||
* | |||||
* // It also supports UTF-8 encoding | |||||
* md5('中文'); // a7bac2239fcdcb3a067903d8077c4a07 | |||||
* | |||||
* // It also supports byte `Array`, `Uint8Array`, `ArrayBuffer` | |||||
* md5([]); // d41d8cd98f00b204e9800998ecf8427e | |||||
* md5(new Uint8Array([])); // d41d8cd98f00b204e9800998ecf8427e | |||||
*/ | |||||
root.md5 = exports; | |||||
if (AMD) { | |||||
define(function () { | |||||
return exports; | |||||
}); | |||||
} | |||||
} | |||||
})(); |
@@ -0,0 +1,37 @@ | |||||
/** | |||||
* 对页面上输入的密码进行加密传输给后台进行验证,对返回的数据进行解密,在页面展示 | |||||
*/ | |||||
let CryptoJS = require('crypto-js'); // 引入AES源码js | |||||
export default { | |||||
/* | |||||
* 对密码进行加密,传输给后台进行验证 | |||||
* @param {String} word 需要加密的密码 | |||||
* @param {String} keyStr 对密码加密的秘钥 | |||||
* @return {String} 加密的密文 | |||||
* */ | |||||
encrypt(word, keyStr) { // 加密 | |||||
keyStr = keyStr ? keyStr : 'abcd1234ABCDQGJ1'; | |||||
let key = CryptoJS.enc.Utf8.parse(keyStr); | |||||
let srcs = CryptoJS.enc.Utf8.parse(word); | |||||
let encrypted = CryptoJS.AES.encrypt(srcs, key, { | |||||
mode: CryptoJS.mode.ECB, | |||||
padding: CryptoJS.pad.Pkcs7 | |||||
}); | |||||
return encrypted.toString(); | |||||
}, | |||||
/* | |||||
* 对加密之后的密文在页面上进行解密,以便用户进行修改 | |||||
* @param {String} word 需要加密的密码 | |||||
* @param {String} keyStr 对密码加密的秘钥 | |||||
* @return {String} 解密的明文 | |||||
* */ | |||||
decrypt(word, keyStr) { // 解密 | |||||
keyStr = keyStr ? keyStr : 'ABGHNJHGSHUYG12'; | |||||
let key = CryptoJS.enc.Utf8.parse(keyStr); | |||||
let decrypt = CryptoJS.AES.decrypt(word, key, { | |||||
mode: CryptoJS.mode.ECB, | |||||
padding: CryptoJS.pad.Pkcs7 | |||||
}); | |||||
return CryptoJS.enc.Utf8.stringify(decrypt).toString(); | |||||
}, | |||||
}; |