dataConnect.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. import { message } from 'antd'
  2. import * as service from '../services/index'
  3. import URLS from '../constants/url'
  4. export default {
  5. namespace: 'dataConnect',
  6. state: {
  7. originData: {
  8. listLoading: false,
  9. list: [],
  10. newOne: {},
  11. filterLabel: '',
  12. validInfo: {},
  13. filterItems: [ // 可选过滤字段
  14. { name: 'name', label: '链接名', type: 'string' },
  15. ],
  16. filterItem: { name: 'name', label: '链接名', type: 'string' }, // 已选过滤字段
  17. },
  18. },
  19. reducers: {
  20. setField(state, action) {
  21. const { name, value } = action;
  22. let obj = {};
  23. obj[name] = value;
  24. let newState = Object.assign({}, state, obj);
  25. return Object.assign({}, newState);
  26. },
  27. setFields(state, action) {
  28. const { fields } = action;
  29. let obj = {};
  30. fields.map(f => (obj[f.name] = f.value));
  31. let newState = Object.assign({}, state, obj);
  32. return Object.assign({}, newState);
  33. },
  34. list(state, action) {
  35. const data = action.data;
  36. return Object.assign({}, state, {list: data});
  37. },
  38. add(state, action) {
  39. let newOne = Object.assign({}, state.newOne);
  40. let list = state.list;
  41. newOne.key = new Date().getMilliseconds()+(Math.random()*100).toFixed(0);
  42. newOne.code = new Date().getMilliseconds()+(Math.random()*100).toFixed(0);
  43. list.push(newOne);
  44. return Object.assign({}, state, {list});
  45. },
  46. modify(state, action) {
  47. const { newOne } = state;
  48. let list = state.list;
  49. for(let i = 0; i < list.length; i++) {
  50. if(list[i].code === newOne.code) {
  51. list[i] = Object.assign({}, newOne);
  52. break;
  53. }
  54. }
  55. return Object.assign({}, state, {list});
  56. },
  57. delete(state, action) {
  58. const { model } = action;
  59. let { list } = state;
  60. for(let i = 0; i < list.length; i++) {
  61. if(list[i].code === model.code) {
  62. list.splice(i, 1);
  63. }
  64. }
  65. return Object.assign({}, state, {list});
  66. },
  67. setSelected(state, action) {
  68. const { selected } = action;
  69. return Object.assign({}, state, {selected});
  70. },
  71. resetSelected(state, action) {
  72. return Object.assign({}, state, {selected: null});
  73. },
  74. setFilterItem(state, action) {
  75. const { item } = action;
  76. return Object.assign({}, state, {filterItem: item, filterLabel: ''});
  77. },
  78. setFilterLabel(state, action) {
  79. const { label } = action;
  80. return Object.assign({}, state, { filterLabel: label });
  81. },
  82. setNewModelField(state, action) {
  83. const { name, value } = action;
  84. let newOne = state.newOne;
  85. let validInfo = state.validInfo;
  86. newOne[name] = value;
  87. if(['dbType', 'address', 'port', 'dbName', 'userName', 'password'].indexOf(name) !== -1) {
  88. newOne.invalid = undefined;
  89. }
  90. return Object.assign({}, state, { newOne, validInfo });
  91. },
  92. setNewModelFields(state, action) {
  93. const { fields } = action;
  94. let newOne = state.newOne;
  95. for(let i = 0; i < fields.length; i++) {
  96. let n = fields[i]['name'];
  97. let v = fields[i]['value'];
  98. newOne[n] = v;
  99. // 如果改动了需要重新校验的项
  100. if(['dbType', 'address', 'port', 'dbName', 'userName', 'password'].indexOf(n) !== -1) {
  101. newOne.invalid = undefined;
  102. }
  103. }
  104. return Object.assign({}, state, {newOne});
  105. },
  106. setNewModel(state, action) {
  107. const { model } = action;
  108. let newOne = Object.assign({}, model);
  109. newOne.invalid = undefined;
  110. return Object.assign({}, state, {newOne});
  111. },
  112. resetNewModel(state, action) {
  113. let newOne = state.newOne;
  114. delete newOne.name;
  115. // delete newOne.dbType;
  116. delete newOne.address;
  117. delete newOne.port;
  118. delete newOne.dbName;
  119. delete newOne.userName;
  120. delete newOne.password;
  121. delete newOne.description;
  122. delete newOne.demo;
  123. newOne.invalid = undefined;
  124. return Object.assign({}, state, {newOne});
  125. },
  126. setNewModelInvalid(state, action) {
  127. const { value } = action;
  128. let newOne = state.newOne;
  129. newOne.invalid = value;
  130. return Object.assign({}, state, {newOne});
  131. },
  132. reset(state, action) {
  133. let newState = Object.assign({}, state, state.originData);
  134. return Object.assign({}, newState);
  135. },
  136. },
  137. effects: {
  138. *fetchList(action, { select, call, put, takeEvery, takeLatest }) {
  139. const { pageNum, pageSize } = action;
  140. const body = {
  141. pageNum: pageNum || 1,
  142. pageSize: pageSize || 999999999
  143. }
  144. try {
  145. const dataConnect = yield select(state => state.dataConnect);
  146. if(!action.mandatory && dataConnect.list.length > 0) {
  147. return;
  148. }
  149. if(!action.silent) {
  150. yield put({ type: 'setField', name: 'listLoading', value: true });
  151. }
  152. const res = yield call(service.fetch, {
  153. url: URLS.DATACONNECT_LIST,
  154. method: 'GET',
  155. body
  156. });
  157. if(res.code > 0) {
  158. let data = res.data.list.map((r, i) => {
  159. return {
  160. key: i,
  161. code: r.id + '',
  162. name: r.name,
  163. dbName: r.dataName,
  164. dbType: r.databaseType,
  165. address: r.addrass,
  166. port: r.port,
  167. userName: r.userName,
  168. password: r.passWord,
  169. description: r.note,
  170. demo: r.demo
  171. }
  172. });
  173. yield put({ type: 'list', data });
  174. }else {
  175. message.error('读取数据链接配置列表错误: ' + res.msg);
  176. }
  177. }catch(e) {
  178. message.error('读取数据链接配置列表错误: ' + e.message);
  179. }finally {
  180. yield put({ type: 'setField', name: 'listLoading', value: false });
  181. }
  182. },
  183. *remoteValidate(action, { select, call, put, takeEvery, takeLatest }) {
  184. const dataConnect = yield select(state => state.dataConnect);
  185. const model = dataConnect.newOne;
  186. try {
  187. // 设置validating为true
  188. yield put({ type: 'setNewModelField', name: 'validating', value: true });
  189. yield put({ type: 'setNewModelFields', fields: [
  190. { name: 'name', value: model.name || '' },
  191. { name: 'address', value: model.address || '' },
  192. { name: 'port', value: model.port || '' },
  193. { name: 'dbType', value: model.dbType || '' },
  194. { name: 'dbName', value: model.dbName || '' },
  195. { name: 'userName', value: model.userName || '' },
  196. { name: 'password', value: model.password || '' },
  197. ] });
  198. // 调用检测接口检测连接配置是否合法
  199. let validBody = {
  200. id: model.code,
  201. name: model.name,
  202. addrass: model.address,
  203. port: model.port,
  204. databaseType: model.dbType,
  205. dataName: model.dbName,
  206. userName: model.userName,
  207. passWord: model.password
  208. }
  209. const res = yield call(service.fetch, {
  210. url: URLS.DATACONNECT_VALIDATE,
  211. body: validBody,
  212. timeout: 30000
  213. });
  214. // 设置validating为false
  215. yield put({ type: 'setNewModelField', name: 'validating', value: false });
  216. if(res.code > 0) {
  217. // 如果合法
  218. // 设置valid为true
  219. yield put({ type: 'setNewModelInvalid', name: 'invalid', value: false });
  220. message.success('测试通过');
  221. }else {
  222. message.error('校验失败: ' + res.msg);
  223. yield put({ type: 'setNewModelInvalid', name: 'invalid', value: true });
  224. }
  225. }catch(e) {
  226. message.error('校验失败: ' + e.message);
  227. yield put({ type: 'setNewModelField', name: 'validating', value: false });
  228. }
  229. },
  230. *remoteAdd(action, { select, call, put, takeEvery, takeLatest }) {
  231. try {
  232. const dataConnect = yield select(state => state.dataConnect);
  233. const model = dataConnect.newOne;
  234. // 设置validating为true
  235. yield put({ type: 'setNewModelField', name: 'saving', value: true });
  236. let body = {
  237. name: model.name,
  238. addrass: model.address,
  239. port: model.port,
  240. databaseType: model.dbType,
  241. dataName: model.dbName,
  242. userName: model.userName,
  243. passWord: model.password,
  244. note: model.description
  245. }
  246. const res = yield call(service.fetch, {
  247. url: URLS.DATACONNECT_ADD,
  248. body: body,
  249. timeout: 30000
  250. });
  251. yield put({ type: 'setNewModelField', name: 'saving', value: false });
  252. if(res.code > 0) {
  253. yield put({ type: 'setNewModelInvalid', name: 'invalid', value: false });
  254. yield put({ type: 'fetchList', mandatory: true });
  255. message.success('新增成功');
  256. return true;
  257. }else {
  258. message.error('新增失败: ' + res.msg);
  259. yield put({ type: 'setNewModelInvalid', name: 'invalid', value: true });
  260. return false;
  261. }
  262. }catch(e) {
  263. message.error('新增失败: ' + e.message);
  264. yield put({ type: 'setNewModelField', name: 'saving', value: false });
  265. return false;
  266. }
  267. },
  268. *remoteModify(action, { select, call, put }) {
  269. try{
  270. const dataConnect = yield select(state => state.dataConnect);
  271. const model = dataConnect.newOne;
  272. // 设置validating为true
  273. yield put({ type: 'setNewModelField', name: 'saving', value: true });
  274. const code = action.code;
  275. let data = {
  276. id: code,
  277. name: model.name,
  278. addrass: model.address,
  279. port: model.port,
  280. databaseType: model.dbType,
  281. dataName: model.dbName,
  282. userName: model.userName,
  283. passWord: model.password,
  284. note: model.description
  285. };
  286. const res = yield call(service.fetch, {
  287. url: URLS.DATACONNECT_UPDATE,
  288. body: data,
  289. timeout: 30000
  290. });
  291. yield put({ type: 'setNewModelField', name: 'saving', value: false });
  292. if(res.code > 0) {
  293. yield put({ type: 'setNewModelInvalid', name: 'invalid', value: false });
  294. yield put({ type: 'fetchList', mandatory: true });
  295. message.success('修改成功');
  296. return true;
  297. }else {
  298. yield put({ type: 'setNewModelInvalid', name: 'invalid', value: true });
  299. message.error('修改失败: ' + res.msg);
  300. return false;
  301. }
  302. }catch(e) {
  303. message.error('修改失败: ' + e.message);
  304. yield put({ type: 'setNewModelField', name: 'saving', value: false });
  305. return false;
  306. }
  307. },
  308. *remoteDelete(action, { select, call, put, takeEvery, takeLatest }) {
  309. const dataConnect = yield select(state => state.dataConnect);
  310. const code = action.code;
  311. let list = dataConnect.list;
  312. try {
  313. const res = yield call(service.fetch, {
  314. url: URLS.DATACONNECT_DELETE,
  315. body: code
  316. });
  317. if(res.code > 0) {
  318. for(let i = 0; i < list.length; i++) {
  319. if((list[i].code+'') === (code+'')) {
  320. list.splice(i, 1);
  321. break;
  322. }
  323. }
  324. yield put({ type: 'list', data: list });
  325. message.success('删除成功');
  326. }else {
  327. message.error('删除失败: ' + res.msg);
  328. }
  329. }catch(e) {
  330. message.error('删除失败: ' + e.message);
  331. }
  332. }
  333. },
  334. subscriptions: {
  335. setup({ dispatch, history }) {
  336. dispatch({ type: 'reset' });
  337. }
  338. }
  339. };