bianjiang 1 年之前
父节点
当前提交
585a41c421

+ 2 - 0
src/views/admin/banner/EditBanner.tsx

@@ -14,6 +14,7 @@ import { RightOutlined } from "@ant-design/icons-vue";
 import { defineComponent, reactive, ref, nextTick, onMounted } from "vue";
 import { object } from "vue-types";
 import ArticleList from "./ArticleList";
+import { uploader } from "@/modules/objects";
 
 export default defineComponent({
   props: {
@@ -50,6 +51,7 @@ export default defineComponent({
     });
     const submit = () => {
       formRef.value?.validate().then(async () => {
+        await uploader.uploadBlobImages(state.formData);
         modal.submit(state.formData);
       });
     };

+ 1 - 1
src/views/admin/banner/index.tsx

@@ -60,7 +60,7 @@ export default defineComponent({
                 danger
                 type="link"
                 onClick={() => {
-                  artStore.deleteArticle(record);
+                  artStore.deleteBanner(record);
                 }}
               >
                 删除

+ 23 - 4
src/views/website/detail/DownloadPage.tsx

@@ -5,6 +5,7 @@ import { List } from "ant-design-vue";
 import { defineComponent, onMounted } from "vue";
 import { object } from "vue-types";
 import dayjs from "dayjs";
+import { uploader } from "@/modules/objects";
 export default defineComponent({
   props: {
     data: object<CategoryItem>(),
@@ -27,7 +28,14 @@ export default defineComponent({
       await artStore.listController.loadPage(1);
       loading.hidden();
     };
-
+    const isImage = (url: string) => {
+      const last = url.lastIndexOf(".");
+      const fileExt = url.substring(last + 1);
+      if (["jpg", "jpeg", "png", "gif", "webp"].includes(fileExt)) {
+        return true;
+      }
+      return false;
+    };
     return () => {
       return (
         <div class={page}>
@@ -37,6 +45,7 @@ export default defineComponent({
               dataSource={artStore.listController.state.list}
               rowKey={(item) => item._id}
               renderItem={({ item, index }) => {
+                const isImg = isImage(item.summary);
                 return (
                   <List.Item>
                     <div class={"list_item"}>
@@ -46,9 +55,19 @@ export default defineComponent({
                         </div>
                         <div class={"name"}>{item.title}</div>
                       </div>
-                      <a class={"download"} href={item.summary}>
-                        下载
-                      </a>
+                      {isImg ? (
+                        <a
+                          class={"download"}
+                          href={item.summary}
+                          target="_blank"
+                        >
+                          下载
+                        </a>
+                      ) : (
+                        <a class={"download"} href={item.summary}>
+                          下载
+                        </a>
+                      )}
                     </div>
                   </List.Item>
                 );

+ 3 - 1
src/views/website/detail/ListPage.tsx

@@ -21,9 +21,11 @@ const teacherList = [
 export default defineComponent({
   props: {
     data: object<CategoryItem>(),
+    category: object<CategoryItem>(),
   },
   setup(props, { emit }) {
     const data: any = props.data || {};
+    const category: any = props.category || {};
     const artStore = useArticle();
     artStore.listController.state.list = [];
     const route = useRoute();
@@ -50,7 +52,7 @@ export default defineComponent({
       loading.hidden();
     };
     const itemRender = (item: any, index: number) => {
-      if (teacherList.includes(data._id)) {
+      if (teacherList.includes(category._id)) {
         return <TeacherItem item={item} key={item._id} />;
       }
       return <ArticleItem item={item} key={item._id} />;

+ 5 - 1
src/views/website/detail/index.tsx

@@ -130,7 +130,11 @@ export default defineComponent({
                 <DetailPage key={state.currFloor._id} data={state.currFloor} />
               )}
               {state.currFloor.type == "list" && (
-                <ListPage key={state.currFloor._id} data={state.currFloor} />
+                <ListPage
+                  key={state.currFloor._id}
+                  data={state.currFloor}
+                  category={state.currMid}
+                />
               )}
               {state.currFloor.type == "download" && (
                 <DownloadPage

+ 75 - 18
src/views/website/home/components/Banner.tsx

@@ -1,44 +1,98 @@
 import { css } from "@linaria/core";
-import { defineComponent, reactive, ref } from "vue";
+import { defineComponent, reactive, ref, nextTick } from "vue";
 import { Swiper, SwiperSlide } from "swiper/vue";
 import { Autoplay } from "swiper";
 import "swiper/css";
+import { useArticle, useCategory } from "@/modules";
+import loading from "@/components/Provider/Loading";
+import Image from "@/components/Image";
+import { message } from "ant-design-vue";
+import { useRouter } from "vue-router";
+
 export default defineComponent({
   setup() {
+    const store = useArticle();
+    const storeCategory = useCategory();
+    const router = useRouter();
     const state = reactive({
       active: 0,
+      images: [] as any,
     });
     const swiperRef = ref();
-    const images = [
-      {
-        url: getImageUrl("banner/banner.png"),
-      },
-      {
-        url: getImageUrl("banner/banner.png"),
-      },
-    ];
+    const initBanner = async () => {
+      loading.show("");
+      await store.bannerList.loadPage(1);
+      state.images = store.bannerList.state.list;
+
+      nextTick(() => {
+        if (swiperRef.value) {
+          swiperRef.value.update();
+        }
+      });
+      loading.hidden();
+    };
+    initBanner();
     const initSwiper = (swiper: any) => {
       swiperRef.value = swiper;
     };
+    const bannerClick = async (item: any) => {
+      if (item.url) {
+        window.open(item.url);
+        return;
+      }
+      if (!item.aid) return;
+      const detRes = await store.listController.itemDetail(item.aid);
+      if (detRes.errorNo != 200) {
+        message.warn("未查询到数据!");
+        return;
+      }
+      const artDetail = detRes.result;
+      const currCate = storeCategory.listController.state.list.find((e) => {
+        return e._id == artDetail.cid;
+      });
+      if (!currCate) {
+        return;
+      }
+      const currParent = storeCategory.listController.state.list.find((e) => {
+        return e._id == currCate?.pid;
+      });
+      if (currParent?.pid == "top") {
+        router.push({
+          name: "article",
+          params: { id: currCate._id },
+          query: { aid: artDetail._id },
+        });
+      } else {
+        router.push({
+          name: "article",
+          params: { id: currParent?._id },
+          query: { aid: artDetail._id },
+        });
+      }
+    };
     return () => (
       <div class={page}>
         <Swiper
           class={"banner_swiper"}
           modules={[Autoplay]}
-          autoplay={{
-            delay: 5000,
-            disableOnInteraction: false,
-          }}
+          autoplay={false}
           loop={true}
           onSwiper={initSwiper}
           onSlideChange={(e) => {
             state.active = e.realIndex;
           }}
         >
-          {images.map((e) => {
+          {state.images.map((item: any) => {
             return (
               <SwiperSlide>
-                <img src={e.url} />
+                <div
+                  class={"banner_item"}
+                  onClick={() => {
+                    bannerClick(item);
+                  }}
+                >
+                  <Image src={item.cover} />
+                </div>
               </SwiperSlide>
             );
           })}
@@ -60,9 +114,9 @@ export default defineComponent({
           />
         </div>
         <div class={"swiper_pagination"}>
-          {images.length > 0 && (
+          {state.images.length > 0 && (
             <div class={"page_dots_box"}>
-              {images.map((_, i) => {
+              {state.images.map((_: any, i: number) => {
                 return (
                   <div
                     class={["page_dot", state.active == i ? "active" : null]}
@@ -87,11 +141,14 @@ const page = css`
   .banner_swiper {
     height: 100%;
     img {
-      height: 100%;
+      height: 600px;
       width: 100%;
       object-fit: cover;
       user-select: none;
     }
+    .banner_item {
+      cursor: pointer;
+    }
   }
   .swiper_prev,
   .swiper_next {