UNPKG

wiz-frameworks

Version:

wizlong react framework

391 lines (350 loc) 15.9 kB
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /** * * Copyright 2017 sgmelearninng * @author sin * 动态创建数据管理器 * * */ import { post, get, put, _delete } from '../../request'; var requestUrl = { post: post, get: get, put: put, _delete: _delete }; import { component_tool, utils_tool } from '../../tool'; var WizNotice = component_tool.WizNotice; var getPropOfObjectByStr = utils_tool.getPropOfObjectByStr, setPropOfObjectByStr = utils_tool.setPropOfObjectByStr, Map = utils_tool.Map, dateUtils = utils_tool.dateUtils; var createAction = function createAction(type) { return function (payload) { return { type: type, payload: payload }; }; }; /* 1、通过定义的业务块,实现对请求的自动处理以及数据绑定。实现model动态创建、卸载 2、需处理动态创建的业务model重复使用情况 3、需处理业务访问出错处理 统一后台接口返回的数据结构 4、考虑补充业务链的处理?(业务链应有可复用的价值 接口不宜处理?) 5、需处理动态model之间的数据关联(事件机制,处理缓存) 6、初始结构可动态配置或api访问 */ /** * 动态创建数据模型(数组) * * @param {object} dvaApp dva context * @param {object} businessOpts 模型data数组 */ export function createModels(dvaApp, businessOpts) { if (!(businessOpts instanceof Array)) { throw new Error('businessOpts 数据模型必须为Array'); } businessOpts.forEach(function (businessModel) { createBusinessModel(dvaApp, businessModel); }); } /** * 动态创建数据模型(单模型) * * @param {object} dvaApp dva context * @param {object} businessModel 模型data数组 */ function createBusinessModel(dvaApp) { var businessModel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (!(businessModel instanceof Object)) { throw new Error('model \u6570\u636E\u6A21\u578B\u5FC5\u987B\u4E3AObject'); } validateModels(businessModel); //be_update_flag_by_sin 验证模型是否合法 var model = buildModel(businessModel); dvaApp.model(model); } /** * 根据指定的数据结构、类型,动态构建Model * * @param {object} businessModel 业务模型结构 * @return {object} model 构建成功的model */ function buildModel(businessModel) { // let returnModel = {}; // switch (businessModel.modelType) { // 判断model使用类型是 entity 还是 page 或者 。。。 // case 'entity': // returnModel = buildEntityModel(businessModel); // break; // case 'page': // returnModel = buildPageModel(businessModel); // break; // default: // returnModel = buildEntityModel(businessModel); // } return buildEntityModel(businessModel); } /** * 构建类型为Entity 的Model,可定义initstate、namespace、effects、subscriptions * * @param {object} model 单个模型实体 * @return {object} model 构建成功的model */ /* be_update_flag_by_sin 1、缺少对subscriptions的定义 2、缺少effects的默认处理事件(watch、initState...) 3、缺少对操作失败信息详细解析、处理 */ function buildEntityModel(businessModel) { var requestConfig = businessModel['requestConfig']; var entityModel = { //定义model基础信息 namespace: businessModel['businessName'], //model 名 state: Map({ '@default': _extends({}, businessModel['initData'], { '@isDefault': 'Yes', '@namespace': businessModel['businessName'] }) }), reducers: { //具体reducer状态管理器 doSuccess: function doSuccess(state, _ref) { var payload = _ref.payload; var entityData = getEntityData(state, payload); var result = _extends({}, entityData, { actionCompleteTime: dateUtils.currentDateStr(), '@payloadKey': payload.key }); return putValue(state, payload.key, result); }, doError: function doError(state, _ref2) { var payload = _ref2.payload; //be_update_flag_by_sin 需处理错误提示信息 考虑是否和执行成功方法合并 var returnValue = getValue(state, payload.defaultEntity, payload.key); return putValue(state, key, _extends({ returnValue: returnValue }, payload.result, { actionCompleteTime: dateUtils.currentDateStr(), '@payloadKey': payload.key })); }, doInit: function doInit(state, _ref3) { var payload = _ref3.payload; return deleteValue(state, payload.key); } }, effects: { init: /*#__PURE__*/regeneratorRuntime.mark(function init(_ref4, _ref5) { var payload = _ref4.payload; var call = _ref5.call, put = _ref5.put; var key; return regeneratorRuntime.wrap(function init$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: key = payload.key; _context.next = 3; return put(createAction('doInit')({ key: key })); case 3: case 'end': return _context.stop(); } } }, init, this); }) // be_update_flag_by_sin //定义默认的处理事件 } }; buildEntityModelEffects(businessModel.action, entityModel, businessModel); return entityModel; } /** * 构建类型为EntityModel 的处理方法 * * @param {object} action 需要构建的处理方法 * @param {object} model 需要构建的实体Model * */ /* be_update_flag_by_sin 1、缺少对返回值的验证 2、缺少对api为function的处理 3、验证需要参数是否传入 //已完成 4、构造API请求地址 参数 //完成基础 5、需要指定请求的方式 */ function buildEntityModelEffects(action, entityModel, businessModel) { Object.keys(action).forEach(function (method) { var action_method = action[method]; validateActionMethod(method, action_method, businessModel); //校验action的定义是否正确 entityModel.effects[method] = /*#__PURE__*/regeneratorRuntime.mark(function _callee(_ref6, _ref7) { var payload = _ref6.payload; var call = _ref7.call, put = _ref7.put; var api, defaultEntity, requestMethod, requestConfig, result, _payload, _key; return regeneratorRuntime.wrap(function _callee$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.prev = 0; validateActionParams(method, action_method, payload, businessModel); api = action_method.api; defaultEntity = _extends({}, businessModel.initData, { '@namespace': businessModel.businessName }); requestMethod = requestUrl.post; if (action_method.methodType === 'GET') { requestMethod = requestUrl.get; } else if (action_method.methodType === 'PUT') { requestMethod = requestUrl.put; } else if (action_method.methodType === 'DELETE') { requestMethod = requestUrl._delete; } requestConfig = action_method['requestConfig']; if (!network()) { _context2.next = 21; break; } _context2.next = 10; return call(requestMethod, api, payload.apiParams, requestConfig); case 10: result = _context2.sent; _payload = _extends({}, payload), _key = _payload.key; if (!result) { _context2.next = 17; break; } _context2.next = 15; return put(createAction('doSuccess')({ result: result, defaultEntity: defaultEntity, key: _key })); case 15: _context2.next = 19; break; case 17: _context2.next = 19; return put(createAction('doError')({ defaultEntity: defaultEntity, key: _key })); case 19: _context2.next = 22; break; case 21: WizNotice.error('当前网络不可用,请切换网络', 3); case 22: _context2.next = 27; break; case 24: _context2.prev = 24; _context2.t0 = _context2['catch'](0); // WizNotice.error(`网络出现异常,请稍后再试`, 3); log.error('\u7CFB\u7EDF\u51FA\u73B0\u5F02\u5E38\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5!Error:' + _context2.t0); case 27: case 'end': return _context2.stop(); } } }, _callee, this, [[0, 24]]); }); }); } /** * 验证动态方法必须的参数是否传入 * @param {String} methodKey 方法名 * @param {Object} method 方法对象 * @param {Object} payload 需要校验的对象 * @param {Object} entityModel 校验的基础值 */ function validateActionParams(methodKey, method, payload, entityModel) { if (!payload.key || payload.key === '') { throw new Error('\u8C03\u7528' + entityModel.namespace + '/' + methodKey + ' \u65B9\u6CD5\uFF0Ckey\u503C\u4E3A:' + payload.key); } var require_params = method.params; if (require_params && require_params instanceof Array && require_params.length > 0) { var apiParams = payload.apiParams; if (apiParams) { require_params.forEach(function (field) { if (!apiParams.hasOwnProperty(field)) { throw new Error('\u8C03\u7528 ' + entityModel.namespace + '/' + methodKey + ' \u65B9\u6CD5\uFF0CapiParams\u7F3A\u5C11\u5BF9' + field + '\u5B9A\u4E49\u3002\u503C\u4E3A:' + apiParams[field]); } }); } else { throw new Error('\u8C03\u7528' + entityModel.namespace + '/' + methodKey + ' \u65B9\u6CD5\uFF0CapiParams\u503C\u4E3A:' + apiParams); } } } /** * 验证模型基础数据是否合法 * * @param {object} model 单个模型实体 * @return {boolean} flag 验证是否成功 */ function validateModels(model) { var businessName = model['businessName']; if (!model.hasOwnProperty('businessName') || businessName === '') { throw new Error('\u6570\u636E\u6A21\u578B\u5FC5\u987B\u8BBE\u7F6EbusinessName\u5C5E\u6027\u4EE5\u53CA\u503C,\u5F53\u524D\u503C\u4E3A\uFF1A' + businessName); } var action = model.action; if (action === undefined || !(action instanceof Object)) { throw new Error(businessName + '\u6570\u636E\u6A21\u578B\u5FC5\u987B\u8BBE\u7F6Eaction\u5C5E\u6027\u4EE5\u53CA\u503C,\u5F53\u524D\u503C\u4E3A\uFF1A' + action); } var initData = model['initData']; if (!model.hasOwnProperty('initData') || !(initData instanceof Object)) { throw new Error(businessName + '\u6570\u636E\u6A21\u578B\u5FC5\u987B\u8BBE\u7F6E\u6B63\u786E\u7684initData\u503C,\u5F53\u524D\u503C\u4E3A\uFF1A' + initData); } return true; } /** * 验证模型Action的设置是否正确 * @param {String} method_name 方法名 * @param {Object} method 方法对象 * @param {Object} model 模型对象 */ function validateActionMethod(method_name, method, model) { var namespace = model.namespace; if (method instanceof Object) { if (!method.hasOwnProperty('returnField') || method['returnField'] === '') { throw new Error(namespace + '\u6570\u636E\u6A21\u578B,action\u4E3A' + method_name + '\u4E2DreturnField\u7684\u503C\u672A\u6B63\u786E\u8BBE\u7F6E,\u5F53\u524D\u503C\u4E3A\uFF1A' + method.returnField); } if (!method.hasOwnProperty('api') || method['api'] === '') { throw new Error(namespace + '\u6570\u636E\u6A21\u578B,action\u4E3A' + method_name + '\u4E2DAPI\u7684\u503C\u672A\u6B63\u786E\u8BBE\u7F6E,\u5F53\u524D\u503C\u4E3A\uFF1A' + method.api); } if (!method.hasOwnProperty('params') || !(method['params'] instanceof Array)) { throw new Error(namespace + '\u6570\u636E\u6A21\u578B,action\u4E3A' + method_name + '\u4E2Dparams\u7684\u503C\u5E94\u4E3AArray,\u5F53\u524D\u503C\u4E3A\uFF1A' + method.params); } } else { throw new Error(namespace + '\u6570\u636E\u6A21\u578B\u4E2Daction\u4E3A' + method_name + '\u7684\u503C\u5E94\u4E3AObject\uFF0C\u5F53\u524D\u503C\u4E3A\uFF1A' + method); } } function getValue(stateMap, defaultEntity, key) { var returnValue = _extends({}, defaultEntity); if (key && stateMap.has(key)) { returnValue = stateMap.get(key); } return returnValue; } function putValue(stateMap, key, value) { var returnValue = stateMap; if (key) { returnValue = stateMap.set(key, value); } return returnValue; } function deleteValue(stateMap, key) { var returnValue = stateMap; if (key) { returnValue = stateMap['delete'](key); } return returnValue; } /** * 获取需要存放在state中entity数据 * @param {Object} state 原状态中数据 * @param {Object} payload 负载中数据(本次加载数据) * @return {Object} stateEntity数据 */ function getEntityData(state, payload) { var data = _extends({}, payload.defaultEntity, payload.result); if (payload.page && payload.page.field && payload.page.field !== '') { var preState = getValue(state, payload.defaultEntity, payload.key); var canLoadMore = true; if (payload.page.loadMore) { var field = payload.page.field; var preStateValue = getPropOfObjectByStr(preState, field); var resultValue = getPropOfObjectByStr(payload.result, field); if (preStateValue && preStateValue instanceof Array) { //当前再次请求的数据不为Array或无数据时,需要将canLoadMore设置微false if (!(resultValue instanceof Array) || resultValue.length === 0) { canLoadMore = false; resultValue = []; } setPropOfObjectByStr(data, field, preStateValue.concat(resultValue)); } } data = _extends({}, data, { canLoadMore: canLoadMore }); } else if (payload.result instanceof Blob) { data.result = payload.result; } return data; }