hooks.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. import {
  2. weixinLogin,
  3. } from './api.js'
  4. import {
  5. store
  6. } from '@/store/index.js'
  7. /**
  8. * 吊起微信支付
  9. * @param {Object} data 支付参数对象至少包含:timeStamp,nonceStr,package,signType,paySign
  10. * @param {String} successTip 支付成功后的提示文本,默认:支付成功
  11. * @param {String} failTip 支付失败 后的提示文本,默认:支付未完成
  12. */
  13. export function wxPay(data, successTip = '支付成功', failTip = '支付未完成') {
  14. return new Promise((resolve, reject) => {
  15. if (!data?.timeStamp || !data?.nonceStr || !data?.package || !data?.signType || !data?.paySign)
  16. return resolve(false)
  17. uni.requestPayment({
  18. provider: 'wxpay',
  19. timeStamp: data.timeStamp,
  20. nonceStr: data.nonceStr,
  21. package: data.package,
  22. signType: data.signType,
  23. paySign: data.paySign,
  24. success(result) {
  25. console.log('wxPay-支付完成', result)
  26. uni.showToast({
  27. icon: 'success',
  28. title: successTip
  29. })
  30. resolve(true)
  31. },
  32. fail(e) {
  33. console.error('wxPay-支付未完成', e)
  34. uni.$u.toast(failTip)
  35. resolve(false)
  36. }
  37. })
  38. })
  39. }
  40. // 封装的微信登录方法
  41. export async function useWXLogin() {
  42. // 先尝试从本地存储中读取用户登录后保存的 token ,如果读取到了则表示已经登录过了
  43. // if (store.token) return true
  44. // 未登录则执行以下登录的逻辑
  45. let params = {}
  46. // 1.调用 uni.getUserProfile() 询问用户是否同意授权登录
  47. /*
  48. try {
  49. const res = await uni.getUserProfile({
  50. desc: '用户登录',
  51. lang: 'zh_CN'
  52. })
  53. // console.log('获取信息', res); // res[1].userInfo 即可获取到用户的基本信息:头像、名称等
  54. params.nickname = res.userInfo.nickName
  55. params.gender = res.userInfo.gender;
  56. params.avatar = res.userInfo.avatarUrl
  57. } catch (e) {
  58. // console.error(e);
  59. // 用户取消授权的场景
  60. uni.showToast({
  61. title: '已取消授权',
  62. duration: 2000,
  63. icon: 'none'
  64. })
  65. return false
  66. }
  67. */
  68. uni.showLoading({
  69. mask: true,
  70. title: '登录中...'
  71. })
  72. // console.log(JSON.stringify(res.userInfo)); // res 中就包含了 code 字段值
  73. // 2.调用 uni.login() 获取用户 code
  74. const res2 = await uni.login({
  75. provider: 'weixin', // 登录服务提供商,这里是微信
  76. })
  77. // console.log('获取code', res2)
  78. params.code = res2.code
  79. console.log(params);
  80. // 3.调用登录 API 接口进行登录
  81. const res3 = await weixinLogin(params)
  82. if (res3.code !== 200) {
  83. uni.hideLoading()
  84. return false
  85. }
  86. console.log('登录接口回调', res3);
  87. // 保存返回的 token 到 store 中(同时也会存储到本地存储中)
  88. store.setToken(res3.data.access_token)
  89. let data = await getUserDataDetail()
  90. if (data.code == 200) {
  91. // 保存返回的 用户信息 到 store 中(同时也会存储到本地存储中)
  92. store.setUserInfo(data.data)
  93. }
  94. uni.hideLoading()
  95. return true
  96. }
  97. /**
  98. * u-upload 组件上传图片的方法
  99. * @param {Object} event 是选择的图片对象,对象的 url 属性为图片的本地路径,如果选择的是多张图片请使用便利逐一传入
  100. */
  101. export async function uploadImg(event) {
  102. if (event.hasOwnProperty('file')) event = event.file
  103. if (typeof event != 'object' || (!event?.url && !event[0]?.url)) return console.error(
  104. 'hooks.js function uploadImg 接收到的参数有误!', event);
  105. console.log('上传图片', event);
  106. uni.showLoading({
  107. title: '上传中'
  108. })
  109. let url = event.length == undefined ? event.url : event[0].url
  110. return uploadFilePromise(url)
  111. }
  112. // 将图片上传到服务器
  113. const uploadFilePromise = (url) => {
  114. return new Promise((resolve, reject) => {
  115. let a = uni.uploadFile({
  116. url: store.uploadUrl,
  117. filePath: url,
  118. name: 'file',
  119. formData: {
  120. user: 'test'
  121. },
  122. header: {
  123. Authorization: store.token ? `Bearer ${store.token}` : ''
  124. },
  125. success: (res) => {
  126. if (res.statusCode === 200) {
  127. let data = JSON.parse(res.data)
  128. if (data.code === 200) {
  129. // console.log('上传图片成功', data.data);
  130. resolve(data.data.url)
  131. }
  132. }
  133. },
  134. complete() {
  135. uni.hideLoading()
  136. }
  137. });
  138. })
  139. }
  140. // 每次随机生成一个可以当做 id 的不会重复的值:a4168e6598df6
  141. export function getId() {
  142. return Math.random().toString(16).slice(2);
  143. }
  144. // 格式化时间函数,接收一个长度为 10 位 或者 13 位 的时间戳
  145. export function getDate(time = Number(new Date()), isGetText = true) {
  146. // 如果时间戳是 10位 的就 * 1000 转换为 毫秒
  147. const _time = time.toString().length > 10 ? time : time * 1000
  148. // 这里传入的时间戳是 10 位的,表示为秒数,所以要乘以 1000 转换为毫秒
  149. var date = new Date(_time);
  150. var Y = date.getFullYear();
  151. var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
  152. var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
  153. var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours());
  154. var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
  155. var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
  156. // 处理与当前时间相比较的时间格式,比如:3分钟前、1小时前、1天前...
  157. let text = ''
  158. if (isGetText) {
  159. let nd = getDate(undefined, false) // 获取现在的时间信息
  160. if (Y == nd.Y) {
  161. if (M == nd.M) {
  162. if (D == nd.D) {
  163. if (h == nd.h) { // 同一个小时内
  164. let mc = nd.m - m
  165. if (mc > 0) {
  166. text = `${mc}分钟前`
  167. } else {
  168. text = `刚刚` // 一分钟内的时间返回 "刚刚"
  169. }
  170. } else {
  171. text = `${nd.h - h}小时前`
  172. }
  173. } else {
  174. // 判断是否为昨天
  175. if (D == nd.D - 1) {
  176. text = `昨天 ${h}:${m}`
  177. } else {
  178. text = `${Y}年${M}月${D}日 ${h}:${m}`
  179. }
  180. }
  181. } else {
  182. text = `${Y}年${M}月${D}日 ${h}:${m}`
  183. }
  184. } else {
  185. text = `${Y}年${M}月${D}日 ${h}:${m}`
  186. }
  187. }
  188. // 返回一个对象
  189. let obj = {
  190. date: `${Y}年${M}月${D}日`,
  191. time: `${h}时${m}分${s}秒`,
  192. Y,
  193. M,
  194. D,
  195. h,
  196. m,
  197. s,
  198. text // 这里返回的是类似于 1分钟前 这种文字
  199. }
  200. return obj;
  201. }
  202. // 封装一个验证手机号的方法
  203. export function isPhone(phone) {
  204. // 校验手机号的正则
  205. let reg = /^1[3|4|5|6|7|8][0-9]{9}$/;
  206. if (reg.test(phone)) {
  207. return true
  208. }
  209. // uni.$u.toast('手机号格式错误')
  210. return false
  211. }
  212. // 拨号
  213. export function call(phone) {
  214. if (isPhone(phone)) {
  215. uni.makePhoneCall({
  216. phoneNumber: phone
  217. })
  218. }
  219. }
  220. // 复制
  221. export function copy(text) {
  222. if (text) {
  223. uni.setClipboardData({
  224. data: text,
  225. showToast: true // 弹出提示
  226. })
  227. }
  228. }
  229. /**
  230. * 图片预览
  231. * current 为当前显示图片的链接/索引值,不填或填写的值无效则为 urls 的第一张
  232. * urls 需要预览的图片链接列表。注:如果传入的是一个对象数据,则将图片链接在对象中的字段名作为第三个字段传入
  233. * key 如果urls是对象数组则会使用 key 在对象中取出链接字段的值
  234. */
  235. export function previewImgs(current, urls, key = '') {
  236. if (key) {
  237. if (urls.length && typeof urls[0] == 'object') {
  238. let list = [...urls]
  239. urls = []
  240. list.forEach((item, index) => {
  241. if (item[key]) urls.push(item[key])
  242. })
  243. }
  244. if (typeof current == 'object') {
  245. current = current[key]
  246. }
  247. }
  248. uni.previewImage({
  249. urls,
  250. current
  251. })
  252. }