"use strict"; const common_vendor = require("../vendor.js"); const store_index = require("../../store/index.js"); const common_js_config = require("./config.js"); const api_index = require("../../api/index.js"); const utils_msgtype = require("../../utils/msgtype.js"); const TUIKit_debug_GenerateTestUserSig = require("../../TUIKit/debug/GenerateTestUserSig.js"); const util = { // 配置参数 config: common_js_config.config, // 正则 reg: { // 手机号 tel: /^1[3-9]\d{9}$/, // 身份证 idCard: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ }, /** * 弹窗 * @param {Object|String} obj String类型只是弹出文字 object如下 * @param {String} obj.title 弹窗的标题 * @param {String} obj.content 弹窗的内容 * @param {String} obj.confirmText 确定的文本 * @param {String} obj.showCancel 是否显示取消 * @param {String} obj.cancelText 取消的文本 * @param {Function} params.success 请求成功回调 可通过promise.then捕获 * @param {Function} params.fail 请求失败回调 可通过promise.catch捕获 * @param {Function} params.complete 请求结束回调 无论是否成功失败都会执行 * @return {Object} string返回null object返回返回promis对象 执行成功返回resolve 执行失败返回reject */ alert(obj) { if (obj == null || obj == void 0) return; if (typeof obj == "string" || typeof obj == "number") { common_vendor.index.showToast({ "title": "" + obj, "icon": "none", duration: 3e3 }); return null; } obj.title = obj.title ? obj.title : ""; obj.content = obj.content ? obj.content : ""; obj.confirmText = obj.confirmText ? obj.confirmText : "确定"; obj.showCancel = obj.showCancel === false ? false : true; obj.cancelText = obj.cancelText ? obj.cancelText : "取消"; return new Promise((resolve, reject) => { common_vendor.index.showModal({ title: obj.title, content: obj.content, confirmText: obj.confirmText, showCancel: obj.showCancel, cancelText: obj.cancelText, success: (res) => { obj.success ? obj.success(res) : () => { }; resolve(res); }, fail: (err) => { obj.fail ? obj.fail(err) : () => { }; reject(err); }, complete: (res) => { } }); }); }, /** * 上传文件 * @param {Object} obj * @param {String} obj.mode img图片 video视频 */ upload(obj) { return new Promise((resolve, reject) => { let token = common_vendor.index.getStorageSync("token") || ""; obj.url = obj.url ? obj.url : api_index.api[{ img: "uploadImg", video: "uploadVideo" }[obj.mode]]; console.log("obj.url", obj.url); obj.file = obj.file ? obj.file : ""; obj.data = obj.data ? obj.data : {}; obj.header = { // 'Content-Type': 'multipart/form-data; ', // 'Content-Type': 'application/json;charset=UTF-8', "Access-Control-Allow-Origin": "*", ...obj.header }; if (token) obj.header["Authorization"] = `Bearer ${token}`; common_vendor.index.showLoading({ title: "正在上传" }); common_vendor.index.uploadFile({ url: util.config.host + obj.url, filePath: obj.file, header: obj.header, formData: obj.data, dataType: "json", name: "file", success: (res) => { common_vendor.index.hideLoading(); obj.success ? obj.success(JSON.parse(res.data)) : ""; resolve(JSON.parse(res.data)); }, fail: (res) => { common_vendor.index.hideLoading(); obj.fail ? obj.fail(res.data) : ""; reject(res); } }); }); }, /** * 发送网络请求 * @param {Object} params 传参 * @param {String} params.url 请求地址 一般用于后台请求接口 * @param {Array} params.query 请求地址拼接参数 用于后台请求地址拼接补全 * @param {String} params.fullurl 全请求地址 一般用于第三方请求地址 * @param {Boolean} params.load 是否显示加载动画 默认不显示 * @param {Object} params.data 请求入参 没有则不传 * @param {Object} params.header 请求头 默认不传 * @param {String} params.method 请求方式 默认值POST * @param {Function} params.success 请求成功回调 可通过promise.then捕获 * @param {Function} params.fail 请求失败回调 可通过promise.catch捕获 * @param {Function} params.complete 请求结束回调 无论是否成功失败都会执行 * @return {Object} 返回promis对象 执行成功返回resolve 执行失败返回reject */ request(params) { let token = common_vendor.index.getStorageSync("token") || ""; return new Promise((resolve, reject) => { let url = util.config.host + (params.url ? params.url : "/api/index/index"); if (params.path && params.path instanceof Array) params.path.forEach((item) => { url += `/${item}`; }); if (common_js_config.config.env == "config") { url = util.setUrl(url, params.query); } if (common_js_config.config.env == "test") { if (params.query) { url = util.setUrl(url, { ...params.query, userId: 16 }); } params.data = { ...params.data, userId: 16 }; } if (params.load) { common_vendor.index.showLoading({ title: "加载中", mask: true }); } params.header = { "ngrok-skip-browser-warning": true, "Content-Type": "application/json;charset=UTF-8", "Access-Control-Allow-Headers": "Origin, X-Requested-With, Content-Type, Accept", // token: uni.getStorageSync('token'), "Access-Control-Allow-Origin": "*", ...params.header }; if (token) params.header["Authorization"] = `Bearer ${token}`; common_vendor.index.request({ // 请求地址 url, // 请求方式 get/post method: params.method ? params.method : "POST", // 是否开启SSL验证 sslVerify: false, // 请求参数 data: params.data, // header请求头 header: params.header, // 数据类型 dataType: "json", // 请求成功返回 success: (res) => { if (params.load) { common_vendor.index.hideLoading(); } if (res.data.code == 401) { util.logout(() => { util.alert("请先登录"); reject(res.data); }); } params.success ? params.success(res.data) : ""; resolve(res.data); }, // 请求失败返回 fail: (res) => { if (params.load) { common_vendor.index.hideLoading(); } params.fail ? params.fail(res) : ""; reject(res); }, complete(res) { params.complete ? params.complete(res) : ""; } }); }); }, // 替换图片的宽度为最大宽度100% (移动端解析html富文本专用) imgReplace(value, th) { if (!th) { value = value.replace(//ig, '

').replace(/ 0 ? "?" + new URLSearchParams(params) : ""; const fullUrl = `${url}${paramStr}`; switch (method) { case "navigateTo": common_vendor.index.navigateTo({ url: fullUrl }); break; case "redirectTo": common_vendor.index.redirectTo({ url: fullUrl }); break; case "reLaunch": common_vendor.index.reLaunch({ url: fullUrl }); break; case "switchTab": common_vendor.index.switchTab({ url: fullUrl }); break; default: throw new Error(`Unsupported method: ${method}`); } }, /** * get参数拼接 * @param {Object} data 需要转化的对象 */ set_param(data) { let url = ""; if (!data) data = []; for (let [key, value] of Object.entries(data)) { url += `${key}=${value}&`; } url = url.substring(url.length - 1) == "&" ? url.substring(0, url.length - 1) : url; return url ? url : url.substring(1); }, /** * get参数拼接url * @param {String} url 需要处理的url * @param {Object} data 需要转化的Object对象 */ setUrl(url, data) { let result = url += (url.indexOf("?") < 0 ? "?" : "&") + util.set_param(data); return result; }, /** * query字符串转对象 * @param {Object} str query字符串 */ query_to_param(str) { let obj = {}; decodeURIComponent(str).split("&").forEach((item) => { let [key, val] = item.split("="); obj[key] = val; }); return obj; }, /** * 倒计时 * @param {String} endtime 结束时间 */ countDownd(endtime) { if (!endtime) { return; } endtime = Number(endtime); let day = util.timeFormin(parseInt(time / (60 * 60 * 24))); let hou = util.timeFormin(parseInt(time % (60 * 60 * 24) / 3600)); let min = util.timeFormin(parseInt(time % (60 * 60 * 24) % 3600 / 60)); let sec = util.timeFormin(parseInt(time % (60 * 60 * 24) % 3600 % 60)); let str = ""; if (day) { str += day + "天"; } if (hou || hou == 0) { if (hou > 9) { str += hou + ":"; } else { str += "0" + hou + ":"; } } else { str += "00:"; } if (min || min == 0) { if (min > 9) { str += min + ":"; } else { str += "0" + min + ":"; } } else { str += "00:"; } if (sec) { if (sec > 9) { str += sec; } else { str += "0" + sec; } } else { str += "00"; } return str; }, // 格式化时间 timeFormin(param) { return param < 0 ? 0 : param; }, /** * 对二补齐 * @param {String} str 数字或数字字符串 */ toTwo(str) { let num = String(Number(str)); if (num.length < 2) { num = "0" + num; } return num; }, /** * 时间戳处理成时间 * @param {Object} str * 时间格式 月、日、时、分、秒 单个字母不补0 * yyyy 年 * MM 月 * dd 日 * WW 周 * HH 小时 24小时制 * hh 小时 12小时制 * mm 分钟 * ss 秒 * a am/pm * 比如 'yyyy-MM-dd HH:mm:ss 周w a' 返回2023-02-06 11:19:19 周一 pm * @param {Number} timestamp 需要处理时间戳 */ formatTime(str, timestamp) { const nowDate = /* @__PURE__ */ new Date(); let weekList = ["日", "一", "二", "三", "四", "五", "六"]; if (!str || typeof str != "string") { str = "yyyy-MM-dd HH:mm:ss"; } if (!timestamp) { timestamp = nowDate.valueOf(); } else if (String(timestamp).length <= 10) { timestamp = timestamp * 1e3; } const date = new Date(timestamp); let year = date.getFullYear(), moth = date.getMonth() + 1, day = date.getDate(), week = date.getDay(), hour = date.getHours(), minute = date.getMinutes(), second = date.getSeconds(); str = str.replace("yyyy", year); str = str.replace("MM", this.toTwo(moth)); str = str.replace("M", moth); str = str.replace("dd", this.toTwo(day)); str = str.replace("d", day); str = str.replace("w", weekList[week]); if (str.match("h")) { hour = hour > 12 ? hour - 12 : hour; str = str.replace("hh", this.toTwo(hour)); str = str.replace("h", hour); } else if (str.match("H")) { str = str.replace("HH", this.toTwo(hour)); str = str.replace("H", hour); } str = str.replace("mm", this.toTwo(minute)); str = str.replace("m", minute); str = str.replace("ss", this.toTwo(second)); str = str.replace("s", second); let a = hour > 12 ? "am" : "pm"; str = str.replace("a", a); return str; }, /** * 时间计算 * @param {String} format 格式化 规则 * format '+1 month' 往后一个月 * @param {Number} value 需要处理的时间戳 单位秒 */ strtotime(format, value) { if (value && format.indexOf(" ") > -1) { let unit = format.split(" "); let pre = unit[0]; let next = unit[1]; if (!value) value = nowDate2.valueOf(); else if (String(value).length <= 10) value = value * 1e3; let nowDate2 = new Date(value); switch (next) { case "year": nowDate2.setYear(nowDate2.getFullYear() + parseInt(pre)); break; case "month": nowDate2.setMonth(nowDate2.getMonth() + parseInt(pre)); break; case "day": nowDate2.setDate(nowDate2.getDate() + parseInt(pre)); break; case "week": nowDate2.setDate(nowDate2.getDate() + parseInt(pre) * 7); break; case "hour": nowDate2.setHours(nowDate2.getHours() + parseInt(pre)); break; case "minute": nowDate2.setMinutes(nowDate2.getMinutes() + parseInt(pre)); break; } return nowDate2.getTime(); } else { var nowDate = new Date(value); return nowDate.getTime(); } }, /** * 上传图片 * @param {Object} obj 对象类型 * @param {Array} obj.value 操作的对象 * @param {Boolean} obj.unlimited 不限制 * @param {Number} obj.count 图片计数 * @param {Number} obj.type 1单张 2多张 * @param {Array} obj.sourceType ['album', 'camera'] * @param {Function} obj.success 执行成功返回的方法return修改的对象 */ upload_image(obj) { const count = obj.count ? obj.count : 8; if (!obj.type) obj.type = 2; if (obj.value != "" && obj.value == void 0 && obj.value == null) obj.value = obj.type == 1 ? "" : []; if (obj.value.length >= count && obj.type == 2) { util.alert("上传图片已达上限"); return; } let sourceType = ["album", "camera"]; common_vendor.index.chooseImage({ // 限制图片 count: obj.type == 1 ? 1 : count - obj.value.length, sourceType: obj.sourceType || sourceType, success: (rs) => { rs.tempFiles.forEach((item) => { let size = 1024 * 1024 * util.config.img_size; if (item.size > size && !obj.unlimited) { util.alert(`大小超过${util.config.img_size}m`); return; } util.upload({ file: item.path, mode: "img", success(res) { if (res.code === 200) { if (obj.type == 2) { obj.value.push(util.format_url(res.msg, "img")); } else if (obj.type == 1) { obj.value = util.format_url(res.msg, "img"); } console.log("obj", obj, obj.value); obj.success && obj.success({ result: res.msg, value: obj.value }); return; } util.alert(rs.msg); } }); }); }, fail(rs) { if (rs.errMsg == "chooseImage:fail cancel") ; } }); }, /** * 上传视频 * @param {Object} obj 对象类型 * @param {Array} obj.value 操作的对象 * @param {Object} obj.unlimited 不限制 * @param {Object} obj.count 计数 * @param {Object} obj.success 执行成功返回的方法return修改的对象 */ upload_video(obj) { obj.count ? obj.count : 1; common_vendor.index.chooseVideo({ compressed: false, success(rs) { util.upload({ file: rs.tempFilePath, mode: "video", success(res) { if (res.code == 200) { const fullUrl = util.format_url(res.msg, "video"); obj.success && obj.success({ result: res.msg, value: fullUrl }); return; } else { util.alert(res.msg); } } }); }, fail(rs) { if (rs.errMsg == "chooseImage:fail cancel") ; } }); }, /** * 上传文件 * @param {Object} obj 对象类型 * @param {Array} obj.value 操作的对象 * @param {Object} obj.count 计数 * @param {Object} obj.success 执行成功返回的方法return修改的对象 */ upload_files(obj) { const value = obj.value; const file_suffix = util.config.file_suffix; const count = obj.count ? obj.count : 1; if (value.length >= count) { util.alert("上传数量已达上限"); return; } console.log("upload_files", obj); function result_fn(path) { let str = path.split(".").pop().toLowerCase(); let reult = file_suffix.find((node) => node.id == str); if (!reult) { util.alert(`不能上传${str}格式文件`); return; } util.upload({ file: path, success(res) { if (res.code == 200) { value.push(res.data); obj.success && obj.success({ ...res.data, value }); } else { util.alert(res.msg); } } }); } common_vendor.wx$1.chooseMessageFile({ count: 1, type: "file", // 文件过滤 extension: file_suffix.map((node) => node.id), success: (rs) => { rs.tempFiles.forEach((e, i) => { result_fn(e.path); }); } }); return; }, /** * 上传音频 * @param {Object} obj 对象类型 * @param {Array} obj.value 操作的对象 * @param {Object} obj.count 计数 * @param {Object} obj.success 执行成功返回的方法return修改的对象 */ upload_audio(obj) { const value = obj.value; const audio_suffix = util.config.audio_suffix; const count = obj.count ? obj.count : 1; if (value.length >= count) { util.alert("上传数量已达上限"); return; } function result_fn(path) { let str = path.split(".").pop().toLowerCase(); let reult = audio_suffix.find((node) => node.id == str); if (!reult) { util.alert(`不能上传${str}格式文件`); return; } util.upload({ file: path, success(res) { if (res.code == 200) { value.push(res.data); obj.success && obj.success({ ...res.data, value }); } else { util.alert(res.msg); } } }); } common_vendor.wx$1.chooseMessageFile({ count: 1, type: "file", // 文件过滤 extension: audio_suffix.map((node) => node.id), success: (rs) => { rs.tempFiles.forEach((e, i) => { result_fn(e.path); }); } }); return; }, /** * 视频转封面 oss特有 * @param {Object} url 视频路径 */ video_coverImage(url) { let result = `${url}?x-oss-process=video/snapshot,t_1,m_fast`; return result; }, /** * 预览图片 * @param {Array} urls 图片列表 * @param {Number} current 当前预览的下标 */ view_imgs(urls, current) { if (!urls || urls.length == 0) { util.alert("暂无"); return; } common_vendor.index.previewImage({ urls, current }); }, /** * 预览文件 * @param {String} url 文件路径 */ view_file(url) { let suffix = util.get_file_suffix(url).id; if (!["doc", "xls", "ppt", "pdf", "docx", "xlsx", "pptx"].includes(suffix)) { util.alert("操作需要在web端"); console.log("Unsupported suffix", suffix); return; } common_vendor.index.downloadFile({ url, success: (res) => { common_vendor.index.openDocument({ filePath: res.tempFilePath, fail: (rs) => { console.log("rs", rs); } }); } }); }, /** * 通过路径获取文件后缀 * @param {Object} url 需要获取的文件路径 * @param {Object} type file文件 audio音频 * @return {Object} 返回后缀列表对象 util.config.file_suffix */ get_file_suffix(url, type) { if (!type) type = "file"; const file_suffix = util.config[{ "file": "file_suffix", "audio": "audio_suffix" }[type]]; let result = ""; if (url) result = file_suffix.find((item) => item.id === url.split(".").pop().toLowerCase()); return result; }, /** * 通过路径获取音频后缀 * @param {Object} url 需要获取的文件路径 * @return {Object} 返回后缀列表对象 util.config.file_suffix */ get_audio_suffix(url) { const audio_suffix = util.config.audio_suffix; let result = ""; if (url) result = audio_suffix.find((item) => item.id === url.split(".").pop().toLowerCase()); return result; }, /** * 调起支付 * @param {Object} obj 操作对象 * @param {String} obj.payType 支付方式 WeChat微信 AliPay支付宝 4钱包 * @param {String} obj.method 支付环境 app手机应用 mp小程序 * @param {String} obj.debug 调试模式 * @param {Boolean|Object} obj.cb 支付结果跳转 false为不跳转 跳转需携带object定义对象 * @param {String} obj.cb.styles 风格 style1蓝色 style2绿色 style3橙色 * @param {String} obj.cb.result 结果 success成功 fail失败 * @param {String} obj.cb.price 价格 * @param {String} obj.cb.url 跳转的详情路径 * @param {Function} obj.fn 请求接口函数 * @param {Function} obj.success 成功方法 * @param {Function} obj.fail 失败方法 * @param {Function} obj.complete 结束方法 */ payment(obj) { obj = obj ? obj : {}; obj.data = obj.data ? obj.data : {}; obj.method = "mp"; common_vendor.index.login({ success: (rs) => { obj.data.code = rs.code; util.payment_request(obj); } }); }, // 支付请求 payment_request(obj) { obj.debug ? console.log("params", obj) : ""; if (!obj.fn) { throw "no function"; } function result_goto(result) { const cb = obj.cb; if (!cb) return; common_vendor.index.redirectTo({ url: util.set_url("/index/pay_result", { orderNumber: cb.orderNumbers || "", result, styles: cb.styles || "", price: cb.price || "", url: cb.url || "" }) }); } obj.fn(obj.data).then((rs) => { obj.debug ? console.log("request success result", rs) : ""; if (rs.code == 200) { switch (obj.data.payType) { case "1": switch (obj.method) { case "mp": if (rs.data && rs.data.paySign) { common_vendor.index.requestPayment({ provider: "wxpay", timeStamp: rs.data.timeStamp, package: rs.data.package, nonceStr: rs.data.nonceStr, paySign: rs.data.paySign, signType: rs.data.signType, success(result) { obj.success ? obj.success(rs) : ""; result_goto("success"); }, fail(result) { obj.fail ? obj.fail(result) : ""; result_goto("fail"); }, complete(result) { obj.debug ? console.log( "requestPayment complete", result ) : ""; obj.complete ? obj.complete(result) : ""; } }); } else { obj.fail ? obj.fail("no data") : ""; } break; case "app": common_vendor.index.requestPayment({ provider: "wxpay", orderInfo: rs.data, success(result) { obj.success ? obj.success(rs) : ""; result_goto("success"); }, fail(result) { obj.fail ? obj.fail(result) : ""; result_goto("fail"); }, complete(result) { obj.debug ? console.log("requestPayment complete", result) : ""; obj.complete ? obj.complete(result) : ""; } }); break; } break; case "2": switch (obj.method) { case "app": common_vendor.index.requestPayment({ provider: "alipay", orderInfo: rs.msg, success(result) { obj.success ? obj.success(rs) : ""; result_goto("success"); }, fail(result) { obj.fail ? obj.fail(result) : ""; result_goto("fail"); }, complete(result) { obj.debug ? console.log("requestPayment complete", result) : ""; obj.complete ? obj.complete(result) : ""; } }); break; } break; case "4": obj.success ? obj.success(rs) : ""; result_goto("success"); break; } } else { util.alert(rs.msg); obj.fail ? obj.fail(rs) : ""; } }).catch((rs) => { console.log("request catch result", rs); }); }, // 微信小程序登录 weChatLogin(obj) { obj = obj ? obj : {}; const parent_id = common_vendor.index.getStorageSync("parent_id"); const admin_id = common_vendor.index.getStorageSync("admin_id"); common_vendor.index.getUserProfile({ desc: "weixin", success: (e) => { const userInfo = e.userInfo; let data = { nickName: userInfo.nickName, avatarUrl: userInfo.avatarUrl }; common_vendor.index.login({ provider: "weixin", success: (rs) => { data.code = rs.code; data.platform = "wechatMini"; if (parent_id) data.parent_id = parent_id; if (admin_id) data.admin_id = admin_id; if (rs.errMsg == "login:ok") { util.request({ url: "/api/user/third", data, load: 1 }).then((res) => { if (res.code == 200) { obj.success ? obj.success(res) : ""; } }); } } }); }, fail(res) { util.alert("您拒绝了授权"); obj.fail ? obj.fail(res) : (res2) => { }; }, complete() { obj.complete ? obj.complete() : ""; } }); }, /** * 拉起授权请求: 微信小程序、app */ authorize(obj) { return new Promise((resolve, reject) => { obj ? obj : obj = {}; const menu = { // 定位 location: { name: "定位服务", scope: "scope.userLocation", txt: "需要获取您的地理位置" }, // 相册 photosAlbum: { name: "相册", scope: "scope.writePhotosAlbum", txt: "需要访问您的相册" }, // 相机 camera: { name: "摄像头", scope: "scope.camera", txt: "需要访问您的摄像头" } }; if (obj.key) { obj = { ...obj, ...menu[obj.key] }; } let fnName = ""; fnName = "weChatAuthorize"; this[fnName](obj).then((rs) => { obj.success ? obj.success(rs) : ""; resolve(rs); }).catch((err) => { obj.fail ? obj.fail(err) : ""; reject(err); }); }); }, // app授权 appAuthorize(obj) { return new Promise((resolve, reject) => { const systemSetting = common_vendor.index.getSystemSetting(); if (systemSetting.locationEnabled === false) { this.alert(obj.txt); reject({ msg: "未授权对应功能" }); return; } const authorized = common_vendor.index.getAppAuthorizeSetting().locationAuthorized; console.log("locationAuthorized", authorized); if (authorized === "config error") { reject({ msg: "开发者未勾选定位服务模块" }); return; } else if (authorized === "denied") ; else if (authorized === "authorized") { resolve(obj); return; } if (common_vendor.index.getSystemInfoSync().platform == "android") { plus.android.requestPermissions( // 对应权限 ["android.permission.ACCESS_FINE_LOCATION"], // 成功 (resultObj) => { let result = null; for (let i = 0; i < resultObj.granted.length; i++) { let grantedPermission = resultObj.granted[i]; console.log("已获取的权限:" + grantedPermission); } for (let i = 0; i < resultObj.deniedPresent.length; i++) { let deniedPresentPermission = resultObj.deniedPresent[i]; console.log("拒绝本次申请的权限:" + deniedPresentPermission); } for (let i = 0; i < resultObj.deniedAlways.length; i++) { let deniedAlwaysPermission = resultObj.deniedAlways[i]; console.log("永久拒绝申请的权限:" + deniedAlwaysPermission); } if ([-1].includes(result)) { common_vendor.index.openAppAuthorizeSetting({ success: (rs) => { reject({ msg: "引导用户打开设置页面", info: rs }); }, fail: (err) => { reject({ msg: "用户设置页面打开失败", info: err }); } }); } }, // 失败 (error) => { console.log("申请权限错误:" + error.code + " = " + error.message); resolve({ code: error.code, message: error.message }); } ); } else { this.alert("请在设置里允许打开定位信息"); resolve({ msg: "用户未开启定位权限" }); return; } }); }, // 微信小程序授权 weChatAuthorize(obj) { return new Promise((resolve, reject) => { if (![ "scope.userInfo", "scope.userLocation", "scope.userLocationBackground", "scope.address", "scope.record", "scope.writePhotosAlbum", "scope.camera", "scope.invoice", "scope.invoiceTitle", "scope.werun" ].includes(obj.scope)) { resolve({ msg: "不在限制范围内" }); return; } common_vendor.index.authorize({ scope: obj.scope, success: (rs) => { resolve(rs); }, fail: (err) => { reject(err); util.alert({ title: "系统提示", value: obj.txt, success: (rs) => { if (rs.confirm) { common_vendor.index.openSetting(); } } }); } }); }); }, /** * 最终登录 用于请求登录接口后统一调用的登录方法 * @param {Object} param 数据对象 * @param {Function} cb 回调函数 */ finalLogin(param, cb) { const token = param.data; common_vendor.index.setStorageSync("token", token); common_vendor.index.showLoading({ mask: true }); util.getUserinfo(() => { common_vendor.index.$emit("login"); setTimeout(() => { common_vendor.index.switchTab({ url: "/pages/index/index" }); }, 500); cb ? cb() : ""; }); }, // 登录账号管理 loginAccountManagement(userInfo) { let userList = common_vendor.index.getStorageSync("userInfoList") || []; const index = userList.findIndex((item) => item.userId === userInfo.userId); if (index !== -1) { userList.splice(index, 1); } userList.push(userInfo); common_vendor.index.setStorageSync("userInfoList", userList); }, // 登录腾讯聊天 loginTencent(userInfo) { try { const res = TUIKit_debug_GenerateTestUserSig.genTestUserSig({ SDKAppID: common_vendor.index.$SDKAppID, secretKey: common_vendor.index.$secretKey, userID: userInfo.userId }); console.log("uni.$userSig ", res); common_vendor.index.$userSig = "eJyrVgrxCdYrSy1SslIy0jNQ0gHzM1NS80oy0zLBwoamUNHilOzEgoLMFCUrQzMDAwNTcyNzU4hMakVBZlEqUNzU1NQIKAURLcnMBYmZG1maWJqaG1pATclMBxrqHVBmmRmjH5jlnGxSWmnq4*NomZRXEmhcmuhqUeHtWezi45MU4RpcauzsHWirVAsAXPAvzA__"; common_vendor.A.login({ SDKAppID: common_vendor.index.$SDKAppID, userID: userInfo.userId, userSig: common_vendor.index.$userSig, useUploadPlugin: true, // If you need to send rich media messages, please set to true. framework: `vue3` // framework used vue2 / vue3 }).catch(() => { }); } catch (error) { console.log(error); } }, /** * 获取用户信息 * @param {Function} cb 回调函数 */ getUserinfo(cb) { return new Promise((reslove) => { api_index.api.mine.getUserinfo().then((rs) => { if (rs.code === 200) { const userinfo = rs.user; console.log("userinfo", userinfo); userinfo.userPortrait = util.format_url(userinfo.userPortrait, "img"); userinfo.background = util.format_url(userinfo.background, "img"); reslove(rs); store_index.store.commit("setState", { key: "userinfo", value: userinfo }); util.loginTencent(userinfo); common_vendor.index.setStorageSync("userinfo", userinfo); util.loginAccountManagement(userinfo); cb ? cb() : ""; } }).finally(() => { common_vendor.index.hideLoading(); }); }); }, /** * 验证登录 * @param {Object} cb 回调函数 */ isLogin(cb) { let userinfo = common_vendor.index.$store.state.userinfo; return new Promise((resolve, reject) => { if (!userinfo.userId) { reject(); return; } resolve(); cb ? cb() : ""; }); }, /** * 清除登录状态 * @param {Function} cb 回调函数 */ logout(cb) { store_index.store.commit("setState", { key: "userinfo", value: {} }); common_vendor.index.removeStorageSync("userinfo"); common_vendor.index.removeStorageSync("token"); common_vendor.index.$emit("logout"); cb ? cb() : ""; }, // 拨打电话 makePhone(phoneNumber) { if (!phoneNumber) { util.alert("暂无手机号"); } common_vendor.index.makePhoneCall({ phoneNumber, fail(err) { console.log("err", err); } }); }, /** * 处理路径添加host或这默认图片地址 * @param {String} ev 需要处理的字符串 * @param {String} mode img图片 video视频 * @return {String} 返回的路径 */ format_url(ev, mode) { if (!ev) return ""; if (ev.match(/^http/)) return ev; return util.config.host + common_js_config.config[{ img: "uploadFilePath", video: "uploadVideoPath" }[mode]] + ev; }, /** * 去除路径里的host * @param {Object} ev 需要处理的字符串 * @return {String} 处理之后的路径 */ replace_url(ev) { if (!ev || typeof ev != "string") throw `${ev} is not String`; let result = ev.slice(ev.indexOf("?fileName=") + 10); return result; }, /** * 格式化经纬度 * @param {String} num 数字或数字字符串 */ formart_lnglat(num) { if (!num) return num; num = parseFloat(Number(num).toFixed(6)); return num; }, /** * 检查跳转 * @param {String} route 路径 * @param {String} type 跳转 */ checkLink(route, type = "navigateTo") { const currentPages = getCurrentPages(); const find_route = route; const find_index = currentPages.findIndex((node) => { return node.route == find_route; }); if (find_index < 0) { common_vendor.index[type]({ url: `/${find_route}` }); } else { common_vendor.index.navigateBack({ delta: currentPages.length - find_index - 1 }); } }, /** * 数字转化 */ rp(n) { var cnum = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"]; var s = ""; n = "" + n; for (var i = 0; i < n.length; i++) { s += cnum[parseInt(n.charAt(i))]; } if (s.length == 2) { if (s.charAt(1) == cnum[0]) { s = s.charAt(0) + cnum[10]; if (s == cnum[1] + cnum[10]) { s = cnum[10]; } } else if (s.charAt(0) == cnum[1]) { s = cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[2]) { s = cnum[2] + cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[3]) { s = cnum[3] + cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[4]) { s = cnum[4] + cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[5]) { s = cnum[5] + cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[6]) { s = cnum[6] + cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[7]) { s = cnum[7] + cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[8]) { s = cnum[8] + cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[9]) { s = cnum[9] + cnum[10] + s.charAt(1); } else if (s.charAt(0) == cnum[10]) { s = cnum[10] + cnum[10] + s.charAt(1); } } return s; }, /** * 复制文本 * @param {String} text 需要复制的文本 */ copyText(text) { common_vendor.index.setClipboardData({ data: text, success: () => { util.alert({ title: "文本已复制到剪贴板" }); } }); }, showToastAndRedirect(title, icon = "none", fun = () => { }) { common_vendor.index.showToast({ title, icon, duration: 2e3, // 显示两秒 complete: () => { fun(); common_vendor.index.hideLoading(); } }); }, notificationChat(user, type) { switch (type) { case utils_msgtype.msgType.chatType.SINGLE_CHAT: user.userNickname; conversationID = user.userId; break; case utils_msgtype.msgType.chatType.GROUP_CHAT: user.groupname; conversationID = user.groupid; break; default: console.log("===================================="); console.log("未定义的聊天类型"); console.log("===================================="); return; } try { common_vendor.index.setStorageSync("toUser", { ...user, msgType: type }); common_vendor.index.navigateTo({ url: `/TUIKit/components/TUIChat/index?conversationID=C2C${conversationID}` }); } catch (error) { console.log("===================================="); console.log(error); console.log("===================================="); } } }; exports.util = util;