cefc-biz-utils
v0.0.24
Published
业务公共 utils
Downloads
10
Keywords
Readme
cefc-biz-utils
Bridge
.open(url, title)
开启新的 WebView 打开 url,设置标题为 title(默认为页面标题)
.close()
关闭当前 WebView
.exit()
退出 SDK,回到接入方界面
.oac()
进入开户流程界面
.scanIDCard(ok, fail)
扫描身份证
.video(options, ok, fail)
开始双向视频
Data
user
, oac
, meta
均存于内存;
Fields
存于 localStorage
.getUser()
获取用户信息
.setUser(user)
设置用户信息
.getOAC()
获取开户状态信息
.setOAC(oac)
设置开户状态信息
.getAppMeta()
获取应用描述信息
.setAppMeta(meta)
设置应用描述信息
Fields
SHAREHOLDER_NOS
股东账号CLIENT_NO
客户号MOBILE
手机号SETTINGS
系统偏好设置
.get(field)
.set(field, val)
.getShareholderNo(marketType)
根据市场类型获取股东账号
- 深圳SZ - '0'
- 上海SH - '1'
- 香港HK - '2'
Log
Example
// 程序入口
function reporter(data) {
axios({
method: 'post',
url: '/stats/log',
data
});
}
Log.init(reporter);
// 程序其他部分
Log.info({ msg: 'xxx' });
.init(reporter)
.warn()
.error()
.info()
.debug()
.trace()
.genTpHeader(config)
生成三方渠道的 header 参数,签名、接口统计、用户标识信息
config
Request config 对象
Tracker
Example
import Tracker from 'cefc-biz-utils/lib/tracker';
if (process.env.NODE_ENV === 'production') {
// 上传数据函数
function upload(headers, data) {
axios({ method: 'post', url: '/stats/track', headers, data });
}
// 页面停留时间监控
history.listen(() => {
Tracker.pageView(upload);
});
}
.pageView(reporter)
页面切换时统计页面停留时间
.genTrackStat()
生成接口统计所需的 Header 参数
{
// 一次会话一个 ID,最好在 Node Server 端生成
// 目前每加载一次页面会生成一个 ID,并不是一次会话一个 ID
// 因为 Node Server 端多进程没有共享 Session
requestAppId: SESSION_ID,
pageid: window.location.href,
uuid: uuid(),
requestTime: Date.now()
}
ReduxStore
配置 store 及动态添加 reducers
Example
import configureStore, { addReducer } from 'cefc-biz-utils/lib/redux-store';
const store = configureStore(initialState || {}, { history, request, ... });
function aActionCreator() {
return (dispatch, history, request, ...) {
request.get('https://xxx.com/a/b')
.then(res => {
history.push({ pathname: '/home', search: '?the=query', state: { some: 'state' } };
});
}
}
addReducer(store, reducers);
Redux 文件示例
import { getUser } from 'cefc-biz-utils/lib/data';
import { Path, Method } from './config/api';
const ActionType = {
QUERY_ASSETS: 'QUERY_ASSETS',
CONFIG_BIZ_HOME: 'CONFIG_BIZ_HOME'
};
function queryAssets() {
return (dispatch, request) => {
const { fundId } = getUser();
return request.post(Path.SAS, {
method: Method.ASSETS_QUERY,
fundId,
moneyType: '0'
}).then((ret) => {
const asset = ret[0];
dispatch({
type: ActionType.QUERY_ASSETS,
data: {
totalAmount: asset.allAsset,
marketAmount: asset.stkValue,
profitAmount: asset.profitCost,
expendableFund: asset.fundAvl,
fundId: asset.fundId
}
});
});
}
}
function queryNotices() {
const { fundId } = getUser();
return (dispatch, request) => {
return request.post(Path.NEWS, {
method: Method.GET_NOTICE,
fundId
}).then((ret) => {});
}
}
/**
* 约定 configure 设置静态的 state, 一般是临时固定在前端的数据
*/
function configure(data) {
return {
type: ActionType.CONFIG_BIZ_HOME,
data
}
}
// 约定默认导出所有 actions
export default { queryAssets, queryNotices, configure };
const initialState = {
assets: {
fundId: null,
totalAmount: 0,
marketAmount: 0,
profitAmount: 0,
expendableFund: 0
},
banner: '',
menus: []
};
function home(state = initialState, action) {
const { type, data } = action;
switch (type) {
case ActionType.CONFIG_BIZ_HOME:
return {
...state,
...data
};
case ActionType.QUERY_ASSETS:
return {
...state,
assets: { ...data },
};
default:
return state;
}
}
// 约定所有 reducers 都作为 reducers 导出
// 供外部引用 redux 文件后调用 `addReducer(store, reducers);`
export const reducers = { home };
Request
处理与服务端通信,主要功能点如下:
- 请求中支持 loading 状态
- body 参数结构化
- 限制同一接口多次频繁请求
- 针对业务错误码或请求网络错误友好提示
- Header 中签名/统计/用户标识信息
- 打通 nginx、node、service 标识请求唯一的字段
- 异常日志记录
Example
// 配置默认 baseURL, 使用相对路径,会自动加上 baseURL 做前缀,使用绝对路径 baseURL 会忽略
// 默认配置 sas 服务为 baseURL,行情接口请求时可直接传绝对地址
Request.request.defaults.baseURL = CONFIG.API_SERVER;
// 超时设置
Request.request.defaults.timeout = 1000 * 60;
// 根据请求配置生成自定义 headers
Request.dynamicHeaders = (config) => { return { sign: sign(config.data) }; };
// 自定义组装 body 的结构
Request.buildBodyStruct = (data) => { return { params: data }; };
// 配置 loading 样式
Request.loading = {
on: true,
show() { Loading.show({ content: '加载中', state: 'loading' }); },
close() { Loading.hide(); },
fail() { Loading.show({ content: '加载失败', state: 'fail', time: 1500, isHide: true }); }
};
// 业务错误码默认处理
Request.on(Request.ResEvtType.DEFAULT_BIZ_ERR, () => { // 弹框提示错误信息 });
// 业务错误码特殊处理,适用于所有请求的错误码
const AUTH_ERR_CODE = Request.buildBizErrTypeWithCode('123456');
Request.on(AUTH_ERR_CODE, () => { /* 跳转到登录页面 */});
// 适用于特定请求的业务错误码处理
const BIZ_ERR_CODE = Request.buildBizErrTypeWithCode('234567');
Request.once(BIZ_ERR_CODE, () => { // 错误码处理 })
Request.post('/trade', {
method: 'xxx',
market, price, bsFlag, secuId, stkCode
}, {
headers: {
token: cookies.get('token')
},
// 是否展示 loading 提示
silent: false,
// preventHandleResError: false
}).then((ret) => {
// 正常情况处理
}).catch((err) => {
// 异常处理,一般不需自行处理,除非设置 preventHandleResError 为 true
// err 可能为业务错误对象(即服务端返回的错误信息)或 Error 的实例(网络错误对象或代码异常对象)
});
// 其他请求方式
// config 具体参数详见 https://github.com/axios/axios#request-config
// 额外增加了 silent, preventHandleResError 两个参数
Request(config);
Request.get(path[, config]);
Request.delete(path[, config]);
Request.head(path[, config]);
Request.options(path[, config]);
Request.patch(path[, data, config]);
Request.post(path[, data, config]);
Request.delete(path[, config]);