index.ts 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. // index.ts
  2. import { api_shopProduct, api_shopInstruments, api_getUserBeneficiaryPage } from "../../api/login";
  3. import { debounce } from '../../utils/util'
  4. // 获取应用实例
  5. const app = getApp<IAppOption>()
  6. // pages/orders/orders.ts
  7. Page({
  8. /**
  9. * 页面的初始数据
  10. */
  11. data: {
  12. maxTop: 0,
  13. top: 0, // 初始的上偏移
  14. startY: 0, // 触摸起始点 Y 坐标
  15. windowHeight: 0, // 屏幕高度
  16. elementHeight: 180, // 元素高度
  17. goodsImgList: [
  18. "https://oss.dayaedu.com/ktyq/1739518565519.png",
  19. "https://oss.dayaedu.com/ktyq/1739518602666.png",
  20. "https://oss.dayaedu.com/ktyq/1739518623253.png",
  21. "https://oss.dayaedu.com/ktyq/1739518638007.png"
  22. ],
  23. serviceShow: true,
  24. popupShow: false,
  25. list: [] as any,
  26. instrumentsList: [] as any[],
  27. isOverSaled: false, // 是否所有商品都没有库存
  28. selected: {} as any,
  29. selectedInstruments: {} as any,
  30. memberInfo: {} as any, // 会员信息
  31. isShowMemberInfoTip: false, // 会员信息提示
  32. isFromPreviewImage: false,
  33. isShowOperation: false, // 是否显示操作按钮
  34. },
  35. /**
  36. * 生命周期函数--监听页面加载
  37. */
  38. onLoad() {
  39. // this.onInit()
  40. },
  41. /**
  42. * 获取基础信息
  43. */
  44. async onInit() {
  45. try {
  46. // const [{ data }, { data: instrumentsData }] = await Promise.all([api_shopProduct({ appId: app.globalData.appId }), api_shopInstruments({ appId: app.globalData.appId })])
  47. const [{ data }] = await Promise.all([api_shopProduct({ appId: app.globalData.appId })])
  48. // 商品
  49. const list = data.data || []
  50. let selected: any = {}
  51. let isOverSaled = true // 是否销售完
  52. list.forEach((item: any) => {
  53. item.typeName = this.formatPeriod(item.num, item.period);
  54. if (item.stockNum > 0) {
  55. isOverSaled = false
  56. if (!selected.id) {
  57. selected = item
  58. }
  59. }
  60. });
  61. if (isOverSaled) {
  62. // 没有可购买商品则默认选中第一个商品
  63. selected = list[0]
  64. }
  65. // 乐器
  66. // const instrumentsList = instrumentsData.data
  67. const instrumentsList = []
  68. this.setData({
  69. list,
  70. isOverSaled,
  71. selected,
  72. instrumentsList,
  73. selectedInstruments: {}
  74. })
  75. } catch (e) {
  76. console.log(e, 'e')
  77. }
  78. },
  79. // 格式化类型
  80. formatPeriod(num: number, type: string) {
  81. const template: any = {
  82. DAY: "天卡",
  83. MONTH: "月卡",
  84. YEAR: "年卡"
  85. }
  86. if (type === "YEAR" && num >= 99) {
  87. return '永久卡'
  88. }
  89. return num + template[type]
  90. },
  91. // 选择
  92. onSelectGoods(e: any) {
  93. const { dataset } = e.currentTarget
  94. const item = this.data.list.find((item: any) => item.id === dataset.id)
  95. // 判断是否有库存
  96. if (item.stockNum <= 0) {
  97. return
  98. }
  99. this.setData({
  100. selected: item || {}
  101. })
  102. },
  103. onSelectInstrumentsGoods(e: any) {
  104. const { dataset } = e.currentTarget
  105. let item = this.data.instrumentsList[dataset.index]
  106. if (item?.id === this.data.selectedInstruments?.id) {
  107. item = {}
  108. }
  109. this.setData({
  110. selectedInstruments: item || {}
  111. })
  112. },
  113. isLogin() {
  114. // 判断是否登录
  115. if (!app.globalData.isLogin) {
  116. wx.navigateTo({
  117. url: '../login/login',
  118. })
  119. return false
  120. }
  121. return true
  122. },
  123. /** 我的订单 */
  124. onOrder() {
  125. // 判断是否登录
  126. if (!this.isLogin()) {
  127. return
  128. }
  129. wx.navigateTo({
  130. url: '../orders/orders',
  131. })
  132. },
  133. onBuyShop() {
  134. // 判断是否登录
  135. if (!this.isLogin()) {
  136. return
  137. }
  138. this.setData({
  139. popupShow: true
  140. })
  141. },
  142. onClose() {
  143. this.setData({
  144. popupShow: false
  145. })
  146. },
  147. async onMemberInfo() {
  148. this.setData({
  149. isShowMemberInfoTip: false
  150. })
  151. try {
  152. const resData = await api_getUserBeneficiaryPage()
  153. const pageRows = resData?.data?.data?.rows || []
  154. // 当有权益人的时候跳转到权益人选择列表页面,当没有权益人的时候到添加权益人页面
  155. if (pageRows.length) {
  156. wx.navigateTo({
  157. url: `/pages/member/memberList?id=${this.data.memberInfo.id}`
  158. });
  159. } else {
  160. // 当redirectUrl等于index的时候证明是首次添加,需要给上一个页面
  161. wx.navigateTo({
  162. url: `/pages/member/addMember?redirectUrl=index`
  163. });
  164. }
  165. } catch (e) {
  166. console.log(e, 'e')
  167. }
  168. },
  169. onSubmit() {
  170. // 判断是否登录
  171. const that = this
  172. debounce(function () {
  173. if (!that.isLogin()) {
  174. return
  175. }
  176. if (!that.data.memberInfo.id) {
  177. wx.showToast({
  178. title: "请填写会员资料",
  179. icon: 'none'
  180. })
  181. that.setData({
  182. isShowMemberInfoTip: true
  183. })
  184. return
  185. }
  186. let info = JSON.stringify({
  187. ...that.data.selected
  188. });
  189. let instrumentsInfo = JSON.stringify({
  190. ...that.data.selectedInstruments
  191. })
  192. let memberInfo = JSON.stringify({
  193. ...that.data.memberInfo
  194. })
  195. info = encodeURIComponent(info);
  196. instrumentsInfo = encodeURIComponent(instrumentsInfo);
  197. memberInfo = encodeURIComponent(memberInfo);
  198. wx.navigateTo({
  199. url: `../orders/order-detail?orderInfo=${info}&instrumentsInfo=${instrumentsInfo}&memberInfo=${memberInfo}`,
  200. success: () => {
  201. }
  202. })
  203. }, 300)()
  204. },
  205. onPreivewGoodsImg(e: { currentTarget: { dataset: any } }) {
  206. wx.previewImage({
  207. current: e.currentTarget.dataset.src,
  208. urls: this.data.goodsImgList,
  209. success: () => {
  210. this.setData({
  211. isFromPreviewImage: true
  212. })
  213. }
  214. })
  215. },
  216. onPreivewGoods(e: { currentTarget: { dataset: any } }) {
  217. wx.previewImage({
  218. current: e.currentTarget.dataset.src,
  219. urls: [e.currentTarget.dataset.src],
  220. success: () => {
  221. this.setData({
  222. isFromPreviewImage: true
  223. })
  224. }
  225. })
  226. },
  227. /**
  228. * 生命周期函数--监听页面显示
  229. */
  230. onShow() {
  231. this.initPosInfo()
  232. if (!this.data.isFromPreviewImage && !this.data.popupShow) {
  233. this.onInit()
  234. this.setData({
  235. memberInfo: {}
  236. })
  237. } else {
  238. this.setData({
  239. isFromPreviewImage: false
  240. })
  241. }
  242. this.setData({
  243. serviceShow: true
  244. })
  245. },
  246. onHide() {
  247. this.setData({
  248. serviceShow: false
  249. })
  250. },
  251. // 初始化位置信息
  252. initPosInfo() {
  253. // 获取屏幕宽高
  254. const systemInfo = wx.getWindowInfo();
  255. const isAndroid = systemInfo.platform === 'android'
  256. // const isDevtools = systemInfo.platform === 'devtools'
  257. const barHeight = !isAndroid ? 44 : 48;
  258. const globalTop = app.globalData.sectionBoxTop
  259. this.setData({
  260. maxTop: barHeight + systemInfo.safeArea.top,
  261. windowHeight: systemInfo.windowHeight,
  262. top: globalTop
  263. });
  264. },
  265. onTouchStart(e: any) {
  266. // 记录触摸起始点的 Y 坐标
  267. this.setData({
  268. startY: e.touches[0].clientY
  269. });
  270. },
  271. onTouchMove(e: any) {
  272. // 计算上下方向的偏移量
  273. const deltaY = e.touches[0].clientY - this.data.startY;
  274. // 更新元素的垂直位置
  275. app.globalData.sectionBoxTop = this.data.top + deltaY
  276. this.setData({
  277. top: this.data.top + deltaY,
  278. startY: e.touches[0].clientY
  279. });
  280. },
  281. onTouchEnd() {
  282. const { top, windowHeight, elementHeight } = this.data;
  283. // 计算与顶部和底部边界的距离
  284. const distanceTop = top;
  285. const moveHeight = top + elementHeight
  286. // 判断元素与顶部和底部的距离,选择最近的边界
  287. if (distanceTop < this.data.maxTop) {
  288. this.setData({ top: this.data.maxTop }, () => {
  289. app.globalData.sectionBoxTop = this.data.maxTop
  290. }); // 吸附到顶部
  291. } else if (moveHeight >= windowHeight) {
  292. this.setData({ top: windowHeight - elementHeight }, () => {
  293. app.globalData.sectionBoxTop = windowHeight - elementHeight
  294. })
  295. } else {
  296. this.setData({ top }, () => {
  297. app.globalData.sectionBoxTop = top
  298. })
  299. }
  300. },
  301. onScroll(e: { detail: any }) {
  302. // console.log(e, 'any')
  303. const scrollTop = e.detail.scrollTop || 0
  304. if (scrollTop > 40) {
  305. this.setData({
  306. isShowOperation: true
  307. })
  308. } else {
  309. this.setData({
  310. isShowOperation: false
  311. })
  312. }
  313. },
  314. onShareAppMessage() {
  315. return {
  316. title: '音乐数字AI器乐工具',
  317. path: '/pages/index/index',
  318. imageUrl: 'https://oss.dayaedu.com/ktyq/1733311074676.png'
  319. }
  320. },
  321. onShareTimeline() {
  322. return {
  323. title: '音乐数字AI器乐工具',
  324. path: '/pages/index/index',
  325. imageUrl: 'https://oss.dayaedu.com/ktyq/1733311074676.png'
  326. }
  327. }
  328. })