Jelajahi Sumber

feat(djk): 新增大健康模块功能

- 新增DJKGoodsVO、DJKShopVO、PmsDjkGoods等类型定义
- 添加djk相关的API接口定义(appletGoodsList、appletShopInfo、goodsInfo)
- 在首页导航栏增加大健康入口并实现轮播功能
- 创建大健康子包,包含首页、商品详情页、店铺详情页
- 实现商品列表分页加载、店铺信息展示、商品详情展示等功能
- 添加底部tabbar组件支持首页、福利中心、订单切换
- 配置页面路由和类型声明文件更新
zhangtao 3 hari lalu
induk
melakukan
a2161a9d39

+ 136 - 0
src/api/api.type.d.ts

@@ -2451,4 +2451,140 @@ namespace Api {
     sellPrice?: number
     [property: string]: any
   }
+  interface DJKShopVO {
+    /**
+     * 营业时间
+     */
+    businessTime?: string
+    /**
+     * 商品
+     */
+    goodsList?: DJKGoodsVO[]
+    /**
+     * 销量
+     */
+    sales?: number
+    /**
+     * 门店地址
+     */
+    shopAddress?: string
+    /**
+     * shopId
+     */
+    shopId?: number
+    /**
+     * 纬度
+     */
+    shopLat?: number
+    /**
+     * 经度
+     */
+    shopLng?: number
+    /**
+     * 门店图片
+     */
+    shopLogo?: string
+    /**
+     * 门店名
+     */
+    shopName?: string
+    /**
+     * 电话
+     */
+    tel?: string
+    [property: string]: any
+  }
+  interface DJKGoodsVO {
+    /**
+     * 商品图
+     */
+    goodsImg?: string
+    /**
+     * 商品名
+     */
+    goodsName?: string
+    /**
+     * 商品id
+     */
+    id?: number
+    /**
+     * 门店地址
+     */
+    price?: string
+    /**
+     * 销量
+     */
+    sales?: number
+    [property: string]: any
+  }
+  interface PmsDjkGoods {
+    /**
+     * 提前预约时间(天)
+     */
+    advanceBookingTime?: number
+    /**
+     * 购买人群
+     */
+    buyNotice?: string
+    /**
+     * 图文说明
+     */
+    content?: string
+    createTime?: string
+    /**
+     * 有效时间(天)
+     */
+    effectiveTime?: number
+    /**
+     * 商品编码
+     */
+    goodsCode?: string
+    /**
+     * 封面
+     */
+    goodsImg?: string
+    /**
+     * 商品名
+     */
+    goodsName?: string
+    /**
+     * 价格
+     */
+    price?: number
+    /**
+     * 销量
+     */
+    sales?: number
+    /**
+     * 上下架
+     */
+    shelfStatus?: number
+    /**
+     * 门店id
+     */
+    shopId?: number
+    /**
+     * shopName
+     */
+    shopName?: string
+    /**
+     * tel
+     */
+    tel?: string
+    updateTime?: string
+    /**
+     * 消费流程
+     */
+    usageProcess?: string
+    /**
+     * 可用结束时间
+     */
+    useEndTime?: string
+    /**
+     * 可用开始时间
+     */
+    useStartTime?: string
+    [property: string]: any
+  }
+
 }

+ 4 - 0
src/api/apiDefinitions.ts

@@ -102,4 +102,8 @@ export default {
   'videoRight.orderCreate':['POST', '/smqjh-oms/app-api/v1/order/virtual'],
   'videoRight.orderDetail':['GET', '/smqjh-oms/app-api/v1/order/virtual/detail'],
   'videoRight.orderList':['GET', '/smqjh-oms/app-api/v1/order/virtual/list'],
+
+  'djk.appletGoodsList':['GET', '/smqjh-pms/app-api/v1/goods/appletGoodsList'],
+  'djk.appletShopInfo':['GET', '/smqjh-pms/app-api/v1/goods/appletShopInfo'],
+  'djk.goodsInfo':['GET', '/smqjh-pms/app-api/v1/goods/goodsInfo'],
 };

+ 31 - 0
src/api/globals.d.ts

@@ -967,6 +967,37 @@ declare global {
         config: Config
       ): Alova2Method<apiResData<DataVirtualOrderListVo>, 'videoRight.orderList', Config>;
     }
+    djk: {
+      appletGoodsList<
+        Config extends Alova2MethodConfig<listData<Api.DJKShopVO>> & {
+          data: {
+            pageNum?: number;
+            pageSize?: number;
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<listData<Api.DJKShopVO>, 'djk.appletGoodsList', Config>;
+      appletShopInfo<
+        Config extends Alova2MethodConfig<apiResData<Api.DJKShopVO>> & {
+          data: {
+           shopId:number
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.DJKShopVO>, 'djk.appletShopInfo', Config>;
+      goodsInfo<
+        Config extends Alova2MethodConfig<apiResData<Api.PmsDjkGoods>> & {
+          data: {
+            goodsId: number
+          }
+        }
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.PmsDjkGoods>, 'djk.goodsInfo', Config>;
+
+    }
   }
 }
 var Apis: Apis;

+ 2 - 2
src/config/index.ts

@@ -4,14 +4,14 @@ const mapEnvVersion = {
    */
   // develop: 'http://192.168.1.166:8080', // 张
   // develop: 'http://192.168.1.101:8080',
-  // develop: 'http://192.168.0.157:8080',
+  develop: 'http://192.168.0.157:8080',
   // develop: 'http://192.168.1.253:8080',
   // develop: 'http://192.168.0.19:8080',
   // develop: 'http://192.168.0.217:8080', // 黄
   // develop: 'http://192.168.1.89:8080', // 田
   // develop: 'http://74949mkfh190.vicp.fun', // 付
   // develop: 'http://47.109.84.152:8081',
-  develop: 'https://smqjh.api.zswlgz.com',
+  // develop: 'https://smqjh.api.zswlgz.com',
   /**
    * 体验版
    */

+ 33 - 0
src/pages.json

@@ -510,6 +510,39 @@
           }
         }
       ]
+    },
+    {
+      "root": "subPack-djk",
+      "pages": [
+        {
+          "path": "commonTab/index",
+          "name": "djk-homeTabbar",
+          "islogin": false,
+          "style": {
+            "navigationStyle": "custom",
+            "navigationBarTitleText": "大健康首页",
+            "backgroundColorBottom": "#fff",
+            "disableScroll": true
+          }
+        },
+        {
+          "path": "goodsinfo/index",
+          "name": "djk-goods",
+          "islogin": false,
+          "style": {
+            "navigationStyle": "custom",
+            "navigationBarTitleText": "大健康商品详情"
+          }
+        },
+        {
+          "path": "shopinfo/index",
+          "name": "djk-shopinfo",
+          "islogin": false,
+          "style": {
+            "navigationBarTitleText": "商家主页"
+          }
+        }
+      ]
     }
   ]
 }

+ 35 - 16
src/pages/index/index.vue

@@ -33,6 +33,7 @@ const { data: goodsList, isLastPage, page, reload, error, refresh } = usePaginat
 const state = computed(() => {
   return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
 })
+const currentIndex = ref(0)
 const loading = ref(true)
 
 onShow(async () => {
@@ -63,6 +64,7 @@ const navList = computed(() => {
     { icon: `${StaticUrl}/smqjh-jiayou.png`, title: '加油', name: '', show: !isOnlineAudit.value },
     { icon: `${StaticUrl}/smqjh-jiudian.png`, title: '酒店民宿', name: '', show: !isOnlineAudit.value },
     { icon: `${StaticUrl}/smqjh-daijia.png`, title: '代驾', name: '', show: !isOnlineAudit.value },
+    { icon: `${StaticUrl}/smqjh-djk.png`, title: '大健康', name: 'djk-homeTabbar', show: !isOnlineAudit.value },
   ]
   return list
 })
@@ -90,6 +92,11 @@ onShareAppMessage(() => {
 function handleGo() {
   show({ msg: '敬请期待 !' })
 }
+function handleChangeSwiper(e: UniHelper.SwiperOnChangeEvent) {
+  console.log(e.detail.current, 'e.detail.current')
+
+  currentIndex.value = e.detail.current
+}
 </script>
 
 <template>
@@ -151,26 +158,38 @@ function handleGo() {
 
           ]"
         >
-          <view class="grid grid-cols-4 gap-12rpx">
-            <template v-for="item in navList" :key="item.icon">
-              <view
-                v-if="item.show" class="flex flex-col items-center justify-center"
-                @click="handleClick(String(item.name))"
-              >
-                <view class="relative h-120rpx w-120rpx">
-                  <image :src="item.icon" class="h-120rpx w-120rpx" />
+          <swiper :duration="300" class="h340rpx" @change="handleChangeSwiper">
+            <swiper-item
+              v-for="pageIndex in Math.ceil(navList.filter(i => i.show).length / 8)" :key="pageIndex"
+            >
+              <view class="grid grid-cols-4 gap-12rpx">
+                <template
+                  v-for="item in navList.filter(i => i.show).slice((pageIndex - 1) * 8, pageIndex * 8)"
+                  :key="item.icon"
+                >
                   <view
-                    v-if="item.name == ''"
-                    class="linebg absolute left-0 top-0 h-full w-full flex items-center justify-center rounded-32rpx text-24rpx text-white font-semibold"
+                    class="flex flex-col items-center justify-center"
+                    @click="handleClick(String(item.name))"
                   >
-                    敬请期待
+                    <view class="relative h-120rpx w-120rpx">
+                      <image :src="item.icon" class="h-120rpx w-120rpx" />
+                      <view
+                        v-if="item.name == ''"
+                        class="linebg absolute left-0 top-0 h-full w-full flex items-center justify-center rounded-32rpx text-24rpx text-white font-semibold"
+                      >
+                        敬请期待
+                      </view>
+                    </view>
+                    <view class="text-24rpx">
+                      {{ item.title }}
+                    </view>
                   </view>
-                </view>
-                <view class="text-24rpx">
-                  {{ item.title }}
-                </view>
+                </template>
               </view>
-            </template>
+            </swiper-item>
+          </swiper>
+          <view class="w-full flex items-center justify-center">
+            <view v-for="_pageIndex, index in Math.ceil(navList.filter(i => i.show).length / 8)" :key="index" class="mr14rpx transition-all transition-duration-400 ease-in" :class="[currentIndex == index ? 'rounded-12rpx w-40rpx h12rpx bg-[var(--them-color)]' : 'w12rpx h12rpx rounded-50% bg-#F0F0F0']" />
           </view>
         </wd-skeleton>
       </view>

+ 48 - 0
src/subPack-djk/commonTab/components/fl.vue

@@ -0,0 +1,48 @@
+<script setup lang="ts">
+const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
+</script>
+
+<template>
+  <view>
+    <wd-navbar
+      title="福利中心"
+      :bordered="false"
+      :z-index="99"
+      safe-area-inset-top
+      placeholder
+      fixed
+    />
+    <scroll-view scroll-y :style="{ height: `calc(100vh - ${(statusBarHeight + MenuButtonHeight) * 4}rpx)` }">
+      <view class="px24rpx">
+        <view v-for="item in 20" :key="item" class="mt20rpx rounded-16rpx bg-white p24rpx">
+          <view class="h248rpx w-full">
+            12
+          </view>
+          <view class="mt24rpx w-full">
+            <view class="flex items-center justify-between">
+              <view class="text-32rpx font-semibold">
+                新人专享活动
+              </view>
+              <view class="text-28rpx">
+                未开始
+              </view>
+            </view>
+          </view>
+          <view class="mt16rpx text-gray">
+            2026-01-19 14:03:59
+            至
+            2026-01-19 14:03:59
+          </view>
+          <view class="mt20rpx text-24rpx">
+            领取:24/4,458
+          </view>
+        </view>
+        <view class="h40rpx" />
+      </view>
+    </scroll-view>
+  </view>
+</template>
+
+<style scoped>
+
+</style>

+ 78 - 0
src/subPack-djk/commonTab/components/index.vue

@@ -0,0 +1,78 @@
+<script setup lang="ts">
+import router from '@/router'
+
+const { statusBarHeight, MenuButtonHeight } = storeToRefs(useSysStore())
+
+const { data: goodsList, isLastPage, page, reload, error } = usePagination((pageNum, pageSize) =>
+  Apis.djk.appletGoodsList({ data: { pageNum, pageSize } }), {
+  data: resp => resp.data?.list,
+  initialData: [],
+  initialPage: 1,
+  initialPageSize: 10,
+  append: true,
+})
+const state = computed(() => {
+  return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
+})
+function handleBottom() {
+  if (!isLastPage.value) {
+    page.value++
+  }
+}
+</script>
+
+<template>
+  <view>
+    <wd-navbar
+      title="大健康"
+      :bordered="false" :z-index="99" safe-area-inset-top
+      left-arrow placeholder fixed @click-left="router.back()"
+    />
+    <scroll-view scroll-y :style="{ height: `calc(100vh - ${(statusBarHeight + MenuButtonHeight) * 4}rpx)` }" @scrolltolower="handleBottom">
+      <view class="px24rpx">
+        <view v-for="item in goodsList" :key="item.shopId" class="mt20rpx rounded-16rpx bg-white p24rpx">
+          <view class="flex" @click="router.push({ name: 'djk-shopinfo', params: { id: `${item.shopId}` } })">
+            <image
+              :src="item.shopLogo?.split(',')[0]"
+              class="h144rpx w144rpx flex-shrink-0 rounded-16rpx"
+            />
+            <view class="ml20rpx flex-1">
+              <view class="text-32rpx font-semibold">
+                {{ item.shopName }}
+              </view>
+              <view class="mt16rpx text-24rpx text-gray">
+                总销量 {{ item.sales }}
+              </view>
+              <view class="mt16rpx text-24rpx text-gray">
+                {{ item.shopAddress }}
+              </view>
+            </view>
+          </view>
+          <view class="ml164rpx">
+            <view v-for="its in item.goodsList" :key="its.id" class="mt14rpx flex items-center justify-between" @click="router.push({ name: 'djk-goods', params: { id: `${its.id}` } })">
+              <view class="text-28rpx text-#FF4D3A font-semibold">
+                <text class="text-20rpx">
+                  ¥
+                </text> {{ its.price }}
+              </view>
+              <view class="text-24rpx">
+                {{ its.goodsName }}
+              </view>
+              <view class="text-24rpx text-gray">
+                已售 {{ its.sales }}
+              </view>
+            </view>
+          </view>
+        </view>
+        <view class="h40rpx" />
+      </view>
+      <template v-if="goodsList.length > 10">
+        <wd-loadmore :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
+      </template>
+    </scroll-view>
+  </view>
+</template>
+
+<style scoped>
+
+</style>

+ 71 - 0
src/subPack-djk/commonTab/index.vue

@@ -0,0 +1,71 @@
+<script setup lang="ts">
+import home from './components/index.vue'
+import fl from './components/fl.vue'
+import { StaticUrl } from '@/config'
+
+definePage({
+  name: 'djk-homeTabbar',
+  islogin: false,
+  style: {
+    navigationStyle: 'custom',
+    navigationBarTitleText: '大健康首页',
+    backgroundColorBottom: '#fff',
+    disableScroll: true,
+  },
+})
+const tabbarItems = ref([
+  { name: 'djk-home', value: null, active: true, title: '首页', icon1: `${StaticUrl}/djk-idx0.png`, icon2: `${StaticUrl}/djk-idx1.png` },
+  { name: 'djk-fl', value: null, active: false, title: '福利中心', icon1: `${StaticUrl}/djk-fl0.png`, icon2: `${StaticUrl}/djk-fl1.png` },
+  { name: 'djk-order', value: null, active: false, title: '订单', icon1: `${StaticUrl}/djk-order0.png`, icon2: `${StaticUrl}/djk-order1.png` },
+])
+const tabbarName = ref('djk-home')
+function handleTabbarChange({ value }: { value: string }) {
+  setTabbarItemActive(value)
+  tabbarName.value = value
+}
+function setTabbarItemActive(name: string) {
+  tabbarItems.value.forEach((item) => {
+    if (item.name === name) {
+      item.active = true
+    }
+    else {
+      item.active = false
+    }
+  })
+}
+</script>
+
+<template>
+  <view class="page-xsb">
+    <fl v-if="tabbarName == 'djk-fl'" />
+
+    <home v-show="tabbarName == 'djk-home'" />
+    <wd-tabbar
+      v-model="tabbarName" placeholder safe-area-inset-bottom fixed :bordered="false" custom-class="custom-tab"
+      :z-index="99999" @change="handleTabbarChange"
+    >
+      <wd-tabbar-item
+        v-for="(item, index) in tabbarItems" :key="index" :name="item.name"
+        :title="index == 0 && item.active ? '' : item.title"
+        @change="handleTabbarChange"
+      >
+        <template #icon="{ active }">
+          <template v-if="index == 0 && !active">
+            <image :src="item.icon1" class="h44rpx w44rpx" />
+          </template>
+          <template v-else-if="index == 0 && active">
+            <image :src="item.icon2" class="h74rpx w74rpx" />
+          </template>
+          <template v-else-if="index != 0">
+            <image v-if="active" :src="item.icon2" class="h44rpx w44rpx" />
+            <image v-else :src="item.icon1" class="h44rpx w44rpx" />
+          </template>
+        </template>
+      </wd-tabbar-item>
+    </wd-tabbar>
+  </view>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 154 - 0
src/subPack-djk/goodsinfo/index.vue

@@ -0,0 +1,154 @@
+<script setup lang="ts">
+import { StaticUrl } from '@/config'
+import router from '@/router'
+
+definePage({
+  name: 'djk-goods',
+  islogin: false,
+  style: {
+    navigationStyle: 'custom',
+    navigationBarTitleText: '大健康商品详情',
+  },
+})
+const current = ref<number>(0)
+
+const isShowTab = ref(false)
+const goodsId = ref()
+onLoad((option: any) => {
+  goodsId.value = option.id
+  getGoodsDetaile()
+})
+
+const goodsInfo = ref<Api.PmsDjkGoods>()
+
+const swiperList = computed(() => {
+  if (goodsInfo.value) {
+    return goodsInfo.value.goodsImg?.split(',')
+  }
+  return []
+})
+const goodsContent = computed(() => {
+  if (goodsInfo.value?.content) {
+    return goodsInfo.value.content.replace(
+      /<img/gi,
+      '<img style="max-width:100%;height:auto" ',
+    )
+  }
+  return '暂无数据'
+})
+
+async function getGoodsDetaile() {
+  const res = await Apis.djk.goodsInfo({ data: { goodsId: goodsId.value } })
+  goodsInfo.value = res.data
+}
+function handlePhone() {
+  uni.makePhoneCall({
+    phoneNumber: String(goodsInfo.value?.tel),
+  })
+}
+</script>
+
+<template>
+  <view class="page-djk">
+    <wd-navbar
+      title="商品详情" :custom-style="`background-color:${isShowTab ? '#FFF !important' : 'transparent !important'}`" :bordered="false" :z-index="99"
+      safe-area-inset-top left-arrow fixed @click-left="router.back()"
+    />
+    <template v-if="goodsInfo">
+      <wd-swiper v-model:current="current" :list="swiperList" :autoplay="false" :height="375" />
+      <view class="relative z999 rounded-t-48rpx bg-white px24rpx py28rpx -mt20rpx">
+        <view class="flex items-end text-#FF4D3A font-semibold">
+          <view class="text-24rpx">
+            ¥
+          </view>
+          <view class="text-36rpx line-height-[36rpx]">
+            {{ goodsInfo?.price }}
+          </view>
+        </view>
+        <view class="mt20rpx text-32rpx font-semibold">
+          {{ goodsInfo.goodsName }}
+        </view>
+        <view class="mt20rpx">
+          <text class="text-24rpx text-gray">
+            服务保障
+          </text>
+          <text class="ml10rpx text-24rpx">
+            随时退·过期退
+          </text>
+        </view>
+        <view class="mt20rpx flex items-center text-24rpx text-gray">
+          <image
+            :src="`${StaticUrl}/djk-goods-erro.png`"
+            class="mr5rpx h24rpx w24rpx"
+          />  使用积分购买的,退款后返回的积分,有效期不变
+        </view>
+      </view>
+      <view class="px24rpx">
+        <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+          <view class="text-32rpx font-semibold">
+            购买须知
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            有效期
+          </view>
+          <view class="mt16rpx text-28rpx">
+            购买之日起{{ goodsInfo.effectiveTime }}天有效
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            预约信息
+          </view>
+          <view class="mt16rpx text-28rpx">
+            请您提前{{ goodsInfo.advanceBookingTime }}天预定
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            可用时间
+          </view>
+          <view class="mt16rpx text-28rpx">
+            {{ goodsInfo.useStartTime }} 至 {{ goodsInfo.useEndTime }}
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            消费流程
+          </view>
+          <view class="mt16rpx text-28rpx">
+            {{ goodsInfo.usageProcess }}
+          </view>
+          <view class="mt20rpx text-24rpx text-gray">
+            购买人群
+          </view>
+          <view class="mt16rpx text-28rpx">
+            {{ goodsInfo.buyNotice }}
+          </view>
+        </view>
+        <view class="mt20rpx rounded-16rpx bg-white">
+          <view class="p24rpx text-32rpx font-semibold">
+            套餐详情
+            <rich-text :nodes="goodsContent" />
+          </view>
+        </view>
+      </view>
+      <view class="h180rpx" />
+      <view class="ios shadow-fixed fixed bottom-0 left-0 box-border w-full rounded-t-32rpx bg-white pl28rpx pr32rpx">
+        <view class="flex items-center pt10rpx">
+          <view class="w80rpx flex flex-col items-center justify-center" @click="handlePhone">
+            <image
+              :src="`${StaticUrl}/film-phone.png`"
+              class="h40rpx w40rpx"
+            />
+            <view class="mt20rpx text-28rpx">
+              电话
+            </view>
+          </view>
+          <view class="ml24rpx flex-1">
+            <wd-button block class="w-full">
+              立即购买
+            </wd-button>
+          </view>
+        </view>
+      </view>
+    </template>
+  </view>
+</template>
+
+<style scoped lang="scss">
+
+</style>

+ 133 - 0
src/subPack-djk/shopinfo/index.vue

@@ -0,0 +1,133 @@
+<script setup lang="ts">
+import { StaticUrl } from '@/config'
+import router from '@/router'
+
+definePage({ name: 'djk-shopinfo', islogin: false, style: { navigationBarTitleText: '商家主页' } })
+const shopInfo = ref<Api.DJKShopVO>()
+async function getShopInfo(shopId: number) {
+  const res = await Apis.djk.appletShopInfo({ data: { shopId } })
+  console.log(res)
+  shopInfo.value = res.data
+}
+onLoad((options: any) => {
+  getShopInfo(Number(options.id))
+})
+function handleNav() {
+  uni.openLocation({
+    latitude: Number(shopInfo.value?.shopLat),
+    longitude: Number(shopInfo.value?.shopLng),
+  })
+}
+function handlePhone() {
+  uni.makePhoneCall({
+    phoneNumber: String(shopInfo.value?.tel),
+  })
+}
+</script>
+
+<template>
+  <view v-if="shopInfo" class="py20rpx">
+    <scroll-view scroll-x class="h165rpx w-full whitespace-nowrap pl24rpx">
+      <view class="w-full flex items-center">
+        <view v-for="item in shopInfo.shopLogo?.split(',')" :key="item" class="mr20rpx h164rpx w280rpx flex-shrink-0">
+          <image
+            :src="item"
+            class="h164rpx w280rpx rounded-16rpx"
+          />
+        </view>
+      </view>
+    </scroll-view>
+    <view class="mt20rpx px24rpx">
+      <view class="rounded-16rpx bg-white p24rpx">
+        <view class="flex items-center justify-between">
+          <view class="text-32rpx font-semibold">
+            {{ shopInfo.shopName }}
+          </view>
+          <view class="text-24rpx text-gray">
+            已售 {{ shopInfo.sales }}
+          </view>
+        </view>
+        <view class="mt20rpx text-24rpx text-#52c41a">
+          营业中 {{ shopInfo.businessTime }}
+        </view>
+        <view class="mt20rpx h160rpx flex items-center justify-between bg-cover bg-center px24rpx" :style="{ backgroundImage: `url(${StaticUrl}/djk-shop-nav-bg.png)` }">
+          <view class="flex items-center">
+            <image
+              :src="`${StaticUrl}/location-black.png`"
+              class="mr16rpx h-33.8rpx min-w-28.97rpx w-28.97rpx"
+            />
+            {{ shopInfo.shopAddress }}
+          </view>
+          <view class="flex items-center">
+            <view class="mr40rpx flex flex-col items-center justify-center" @click="handleNav">
+              <image
+                :src="`${StaticUrl}/djk-shop-dh.png`"
+                class="h40rpx w40rpx"
+              />
+              <view class="mt20rpx text-28rpx">
+                导航
+              </view>
+            </view>
+            <view class="flex flex-col items-center justify-center" @click="handlePhone">
+              <image
+                :src="`${StaticUrl}/film-phone.png`"
+                class="h40rpx w40rpx"
+              />
+              <view class="mt20rpx text-28rpx">
+                电话
+              </view>
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="mt20rpx rounded-16rpx bg-white p24rpx">
+        <view class="mb20rpx flex items-center">
+          <view class="text-32rpx font-semibold">
+            精选商品
+          </view>
+          <view class="ml20rpx flex items-center text-22rpx">
+            <wd-icon name="check-circle" size="10px" color="#000" />
+            <view class="ml8rpx">
+              随时退
+            </view>
+          </view>
+          <view class="ml20rpx flex items-center text-22rpx">
+            <wd-icon name="check-circle" size="10px" color="#000" />
+            <view class="ml8rpx">
+              过期退
+            </view>
+          </view>
+        </view>
+        <scroll-view scroll-y type="custom">
+          <grid-view type="masonry" cross-axis-count="2" main-axis-gap="10" cross-axis-gap="10">
+            <view v-for="item in shopInfo.goodsList" :key="item.id" class="overflow-hidden rounded-16rpx" @click="router.push({ name: 'djk-goods', params: { id: `${item.id}` } })">
+              <image
+                class="h318rpx w318rpx"
+                :src="item.goodsImg"
+              />
+              <view class="bg-#F9F9F9 p16rpx">
+                <view class="text-28rpx font-semibold">
+                  {{ item.goodsName }}
+                </view>
+                <view class="mt16rpx flex items-center justify-between">
+                  <view class="text-36rpx text-#FF4D3A font-semibold">
+                    <text class="text-24rpx">
+                      ¥
+                    </text> {{ item.price }}
+                  </view>
+                  <view class="text-gray">
+                    已售{{ item.sales }}
+                  </view>
+                </view>
+              </view>
+            </view>
+          </grid-view>
+        </scroll-view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<style lang="scss" scoped>
+
+</style>

+ 4 - 1
src/uni-pages.d.ts

@@ -47,7 +47,10 @@ interface NavigateToOptions {
        "/subPack-videoRights/commonTab/index" |
        "/subPack-videoRights/videoRightsDetail/videoRightsDetail" |
        "/subPack-videoRights/videoRightsOrderInfo/videoRightsOrderInfo" |
-       "/subPack-videoRights/videoRightsSubmitOrder/videoRightsSubmitOrder";
+       "/subPack-videoRights/videoRightsSubmitOrder/videoRightsSubmitOrder" |
+       "/subPack-djk/commonTab/index" |
+       "/subPack-djk/goodsinfo/index" |
+       "/subPack-djk/shopinfo/index";
 }
 interface RedirectToOptions extends NavigateToOptions {}
 

+ 1 - 0
vite.config.ts

@@ -32,6 +32,7 @@ export default async () => {
           'subPack-film',
           'subPack-charge',
           'subPack-videoRights',
+          'subPack-djk',
         ],
         /**
          * 排除的页面,相对于 dir 和 subPackages