index.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. // var Parse = getApp().Parse;
  2. // var app = getApp()
  3. // const { wxLogin } = require('./utils/login')
  4. const CONFIG = require("config.js");
  5. let config = {
  6. appid: CONFIG.default.appid,
  7. company: CONFIG.default.company,
  8. rootPage: CONFIG.default.rootPage,
  9. }
  10. const plugin = requirePlugin('fm-plugin')
  11. const { Parse, checkAuth } = plugin
  12. Page({
  13. /**
  14. * 页面的初始数据
  15. */
  16. data: {
  17. splashUrl: wx.getStorageSync("enabledOptions")[0],
  18. loading:true
  19. },
  20. /**
  21. * 生命周期函数--监听页面加载
  22. */
  23. onLoad: async function (options) {
  24. wx.login({
  25. success: function (res) {
  26. if (res.code) {
  27. console.log(res);
  28. // wx.request({
  29. // url: "https://server.fmode.cn/api/wxapp/auth_wxapp",
  30. // data: {
  31. // c: getApp().globalData.company,
  32. // code: res.code,
  33. // },
  34. // async success(res) {
  35. // wx.setStorageSync("userInfo", res.data);
  36. // resolve(res)
  37. // },
  38. // });
  39. }
  40. },
  41. fail: function (err) {
  42. wx.showToast({
  43. title: '服务器繁忙,请稍后重试',
  44. })
  45. }
  46. });
  47. wx.setStorageSync("invite", null);
  48. let str = decodeURIComponent(options.q); //扫描二维码获得的跳转链接
  49. let obj = this.getParaName(str)
  50. if (obj && obj.invite) {
  51. wx.setStorageSync("invite", obj.invite);
  52. }
  53. obj && Object.keys(obj).forEach(key=> options[key] = obj[key])
  54. // 兼容从编译参数或页面直达传入的 storeId
  55. if (options && options.scene && !options.storeId) {
  56. try {
  57. const sceneStr = decodeURIComponent(options.scene)
  58. if (sceneStr) {
  59. const pairs = sceneStr.split('&')
  60. for (const p of pairs) {
  61. const [k, v] = p.split('=')
  62. if (k === 'storeId' && v) {
  63. options.storeId = v
  64. break
  65. }
  66. }
  67. }
  68. } catch (e) {
  69. console.warn('解析 scene 失败:', e)
  70. }
  71. }
  72. this.setData({
  73. options: options
  74. })
  75. let {
  76. time,
  77. dramaId,
  78. roomId,
  79. orderId,
  80. shopId,
  81. invite,
  82. activityId,
  83. company,
  84. inviteHost,
  85. storeId
  86. } = options
  87. time && wx.setStorageSync("time", time);
  88. dramaId && wx.setStorageSync("dramaId", dramaId);
  89. roomId && wx.setStorageSync("roomId", roomId);
  90. orderId && wx.setStorageSync("orderId", orderId);
  91. shopId && wx.setStorageSync("shopId", shopId);
  92. invite && wx.setStorageSync("invite", invite);
  93. activityId && wx.setStorageSync("activityId", activityId);
  94. inviteHost && wx.setStorageSync("inviteHost", true);
  95. if (storeId) {
  96. wx.setStorageSync('storeId', storeId)
  97. getApp().globalData.storeId = storeId
  98. console.log('✅ 入口页已设置店铺 ID:', storeId)
  99. }
  100. if (company) getApp().globalData.toCompany = true;
  101. // 检查是否是扫码进入(需要统计扫码次数)
  102. this.checkAndHandleScan(options);
  103. plugin.init(config, wx.getStorageSync('invite'))
  104. },
  105. /**
  106. * 生命周期函数--监听页面初次渲染完成
  107. */
  108. onReady: async function () { },
  109. /**
  110. * 生命周期函数--监听页面显示
  111. */
  112. onShow: async function () {
  113. await this.review()
  114. },
  115. async review(force){
  116. try {
  117. let options = this.data.options
  118. let url = getApp().globalData.rootPage || getApp().globalData.defaultTabBar.list[0].pagePath
  119. if (options) {
  120. let objArr = Object.keys(options)
  121. if (objArr && objArr.length > 0) {
  122. let parms = '?'
  123. objArr.forEach((o, index) => {
  124. if (index > 0) {
  125. parms += '&' + o + '=' + options[o]
  126. } else {
  127. parms += o + '=' + options[o]
  128. }
  129. })
  130. url += parms
  131. }
  132. }
  133. let currentUser = Parse.User.current()
  134. console.log(Parse.User.current())
  135. if (!currentUser || force) {
  136. // let data = await wxLogin()
  137. // if (data.statusCode == 200) {
  138. let r = await checkAuth(true)
  139. console.log(r);
  140. // getApp().Parse = Parse
  141. // getApp().checkAuth = checkAuth
  142. if(!r) return
  143. // }
  144. } else {
  145. this.updateUser(currentUser.id)
  146. }
  147. getApp().Parse = Parse
  148. getApp().checkAuth = checkAuth
  149. if (!await this.getCompanyServerExpire(url)) {
  150. return
  151. }
  152. // 检查是否需要跳转到扫码统计页面
  153. if (this.shouldRedirectToScanPage()) {
  154. await this.redirectToScanPage();
  155. return;
  156. }
  157. wx.redirectTo({
  158. url: url,
  159. });
  160. }
  161. catch (err) {
  162. console.log(err);
  163. /* 登录身份信息到期,重新登陆 */
  164. if((err?.message.indexOf('Session token is expired') != -1 || err?.message.indexOf('Invalid session token') != -1) && !force){
  165. let invite = wx.getStorageSync('invite')
  166. wx.clearStorageSync()
  167. invite && wx.setStorageSync('invite', invite)
  168. /* 强制重新登录 */
  169. this.review(true)
  170. return
  171. }
  172. this.setData({
  173. loading:false
  174. })
  175. wx.showModal({
  176. title: '温馨提示',
  177. content: '服务器正在升级,请稍后重试。',
  178. showCancel: false,
  179. cancelText: '取消',
  180. cancelColor: '#000000',
  181. confirmText: '确定',
  182. confirmColor: '#3CC51F',
  183. success: (result) => {
  184. if (result.confirm) {
  185. wx.exitMiniProgram()
  186. }
  187. },
  188. });
  189. }
  190. },
  191. async updateUser(id) {
  192. let User = new Parse.Query('_User')
  193. let user = await User.get(id)
  194. let invite = wx.getStorageSync('invite')
  195. //查询邀请人user
  196. let query = new Parse.Query("_User")
  197. query.equalTo('objectId', invite)
  198. let result = await query.first()
  199. if (result && result.id && result.get("invite")?.id == user.id) {
  200. console.error('邀请人不能是自己的下级')
  201. return
  202. }
  203. if (invite && !user.get('invite') && user.id != invite && !user.get('agentLevel')) {
  204. console.log('上下级绑定成功');
  205. user.set('invite', {
  206. __type: "Pointer",
  207. className: "_User",
  208. objectId: invite
  209. })
  210. user.set('agent', {
  211. __type: "Pointer",
  212. className: "_User",
  213. objectId: invite
  214. })
  215. await Parse.Cloud.run('user_save', {
  216. userJson: user.toJSON()
  217. })
  218. }
  219. },
  220. async getCompanyServerExpire(url) {
  221. let query = new Parse.Query('Company')
  222. query.equalTo('objectId', getApp().globalData.company)
  223. query.select('expireDate', 'expireMap')
  224. let com = await query.first()
  225. if (com?.id && com?.get('expireDate')) {
  226. let now = + new Date()
  227. let expireTime = + new Date(com?.get('expireDate'))
  228. if (com?.get('expireMap') && com.get('expireMap')[getApp().globalData.appid]) {
  229. expireTime = + new Date(com.get('expireMap')[getApp().globalData.appid])
  230. }
  231. if (now >= expireTime) {
  232. console.log('服务器到期');
  233. wx.reLaunch({
  234. url: `common-page/pages/loading/index?url=${url}`,
  235. });
  236. return
  237. }
  238. }
  239. return true
  240. },
  241. onUnload: function () {
  242. wx.setStorageSync("active", 0);
  243. },
  244. getParaName(url) {
  245. if (!url || url.indexOf('?') == -1) {
  246. return
  247. }
  248. let paraname = url.split('?')[1]
  249. return this.setObject(paraname) //封装成对象
  250. },
  251. setObject(paraArr) {
  252. let obj = {}
  253. let arr1 = paraArr.split('&')
  254. arr1.forEach(item => {
  255. let str = item.split('=')
  256. let key = str[0]
  257. let val = str[1]
  258. obj[key] = val
  259. })
  260. return obj
  261. },
  262. /**
  263. * 检查并处理扫码参数
  264. * 如果 URL 中包含 scanCount 和 partnerId,保存到临时存储
  265. */
  266. checkAndHandleScan(options) {
  267. const { scanCount, partnerId, storeId } = options;
  268. // 如果存在 scanCount 和 partnerId,说明是扫码进入
  269. if (scanCount !== undefined && partnerId) {
  270. console.log('===========================================');
  271. console.log('======= 检测到扫码参数 =======');
  272. console.log('partnerId:', partnerId);
  273. console.log('storeId:', storeId);
  274. console.log('scanCount:', scanCount);
  275. console.log('===========================================');
  276. // 保存到临时存储,用于后续跳转
  277. wx.setStorageSync('scan_partnerId', partnerId);
  278. wx.setStorageSync('scan_storeId', storeId);
  279. wx.setStorageSync('scan_scanCount', scanCount);
  280. wx.setStorageSync('need_scan_redirect', true);
  281. }
  282. },
  283. /**
  284. * 判断是否需要跳转到扫码统计页面
  285. */
  286. shouldRedirectToScanPage() {
  287. return wx.getStorageSync('need_scan_redirect') === true;
  288. },
  289. /**
  290. * 跳转到扫码统计页面
  291. * 构建完整的 H5 URL 并跳转到 web-view 页面
  292. */
  293. async redirectToScanPage() {
  294. try {
  295. const partnerId = wx.getStorageSync('scan_partnerId');
  296. const storeId = wx.getStorageSync('scan_storeId');
  297. const scanCount = wx.getStorageSync('scan_scanCount');
  298. // 清除临时存储
  299. wx.removeStorageSync('scan_partnerId');
  300. wx.removeStorageSync('scan_storeId');
  301. wx.removeStorageSync('scan_scanCount');
  302. wx.removeStorageSync('need_scan_redirect');
  303. if (!partnerId || !storeId) {
  304. console.error('❌ 缺少必要参数,无法跳转');
  305. return;
  306. }
  307. // 获取当前用户的 sessionToken
  308. const currentUser = Parse.User.current();
  309. const token = currentUser ? currentUser.getSessionToken() : '';
  310. // 构建 H5 URL
  311. const h5Url = `https://pwa.fmode.cn/gomini/pmd/`;
  312. // 手动构建查询参数(兼容小程序环境)
  313. const params = [];
  314. params.push(`scanCount=${scanCount || '1'}`);
  315. params.push(`storeId=${storeId}`);
  316. params.push(`partnerId=${partnerId}`);
  317. if (token) {
  318. params.push(`token=${encodeURIComponent(token)}`);
  319. }
  320. const fullUrl = `${h5Url}?${params.join('&')}`;
  321. console.log('===========================================');
  322. console.log('======= 跳转到扫码统计页面 =======');
  323. console.log('完整 URL:', fullUrl);
  324. console.log('===========================================');
  325. // 跳转到 web-view 页面
  326. wx.redirectTo({
  327. url: `/common-page/pages/web-view/index?path=${encodeURIComponent(fullUrl)}`,
  328. fail: (err) => {
  329. console.error('❌ 跳转失败:', err);
  330. }
  331. });
  332. } catch (error) {
  333. console.error('❌ 跳转到扫码页面失败:', error);
  334. }
  335. }
  336. });