fa.mixin.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. export const tools = {
  2. filters: {
  3. },
  4. computed: {
  5. },
  6. methods: {
  7. //富文本的回调
  8. navigate(e) {
  9. if (e.href && e.href.indexOf('http') == -1) { //不完整的链接
  10. //详情
  11. let res = e.href.match(new RegExp("(a)|(\\d+)", 'g'));
  12. if (res.length == 2) {
  13. this.$u.route('/pages/article/detail', {
  14. id: res[1]
  15. });
  16. return;
  17. }
  18. // #ifdef MP
  19. this.$util.uniCopy({
  20. content: this.vuex_config.upload.cdnurl + e.href,
  21. success: () => {
  22. this.$u.toast('链接已复制,请在浏览器中打开')
  23. }
  24. })
  25. // #endif
  26. // #ifndef MP
  27. window.open(this.vuex_config.upload.cdnurl + e.href);
  28. // #endif
  29. }
  30. },
  31. //预览图片
  32. lookImage(index) {
  33. uni.previewImage({
  34. current: index,
  35. urls: this.imagesList,
  36. longPressActions: {
  37. itemList: ['发送给朋友', '保存图片', '收藏'],
  38. success: function(data) {
  39. console.log(data)
  40. },
  41. fail: function(err) {
  42. console.log(err.errMsg);
  43. }
  44. }
  45. });
  46. },
  47. //复制url
  48. copyUrl() {
  49. this.$util.uniCopy({
  50. content: window.location.href,
  51. success: () => {
  52. this.$u.toast('复制成功,请去粘贴发送给好友吧');
  53. },
  54. error: () => {
  55. console.log('复制失败!')
  56. }
  57. })
  58. },
  59. //cdnurl
  60. cdnurl(url) {
  61. if (!/^((?:[a-z]+:)?\/\/|data:image\/)(.*)/.test(url)) {
  62. return this.vuex_config.upload.cdnurl + url;
  63. };
  64. return url;
  65. },
  66. //页面跳转
  67. goPage(path, auth) {
  68. if (path == 'out') {
  69. this.$u.vuex('vuex_token', '');
  70. this.$u.vuex('vuex_user', {});
  71. return;
  72. }
  73. if (auth && !this.vuex_token) {
  74. this.$u.route('/pages/login/mobilelogin');
  75. return;
  76. }
  77. let type = 'navigateTo';
  78. // #ifdef MP-WEIXIN
  79. //优化当pages超过5个时的处理
  80. let pages = getCurrentPages();
  81. type = pages.length >= 4 ? 'redirectTo' : type;
  82. // #endif
  83. uni.$u.route({
  84. url: path,
  85. type: type,
  86. complete(e) {
  87. console.log(e, path)
  88. }
  89. })
  90. }
  91. }
  92. }
  93. //点赞
  94. export const vote = {
  95. methods: {
  96. likes: async function() {
  97. const value = uni.getStorageSync(`${this.id}_${this.vuex_user.id}`);
  98. if (value == this.id) {
  99. this.$u.toast('您已经点过赞了')
  100. return;
  101. }
  102. let res = await this.$api.getArchivesVote({
  103. id: this.id,
  104. type: 'like'
  105. })
  106. this.$u.toast(res.msg);
  107. if (!res.code) {
  108. return;
  109. };
  110. //先在前端限制
  111. uni.setStorageSync(`${this.id}_${this.vuex_user.id}`, this.id);
  112. this.$set(this.archivesInfo, 'likes', res.data.likes)
  113. },
  114. collection(id, type) {
  115. this.$api.addCollection({
  116. aid: id,
  117. type: type
  118. }).then(res => {
  119. this.$u.toast(res.msg)
  120. })
  121. }
  122. }
  123. }
  124. //修改头像的事件
  125. export const avatar = {
  126. methods: {
  127. chooseAvatar() {
  128. uni.$on('uAvatarCropper', this.upload);
  129. this.$u.route({
  130. // 关于此路径,请见下方"注意事项"
  131. url: '/uview-ui/components/u-avatar-cropper/u-avatar-cropper',
  132. // 内部已设置以下默认参数值,可不传这些参数
  133. params: {
  134. // 输出图片宽度,高等于宽,单位px
  135. destWidth: 300,
  136. // 裁剪框宽度,高等于宽,单位px
  137. rectWidth: 300,
  138. // 输出的图片类型,如果'png'类型发现裁剪的图片太大,改成"jpg"即可
  139. fileType: 'jpg'
  140. }
  141. });
  142. },
  143. upload: async function(path) {
  144. uni.$off('uAvatarCropper', this.upload);
  145. // 可以在此上传到服务端
  146. try {
  147. let res = await this.$api.goUpload({
  148. filePath: path
  149. });
  150. if (!res.code) {
  151. this.$u.toast(res.msg);
  152. };
  153. this.form.avatar = res.data.url;
  154. this.url = res.data.fullurl;
  155. if (typeof this.editAvatar == 'function') {
  156. this.editAvatar();
  157. }
  158. } catch (e) {
  159. console.error(e);
  160. this.$u.toast('图片上传失败!');
  161. }
  162. }
  163. }
  164. }
  165. //form
  166. export const formRule = {
  167. methods: {
  168. //表单验证
  169. getRules(row) {
  170. let arr = row.rule.split(';');
  171. let rule_arr = [];
  172. arr.forEach(item => {
  173. item = this.$u.trim(item);
  174. switch (item) {
  175. case 'required':
  176. case 'checked':
  177. rule_arr.push({
  178. validator: (rule, value, callback) => {
  179. if (typeof value == 'string') {
  180. value = value.replace(/<[^>]+>/g, "").replace(/\s/ig, "");
  181. }
  182. return !(this.$u.test.empty(value));
  183. },
  184. message: row.title + '不能为空',
  185. // 可以单个或者同时写两个触发验证方式
  186. trigger: ['change', 'blur']
  187. });
  188. break;
  189. case 'digits': //数字校验
  190. rule_arr.push({
  191. validator: (rule, value, callback) => {
  192. return this.$u.test.digits(value);
  193. },
  194. message: '请填写数字',
  195. trigger: ['change', 'blur']
  196. });
  197. break;
  198. case 'letters': //字母校验
  199. rule_arr.push({
  200. validator: (rule, value, callback) => {
  201. return this.$u.test.letter(value);
  202. },
  203. message: '请填写字母',
  204. trigger: ['change', 'blur']
  205. });
  206. break;
  207. case 'date': //日期校验
  208. rule_arr.push({
  209. validator: (rule, value, callback) => {
  210. return this.$u.test.date(value);
  211. },
  212. message: '请填写正确日期格式',
  213. trigger: ['change', 'blur']
  214. });
  215. break;
  216. case 'time': //时间校验
  217. rule_arr.push({
  218. validator: (rule, value, callback) => {
  219. return /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/.test(value);
  220. },
  221. message: '请填写正确时间格式',
  222. trigger: ['change', 'blur']
  223. });
  224. break;
  225. case 'email': //邮箱校验
  226. rule_arr.push({
  227. validator: (rule, value, callback) => {
  228. return this.$u.test.email(value);
  229. },
  230. message: '请填写正确邮箱',
  231. trigger: ['change', 'blur']
  232. });
  233. break;
  234. case 'url': //网址
  235. rule_arr.push({
  236. validator: (rule, value, callback) => {
  237. return this.$u.test.url(value);
  238. },
  239. message: '请填写正确网址',
  240. trigger: ['change', 'blur']
  241. });
  242. break;
  243. case 'qq': //qq
  244. rule_arr.push({
  245. validator: (rule, value, callback) => {
  246. return /^[1-9][0-9]{4,10}$/.test(value);
  247. },
  248. message: '请填写正确QQ号码',
  249. trigger: ['change', 'blur']
  250. });
  251. break;
  252. case 'IDcard': //身份证
  253. rule_arr.push({
  254. validator: (rule, value, callback) => {
  255. return this.$u.test.idCard(value);
  256. },
  257. message: '请填写正确身份证件号',
  258. trigger: ['change', 'blur']
  259. });
  260. break;
  261. case 'tel': //电话
  262. rule_arr.push({
  263. validator: (rule, value, callback) => {
  264. return /^\d{3}-\d{8}$|^\d{4}-\d{7,8}$/.test(value);
  265. },
  266. message: '请填写正确电话号码',
  267. trigger: ['change', 'blur']
  268. });
  269. break;
  270. case 'mobile': //手机
  271. rule_arr.push({
  272. validator: (rule, value, callback) => {
  273. return this.$u.test.mobile(value);
  274. },
  275. message: '请填写正确手机号码',
  276. trigger: ['change', 'blur']
  277. });
  278. break;
  279. case 'zipcode': //邮编
  280. rule_arr.push({
  281. validator: (rule, value, callback) => {
  282. return /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/
  283. .test(value);
  284. },
  285. message: '请填写正确邮编',
  286. trigger: ['change', 'blur']
  287. });
  288. break;
  289. case 'chinese': //中文
  290. rule_arr.push({
  291. validator: (rule, value, callback) => {
  292. return /^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])+$/
  293. .test(
  294. value
  295. );
  296. },
  297. message: '请填写中文',
  298. trigger: ['change', 'blur']
  299. });
  300. break;
  301. case 'username': //用户名
  302. rule_arr.push({
  303. validator: (rule, value, callback) => {
  304. return /^[a-zA-Z0-9_]{3,12}$/.test(value);
  305. },
  306. message: '请填写3-12位数字、字母、下划线',
  307. trigger: ['change', 'blur']
  308. });
  309. break;
  310. case 'password': //密码
  311. rule_arr.push({
  312. validator: (rule, value, callback) => {
  313. let val = this.$u.trim(value, 'all');
  314. if (val != value) {
  315. return false;
  316. }
  317. return /^[0-9a-zA-Z!@#$%^&*?]{6,16}$/.test(value);
  318. },
  319. message: '请填写6-16位字符,不能包含空格',
  320. trigger: ['change', 'blur']
  321. });
  322. break;
  323. }
  324. });
  325. //多选额外的判断
  326. if (row.type == 'checkbox') {
  327. //最少
  328. if (row.minimum > 0) {
  329. rule_arr.push({
  330. validator: (rule, value, callback) => {
  331. if (!value) {
  332. return false;
  333. }
  334. let arr = value.split(',')
  335. return arr.length >= row.minimum;
  336. },
  337. message: '最少必须选择' + row.minimum + '项',
  338. // 可以单个或者同时写两个触发验证方式
  339. trigger: ['change', 'blur']
  340. });
  341. }
  342. }
  343. if (['checkbox', 'selects', 'images', 'files'].indexOf(row.type) != -1) {
  344. //最多
  345. if (row.maximum > 0) {
  346. rule_arr.push({
  347. validator: (rule, value, callback) => {
  348. if (!value) {
  349. return false;
  350. }
  351. let arr = value.split(',')
  352. return arr.length <= row.maximum;
  353. },
  354. message: '最多只能选择' + row.maximum + '项',
  355. // 可以单个或者同时写两个触发验证方式
  356. trigger: ['change', 'blur']
  357. });
  358. }
  359. }
  360. return rule_arr;
  361. }
  362. }
  363. }
  364. //登录成功跳转
  365. export const loginfunc = {
  366. methods: {
  367. //登录成功
  368. success(index = 1) {
  369. //不在H5
  370. // #ifndef H5
  371. uni.$u.route({
  372. type: 'back',
  373. delta: index
  374. })
  375. // #endif
  376. // 在H5 刷新导致路由丢失
  377. // #ifdef H5
  378. var pages = getCurrentPages();
  379. //有上次页面,关闭所有页面,到此页面,是从授权的,授权页面被刷新过,路由栈丢失
  380. if (pages.length <= 1 || pages[0].route == 'pages/login/auth') {
  381. //默认到首页
  382. uni.reLaunch({
  383. url: (this.vuex_lasturl || '/pages/index/index'),
  384. complete(res) {
  385. console.log(res)
  386. }
  387. })
  388. return;
  389. }
  390. uni.$u.route({
  391. type: 'back',
  392. delta: index
  393. })
  394. // #endif
  395. },
  396. // #ifdef H5
  397. async goAuth() {
  398. if (this.$util.isWeiXinBrowser()) {
  399. let url = '';
  400. if (window.location.hash != '') {
  401. url = window.location.origin + window.location.pathname + '?hashpath=/pages/login/auth'
  402. } else {
  403. url = window.location.origin + window.location.pathname.replace(/pages.*/,
  404. 'pages/login/auth');
  405. };
  406. let res = await this.$api.getAuthUrl({
  407. platform: 'wechat',
  408. url: url
  409. });
  410. if (!res.code) {
  411. this.$u.toast(res.msg);
  412. return;
  413. }
  414. var pages = getCurrentPages();
  415. let len = pages.length;
  416. if (len > 1) {
  417. let url = pages[len - 1].route;
  418. if (url.includes('login')) {
  419. //找到上一个不是登录页面
  420. for (let i = len - 1; i >= 0; i--) {
  421. if (!pages[i].route.includes('login')) {
  422. this.$u.vuex('vuex_lasturl', '/' + pages[i].route + this.$u.queryParams(pages[i]
  423. .options));
  424. break;
  425. }
  426. }
  427. } else {
  428. this.$u.vuex('vuex_lasturl', '/' + url + this.$u.queryParams(pages[pages.length - 1]
  429. .options))
  430. }
  431. }
  432. window.location.href = res.data;
  433. }
  434. },
  435. // #endif
  436. // #ifdef APP-PLUS
  437. goAppLogin(index = 1) {
  438. let that = this;
  439. var all, Service;
  440. // 1.发送请求获取code
  441. plus.oauth.getServices(
  442. function(Services) {
  443. all = Services;
  444. Object.keys(all).some(key => {
  445. if (all[key].id == 'weixin') {
  446. Service = all[key];
  447. }
  448. });
  449. Service.authorize(
  450. async function(e) {
  451. console.log(e);
  452. let res = await that.$api.goAppLogin({
  453. code: e.code,
  454. scope: e.scope
  455. });
  456. if (!res.code) {
  457. that.$u.toast(res.msg);
  458. return;
  459. }
  460. if (res.data.user) {
  461. that.$u.vuex('vuex_token', res.data.user.token);
  462. that.$u.vuex('vuex_user', res.data.user || {});
  463. that.success(index);
  464. return;
  465. }
  466. that.$u.vuex('vuex_third', res.data.third);
  467. that.$u.route('/pages/login/register?bind=bind');
  468. },
  469. function(e) {
  470. that.$u.toast('授权失败!');
  471. }
  472. );
  473. },
  474. function(err) {
  475. console.log(err);
  476. that.$u.toast('授权失败!');
  477. }
  478. );
  479. }
  480. // #endif
  481. }
  482. }