|
@@ -1,141 +1,201 @@
|
|
<script setup>
|
|
<script setup>
|
|
import { ref, reactive } from "vue";
|
|
import { ref, reactive } from "vue";
|
|
|
|
+import axios from "axios";
|
|
|
|
+import moment from "moment";
|
|
import Navbar from "@/components/Navbar.vue";
|
|
import Navbar from "@/components/Navbar.vue";
|
|
|
|
|
|
|
|
+const newsAll = reactive({
|
|
|
|
+ list: [],
|
|
|
|
+});
|
|
|
|
+const newsData = reactive({
|
|
|
|
+ list: [],
|
|
|
|
+});
|
|
|
|
+let searchInput = ref("");
|
|
|
|
+let searchError = ref(false);
|
|
|
|
+
|
|
|
|
+// 取得資料
|
|
|
|
+(async function getData() {
|
|
|
|
+ try {
|
|
|
|
+ const response = await axios.get("https://cmm.ai:8088/api/get_news");
|
|
|
|
+ console.log("response", response.data.news);
|
|
|
|
+ newsAll.list = response.data.news;
|
|
|
|
+ newsData.list = response.data.news;
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error(error);
|
|
|
|
+ }
|
|
|
|
+})();
|
|
|
|
+
|
|
|
|
+// 搜尋
|
|
|
|
+async function search() {
|
|
|
|
+ searchError.value = false;
|
|
|
|
+ let keyword = searchInput.value;
|
|
|
|
+ console.log("keyword", keyword);
|
|
|
|
+ if (keyword !== "") {
|
|
|
|
+ try {
|
|
|
|
+ const response = await axios.get(
|
|
|
|
+ `https://cmm.ai:8088/api/search_news_like?keyword=${keyword}`
|
|
|
|
+ );
|
|
|
|
+ if (response.data.news.length !== 0) {
|
|
|
|
+ newsData.list = response.data.news;
|
|
|
|
+ } else {
|
|
|
|
+ searchError.value = true;
|
|
|
|
+ }
|
|
|
|
+ } catch (error) {
|
|
|
|
+ console.error(error);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ newsData.list = newsAll.list;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
const breadcrumbs = reactive([
|
|
const breadcrumbs = reactive([
|
|
{
|
|
{
|
|
- title: '首頁',
|
|
|
|
|
|
+ title: "首頁",
|
|
disabled: false,
|
|
disabled: false,
|
|
- href: '/',
|
|
|
|
-
|
|
|
|
|
|
+ href: "/",
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '最新消息',
|
|
|
|
|
|
+ title: "最新消息",
|
|
disabled: true,
|
|
disabled: true,
|
|
- href: '/news',
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
|
|
+ href: "/news",
|
|
|
|
+ },
|
|
]);
|
|
]);
|
|
|
|
|
|
const categoryList = reactive([
|
|
const categoryList = reactive([
|
|
{
|
|
{
|
|
- title: '總覽'
|
|
|
|
|
|
+ title: "總覽",
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '一日學徒'
|
|
|
|
|
|
+ title: "一日學徒",
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '工藝行旅'
|
|
|
|
|
|
+ title: "工藝行旅",
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '希望工程'
|
|
|
|
|
|
+ title: "希望工程",
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '展覽資訊'
|
|
|
|
|
|
+ title: "展覽資訊",
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '補助計畫'
|
|
|
|
|
|
+ title: "補助計畫",
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- title: '策展補助'
|
|
|
|
- }
|
|
|
|
-])
|
|
|
|
-
|
|
|
|
-const getImageUrl = (name) => {
|
|
|
|
- return new URL(`/src/assets/img/${name}`, import.meta.url).href;
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
-console.log("getImageUrl('img-11.jpg')", getImageUrl('img-11.jpg'));
|
|
|
|
-const newsData = reactive([
|
|
|
|
- {
|
|
|
|
- date: '2023.06.19',
|
|
|
|
- category: '工藝行旅',
|
|
|
|
- img: getImageUrl('img-11.jpg'),
|
|
|
|
- title: '臺灣綠工藝Taiwan Green Craft 健全臺灣工藝生態系 工藝價值的社會實踐',
|
|
|
|
- describe: '臺灣綠工藝兼具「頂真精神、工作倫理、愉悅勞動、生活美學」的精神,以及「自然、循環、平衡、寬容、生命力」的本質,從生態系的宏觀視野,關注跨越文化面向、經濟面向、社會面向等廣大範疇,從而以工藝產業鏈的架構...'
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- date: '2023.06.19',
|
|
|
|
- category: '工藝行旅',
|
|
|
|
- img: getImageUrl('img-11.jpg'),
|
|
|
|
- title: '臺灣綠工藝Taiwan Green Craft 健全臺灣工藝生態系 工藝價值的社會實踐',
|
|
|
|
- describe: '臺灣綠工藝兼具「頂真精神、工作倫理、愉悅勞動、生活美學」的精神,以及「自然、循環、平衡、寬容、生命力」的本質,從生態系的宏觀視野,關注跨越文化面向、經濟面向、社會面向等廣大範疇,從而以工藝產業鏈的架構...'
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- date: '2023.06.19',
|
|
|
|
- category: '工藝行旅',
|
|
|
|
- img: getImageUrl('img-11.jpg'),
|
|
|
|
- title: '臺灣綠工藝Taiwan Green Craft 健全臺灣工藝生態系 工藝價值的社會實踐',
|
|
|
|
- describe: '臺灣綠工藝兼具「頂真精神、工作倫理、愉悅勞動、生活美學」的精神,以及「自然、循環、平衡、寬容、生命力」的本質,從生態系的宏觀視野,關注跨越文化面向、經濟面向、社會面向等廣大範疇,從而以工藝產業鏈的架構...'
|
|
|
|
|
|
+ title: "策展補助",
|
|
},
|
|
},
|
|
-])
|
|
|
|
|
|
+]);
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<template>
|
|
<template>
|
|
<Navbar />
|
|
<Navbar />
|
|
<div class="position-relative">
|
|
<div class="position-relative">
|
|
- <img src="@/assets/img/news/news-01.png" alt="" class="material-img">
|
|
|
|
|
|
+ <img src="@/assets/img/news/news-01.png" alt="" class="material-img" />
|
|
<v-container>
|
|
<v-container>
|
|
- <img src="@/assets/img/news/news-banner.png" alt="">
|
|
|
|
|
|
+ <img src="@/assets/img/news/news-banner.png" alt="" />
|
|
|
|
|
|
- <div class="content pt-10 mt-16">
|
|
|
|
|
|
+ <div class="content py-10 mt-16">
|
|
<div class="bg-img">
|
|
<div class="bg-img">
|
|
- <img src="@/assets/img/news/news-02.png" alt="">
|
|
|
|
|
|
+ <img src="@/assets/img/news/news-02.png" alt="" />
|
|
</div>
|
|
</div>
|
|
|
|
|
|
- <v-breadcrumbs :items="breadcrumbs" divider="/" class="pt-16 mb-5"></v-breadcrumbs>
|
|
|
|
|
|
+ <v-breadcrumbs
|
|
|
|
+ :items="breadcrumbs"
|
|
|
|
+ divider="/"
|
|
|
|
+ class="my-5"
|
|
|
|
+ ></v-breadcrumbs>
|
|
|
|
|
|
<div class="category-btn">
|
|
<div class="category-btn">
|
|
- <v-btn v-for="(item, index) in categoryList" :key="index" rounded="xl" color="brown"
|
|
|
|
- :class="{ 'me-5': index !== categoryList.length - 1 }" class="mb-5">
|
|
|
|
|
|
+ <v-btn
|
|
|
|
+ v-for="(item, index) in categoryList"
|
|
|
|
+ :key="index"
|
|
|
|
+ rounded="xl"
|
|
|
|
+ color="brown"
|
|
|
|
+ :class="{ 'me-5': index !== categoryList.length - 1 }"
|
|
|
|
+ class="mb-5"
|
|
|
|
+ >
|
|
{{ item.title }}
|
|
{{ item.title }}
|
|
</v-btn>
|
|
</v-btn>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="search mt-5 mb-10 me-16">
|
|
<div class="search mt-5 mb-10 me-16">
|
|
<span>
|
|
<span>
|
|
- <input type="text">
|
|
|
|
- <button>
|
|
|
|
- <img src="@/assets/img/news/news-search-icon.png" alt="">
|
|
|
|
|
|
+ <input v-model="searchInput" type="text" @keyup.enter="search()" />
|
|
|
|
+ <button @click="search()">
|
|
|
|
+ <img src="@/assets/img/news/news-search-icon.png" alt="" />
|
|
</button>
|
|
</button>
|
|
</span>
|
|
</span>
|
|
|
|
+ <div
|
|
|
|
+ v-if="searchError"
|
|
|
|
+ class="d-flex justify-center align-center error me-4"
|
|
|
|
+ >
|
|
|
|
+ <v-icon color="primary" icon="mdi-alert" class="me-2"></v-icon>
|
|
|
|
+ 沒有符合搜尋條件的項目
|
|
|
|
+ </div>
|
|
</div>
|
|
</div>
|
|
<ul>
|
|
<ul>
|
|
- <li v-for="(item, index) in newsData" :key="index" class="mb-10">
|
|
|
|
|
|
+ <li v-for="(item, index) in newsData.list" :key="index" class="mb-10">
|
|
<section class="d-flex">
|
|
<section class="d-flex">
|
|
<p class="category mb-5">
|
|
<p class="category mb-5">
|
|
<span></span>
|
|
<span></span>
|
|
{{ item.category }}
|
|
{{ item.category }}
|
|
</p>
|
|
</p>
|
|
- <p class="ms-5">{{ item.date }}</p>
|
|
|
|
|
|
+ <p class="ms-5">
|
|
|
|
+ {{ moment(`${item.create_time}`).format("YYYY-MM-DD") }}
|
|
|
|
+ </p>
|
|
</section>
|
|
</section>
|
|
- <v-card variant="outlined" class="d-flex align-center pa-5">
|
|
|
|
|
|
+ <v-card
|
|
|
|
+ variant="outlined"
|
|
|
|
+ class="d-flex flex-md-row flex-column align-center pa-5"
|
|
|
|
+ >
|
|
|
|
+ <v-row class="align-center">
|
|
|
|
+ <v-col cols="4">
|
|
|
|
+ <router-link :to="`/news/${item.news_id}`" class="cover-img">
|
|
|
|
+ <img src="@/assets/img/img-04.jpg" alt="" />
|
|
|
|
+ </router-link>
|
|
|
|
+ </v-col>
|
|
|
|
+ <v-col cols="8">
|
|
|
|
+ <section
|
|
|
|
+ class="d-flex flex-column px-5 px-sm-10 py-5 py-md-0"
|
|
|
|
+ >
|
|
|
|
+ <h2>{{ item.title }}</h2>
|
|
|
|
+ <p v-html="item.content"></p>
|
|
|
|
+ </section>
|
|
|
|
+ </v-col>
|
|
|
|
+ </v-row>
|
|
|
|
+
|
|
|
|
+ <!-- <router-link :to="`/news/${item.news_id}`" class="cover-img">
|
|
|
|
+ <img src="@/assets/img/img-04.jpg" alt="" />
|
|
|
|
+ </router-link>
|
|
<img :src="item.img" alt="">
|
|
<img :src="item.img" alt="">
|
|
- <section class="d-flex flex-column px-10">
|
|
|
|
|
|
+ <section class="d-flex flex-column px-5 px-sm-10 py-5 py-md-0">
|
|
<h2>{{ item.title }}</h2>
|
|
<h2>{{ item.title }}</h2>
|
|
- <p>{{ item.describe }}</p>
|
|
|
|
- </section>
|
|
|
|
|
|
+ <p v-html="item.content"></p>
|
|
|
|
+ </section> -->
|
|
</v-card>
|
|
</v-card>
|
|
</li>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</v-container>
|
|
</v-container>
|
|
- <img src="@/assets/img/news/news-01.png" alt="" class="material-img">
|
|
|
|
|
|
+ <img src="@/assets/img/news/news-01.png" alt="" class="material-img" />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
|
|
|
|
-<style lang="scss">
|
|
|
|
|
|
+<style lang="scss" scoped>
|
|
.material-img {
|
|
.material-img {
|
|
position: absolute;
|
|
position: absolute;
|
|
|
|
|
|
&:first-child {
|
|
&:first-child {
|
|
- top: -185px;
|
|
|
|
|
|
+ top: -15vw;
|
|
}
|
|
}
|
|
|
|
|
|
&:last-child {
|
|
&:last-child {
|
|
bottom: 0;
|
|
bottom: 0;
|
|
z-index: -5;
|
|
z-index: -5;
|
|
transform: scaleX(-1);
|
|
transform: scaleX(-1);
|
|
|
|
+
|
|
|
|
+ @media (max-width: 600px) {
|
|
|
|
+ bottom: 10px;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -149,41 +209,14 @@ const newsData = reactive([
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-.search {
|
|
|
|
- display: flex;
|
|
|
|
- align-items: center;
|
|
|
|
- justify-content: end;
|
|
|
|
-
|
|
|
|
- span {
|
|
|
|
- position: relative;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- input {
|
|
|
|
- padding: 5px 10px;
|
|
|
|
- border-radius: 100px;
|
|
|
|
- background-color: #fff;
|
|
|
|
- box-shadow: 1px 1px 3px #ccc;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- button {
|
|
|
|
- position: absolute;
|
|
|
|
- right: 10px;
|
|
|
|
- left: 0;
|
|
|
|
- top: 3px;
|
|
|
|
-
|
|
|
|
- img {
|
|
|
|
- width: 25px;
|
|
|
|
- position: absolute;
|
|
|
|
- right: 0;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
.content {
|
|
.content {
|
|
position: relative;
|
|
position: relative;
|
|
margin-bottom: 200px;
|
|
margin-bottom: 200px;
|
|
|
|
|
|
|
|
+ @media (max-width: 960px) {
|
|
|
|
+ margin-bottom: 100px;
|
|
|
|
+ }
|
|
|
|
+
|
|
.bg-img {
|
|
.bg-img {
|
|
display: flex;
|
|
display: flex;
|
|
justify-content: center;
|
|
justify-content: center;
|
|
@@ -194,6 +227,10 @@ const newsData = reactive([
|
|
left: 0;
|
|
left: 0;
|
|
bottom: -110px;
|
|
bottom: -110px;
|
|
|
|
|
|
|
|
+ @media (max-width: 960px) {
|
|
|
|
+ bottom: -30px;
|
|
|
|
+ }
|
|
|
|
+
|
|
img {
|
|
img {
|
|
min-width: 105%;
|
|
min-width: 105%;
|
|
}
|
|
}
|
|
@@ -202,6 +239,10 @@ const newsData = reactive([
|
|
ul {
|
|
ul {
|
|
padding: 0 80px;
|
|
padding: 0 80px;
|
|
|
|
|
|
|
|
+ @media (max-width: 600px) {
|
|
|
|
+ padding: 0 20px;
|
|
|
|
+ }
|
|
|
|
+
|
|
li {
|
|
li {
|
|
letter-spacing: 1px;
|
|
letter-spacing: 1px;
|
|
|
|
|
|
@@ -217,16 +258,59 @@ const newsData = reactive([
|
|
}
|
|
}
|
|
|
|
|
|
p {
|
|
p {
|
|
|
|
+ // 超過三行則省略
|
|
|
|
+ overflow: hidden;
|
|
|
|
+ text-overflow: ellipsis;
|
|
|
|
+ display: -webkit-box;
|
|
|
|
+ -webkit-line-clamp: 3;
|
|
|
|
+ -webkit-box-orient: vertical;
|
|
|
|
+ line-break: after-white-space;
|
|
line-height: 22px;
|
|
line-height: 22px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- img {
|
|
|
|
- width: 100%;
|
|
|
|
- max-width: 330px;
|
|
|
|
- height: 200px;
|
|
|
|
- object-fit: cover;
|
|
|
|
|
|
+ .cover-img {
|
|
|
|
+ display: block;
|
|
|
|
+ overflow: hidden;
|
|
|
|
+ img {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 200px;
|
|
|
|
+ object-fit: cover;
|
|
|
|
+ transition: all 0.5s;
|
|
|
|
+ &:hover {
|
|
|
|
+ transform: scale(1.1);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @media (max-width: 960px) {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: 300px;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @media (max-width: 600px) {
|
|
|
|
+ min-width: auto;
|
|
|
|
+ height: 200px;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ // img {
|
|
|
|
+ // width: 100%;
|
|
|
|
+ // height: 200px;
|
|
|
|
+ // object-fit: cover;
|
|
|
|
+ // transition: all 0.5s;
|
|
|
|
+ // &:hover {
|
|
|
|
+ // transform: scale(1.1);
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // @media (max-width: 960px) {
|
|
|
|
+ // width: 100%;
|
|
|
|
+ // height: 300px;
|
|
|
|
+ // }
|
|
|
|
+
|
|
|
|
+ // @media (max-width: 600px) {
|
|
|
|
+ // min-width: auto;
|
|
|
|
+ // height: 200px;
|
|
|
|
+ // }
|
|
|
|
+ // }
|
|
}
|
|
}
|
|
|
|
|
|
.category {
|
|
.category {
|
|
@@ -241,9 +325,8 @@ const newsData = reactive([
|
|
border-radius: 10px;
|
|
border-radius: 10px;
|
|
background-color: #000;
|
|
background-color: #000;
|
|
}
|
|
}
|
|
-
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-</style>
|
|
|
|
|
|
+</style>
|