cefc-biz-utils

0.0.24 • Public • Published

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

处理与服务端通信,主要功能点如下:

  1. 请求中支持 loading 状态
  2. body 参数结构化
  3. 限制同一接口多次频繁请求
  4. 针对业务错误码或请求网络错误友好提示
  5. Header 中签名/统计/用户标识信息
  6. 打通 nginx、node、service 标识请求唯一的字段
  7. 异常日志记录

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]);

Readme

Keywords

none

Package Sidebar

Install

npm i cefc-biz-utils

Weekly Downloads

27

Version

0.0.24

License

ISC

Last publish

Collaborators

  • wscops
  • chenghuijun
  • simon_zhx
  • carltonxiang
  • kane