12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280 |
- <script setup>
- import { ref, reactive, watch, onMounted } from "vue";
- import { useMainStore } from "@/stores/store";
- import { useI18n } from "vue-i18n";
- import axios from "axios";
- import Map from "@/components/Map.vue";
- import Navbar from "@/components/Navbar.vue";
- import TwCities from "@/assets/TwCities.json";
- import HomeList from "@/components/HomeList.vue";
- import TermsList from "@/components/TermsList.vue";
- import CourseCard from "@/components/CourseCard.vue";
- import CraftsArticle from "@/components/CraftsArticle.vue";
- const store = useMainStore();
- const { t } = useI18n();
- let loading = ref(true);
- onMounted(() => {
- // 無障礙網頁需於 iframe 加上 title
- // let hubspot = document.querySelector("#hubspot-conversations-iframe");
- // if (hubspot) {
- // hubspot.title = "HubSpot iframe";
- // }
- // console.log("hubspot", hubspot);
- store.getFavoriteClass();
- setTimeout(() => {
- loading.value = false;
- console.log("VITE_API_URL", import.meta.env.VITE_API_URL);
- console.log("apiUrl", store.apiUrl);
- }, 300);
- });
- // 地圖搜尋
- let selectedCounty = ref(null); // 縣市
- let selectedDistrict = ref(null); // 區域
- // 縣市
- let counties = reactive({
- list: [],
- });
- TwCities.map((e) => counties.list.push(e.name));
- // 區域
- let district = reactive({
- list: [],
- });
- // 選擇縣市後顯示對應區域
- watch(selectedCounty, (newValue) => {
- district.list = [];
- selectedDistrict.value = null;
- TwCities.map((e) => {
- if (e.name === newValue) {
- e.districts.map((item) => district.list.push(item.name));
- }
- });
- });
- let schoolKeyword = ref("");
- let locationSearchId = reactive({
- list: [],
- });
- // 搜尋據點
- async function searchSchool() {
- pageNum.value = 1;
- schoolState.value = true;
- locationSearchId.list.length = 0;
- let url = `${store.apiUrl}/api/get_school?is_check=1`;
- let location = "";
- if (selectedCounty.value && selectedDistrict.value) {
- location = `${selectedCounty.value}${selectedDistrict.value}`;
- } else if (selectedCounty.value) {
- location = `${selectedCounty.value}`;
- }
- if (schoolKeyword.value !== "" && location !== "") {
- url += `&keyword=${schoolKeyword.value}&location_keyword=${location}`;
- } else if (schoolKeyword.value === "" && location !== "") {
- url += `&location_keyword=${location}`;
- } else if (schoolKeyword.value !== "" && location === "") {
- url += `&keyword=${schoolKeyword.value}`;
- }
- console.log("url", url);
- try {
- const response = await axios.get(url);
- // totalPages.value = store.getTotalPages(response.data.total_num, 4);
- // classes.data = response.data.classes;
- console.log("搜尋地圖", response.data.schools);
- // 存據點 ID
- response.data.schools.map((item) =>
- locationSearchId.list.push(item.location_id)
- );
- console.log("locationSearchId.list", locationSearchId.list);
- // // 儲存地圖經緯度
- store.mapLocation.lat = parseFloat(response.data.schools[0].Lat);
- store.mapLocation.lng = parseFloat(response.data.schools[0].Lng);
- } catch (error) {
- console.error(error);
- }
- getClass();
- }
- let pageNum = ref(1); // 頁數(預設第一頁)
- let pageAmount = ref(4); // 每頁顯示筆數
- let totalPages = ref(1); // 總頁數
- // 切換分頁
- watch(pageNum, () => {
- getClass();
- });
- let classes = reactive({
- data: [],
- });
- let assignState = ref(false);
- let assignLocationId = ref(null);
- let schoolState = ref(false); // 搜尋狀態
- async function getClass() {
- console.log("get_class_name");
- let url = `${store.apiUrl}/api/get_class_name?is_check=1&page_num=${pageNum.value}&page_amount=${pageAmount.value}`;
- let assignUrl = `${store.apiUrl}/api/get_class_name?is_check=1&page_num=${pageNum.value}&page_amount=${pageAmount.value}&location_id=${assignLocationId.value}`;
- if (schoolState.value) {
- const list = `[${locationSearchId.list.join(",")}]`;
- url += `&location_id=${list}`;
- }
- console.log("schoolState url", url);
- // if (schoolState.value) {
- // let location = "";
- // if (selectedCounty.value && selectedDistrict.value) {
- // location = `${selectedCounty.value}${selectedDistrict.value}`;
- // console.log("location &&", location);
- // } else if (selectedCounty.value) {
- // location = `${selectedCounty.value}`;
- // console.log("location >>", location);
- // }
- // if (schoolKeyword.value !== "" && location !== "") {
- // url += `&keyword=${schoolKeyword.value}&location_keyword=${location}`;
- // } else if (schoolKeyword.value === "" && location !== "") {
- // url += `&location_keyword=${location}`;
- // } else if (schoolKeyword.value !== "" && location === "") {
- // url += `&keyword=${schoolKeyword.value}`;
- // }
- // console.log("url", url);
- // }
- try {
- const response = await axios.get(assignState.value ? assignUrl : url);
- totalPages.value = store.getTotalPages(response.data.total_num, 4);
- classes.data = response.data.classes;
- console.log("response", response.data.classes);
- // 儲存地圖經緯度
- store.mapLocation.lat = parseFloat(response.data.classes[0].Lat);
- store.mapLocation.lng = parseFloat(response.data.classes[0].Lng);
- } catch (error) {
- console.error(error);
- }
- }
- getClass();
- // 取得特定據點課程總筆數
- const getClassList = async (locationId) => {
- assignState.value = true;
- assignLocationId.value = locationId;
- try {
- const response = await axios.get(
- `${store.apiUrl}/api/get_class_name?location_id=${locationId}`
- );
- getClass();
- pageNum.value = 1;
- totalPages.value = store.getTotalPages(response.data.classes.length, 4);
- } catch (error) {
- console.log("error", error);
- }
- };
- let recommend = reactive({
- list: [],
- });
- // 推薦課程
- (async () => {
- try {
- const response = await axios.get(
- `${store.apiUrl}/api/get_class_name?recommend=1`
- );
- console.log("推薦課程", response);
- recommend.list = response.data.classes;
- console.log(" recommend.list", recommend.list);
- } catch (error) {
- console.error(error);
- }
- })();
- let panel = ref([]);
- const tagList = reactive([
- {
- title: "crafts.title_1",
- url: "/crafts#articleList",
- },
- {
- title: "crafts.title_2",
- url: "/crafts#readList",
- },
- {
- title: "crafts.title_3",
- url: "/crafts#bookList",
- },
- {
- title: "crafts.title_4",
- url: "/crafts#journal",
- },
- {
- title: "crafts.title_5",
- url: "/crafts#thesisGrant",
- },
- ]);
- let news = reactive({
- list: [],
- });
- // 重要訊息
- async function getNews() {
- // 取得最新兩篇
- try {
- const response = await axios.get(
- `${store.apiUrl}/api/get_news?page_num=1&page_amount=2`
- );
- news.list = response.data.news;
- console.log("重要訊息(新聞)", news.list);
- } catch (error) {
- console.error(error);
- }
- }
- getNews();
- let exhibit = reactive({
- list: [],
- });
- // 展覽(課程)
- async function getExhibit() {
- // 取得最新兩篇
- try {
- const response = await axios.get(
- `${store.apiUrl}/api/get_class_name?category=展覽&page_num=1&page_amount=2`
- );
- exhibit.list = response.data.classes;
- console.log("重要訊息(展覽)", exhibit.list);
- } catch (error) {
- console.error(error);
- }
- }
- let assignTag = ref("news");
- function selectTag(btn) {
- if (btn === "news") {
- assignTag.value = "news";
- } else {
- assignTag.value = "exhibit";
- getExhibit();
- }
- }
- // 工藝地圖手機版列表(底部彈出視窗)
- const isBottomSheetOpen = ref(false);
- // 開啟底部彈出視窗
- function handleTouch() {
- console.log("handleTouch");
- isBottomSheetOpen.value = !isBottomSheetOpen.value;
- }
- onMounted(() => {
- if (store.isMobile) {
- window.addEventListener("scroll", () => {
- let scrollHeight = document.documentElement.scrollTop;
- let bottomSheet = document.querySelector(".bottom-sheet");
- let mapBlock = document.querySelector(".map-block"); // 全台工藝地圖
- let recommendBlock = document.querySelector(".recommend-block"); // 工藝課程推薦
- // 取得位置
- let mapPosition = mapBlock.offsetTop;
- let recommendPosition = recommendBlock.offsetTop;
- // 判斷是否滾動到工藝地圖區塊
- if (
- scrollHeight >= mapPosition - 300 &&
- scrollHeight <= recommendPosition - 300
- ) {
- bottomSheet.style.display = "flex";
- } else {
- bottomSheet.style.display = "none";
- }
- });
- }
- });
- let closeBanner = ref(false);
- </script>
- <template>
- <Transition>
- <div class="loading-item" v-if="loading">
- <v-progress-circular
- color="grey-lighten-4"
- indeterminate
- ></v-progress-circular>
- </div>
- </Transition>
- <div class="banner" :class="{ close: closeBanner }">
- <img
- src="@/assets/img/home/banner.webp"
- alt="臺灣工藝學習平台"
- class="cover"
- />
- <img
- src="@/assets/img/home/logo-center.png"
- alt="臺灣工藝學習平台"
- class="logo"
- />
- </div>
- <button
- @click="closeBanner = true"
- class="close-btn"
- :class="{ close: closeBanner }"
- >
- <v-icon icon="mdi-close"></v-icon>
- </button>
- <Navbar />
- <v-container class="px-md-0 pb-16 mb-16">
- <section class="text-center intro">
- <h2 class="title">{{ t("home.title_1") }}</h2>
- <p class="my-10">
- {{ t("home.content") }}
- </p>
- <!-- <p class="my-10">
- 以佈局具國際視野之工藝學習共享平台為目標,藉由「工藝學校」的主體概念,推動臺灣工藝學習平台,以共享、友善、全人、全民的終身工藝手作平台進行人才、課程、知識、教材之工藝資源嫁接媒合與內容設計,以在地、就近、線上、線下等多元方式提供不同型態之學習體驗內容及選擇。
- </p>
- <p>
- With the goal of laying out a craft learning and sharing platform with
- an international perspective, through the main concept of "craft
- school", we promote the global learning platform of International Craft
- Learning Platform co-ops, and use a lifelong craft platform run on the
- values of sharing, friendliness, and holisticness to design and
- integrate craft resources such as talents, courses, knowledge and
- teaching materials, and provide different types of learning experiences
- in local ways, both online and offline.
- </p> -->
- </section>
- <v-carousel
- cycle
- height="auto"
- hide-delimiters
- hide-delimiter-background
- show-arrows="hover"
- >
- <v-carousel-item>
- <div class="d-flex h-100 align-center">
- <img
- src="@/assets/img/home/carousel-01.jpg"
- alt="臺灣工藝學習平台"
- class="w-100"
- />
- </div>
- </v-carousel-item>
- </v-carousel>
- <div class="news-content">
- <div class="d-flex tab-btn mb-16">
- <v-btn
- variant="text"
- @click="selectTag('news')"
- :class="{ active: assignTag === 'news' }"
- >
- {{ t("news") }}
- </v-btn>
- <v-btn
- variant="text"
- @click="selectTag('exhibit')"
- :class="{ active: assignTag === 'exhibit' }"
- >
- {{ t("exhibitions") }}
- </v-btn>
- </div>
- <div class="d-flex justify-end mb-5 mb-sm-0">
- <router-link to="/news">{{ t("more_news") }} >></router-link>
- </div>
- <ul v-if="assignTag === 'news'">
- <li v-for="(item, index) in news.list" :key="index" class="mb-16 list">
- <HomeList :data="item" />
- <!-- <section class="d-flex">
- <p class="category mb-5">
- <span></span>
- {{ item.category }}
- </p>
- <p class="ms-5">
- {{ moment(`${item.create_time}`).format("YYYY-MM-DD") }}
- </p>
- </section>
- <v-card
- variant="outlined"
- class="d-flex flex-md-row flex-column align-center pa-5"
- >
- <v-row class="align-center">
- <v-col cols="12">
- <router-link :to="`/news/${item.news_id}`" class="cover-img">
- <section class="d-flex flex-column pa-3">
- <h3>{{ item.title }}</h3>
- <p v-html="item.content"></p>
- </section>
- </router-link>
- </v-col>
- </v-row>
- </v-card> -->
- </li>
- </ul>
- <ul v-else>
- <li
- v-for="(item, index) in exhibit.list"
- :key="index"
- class="mb-16 list"
- >
- <HomeList :data="item" />
- </li>
- </ul>
- </div>
- <h2 class="my-10 title">{{ t("home.title_2") }}</h2>
- <v-row>
- <v-col cols="6" md="4">
- <router-link to="/college-group/future" class="img-info">
- <img
- src="@/assets/img/home/首頁元素-12.webp"
- alt="臺灣工藝學習平台"
- />
- <section>
- <p>{{ t("college_group_1") }}</p>
- </section>
- </router-link>
- </v-col>
- <v-col cols="6" md="4">
- <router-link to="/college-group/craft" class="img-info">
- <img
- src="@/assets/img/home/首頁元素-11.webp"
- alt="臺灣工藝學習平台"
- />
- <section>
- <p>{{ t("college_group_2") }}</p>
- </section>
- </router-link>
- </v-col>
- <v-col cols="6" md="4">
- <router-link to="/college-group/cross" class="img-info">
- <img
- src="@/assets/img/home/首頁元素-06.webp"
- alt="臺灣工藝學習平台"
- />
- <section>
- <p>{{ t("college_group_3") }}</p>
- </section>
- </router-link>
- </v-col>
- <v-col cols="6" md="4">
- <router-link to="/college-group/online" class="img-info">
- <img
- src="@/assets/img/home/首頁元素-09.webp"
- alt="臺灣工藝學習平台"
- />
- <section>
- <p>{{ t("college_group_4") }}</p>
- </section>
- </router-link>
- </v-col>
- <v-col cols="6" md="4">
- <router-link to="/college-group/craft-for-all" class="img-info">
- <img
- src="@/assets/img/home/臺灣綠工藝希望工程.png"
- alt="臺灣工藝學習平台"
- />
- <section>
- <p>{{ t("college_group_5") }}</p>
- </section>
- </router-link>
- </v-col>
- <v-col cols="6" md="4">
- <router-link to="/college-group/life" class="img-info">
- <img
- src="@/assets/img/home/首頁元素-07.webp"
- alt="臺灣工藝學習平台"
- />
- <section>
- <p>{{ t("college_group_6") }}</p>
- </section>
- </router-link>
- </v-col>
- </v-row>
- <div class="map-block">
- <h3 class="mb-10 title">{{ t("home.title_3") }}</h3>
- <v-row class="justify-center align-center mb-3">
- <v-col cols="6" sm="3" md="2">
- <v-select
- v-model="selectedCounty"
- :label="t('cities')"
- :items="counties.list"
- density="compact"
- variant="outlined"
- hide-details
- clearable
- ></v-select>
- </v-col>
- <v-col cols="6" sm="3" md="2">
- <v-select
- v-model="selectedDistrict"
- :label="t('districts')"
- :items="district.list"
- density="compact"
- variant="outlined"
- hide-details
- clearable
- ></v-select>
- </v-col>
- <v-col cols="8" sm="4" md="5" lg="3">
- <v-text-field
- v-model="schoolKeyword"
- variant="outlined"
- density="compact"
- :placeholder="t('location_keywords')"
- hide-details
- ></v-text-field>
- </v-col>
- <v-col cols="4" sm="2" lg="2">
- <v-btn
- @click="searchSchool()"
- variant="flat"
- append-icon="mdi-magnify"
- color="purple"
- >
- {{ t("search") }}
- </v-btn>
- </v-col>
- </v-row>
- <div class="v-row">
- <v-col md="8" cols="12">
- <div class="map">
- <Map @locationId="getClassList" />
- </div>
- </v-col>
- <v-col md="4" cols="12" :class="{ 'd-none': store.isMobile }">
- <p v-if="!classes.data.length" class="text-center text-gray">
- 未找到符合條件的結果
- </p>
- <v-list v-else lines="three" class="list pa-0">
- <v-list-item v-for="item in classes.data" :key="item.id">
- <div class="d-flex align-center">
- <router-link
- :to="`/course-detail/${item.class_name_id}`"
- class="link"
- >
- <v-img
- :lazy-src="store.getImageSrc(item)"
- cover
- :src="store.getImageSrc(item)"
- alt="臺灣工藝學習平台"
- >
- <template v-slot:placeholder>
- <div
- class="d-flex align-center justify-center fill-height"
- >
- <v-progress-circular
- color="grey-lighten-4"
- indeterminate
- ></v-progress-circular>
- </div>
- </template>
- </v-img>
- </router-link>
- <section>
- <h2>{{ item.name }}</h2>
- <div class="d-flex align-start">
- <v-icon
- color="primary"
- icon="mdi-domain"
- class="me-2"
- ></v-icon>
- <p>
- {{
- item.group_id === 9
- ? item.location_name
- : item.organizer
- }}
- </p>
- </div>
- <div class="d-flex align-start">
- <v-icon
- color="primary"
- icon="mdi-map-marker"
- class="me-2 pt-1"
- ></v-icon>
- <p>{{ item.address }}</p>
- </div>
- </section>
- </div>
- </v-list-item>
- </v-list>
- <v-pagination
- v-if="classes.data.length"
- v-model="pageNum"
- :length="totalPages"
- class="my-4"
- rounded="circle"
- ></v-pagination>
- </v-col>
- </div>
- <!-- 手機版底部視窗 -->
- <div class="bottom-sheet" :class="{ show: isBottomSheetOpen }">
- <div class="content">
- <div @touchstart.prevent="handleTouch" class="btn">
- <span></span>
- </div>
- <div class="list">
- <v-list lines="three" class="list pa-0">
- <v-list-item v-for="item in classes.data" :key="item.id">
- <div class="d-flex align-center">
- <router-link
- :to="`/course-detail/${item.class_name_id}`"
- class="link"
- >
- <v-img
- :lazy-src="
- item.is_inner === 0
- ? item.cover_img
- : item.special_class_list_name === 'one_day_class'
- ? store.getImageUrl('default.webp')
- : `${store.imgUrl}/${item.cover_img}`
- "
- cover
- :src="
- item.is_inner === 0
- ? item.cover_img
- : item.special_class_list_name === 'one_day_class'
- ? store.getImageUrl('default.webp')
- : `${store.imgUrl}/${item.cover_img}`
- "
- alt="臺灣工藝學習平台"
- >
- <template v-slot:placeholder>
- <div
- class="d-flex align-center justify-center fill-height"
- >
- <v-progress-circular
- color="grey-lighten-4"
- indeterminate
- ></v-progress-circular>
- </div>
- </template>
- </v-img>
- </router-link>
- <section>
- <h2>{{ item.name }}</h2>
- <div class="d-flex align-start">
- <v-icon
- color="primary"
- icon="mdi-domain"
- class="me-2"
- ></v-icon>
- <p>{{ item.organizer }}</p>
- </div>
- <div class="d-flex align-start">
- <v-icon
- color="primary"
- icon="mdi-map-marker"
- class="me-2 pt-1"
- ></v-icon>
- <p>{{ item.location_name }}</p>
- </div>
- </section>
- </div>
- </v-list-item>
- </v-list>
- <v-pagination
- v-model="pageNum"
- :length="totalPages"
- class="my-4"
- rounded="circle"
- ></v-pagination>
- </div>
- </div>
- </div>
- <!-- <div class="map">
- <Map @locationId="getClassList" />
- </div> -->
- </div>
- <h2 class="mb-10 title">{{ t("home.title_4") }}</h2>
- <v-row class="recommend-block">
- <v-col
- cols="12"
- sm="6"
- lg="4"
- v-for="(item, index) in recommend.list"
- :key="index"
- class="pa-5"
- >
- <CourseCard :data="item" />
- </v-col>
- <v-col cols="12">
- <router-link to="/course-list" class="course-link">
- <img
- src="@/assets/img/course/探索課程素材-15.png"
- alt="臺灣工藝學習平台"
- />
- <p>{{ t("see_more") }}</p>
- </router-link>
- </v-col>
- </v-row>
- </v-container>
- <!-- <v-container fluid class="pa-0 pt-sm-16 tutorial-block">
- <h2 class="mb-10 title">{{ t("tutorial.title") }}</h2>
- <CoursesTutorial />
- </v-container> -->
- <v-container class="px-md-0 my-16">
- <h2 class="mb-10 title">{{ t("home.title_6") }}</h2>
- <v-expansion-panels v-model="panel" multiple>
- <v-expansion-panel elevation="0">
- <v-expansion-panel-title>{{
- t("home.faq.q_1")
- }}</v-expansion-panel-title>
- <v-expansion-panel-text>
- <ul>
- <li>
- <h4><span></span> {{ t("home.faq.a_1_1") }}</h4>
- <p>
- {{ t("home.faq.a_1_2") }}
- </p>
- </li>
- <li>
- <h4><span></span> {{ t("home.faq.a_2_1") }}</h4>
- <p>
- {{ t("home.faq.a_2_2") }}
- </p>
- </li>
- <li>
- <h4><span></span> {{ t("home.faq.a_3_1") }}</h4>
- <p>
- {{ t("home.faq.a_3_2") }}
- </p>
- </li>
- <li>
- <h4><span></span> {{ t("home.faq.a_4_1") }}</h4>
- <p>
- {{ t("home.faq.a_4_2") }}
- </p>
- </li>
- </ul>
- </v-expansion-panel-text>
- </v-expansion-panel>
- <v-expansion-panel elevation="0">
- <v-expansion-panel-title>
- {{ t("terms.terms_of_service") }}</v-expansion-panel-title
- >
- <v-expansion-panel-text>
- <TermsList />
- </v-expansion-panel-text>
- </v-expansion-panel>
- <v-expansion-panel elevation="0">
- <v-expansion-panel-title>{{
- t("home.faq.q_2")
- }}</v-expansion-panel-title>
- <v-expansion-panel-text>
- <p v-html="$t('home.faq.a_2')"></p>
- </v-expansion-panel-text>
- </v-expansion-panel>
- <v-expansion-panel elevation="0">
- <v-expansion-panel-title>{{
- t("home.faq.q_3")
- }}</v-expansion-panel-title>
- <v-expansion-panel-text>
- {{ t("home.faq.a_3") }}
- </v-expansion-panel-text>
- </v-expansion-panel>
- <v-expansion-panel elevation="0">
- <v-expansion-panel-title>{{
- t("home.faq.q_4")
- }}</v-expansion-panel-title>
- <v-expansion-panel-text>
- {{ t("home.faq.a_4") }}
- </v-expansion-panel-text>
- </v-expansion-panel>
- <v-expansion-panel elevation="0">
- <v-expansion-panel-title>{{
- t("home.faq.q_5")
- }}</v-expansion-panel-title>
- <v-expansion-panel-text>
- {{ t("home.faq.a_5") }}
- </v-expansion-panel-text>
- </v-expansion-panel>
- </v-expansion-panels>
- <h2 class="mb-10 mt-16 title">{{ t("crafts.title") }}</h2>
- <v-row class="px-5 px-sm-10 mt-16 mb-10 tag-btn">
- <v-col
- v-for="(item, index) in tagList"
- :key="index"
- :cols="index + 1 === tagList.length ? '12' : '6'"
- md=""
- >
- <a :href="item.url" target="_blank" class="py-3 py-lg-6 item">
- <!-- 網址 -->
- {{ t(`${item.title}`) }}
- </a>
- </v-col>
- </v-row>
- <CraftsArticle />
- <router-link to="/crafts" class="crafts-link">
- <img
- src="@/assets/img/course/探索課程素材-15.png"
- alt="臺灣工藝學習平台"
- />
- <p>{{ t("crafts.see_more") }}</p>
- </router-link>
- <div class="mt-16">
- <img
- class="d-none d-md-block"
- src="@/assets/img/course/banner.webp"
- alt="臺灣工藝學習平台"
- />
- <img
- class="d-block d-md-none"
- src="@/assets/img/course/banner-mb.webp"
- alt="臺灣工藝學習平台"
- />
- </div>
- </v-container>
- </template>
- <style lang="scss" scoped>
- .banner {
- display: flex;
- align-items: center;
- justify-content: center;
- position: relative;
- opacity: 1;
- transition: all 0.3s;
- .cover {
- width: 100vw;
- height: 100vh;
- object-fit: cover;
- }
- .logo {
- max-width: 600px;
- position: absolute;
- z-index: 10;
- }
- &.close {
- opacity: 0;
- position: absolute;
- }
- }
- .intro {
- margin: 120px 0 6.25em;
- p {
- line-height: 32px;
- }
- }
- .title {
- font-size: 1.625em;
- font-weight: 400;
- letter-spacing: 0.125em;
- text-align: center;
- }
- .navbar {
- margin-top: 40px;
- margin-bottom: 0;
- position: sticky;
- top: 0;
- z-index: 2000;
- background: #fff;
- &::before {
- top: unset;
- left: unset;
- width: auto;
- height: 100%;
- }
- }
- .img-info {
- display: block;
- position: relative;
- section {
- width: 100%;
- height: 100%;
- position: absolute;
- top: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- background: rgba(108, 149, 163, 0.5);
- // background: rgba(167, 193, 204, 0.7);
- cursor: pointer;
- opacity: 1;
- transition: all 0.5s;
- &:hover {
- // opacity: 1;
- p {
- font-size: 1.4em;
- }
- }
- p {
- color: #fff;
- font-size: 1.25em;
- letter-spacing: 0.0625em;
- transition: all 0.3s;
- }
- }
- }
- .news-content {
- margin: 6.25em auto;
- }
- .map-block {
- margin: 6.25em auto;
- .map {
- height: 100%;
- min-height: 100vh;
- }
- .list {
- .link {
- width: 40%;
- margin-right: 1.25em;
- border-radius: 0.3125em;
- overflow: hidden;
- @media (max-width: 960px) {
- width: auto;
- }
- .v-img {
- width: 200px;
- height: 9.375em;
- margin-right: 1.25em;
- border-radius: 0.3125em;
- box-shadow: 0.125em 0.125em 4px #aaaaaa;
- transition: all 0.3s;
- object-fit: cover;
- @media (max-width: 960px) {
- width: 250px;
- height: 170px;
- margin-right: 0;
- }
- @media (max-width: 575px) {
- width: 9.375em;
- height: 70px;
- }
- &:hover {
- transform: scale(1.1);
- }
- }
- }
- section {
- width: 60%;
- h2 {
- margin-bottom: 0.625em;
- font-size: 1em;
- font-weight: 500;
- }
- p {
- font-size: 0.875em;
- font-weight: 400;
- }
- h2,
- p {
- line-height: 1.625em;
- letter-spacing: 0.0625em;
- // 超過兩行則省略
- overflow: hidden;
- text-overflow: ellipsis;
- display: -webkit-box;
- -webkit-line-clamp: 2;
- -webkit-box-orient: vertical;
- line-break: after-white-space;
- }
- }
- .v-list-item {
- height: 215px;
- padding: 1.25em 0;
- border-bottom: 0.0625em solid #cccccc;
- @media (max-width: 575px) {
- height: auto;
- }
- &:last-child {
- border-bottom: none;
- }
- .v-list-item__content {
- overflow: initial !important;
- }
- }
- }
- }
- .course-link {
- margin-top: 0.9375em;
- color: #000;
- background-color: var(--sub-color);
- }
- .crafts-link {
- margin: 6.25em 0;
- color: #fff;
- background-color: var(--purple);
- img {
- filter: invert(88%) sepia(100%) saturate(0%) hue-rotate(151deg)
- brightness(103%) contrast(103%);
- }
- }
- .crafts-link,
- .course-link {
- padding: 0.9375em;
- display: flex;
- align-items: center;
- justify-content: center;
- border-radius: 0.625em;
- box-shadow: 0.125em 0.125em 0.625em #aaaaaa;
- &:hover {
- img {
- transform: rotateZ(10deg);
- }
- }
- img {
- max-width: 85px;
- padding-right: 1.25em;
- transition: all 0.3s;
- }
- p {
- font-size: 1.25em;
- letter-spacing: 0.125em;
- }
- }
- .tutorial-block {
- max-width: 100% !important;
- }
- .loading-item {
- position: sticky;
- top: 0;
- left: 0;
- right: 0;
- height: 100vh;
- z-index: 3000;
- display: flex;
- align-items: center;
- justify-content: center;
- background: #fff;
- }
- /* 底部彈出視窗的樣式 */
- .bottom-sheet {
- display: none;
- // display: flex;
- justify-content: center;
- align-items: center;
- position: fixed;
- bottom: 2.1875em;
- left: 0;
- width: 100%;
- height: 300px; /* 設置底部彈出視窗的高度 */
- z-index: 1000;
- background-color: #fff;
- box-shadow: 0 -4px 8px rgba(0, 0, 0, 0.1);
- transition: transform 0.3s ease-in-out;
- transform: translateY(100%); /* 預設隱藏底部視窗 */
- &.show {
- bottom: 0;
- transform: translateY(0);
- }
- .content {
- height: 100%;
- display: flex;
- position: relative;
- flex-direction: column;
- align-items: center;
- text-align: center;
- .btn {
- width: 100%;
- padding: 1.25em;
- display: flex;
- justify-content: center;
- span {
- display: block;
- height: 0.3125em;
- width: 3.75em;
- position: absolute;
- top: 0.9375em;
- z-index: 1000;
- background: #bbbbbb;
- border-radius: 1.25em;
- }
- }
- .v-pagination {
- width: 200px;
- }
- .list {
- margin: 0 0.625em 1.25em;
- overflow-y: auto;
- section {
- text-align: start;
- }
- }
- }
- }
- .close-btn {
- position: absolute;
- right: 15px;
- top: 5px;
- .v-icon {
- color: #fff;
- font-size: 40px;
- text-shadow: 1px 1px 3px #333;
- }
- &.close {
- display: none;
- }
- }
- // Vuetify Expansion 樣式
- .v-expansion-panel {
- margin-bottom: 1.875em;
- line-height: 1.875em;
- border-radius: 0.625em !important;
- li:first-child {
- h4 {
- margin-top: 0;
- }
- }
- h4 {
- display: flex;
- align-items: center;
- margin-top: 1.25em;
- font-size: 1.125em;
- font-weight: 500;
- span {
- display: block;
- width: 8px;
- height: 8px;
- margin-top: 0.3125em;
- margin-right: 0.625em;
- border-radius: 0.625em;
- background-color: var(--blue);
- }
- }
- }
- .v-expansion-panel-title {
- padding: 1.25em 1.875em;
- font-size: 1em;
- line-height: 1.625em;
- letter-spacing: 0.0625em;
- border: 0.0625em solid var(--blue);
- }
- .v-expansion-panel-text {
- padding-top: 8px;
- }
- .v-expansion-panel-title__overlay {
- opacity: 0 !important;
- }
- .v-expansion-panels:not(.v-expansion-panels--variant-accordion)
- > :first-child:not(:last-child):not(.v-expansion-panel--active):not(
- .v-expansion-panel--before-active
- ),
- .v-expansion-panels:not(.v-expansion-panels--variant-accordion)
- > :last-child:not(:first-child):not(.v-expansion-panel--active):not(
- .v-expansion-panel--after-active
- ),
- .v-expansion-panels:not(.v-expansion-panels--variant-accordion)
- > :not(:first-child):not(:last-child):not(.v-expansion-panel--active):not(
- .v-expansion-panel--after-active
- ),
- .v-expansion-panels:not(.v-expansion-panels--variant-accordion)
- > :not(:first-child):not(:last-child):not(.v-expansion-panel--active):not(
- .v-expansion-panel--before-active
- ),
- .v-expansion-panel--active > .v-expansion-panel-title {
- border-top-left-radius: 0.625em !important;
- border-top-right-radius: 0.625em !important;
- border-bottom-left-radius: 0.625em !important;
- border-bottom-right-radius: 0.625em !important;
- }
- .v-expansion-panel:not(:first-child)::after {
- border-top-style: none;
- }
- .v-expansion-panel-title--active:hover > .v-expansion-panel-title__overlay,
- .v-expansion-panel-title[aria-haspopup="menu"][aria-expanded="true"]:hover
- > .v-expansion-panel-title__overlay {
- opacity: 0;
- }
- </style>
|