猎豆优选小程序

App.vue 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <script>
  2. import { postJSON as $postJSON, get as $get, getUuid as $getUuid } from './config/util'
  3. import { api as $api } from './config/api'
  4. const router = require('./utils/router')
  5. const navbarBg = require('@/static/imgs/head_bg.png')
  6. export default {
  7. globalData: {
  8. isIOS: false, // 判断是否是ios
  9. isIphoneX: false, // 是否为 iphoneX 及以上机型
  10. statusBarHeight: 44, // 状态栏高度
  11. navigationBarHeight:44, // 导航栏高度 (自定义导航-导航烂高度默认44)
  12. SDKVersion: '', // 当前小程序基础库版本号
  13. WXVersion: '', // 当前小程序所在微信的版本号
  14. navbarBackground: { // 顶部导航背景图
  15. backgroundImage: 'linear-gradient(45deg, rgb(244, 117, 42), rgb(239, 15, 42))'
  16. },
  17. newNavbarBackground:{
  18. background: `url(https://ld.726p.com/tbk/upload/c579f015a49a3f9e066f0ab00ab56f7.png) no-repeat`,
  19. backgroundSize: 'cover',
  20. },
  21. $router: router,
  22. fun_version: '',//过审接口版本号
  23. },
  24. onLaunch: function (options) {
  25. console.log("App onLaunch options => ", options);
  26. // 判断当前设备是否为 iphoneX 及以上机型
  27. this.handleGetIsIphoneX();
  28. // 判断当前小程序是否为最新版本
  29. this.handleVersionUpdate();
  30. // 获取当前小程序基础库版本号
  31. this.handleGetVersion();
  32. // 小程序审核状态查询
  33. this.getVerifiedFun();
  34. // 微信登录
  35. this.handleWxLogin();
  36. // 设置用户首次启动小程序标识(用于在首页展示开屏广告)
  37. this.handleSetUserIsFirst(true);
  38. },
  39. onShow: function (options) {
  40. // 进来options参数处理
  41. this.onShowEntry(options)
  42. // 清除微信客服标识
  43. this.handleRemoveWxServiceFlag()
  44. },
  45. onHide: function () {
  46. const wxServiceDialogFlag = uni.getStorageSync('wxServiceDialogFlag')
  47. if (!wxServiceDialogFlag) { // 获取“微信客服”弹框标识,如果没触发过“微信客服”弹框,再初始化剪贴板(弹出猜你喜欢弹框)
  48. uni.setStorageSync('clipboard', '') // 通过clipboard的内容来判断是否已经过弹出剪切板内容,弹出过的clipboard为no,否则clipboard为空
  49. }
  50. },
  51. methods: {
  52. // 初次进来
  53. onShowEntry(options){
  54. if(options.path != 'pages/subPackages/home/shareDetail'){
  55. // 从好友邀请过来,分享人的邀请码
  56. if(options.query && options.query.invite_code){
  57. uni.setStorageSync('share_invite_code', options.query.invite_code)
  58. }
  59. }
  60. },
  61. // 判断当前设备是否为 iphoneX 及以上机型
  62. handleGetIsIphoneX() {
  63. const systemInfo = uni.getSystemInfoSync()
  64. const _app = this.$scope || getApp(); // 兼容方式
  65. _app.globalData.statusBarHeight = systemInfo.statusBarHeight;
  66. if (systemInfo.system.toUpperCase().includes("IOS")) {
  67. _app.globalData.isIOS = true; // 判断是否是ios
  68. if (systemInfo.safeArea.top > 20) {
  69. _app.globalData.isIphoneX = true;
  70. }
  71. }
  72. },
  73. // 判断当前小程序是否为最新版本
  74. handleVersionUpdate() {
  75. const that = this;
  76. // 判断应用的 getUpdateManager 是否在当前版本可用
  77. if (uni.canIUse("getUpdateManager")) {
  78. const updateManager = uni.getUpdateManager();
  79. // 向小程序后台请求完新版本信息
  80. updateManager.onCheckForUpdate(function (res) {
  81. if (res.hasUpdate) {
  82. // 小程序有新版本,静默下载新版本,新版本下载完成
  83. updateManager.onUpdateReady(function () {
  84. uni.showModal({
  85. title: "更新提示",
  86. content: "小程序已发布新版本,是否重启应用?",
  87. success: function (res) {
  88. if (res.confirm) {
  89. updateManager.applyUpdate();
  90. } else if (res.cancel) {
  91. // 强制用户更新,弹出第二次弹窗
  92. uni.showModal({
  93. title: "提示",
  94. content: "小程序已发布新版本,是否重启应用",
  95. showCancel: false, // 隐藏取消按钮
  96. success: function (res) {
  97. // 第二次提示后,强制更新
  98. if (res.confirm) {
  99. // 当新版本下载完成,调用该方法会强制当前小程序应用上新版本并重启
  100. updateManager.applyUpdate();
  101. } else if (res.cancel) {
  102. // 重新回到版本更新提示
  103. that.handleVersionUpdate();
  104. }
  105. },
  106. });
  107. }
  108. },
  109. });
  110. });
  111. // 当新版本下载失败
  112. updateManager.onUpdateFailed(function () {
  113. uni.showModal({
  114. title: "提示",
  115. content: "小程序版本更新失败,请您删除当前小程序并重新打开",
  116. });
  117. });
  118. }
  119. });
  120. } else {
  121. // 提示用户在最新版本的客户端上体验
  122. uni.showModal({
  123. title: "温馨提示",
  124. content: "当前微信版本过低,可能无法使用该功能,请升级到最新版本后重试。",
  125. });
  126. }
  127. },
  128. // 获取当前小程序基础库版本号
  129. handleGetVersion() {
  130. const systemInfo = uni.getSystemInfoSync()
  131. console.log('systemInfo => ', systemInfo)
  132. const _app = this.$scope || getApp(); // 兼容方式
  133. _app.globalData.SDKVersion = systemInfo.SDKVersion
  134. _app.globalData.WXVersion = systemInfo.version
  135. },
  136. // 显示获取用户信息确认弹框
  137. handleShowModal(content) {
  138. return new Promise((resolve) => {
  139. uni.showModal({
  140. title: '提示',
  141. content: content || '确定执行当前操作吗?',
  142. success: async (res) => {
  143. if (res.confirm) {
  144. resolve('确认')
  145. }
  146. }
  147. })
  148. })
  149. },
  150. // 根据token => 获取用户信息 => 更新至本地存储
  151. handleGetUserInfo(loadingFlag) {
  152. return new Promise(async (resolve, reject) => {
  153. try {
  154. const url = $api.login_userInfo
  155. const params = {}
  156. const headers = {
  157. 'token': uni.getStorageSync('token') || '',
  158. }
  159. if(!loadingFlag){ // 我的页面刷新信息的时候,不需要loading
  160. uni.showLoading({ title: '加载中...', mask: true })
  161. }
  162. const { data: res } = await $postJSON(url, params, headers)
  163. if (res && res.errno == 0) {
  164. uni.setStorageSync('userInfo', {...res.rst})
  165. resolve({...res.rst})
  166. } else {
  167. uni.showToast({ title: res.err || '操作失败', icon: 'none' })
  168. reject(res.err)
  169. }
  170. } catch (error) {
  171. console.log('error => ', error)
  172. reject(error)
  173. } finally {
  174. uni.hideLoading()
  175. }
  176. })
  177. },
  178. // 获取渠道版本信息 - 接口header中使用
  179. channelGetVersion () {
  180. return new Promise(async (resolve, reject) => {
  181. try {
  182. const url = $api.channel_getVersion
  183. const params = {
  184. channel_name:'猎豆优选小程序'
  185. }
  186. const { data: res } = await $get(url, params)
  187. if (res && res.errno == 0) {
  188. const { source, version } = res.rst || {}
  189. uni.setStorageSync('channel_source', source || '')
  190. uni.setStorageSync('channel_version', version || '')
  191. resolve(res.rst)
  192. } else {
  193. reject(res.err)
  194. }
  195. } catch (error) {
  196. reject(error)
  197. }
  198. })
  199. },
  200. // 小程序审核状态接口
  201. async getVerifiedFun(){
  202. try {
  203. const url = $api.wx_verified
  204. const params = {
  205. version:'v1.0'
  206. }
  207. const { data: res } = await $get(url, params)
  208. if (res && res.errno == 0) {
  209. const _app = this.$scope || getApp(); // 兼容方式
  210. _app.globalData.fun_version = res.rst.version;
  211. } else {
  212. _app.globalData.fun_version = '';
  213. }
  214. } catch (error) {
  215. } finally {
  216. uni.hideLoading()
  217. }
  218. },
  219. // 用户打开详情页行为数据上报categoryNew_countBuy
  220. async categoryNew_countBuy({shop_type,type,path,category_id}){
  221. let user_label = '';
  222. // #ifdef H5
  223. // h5生成随机数 为个统计游客数
  224. user_label = uni.getStorageSync('uuid_user_label') || '';
  225. if (!user_label || user_label == ''){
  226. user_label = $getUuid();
  227. uni.setStorageSync('uuid_user_label', user_label)
  228. }
  229. // #endif
  230. try {
  231. const url = $api.categoryNew_countBuy
  232. const params = {
  233. shop_type,
  234. type,
  235. path,
  236. category_id,
  237. user_label: user_label
  238. }
  239. const { data: res } = await $postJSON(url, params)
  240. if (res && res.errno == 0) { } else { }
  241. } catch (error) { } finally { }
  242. },
  243. // 获取当前用户等级
  244. handleGetUserLevel() {
  245. const userInfo = uni.getStorageSync('userInfo') || {}
  246. return userInfo.user_level || ''
  247. },
  248. // 清空用户登录信息缓存
  249. handleClearUserInfo() {
  250. const USER_INFO_KEYS = ['token', 'user_id', 'userInfo', 'nickname', 'sex', 'default_invite_code', 'openid', 'session_key', 'unionid', ]
  251. USER_INFO_KEYS.forEach(key => {
  252. uni.removeStorageSync(key)
  253. })
  254. },
  255. // 执行微信登录
  256. async handleWxLogin() {
  257. const isUnionid = this.handleGetUnionid()
  258. if (!isUnionid) { // 没有unionid => 从后台获取
  259. const res = await this.handleGetWxLoginInfo()
  260. // 将当前用户微信登录信息存储至本地(供后续手机号登录及业务使用)
  261. // 新用户(未绑定过微信的用户)
  262. uni.setStorageSync('openid', res.openid || '')
  263. uni.setStorageSync('session_key', res.session_key || '')
  264. uni.setStorageSync('unionid', res.unionid || '')
  265. if (res.token) { // 老用户(当前微信绑定过手机号) => 根据token获取用户信息
  266. uni.setStorageSync('token', res.token)
  267. uni.setStorageSync('user_id', res.user_id)
  268. uni.setStorageSync('sex', res.sex)
  269. uni.setStorageSync('nickname', res.nickname)
  270. uni.setStorageSync('name', res.name)
  271. this.handleGetUserInfo() // 获取用户信息
  272. }
  273. }
  274. },
  275. // 判断本地是否有微信唯一id unionid
  276. handleGetUnionid() {
  277. return uni.getStorageSync('unionid') || ''
  278. },
  279. // 获取用户微信登录信息
  280. handleGetWxLoginInfo() {
  281. return new Promise((resolve, reject) => {
  282. uni.login({
  283. success: async res => {
  284. const code = res.code
  285. try {
  286. const { data: res = {} } = await $get($api.login_getUserInfo, { code })
  287. if (res && res.errno == 0) {
  288. resolve(res.rst.user_info)
  289. } else {
  290. uni.showToast({ title: res.err, icon: 'none' })
  291. reject(res.err)
  292. }
  293. } catch (error) {
  294. reject(error)
  295. console.log('error => ', error)
  296. }
  297. },
  298. })
  299. })
  300. },
  301. // 设置用户首次启动标识(用于在首页展示开屏广告)
  302. handleSetUserIsFirst(isFirst) {
  303. uni.setStorageSync('isFirstLaunch', isFirst || false)
  304. },
  305. // 获取用户首次启动标识
  306. handleGetUserIsFirst() {
  307. return uni.getStorageSync('isFirstLaunch') || false
  308. },
  309. handleRemoveWxServiceFlag() {
  310. uni.removeStorageSync('wxServiceDialogFlag')
  311. },
  312. },
  313. };
  314. </script>
  315. <style lang="scss">
  316. @import "uview-ui/index.scss";
  317. /*每个页面公共css */
  318. // 去除u-navbar自定义导航栏下方分割线/底部下划线
  319. .u-border-bottom:after{
  320. border: none !important;
  321. }
  322. //统一背景颜色
  323. page{
  324. background: #f5f5f5;
  325. }
  326. // 无数据展示
  327. .no-data-blcok{
  328. text-align: center;
  329. height: 100%;
  330. display: flex;
  331. align-items: center;
  332. justify-content: center;
  333. flex-direction: column;
  334. flex:1;
  335. .no-data-img{
  336. width: 160rpx;
  337. height: 160rpx;
  338. }
  339. .no-data-hint{
  340. color: #999999;
  341. font-size: 26rpx;
  342. line-height: 50rpx;
  343. margin-top: 40rpx;
  344. }
  345. }
  346. </style>