ソースを参照

小程序添加资讯模块

shmily1213 4 週間 前
コミット
8467e7d32d

+ 8 - 1
src/api/modules/news.ts

@@ -1,6 +1,6 @@
 import { Guide, News, NewsQueryDTO } from "@/types/news";
 import flyio from "../flyio";
-import { ApiResponseList } from "@/types";
+import { ApiResponse, ApiResponseList } from "@/types";
 
 /**
  * 获取新闻列表
@@ -17,3 +17,10 @@ export function getNewsMainList() {
 export function getNewsListNoToken(params: NewsQueryDTO) {
   return flyio.get('/front/news/listNoToken', params) as Promise<ApiResponseList<News>>;
 }
+
+/**
+ * 获取资讯详情
+ */
+export function getNewsDetail(id: number) {
+  return flyio.get(`/front/news/info`, { id }) as Promise<ApiResponse<News>>;
+}

+ 12 - 0
src/common/routes.ts

@@ -0,0 +1,12 @@
+export const routes = {
+  /**
+   * 新闻详情
+   */
+  newsDetail: '/pagesOther/pages/news/detail/detail',
+  /**
+   * 新闻列表
+   */
+  newsGroup: '/pagesOther/pages/news/group/group',
+} as const;
+
+export type Routes = keyof typeof routes;

+ 0 - 0
src/components/ie-tabs-swiper/ie-tabs-swiper.vue


+ 2 - 0
src/hooks/useTransferPage.ts

@@ -1,5 +1,6 @@
 import { Transfer } from "@/types";
 import { onLoad } from "@dcloudio/uni-app";
+import { routes } from "@/common/routes";
 export const useTransferPage = <T1 = any, T2 = any>() => {
   const funcMap = {
     redirectTo: uni.redirectTo,
@@ -168,5 +169,6 @@ export const useTransferPage = <T1 = any, T2 = any>() => {
     prevData,
     transferTo,
     transferBack,
+    routes
   }
 };

+ 12 - 0
src/pages.json

@@ -44,6 +44,18 @@
           "style": {
             "navigationBarTitleText": ""
           }
+        },
+        {
+          "path": "pages/news/group/group",
+          "style": {
+            "navigationBarTitleText": ""
+          }
+        },
+        {
+          "path": "pages/news/detail/detail",
+          "style": {
+            "navigationBarTitleText": ""
+          }
         }
       ]
     },

+ 2 - 2
src/pagesMain/pages/index/components/index-guide.vue

@@ -4,9 +4,9 @@
       <view class="wrap mt-20 bg-white rounded-15">
         <uv-tabs :current="current" :list="tabs" :scrollable="false" @change="handleChange"></uv-tabs>
         <view class="p-30 grid grid-cols-2 gap-x-20 gap-y-20 justify-items-center">
-          <view class="w-full justify-items-center relative" v-for="(item, index) in contentList" :key="item.id"
+          <view class="w-full justify-items-center relative h-150" v-for="(item, index) in contentList" :key="item.id"
             @click="handleClick(item)">
-            <ie-image :is-oss="true" :src="item.image" class="w-full h-150" :round="10" bg-color="transparent" />
+            <ie-image :is-oss="true" :src="item.image" class="w-full h-full" :round="10" bg-color="transparent" />
             <view class="absolute inset-0 h-full z-1 flex flex-col items-start justify-center box-border pl-16">
               <view v-if="item.subType" class="text-28 text-fore-title font-bold">{{ item.subType }}</view>
               <view v-if="item.description" class="mt-6 text-20 text-fore-light">{{ item.description }}</view>

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

@@ -37,7 +37,7 @@ import { useUserStore } from '@/store/userStore';
 import { useTransferPage } from '@/hooks/useTransferPage';
 import { useNavbar } from '@/hooks/useNavbar';
 import { onPageShow } from '@dcloudio/uni-app';
-const { transferTo } = useTransferPage();
+const { routes, transferTo } = useTransferPage();
 const { baseStickyTop } = useNavbar();
 const scrollTop = ref(0);
 const isHide = ref(false);
@@ -45,21 +45,21 @@ const userStore = useUserStore();
 const orgName = computed(() => userStore.orgInfo.orgName);
 
 const handleDetail = async (id: number | string, title?: string) => {
-  // if (('' + id).includes(',')) {
-  //   transferTo(mxConst.routes.newsGroup, {
-  //     data: {
-  //       ids: id,
-  //       title: title
-  //     }
-  //   });
-  // } else {
-  //   transferTo(mxConst.routes.newsDetail, {
-  //     data: {
-  //       id: id,
-  //       title: title
-  //     }
-  //   })
-  // }
+  if (('' + id).includes(',')) {
+    transferTo(routes.newsGroup, {
+      data: {
+        ids: id,
+        title: title
+      }
+    });
+  } else {
+    transferTo(routes.newsDetail, {
+      data: {
+        id: id,
+        title: title
+      }
+    })
+  }
 }
 
 const popupRef = ref();

+ 58 - 0
src/pagesOther/pages/news/detail/detail.vue

@@ -0,0 +1,58 @@
+<template>
+  <ie-page>
+    <ie-navbar title="资讯详情" />
+    <view class="p-20">
+      <view class="text-xl mb-20">{{ detail.title }}</view>
+      <view class="flex items-center justify-between">
+        <view>
+          <uv-text size="14" prefix-icon="clock-fill" :icon-style="{ color: 'var(--primary-color)' }"
+            :text="detail.sendDate" />
+        </view>
+        <uv-tags v-if="detail.type" size="mini" type="primary" plain plain-fill :text="detail.type" />
+      </view>
+      <view class="html mt-30">
+        <uv-parse :content="detail.content" :tagStyle="style" />
+      </view>
+    </view>
+  </ie-page>
+</template>
+<script lang="ts" setup>
+import { getNewsDetail } from '@/api/modules/news';
+import { News } from '@/types/news';
+import { onLoad } from '@dcloudio/uni-app';
+import { useTransferPage } from '@/hooks/useTransferPage';
+const { prevData } = useTransferPage();
+const detail = ref<News>({} as News);
+const style = {
+  img: 'width: 100% !important; max-width: 100% !important; height: auto !important;',
+  p: 'line-height: 26px;font-size: 13px;',
+  h1: 'line-height: 40px;font-size: 13px;',
+  h2: 'line-height: 40px;font-size: 13px;',
+  h3: 'line-height: 40px;font-size: 13px;',
+  h4: 'line-height: 40px;font-size: 13px;',
+  h5: 'line-height: 40px;font-size: 13px;',
+  h6: 'line-height: 40px;font-size: 13px;',
+  span: 'font-size: 13px;',
+  div: 'font-size: 13px;',
+  table: 'width: 100% !important; max-width: 100% !important; height: auto !important;',
+}
+const loadData = async () => {
+  try {
+    uni.$ie.showLoading();
+    const { data } = await getNewsDetail(prevData.value.id);
+    detail.value = data;
+  } catch (error) {
+    console.error(error);
+  } finally {
+    uni.$ie.hideLoading();
+  }
+}
+onLoad(() => {
+  loadData();
+});
+</script>
+<style lang="scss">
+.html {
+  font-size: 13px;
+}
+</style>

+ 42 - 0
src/pagesOther/pages/news/group/group.vue

@@ -0,0 +1,42 @@
+<template>
+  <ie-page>
+    <z-paging ref="paging" v-model="list" :default-page-size="20" @query="handleQuery">
+      <template #top>
+        <ie-navbar :title="prevData.title" />
+      </template>
+      <view class="mt-20 mx-20 mb-30" v-for="item in list" :key="item.id">
+        <ie-news-item :data="item" @click="handleClick(item)" />
+      </view>
+    </z-paging>
+  </ie-page>
+</template>
+<script lang="ts" setup>
+import { getNewsListNoToken } from '@/api/modules/news';
+import { News } from '@/types/news';
+import { useTransferPage } from '@/hooks/useTransferPage';
+const { prevData, transferTo, routes } = useTransferPage();
+
+const list = ref<News[]>([]);
+const paging = ref<ZPagingInstance>();
+const handleQuery = (pageNum: number, pageSize: number) => {
+  uni.$ie.showLoading();
+  getNewsListNoToken({
+    ids: prevData.value.ids,
+    pageNum,
+    pageSize,
+  }).then(res => paging.value?.completeByTotal(res.rows, res.total))
+    .catch(() => paging.value?.complete(false))
+    .finally(() => uni.$ie.hideLoading());
+}
+const handleClick = (item: News) => {
+  transferTo(routes.newsDetail, {
+    data: {
+      id: item.id,
+    }
+  });
+}
+onLoad(() => {
+  paging.value?.reload();
+});
+</script>
+<style lang="scss" scoped></style>

+ 1 - 0
src/types/news.ts

@@ -8,6 +8,7 @@ export interface Guide {
 }
 
 export interface NewsQueryDTO {
+  ids?: string;
   pageNum: number;
   pageSize: number;
   tag?: string;