您好! === # 開發環境 以下為主要使用的開發環境 ## Node.js javascript執行環境 :::success [參考文件](https://ithelp.ithome.com.tw/articles/10191513) ::: ### nvm 可切換nodejs版本 有些專案是版本16或版本18 通常建議不要安裝到最新版本,有些套件會跟不上nodejs版本,而產生衝突。 :::success [參考文件](https://ithelp.ithome.com.tw/articles/10340399) ::: ### npm 執行指令、安裝套件 套件可讓開發變容易,盡量使用下載數高且持續有在更新的套件。 比較有變化性的功能,如:輪播圖片,安裝套件會比較方便。 安裝套件時,可以盡量找下載量大,更新時間短的。 :::success [參考文件](https://medium.com/@Hsu.Yang-Min/npm-node-package-manager-2e53c66f83bb) [npm套件查找](https://www.npmjs.com/) ::: ## 前端 :::info 一般使用者操作的網站畫面,EX:官網 ::: :::danger 注意: 會有兩種呈現資料的方式 1. json:從後台拿到生成出的json,會由後台管理者修改或新增,EX:各文章內容 2. api:短時間內會持續更新,後台管理者無法控制,EX:文章的瀏覽次數 * 表單用api方式 ::: ### React :::success [官方文件](https://react.dev/learn) ::: * 分為class、functional,主要使用functional * 使用TypeScript 增加程式碼的可讀性和可維護性 ### Nextjs react的其中一個框架 (先學習這個,主要使用此作為開發) :::success [官方文件](https://nextjs.tw/learn/foundations/about-nextjs) ::: ### Gatsby (新北投票網專用) react的其中一個框架 (先學習上述的nextjs,這個可以擺最後面。) :::success [官方文件](https://www.gatsbyjs.cn/docs/recipes/) ::: ### 檔案說明 * `.env`:前後端都會有的,設定系統變數,EX:DB連線、第三方(google、line)參數 * `README.md`:前後端都會有的,專案說明,包含安裝、開發、測試步驟、注意事項,任何關於此專案補充說明也可以填入。 * `package.json`:管理套件、紀錄指令,忘記指令可以在這裡執行。 ```json= { "scripts": { "dev": "next dev -p 3006", } } ``` 在終端機下: ```shell= npm run dev ``` * 資料夾與作用: ```= - api 傳遞至後端 - components 元件 EX:表單、欄位、頁籤等 - page 頁面、網站路徑 - provider 需要放在最上層的狀態、通常是回到頂端功能 - public 公用檔案外部可以訪問 - styles 共用css、系統css - template 版面 - utils 小工具 ``` ### 建議 * 表單送出可以使用onSubmit,可以客製化表單需檢查欄位或送出的後續動作。 ```javascript= const handleSubmit = (e) => { e.preventDefault(); ... } <form onSubmit={handleSubmit}> </form> ``` * 預防DOM預設事件 * EX:`<a>`元素使用onclick做觸發事件,但`<a>`本身預設會跳轉頁面,避免預設事件的發生,加上`e.preventDefault()`。 ```javascript= const handleClick = (e) => { e.preventDefault(); ... } <a href="#" onClick={handleClick}></a> ``` * 小元件可以自己刻出來,像是loading的畫面,不複雜、各頁面或專案通用;過於複雜的可以找套件使用像是輪播圖片 ## 後端 :::info 任何DB動作、接收前端表單、驗證資料 ::: ### Express nodejs的後端框架 :::success [官方文件](https://expressjs.com/en/starter/installing.html) ::: ### 檔案說明 * `.env`:前後端都會有的,設定系統變數,EX:DB連線、第三方(google、line)參數 * `README.md`:前後端都會有的,專案說明,包含安裝、開發、測試步驟、注意事項,任何關於此專案補充說明也可以填入。 * `package.json`:管理套件、紀錄指令,忘記指令可以在這裡執行。 ```json= { "scripts": { "dev": "next dev -p 3006", } } ``` 在終端機下: ```shell= npm run dev ``` :::danger 注意: 1. 敏感資料存入DB都需要做加密,EX:身分證、電子郵件、地址、電話 2. README.md要寫每個api的規劃,方便前端知道要傳遞什麼body、header、Type;有任何欄位變動要跟前端溝通,避免前後不一。 ::: * api的規劃範例: ![1709276878175](https://hackmd.io/_uploads/SyY11Wy6p.jpg) ### 流程 大致的流程 1. 檢查傳遞格式 2. 檢查欄位型態、是否存在值 3. 回傳資料 資料夾與作用: ```= - controller 每個api分配功能的地方 - route 每個api的進入點 - middleware 檢查格式、防呆(有效時間內、) - services 處理資料的邏輯 - model 資料表 - repository 取資料的地方 - utils 小工具,例如polyfill ``` ## 後台 :::info 網站擁有者上稿、網站設定 EX:新增最新消息內容 需生成json檔給前端使用 ::: 用Next.js方式 與前端相似 但使用pages/api作為表單api :::success [官方文件](https://nextjs.org/docs/pages/building-your-application/routing/api-routes) ::: ## MySQL資料庫 [MySQL] 1. 資料表命名與欄位命名為一律小寫,用底線連結,例:member_message 2. 資料表命名需多加efa_以做為公司專案辨識 3. 設計資料表前先畫 ERD圖,可幫助瞭解資料間的關係 4. 資料表所有欄位都需寫中文註解,包含資料表本身 5. 所有欄位都需給預設值,依照資料量多寡給予合適的資料型態,並加上索引值 http://n.sfs.tw/content/index/10266 6. 承上,若數字型態不會使用到負值,則用unsigned 7. 資料庫引擎使用InnoDB,編碼使用utf8mb4_unicode_ci;若資料表需有大量資料要篩選,資料庫引擎可考慮用MyISAM或Memory 8. 資料庫管理工具,可使用 phpMyAdmin 或 adminer.php # 可安裝軟體 :::danger 注意:不得安裝大陸出品或破解版軟體。 ::: ## Git、TortoiseGit 任何專案都使用git來控制管理 1. `git clone` 取得專案到自己電腦 2. `git pull` 更新有專案內容 3. `git add` 選擇推送內容 4. `git commit` 寫該版本資訊 5. `git push` 推送自己更動的內容 :::danger 注意:建議先pull再push,避免已經有人先推送,而發生衝突。 ::: ## Putty 可連線到遠端伺服器 ## Vscode code編輯器 (可依個人習慣安裝自己熟悉的編輯器) 推薦安裝的擴充套件: 1. `Codeium` 幫助編寫程式的AI工具(必裝) 2. `ESLint` 提高前端程式碼品質 3. `Prettier` 自動格式化程式碼 4. `Live Sass Compiler` 編譯scss 5. `Auto Rename Tag` 自動修改成對的Tag 6. `Bookmarks` 快速跳至書籤位置 7. `Playwright` 自動化測試工具 ## Postman 測試API的工具 # coding習慣 1. 盡量打上註解,以便未來的維護 2. 用自動排版,好閱讀,在vscode用 shift + ctrl + f,可以自動排版。 3. 處理重要邏輯請加try-catch ,並把錯誤拋出寫入log檔中,之後要debug才會比較方便。 4. 可以嘗試先寫註解再寫程式碼:先把邏輯流程寫出來,再填入程式碼,可以更清楚看懂整個架構。 5. HTML / Javascript / CSS 的註解是可被任何人看到,所以請斟酌填寫重要資訊。 # 其他 1. 更新到測試站或正式站上時先自己測過一次,然後再請測試人員或PM測試。 2. 有任何資料表的異動一定要記下SQL語法,之後要更新到測試站和正式站上時比較方便。 3. 有學到新的東西一定要做筆記紀錄起來,用資料夾或檔案分門別類,方便以後可以快速找到 4. 可複製的程式碼或指令就盡量用"複製、貼上",因為自己手打出錯的機率會較高。 5. 個人資料一定要定時做異地備份(雲端或NASA上),正在開發中的專案程式碼和資料庫可備份到公司NASA上 6. 學習研究若要發表至個人部落格上或網上發問,請移除跟公司、專案相關文字,因政府專案都會簽保密條款,以免有爭議。 7. 程式撰寫或資料庫設計不要求寫得非常精美或高深,需考慮開發成本、維護成本等因素,可以讓人看得懂、可方便維護才是比較重要的。 8. 資料夾都是以小寫命名(EX:user),檔案用駝峰式名命(動詞小寫,名詞大寫,EX:creatUser)。 :::info 有任何問題都可以詢問喔! ::: 來玩看看吧 === :::danger 以下都需要用react next.js的環境 ::: # TimeLine 畫面可以引用此: https://codepen.io/itbruno/pen/KwarLp 需求: 1. 畫面進來只會看到每個timeline的標題,描述不顯示 2. 點擊該timeline標題,顯示出該timeline的描述 3. 再點一下,將其收合 進階: 1. 只能出現一個描述,EX:點擊time1標題,出現time1描述;點擊time2,出現time2的描述,但time1的描述必須收起來。 ![1710228662078](https://hackmd.io/_uploads/Sk1AEtTTa.jpg) # input select 需求: 1. 兩個 input select 2. 第一個select將會控制第二個select顯示什麼 3. EX:選擇select_1 value=第二個,select_2只能顯示cate=2的選項 注意:select_1的id對應select_2的cate ```javascript= const select_1 = [ { id: 1, value: "第一個" }, { id: 2, value: "第二個" }, { id: 3, value: "第三個" }, ] const select_2 = [ { id: 1, cate: 1, value: "第一個的子選項1" }, { id: 2, cate: 1, value: "第一個的子選項2" }, { id: 3, cate: 1, value: "第一個的子選項3" }, { id: 4, cate: 2, value: "第二個的子選項1" }, { id: 5, cate: 2, value: "第二個的子選項2" }, { id: 6, cate: 3, value: "第三個的子選項1" }, ] ``` # postman 請嘗試用postman方式回傳資料給next.js 的 pages/api 能在postman接收到 pages/api return的資料就可以了 # DB 嘗試在本機建立mysql,讓next.js連上,與可以顯示DB裡table資料 可以用xampp建立mysql。 以後會是先用自己的本機環境測試,再上傳到測試站再次測試 # jquery套件 可參考以下畫面 https://codepen.io/Rowno/pen/kvLQex 1. 安裝jquery套件 (可以自己選擇好用的套件) 2. 用套件實現圖片輪播 3. 需要可以自動撥放