fa.mixin.js 11 KB

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