app.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. import log from '../config/js/log';
  2. import { getSendData, getAsyncDataFc } from '../config/js/picker';
  3. import interfaces from '../config/js/interfaces';
  4. import { inputCustomTapFc, inputCustomTapCatchFc, filterTypeObj, verifyTypeObj } from '../config/js/input';
  5. import { UpLoadFile, pics_splice } from '../config/js/pics';
  6. import sendSMS from '../config/js/sms';
  7. import { errObj } from './Msg.js';
  8. const Sys = uni.getSystemInfoSync();
  9. const getPickerAsyncData = async function(obj) { // picker-custom与picker-custom2的逐级获取数据函数
  10. let _this = this;
  11. _this.waiting = true; // 在获取数据时不许用户点确定
  12. obj.linkageNum = Number(obj.linkageNum);
  13. const {
  14. value, // picker的value值
  15. index, // picker改变的列的下标
  16. launch, // 是否是初始化
  17. datas, // 所有picker数据
  18. oldValue, // 旧的picker的value值
  19. customId, // 自定义标识
  20. linkageNum // 联动级数
  21. } = obj; // picker的value值, 需改变数据的变量名, 是否初始化时使用该函数,页面当前数据: {data_0: 第一列数据, data_1: 第二列数据, data_2: 第三列数据}, 旧的picker的value值, 逐级获取数据时决定携带数据的变量名
  22. const {
  23. data_0, // 第一列数据
  24. data_1 // 第二列数据
  25. } = datas; // 页面当前数据: {data_0: 第一列数据, data_1: 第二列数据, data_2: 第三列数据}
  26. // 使用sendData访问接口获取数据, 最终需要给async_1、async_2赋值
  27. let sendData = {};
  28. try {
  29. switch (linkageNum) {
  30. case 2: // 二级联动
  31. if (!!_this.memoryData_1[value[0]]) { // 查询记忆数据
  32. _this.async_1 = [..._this.memoryData_1[value[0]]]; // 直接赋值记忆数据
  33. } else {
  34. sendData = getSendData(obj); // 访问接口携带参数
  35. const newData_1 = await getAsyncDataFc(sendData); // 从接口获取第二列的数据
  36. _this.async_1 = [...newData_1]; // 赋值
  37. _this.memoryData_1[value[0]] = [...newData_1]; // 记忆数据
  38. }
  39. if (launch) { // 首次初始化 value为传进来的defaultValue
  40. _this.value[1] = value[1]; // 初始化可以赋值初始化的值
  41. } else {
  42. _this.value[1] = 0; // 第二列value重置为0
  43. }
  44. break;
  45. case 3: // 三级联动
  46. if (launch) { // 首次初始化 value为传进来的defaultValue
  47. // 获取第二列数据
  48. sendData = getSendData({ ...obj,
  49. column: 0
  50. }); // 访问接口携带参数
  51. const newData_1 = await getAsyncDataFc(sendData); // 从接口获取第二列的数据
  52. _this.async_1 = [...newData_1]; // 给第二列赋值
  53. _this.memoryData_1[value[0]] = [...newData_1]; // 记忆数据
  54. _this.value[1] = value[1]; // 初始化可以赋值初始化的值
  55. // 获取第三列数据
  56. sendData = getSendData({ ...obj,
  57. datas: { ...datas,
  58. data_1: [...newData_1]
  59. },
  60. column: 1
  61. }); // 访问接口携带参数
  62. const newData_2 = await getAsyncDataFc(sendData);
  63. _this.async_2 = [...newData_2]; // 给第三列赋值
  64. if (!_this.memoryData_2[value[0]])
  65. _this.memoryData_2[value[0]] = [];
  66. _this.memoryData_2[value[0]][value[1]] = [...newData_2]; // 记忆数据
  67. _this.value[2] = value[2]; // 初始化可以赋值初始化的值
  68. } else { // picker滑动
  69. let newData_1;
  70. let newData_2;
  71. switch (index) {
  72. case 0: // 第一列更改
  73. // 获取第二列数据
  74. if (!!_this.memoryData_1[value[0]]) { // 查询记忆数据
  75. newData_1 = [..._this.memoryData_1[value[0]]]; // 直接赋值记忆数据
  76. } else {
  77. sendData = getSendData({ ...obj,
  78. column: 0
  79. }); // 访问接口携带参数
  80. newData_1 = await getAsyncDataFc(sendData);
  81. _this.memoryData_1[value[0]] = [...newData_1]; // 记忆数据
  82. }
  83. _this.async_1 = [...newData_1]; // 给第二列赋值
  84. _this.value[1] = 0; // 初始化可以赋值初始化的值
  85. // 获取第三列数据
  86. if (!_this.memoryData_2[value[0]])
  87. _this.memoryData_2[value[0]] = [];
  88. if (!!_this.memoryData_2[value[0]][value[1]]) { // 查询记忆数据
  89. newData_2 = [..._this.memoryData_2[value[0]][value[1]]]; // 直接赋值记忆数据
  90. } else {
  91. sendData = getSendData({ ...obj,
  92. datas: { ...datas,
  93. data_1: [...newData_1]
  94. },
  95. column: 1
  96. }); // 访问接口携带参数
  97. newData_2 = await getAsyncDataFc(sendData);
  98. _this.memoryData_2[value[0]][value[1]] = [...newData_2]; // 记忆数据
  99. }
  100. _this.async_2 = [...newData_2] // 给第三列赋值
  101. _this.value[2] = 0; // 初始化可以赋值初始化的值
  102. break;
  103. case 1: // 第二列更改
  104. log('第二列更改')
  105. if (!_this.memoryData_2[value[0]])
  106. _this.memoryData_2[value[0]] = [];
  107. if (!!_this.memoryData_2[value[0]][value[1]]) { // 查询记忆数据
  108. log('有记忆数据');
  109. newData_2 = [..._this.memoryData_2[value[0]][value[1]]]; // 直接赋值记忆数据
  110. } else {
  111. log('没有记忆数据');
  112. sendData = getSendData(obj); // 访问接口携带参数
  113. newData_2 = await getAsyncDataFc(sendData);
  114. _this.memoryData_2[value[0]][value[1]] = [...newData_2]; // 记忆数据
  115. }
  116. _this.async_2 = [...newData_2]; // 给第三列赋值
  117. _this.value[2] = 0; // 初始化可以赋值初始化的值
  118. break;
  119. default:
  120. break;
  121. }
  122. }
  123. break;
  124. }
  125. _this.oldValue = [...this.value];
  126. _this.waiting = false;
  127. } catch (e) {
  128. //TODO handle the exception
  129. log(`picker async 异常: ${JSON.stringify(e)}`);
  130. _this.oldValue = [...this.value];
  131. _this.waiting = false;
  132. }
  133. }
  134. const isArray = function (data) {
  135. return data instanceof Array;
  136. }
  137. const isArrayAndHasLength = function (data) {
  138. return data instanceof Array && data.length > 0;
  139. }
  140. const typeObj = {
  141. input: 'input',
  142. radio: 'radio',
  143. checkbox: 'checkbox',
  144. textarea: 'textarea',
  145. picker_date: 'picker_date',
  146. picker_city: 'picker_city',
  147. picker_custom: 'picker_custom',
  148. picker_custom2: 'picker_custom2',
  149. pics: 'pics',
  150. infinitePics: 'infinitePics',
  151. ['switch']: 'switch'
  152. }
  153. import QSFormObj from './QSForm.js'; // 勿动
  154. const _app = {
  155. log, //打印管理
  156. typeObj,
  157. UpLoadFile,
  158. pics_splice,
  159. sendSMS,
  160. verifyTypeObj, // 内置正则验证
  161. filterTypeObj, // 内置过滤函数
  162. inputCustomTapFc,
  163. inputCustomTapCatchFc,
  164. Sys,
  165. getPickerAsyncData, // picker-custom与picker-custom2的逐级获取数据函数
  166. isArray,
  167. isArrayAndHasLength,
  168. showToast(msg, type) {
  169. uni.showToast({
  170. title: msg,
  171. icon: type || 'none'
  172. })
  173. },
  174. regTest(name, val) {
  175. return verifyTypeObj[name].reg.test(val);
  176. },
  177. isNumber(param) {
  178. return typeof(param) === 'number';
  179. },
  180. countDays(Y, M, val, mode) {
  181. let days = [];
  182. if (mode >= 6) {
  183. days = new Date(Y, M + 1, 0).getDate();
  184. if (val) {
  185. val[2] = val[2] < days - 1 ? val[2] : days - 1;
  186. }
  187. }
  188. return {
  189. days,
  190. val
  191. };
  192. },
  193. countYears(sy, ey) {
  194. let _this = this;
  195. let y = [];
  196. let c = ey - sy;
  197. for (let i = 0; i <= c; i++) {
  198. y.push(sy + i);
  199. }
  200. return y;
  201. },
  202. hideLoading() {
  203. uni.hideLoading();
  204. },
  205. showLoading(msg, ifmask) {
  206. uni.showLoading({
  207. title: msg,
  208. mask: ifmask || false
  209. })
  210. },
  211. previewImage(imgPath, currentIndex) {
  212. if (!(imgPath instanceof Array))
  213. imgPath = [imgPath];
  214. uni.previewImage({
  215. urls: imgPath,
  216. current: currentIndex || 0
  217. })
  218. },
  219. filterParams(params, type, checkOneVariableName) {
  220. if (params.length === 0)
  221. return {};
  222. const arr = getParamsArray(type);
  223. if (params.length > 1) {
  224. const o = {};
  225. Object.keys(params).forEach((item, index) => {
  226. o[arr[index]] = params[index];
  227. })
  228. return o;
  229. } else {
  230. if(params[0] instanceof Object){
  231. if(checkOneVariableName) {
  232. const ps = Object.keys(params[0]);
  233. for(let i = 0; i < ps.length; i++) {
  234. if(arr.includes(ps[i])) {
  235. return params[0];
  236. }
  237. }
  238. return { [arr[0]]: params[0] };
  239. }else{
  240. return params[0];
  241. }
  242. }else{
  243. return { [arr[0]]: params[0] };
  244. }
  245. }
  246. },
  247. formatNum(num) {
  248. return num<10?('0' + num):num;
  249. },
  250. getUpLoadPromiseArray({itemArray, customId, upLoadData, required}) {
  251. if(itemArray.length === 0 && required) {
  252. return Promise.reject({...errObj['102'], errMsg: '上传图片长度为零'});
  253. }else{
  254. const promiseArr = [];
  255. for(let i = 0; i < itemArray.length; i++) {
  256. const item = itemArray[i];
  257. if(item.path) {
  258. promiseArr.push(UpLoadFile(customId, item.path, upLoadData));
  259. }else{
  260. if(item.required) {
  261. const errMsg = `${item.title||`第${i}张图片`}不能为空`;
  262. uni.showToast({title: errMsg, icon: 'none'});
  263. return Promise.reject({...errObj['102'], errMsg});
  264. }else{
  265. promiseArr.push(Promise.resolve(''));
  266. }
  267. }
  268. }
  269. return new Promise((resolve, reject)=>{
  270. const newArr = [...itemArray];
  271. uni.showLoading({
  272. title: '上传文件中'
  273. })
  274. Promise.all(promiseArr).then(res=>{
  275. uni.hideLoading();
  276. for(let i = 0; i < newArr.length; i++) {
  277. newArr[i].upLoadResult = res[i];
  278. }
  279. resolve(newArr);
  280. }).catch(err=>{
  281. uni.hideLoading();
  282. reject(err);
  283. })
  284. });
  285. }
  286. },
  287. delForm(obj) {
  288. QSFormObj.del(obj);
  289. },
  290. setForm(obj) {
  291. QSFormObj.set(obj);
  292. },
  293. getForm(name) {
  294. const {
  295. status,
  296. result
  297. } = QSFormObj.get({
  298. name
  299. });
  300. if (status === 'success') {
  301. // log('getForm数据成功:' + JSON.stringify(res));
  302. return new Promise(async (resolve, reject) => {
  303. try{
  304. const {
  305. data
  306. } = result;
  307. const returnObj ={
  308. name,
  309. ...(await getValue(data))
  310. };
  311. resolve(returnObj);
  312. }catch(e){
  313. //TODO handle the exception
  314. reject(e);
  315. }
  316. });
  317. } else {
  318. console.log(3)
  319. // log('getForm数据失败:' + JSON.stringify(res));
  320. return Promise.reject(result);
  321. }
  322. }
  323. }
  324. export default _app;
  325. function renderUrlData(u, d) {
  326. let c = '';
  327. let n = 0;
  328. if (d) {
  329. for (let i in d) {
  330. let itemd = d[i];
  331. if(itemd instanceof Object || itemd instanceof Array) {
  332. itemd = JSON.stringify(itemd);
  333. }
  334. if (n > 0)
  335. c += '&' + i + '=' + itemd;
  336. else
  337. c += '?' + i + '=' + itemd;
  338. ++n;
  339. }
  340. }
  341. return u + c;
  342. }
  343. const errTypeObj = {
  344. required: 'required',
  345. verifyFc: 'verifyFc',
  346. verifyType: 'verifyType'
  347. }
  348. function getValue(obj) {
  349. const returnObj = {
  350. data: {},
  351. verifyErr: []
  352. };
  353. return new Promise(async (resolve, reject) => {
  354. try{
  355. for (const o in obj) {
  356. const {
  357. title,
  358. name,
  359. variableName,
  360. value,
  361. type,
  362. required,
  363. verifyFc,
  364. verifyType,
  365. customId,
  366. upLoadData
  367. } = obj[o];
  368. const verifyItem = {result: true, checkErrType: [], title, name, variableName, type, errItemArray:[] };
  369. returnObj.data[o] = value;
  370. switch (type){
  371. case typeObj.input: //input
  372. if(required && isEmpty(value)) {
  373. verifyItem.result = false;
  374. verifyItem.checkErrType.push(errTypeObj.required);
  375. }
  376. if(verifyFc&&!verifyFc(value)) {
  377. if(verifyItem.result) verifyItem.result = false;
  378. verifyItem.checkErrType.push(errTypeObj.verifyFc);
  379. }
  380. if(verifyType&&verifyTypeObj[verifyType]!==undefined&&verifyTypeObj[verifyType].reg&&!verifyTypeObj[verifyType].reg.test(value)) {
  381. if(verifyItem.result) verifyItem.result = false;
  382. verifyItem.checkErrType.push(errTypeObj.verifyType);
  383. }
  384. break;
  385. case typeObj.textarea: //textarea
  386. if(required && isEmpty(value)) {
  387. verifyItem.result = false;
  388. verifyItem.checkErrType.push(errTypeObj.required);
  389. }
  390. if(verifyFc&&!verifyFc(value)) {
  391. if(verifyItem.result) verifyItem.result = false;
  392. verifyItem.checkErrType.push(errTypeObj.verifyFc);
  393. }
  394. if(verifyType&&verifyTypeObj[verifyType]!==undefined&&verifyTypeObj[verifyType].reg&&!verifyTypeObj[verifyType].reg.test(value)) {
  395. if(verifyItem.result) verifyItem.result = false;
  396. verifyItem.checkErrType.push(errTypeObj.verifyType);
  397. }
  398. break;
  399. case typeObj.pics: //pics
  400. if(isArrayAndHasLength(value)) {
  401. const notPathArr = value.filter(item=>!item.path && item.required);
  402. if(notPathArr.length > 0) {
  403. if(verifyItem.result) verifyItem.result = false;
  404. verifyItem.checkErrType.push(errTypeObj.required);
  405. verifyItem.errItemArray = notPathArr;
  406. }else{
  407. returnObj.data[o] = await (await _app.getUpLoadPromiseArray({itemArray: value, customId, upLoadData}));
  408. }
  409. }else{
  410. returnObj.data[o] = [];
  411. }
  412. break;
  413. case typeObj.infinitePics: //infinitePics
  414. if(isArrayAndHasLength(value)) {
  415. returnObj.data[o] = await (await _app.getUpLoadPromiseArray({itemArray: value, customId, upLoadData}));
  416. }else{
  417. if(required) {
  418. if(verifyItem.result) verifyItem.result = false;
  419. }else{
  420. returnObj.data[o] = [];
  421. }
  422. }
  423. break;
  424. default: //default
  425. if(required && isEmpty(value)) {
  426. verifyItem.result = false;
  427. verifyItem.checkErrType.push(errTypeObj.required);
  428. }
  429. break;
  430. }
  431. if(!verifyItem.result) returnObj.verifyErr.push(verifyItem);
  432. }
  433. resolve(returnObj);
  434. }catch(e){
  435. //TODO handle the exception
  436. reject(e);
  437. }
  438. })
  439. }
  440. function isEmpty(val) {
  441. let bl;
  442. switch (typeof val){
  443. case 'object':
  444. if(val instanceof Array) {
  445. bl = val.length === 0;
  446. }
  447. break;
  448. default:
  449. bl = val === '';
  450. break;
  451. }
  452. return val === undefined || val === null || bl;
  453. }