diff --git a/server/api.js b/server/api.js
index 0754d9d..23b4fdd 100644
--- a/server/api.js
+++ b/server/api.js
@@ -117,14 +117,6 @@ router.use(session(sessionOptions));
// ========================================
-router.route("/HAHAHAH").post(express.urlencoded({extended:false}),
- (req, res, next)=>{
- console.log(req.body);
- let {flag} = req.body;
- console.log(flag);
- res.status(200).end();
- }
-)
router
.route("/session")
.get(
@@ -944,6 +936,15 @@ router.get(
})
);
+router.get(
+ "/selections.json",
+ permissionRequired(constants.AUTHORITY_MAINTAINER),
+ asyncHandler(async (req, res, next) => {
+ const selections = await model.Selection.find({}, {courseID: 1, userID: 1, name: 1, ranking: 1, _id: 0}).exec();
+ res.send(selections);
+ })
+);
+
router.post(
"/importCourses",
express.json({ strict: false }),
diff --git a/src/containers/main/Cards/CardMarkdown.js b/src/containers/main/Cards/CardMarkdown.js
new file mode 100644
index 0000000..cdad289
--- /dev/null
+++ b/src/containers/main/Cards/CardMarkdown.js
@@ -0,0 +1,76 @@
+import React from "react";
+import { makeStyles } from "@material-ui/core/styles";
+import Grid from "@material-ui/core/Grid";
+import Avatar from "@material-ui/core/Avatar";
+import Typography from "@material-ui/core/Typography";
+import MDEditor from "@uiw/react-md-editor";
+
+const useStyles = makeStyles((theme) => ({
+ title: {
+ padding: "10px",
+ textAlign: "center",
+ },
+ avatar: {
+ margin: "0 15px",
+ color: "white",
+ width: theme.spacing(4),
+ height: theme.spacing(4),
+ // width:'10%',
+ },
+ gridStyle: {
+ marginTop:"6%",
+ display: "flex",
+ justifyContent: "flex-start",
+ flexDirection: "row",
+ alignItems: "center",
+ // padding: "5px 0px"
+ },
+ subtitle: {
+ // color: "white",
+ margin: "auto 0",
+ textAlign: "center",
+ fontSize: "1.2rem",
+ },
+ paragraph: {
+ width: "100%",
+ color: "white",
+ textAlign: "start",
+ fontSize: "16px",
+ padding: "10px",
+ opacity: ".8",
+ lineHeight: "1.8",
+ textIndent: "32px",
+ letterSpacing: "1px",
+ },
+}));
+
+export default function Card(props) {
+ const classes = useStyles();
+ const { title, icon, description } = props;
+
+ return (
+
+
+
+ {title}
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/containers/main/ExplanationSection.js b/src/containers/main/ExplanationSection.js
index fa81cc9..d8f9a5d 100644
--- a/src/containers/main/ExplanationSection.js
+++ b/src/containers/main/ExplanationSection.js
@@ -10,7 +10,12 @@ import { makeStyles } from "@material-ui/core/styles";
import Typography from "@material-ui/core/Typography";
import BatteryAlertIcon from "@material-ui/icons/BatteryAlert";
import BatteryCharging20Icon from "@material-ui/icons/BatteryCharging20";
+import BatteryCharging30Icon from "@material-ui/icons/BatteryCharging30";
+import BatteryCharging50Icon from "@material-ui/icons/BatteryCharging50";
import BatteryCharging60Icon from "@material-ui/icons/BatteryCharging60";
+import BatteryCharging80Icon from "@material-ui/icons/BatteryCharging80";
+import BatteryChargingFullIcon from "@material-ui/icons/BatteryChargingFull";
+import AssistantPhotoIcon from "@material-ui/icons/AssistantPhoto";
import Card from "./Cards/Card";
import Card2 from "./Cards/Card2";
@@ -18,6 +23,7 @@ import Card3 from "./Cards/Card3";
import Card4 from "./Cards/Card4";
import Card5 from "./Cards/Card5";
import Card6 from "./Cards/Card6";
+import CardMarkdown from "./Cards/CardMarkdown";
const useStyles = makeStyles(() => ({
root: {
@@ -83,10 +89,44 @@ const StyledDotGroup = styled(DotGroup)`
margin-bottom: 3%;
}
`;
-const message = `選擇課程後,對所有教授設置志願序。全部為高年級優先,後續事宜交由加簽處理。 `;
-const message2 = `對所有時段設置志願序。無特定年級優先,後續事宜交由開學後的實驗meeting處理。 `;
-const message4 = `通常是全部選上,若遇到需要抽籤情況,抽籤方式為 "隨機+人工篩選" 。人工篩選:若學術部判定隨機抽籤的結果會引起爭議時,我們會考慮年級、十選二修課紀錄等等情節,手動調整並將修課機會合理地讓給未來較無機會再修習的人。`;
-const message5 = `演算法會進行兩次分發,會先以每人選只能選上一門課為前提先做第一次分發,分發完再利用剩下的空位再分發一次。
第一次分發會先把上限設為保障名額數,以該年級為優先進行分發;第二次分發再開放剩餘名額,並調整為無特定年級優先,即可保障該年級人數能盡可能到達保障人數。(但如果選該課的保障年級學生人數很少,可能就不會到達保障名額人數)選中數電實驗的人算選中一個選項,因此抽籤時不會參加到十選二的第一次分發。
本學期**網路與多媒體**設有**特定年級優先**;**電磁波**設置年級保障名額。電力電子預選只會開放18個名額;剩下的名額由加簽或教授決定。`;
+
+const message2 = `- 請對所有時段設置志願序(每個時段的上限人數為 50人),無特定年級優先。
+- 在預選後,如您欲更換時段,請您找好能與您更換時段的同學。請直接來信與實驗課林冠中助教聯繫 ([calculus365@yahoo.com.tw](mailto:calculus365@yahoo.com.tw)) 並副本 (CC) 給另一位同學,這樣助教才會處理,謝謝。
+- 若未參加預選的同學,屆時將由助教們統一安排時段。
+- 參加系上實驗課預選,並不代表電子學實驗(二)、電路學實驗這門課會出現在您的課表上,請務必進入學校選課系統點選電子學實驗(二)、電路學實驗這門課,這樣才算數,期末才會有成績。
+- 電子學實驗(二)與電路學實驗之第一次上課時間與地點將會在開學前另行公告。`;
+
+const message3 = `選擇有興趣的實驗並設置志願序。
+
+- 請先詳細閱讀**十選二實驗規定**。部分課程有相關先修規定。
+- **[注意]** 今年電磁波實驗會針對兩個時段 (周二早上、周三早上) 各設置一個志願,請同學考量自身時間狀況進行志願的排序,系統會自行判斷不會同時選上兩個時段之電磁波實驗。
+- 可設置0~10個志願序 (不含數電實驗、有兩個電磁波實驗),所有志願序都有可能選上。
+數電實驗另開Google表單,3人組隊報名。表單開放時間與預選系統相同。
+- 所有學生至多選上2門實驗,包含數電實驗。
+- 抽籤作業流程:(A)數電實驗抽籤 → (B)志願序抽籤
+
+十選二實驗規定:[https://reurl.cc/VRx3Gy](https://reurl.cc/VRx3Gy)
+
+課程表:[https://reurl.cc/pZN52e](https://reurl.cc/pZN52e)`
+
+const message4 = `通常是全部選上,若遇到需要抽籤情況,抽籤方式為**隨機**。
+
+數電實驗表單:[https://forms.gle/nHBXNxA4RP1Ajvts6](https://forms.gle/nHBXNxA4RP1Ajvts6)`;
+
+const message5 = `- 演算法會進行兩次分發,會先以每人選只能選上一門課為前提先做第一次分發,分發完再利用剩下的空位再分發一次。
+- 第一次分發會先把上限設為保障名額數,以該年級為優先進行分發;第二次分發再開放剩餘名額,並調整為無特定年級優先,即可保障該年級人數能盡可能到達保障人數。(但如果選該課的保障年級學生人數很少,可能就不會到達保障名額人數)
+- 選中數電實驗的人算選中一個選項,因此抽籤時不會參加到十選二的第一次分發。
+- 本學期**自動控制、半導體**設有**特定年級優先**;**光電**設置**年級保障名額**。
+- 本學期電力電子預選只會開放18個名額;剩下的名額由加簽或教授決定。`
+
+const message6 = `1. 每個人的起始優先度是 0
+2. 優先度會受到該選項的志願序影響,如果你將課程中的某個選項設為第X志願,你的優先度將會減X(簡單來說,志願放越前面越容易上)
+3. 如果遇到有高年級優先的課,根據你是 X 年級優先度加 X*20 (4 年級以上算 4 年級)
+4. 如果是大 X 優先而且你是大 X,則你的優先度加 20。
+5. 在產生課程選項志願的時候,會從優先度高的人開始抽。若有一群學生優先度相同則random排序進行分。
+
+演算法詳細說明: [Github](https://github.com/NTUEEInfoDep/NTUEECourseWebsite2021/blob/2022-fall/distribute-server/README.md)`
+
export default function Explanation() {
const classes = useStyles();
const isMobile = useMediaQuery({ query: "(max-width: 480px,)" }); //只是控制頁數和上面的選擇器無關
@@ -120,20 +160,10 @@ export default function Explanation() {
// dragEnabled={false}
>
- {/*
-
-
-
- */}
-
-
@@ -141,50 +171,39 @@ export default function Explanation() {
-
+
-
-
- {/*
-
-
-
- */}
- {/*
-
-
-
- */}
-
+