| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- import {
- weixinLogin,
- } from './api.js'
- import {
- store
- } from '@/store/index.js'
- /**
- * 吊起微信支付
- * @param {Object} data 支付参数对象至少包含:timeStamp,nonceStr,package,signType,paySign
- * @param {String} successTip 支付成功后的提示文本,默认:支付成功
- * @param {String} failTip 支付失败 后的提示文本,默认:支付未完成
- */
- export function wxPay(data, successTip = '支付成功', failTip = '支付未完成') {
- return new Promise((resolve, reject) => {
- if (!data?.timeStamp || !data?.nonceStr || !data?.package || !data?.signType || !data?.paySign)
- return resolve(false)
- uni.requestPayment({
- provider: 'wxpay',
- timeStamp: data.timeStamp,
- nonceStr: data.nonceStr,
- package: data.package,
- signType: data.signType,
- paySign: data.paySign,
- success(result) {
- console.log('wxPay-支付完成', result)
- uni.showToast({
- icon: 'success',
- title: successTip
- })
- resolve(true)
- },
- fail(e) {
- console.error('wxPay-支付未完成', e)
- uni.$u.toast(failTip)
- resolve(false)
- }
- })
- })
- }
- // 封装的微信登录方法
- export async function useWXLogin() {
- // 先尝试从本地存储中读取用户登录后保存的 token ,如果读取到了则表示已经登录过了
- // if (store.token) return true
- // 未登录则执行以下登录的逻辑
- let params = {}
- // 1.调用 uni.getUserProfile() 询问用户是否同意授权登录
- /*
- try {
- const res = await uni.getUserProfile({
- desc: '用户登录',
- lang: 'zh_CN'
- })
- // console.log('获取信息', res); // res[1].userInfo 即可获取到用户的基本信息:头像、名称等
- params.nickname = res.userInfo.nickName
- params.gender = res.userInfo.gender;
- params.avatar = res.userInfo.avatarUrl
- } catch (e) {
- // console.error(e);
- // 用户取消授权的场景
- uni.showToast({
- title: '已取消授权',
- duration: 2000,
- icon: 'none'
- })
- return false
- }
- */
- uni.showLoading({
- mask: true,
- title: '登录中...'
- })
- // console.log(JSON.stringify(res.userInfo)); // res 中就包含了 code 字段值
- // 2.调用 uni.login() 获取用户 code
- const res2 = await uni.login({
- provider: 'weixin', // 登录服务提供商,这里是微信
- })
- // console.log('获取code', res2)
- params.code = res2.code
- console.log(params);
- // 3.调用登录 API 接口进行登录
- const res3 = await weixinLogin(params)
- if (res3.code !== 200) {
- uni.hideLoading()
- return false
- }
- console.log('登录接口回调', res3);
- // 保存返回的 token 到 store 中(同时也会存储到本地存储中)
- store.setToken(res3.data.access_token)
- let data = await getUserDataDetail()
- if (data.code == 200) {
- // 保存返回的 用户信息 到 store 中(同时也会存储到本地存储中)
- store.setUserInfo(data.data)
- }
- uni.hideLoading()
- return true
- }
- /**
- * u-upload 组件上传图片的方法
- * @param {Object} event 是选择的图片对象,对象的 url 属性为图片的本地路径,如果选择的是多张图片请使用便利逐一传入
- */
- export async function uploadImg(event) {
- if (event.hasOwnProperty('file')) event = event.file
- if (typeof event != 'object' || (!event?.url && !event[0]?.url)) return console.error(
- 'hooks.js function uploadImg 接收到的参数有误!', event);
- console.log('上传图片', event);
- uni.showLoading({
- title: '上传中'
- })
- let url = event.length == undefined ? event.url : event[0].url
- return uploadFilePromise(url)
- }
- // 将图片上传到服务器
- const uploadFilePromise = (url) => {
- return new Promise((resolve, reject) => {
- let a = uni.uploadFile({
- url: store.uploadUrl,
- filePath: url,
- name: 'file',
- formData: {
- user: 'test'
- },
- header: {
- Authorization: store.token ? `Bearer ${store.token}` : ''
- },
- success: (res) => {
- if (res.statusCode === 200) {
- let data = JSON.parse(res.data)
- if (data.code === 200) {
- // console.log('上传图片成功', data.data);
- resolve(data.data.url)
- }
- }
- },
- complete() {
- uni.hideLoading()
- }
- });
- })
- }
- // 每次随机生成一个可以当做 id 的不会重复的值:a4168e6598df6
- export function getId() {
- return Math.random().toString(16).slice(2);
- }
- // 格式化时间函数,接收一个长度为 10 位 或者 13 位 的时间戳
- export function getDate(time = Number(new Date()), isGetText = true) {
- // 如果时间戳是 10位 的就 * 1000 转换为 毫秒
- const _time = time.toString().length > 10 ? time : time * 1000
- // 这里传入的时间戳是 10 位的,表示为秒数,所以要乘以 1000 转换为毫秒
- var date = new Date(_time);
- var Y = date.getFullYear();
- var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
- var D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate());
- var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours());
- var m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes());
- var s = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
- // 处理与当前时间相比较的时间格式,比如:3分钟前、1小时前、1天前...
- let text = ''
- if (isGetText) {
- let nd = getDate(undefined, false) // 获取现在的时间信息
- if (Y == nd.Y) {
- if (M == nd.M) {
- if (D == nd.D) {
- if (h == nd.h) { // 同一个小时内
- let mc = nd.m - m
- if (mc > 0) {
- text = `${mc}分钟前`
- } else {
- text = `刚刚` // 一分钟内的时间返回 "刚刚"
- }
- } else {
- text = `${nd.h - h}小时前`
- }
- } else {
- // 判断是否为昨天
- if (D == nd.D - 1) {
- text = `昨天 ${h}:${m}`
- } else {
- text = `${Y}年${M}月${D}日 ${h}:${m}`
- }
- }
- } else {
- text = `${Y}年${M}月${D}日 ${h}:${m}`
- }
- } else {
- text = `${Y}年${M}月${D}日 ${h}:${m}`
- }
- }
- // 返回一个对象
- let obj = {
- date: `${Y}年${M}月${D}日`,
- time: `${h}时${m}分${s}秒`,
- Y,
- M,
- D,
- h,
- m,
- s,
- text // 这里返回的是类似于 1分钟前 这种文字
- }
- return obj;
- }
- // 封装一个验证手机号的方法
- export function isPhone(phone) {
- // 校验手机号的正则
- let reg = /^1[3|4|5|6|7|8][0-9]{9}$/;
- if (reg.test(phone)) {
- return true
- }
- // uni.$u.toast('手机号格式错误')
- return false
- }
- // 拨号
- export function call(phone) {
- if (isPhone(phone)) {
- uni.makePhoneCall({
- phoneNumber: phone
- })
- }
- }
- // 复制
- export function copy(text) {
- if (text) {
- uni.setClipboardData({
- data: text,
- showToast: true // 弹出提示
- })
- }
- }
- /**
- * 图片预览
- * current 为当前显示图片的链接/索引值,不填或填写的值无效则为 urls 的第一张
- * urls 需要预览的图片链接列表。注:如果传入的是一个对象数据,则将图片链接在对象中的字段名作为第三个字段传入
- * key 如果urls是对象数组则会使用 key 在对象中取出链接字段的值
- */
- export function previewImgs(current, urls, key = '') {
- if (key) {
- if (urls.length && typeof urls[0] == 'object') {
- let list = [...urls]
- urls = []
- list.forEach((item, index) => {
- if (item[key]) urls.push(item[key])
- })
- }
- if (typeof current == 'object') {
- current = current[key]
- }
- }
- uni.previewImage({
- urls,
- current
- })
- }
|