Achievement.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. <script setup>
  2. import { ref, reactive, onMounted, watch } from "vue";
  3. import { useMainStore } from "@/stores/store";
  4. import { useI18n } from "vue-i18n";
  5. import axios from "axios";
  6. import moment from "moment";
  7. import Navbar from "@/components/Navbar.vue";
  8. import CourseCard from "@/components/CourseCard.vue";
  9. import ArticleCard from "@/components/ArticleCard.vue";
  10. const { t } = useI18n();
  11. const store = useMainStore();
  12. // // 所有文章
  13. // let articles = reactive({
  14. // list: [],
  15. // });
  16. // (async () => {
  17. // try {
  18. // const response = await axios.get(
  19. // `${store.apiUrl}/api/get_article?group_id=3`
  20. // );
  21. // console.log("response", response);
  22. // articles.list = response.data.articles;
  23. // } catch (error) {
  24. // console.error(error);
  25. // }
  26. // })();
  27. const breadcrumbs = reactive([
  28. {
  29. title: "home.title",
  30. disabled: false,
  31. href: "/",
  32. },
  33. {
  34. title: "navbar.craft_groups",
  35. disabled: true,
  36. },
  37. {
  38. title: "成果展現",
  39. disabled: true,
  40. },
  41. ]);
  42. /* 希望工程 Start */
  43. onMounted(() => {
  44. store.getFavoriteClass();
  45. });
  46. const faqList = [
  47. {
  48. q: "問:社區關懷據點(或其他弱勢族群)想導入工藝手作陪伴,應如何做?",
  49. a: "答:原有執行之其他課程,經評估可部分以工藝手作取代,確認日期及時段,可洽 049-2334141 分機 237 楊小姐,媒合就地或鄰近工藝師前往教學。",
  50. },
  51. {
  52. q: "問:職能治療師若想加入「臺灣綠工藝希望工程」工藝手作陪伴,應如何參與?",
  53. a: "答:請與 049-2334141 分機 237 楊小姐聯繫,將會媒合就地或鄰近有教學需求之單位或團體。",
  54. },
  55. {
  56. q: "問:工藝手作陪伴有什麼好處?",
  57. a: "答:工藝手作活動可以達到認知上的訓練,最主要是因為工藝可提供豐富的感官刺激,透過創作的想像力、創意,以及作品自我表達能力的滿足感,在認知上的訓練就非常有效果。在運用手部動作過程中,可刺激活化腦部功能,延緩失智失能。在社交人際互動過程中,在製作工藝品中,成員間互相協助幫忙,形成良好互動,甚至是在完成作品與其他的好朋友互相分享。",
  58. },
  59. {
  60. q: "問:想要投入弱勢族群教學的工藝師,有限定其工藝種類嗎?",
  61. a: "答:無限制工藝種類,但工藝師規劃手作時以安全性高、操作不複雜為考量。",
  62. },
  63. {
  64. q: "問:工藝師應規劃幾堂的課程較為適合?",
  65. a: "答:以每週執行一次,每次 2 小時,持續 6 至 8 週為宜,若對於未曾執行過工藝手作之族群,可先安排體驗式課程,再漸進式導入,惟仍依各單位需求彈性調整。",
  66. },
  67. {
  68. q: "問:工藝師若想加入「臺灣綠工藝希望工程」工藝手作陪伴,應如何參與?",
  69. a: "答:請與 049-2334141 分機 237 楊小姐聯繫,請規劃並提供適合的課程,將會媒合就地或鄰近有教學需求之單位或團體。",
  70. },
  71. ];
  72. // 活動現場
  73. let activityPageNum = ref(1); // 頁數(預設第一頁)
  74. let activityPageAmount = ref(12); // 每頁顯示筆數
  75. let activityTotalPages = ref(1); // 總頁數
  76. // 媒體報導
  77. let mediaPageNum = ref(1); // 頁數(預設第一頁)
  78. let mediaPageAmount = ref(12); // 每頁顯示筆數
  79. let mediaTotalPages = ref(1); // 總頁數
  80. let loading = ref(false);
  81. const activityList = ref(null);
  82. const mediaList = ref(null);
  83. watch(activityPageNum, () => {
  84. getClasses();
  85. activityList.value.scrollIntoView({ behavior: "smooth", block: "start" });
  86. });
  87. watch(mediaPageNum, () => {
  88. getTgcReport();
  89. mediaList.value.scrollIntoView({ behavior: "smooth", block: "start" });
  90. });
  91. const tgcImg = reactive({
  92. classes: [],
  93. });
  94. // 獲取活動現場資料
  95. async function getClasses() {
  96. loading.value = true;
  97. let url = `${store.apiUrl}/api/get_tgc_img?page_num=${activityPageNum.value}&page_amount=${activityPageAmount.value}`;
  98. try {
  99. const response = await axios.get(url);
  100. tgcImg.classes = response.data.tgc_pic;
  101. activityTotalPages.value = store.getTotalPages(response.data.total_num, 12);
  102. console.log(response);
  103. } catch (error) {
  104. loading.value = false;
  105. console.error(error);
  106. }
  107. }
  108. getClasses();
  109. const tgcReport = reactive({
  110. classes: [],
  111. });
  112. // 獲取媒體報導資料
  113. async function getTgcReport() {
  114. loading.value = true;
  115. let url = `${store.apiUrl}/api/get_tgc_report?page_num=${mediaPageNum.value}&page_amount=${mediaPageAmount.value}`;
  116. try {
  117. const response = await axios.get(url);
  118. tgcReport.classes = response.data.tgc_report;
  119. mediaTotalPages.value = store.getTotalPages(response.data.total_num, 12);
  120. console.log("report", response);
  121. } catch (error) {
  122. loading.value = false;
  123. console.error(error);
  124. }
  125. }
  126. getTgcReport();
  127. // 媒體報導
  128. let coursePageNum = ref(1); // 頁數(預設第一頁)
  129. let coursePageAmount = ref(6); // 每頁顯示筆數
  130. let courseTotalPages = ref(1); // 總頁數
  131. let courseLoading = ref(false);
  132. let courseList = ref(null);
  133. const courseData = reactive({
  134. classes: [],
  135. });
  136. // 切換分頁時回到列表上方
  137. watch(coursePageNum, () => {
  138. getClass();
  139. courseList.value.scrollIntoView({ behavior: "smooth", block: "start" });
  140. });
  141. // group_sort 希望工程
  142. async function getClass() {
  143. courseLoading.value = true;
  144. try {
  145. const response = await axios.get(
  146. `${store.apiUrl}/api/get_class_name?group_id=9&is_check=1&page_num=${coursePageNum.value}&page_amount=${coursePageAmount.value}`
  147. );
  148. courseTotalPages.value = store.getTotalPages(response.data.total_num, 6);
  149. courseData.classes = response.data.classes;
  150. courseLoading.value = false;
  151. console.log("getClass 希望工程", courseData.classes);
  152. } catch (error) {
  153. courseLoading.value = false;
  154. console.error(error);
  155. }
  156. }
  157. getClass();
  158. /* 希望工程 End */
  159. </script>
  160. <template>
  161. <div class="college-bg-img">
  162. <Navbar />
  163. <v-container fluid class="college-content pb-16 px-lg-0">
  164. <div class="college-banner">
  165. <img
  166. class="d-none d-md-block"
  167. src="@/assets/img/college-group/banner.png"
  168. alt="臺灣工藝學習平台"
  169. />
  170. <img
  171. class="d-block d-md-none"
  172. src="@/assets/img/college-group/banner-mb.webp"
  173. alt="臺灣工藝學習平台"
  174. />
  175. <div class="description-item">
  176. <h2>成果展現</h2>
  177. <!-- <p>
  178. {{ groupDescribe }}
  179. </p> -->
  180. </div>
  181. </div>
  182. <div class="main-block">
  183. <v-breadcrumbs :items="breadcrumbs" divider="/" class="mt-10 pa-0">
  184. <template v-slot:title="{ item }">
  185. {{ t(item.title) }}
  186. </template>
  187. </v-breadcrumbs>
  188. <!-- 生活工藝 -->
  189. <v-container class="pa-0 life-list">
  190. <router-link to="/college-group/life/shop">
  191. <v-row>
  192. <v-col cols="12" md="4" lg="5" class="pa-0 overflow-hidden">
  193. <img
  194. src="@/assets/img/college-group/life/cover-01.png"
  195. alt="臺灣工藝學習平台"
  196. />
  197. </v-col>
  198. <v-col cols="12" md="8" lg="7" class="content">
  199. <h3 class="mb-5">旅物 SHOP</h3>
  200. <p>
  201. 《旅物 •
  202. SHOP》位於自然生態豐富的臺灣工藝文化園區,明亮穿透的空間設計,連結窗外工藝植物園,到室內的生活工藝選物,這是一間由土地孕育而生的工藝選品店,從採擷、手作,到用物於生活,是材料與手、物與物、人與物、人與人彼此流動交會,共度美好日常的店頭。包含崇尚自然循環,創造生活風格的臺灣在地「臺灣綠工藝」品牌、扶植青年創業的「青年孵化器」、工藝中心開發的周邊商品「品工藝」以及在地咖啡品牌「一日咖啡」等四個子品牌,推廣「自然、循環、平衡、寬容、生命力」的綠工藝精神,更是鼓勵青年實驗開店、青年工藝教育者的孵化平臺。
  203. </p>
  204. </v-col>
  205. </v-row>
  206. </router-link>
  207. <router-link to="/college-group/life/craft-journey">
  208. <v-row>
  209. <v-col cols="12" md="8" lg="7" class="content">
  210. <h3 class="mb-10">工藝行旅</h3>
  211. <p>
  212. 工藝文化深度旅遊,品味在地、標記生活 <br />
  213. 打造以工藝為核心的文化深度旅遊路徑,結合工藝體驗、自然風土、地方美食、在地物產、
  214. 建築等觀光資源,旅人緩步慢行,暫離喧囂、以手作沉澱自我,發現生命中的寧靜與感動。
  215. 現在一起出發,感受工藝行旅的魅力和樂趣!
  216. </p>
  217. </v-col>
  218. <v-col cols="12" md="4" lg="5" class="pa-0 overflow-hidden">
  219. <img
  220. src="@/assets/img/college-group/life/cover-02.png"
  221. alt="臺灣工藝學習平台"
  222. />
  223. </v-col>
  224. </v-row>
  225. </router-link>
  226. <router-link to="/college-group/life/apprentice/about">
  227. <v-row>
  228. <v-col cols="12" md="8" lg="7" class="content">
  229. <h3 class="mb-10">一日學徒</h3>
  230. <p>
  231. 全民工藝教育倡議平台|生活 x 手作 x 體驗 <br />
  232. 以「手做」,經歷生活中的一切美好! <br />
  233. 用「一日」,體會過去師徒制三年四個月的工藝學習精神與態度!
  234. <br />
  235. 由工藝教育者親自規畫各類手作工藝課程,隨時提供最新課程資訊,民眾依據喜好選擇課程,
  236. 體驗半天或一天的手作工藝學習,尋找就近的工藝教育者學習各種小物知識經驗與技藝。
  237. </p>
  238. </v-col>
  239. <v-col cols="12" md="4" lg="5" class="pa-0 overflow-hidden">
  240. <img
  241. src="@/assets/img/college-group/life/cover-03.png"
  242. alt="臺灣工藝學習平台"
  243. />
  244. </v-col>
  245. </v-row>
  246. </router-link>
  247. <router-link to="/college-group/life/campus">
  248. <v-row>
  249. <v-col cols="12" md="4" lg="5" class="pa-0 overflow-hidden">
  250. <img
  251. src="@/assets/img/college-group/life/cover-04.png"
  252. alt="臺灣工藝學習平台"
  253. />
  254. </v-col>
  255. <v-col cols="12" md="8" lg="7" class="content">
  256. <h3 class="mb-10">校園扎根</h3>
  257. <p>
  258. 工藝校園扎根計畫以工藝融入學校教育,媒合教師與工藝教育者,跨域合作開發具創造力、觀察力、美學素養、批判思考以及手作體驗的工藝教材教案,實踐工藝之於學習、生活的價值。符合教育部
  259. 12 年國教課綱的「核心素養」,以及 STEAM
  260. 教育的五大精神「跨領域、動手做、生活應用、解決問題及五感學習」,以「做中學,學中做」培育新世代的工藝人才。
  261. </p>
  262. </v-col>
  263. </v-row>
  264. </router-link>
  265. </v-container>
  266. <!-- 希望工程 -->
  267. <div class="cfa-content">
  268. <div class="title">
  269. <h2>{{ t("about_craft_for_all") }}</h2>
  270. </div>
  271. <v-row>
  272. <v-col cols="12" md="6">
  273. <p class="mb-5">
  274. 以工藝為媒介,實踐社會價值功能。臺灣工藝學習平台啟動「臺灣綠工藝希望工程」,本於自然、循環、平衡、寬容、生命力等綠工藝精神,融合人文關懷,深化工藝與社會的互動連結,為所有人帶來「希望‧療癒‧陪伴」的力量。
  275. </p>
  276. <p>
  277. 「臺灣綠工藝希望工程」是公民互助精神的體現,以「One Community,
  278. One
  279. Craft(OCOC)」一社群一工藝理念,凝聚社會力量,以工藝師、職能治療師提供核心支持服務,以社區、NGO團體、相關民間組織及政府單位為平台,在社福體系中的醫療機構、長照機構與社區照顧關懷據點等,向社會上包含樂齡長者、兒童、婦女、身心障礙者等所有人,傳達工藝手作的溫暖。以工藝投入社會服務,引領身心靈向上提升,也形成一股陪伴的安定力量,促進社會關係的融合與共好。
  280. </p>
  281. </v-col>
  282. <v-col cols="12" md="6">
  283. <div class="about-img">
  284. <img
  285. class="img-fluid"
  286. src="@/assets/img/college-group/life/生活工藝素材-24.png"
  287. alt="臺灣工藝學習平台"
  288. />
  289. </div>
  290. </v-col>
  291. </v-row>
  292. <div class="title" ref="activityList">
  293. <h2>{{ t("event") }}</h2>
  294. </div>
  295. <v-row>
  296. <v-col
  297. sm="6"
  298. md="4"
  299. cols="12"
  300. class="pa-5"
  301. v-for="(item, index) in tgcImg.classes"
  302. :key="index"
  303. >
  304. <div class="main-card">
  305. <div class="card-info">
  306. <div class="overflow-hidden">
  307. <v-img
  308. class="mx-auto cover-img"
  309. :lazy-src="item.pic_url"
  310. :src="item.pic_url"
  311. height="16.875em"
  312. cover
  313. alt="臺灣工藝學習平台"
  314. >
  315. <template v-slot:placeholder>
  316. <div
  317. class="d-flex align-center justify-center fill-height"
  318. >
  319. <v-progress-circular
  320. color="grey-lighten-4"
  321. indeterminate
  322. ></v-progress-circular>
  323. </div>
  324. </template>
  325. </v-img>
  326. </div>
  327. <div class="card-title">
  328. <h3>{{ item.pic_name }}</h3>
  329. </div>
  330. </div>
  331. </div>
  332. </v-col>
  333. </v-row>
  334. <v-pagination
  335. v-model="activityPageNum"
  336. :length="activityTotalPages"
  337. rounded="circle"
  338. class="mt-16"
  339. ></v-pagination>
  340. <div class="title" ref="mediaList">
  341. <h2>{{ t("media_coverage") }}</h2>
  342. </div>
  343. <ul class="tgc-report">
  344. <li
  345. class="d-flex align-center justify-space-between"
  346. v-for="(item, index) in tgcReport.classes"
  347. :key="index"
  348. >
  349. <div class="info">
  350. <a :href="item.url" target="_blank">
  351. <p class="report-title font-weight-normal">
  352. {{ item.title }}
  353. </p>
  354. </a>
  355. </div>
  356. <div class="date time-block">
  357. <span>
  358. {{ moment(`${item.create_time}`).format("YYYY-MM-DD") }}</span
  359. >
  360. </div>
  361. </li>
  362. </ul>
  363. <v-pagination
  364. v-model="mediaPageNum"
  365. :length="mediaTotalPages"
  366. rounded="circle"
  367. class="mt-16"
  368. ></v-pagination>
  369. <div>
  370. <h2 class="title">{{ t("faq") }}</h2>
  371. </div>
  372. <v-expansion-panels>
  373. <v-expansion-panel v-for="item in faqList" :key="item">
  374. <v-expansion-panel-title>{{ item.q }}</v-expansion-panel-title>
  375. <v-expansion-panel-text v-html="item.a"> </v-expansion-panel-text>
  376. </v-expansion-panel>
  377. </v-expansion-panels>
  378. <div ref="courseList">
  379. <h2 class="title">{{ t("craft_for_all") }}</h2>
  380. </div>
  381. <div class="d-flex justify-center mb-10" v-if="courseLoading">
  382. <v-progress-circular
  383. color="grey-lighten-4"
  384. indeterminate
  385. ></v-progress-circular>
  386. </div>
  387. <v-row v-else>
  388. <v-col
  389. sm="6"
  390. lg="4"
  391. cols="12"
  392. v-for="(item, index) in courseData.classes"
  393. :key="index"
  394. class="pa-5"
  395. >
  396. <CourseCard :data="item" />
  397. </v-col>
  398. </v-row>
  399. <v-pagination
  400. v-model="coursePageNum"
  401. :length="courseTotalPages"
  402. rounded="circle"
  403. class="mt-16"
  404. ></v-pagination>
  405. </div>
  406. </div>
  407. </v-container>
  408. </div>
  409. </template>
  410. <style lang="scss" scoped>
  411. p {
  412. line-height: 1.75em;
  413. letter-spacing: 0.0625em;
  414. }
  415. .navbar {
  416. margin-top: 0;
  417. }
  418. .description-item {
  419. h2 {
  420. margin-bottom: 1.5em;
  421. }
  422. }
  423. .content {
  424. padding: 0;
  425. width: 90%;
  426. @media (max-width: 600px) {
  427. width: 85%;
  428. }
  429. .main-block {
  430. padding: 6.25em 5em;
  431. margin-top: -30%;
  432. background-color: #fff;
  433. @media (max-width: 960px) {
  434. padding: 6.25em 3.125em;
  435. }
  436. @media (max-width: 600px) {
  437. padding: 6.25em 1.25em;
  438. }
  439. h2 {
  440. font-size: 1.875em;
  441. font-weight: 500;
  442. line-height: 2em;
  443. margin-left: 0.625em;
  444. @media (max-width: 960px) {
  445. font-size: 1.5em;
  446. }
  447. @media (max-width: 600px) {
  448. margin-left: 0;
  449. margin-bottom: 3.125em;
  450. }
  451. }
  452. .title {
  453. margin: 5em 0;
  454. @media (max-width: 600px) {
  455. margin: 3.125em 0;
  456. }
  457. }
  458. .v-breadcrumbs {
  459. position: relative;
  460. z-index: 100;
  461. justify-content: flex-start;
  462. @media (max-width: 600px) {
  463. justify-content: center;
  464. }
  465. }
  466. }
  467. }
  468. /* 生活工藝 */
  469. .life-list {
  470. margin-top: 6.25em;
  471. @media (max-width: 600px) {
  472. margin-top: 0;
  473. }
  474. a {
  475. display: block;
  476. margin: 3.125em 0;
  477. border: 0.125em solid var(--purple);
  478. border-radius: 1.25em;
  479. overflow: hidden;
  480. &:hover {
  481. img {
  482. transform: scale(1.1);
  483. }
  484. }
  485. }
  486. h3 {
  487. font-size: 1.5em;
  488. font-weight: 500;
  489. }
  490. img {
  491. width: 100%;
  492. height: 20.625em;
  493. min-height: 100%;
  494. object-fit: cover;
  495. transition: all 0.5s;
  496. @media (max-width: 1280px) {
  497. height: 23.125em;
  498. }
  499. @media (max-width: 600px) {
  500. height: 12.5em;
  501. }
  502. }
  503. .content {
  504. padding: 2.1875em 3.75em;
  505. display: flex;
  506. flex-direction: column;
  507. justify-content: center;
  508. @media (max-width: 1280px) {
  509. padding: 2.5em;
  510. }
  511. }
  512. }
  513. /* 希望工程 */
  514. .cfa-content {
  515. .about-img {
  516. width: 80%;
  517. height: auto;
  518. margin: auto;
  519. }
  520. .card-info {
  521. height: 100%;
  522. padding-bottom: 0;
  523. .card-title {
  524. margin: auto;
  525. border-bottom: none;
  526. cursor: pointer;
  527. h3 {
  528. font-weight: 500;
  529. }
  530. }
  531. }
  532. p {
  533. font-weight: 400;
  534. letter-spacing: 0.0625em;
  535. line-height: 1.875em;
  536. }
  537. .tgc-report {
  538. li {
  539. padding: 1.875em 0;
  540. border-bottom: 0.0625em solid #c9c9c9;
  541. .info {
  542. a {
  543. transition: all 0.3s;
  544. &:hover {
  545. opacity: 0.7;
  546. }
  547. }
  548. }
  549. }
  550. .report-title {
  551. white-space: nowrap;
  552. overflow: hidden;
  553. text-overflow: ellipsis;
  554. @media (max-width: 960px) {
  555. white-space: normal;
  556. }
  557. }
  558. }
  559. .time-block {
  560. padding: 0 0 0 1.25em;
  561. span {
  562. width: 5.625em;
  563. display: block;
  564. }
  565. }
  566. .v-expansion-panel-title,
  567. .v-expansion-panel-text {
  568. font-size: 1em;
  569. line-height: 1.875em;
  570. letter-spacing: 0.0625em;
  571. }
  572. .v-expansion-panel-text {
  573. padding: 0.9375em 1.25em;
  574. font-size: 1em;
  575. }
  576. }
  577. </style>