简单跑起来了

This commit is contained in:
godbasin
2018-12-20 21:21:58 +08:00
parent 267a4a97a6
commit b34aa667b6
20 changed files with 3301 additions and 612 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2745
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -23,16 +23,15 @@
"scripts": { "scripts": {
"build": "webpack" "build": "webpack"
}, },
"dependencies": { "dependencies": {},
"webpack": "latest"
},
"devDependencies": { "devDependencies": {
"prettier": "^1.15.3", "prettier": "^1.15.3",
"pretty-quick": "^1.8.0", "pretty-quick": "^1.8.0",
"ts-loader": "^5.3.1", "ts-loader": "^5.3.1",
"tslint-config-prettier": "^1.17.0", "tslint-config-prettier": "^1.17.0",
"typescript": "^3.2.2", "typescript": "^3.2.2",
"webpack-cli": "^2.1.3" "webpack": "^4.28.0",
"webpack-cli": "^3.1.1"
}, },
"husky": { "husky": {
"hooks": { "hooks": {

View File

@@ -2,10 +2,11 @@ import config from '../store/config'
import status from '../store/status' import status from '../store/status'
export default () => { export default () => {
return { const configResult :IGetConfigResult = {
urlPerfix: config.urlPerfix, urlPerfix: config.urlPerfix,
sessionExpireTime: status.sessionExpireTime, sessionExpireTime: status.sessionExpireTime,
sessionExpireKey: config.sessionExpireKey, sessionExpireKey: config.sessionExpireKey,
sessionExpire: status.sessionExpire sessionExpire: status.sessionExpire
} }
return configResult;
}; };

View File

@@ -2,11 +2,11 @@ import defaultConfig from '../store/config'
import status from '../store/status' import status from '../store/status'
export default (params: IInitOption) => { export default (params: IInitOption) => {
const config: IInitOption = {...params, ...defaultConfig)} const config: IInitOption = {...params, ...defaultConfig}
// 如果配置更改了session的存储名字则重新获取一次session // 如果配置更改了session的存储名字则重新获取一次session
if (params.sessionName) { if (params.sessionName) {
try { try {
status.session = wx.getStorageSync(config.sessionName) || ''; status.session = wx.getStorageSync(config.sessionName!) || '';
} catch (e) { } catch (e) {
console.error('wx.getStorageSync:fail, can not get session.') console.error('wx.getStorageSync:fail, can not get session.')
} }

View File

@@ -1,5 +1,5 @@
import checkSession from '../module/sessionManager' import checkSession from '../module/sessionManager'
export default (callback) => { export default (callback: Function) => {
return checkSession(callback, {}) return checkSession(callback, {})
} }

View File

@@ -1,5 +1,5 @@
import requestHandler from '../module/requestHandler' import requestHandler from '../module/requestHandler'
export default (obj: IRequestOption) => { export default (obj: IRequestOption) => {
return requestHandler.request(obj) requestHandler.request(obj)
} }

View File

@@ -1,6 +1,6 @@
import status from '../store/status' import status from '../store/status'
export default (session) => { export default (session: TODO) => {
status.session = session; status.session = session;
status.sessionIsFresh = true; status.sessionIsFresh = true;
} }

View File

@@ -1,5 +1,5 @@
import requestHandler from '../module/requestHandler' import requestHandler from '../module/requestHandler'
export default (obj) => { export default (obj: TODO) => {
requestHandler.uploadFile(obj) requestHandler.uploadFile(obj)
} }

View File

@@ -1,4 +1,4 @@
function get(obj) { function get(obj: TODO) {
wx.getStorage({ wx.getStorage({
key: obj.originUrl, key: obj.originUrl,
success: function (res) { success: function (res) {
@@ -16,7 +16,7 @@ function get(obj) {
}) })
} }
function set(obj, realData) { function set(obj: TODO , realData: TODO) {
if (obj.cache === true || (typeof obj.cache === "function" && obj.cache(realData))) { if (obj.cache === true || (typeof obj.cache === "function" && obj.cache(realData))) {
wx.setStorage({ wx.setStorage({
key: obj.originUrl, key: obj.originUrl,

View File

@@ -1,6 +1,6 @@
import config from '../store/config' import config from '../store/config'
function start(obj, name) { function start(obj: TODO, name?: string) {
switch (name) { switch (name) {
case 'checkSession': case 'checkSession':
obj._checkSessionStartTime = new Date().getTime(); obj._checkSessionStartTime = new Date().getTime();
@@ -15,7 +15,7 @@ function start(obj, name) {
} }
} }
function end(obj, name) { function end(obj: TODO, name?: string) {
switch (name) { switch (name) {
case 'checkSession': case 'checkSession':
// wx.checkSession 耗时上报 // wx.checkSession 耗时上报

View File

@@ -1,23 +1,23 @@
import config from '../store/config' import config from '../store/config'
export default (obj, res) => { export default (obj: TODO, res: TODO) => {
if (typeof obj.fail === "function") { if (typeof obj.fail === "function") {
obj.fail(res); obj.fail(res);
} else { } else {
let title = ""; let title = "";
if (typeof config.errorTitle === "function") { if (typeof config.errorTitle === "function") {
try { try {
title = config.errorTitle(res.data) title = config.errorTitle(res.data || res.errMsg)
} catch (e) { } catch (e) {
} }
} else if (typeof errorTitle === "string") { } else if (typeof config.errorTitle === "string") {
title = config.errorTitle; title = config.errorTitle;
} }
let content = ""; let content = "";
if (typeof config.errorContent === "function") { if (typeof config.errorContent === "function") {
try { try {
content = config.errorContent(res.data) content = config.errorContent(res.data || res.errMsg)
} catch (e) { } catch (e) {
} }
} else if (typeof config.errorContent === "string") { } else if (typeof config.errorContent === "string") {

View File

@@ -1,7 +1,7 @@
import config from '../store/config' import config from '../store/config'
import responseHandler from './responseHandler' import responseHandler from './responseHandler'
function get(obj, method) { function get(obj: TODO, method: "request" | "uploadFile"): any {
if(!config.mockJson[obj.url] && !config.mockJson[obj.originUrl]) { if(!config.mockJson[obj.url] && !config.mockJson[obj.originUrl]) {
// mock 没有对应接口的数据 // mock 没有对应接口的数据

View File

@@ -9,7 +9,7 @@ import responseHandler from './responseHandler'
import durationReporter from "./durationReporter"; import durationReporter from "./durationReporter";
// 格式化url // 格式化url
function format(url) { function format(url: string) {
if (url.startsWith('http')) { if (url.startsWith('http')) {
return url return url
} else { } else {
@@ -22,7 +22,7 @@ function format(url) {
} }
// 所有请求发出前需要做的事情 // 所有请求发出前需要做的事情
function preDo(obj) { function preDo(obj: TODO) {
if(typeof obj.beforeSend === "function") { if(typeof obj.beforeSend === "function") {
obj.beforeSend(); obj.beforeSend();
} }
@@ -39,10 +39,12 @@ function preDo(obj) {
if (obj.showLoading) { if (obj.showLoading) {
loading.show(obj.showLoading); loading.show(obj.showLoading);
obj.complete = ((fn) => { obj.complete = ((fn: Function, ...args) => {
return ()=> { return ()=> {
// TODO 使用Promise方式后可能不需要这些了
loading.hide(); loading.hide();
typeof fn === "function" && fn.apply(this, arguments); // @ts-ignore
typeof fn === "function" && fn.apply(this, ...args);
} }
})(obj.complete) })(obj.complete)
} }
@@ -54,17 +56,17 @@ function preDo(obj) {
} }
// 格式化处理请求的obj内容 // 格式化处理请求的obj内容
function initialize(obj, container) { function initialize(obj: TODO, container: TODO) {
if (!obj[container]) { if (!obj[container]) {
obj[container] = {}; obj[container] = {};
} }
if (obj.originUrl !== config.codeToSession.url && status.session) { if (obj.originUrl !== config.codeToSession.url && status.session) {
obj[container][config.sessionName] = status.session; obj[container][config.sessionName!] = status.session;
} }
// 如果有全局参数,则添加 // 如果有全局参数,则添加
let gd = {}; let gd: any = {};
if (typeof config.globalData === "function") { if (typeof config.globalData === "function") {
gd = config.globalData(); gd = config.globalData();
} else if (typeof config.globalData === "object") { } else if (typeof config.globalData === "object") {
@@ -101,7 +103,7 @@ function initialize(obj, container) {
return obj; return obj;
} }
function doRequest(obj) { function doRequest(obj: TODO) {
obj = initialize(obj, 'data'); obj = initialize(obj, 'data');
obj.count++; obj.count++;
wx.request({ wx.request({
@@ -110,10 +112,10 @@ function doRequest(obj) {
method: obj.method, method: obj.method,
header: obj.header || {}, header: obj.header || {},
dataType: obj.dataType || 'json', dataType: obj.dataType || 'json',
success: function (res) { success: function (res: wx.RequestSuccessCallbackResult) {
responseHandler(res, obj, 'request') responseHandler(res, obj, 'request')
}, },
fail: function (res) { fail: function (res: wx.GeneralCallbackResult) {
errorHandler(obj, res); errorHandler(obj, res);
console.error(res); console.error(res);
}, },
@@ -124,18 +126,17 @@ function doRequest(obj) {
}) })
} }
function doUploadFile(obj) { function doUploadFile(obj: TODO) {
obj.count++; obj.count++;
wx.uploadFile({ wx.uploadFile({
url: obj.url, url: obj.url,
filePath: obj.filePath || '', filePath: obj.filePath || '',
name: obj.name || '', name: obj.name || '',
method: 'POST',
formData: obj.formData, formData: obj.formData,
success: function (res) { success: function (res: wx.UploadFileSuccessCallbackResult) {
responseHandler(res, obj, 'uploadFile') responseHandler(res, obj, 'uploadFile')
}, },
fail: function (res) { fail: function (res: wx.GeneralCallbackResult) {
errorHandler(obj, res); errorHandler(obj, res);
console.error(res); console.error(res);
}, },
@@ -146,7 +147,7 @@ function doUploadFile(obj) {
}) })
} }
function request(obj) { function request(obj: TODO): TODO {
obj = preDo(obj); obj = preDo(obj);
if(config.mockJson) { if(config.mockJson) {
mockManager.get(obj, 'request'); mockManager.get(obj, 'request');
@@ -161,7 +162,7 @@ function request(obj) {
}, obj) }, obj)
} }
function uploadFile(obj) { function uploadFile(obj: TODO): TODO {
obj = preDo(obj); obj = preDo(obj);
if(config.mockJson) { if(config.mockJson) {
mockManager.get(obj, 'uploadFile'); mockManager.get(obj, 'uploadFile');

View File

@@ -5,7 +5,7 @@ import errorHandler from './errorHandler'
import cacheManager from './cacheManager' import cacheManager from './cacheManager'
import durationReporter from './durationReporter' import durationReporter from './durationReporter'
function response(res, obj, method) { function response(res: wx.RequestSuccessCallbackResult | wx.UploadFileSuccessCallbackResult, obj: TODO, method: "request" | "uploadFile"): any {
if (res.statusCode === 200) { if (res.statusCode === 200) {
// 兼容uploadFile返回的res.data可能是字符串 // 兼容uploadFile返回的res.data可能是字符串
@@ -24,7 +24,7 @@ function response(res, obj, method) {
// 登录请求 // 登录请求
let s = ""; let s = "";
try { try {
s = config.codeToSession.success(res.data); s = config.codeToSession.success!(res.data);
} catch (e) { } catch (e) {
} }
if (s) { if (s) {
@@ -32,21 +32,21 @@ function response(res, obj, method) {
} else { } else {
errorHandler(obj, res); errorHandler(obj, res);
} }
} else if (config.loginTrigger(res.data) && obj.reLoginLimit < config.reLoginLimit) { } else if (config.loginTrigger!(res.data) && obj.reLoginLimit < config.reLoginLimit!) {
// 登录态失效,且重试次数不超过配置 // 登录态失效,且重试次数不超过配置
status.session = ''; status.session = '';
status.sessionIsFresh = true; status.sessionIsFresh = true;
wx.removeStorage({ wx.removeStorage({
key: config.sessionName, key: config.sessionName!,
complete: function () { complete: function () {
requestHandler[method](obj) requestHandler[method](obj)
} }
}) })
} else if (config.successTrigger(res.data) && typeof obj.success === "function") { } else if (config.successTrigger!(res.data) && typeof obj.success === "function") {
// 接口返回成功码 // 接口返回成功码
let realData = null; let realData = null;
try { try {
realData = config.successData(res.data); realData = config.successData!(res.data);
} catch (e) { } catch (e) {
console.error("Function successData occur error: " + e); console.error("Function successData occur error: " + e);
} }

View File

@@ -5,7 +5,7 @@ import requestHandler from './requestHandler'
import errorHandler from './errorHandler' import errorHandler from './errorHandler'
import durationReporter from './durationReporter' import durationReporter from './durationReporter'
function checkSession(callback, obj) { function checkSession(callback: Function, obj: TODO) {
if (status.isCheckingSession) { if (status.isCheckingSession) {
flow.wait('checkSessionFinished', () => { flow.wait('checkSessionFinished', () => {
checkSession(callback, obj) checkSession(callback, obj)
@@ -38,7 +38,7 @@ function checkSession(callback, obj) {
} }
} }
function doLogin(callback, obj) { function doLogin(callback: Function, obj: TODO) {
if (obj.isLogin) { if (obj.isLogin) {
// 登录接口,直接放过 // 登录接口,直接放过
typeof callback === "function" && callback(); typeof callback === "function" && callback();
@@ -90,7 +90,7 @@ function doLogin(callback, obj) {
} }
} }
function code2Session(obj, code, callback) { function code2Session(obj: TODO, code: TODO, callback: Function) {
let data; let data;
// codeToSession.data支持函数 // codeToSession.data支持函数
if (typeof config.codeToSession.data === "function") { if (typeof config.codeToSession.data === "function") {
@@ -98,7 +98,7 @@ function code2Session(obj, code, callback) {
} else { } else {
data = config.codeToSession.data || {}; data = config.codeToSession.data || {};
} }
data[config.codeToSession.codeName] = code; data[config.codeToSession.codeName!] = code;
obj.count++; obj.count++;
requestHandler.request({ requestHandler.request({
@@ -107,7 +107,7 @@ function code2Session(obj, code, callback) {
method: config.codeToSession.method || 'GET', method: config.codeToSession.method || 'GET',
isLogin: true, isLogin: true,
report: config.codeToSession.report || config.codeToSession.url, report: config.codeToSession.report || config.codeToSession.url,
success: function (s) { success: function (s: TODO) {
status.session = s; status.session = s;
status.sessionIsFresh = true; status.sessionIsFresh = true;
// 如果有设置本地session过期时间 // 如果有设置本地session过期时间
@@ -115,12 +115,12 @@ function code2Session(obj, code, callback) {
status.sessionExpire = new Date().getTime() + status.sessionExpireTime; status.sessionExpire = new Date().getTime() + status.sessionExpireTime;
wx.setStorage({ wx.setStorage({
key: config.sessionExpireKey, key: config.sessionExpireKey,
data: status.sessionExpire data: String(status.sessionExpire)
}) })
} }
typeof callback === "function" && callback(); typeof callback === "function" && callback();
wx.setStorage({ wx.setStorage({
key: config.sessionName, key: config.sessionName!,
data: status.session data: status.session
}) })
}, },

View File

@@ -9,4 +9,4 @@ export default {
logining: false as boolean, logining: false as boolean,
// 正在查询session有效期中避免重复调用接口 // 正在查询session有效期中避免重复调用接口
isCheckingSession: false as boolean isCheckingSession: false as boolean
} } as any

View File

@@ -2,15 +2,15 @@ interface weRequest {
/** 小程序账号信息 */ /** 小程序账号信息 */
init?: (obj: IInitOption) => void; init?: (obj: IInitOption) => void;
/** 插件账号信息(仅在插件中调用时包含这一项) */ /** 插件账号信息(仅在插件中调用时包含这一项) */
request?: (option: IRequestOption) => Promise<any>; request?: (option: IRequestOption) => void;
/** 插件账号信息(仅在插件中调用时包含这一项) */ /** 插件账号信息(仅在插件中调用时包含这一项) */
uploadFile?: (option: IUploadFileOption) => Promise<any>; uploadFile?: (option: IUploadFileOption) => void;
/* 获取本地缓存中用户票据的值 */ /* 获取本地缓存中用户票据的值 */
getSession?: () => string; getSession?: () => string;
/* 获取weRequest的配置 */ /* 获取weRequest的配置 */
getConfig?: () => IGetConfigResult; getConfig?: () => IGetConfigResult;
/* [不建议使用] 在不发起业务请求的情况下,单独执行登录逻辑 */ /* [不建议使用] 在不发起业务请求的情况下,单独执行登录逻辑 */
login?: (callback: ) => void; login?: (callback: Function) => void;
/* [不建议使用] 设置用户票据的值 */ /* [不建议使用] 设置用户票据的值 */
setSession?: (x: string) => void; setSession?: (x: string) => void;
} }
@@ -26,17 +26,26 @@ interface IInitOption {
/* 登录重试次数,当连续请求登录接口返回失败次数超过这个次数,将不再重试登录 */ /* 登录重试次数,当连续请求登录接口返回失败次数超过这个次数,将不再重试登录 */
reLoginLimit?: number; reLoginLimit?: number;
/* 当出现接口逻辑错误时,会执行统一的回调函数,这里可以做统一的错误上报等处理 */ /* 当出现接口逻辑错误时,会执行统一的回调函数,这里可以做统一的错误上报等处理 */
errorCallback?: null | (() => void); errorCallback?: null | Function;
/* 接口返回成功之后,会执行统一的回调函数,这里可以做统一的耗时上报等处理 */ /* 接口返回成功之后,会执行统一的回调函数,这里可以做统一的耗时上报等处理 */
reportCGI?: boolean | ((...args: IReportCGIParam[]) => void); reportCGI?: boolean | ((
/* 调用的接口名字可在request接口的report字段配置 */
name: string,
/* 发起请求时的时间戳 */
startTime: number,
/* 请求返回时的时间戳 */
endTime: number,
/* 请求方法,可用于上报 */
request?: () => void
) => void);
/* 可为接口提供mock数据 */ /* 可为接口提供mock数据 */
mockJson?: boolean | (() => object); mockJson?: TODO;
/** 所有请求都会自动带上这里的参数 */ /** 所有请求都会自动带上这里的参数 */
globalData?: boolean | object | (() => object); globalData?: boolean | object | Function;
/** session在本地缓存的key */ /** session在本地缓存的key */
sessionExpireKey: string; sessionExpireKey: string;
/* 触发重新登录的条件参数为CGI返回的数据返回需要重新登录的条件 */ /* 触发重新登录的条件参数为CGI返回的数据返回需要重新登录的条件 */
loginTrigger?: () => boolean; loginTrigger?: (res: string | IAnyObject | ArrayBuffer) => boolean;
/* 触发请求成功的条件参数为CGI返回的数据返回接口逻辑成功的条件 */ /* 触发请求成功的条件参数为CGI返回的数据返回接口逻辑成功的条件 */
successTrigger?: (res: string | IAnyObject | ArrayBuffer) => boolean; successTrigger?: (res: string | IAnyObject | ArrayBuffer) => boolean;
/* 成功之后返回数据参数为CGI返回的数据返回逻辑需要使用的数据 */ /* 成功之后返回数据参数为CGI返回的数据返回逻辑需要使用的数据 */
@@ -64,9 +73,11 @@ interface ICodeToSessionOptions{
/* 登录接口需要的其他参数 */ /* 登录接口需要的其他参数 */
data?: string | IAnyObject | ArrayBuffer; data?: string | IAnyObject | ArrayBuffer;
/* 接口返回成功的函数需要返回session的值 */ /* 接口返回成功的函数需要返回session的值 */
success?: () => void; success?: Function;
/* code换取session的接口逻辑出错时执行的函数若配置了此函数则不再默认弹窗报错 */ /* code换取session的接口逻辑出错时执行的函数若配置了此函数则不再默认弹窗报错 */
fail?: () => void; fail?: Function;
/* codeToSession的上报字段名 */
report?: string;
} }
interface IReportCGIParam{ interface IReportCGIParam{
@@ -77,12 +88,12 @@ interface IReportCGIParam{
/* 请求返回时的时间戳 */ /* 请求返回时的时间戳 */
endTime: number; endTime: number;
/* 请求方法,可用于上报 */ /* 请求方法,可用于上报 */
request: () => void; request: Function;
} }
interface IRequestOption extends wx.RequestOption { interface IRequestOption extends wx.RequestOption {
/* 发起请求前执行的函数 */ /* 发起请求前执行的函数 */
beforeSend?: () => void; beforeSend?: Function;
/* 请求过程页面是否展示全屏的loading */ /* 请求过程页面是否展示全屏的loading */
showLoading?: boolean | string; showLoading?: boolean | string;
/* 接口请求成功后将自动执行init()中配置的reportCGI函数其中的name字段值为这里配置的值 */ /* 接口请求成功后将自动执行init()中配置的reportCGI函数其中的name字段值为这里配置的值 */
@@ -91,7 +102,7 @@ interface IRequestOption extends wx.RequestOption {
interface IUploadFileOption extends wx.UploadFileOption { interface IUploadFileOption extends wx.UploadFileOption {
/* 发起请求前执行的函数 */ /* 发起请求前执行的函数 */
beforeSend?: () => void; beforeSend?: Function;
/* 请求过程页面是否展示全屏的loading */ /* 请求过程页面是否展示全屏的loading */
showLoading?: boolean | string; showLoading?: boolean | string;
/* 接口请求成功后将自动执行init()中配置的reportCGI函数其中的name字段值为这里配置的值 */ /* 接口请求成功后将自动执行init()中配置的reportCGI函数其中的name字段值为这里配置的值 */
@@ -100,13 +111,13 @@ interface IUploadFileOption extends wx.UploadFileOption {
interface IGetConfigResult{ interface IGetConfigResult{
/* 在组件初始化时传入的请求URL的固定前缀 */ /* 在组件初始化时传入的请求URL的固定前缀 */
urlPerfix: string | (() => string); urlPerfix?: string | (() => string);
/* 在组件初始化时传入的用户登陆态设置本地缓存时间 */ /* 在组件初始化时传入的用户登陆态设置本地缓存时间 */
sessionExpireTime: number; sessionExpireTime?: number;
/* 在组件初始化时传入的用户登陆态本地缓存时间Storage的key */ /* 在组件初始化时传入的用户登陆态本地缓存时间Storage的key */
sessionExpireKey: string; sessionExpireKey?: string;
/* 用户登陆态本地缓存过期的时间戳 */ /* 用户登陆态本地缓存过期的时间戳 */
sessionExpire: number; sessionExpire?: number;
} }
declare const weRequest: weRequest declare const weRequest: weRequest

View File

@@ -1,6 +1,6 @@
let store = {}; let store: TODO = {};
function emit(key) { function emit(key: TODO) {
let flow = getFlow(key); let flow = getFlow(key);
let currentLength = flow.waitingList.length; let currentLength = flow.waitingList.length;
for (let i = 0; i < currentLength; i++) { for (let i = 0; i < currentLength; i++) {
@@ -9,12 +9,12 @@ function emit(key) {
} }
} }
function wait(key, callback) { function wait(key: TODO, callback: Function) {
var flow = getFlow(key); var flow = getFlow(key);
flow.waitingList.push(callback) flow.waitingList.push(callback)
} }
function getFlow(key) { function getFlow(key: TODO) {
if (!store[key]) { if (!store[key]) {
store[key] = { store[key] = {
waitingList: [] waitingList: []