bianjiang 1 жил өмнө
parent
commit
3a5ab16dd1

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

@@ -259,6 +259,7 @@ const ListItemStyle = css`
     line-height: 20px;
     font-weight: 400;
     color: #666666;
+    word-break: break-all;
   }
   .item_date {
     font-size: 12px;

+ 80 - 70
src/views/website/home/components/Research.tsx

@@ -1,9 +1,48 @@
 import { css } from "@linaria/core";
 
 import Image from "@/components/Image";
-import { defineComponent } from "vue";
+import { useArticle } from "@/modules";
+import { ArrowRightOutlined } from "@ant-design/icons-vue";
+import { Empty } from "ant-design-vue";
+import dayjs from "dayjs";
+import { defineComponent, onMounted, reactive } from "vue";
+import { RouterLink, useRouter } from "vue-router";
 export default defineComponent({
   setup() {
+    const storeArt = useArticle();
+    const router = useRouter();
+    const categoryId = "6464b7398dcb7ddb98b57a60";
+    const state = reactive({
+      list: [],
+    });
+
+    onMounted(() => {
+      getList();
+    });
+
+    const getList = async () => {
+      const query = {
+        page: 1,
+        size: 4,
+        query: JSON.stringify({ cid: categoryId }),
+      };
+      const res = await storeArt.getArticleList(query);
+      const list = res.list || [];
+      state.list = list;
+    };
+    const turnPage = (aid: string) => {
+      router.push({
+        name: "article",
+        params: { id: categoryId },
+        query: { aid },
+      });
+    };
+    const renderTitle = (title?: string) => {
+      if (title && title.length > 30) {
+        return title.substring(0, 30) + "...";
+      }
+      return title;
+    };
     return () => (
       <div class={[page, "home_lay_item_box"]}>
         <div class={"global_w"}>
@@ -11,78 +50,44 @@ export default defineComponent({
             科研创作<span>/</span>
             <span>Scientific Research</span>
           </div>
-          <div class={"tab_list"}>
-            <div class={"list_item"}>
-              <a>
-                <div class={"list_img"}>
-                  <Image src={""} />
-                </div>
-                <div class={"info_box"}>
-                  <div class={"item_tit"}>
-                    美术与设计学院赴深圳市牧本工业设计有限公司走访交流
-                  </div>
-                  <div class={"item_desc"}>
-                    4月21日下午,西华大学美术与设计学院、美丽乡村建设与发展研究中心邀请四川大学周波教授来校作多路径的“乡土再造”探索主题讲座…
-                  </div>
-                  <div class={"item_date"}>2023.04.03</div>
-                </div>
-              </a>
-            </div>
-            <div class={"list_item"}>
-              <a>
-                <div class={"list_img"}>
-                  <Image src={""} />
-                </div>
-                <div class={"info_box"}>
-                  <div class={"item_tit"}>
-                    美术与设计学院赴深圳市牧本工业设计有限公司走访交流
-                  </div>
-                  <div class={"item_desc"}>
-                    4月21日下午,西华大学美术与设计学院、美丽乡村建设与发展研究中心邀请四川大学周波教授来校作多路径的“乡土再造”探索主题讲座…
-                  </div>
-                  <div class={"item_date"}>2023.04.03</div>
-                </div>
-              </a>
-            </div>
-            <div class={"list_item"}>
-              <a>
-                <div class={"list_img"}>
-                  <Image src={""} />
-                </div>
-                <div class={"info_box"}>
-                  <div class={"item_tit"}>
-                    美术与设计学院赴深圳市牧本工业设计有限公司走访交流
-                  </div>
-                  <div class={"item_desc"}>
-                    4月21日下午,西华大学美术与设计学院、美丽乡村建设与发展研究中心邀请四川大学周波教授来校作多路径的“乡土再造”探索主题讲座…
+          {state.list.length > 0 ? (
+            <div class={"tab_list"}>
+              {state.list.map((e: ArticleItem) => {
+                return (
+                  <div class={"list_item"}>
+                    <div
+                      class={"item"}
+                      onClick={() => {
+                        turnPage(e._id);
+                      }}
+                    >
+                      <div class={"list_img"}>
+                        <Image src={e.cover} />
+                      </div>
+                      <div class={"info_box"}>
+                        <div class={"item_tit"}>{renderTitle(e.title)}</div>
+                        <div class={"item_desc"}>{e.summary + "..."}</div>
+                        <div class={"item_date"}>
+                          {dayjs(e.createTime).format("YYYY.MM.DD")}
+                        </div>
+                      </div>
+                    </div>
                   </div>
-                  <div class={"item_date"}>2023.04.03</div>
-                </div>
-              </a>
+                );
+              })}
             </div>
-            <div class={"list_item"}>
-              <a>
-                <div class={"list_img"}>
-                  <Image src={""} />
-                </div>
-                <div class={"info_box"}>
-                  <div class={"item_tit"}>
-                    美术与设计学院赴深圳市牧本工业设计有限公司走访交流
-                  </div>
-                  <div class={"item_desc"}>
-                    4月21日下午,西华大学美术与设计学院、美丽乡村建设与发展研究中心邀请四川大学周波教授来校作多路径的“乡土再造”探索主题讲座…
-                  </div>
-                  <div class={"item_date"}>2023.04.03</div>
-                </div>
-              </a>
+          ) : (
+            <div class={"ant-list-empty-text"}>
+              <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
             </div>
-          </div>
-          {/* <div class={"list_more"}>
-            <a>
+          )}
+
+          <div class={"list_more"}>
+            <RouterLink to={`/detail/${categoryId}`}>
               查看更多
               <ArrowRightOutlined class={"arrow"} />
-            </a>
-          </div> */}
+            </RouterLink>
+          </div>
         </div>
       </div>
     );
@@ -100,10 +105,11 @@ const page = css`
       background-color: #fff;
       overflow: hidden;
       position: relative;
-      a {
+      .item {
         position: relative;
         display: block;
         border-bottom: 2px solid rgba(159, 159, 159, 0.5);
+        cursor: pointer;
         &::before {
           content: "";
           position: absolute;
@@ -151,15 +157,19 @@ const page = css`
         padding: 20px 18px;
       }
       .item_tit {
+        height: 56px;
         font-size: 20px;
-        line-height: 32px;
+        line-height: 28px;
         color: #333333;
+        overflow: hidden;
       }
       .item_desc {
         margin-top: 20px;
         font-size: 16px;
+        line-height: 24px;
         font-weight: 400;
         color: #666666;
+        word-break: break-all;
       }
       .item_date {
         font-size: 14px;

+ 2 - 3
src/views/website/home/components/Speciality.tsx

@@ -7,9 +7,8 @@ import { RouterLink } from "vue-router";
 export default defineComponent({
   setup() {
     const storeCategory = useCategory();
-
     const storeArt = useArticle();
-    const specialityId = "64649b6e8dcb7ddb98b57a1a";
+    const categoryId = "64649b6e8dcb7ddb98b57a1a";
     const state = reactive({
       summarys: [] as any,
       specialities: [],
@@ -25,7 +24,7 @@ export default defineComponent({
     });
     const initSpeciality = async () => {
       const speciality = storeCategory.categoryTree.find((e) => {
-        return e._id == specialityId;
+        return e._id == categoryId;
       });
       if (!speciality) {
         return;

+ 111 - 94
src/views/website/home/components/Talents.tsx

@@ -1,29 +1,71 @@
 import { css } from "@linaria/core";
 
 import { ArrowRightOutlined } from "@ant-design/icons-vue";
-import { defineComponent, reactive } from "vue";
-import { TabPane, Tabs } from "ant-design-vue";
+import { defineComponent, reactive, watch, onMounted } from "vue";
+import { Empty, TabPane, Tabs } from "ant-design-vue";
 import Image from "@/components/Image";
+import { useArticle, useCategory } from "@/modules";
+import { RouterLink, useRouter } from "vue-router";
+import dayjs from "dayjs";
 export default defineComponent({
   setup() {
-    const tabs = [
-      {
-        title: "研究生教育",
-        key: "1",
-      },
-      {
-        title: "本科教育",
-        key: "2",
-      },
-      {
-        title: "国际交流",
-        key: "3",
-      },
-    ];
+    const storeCategory = useCategory();
+    const storeArt = useArticle();
+    const router = useRouter();
+    const categoryId = "6464a15b8dcb7ddb98b57a1c";
     const state = reactive({
-      activeKey: "1",
+      activeKey: "",
+      tabs: [],
+      allList: new Map(),
     });
+    watch(
+      () => storeCategory.categoryTree.length,
+      () => {
+        initCategory();
+      }
+    );
+    onMounted(() => {
+      initCategory();
+    });
+    const initCategory = async () => {
+      const currCategory = storeCategory.categoryTree.find((e) => {
+        return e._id == categoryId;
+      });
+      if (!currCategory) {
+        return;
+      }
+      const children = currCategory.children;
 
+      const res = children.map((e: any) => {
+        return getList(e._id);
+      });
+      Promise.all(res).then((e) => {
+        state.tabs = children;
+        state.activeKey = children[0]._id;
+      });
+    };
+    const getList = (id: string) => {
+      return new Promise(async (resolve) => {
+        const query = { page: 1, size: 4, query: JSON.stringify({ cid: id }) };
+        const res = await storeArt.getArticleList(query);
+        const list = res.list || [];
+        state.allList.set(id, list);
+        resolve(true);
+      });
+    };
+    const turnPage = (aid: string, cid: string) => {
+      router.push({
+        name: "article",
+        params: { id: cid },
+        query: { aid },
+      });
+    };
+    const renderTitle = (title?: string) => {
+      if (title && title.length > 30) {
+        return title.substring(0, 30) + "...";
+      }
+      return title;
+    };
     return () => (
       <div class={[page, "home_lay_item_box"]}>
         <div class={"global_w"}>
@@ -33,28 +75,28 @@ export default defineComponent({
                 return (
                   <div class={"ant-tabs-nav"}>
                     <div class={"home_lay_title"}>
-                      人才培养<span>/</span>
-                      <span>Talent Training</span>
+                      教育教学<span>/</span>
+                      <span>Education & teaching</span>
                     </div>
                     <div class={"ant-tabs-nav-wrap justify-end"}>
                       <div class={"ant-tabs-nav-list"}>
-                        {tabs.map((e) => {
+                        {state.tabs.map((e: any) => {
                           return (
                             <div
                               class={`ant-tabs-tab ${
-                                state.activeKey == e.key
+                                state.activeKey == e._id
                                   ? "ant-tabs-tab-active"
                                   : ""
                               }`}
-                              key={e.key}
+                              key={e._id}
                             >
                               <div
                                 class={"ant-tabs-tab-btn"}
                                 onClick={() => {
-                                  state.activeKey = e.key;
+                                  state.activeKey = e._id;
                                 }}
                               >
-                                {e.title}
+                                {e.name}
                               </div>
                             </div>
                           );
@@ -65,80 +107,51 @@ export default defineComponent({
                 );
               },
               default: () => {
-                return tabs.map((item) => {
+                return state.tabs.map((item: any) => {
+                  const list = state.allList.get(item._id);
                   return (
-                    <TabPane tab={item.title} key={item.key}>
-                      <div class={"tab_list"}>
-                        <div class={"list_item"}>
-                          <a>
-                            <div class={"list_img"}>
-                              <Image src={""} />
-                            </div>
-                            <div class={"info_box"}>
-                              <div class={"item_tit"}>
-                                美术与设计学院赴深圳市牧本工业设计有限公司走访交流
-                              </div>
-                              <div class={"item_desc"}>
-                                4月21日下午,西华大学美术与设计学院、美丽乡村建设与发展研究中心邀请四川大学周波教授来校作多路径的“乡土再造”探索主题讲座…
-                              </div>
-                              <div class={"item_date"}>2023.04.03</div>
-                            </div>
-                          </a>
-                        </div>
-                        <div class={"list_item"}>
-                          <a>
-                            <div class={"list_img"}>
-                              <Image src={""} />
-                            </div>
-                            <div class={"info_box"}>
-                              <div class={"item_tit"}>
-                                美术与设计学院赴深圳市牧本工业设计有限公司走访交流
-                              </div>
-                              <div class={"item_desc"}>
-                                4月21日下午,西华大学美术与设计学院、美丽乡村建设与发展研究中心邀请四川大学周波教授来校作多路径的“乡土再造”探索主题讲座…
-                              </div>
-                              <div class={"item_date"}>2023.04.03</div>
-                            </div>
-                          </a>
-                        </div>
-                        <div class={"list_item"}>
-                          <a>
-                            <div class={"list_img"}>
-                              <Image src={""} />
-                            </div>
-                            <div class={"info_box"}>
-                              <div class={"item_tit"}>
-                                美术与设计学院赴深圳市牧本工业设计有限公司走访交流
-                              </div>
-                              <div class={"item_desc"}>
-                                4月21日下午,西华大学美术与设计学院、美丽乡村建设与发展研究中心邀请四川大学周波教授来校作多路径的“乡土再造”探索主题讲座…
+                    <TabPane tab={item.name} key={item._id}>
+                      {list.length > 0 ? (
+                        <div class={"tab_list"}>
+                          {list.map((e: ArticleItem) => {
+                            return (
+                              <div class={"list_item"}>
+                                <div
+                                  class={"item"}
+                                  onClick={() => {
+                                    turnPage(e._id, item._id);
+                                  }}
+                                >
+                                  <div class={"list_img"}>
+                                    <Image src={e.cover} />
+                                  </div>
+                                  <div class={"info_box"}>
+                                    <div class={"item_tit"}>
+                                      {renderTitle(e.title)}
+                                    </div>
+                                    <div class={"item_desc"}>
+                                      {e.summary + "..."}
+                                    </div>
+                                    <div class={"item_date"}>
+                                      {dayjs(e.createTime).format("YYYY.MM.DD")}
+                                    </div>
+                                  </div>
+                                </div>
                               </div>
-                              <div class={"item_date"}>2023.04.03</div>
-                            </div>
-                          </a>
+                            );
+                          })}
                         </div>
-                        <div class={"list_item"}>
-                          <a>
-                            <div class={"list_img"}>
-                              <Image src={""} />
-                            </div>
-                            <div class={"info_box"}>
-                              <div class={"item_tit"}>
-                                美术与设计学院赴深圳市牧本工业设计有限公司走访交流
-                              </div>
-                              <div class={"item_desc"}>
-                                4月21日下午,西华大学美术与设计学院、美丽乡村建设与发展研究中心邀请四川大学周波教授来校作多路径的“乡土再造”探索主题讲座…
-                              </div>
-                              <div class={"item_date"}>2023.04.03</div>
-                            </div>
-                          </a>
+                      ) : (
+                        <div class={"ant-list-empty-text"}>
+                          <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
                         </div>
-                      </div>
+                      )}
+
                       <div class={"list_more"}>
-                        <a>
+                        <RouterLink to={`/detail/${item._id}`}>
                           查看更多
                           <ArrowRightOutlined class={"arrow"} />
-                        </a>
+                        </RouterLink>
                       </div>
                     </TabPane>
                   );
@@ -205,11 +218,11 @@ const page = css`
         background-color: #fff;
         overflow: hidden;
         position: relative;
-
-        a {
+        .item {
           position: relative;
           display: block;
           border-bottom: 2px solid rgba(159, 159, 159, 0.5);
+          cursor: pointer;
           &::before {
             content: "";
             position: absolute;
@@ -258,14 +271,18 @@ const page = css`
         }
         .item_tit {
           font-size: 20px;
-          line-height: 32px;
+          line-height: 28px;
+          height: 56px;
+          overflow: hidden;
           color: #333333;
         }
         .item_desc {
           margin-top: 20px;
           font-size: 16px;
+          line-height: 24px;
           font-weight: 400;
           color: #666666;
+          word-break: break-all;
         }
         .item_date {
           font-size: 14px;

+ 125 - 103
src/views/website/home/components/Works.tsx

@@ -1,35 +1,64 @@
 import { css } from "@linaria/core";
 
 import { ArrowRightOutlined } from "@ant-design/icons-vue";
-import { TabPane, Tabs } from "ant-design-vue";
-import { defineComponent, reactive } from "vue";
+import { Empty, TabPane, Tabs } from "ant-design-vue";
+import { defineComponent, onMounted, reactive, watch } from "vue";
+import { useArticle, useCategory } from "@/modules";
+import { RouterLink, useRouter } from "vue-router";
+import Image from "@/components/Image";
 export default defineComponent({
   setup() {
-    const tabs = [
-      {
-        title: "产品设计",
-        key: "1",
-      },
-      {
-        title: "视觉传达",
-        key: "2",
-      },
-      {
-        title: "美术艺术",
-        key: "3",
-      },
-      {
-        title: "环境设计",
-        key: "4",
-      },
-      {
-        title: "动画",
-        key: "5",
-      },
-    ];
+    const storeCategory = useCategory();
+    const storeArt = useArticle();
+    const router = useRouter();
+    const categoryId = "6464a6478dcb7ddb98b57a24";
     const state = reactive({
-      activeKey: "1",
+      activeKey: "",
+      tabs: [],
+      allList: new Map(),
     });
+    watch(
+      () => storeCategory.categoryTree.length,
+      () => {
+        initCategory();
+      }
+    );
+    onMounted(() => {
+      initCategory();
+    });
+    const initCategory = async () => {
+      const currCategory = storeCategory.categoryTree.find((e) => {
+        return e._id == categoryId;
+      });
+      if (!currCategory) {
+        return;
+      }
+      const children = currCategory.children;
+
+      const res = children.map((e: any) => {
+        return getList(e._id);
+      });
+      Promise.all(res).then((e) => {
+        state.tabs = children;
+        state.activeKey = children[0]._id;
+      });
+    };
+    const getList = (id: string) => {
+      return new Promise(async (resolve) => {
+        const query = { page: 1, size: 7, query: JSON.stringify({ cid: id }) };
+        const res = await storeArt.getArticleList(query);
+        const list = res.list || [];
+        state.allList.set(id, list);
+        resolve(true);
+      });
+    };
+    const turnPage = (aid: string, cid: string) => {
+      router.push({
+        name: "article",
+        params: { id: cid },
+        query: { aid },
+      });
+    };
 
     return () => (
       <div class={[page, "home_lay_item_box"]}>
@@ -45,23 +74,23 @@ export default defineComponent({
                     </div>
                     <div class={"ant-tabs-nav-wrap justify-end"}>
                       <div class={"ant-tabs-nav-list"}>
-                        {tabs.map((e) => {
+                        {state.tabs.map((e: CategoryItem) => {
                           return (
                             <div
                               class={`ant-tabs-tab ${
-                                state.activeKey == e.key
+                                state.activeKey == e._id
                                   ? "ant-tabs-tab-active"
                                   : ""
                               }`}
-                              key={e.key}
+                              key={e._id}
                             >
                               <div
                                 class={"ant-tabs-tab-btn"}
                                 onClick={() => {
-                                  state.activeKey = e.key;
+                                  state.activeKey = e._id;
                                 }}
                               >
-                                {e.title}
+                                {e.name}
                               </div>
                             </div>
                           );
@@ -72,86 +101,78 @@ export default defineComponent({
                 );
               },
               default: () => {
-                return tabs.map((item) => {
+                return state.tabs.map((item: CategoryItem) => {
+                  const list = state.allList.get(item._id);
+
                   return (
-                    <TabPane tab={item.title} key={item.key}>
-                      <div class={"tab_list"}>
-                        <div class={"list_item"}>
-                          <a class={"item_link"}>
-                            <img src={getImageUrl("temp_works_1.png")} />
-                            <div class={"item_txt"}>
-                              <div class={"name"}>骨科手术导航机器人</div>
-                              <div class={"authors"}>作者:张小碗</div>
-                            </div>
-                          </a>
-                        </div>
-                        <div class={"list_item"}>
-                          <div class={"item_lay"}>
-                            <a class={"item_link"}>
-                              <img src={getImageUrl("temp_works_2.png")} />
-                              <div class={"item_txt"}>
-                                <div class={"name"}>骨科手术导航机器人</div>
-                                <div class={"authors"}>作者:张小碗</div>
+                    <TabPane tab={item.name} key={item._id}>
+                      {list.length > 0 ? (
+                        <div class={"tab_list"}>
+                          {list.map((e: ArticleItem, index: number) => {
+                            const next = list[index + 1];
+                            if (index == 0) {
+                              return (
+                                <div class={"list_item"}>
+                                  <div
+                                    class={"item_link"}
+                                    onClick={() => {
+                                      turnPage(e._id, item._id);
+                                    }}
+                                  >
+                                    <Image src={e.cover} />
+                                    <div class={"item_txt"}>
+                                      <div class={"name"}>{e.title}</div>
+                                    </div>
+                                  </div>
+                                </div>
+                              );
+                            }
+                            if (index % 2 == 0) {
+                              return null;
+                            }
+                            return (
+                              <div class={"list_item"}>
+                                <div class={"item_lay"}>
+                                  <div
+                                    class={"item_link"}
+                                    onClick={() => {
+                                      turnPage(e._id, item._id);
+                                    }}
+                                  >
+                                    <Image src={e.cover} />
+                                    <div class={"item_txt"}>
+                                      <div class={"name"}>{e.title}</div>
+                                    </div>
+                                  </div>
+                                </div>
+                                <div class={"item_lay"}>
+                                  <div
+                                    class={"item_link"}
+                                    onClick={() => {
+                                      turnPage(next._id, item._id);
+                                    }}
+                                  >
+                                    <Image src={next.cover} />
+                                    <div class={"item_txt"}>
+                                      <div class={"name"}>{next.title}</div>
+                                    </div>
+                                  </div>
+                                </div>
                               </div>
-                            </a>
-                          </div>
-                          <div class={"item_lay"}>
-                            <a class={"item_link"}>
-                              <img src={getImageUrl("temp_works_2.png")} />
-                              <div class={"item_txt"}>
-                                <div class={"name"}>骨科手术导航机器人</div>
-                                <div class={"authors"}>作者:张小碗</div>
-                              </div>
-                            </a>
-                          </div>
-                        </div>
-                        <div class={"list_item"}>
-                          {" "}
-                          <div class={"item_lay"}>
-                            <a class={"item_link"}>
-                              <img src={getImageUrl("temp_works_2.png")} />
-                              <div class={"item_txt"}>
-                                <div class={"name"}>骨科手术导航机器人</div>
-                                <div class={"authors"}>作者:张小碗</div>
-                              </div>
-                            </a>
-                          </div>
-                          <div class={"item_lay"}>
-                            <a class={"item_link"}>
-                              <img src={getImageUrl("temp_works_2.png")} />
-                              <div class={"item_txt"}>
-                                <div class={"name"}>骨科手术导航机器人</div>
-                                <div class={"authors"}>作者:张小碗</div>
-                              </div>
-                            </a>
-                          </div>
+                            );
+                          })}
                         </div>
-                        <div class={"list_item"}>
-                          <div class={"item_lay"}>
-                            <a class={"item_link"}>
-                              <img src={getImageUrl("temp_works_2.png")} />
-                              <div class={"item_txt"}>
-                                <div class={"name"}>骨科手术导航机器人</div>
-                                <div class={"authors"}>作者:张小碗</div>
-                              </div>
-                            </a>
-                          </div>
-                          <div class={"item_lay"}>
-                            <a class={"item_link"}>
-                              <img src={getImageUrl("temp_works_2.png")} />
-                              <div class={"item_txt"}>
-                                <div class={"name"}>骨科手术导航机器人</div>
-                                <div class={"authors"}>作者:张小碗</div>
-                              </div>
-                            </a>
-                          </div>
+                      ) : (
+                        <div class={"ant-list-empty-text"}>
+                          <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
                         </div>
-                      </div>
+                      )}
+
                       <div class={"list_more"}>
-                        <a>
+                        <RouterLink to={`/detail/${item._id}`}>
                           查看更多
                           <ArrowRightOutlined class={"arrow"} />
-                        </a>
+                        </RouterLink>
                       </div>
                     </TabPane>
                   );
@@ -220,6 +241,7 @@ const page = css`
           width: 100%;
           height: 100%;
           overflow: hidden;
+          cursor: pointer;
           .item_txt {
             position: absolute;
             left: 0;