app.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. import store from '@/store'
  2. import * as util from '@/utils/util'
  3. import { paginate } from '@/common/constant'
  4. import Config from './config'
  5. /**
  6. * 显示成功提示框
  7. */
  8. export const showSuccess = (msg, callback) => {
  9. uni.showToast({
  10. title: msg,
  11. icon: 'success',
  12. mask: true,
  13. duration: 1500,
  14. success() {
  15. callback && callback()
  16. }
  17. })
  18. }
  19. /**
  20. * 显示失败提示框
  21. */
  22. export const showError = (msg, callback) => {
  23. uni.showModal({
  24. title: '友情提示',
  25. content: msg,
  26. showCancel: false,
  27. success(res) {
  28. callback && callback()
  29. }
  30. })
  31. }
  32. /**
  33. * 显示纯文字提示框
  34. */
  35. export const showToast = (msg, duration = 1500, mask = true) => {
  36. uni.showToast({
  37. title: msg, // 提示的内容
  38. icon: 'none',
  39. mask, // 是否显示透明蒙层,防止触摸穿透 (支付宝小程序不支持)
  40. duration // 提示的延迟时间,单位毫秒,默认:1500
  41. })
  42. }
  43. /**
  44. * tabBar页面路径列表 (用于链接跳转时判断)
  45. * tabBarLinks为常量, 无需修改
  46. */
  47. export const getTabBarLinks = () => {
  48. const tabBarLinks = [
  49. 'pages/index/index',
  50. 'pages/category/index',
  51. 'pages/cart/index',
  52. 'pages/user/index'
  53. ]
  54. return tabBarLinks
  55. }
  56. /**
  57. * 生成完整的H5地址 [带参数]
  58. * @param {string} baseUrl H5访问地址
  59. * @param {string} path 页面路径
  60. * @param {object} params 页面参数
  61. * @return {string}
  62. */
  63. export const buildUrL = (h5Url, path, params) => {
  64. let complete = h5Url
  65. if (!util.isEmpty(path)) {
  66. complete += '#/' + path
  67. const shareParamsStr = getShareUrlParams(params)
  68. if (!util.isEmpty(shareParamsStr)) {
  69. complete += '?' + shareParamsStr
  70. }
  71. }
  72. return complete
  73. }
  74. /**
  75. * 生成转发的url参数(string格式)
  76. * @param {object} params
  77. * @return {string}
  78. */
  79. export const getShareUrlParams = params => {
  80. return util.urlEncode(getShareParams(params))
  81. }
  82. /**
  83. * 生成转发的url参数(object格式)
  84. * @param {object} params
  85. * @return {object}
  86. */
  87. export const getShareParams = params => {
  88. return { ...params }
  89. }
  90. /**
  91. * 跳转到指定页面url
  92. * 支持tabBar页面
  93. * @param {string} url 页面路径
  94. * @param {object} query 页面参数
  95. * @param {string} modo 跳转类型(默认navigateTo)
  96. */
  97. export const navTo = (url, query = {}, modo = 'navigateTo') => {
  98. if (!url || url.length == 0) {
  99. return false
  100. }
  101. // tabBar页面, 使用switchTab
  102. if (util.inArray(url, getTabBarLinks())) {
  103. uni.switchTab({
  104. url: `/${url}`
  105. })
  106. return true
  107. }
  108. // 生成query参数
  109. const queryStr = !util.isEmpty(query) ? '?' + util.urlEncode(query) : ''
  110. // 普通页面, 使用navigateTo
  111. modo === 'navigateTo' && uni.navigateTo({
  112. url: `/${url}${queryStr}`
  113. })
  114. // 特殊指定, 使用redirectTo
  115. modo === 'redirectTo' && uni.redirectTo({
  116. url: `/${url}${queryStr}`
  117. })
  118. return true
  119. }
  120. /**
  121. * 获取当前页面数据
  122. * @param {object}
  123. */
  124. export const getCurrentPage = () => {
  125. const pages = getCurrentPages()
  126. const pathInfo = pages[pages.length - 1].$page.fullPath.split('?')
  127. return { path: pathInfo[0].slice(1), query: util.urlDecode(pathInfo[1]) }
  128. }
  129. /**
  130. * 获取购物车商品总数量
  131. * @param {*} value
  132. */
  133. export const getCartTotalNum = (value) => {
  134. const cartTotal = uni.getStorageSync('cartTotalNum') || 0
  135. return checkLogin() ? cartTotal : 0
  136. }
  137. /**
  138. * 记录购物车商品总数量
  139. * @param {*} value
  140. */
  141. export const setCartTotalNum = (value) => {
  142. uni.setStorageSync('cartTotalNum', Number(value))
  143. }
  144. /**
  145. * 设置购物车tabbar的角标
  146. * 该方法只能在tabbar页面中调用, 其他页面调用会报错
  147. */
  148. export const setCartTabBadge = () => {
  149. const cartTabbarIndex = 2
  150. const cartTotal = getCartTotalNum()
  151. if (cartTotal > 0) {
  152. uni.setTabBarBadge({
  153. index: cartTabbarIndex,
  154. text: `${cartTotal}`
  155. })
  156. } else {
  157. uni.removeTabBarBadge({
  158. index: cartTabbarIndex
  159. })
  160. }
  161. return
  162. }
  163. /**
  164. * 验证是否已登录
  165. */
  166. export const checkLogin = () => {
  167. return !!store.getters.userId
  168. }
  169. /**
  170. * 加载更多列表数据
  171. * @param {Object} resList 新列表数据
  172. * @param {Object} oldList 旧列表数据
  173. * @param {int} pageNo 当前页码
  174. */
  175. export const getEmptyPaginateObj = () => {
  176. return util.cloneObj(paginate)
  177. }
  178. /**
  179. * 加载更多列表数据
  180. * @param {Object} resList 新列表数据
  181. * @param {Object} oldList 旧列表数据
  182. * @param {int} pageNo 当前页码
  183. */
  184. export const getMoreListData = (resList, oldList, pageNo) => {
  185. // 如果是第一页需手动制空列表
  186. if (pageNo == 1) oldList.data = []
  187. // 合并新数据
  188. return oldList.data.concat(resList.data)
  189. }
  190. /**
  191. * scene解码
  192. * 用于解码微信小程序二维码参数,并返回对象
  193. */
  194. export const sceneDecode = (str) => {
  195. if (str === undefined)
  196. return {}
  197. const data = {}
  198. const params = decodeURIComponent(str).split(',')
  199. for (const i in params) {
  200. const val = params[i].split(':');
  201. val.length > 0 && val[0] && (data[val[0]] = val[1] || null)
  202. }
  203. return data
  204. }
  205. /**
  206. * 获取二维码场景值(scene)
  207. */
  208. export const getSceneData = query => {
  209. return util.hasOwnProperty(query, 'scene') ? sceneDecode(query.scene) : {}
  210. }
  211. /**
  212. * 验证指定的功能模块是否开启
  213. * mix: 免费版暂无该功能
  214. */
  215. export const checkModuleKey = moduleKey => {
  216. // return util.inArray(moduleKey, store.getters.modules)
  217. return true
  218. }
  219. /**
  220. * 验证指定的功能模块是否开启(批量)
  221. */
  222. export const checkModules = moduleKeys => {
  223. return moduleKeys.filter(val => checkModuleKey(val)).length > 0
  224. }
  225. /**
  226. * 过滤开启的功能模块(批量)
  227. */
  228. export const filterModules = array => {
  229. return array.filter(item => !item.moduleKey || checkModuleKey(item.moduleKey))
  230. }
  231. /**
  232. * link对象点击事件
  233. * 支持tabBar页面
  234. */
  235. export const onLink = linkObj => {
  236. if (!linkObj) return false
  237. // 跳转到指定页面
  238. if (linkObj.type === 'PAGE') {
  239. navTo(linkObj.param.path, linkObj.param.query)
  240. }
  241. // 跳转到自定义路径
  242. if (linkObj.type === 'CUSTOM') {
  243. navTo(linkObj.param.path, util.urlDecode(linkObj.param.queryStr))
  244. }
  245. // 跳转到微信小程序
  246. // #ifdef MP-WEIXIN
  247. if (linkObj.type === 'MP-WEIXIN') {
  248. uni.navigateToMiniProgram({
  249. appId: linkObj.param.appId,
  250. path: linkObj.param.path
  251. })
  252. }
  253. // #endif
  254. // 跳转到H5外部链接
  255. if (linkObj.type === 'URL') {
  256. // #ifdef H5
  257. window.open(linkObj.param.url)
  258. // #endif
  259. // #ifdef APP-PLUS
  260. plus.runtime.openWeb(linkObj.param.url)
  261. // #endif
  262. // #ifdef MP
  263. uni.setClipboardData({
  264. data: linkObj.param.url,
  265. success: () => showToast('链接已复制'),
  266. fail: ({ errMsg }) => showToast('复制失败 ' + errMsg)
  267. })
  268. // #endif
  269. }
  270. return true
  271. }