|
@@ -0,0 +1,2198 @@
|
|
|
+<script setup>
|
|
|
+import { ref, reactive, watch, computed, onMounted } from "vue";
|
|
|
+import { useMainStore } from "@/stores/store";
|
|
|
+// import { Loader } from "@googlemaps/js-api-loader";
|
|
|
+// import VueDatePicker from "@vuepic/vue-datepicker";
|
|
|
+import "@vuepic/vue-datepicker/dist/main.css";
|
|
|
+import axios from "axios";
|
|
|
+import moment from "moment";
|
|
|
+import Navbar from "@/components/Navbar.vue";
|
|
|
+// import { LatLngBounds } from "leaflet";
|
|
|
+
|
|
|
+const store = useMainStore();
|
|
|
+const token = store.token;
|
|
|
+console.log("token", token);
|
|
|
+
|
|
|
+let step = ref(1);
|
|
|
+let stepTitle = ref("");
|
|
|
+let stepDescription = ref("");
|
|
|
+let loading = ref(false);
|
|
|
+
|
|
|
+const computedTitle = computed(() => {
|
|
|
+ switch (step.value) {
|
|
|
+ case 1:
|
|
|
+ stepTitle.value = "Step1 填寫基本資料";
|
|
|
+ stepDescription.value = "創建課程之前,請先新增您的據點(上課地址)";
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ stepTitle.value = "Step2 指派工藝家";
|
|
|
+ stepDescription.value =
|
|
|
+ "開始打造屬於您的工藝履歷,讓學徒對你印象深刻吧!";
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ stepTitle.value = "Step3 規劃開課內容";
|
|
|
+ stepDescription.value =
|
|
|
+ "完整且清楚的課程建立,是連接工藝老師與學徒的重要橋梁!";
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ stepTitle.value = "恭喜您完成課程提案!";
|
|
|
+ stepDescription.value = "";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return { stepTitle: stepTitle.value, stepDescription: stepDescription.value };
|
|
|
+});
|
|
|
+
|
|
|
+const breadcrumbs = reactive([
|
|
|
+ {
|
|
|
+ title: "首頁",
|
|
|
+ disabled: false,
|
|
|
+ href: "/",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "我要開課",
|
|
|
+ disabled: false,
|
|
|
+ href: "/setup-courses",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ title: "工藝家提案",
|
|
|
+ disabled: true,
|
|
|
+ },
|
|
|
+]);
|
|
|
+
|
|
|
+// // Google Map
|
|
|
+// const states = reactive({
|
|
|
+// google: null,
|
|
|
+// map: null,
|
|
|
+// markers: null,
|
|
|
+// });
|
|
|
+
|
|
|
+// const initMap = async () => {
|
|
|
+// const loader = new Loader({
|
|
|
+// apiKey: "AIzaSyClxiB7zcQDyGaB1r3Ww_VQG950AtjVoAk",
|
|
|
+// version: "weekly",
|
|
|
+// libraries: ["places"],
|
|
|
+// language: "zh-TW",
|
|
|
+// });
|
|
|
+// states.google = await loader.load();
|
|
|
+// states.map = new states.google.maps.Map(document.getElementById("map"), {
|
|
|
+// center: { lat: 25.0425, lng: 121.5468 },
|
|
|
+// zoom: 11,
|
|
|
+// mapTypeControl: false,
|
|
|
+// fullscreenControl: false,
|
|
|
+// });
|
|
|
+// };
|
|
|
+
|
|
|
+// onMounted(async () => {
|
|
|
+// await initMap();
|
|
|
+// });
|
|
|
+
|
|
|
+// const getCoordinates = async () => {
|
|
|
+// const geocoder = new states.google.maps.Geocoder();
|
|
|
+// geocoder.geocode({ address: location.address }, (results, status) => {
|
|
|
+// if (status === states.google.maps.GeocoderStatus.OK) {
|
|
|
+// location.Lat = results[0].geometry.location.lat();
|
|
|
+// location.Lng = results[0].geometry.location.lng();
|
|
|
+// }
|
|
|
+
|
|
|
+// // 將地圖中心設為取得的經緯度,並調整縮放等級
|
|
|
+// // states.map.setCenter({ lat: location.Lat, lng: location.Lng });
|
|
|
+// // states.map.setZoom(15);
|
|
|
+
|
|
|
+// // 設定地址圖標
|
|
|
+// // const marker = new google.maps.Marker({
|
|
|
+// // position: { lat: location.Lat, lng: location.Lng },
|
|
|
+// // map: states.map,
|
|
|
+// // title: location.address,
|
|
|
+// // icon: store.getImageUrl("map-icon/icon_house05.png"),
|
|
|
+// // });
|
|
|
+// });
|
|
|
+// };
|
|
|
+
|
|
|
+let location = reactive({
|
|
|
+ location_name: "",
|
|
|
+ Lng: "",
|
|
|
+ Lat: "",
|
|
|
+ address: "",
|
|
|
+ school_introduction: "",
|
|
|
+ email: "",
|
|
|
+ phone: "",
|
|
|
+ access_token: token,
|
|
|
+ teachers_list: [], // 指派工藝家
|
|
|
+ is_pass_proposal: 0, // 是否通過提案
|
|
|
+ principal_user_email: "", // 負責人 email
|
|
|
+});
|
|
|
+
|
|
|
+let locationId = ref("");
|
|
|
+
|
|
|
+// 新增履歷
|
|
|
+let resume = reactive({
|
|
|
+ teacher_name: "", // 老師姓名
|
|
|
+ work_type: "", // 工作性質
|
|
|
+ experience: "", // 教學經驗
|
|
|
+ expertise: "", // 專長工藝技能
|
|
|
+ license: "", // 工藝相關證照
|
|
|
+ media: "", // 社群媒體
|
|
|
+ // files: [], // 作品集
|
|
|
+ introduction: "", // 老師介紹
|
|
|
+});
|
|
|
+
|
|
|
+let resumeList = ref([]);
|
|
|
+let createDialog = ref(false);
|
|
|
+
|
|
|
+// 新增工藝家履歷
|
|
|
+async function insertUserResume() {
|
|
|
+ const validationResult = await resumeForm.value.validate();
|
|
|
+
|
|
|
+ // 驗證表單
|
|
|
+ if (validationResult.valid) {
|
|
|
+ resumeList.value.push(JSON.parse(JSON.stringify(resume)));
|
|
|
+ alert("新增成功!");
|
|
|
+ createDialog.value = false;
|
|
|
+
|
|
|
+ // 清空表單的值
|
|
|
+ for (const key in resume) {
|
|
|
+ if (resume.hasOwnProperty(key)) {
|
|
|
+ resume[key] = "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 新增課程
|
|
|
+let course = reactive({
|
|
|
+ name: "", // 課程名稱
|
|
|
+ location_id: "", // 據點編號
|
|
|
+ category: "", // 工藝類別
|
|
|
+ introduction: "", // 課程簡介
|
|
|
+ organizer: "", // 主辦單位
|
|
|
+ cover_img_file: "", // 課程圖片
|
|
|
+ group_id: 2, // 學群編號(技藝)
|
|
|
+ group_sort: "", // 學群細分
|
|
|
+ special_class_list_name: "",
|
|
|
+ recommend: 0, // 是否推薦
|
|
|
+ is_inner: 1, // 內課課程
|
|
|
+ is_check: 0, // 審核結果
|
|
|
+ teachers_resume: [], // 指派工藝家
|
|
|
+ access_token: token,
|
|
|
+});
|
|
|
+
|
|
|
+watch(location, (data) => {
|
|
|
+ course.organizer = data.location_name; // 據點名稱 = 主辦單位
|
|
|
+});
|
|
|
+
|
|
|
+// 新增場次
|
|
|
+let event = reactive({
|
|
|
+ name_id: "", // 課程名稱編號(需先新增課程取得Id)
|
|
|
+ event: "", // 場次名稱
|
|
|
+ start_time: "", // 課程起始日
|
|
|
+ end_time: "", // 課程結束日
|
|
|
+ contact: "", // 聯絡資訊
|
|
|
+ lecturer: "", // 課程講師
|
|
|
+ location: "",
|
|
|
+ content: "", // 課程內容
|
|
|
+ URL: "", // 外部連結
|
|
|
+ people: "不拘", // 對象
|
|
|
+ fee_method: "", // 課程價格
|
|
|
+ fee_payment: "", // 收費方式
|
|
|
+ registration_way: "", // 報名方式
|
|
|
+ registration_start: "", // 報名起始日
|
|
|
+ registration_end: "", // 報名截止日
|
|
|
+ number_limit: "", // 課程名額
|
|
|
+ remark: "", // 備註
|
|
|
+ ATM_address: "", // 匯款帳號(銀行代碼+帳號)
|
|
|
+ access_token: token,
|
|
|
+ files: [],
|
|
|
+});
|
|
|
+
|
|
|
+function insertSchool() {
|
|
|
+ location.teachers_list = JSON.stringify(resumeList.value);
|
|
|
+ console.log("提案據點", location);
|
|
|
+
|
|
|
+ const formData = new FormData();
|
|
|
+ for (const key in location) {
|
|
|
+ formData.append(key, location[key]);
|
|
|
+ }
|
|
|
+
|
|
|
+ return axios.post("https://cmm.ai:8088/api/insert_school", formData);
|
|
|
+}
|
|
|
+
|
|
|
+function insertClassName(id) {
|
|
|
+ course.location_id = id;
|
|
|
+
|
|
|
+ if (coverImg.value !== "") {
|
|
|
+ course.cover_img_file = coverImg.value;
|
|
|
+ }
|
|
|
+
|
|
|
+ const formData = new FormData();
|
|
|
+ for (const key in course) {
|
|
|
+ formData.append(key, course[key]);
|
|
|
+ }
|
|
|
+
|
|
|
+ return axios.post("https://cmm.ai:8088/api/insert_class_name", formData);
|
|
|
+}
|
|
|
+
|
|
|
+function insertEvent(id) {
|
|
|
+ if (id) {
|
|
|
+ event.name_id = id;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log("insertEvent", event);
|
|
|
+
|
|
|
+ const formData = new FormData();
|
|
|
+ for (const key in event) {
|
|
|
+ if (key === "files") {
|
|
|
+ event.files.forEach((file) => {
|
|
|
+ console.log("file", file);
|
|
|
+ formData.append("files", file);
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ formData.append(key, event[key]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return axios.post("https://cmm.ai:8088/api/insert_event", formData);
|
|
|
+}
|
|
|
+
|
|
|
+async function create() {
|
|
|
+ loading.value = true;
|
|
|
+
|
|
|
+ insertSchool()
|
|
|
+ .then((schoolResponse) => {
|
|
|
+ console.log("新增據點", schoolResponse);
|
|
|
+
|
|
|
+ if (schoolResponse.data.code === 200) {
|
|
|
+ locationId.value = schoolResponse.data.location_id;
|
|
|
+ console.log("locationId.value", locationId.value);
|
|
|
+
|
|
|
+ return insertClassName(schoolResponse.data.location_id); // 新增課程
|
|
|
+ }
|
|
|
+ return Promise.reject("新增據點失败");
|
|
|
+ })
|
|
|
+ .then((classResponse) => {
|
|
|
+ console.log("新增課程", classResponse);
|
|
|
+ return insertEvent(classResponse.data.new_class_name_id); // 新增場次
|
|
|
+ })
|
|
|
+ .then((eventResult) => {
|
|
|
+ console.log("新增場次", eventResult);
|
|
|
+ loading.value = false;
|
|
|
+ })
|
|
|
+ .then(() => {
|
|
|
+ step.value++;
|
|
|
+ })
|
|
|
+ .catch((error) => {
|
|
|
+ console.log("error", error);
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+// 上傳圖片 Input
|
|
|
+const portfolioImgRef = ref(null);
|
|
|
+const coverImgRef = ref(null);
|
|
|
+
|
|
|
+const fileInputClick = (ref) => {
|
|
|
+ if (ref === "portfolio") {
|
|
|
+ portfolioImgRef.value.click();
|
|
|
+ } else if (ref === "cover") {
|
|
|
+ coverImgRef.value.click();
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 作品集圖片
|
|
|
+let portfolioImg = ref([]);
|
|
|
+let portfolioImgList = ref([]);
|
|
|
+
|
|
|
+const handlePortfolioImg = (files) => {
|
|
|
+ console.log("files", files);
|
|
|
+ // portfolioImgList.value = []; // 清空陣列
|
|
|
+ for (let index = 0; index < files.length; index++) {
|
|
|
+ const file = files[index];
|
|
|
+ console.log("file", file);
|
|
|
+ let url = URL.createObjectURL(file);
|
|
|
+ portfolioImgList.value.push(url);
|
|
|
+ console.log("portfolioImgList", portfolioImgList.value);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+watch(portfolioImg, (newFiles) => {
|
|
|
+ if (newFiles.length > 0) {
|
|
|
+ handlePortfolioImg(newFiles);
|
|
|
+ }
|
|
|
+});
|
|
|
+
|
|
|
+// 封面圖片
|
|
|
+let coverImg = ref("");
|
|
|
+let coverImgUrl = ref("");
|
|
|
+
|
|
|
+const handleCoverImg = (event) => {
|
|
|
+ const file = event.target.files[0];
|
|
|
+ console.log("選擇檔案", file);
|
|
|
+ if (file) {
|
|
|
+ coverImg.value = file;
|
|
|
+ coverImgUrl.value = URL.createObjectURL(file); // 設定圖片預覽 URL
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const requiredRule = (value) => !!value || "此欄位為必填";
|
|
|
+
|
|
|
+let schoolSelect = reactive({
|
|
|
+ list: [],
|
|
|
+});
|
|
|
+
|
|
|
+let schoolId = ref("");
|
|
|
+
|
|
|
+// 取得已有據點
|
|
|
+(async () => {
|
|
|
+ let token = store.token;
|
|
|
+ try {
|
|
|
+ const response = await axios.get(
|
|
|
+ `https://cmm.ai:8088/api/get_school?access_token=${token}`
|
|
|
+ );
|
|
|
+
|
|
|
+ schoolSelect.list = response.data.schools;
|
|
|
+ console.log("取得使用者據點", schoolSelect.list);
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ }
|
|
|
+})();
|
|
|
+
|
|
|
+// 監聽據點 Select
|
|
|
+watch(schoolId, (id) => {
|
|
|
+ console.log("schoolId", id);
|
|
|
+ // locationId.value = id;
|
|
|
+ handleSchoolData(id);
|
|
|
+});
|
|
|
+
|
|
|
+let schools = reactive({
|
|
|
+ list: [],
|
|
|
+});
|
|
|
+
|
|
|
+// 帶入據點資料
|
|
|
+async function handleSchoolData(id) {
|
|
|
+ console.log("handleSchoolData", id);
|
|
|
+ try {
|
|
|
+ const response = await axios.get(
|
|
|
+ `https://cmm.ai:8088/api/get_school?location_id=${id}`
|
|
|
+ );
|
|
|
+
|
|
|
+ schools.list = response.data.schools;
|
|
|
+ console.log("取得已有據點", schools.list);
|
|
|
+
|
|
|
+ for (const key in schools.list[0]) {
|
|
|
+ if (location.hasOwnProperty(key) && schools.list[0][key] !== undefined) {
|
|
|
+ location[key] = schools.list[0][key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const schoolForm = ref(null); // Step1 表單
|
|
|
+const resumeForm = ref(null); // Step2 表單
|
|
|
+const courseForm = ref(null); // Step3 表單
|
|
|
+
|
|
|
+let errorField = ref(false);
|
|
|
+
|
|
|
+function checkField(num) {
|
|
|
+ console.log("checkField", num);
|
|
|
+ // step.value++;
|
|
|
+ if (num === 1) {
|
|
|
+ console.log("location", location);
|
|
|
+ schoolForm.value.validate();
|
|
|
+ for (const key in location) {
|
|
|
+ // 判斷是否有空值
|
|
|
+ if (key !== "Lat" && key !== "Lng" && key !== "is_pass_proposal") {
|
|
|
+ if (!location[key]) {
|
|
|
+ console.log("!location[key]", key);
|
|
|
+ errorField.value = true;
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ errorField.value = false;
|
|
|
+ }, 3000);
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
+ errorField.value = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (num === 2) {
|
|
|
+ // resumeForm.value.validate();
|
|
|
+
|
|
|
+ if (!resumeList.value.length) {
|
|
|
+ errorField.value = true;
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ errorField.value = false;
|
|
|
+ }, 3000);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ step.value++;
|
|
|
+}
|
|
|
+
|
|
|
+let teacherName = ref("");
|
|
|
+let teacherList = ref([]);
|
|
|
+let isLoading = ref(false);
|
|
|
+
|
|
|
+let result = reactive({
|
|
|
+ show: false,
|
|
|
+ color: "",
|
|
|
+ text: "",
|
|
|
+});
|
|
|
+
|
|
|
+function closeResult() {
|
|
|
+ setTimeout(() => {
|
|
|
+ result.show = false;
|
|
|
+ }, 2000);
|
|
|
+}
|
|
|
+
|
|
|
+function handleResponse(show, color, text) {
|
|
|
+ result.show = show;
|
|
|
+ result.color = color;
|
|
|
+ result.text = text;
|
|
|
+
|
|
|
+ closeResult();
|
|
|
+}
|
|
|
+
|
|
|
+// async function assignTeacher() {
|
|
|
+// console.log(teacherName.value);
|
|
|
+
|
|
|
+// if (teacherName.value === "") {
|
|
|
+// resumeForm.value.validate();
|
|
|
+// return;
|
|
|
+// }
|
|
|
+
|
|
|
+// isLoading.value = true;
|
|
|
+
|
|
|
+// // 判斷 list 內是否已有相同 email
|
|
|
+// const found = teacherList.value.some((item) => {
|
|
|
+// return item === teacherName.value;
|
|
|
+// });
|
|
|
+
|
|
|
+// if (found) {
|
|
|
+// console.log("重複輸入");
|
|
|
+// isLoading.value = false;
|
|
|
+// handleResponse(true, "error", "此 Email 已指派");
|
|
|
+// return;
|
|
|
+// } else {
|
|
|
+// try {
|
|
|
+// const response = await axios.post(
|
|
|
+// `https://cmm.ai:8088/api/check_is_user?email=${teacherName.value}`
|
|
|
+// );
|
|
|
+
|
|
|
+// if (response.data.msg === "success") {
|
|
|
+// handleResponse(true, "success", response.data.result);
|
|
|
+// teacherList.value.push(teacherName.value);
|
|
|
+// teacherName.value = null;
|
|
|
+// } else if (response.data.msg === "error") {
|
|
|
+// handleResponse(true, "error", response.data.result);
|
|
|
+// }
|
|
|
+
|
|
|
+// isLoading.value = false;
|
|
|
+
|
|
|
+// console.log("response", response);
|
|
|
+// console.log("response.data.msg", response.data.msg);
|
|
|
+// } catch (error) {
|
|
|
+// console.error(error);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+
|
|
|
+function removeTeacher(index) {
|
|
|
+ console.log("index", index);
|
|
|
+ resumeList.value.splice(index, 1);
|
|
|
+ // teacherList.value.splice(index, 1);
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<template>
|
|
|
+ <Navbar />
|
|
|
+
|
|
|
+ <v-container class="mb-16 pb-16 proposal-container">
|
|
|
+ <v-breadcrumbs
|
|
|
+ :items="breadcrumbs"
|
|
|
+ divider="/"
|
|
|
+ class="py-10"
|
|
|
+ ></v-breadcrumbs>
|
|
|
+
|
|
|
+ <v-card class="mx-auto pa-5 pa-sm-10">
|
|
|
+ <v-card-title class="step-title mb-5">
|
|
|
+ <h5>{{ computedTitle.stepTitle }}</h5>
|
|
|
+ <p class="mt-5">{{ computedTitle.stepDescription }}</p>
|
|
|
+ </v-card-title>
|
|
|
+
|
|
|
+ <v-window v-model="step">
|
|
|
+ <v-window-item :value="1">
|
|
|
+ <v-card-text>
|
|
|
+ <v-form ref="schoolForm" lazy-validation @submit.prevent>
|
|
|
+ <!-- <div v-if="schoolSelect.list.length" class="mb-10 school-list">
|
|
|
+ <v-label class="d-flex align-center w-100 overflow-visible">
|
|
|
+ <p class="pe-3">已經有據點?</p>
|
|
|
+ <v-select
|
|
|
+ v-model="schoolId"
|
|
|
+ label="請選擇據點"
|
|
|
+ :items="schoolSelect.list"
|
|
|
+ item-title="location_name"
|
|
|
+ item-value="location_id"
|
|
|
+ hide-details
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-select>
|
|
|
+ </v-label>
|
|
|
+ </div> -->
|
|
|
+
|
|
|
+ <v-row class="justify-center">
|
|
|
+ <v-col cols="12" md="6">
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 工坊名稱<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.location_name"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ title="工坊名稱"
|
|
|
+ placeholder="可以是您的工作室或品牌名稱/教學單位/您的姓名"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ counter
|
|
|
+ maxlength="60"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 工坊地址<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.address"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ title="工坊地址"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="需在安全且便於學徒到達之地點開課"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 工坊 Email<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.email"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="請填寫 Email"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 負責人 Email<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.principal_user_email"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ title="負責人 Email"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="請填寫 Email"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <div class="d-flex">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 公開電話<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <span class="d-block ms-3 hint"
|
|
|
+ >會顯示於課程介紹中,想了解課程資訊者聯繫用途
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.phone"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 工坊簡介<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-textarea
|
|
|
+ v-model="location.school_introduction"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ rows="5"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="請輸入工坊簡介"
|
|
|
+ ></v-textarea>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" md="6"> </v-col>
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="6" class="px-0">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex mb-5">負責人<span class="mark">*</span></p>
|
|
|
+ <v-text-field
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ title="負責人"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ counter
|
|
|
+ maxlength="60"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" md="11" class="px-4">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 工坊地址<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.address"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ title="工坊地址"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="需在安全且便於學徒到達之地點開課"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" md="5" class="px-0">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 據點 Email<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.email"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="請填寫 Email"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" md="5" class="px-0">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <div class="d-flex">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 公開電話<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <span class="d-block ms-3 hint"
|
|
|
+ >會顯示於課程介紹中,想了解課程資訊者聯繫用途
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.phone"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" md="11">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex mb-5">
|
|
|
+ 據點簡介<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-textarea
|
|
|
+ v-model="location.school_introduction"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ rows="5"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-textarea>
|
|
|
+ </v-label>
|
|
|
+ </v-col> -->
|
|
|
+ </v-row>
|
|
|
+
|
|
|
+ <!-- <div class="d-flex flex-column justify-end ms-md-16 ps-md-5">
|
|
|
+ <div
|
|
|
+ class="map"
|
|
|
+ id="map"
|
|
|
+ style="width: 100%; height: 31.25em"
|
|
|
+ ></div>
|
|
|
+
|
|
|
+ <v-row>
|
|
|
+ <v-col cols="12" md="6">
|
|
|
+ <v-label class="d-flex align-center">
|
|
|
+ <p class="pb-5 pe-3">經度</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.Lng"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ disabled
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+ <v-col cols="12" md="6" class="py-0 py-md-3">
|
|
|
+ <v-label class="d-flex align-center">
|
|
|
+ <p class="pb-5 pe-3">緯度</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.Lat"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ disabled
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+ </v-row>
|
|
|
+ </div> -->
|
|
|
+ </v-form>
|
|
|
+ </v-card-text>
|
|
|
+ </v-window-item>
|
|
|
+
|
|
|
+ <v-window-item :value="2">
|
|
|
+ <v-card-text
|
|
|
+ class="d-flex flex-column align-center justify-center mb-16"
|
|
|
+ >
|
|
|
+ <!-- <button class="resume-btn">
|
|
|
+ <p class="d-flex flex-column align-center">
|
|
|
+ <v-icon icon="mdi-plus"></v-icon>
|
|
|
+ 新增工藝家
|
|
|
+ </p>
|
|
|
+ </button> -->
|
|
|
+
|
|
|
+ <button class="resume-btn">
|
|
|
+ <p class="d-flex flex-column align-center">
|
|
|
+ <v-icon icon="mdi-plus" size="x-large"></v-icon>
|
|
|
+ 新增工藝家
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <v-dialog v-model="createDialog" activator="parent" width="700">
|
|
|
+ <v-card class="pa-5">
|
|
|
+ <v-card-title>工藝家履歷</v-card-title>
|
|
|
+ <v-card-text>
|
|
|
+ <v-form ref="resumeForm" lazy-validation @submit.prevent>
|
|
|
+ <v-row>
|
|
|
+ <v-col cols="12">
|
|
|
+ <v-label class="d-flex align-center">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 老師姓名<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="resume.teacher_name"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <!-- <v-col cols="6"></v-col> -->
|
|
|
+
|
|
|
+ <v-col cols="12">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 工作性質<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-radio-group v-model="resume.work_type" inline>
|
|
|
+ <v-radio label="全職" value="全職"></v-radio>
|
|
|
+ <v-radio
|
|
|
+ label="兼職"
|
|
|
+ value="兼職"
|
|
|
+ class="ps-3"
|
|
|
+ ></v-radio>
|
|
|
+ </v-radio-group>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" class="py-0">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="pb-5 pe-3">教學經驗</p>
|
|
|
+ <v-radio-group v-model="resume.experience" inline>
|
|
|
+ <v-radio label="0-5 年" value="0-5 年"></v-radio>
|
|
|
+ <v-radio
|
|
|
+ label="5-10 年"
|
|
|
+ value="5-10 年"
|
|
|
+ class="ps-3"
|
|
|
+ ></v-radio>
|
|
|
+ <v-radio
|
|
|
+ label="10-20 年"
|
|
|
+ value="10-20 年"
|
|
|
+ class="ps-3"
|
|
|
+ ></v-radio>
|
|
|
+ <v-radio
|
|
|
+ label="20 年以上"
|
|
|
+ value="20 年以上"
|
|
|
+ class="ps-3"
|
|
|
+ ></v-radio>
|
|
|
+ </v-radio-group>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12">
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 專長工藝技能<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="resume.expertise"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">工藝相關證照</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="resume.license"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex">社群媒體</p>
|
|
|
+ <span class="d-block py-3 hint"
|
|
|
+ >工藝老師經營之網站或社群媒體,可貼網址</span
|
|
|
+ >
|
|
|
+ <v-text-field
|
|
|
+ v-model="resume.media"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <!-- <v-col cols="12">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex">講師作品集</p>
|
|
|
+
|
|
|
+ <v-file-input
|
|
|
+ multiple
|
|
|
+ v-model="portfolioImg"
|
|
|
+ ref="portfolioImgRef"
|
|
|
+ label="File input"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="選擇相片上傳"
|
|
|
+ @change="handlePortfolioImg"
|
|
|
+ style="display: none"
|
|
|
+ ></v-file-input>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-btn
|
|
|
+ @click="fileInputClick('portfolio')"
|
|
|
+ color="purple"
|
|
|
+ class="my-5"
|
|
|
+ >選擇相片上傳</v-btn
|
|
|
+ >
|
|
|
+
|
|
|
+ <v-row class="img-list">
|
|
|
+ <v-col
|
|
|
+ cols="4"
|
|
|
+ v-for="(item, index) in 6"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ v-if="!portfolioImgList.length"
|
|
|
+ class="item"
|
|
|
+ ></div>
|
|
|
+ <div
|
|
|
+ v-else
|
|
|
+ class="item"
|
|
|
+ :style="{
|
|
|
+ backgroundImage: `url('${portfolioImgList[index]}')`,
|
|
|
+ }"
|
|
|
+ ></div>
|
|
|
+ </v-col>
|
|
|
+ </v-row>
|
|
|
+ </v-col> -->
|
|
|
+
|
|
|
+ <v-col cols="12">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex mb-5">工藝家介紹</p>
|
|
|
+ <v-textarea
|
|
|
+ v-model="resume.introduction"
|
|
|
+ rows="5"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-textarea>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+ </v-row>
|
|
|
+ </v-form>
|
|
|
+ </v-card-text>
|
|
|
+
|
|
|
+ <v-card-actions class="justify-center">
|
|
|
+ <v-spacer></v-spacer>
|
|
|
+
|
|
|
+ <v-btn text="取消" @click="isActive.value = false"></v-btn>
|
|
|
+
|
|
|
+ <v-btn
|
|
|
+ @click="insertUserResume()"
|
|
|
+ color="purple"
|
|
|
+ variant="flat"
|
|
|
+ >
|
|
|
+ 新增
|
|
|
+ </v-btn>
|
|
|
+ </v-card-actions>
|
|
|
+ </v-card>
|
|
|
+ </v-dialog>
|
|
|
+ </button>
|
|
|
+
|
|
|
+ <div class="main-table mt-10">
|
|
|
+ <h6 data-v-bbf03f1f="" class="table-title">工藝家履歷</h6>
|
|
|
+
|
|
|
+ <table>
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th>姓名</th>
|
|
|
+ <th>工作性質</th>
|
|
|
+ <th>教學經驗</th>
|
|
|
+ <th>專長工藝技能</th>
|
|
|
+ <th>工藝相關證照</th>
|
|
|
+ <th>社群媒體</th>
|
|
|
+ <th>老師介紹</th>
|
|
|
+ <th></th>
|
|
|
+ <!-- <th width="15%">繳款資訊</th> -->
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody v-if="resumeList.length">
|
|
|
+ <!-- <tr v-if="!register.list.length">
|
|
|
+ <p class="hint-item">
|
|
|
+ 目前沒有報名紀錄喔!點擊開始探索您的專屬課程!
|
|
|
+ </p>
|
|
|
+ </tr> -->
|
|
|
+ <tr v-for="(item, index) in resumeList" :key="index">
|
|
|
+ <td>{{ item.teacher_name }}</td>
|
|
|
+ <td>{{ item.work_type }}</td>
|
|
|
+ <td>{{ item.experience }}</td>
|
|
|
+ <td>{{ item.expertise }}</td>
|
|
|
+ <td>{{ item.license }}</td>
|
|
|
+ <td>{{ item.media }}</td>
|
|
|
+ <td>{{ item.introduction }}</td>
|
|
|
+ <td>
|
|
|
+ <v-btn
|
|
|
+ @click="removeTeacher(index)"
|
|
|
+ icon="mdi-close"
|
|
|
+ color="red"
|
|
|
+ variant="text"
|
|
|
+ ></v-btn>
|
|
|
+ <!-- <v-icon icon="mdi-close" color="red"></v-icon> -->
|
|
|
+ </td>
|
|
|
+
|
|
|
+ <!-- <td>{{ item.class_name }}</td>
|
|
|
+ <td>
|
|
|
+ {{ moment(`${item.create_time}`).format("YYYY/MM/DD") }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{ moment(`${item.start_time}`).format("YYYY/MM/DD H:mm") }}
|
|
|
+ <br />
|
|
|
+ ~ <br />
|
|
|
+ {{ moment(`${item.end_time}`).format("YYYY/MM/DD H:mm") }}
|
|
|
+ </td>
|
|
|
+ <td>{{ item.hours }} 小時</td>
|
|
|
+ <td>
|
|
|
+ <span class="finish-icon" v-if="item.reg_confirm">
|
|
|
+ <v-icon icon="mdi-check" class="pb-1"></v-icon>
|
|
|
+ </span>
|
|
|
+
|
|
|
+ <span v-else class="d-flex align-center">
|
|
|
+ <p style="width: 55px" class="text-grey-lighten-1">審核中</p>
|
|
|
+ </span>
|
|
|
+ </td> -->
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- <v-form ref="resumeForm" lazy-validation @submit.prevent>
|
|
|
+ <v-row>
|
|
|
+ <v-col cols="12" sm="6">
|
|
|
+ <v-label class="d-flex align-center pb-3">
|
|
|
+ <p class="pb-5 pe-3">老師姓名<span class="mark">*</span></p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="resume.teacher_name"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="6"></v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" lg="3">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="pb-5 pe-3">工作性質<span class="mark">*</span></p>
|
|
|
+ <v-radio-group v-model="resume.work_type" inline>
|
|
|
+ <v-radio label="全職" value="全職"></v-radio>
|
|
|
+ <v-radio label="兼職" value="兼職" class="ps-3"></v-radio>
|
|
|
+ </v-radio-group>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" lg="9">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="pb-5 pe-3">教學經驗</p>
|
|
|
+ <v-radio-group v-model="resume.experience" inline>
|
|
|
+ <v-radio label="0-5 年" value="0-5 年"></v-radio>
|
|
|
+ <v-radio
|
|
|
+ label="5-10 年"
|
|
|
+ value="5-10 年"
|
|
|
+ class="ps-3"
|
|
|
+ ></v-radio>
|
|
|
+ <v-radio
|
|
|
+ label="10-20 年"
|
|
|
+ value="10-20 年"
|
|
|
+ class="ps-3"
|
|
|
+ ></v-radio>
|
|
|
+ <v-radio
|
|
|
+ label="20 年以上"
|
|
|
+ value="20 年以上"
|
|
|
+ class="ps-3"
|
|
|
+ ></v-radio>
|
|
|
+ </v-radio-group>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" md="6">
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 專長工藝技能<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="resume.expertise"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">工藝相關證照</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="resume.license"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex">社群媒體</p>
|
|
|
+ <span class="d-block py-3 hint"
|
|
|
+ >工藝老師經營之網站或社群媒體,可貼網址</span
|
|
|
+ >
|
|
|
+ <v-text-field
|
|
|
+ v-model="resume.media"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" md="6">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex">講師作品集</p>
|
|
|
+
|
|
|
+ <v-file-input
|
|
|
+ multiple
|
|
|
+ v-model="portfolioImg"
|
|
|
+ ref="portfolioImgRef"
|
|
|
+ label="File input"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="選擇相片上傳"
|
|
|
+ @change="handlePortfolioImg"
|
|
|
+ style="display: none"
|
|
|
+ ></v-file-input>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-btn
|
|
|
+ @click="fileInputClick('portfolio')"
|
|
|
+ color="purple"
|
|
|
+ class="my-5"
|
|
|
+ >選擇相片上傳</v-btn
|
|
|
+ >
|
|
|
+
|
|
|
+ <v-row class="img-list">
|
|
|
+ <v-col cols="4" v-for="(item, index) in 6" :key="index">
|
|
|
+ <div v-if="!portfolioImgList.length" class="item"></div>
|
|
|
+ <div
|
|
|
+ v-else
|
|
|
+ class="item"
|
|
|
+ :style="{
|
|
|
+ backgroundImage: `url('${portfolioImgList[index]}')`,
|
|
|
+ }"
|
|
|
+ ></div>
|
|
|
+ </v-col>
|
|
|
+ </v-row>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex mb-5">老師自我介紹</p>
|
|
|
+ <v-textarea
|
|
|
+ v-model="resume.introduction"
|
|
|
+ rows="5"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-textarea>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+ </v-row>
|
|
|
+ </v-form> -->
|
|
|
+ </v-card-text>
|
|
|
+ </v-window-item>
|
|
|
+
|
|
|
+ <v-window-item :value="3">
|
|
|
+ <v-card-text class="mb-7">
|
|
|
+ <v-form ref="courseForm" lazy-validation @submit.prevent>
|
|
|
+ <v-row class="justify-space-evenly">
|
|
|
+ <v-col cols="12" md="7">
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">課程名稱<span class="mark">*</span></p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="course.name"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">工藝類別<span class="mark">*</span></p>
|
|
|
+ <v-select
|
|
|
+ v-model="course.category"
|
|
|
+ placeholder="請選擇類別"
|
|
|
+ :items="[
|
|
|
+ '樹藝',
|
|
|
+ '漆藝',
|
|
|
+ '藍染',
|
|
|
+ '蠟雕',
|
|
|
+ '竹工藝籃',
|
|
|
+ '金工/飾品',
|
|
|
+ '蠟燭/香氛/調香',
|
|
|
+ '植栽/花藝',
|
|
|
+ '插畫/繪畫/寫字',
|
|
|
+ '皮件/皮革',
|
|
|
+ '木工/竹藝',
|
|
|
+ '陶藝/玻璃',
|
|
|
+ '編織/羊毛氈/縫紉',
|
|
|
+ '其他',
|
|
|
+ ]"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-select>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">上課地點</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.address"
|
|
|
+ label="自動帶入據點地址"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">主辦單位</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.location_name"
|
|
|
+ label="自動帶入據點名稱"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="d-flex">課程簡介<span class="mark">*</span></p>
|
|
|
+ <small class="my-2 hint"
|
|
|
+ >內容不得少於 100 字元,且不得含有工藝無關之資訊</small
|
|
|
+ >
|
|
|
+ <v-textarea
|
|
|
+ v-model="course.introduction"
|
|
|
+ rows="5"
|
|
|
+ variant="outlined"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ ></v-textarea>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <!-- <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">課程時長<span class="mark">*</span></p>
|
|
|
+ <v-text-field
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label> -->
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">課程價位<span class="mark">*</span></p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="event.fee_method"
|
|
|
+ type="number"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">課程名額<span class="mark">*</span></p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="event.number_limit"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="請輸入報名人數上限"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 最低開課人數<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="請輸入開課門檻人數"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="pb-5 pe-3">適合對象<span class="mark">*</span></p>
|
|
|
+ <v-textarea
|
|
|
+ v-model="event.people"
|
|
|
+ rows="2"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="ex. 不拘、18-65 歲、大專院校工藝、美術、設計科系學生、從事木作相關之業者或個人工作室"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ ></v-textarea>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block mb-5">
|
|
|
+ <p class="d-flex">上傳課程簡報 (ex. 講義、簡介)</p>
|
|
|
+ <small class="my-3 hint" style="letter-spacing: 1px"
|
|
|
+ >檔案格式:.ppt|.pptx|.pdf</small
|
|
|
+ >
|
|
|
+ <v-file-input
|
|
|
+ v-model="event.files"
|
|
|
+ accept="image/*"
|
|
|
+ label="上傳檔案"
|
|
|
+ variant="outlined"
|
|
|
+ prepend-icon="mdi-cloud-upload"
|
|
|
+ class="upload-input"
|
|
|
+ ></v-file-input>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex">
|
|
|
+ 上傳課程封面<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <v-file-input
|
|
|
+ multiple
|
|
|
+ v-model="coverImg"
|
|
|
+ ref="coverImgRef"
|
|
|
+ label="File input"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="選擇相片上傳"
|
|
|
+ @change="handleCoverImg"
|
|
|
+ style="display: none"
|
|
|
+ ></v-file-input>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-btn
|
|
|
+ @click="fileInputClick('cover')"
|
|
|
+ color="purple"
|
|
|
+ class="my-5"
|
|
|
+ >選擇相片上傳</v-btn
|
|
|
+ >
|
|
|
+
|
|
|
+ <div class="step-01 image-preview">
|
|
|
+ <img
|
|
|
+ v-if="coverImg"
|
|
|
+ :src="coverImgUrl"
|
|
|
+ alt="上傳圖片預覽"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" md="5">
|
|
|
+ <div class="notes-block">
|
|
|
+ <p class="mb-5">課程審核標準:</p>
|
|
|
+ <ul>
|
|
|
+ <li>
|
|
|
+ ◆
|
|
|
+ 課程內容正確合宜,無錯誤與誇大不實、不含與課程無關的推銷廣告、內容無抄襲侵權、無涉及任何色情、血腥暴力、人身攻擊、歧視(包含性別、種族、性傾向等)。
|
|
|
+ </li>
|
|
|
+ <li>◆ 提供圖片需與課程內容相符。</li>
|
|
|
+ <li>◆ 教學內容符合邏輯。</li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="5">
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">課程價格<span class="mark">*</span></p>
|
|
|
+ <v-text-field
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col> -->
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="5">
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">工藝類別<span class="mark">*</span></p>
|
|
|
+ <v-select
|
|
|
+ v-model="course.category"
|
|
|
+ placeholder="請選擇類別"
|
|
|
+ :items="[
|
|
|
+ '樹藝',
|
|
|
+ '漆藝',
|
|
|
+ '藍染',
|
|
|
+ '蠟雕',
|
|
|
+ '竹工藝籃',
|
|
|
+ '金工/飾品',
|
|
|
+ '蠟燭/香氛/調香',
|
|
|
+ '植栽/花藝',
|
|
|
+ '插畫/繪畫/寫字',
|
|
|
+ '皮件/皮革',
|
|
|
+ '木工/竹藝',
|
|
|
+ '陶藝/玻璃',
|
|
|
+ '編織/羊毛氈/縫紉',
|
|
|
+ '其他',
|
|
|
+ ]"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ hide-details
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-select>
|
|
|
+ </v-label>
|
|
|
+ </v-col> -->
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="5">
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 適合報名對象(年紀)<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <v-select
|
|
|
+ v-model="age"
|
|
|
+ :items="[
|
|
|
+ '不拘',
|
|
|
+ '7 歲以下',
|
|
|
+ '7-18 歲',
|
|
|
+ '18-65 歲',
|
|
|
+ '65 歲以上',
|
|
|
+ ]"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ outlined
|
|
|
+ ></v-select>
|
|
|
+ </v-label>
|
|
|
+ </v-col> -->
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="5">
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">上課地點</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.address"
|
|
|
+ label="自動帶入據點地址"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col> -->
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="5">
|
|
|
+ <v-label class="d-block pb-3">
|
|
|
+ <p class="pb-5 pe-3">主辦單位</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="location.location_name"
|
|
|
+ label="自動帶入據點名稱"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col> -->
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="11" class="px-md-7">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex">課程時間<span class="mark">*</span></p>
|
|
|
+
|
|
|
+ <v-dialog v-model="sessionsDialog" persistent width="800">
|
|
|
+ <template v-slot:activator="{ props }">
|
|
|
+ <v-btn class="my-5" color="purple" v-bind="props">
|
|
|
+ <v-icon icon="mdi-plus" class="me-1"></v-icon>
|
|
|
+ 建立新場次
|
|
|
+ </v-btn>
|
|
|
+ </template>
|
|
|
+ <v-card class="sessions-card pb-3">
|
|
|
+ <v-card-title>
|
|
|
+ <span class="d-block ps-10 py-5">建立新場次</span>
|
|
|
+ </v-card-title>
|
|
|
+ <v-card-text class="pt-0 px-8">
|
|
|
+ <v-form
|
|
|
+ ref="eventForm"
|
|
|
+ lazy-validation
|
|
|
+ @submit.prevent
|
|
|
+ >
|
|
|
+ <v-container class="py-0">
|
|
|
+ <v-row>
|
|
|
+ <v-col cols="12" sm="6" class="date-item">
|
|
|
+ <p class="mb-0 pe-3">
|
|
|
+ 起始日期<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="date.start_date"
|
|
|
+ :min-date="new Date()"
|
|
|
+ :enable-time-picker="false"
|
|
|
+ :format="store.datePickerFormat"
|
|
|
+ locale="cn"
|
|
|
+ ></VueDatePicker>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="date-item">
|
|
|
+ <p class="mb-0 pe-3">
|
|
|
+ 起始時間<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="date.start_time"
|
|
|
+ time-picker
|
|
|
+ />
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="date-item">
|
|
|
+ <p class="mb-0 pe-3">
|
|
|
+ 結束日期<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="date.end_date"
|
|
|
+ :min-date="new Date()"
|
|
|
+ :enable-time-picker="false"
|
|
|
+ :format="store.datePickerFormat"
|
|
|
+ locale="cn"
|
|
|
+ ></VueDatePicker>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="date-item">
|
|
|
+ <p class="mb-0 pe-3">
|
|
|
+ 結束時間<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="date.end_time"
|
|
|
+ time-picker
|
|
|
+ />
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-divider class="mt-5 mb-8"></v-divider>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="py-0">
|
|
|
+ <v-label class="d-flex align-center py-2">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 場次名稱<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="event.event"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="py-0">
|
|
|
+ <v-label class="d-flex align-center py-2">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 課程講師<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="event.lecturer"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="py-0">
|
|
|
+ <v-label class="d-flex align-center py-2">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 聯絡資訊<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="event.contact"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="py-0">
|
|
|
+ <v-label class="d-flex align-center py-2">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 課程名額<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="event.number_limit"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ type="number"
|
|
|
+ hint="請設定報名人數上限"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" class="py-0">
|
|
|
+ <v-label class="d-flex align-center py-2">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 收費方式<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <v-select
|
|
|
+ v-model="event.fee_payment"
|
|
|
+ :items="['現場收費', '匯款']"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ outlined
|
|
|
+ ></v-select>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" class="py-0">
|
|
|
+ <v-label
|
|
|
+ v-if="isRemit"
|
|
|
+ class="d-flex align-center py-2"
|
|
|
+ >
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 匯款資訊<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <div class="d-flex w-100">
|
|
|
+ <v-text-field
|
|
|
+ v-model="bankCode"
|
|
|
+ label="銀行代碼"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ style="width: 30%"
|
|
|
+ class="me-3"
|
|
|
+ ></v-text-field>
|
|
|
+ <v-text-field
|
|
|
+ v-model="bankAccount"
|
|
|
+ label="匯款帳號 (10-16 碼)"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ style="width: 70%"
|
|
|
+ ></v-text-field>
|
|
|
+ </div>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" class="py-0">
|
|
|
+ <v-label class="d-flex align-center py-2">
|
|
|
+ <p class="pb-5 pe-3">
|
|
|
+ 課程價格<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="event.fee_method"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" class="py-0">
|
|
|
+ <v-label class="d-flex align-center">
|
|
|
+ <p class="pb-3 pe-3">
|
|
|
+ 適合對象<span class="mark pb-4">*</span>
|
|
|
+ </p>
|
|
|
+ <v-textarea
|
|
|
+ rows="2"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="ex. 不拘、18-65 歲、大專院校工藝、美術、設計科系學生、從事木作相關之業者或個人工作室"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ ></v-textarea>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" class="py-0 position-relative">
|
|
|
+ <v-label class="d-flex align-center py-2">
|
|
|
+ <p class="pb-3 pe-3">
|
|
|
+ 課程類型<span class="mark pb-4">*</span>
|
|
|
+ </p>
|
|
|
+ <v-select
|
|
|
+ v-model="eventType"
|
|
|
+ :items="[
|
|
|
+ '一日課程(例:2023/10/2 週一上課)',
|
|
|
+ '週期課程(例:2023/10/1~2023/10/30 每週一三上課)',
|
|
|
+ ]"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ outlined
|
|
|
+ ></v-select>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col
|
|
|
+ v-if="!isOneDay"
|
|
|
+ cols="12"
|
|
|
+ class="d-flex py-0"
|
|
|
+ >
|
|
|
+ <p class="pt-1 pe-3">
|
|
|
+ 重複週期<span class="mark pb-4">*</span>
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <ul class="week-list">
|
|
|
+ <li
|
|
|
+ v-for="(item, index) in weekList"
|
|
|
+ :key="index"
|
|
|
+ @click="toggleSelected(index)"
|
|
|
+ :class="{ active: selectedWeek[index] }"
|
|
|
+ class="d-flex"
|
|
|
+ >
|
|
|
+ <button class="item">
|
|
|
+ {{ item }}
|
|
|
+ </button>
|
|
|
+
|
|
|
+ <div
|
|
|
+ v-if="selectedWeek[index]"
|
|
|
+ class="d-flex w-100 ms-5"
|
|
|
+ >
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="
|
|
|
+ sessionTime.start_week_time[index]
|
|
|
+ "
|
|
|
+ time-picker
|
|
|
+ />
|
|
|
+ <span class="d-flex align-center mx-2"
|
|
|
+ >~</span
|
|
|
+ >
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="
|
|
|
+ sessionTime.end_week_time[index]
|
|
|
+ "
|
|
|
+ time-picker
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" class="py-0">
|
|
|
+ <v-label class="d-flex align-center py-2">
|
|
|
+ <p class="pe-3">備註</p>
|
|
|
+ <v-text-field
|
|
|
+ v-model="event.remark"
|
|
|
+ density="compact"
|
|
|
+ variant="outlined"
|
|
|
+ hide-details
|
|
|
+ ></v-text-field>
|
|
|
+ </v-label>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-divider class="my-8"></v-divider>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="date-item">
|
|
|
+ <p class="mb-0 pe-3">
|
|
|
+ 報名日期<span class="mark pb-4">*</span>
|
|
|
+ </p>
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="date.registration_start_date"
|
|
|
+ :min-date="new Date()"
|
|
|
+ :enable-time-picker="false"
|
|
|
+ :format="store.datePickerFormat"
|
|
|
+ locale="cn"
|
|
|
+ ></VueDatePicker>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="date-item">
|
|
|
+ <p class="mb-0 pe-3">
|
|
|
+ 報名時間<span class="mark pb-4">*</span>
|
|
|
+ </p>
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="date.registration_start_time"
|
|
|
+ time-picker
|
|
|
+ />
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="date-item">
|
|
|
+ <p class="mb-0 pe-3">
|
|
|
+ 報名截止<span class="mark pb-4">*</span>
|
|
|
+ </p>
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="date.registration_end_date"
|
|
|
+ :min-date="new Date()"
|
|
|
+ :enable-time-picker="false"
|
|
|
+ :format="store.datePickerFormat"
|
|
|
+ locale="cn"
|
|
|
+ ></VueDatePicker>
|
|
|
+ </v-col>
|
|
|
+
|
|
|
+ <v-col cols="12" sm="6" class="date-item">
|
|
|
+ <p class="mb-0 pe-3">
|
|
|
+ 截止時間<span class="mark pb-4">*</span>
|
|
|
+ </p>
|
|
|
+ <VueDatePicker
|
|
|
+ v-model="date.registration_end_time"
|
|
|
+ time-picker
|
|
|
+ />
|
|
|
+ </v-col>
|
|
|
+ </v-row>
|
|
|
+ </v-container>
|
|
|
+ </v-form>
|
|
|
+ </v-card-text>
|
|
|
+
|
|
|
+ <v-card-actions class="justify-center pt-10 pb-5">
|
|
|
+ <v-btn
|
|
|
+ color="gray"
|
|
|
+ variant="tonal"
|
|
|
+ class="me-3 px-10"
|
|
|
+ @click="sessionsDialog = false"
|
|
|
+ >
|
|
|
+ 取消
|
|
|
+ </v-btn>
|
|
|
+ <v-btn
|
|
|
+ color="purple"
|
|
|
+ variant="flat"
|
|
|
+ @click="addEventData()"
|
|
|
+ class="px-10"
|
|
|
+ >
|
|
|
+ 新增
|
|
|
+ </v-btn>
|
|
|
+ </v-card-actions>
|
|
|
+ </v-card>
|
|
|
+ </v-dialog>
|
|
|
+
|
|
|
+ <div v-if="eventData.list.length" class="main-table">
|
|
|
+ <h6 class="table-title">場次資訊</h6>
|
|
|
+ <table>
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th>名稱</th>
|
|
|
+ <th>日期</th>
|
|
|
+ <th width="20%">課程講師</th>
|
|
|
+ <th width="20%">收費方式</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ <tr
|
|
|
+ v-for="(item, index) in eventData.list"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ <td>{{ item.event }}</td>
|
|
|
+ <td>
|
|
|
+ {{
|
|
|
+ moment(`${item.start_time}`).format(
|
|
|
+ "YYYY/MM/DD"
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ <br />
|
|
|
+ ~
|
|
|
+ <br />
|
|
|
+ {{
|
|
|
+ moment(`${item.end_time}`).format("YYYY/MM/DD")
|
|
|
+ }}
|
|
|
+ </td>
|
|
|
+ <td>{{ item.lecturer }}</td>
|
|
|
+ <td>{{ item.fee_method }}</td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ </v-label>
|
|
|
+ </v-col> -->
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="11" class="px-md-7">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex">課程簡介<span class="mark">*</span></p>
|
|
|
+ <small class="d-block text-gray my-2"
|
|
|
+ >內容不得少於 100 字元,且不得含有工藝無關之資訊</small
|
|
|
+ >
|
|
|
+ <v-textarea
|
|
|
+ v-model="course.introduction"
|
|
|
+ rows="5"
|
|
|
+ variant="outlined"
|
|
|
+ :rules="[requiredRule]"
|
|
|
+ ></v-textarea>
|
|
|
+ </v-label>
|
|
|
+ </v-col> -->
|
|
|
+
|
|
|
+ <!-- <v-col cols="12" md="5" class="me-auto ms-3 ps-16">
|
|
|
+ <v-label class="d-block">
|
|
|
+ <p class="d-flex">
|
|
|
+ 上傳課程封面<span class="mark">*</span>
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <v-file-input
|
|
|
+ multiple
|
|
|
+ v-model="coverImg"
|
|
|
+ ref="coverImgRef"
|
|
|
+ label="File input"
|
|
|
+ variant="outlined"
|
|
|
+ placeholder="選擇相片上傳"
|
|
|
+ @change="handleCoverImg"
|
|
|
+ style="display: none"
|
|
|
+ ></v-file-input>
|
|
|
+ </v-label>
|
|
|
+
|
|
|
+ <v-btn
|
|
|
+ @click="fileInputClick('cover')"
|
|
|
+ color="purple"
|
|
|
+ class="my-5"
|
|
|
+ >選擇相片上傳</v-btn
|
|
|
+ >
|
|
|
+
|
|
|
+ <div class="step-01 image-preview">
|
|
|
+ <img
|
|
|
+ v-if="coverImg"
|
|
|
+ :src="coverImgUrl"
|
|
|
+ alt="上傳圖片預覽"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </v-col> -->
|
|
|
+ </v-row>
|
|
|
+ </v-form>
|
|
|
+ </v-card-text>
|
|
|
+ </v-window-item>
|
|
|
+
|
|
|
+ <v-window-item :value="4">
|
|
|
+ <v-card-text class="mb-7 finish-step">
|
|
|
+ <p>
|
|
|
+ 請等待後台人員確認您的課程資訊 <br />
|
|
|
+ 您可以前往
|
|
|
+ <router-link to="/user/courses">【我的開課】</router-link>
|
|
|
+ 觀看及修改您的
|
|
|
+ </p>
|
|
|
+ <ul>
|
|
|
+ <li>(1) 據點資訊</li>
|
|
|
+ <li>(2) 工藝家履歷</li>
|
|
|
+ <li>(3) 課程清單</li>
|
|
|
+ </ul>
|
|
|
+ </v-card-text>
|
|
|
+ </v-window-item>
|
|
|
+ </v-window>
|
|
|
+
|
|
|
+ <v-divider></v-divider>
|
|
|
+
|
|
|
+ <v-card-actions
|
|
|
+ class="justify-center flex-column flex-sm-row mt-5 mt-sm-7"
|
|
|
+ >
|
|
|
+ <v-btn
|
|
|
+ v-if="step > 1 && step !== 4"
|
|
|
+ color="gray"
|
|
|
+ variant="outlined"
|
|
|
+ @click="step--"
|
|
|
+ class="px-7 me-2"
|
|
|
+ >
|
|
|
+ 上一步
|
|
|
+ </v-btn>
|
|
|
+ <v-spacer></v-spacer>
|
|
|
+
|
|
|
+ <v-btn
|
|
|
+ v-if="step < 3"
|
|
|
+ color="purple"
|
|
|
+ variant="flat"
|
|
|
+ @click="checkField(step)"
|
|
|
+ class="px-7 ms-2"
|
|
|
+ >
|
|
|
+ 下一步
|
|
|
+ </v-btn>
|
|
|
+ <!-- <div
|
|
|
+ v-if="errorField"
|
|
|
+ class="d-flex align-center text-error mt-3 position-absolute"
|
|
|
+ style="bottom: 15px"
|
|
|
+ >
|
|
|
+ <v-icon icon="mdi-alert"></v-icon>
|
|
|
+ <span class="ms-2"> 尚有欄位未填寫 </span>
|
|
|
+ </div> -->
|
|
|
+ <v-btn
|
|
|
+ v-if="step === 3"
|
|
|
+ color="purple"
|
|
|
+ variant="flat"
|
|
|
+ @click="create()"
|
|
|
+ :loading="loading"
|
|
|
+ class="px-7"
|
|
|
+ >
|
|
|
+ 送出提案
|
|
|
+ </v-btn>
|
|
|
+ <div
|
|
|
+ v-if="errorField"
|
|
|
+ class="d-flex align-center text-error mt-3 position-absolute"
|
|
|
+ style="bottom: 15px"
|
|
|
+ >
|
|
|
+ <v-icon icon="mdi-alert"></v-icon>
|
|
|
+ <span class="ms-2"> 尚有欄位未填寫 </span>
|
|
|
+ </div>
|
|
|
+ <!-- <div
|
|
|
+ v-if="errorEventField"
|
|
|
+ class="d-flex align-center text-error mt-3 position-absolute"
|
|
|
+ style="bottom: 15px"
|
|
|
+ >
|
|
|
+ <v-icon icon="mdi-alert"></v-icon>
|
|
|
+ <span class="ms-2"> 尚未填寫課程時間 </span>
|
|
|
+ </div> -->
|
|
|
+ <v-btn
|
|
|
+ v-if="step === 4"
|
|
|
+ color="purple"
|
|
|
+ variant="outlined"
|
|
|
+ class="mb-5 mb-sm-0 me-sm-3"
|
|
|
+ >
|
|
|
+ <router-link to="/" class="px-7">回到首頁</router-link>
|
|
|
+ </v-btn>
|
|
|
+ <v-btn v-if="step === 4" color="purple" variant="flat">
|
|
|
+ <router-link to="/user/courses" class="px-7"
|
|
|
+ >前往開課專區</router-link
|
|
|
+ >
|
|
|
+ </v-btn>
|
|
|
+ </v-card-actions>
|
|
|
+ </v-card>
|
|
|
+ </v-container>
|
|
|
+</template>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+.proposal-container {
|
|
|
+ .step-title {
|
|
|
+ text-align: center;
|
|
|
+ h5 {
|
|
|
+ font-size: 1.75em;
|
|
|
+ font-weight: 500;
|
|
|
+ letter-spacing: 0.125em;
|
|
|
+ @media (max-width: 600px) {
|
|
|
+ font-size: 1em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ p {
|
|
|
+ font-size: 0.8em;
|
|
|
+ font-weight: 400;
|
|
|
+ letter-spacing: 0.0625em;
|
|
|
+ color: #919191;
|
|
|
+ white-space: normal;
|
|
|
+ @media (max-width: 600px) {
|
|
|
+ font-size: 0.7em;
|
|
|
+ line-height: 1.5em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .step-01 {
|
|
|
+ &.image-preview {
|
|
|
+ height: 17.8125em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .step-02 {
|
|
|
+ &.image-preview {
|
|
|
+ height: 14.6875em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .image-preview {
|
|
|
+ img {
|
|
|
+ height: 100%;
|
|
|
+ object-fit: contain;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .flex-grow-1 {
|
|
|
+ display: none !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .img-list {
|
|
|
+ .item {
|
|
|
+ height: 10em;
|
|
|
+ border-radius: 0.3125em;
|
|
|
+ background-color: #ccc; // 預設灰底
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ background-position: center;
|
|
|
+ background-size: cover;
|
|
|
+
|
|
|
+ @media (max-width: 960px) {
|
|
|
+ height: 20vw;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .sessions-card {
|
|
|
+ border-radius: 1.875em 0.3125em 0.3125em 1.875em !important;
|
|
|
+
|
|
|
+ .v-label {
|
|
|
+ p {
|
|
|
+ width: 5.9375em;
|
|
|
+ text-align: end;
|
|
|
+ line-height: 1.375em;
|
|
|
+ @media (max-width: 600px) {
|
|
|
+ width: 7.6875em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .date-item {
|
|
|
+ display: flex;
|
|
|
+ margin-bottom: 0.625em;
|
|
|
+ p {
|
|
|
+ width: 7.125em;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: end;
|
|
|
+ white-space: nowrap;
|
|
|
+ line-height: 1.375em;
|
|
|
+ @media (max-width: 600px) {
|
|
|
+ width: 7.8125em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .main-table {
|
|
|
+ width: 1000px;
|
|
|
+ margin: 3.125em 0;
|
|
|
+
|
|
|
+ .table-title {
|
|
|
+ font-size: 1.3em;
|
|
|
+ background-color: var(--purple);
|
|
|
+ }
|
|
|
+
|
|
|
+ table {
|
|
|
+ font-size: 1em;
|
|
|
+ thead {
|
|
|
+ border-bottom: 0.125em solid var(--purple);
|
|
|
+ }
|
|
|
+ tbody {
|
|
|
+ td {
|
|
|
+ border-bottom: 0.0625em solid var(--purple);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .finish-step {
|
|
|
+ line-height: 3.125em !important;
|
|
|
+ font-size: 1.375em;
|
|
|
+ text-align: center;
|
|
|
+ letter-spacing: 0.0625em;
|
|
|
+
|
|
|
+ @media (max-width: 600px) {
|
|
|
+ padding: 0;
|
|
|
+ line-height: 2em;
|
|
|
+ font-size: 1em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .type-hint {
|
|
|
+ width: 100%;
|
|
|
+ display: block;
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0.0625em;
|
|
|
+ left: 6.5625em;
|
|
|
+ color: var(--gray);
|
|
|
+ }
|
|
|
+
|
|
|
+ .week-list {
|
|
|
+ height: 70%;
|
|
|
+ align-items: center;
|
|
|
+ li {
|
|
|
+ margin: 0.9375em 0;
|
|
|
+ .item {
|
|
|
+ color: var(--purple);
|
|
|
+ padding: 0.625em;
|
|
|
+ border-radius: 6.25em;
|
|
|
+ border: 0.0625em solid var(--purple);
|
|
|
+ transition: all 0.3s;
|
|
|
+ &:hover {
|
|
|
+ color: #fff;
|
|
|
+ background-color: var(--purple);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ &.active {
|
|
|
+ .item {
|
|
|
+ color: #fff;
|
|
|
+ background-color: var(--purple);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .time-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ p {
|
|
|
+ width: 6.0625em;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+ display: flex;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .school-list {
|
|
|
+ width: 21.875em;
|
|
|
+ margin: auto;
|
|
|
+
|
|
|
+ @media (max-width: 600px) {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .notes-block {
|
|
|
+ padding: 30px;
|
|
|
+ font-size: 1.15em;
|
|
|
+ color: #9b9b9b;
|
|
|
+ background-color: #f9f9f9;
|
|
|
+ border-radius: 5px;
|
|
|
+ p,
|
|
|
+ li {
|
|
|
+ letter-spacing: 0.05em;
|
|
|
+ }
|
|
|
+ li {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ line-height: 1.8em;
|
|
|
+ &:last-child {
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .upload-input {
|
|
|
+ .v-label {
|
|
|
+ opacity: 0.5 !important;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .assign-list {
|
|
|
+ padding: 20px;
|
|
|
+ border-radius: 5px;
|
|
|
+ border: 1px solid #ccc;
|
|
|
+ li {
|
|
|
+ padding: 10px 0;
|
|
|
+ border-top: 1px solid #ddd;
|
|
|
+ &:first-child {
|
|
|
+ border: none;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .v-card .v-card-title {
|
|
|
+ @media (max-width: 600px) {
|
|
|
+ white-space: normal;
|
|
|
+ line-height: 2em;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .resume-btn {
|
|
|
+ width: 120px;
|
|
|
+ height: 120px;
|
|
|
+ border-radius: 100px;
|
|
|
+ background-color: #f6f6f6;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|