From f536b6e2e924d2aed5a30f82995e9d3816add14a Mon Sep 17 00:00:00 2001 From: schooltechx Date: Sun, 9 Apr 2023 14:39:23 +0700 Subject: [PATCH] Connect Real API of qualify exam and cms info --- .github/workflows/release.yaml | 8 +++++--- cms/README.md | 4 ++-- cms/src/lib/components/Footer.svelte | 2 +- cms/src/lib/components/Header.svelte | 3 +-- cms/src/lib/data/CMSDataType.ts | 4 +++- cms/src/routes/+layout.server.ts | 4 ++-- cms/src/routes/+layout.svelte | 1 - cms/src/routes/+page.server.ts | 17 +++++++++-------- cms/src/routes/+page.svelte | 2 +- cms/src/routes/about/+page.server.ts | 4 ++-- cms/src/routes/competitive/+page.server.ts | 4 ++-- .../routes/competitive/[id]/+page.server.ts | 4 ++-- cms/src/routes/qualifying/+page.server.ts | 4 ++-- cms/src/routes/qualifying/[id]/+page.server.ts | 4 ++-- cms/static/images/exam_place_holder.png | Bin 0 -> 9278 bytes 15 files changed, 34 insertions(+), 31 deletions(-) create mode 100644 cms/static/images/exam_place_holder.png diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 966ed4e..3b0ebfb 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -18,8 +18,8 @@ env: DEPLOY_HOST: frappet.com COMPOSE_PATH: /home/frappet/docker/bma-ehr-qualifying-cms jobs: - # act workflow_dispatch -W .github/workflows/release.yaml --input IMAGE_VER=v0.2.4-dev -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd - # act --workflows .github/workflows/release.yaml --job release --input IMAGE_VER=v0.2.4-dev -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd + # act workflow_dispatch --reuse -W .github/workflows/release.yaml --input IMAGE_VER=v0.2.4-dev -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd + # act --reuse --workflows .github/workflows/release.yaml --job release --input IMAGE_VER=v0.2.4-dev -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd release: runs-on: ubuntu-latest @@ -59,7 +59,9 @@ jobs: uses: docker/build-push-action@v3 with: context: cms - # platforms: linux/amd64,linux/arm64 + cache-from: type=gha + cache-to: type=gha,mode=max + platforms: linux/amd64 push: true tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest - name: Remote Deployment diff --git a/cms/README.md b/cms/README.md index 82ac946..14dc2db 100644 --- a/cms/README.md +++ b/cms/README.md @@ -9,7 +9,7 @@ - [GitHub Actions](https://github.com/features/actions) ทำ CI/CD ในระบบทดสอบ - [nektos/act](https://github.com/nektos/act) ใช้ GitHub Actions บนเครื่องของเราเอง - [Argo CD](https://argo-cd.readthedocs.io/en/stable/) deploy ขึ้นระบบ Production (K8s) -- [FullCalendar](https://github.com/schooltechx/youtube/blob/main/svelte/component/FullCalendar.md) รองรับพ.ศ. ใช้แค่ฟีเจอร์[ฟรีก็น่าจะพอ](https://fullcalendar.io/license#:~:text=or%20FullCalendar%20Premium.-,FullCalendar%20Standard,all%20copyright%20headers%20are%20preserved.) +- [FullCalendar](https://github.com/schooltechx/youtube/blob/main/svelte/component/Calendar/FullCalendar.md) รองรับพ.ศ. ใช้แค่ฟีเจอร์[ฟรีก็น่าจะพอ](https://fullcalendar.io/license#:~:text=or%20FullCalendar%20Premium.-,FullCalendar%20Standard,all%20copyright%20headers%20are%20preserved.) - [Day.js](https://day.js.org/) ในฟอร์แม็ตวันในรูปแบบ local ไทยรองรับ พ.ศ. ## วีดีโอแสดงการทำงานทั้งหมด @@ -70,7 +70,7 @@ npx vite preview --port=4000 --host=0.0.0.0 ถ้าไม่ build เอง ตอนนี้มี demo อยู่ที่ [https://bma-qualifying.frappet.synology.me/](https://bma-qualifying.frappet.synology.me/) ให้เปลี่ยน base url ให้เหมาะสม -Data Type ที่ใช้ดูในไฟล์ [CMSDataType.ts](./src/lib/data/CMSDataType.ts) +การกำหนด path ของ API และ Data Type ที่ใช้ดูในไฟล์ [CMSDataType.ts](./src/lib/data/CMSDataType.ts) ## Browser Testing diff --git a/cms/src/lib/components/Footer.svelte b/cms/src/lib/components/Footer.svelte index 1631151..b16be73 100644 --- a/cms/src/lib/components/Footer.svelte +++ b/cms/src/lib/components/Footer.svelte @@ -33,7 +33,7 @@
- logo + logo
{title}
diff --git a/cms/src/lib/components/Header.svelte b/cms/src/lib/components/Header.svelte index fa5d6e2..94d4b30 100644 --- a/cms/src/lib/components/Header.svelte +++ b/cms/src/lib/components/Header.svelte @@ -2,7 +2,6 @@ export let logo_url:string = "/images/logo.png" export let title:string = "ใส่ชื่อองค์กรที่นี้" export let supervised:string = "ใส่สังกัดที่นี้" - diff --git a/cms/src/routes/about/+page.server.ts b/cms/src/routes/about/+page.server.ts index c05c91e..d63be43 100644 --- a/cms/src/routes/about/+page.server.ts +++ b/cms/src/routes/about/+page.server.ts @@ -1,8 +1,8 @@ -import {apibase} from '$lib/data/CMSDataType' +import {cmsBase} from '$lib/data/CMSDataType' import type { PageServerLoad } from './$types'; import { error } from '@sveltejs/kit'; export const load = (async ({fetch}) => { - const res = await fetch(apibase+"/content?page=about") + const res = await fetch(cmsBase+"/content/about") if(!res.ok) throw error(500, 'ไม่สามารถอ่านเนื้อหาหน้าเกี่ยวกับได้'); const {content} = await res.json() diff --git a/cms/src/routes/competitive/+page.server.ts b/cms/src/routes/competitive/+page.server.ts index dd4abbb..bfe3f87 100644 --- a/cms/src/routes/competitive/+page.server.ts +++ b/cms/src/routes/competitive/+page.server.ts @@ -1,11 +1,11 @@ -import {apibase} from '$lib/data/CMSDataType' +import {competitiveBase} from '$lib/data/CMSDataType' import { error } from '@sveltejs/kit'; import type {CalendarEvent,Exam} from '$lib/data/CMSDataType' import dayjs from 'dayjs' import type { PageServerLoad } from './$types' export const load: PageServerLoad = async ({fetch}) => { let exams:Exam[] = [] - const res = await fetch(apibase+"/competitive") + const res = await fetch(competitiveBase+"/competitive") if(!res.ok) throw error(res.status, 'ไม่สามารถอ่านข้อมูลการสอบได้'); exams = await res.json() diff --git a/cms/src/routes/competitive/[id]/+page.server.ts b/cms/src/routes/competitive/[id]/+page.server.ts index 0e6601f..5c1ae47 100644 --- a/cms/src/routes/competitive/[id]/+page.server.ts +++ b/cms/src/routes/competitive/[id]/+page.server.ts @@ -1,10 +1,10 @@ -import {apibase} from '$lib/data/CMSDataType' +import {competitiveBase} from '$lib/data/CMSDataType' import { error } from '@sveltejs/kit' import dayjs from 'dayjs' import type { PageServerLoad } from './$types' export const load: PageServerLoad = async ({params,fetch}) => { const id = params.id+"" - const res = await fetch(apibase+"/competitive/"+id) + const res = await fetch(competitiveBase+"/competitive/"+id) if(res.status==404){ throw error(404,{message:`ค้นหาข้อมูลสอบคัดเลือก ${id}ไม่พบ`}) } diff --git a/cms/src/routes/qualifying/+page.server.ts b/cms/src/routes/qualifying/+page.server.ts index a985fe8..c2b1230 100644 --- a/cms/src/routes/qualifying/+page.server.ts +++ b/cms/src/routes/qualifying/+page.server.ts @@ -1,11 +1,11 @@ -import {apibase} from '$lib/data/CMSDataType' +import {qualifyingBase} from '$lib/data/CMSDataType' import { error } from '@sveltejs/kit'; import type {CalendarEvent,Exam} from '$lib/data/CMSDataType' import dayjs from 'dayjs' import type { PageServerLoad } from './$types' export const load: PageServerLoad = async ({fetch}) => { let exams:Exam[] = [] - const res = await fetch(apibase+"/qualifying") + const res = await fetch(qualifyingBase+"/qualifying") if(!res.ok) throw error(res.status, 'ไม่สามารถอ่านข้อมูลการสอบได้'); exams = await res.json() diff --git a/cms/src/routes/qualifying/[id]/+page.server.ts b/cms/src/routes/qualifying/[id]/+page.server.ts index fbd9445..b5cfaa2 100644 --- a/cms/src/routes/qualifying/[id]/+page.server.ts +++ b/cms/src/routes/qualifying/[id]/+page.server.ts @@ -1,10 +1,10 @@ -import {apibase} from '$lib/data/CMSDataType' +import {qualifyingBase} from '$lib/data/CMSDataType' import { error } from '@sveltejs/kit' import dayjs from 'dayjs' import type { PageServerLoad } from './$types' export const load: PageServerLoad = async ({params,fetch}) => { const id = params.id+"" - const res = await fetch(apibase+"/qualifying/"+id) + const res = await fetch(qualifyingBase+"/qualifying/"+id) if(res.status==404){ throw error(404,{message:`ค้นหาข้อมูลสอบคัดเลือก ${id}ไม่พบ`}) } diff --git a/cms/static/images/exam_place_holder.png b/cms/static/images/exam_place_holder.png new file mode 100644 index 0000000000000000000000000000000000000000..8530ffdddbcb1821fb9fbb1ff43b6b5e7dcdc92c GIT binary patch literal 9278 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