# 開工大禮包
## 開始篇(7/5)
### 1. 建立開發環境
> 把Gitlab上的環境clone下來
`$ git clone https://gitlab.com/ncufresh/ncufresh21.git`
### 2. 安裝套件
```
$ npm install
$ npm start
```
## 每日篇
每天我們會定時把大家前一天的成果都merge在一起
### 下午1點開工時
```
$ git checkout master // 切換到master branch
$ git branch -d 名字 // 刪掉前一天建立的branch
$ git pull // 更新master branch
```
### 晚上9點收工時
```
$ git add .
$ git commit -m "今天的工作內容"
$ git pull // 與遠端整合
$ git checkout -b 名字 // 建立自己的branch
$ git push // 將今天的內容push到遠端repo中自己的branch
```
### Notice
進行git操作的時候記得小心,然後確定自己在幹麻!!
不確定的可以去看[之前的教學](https://hackmd.io/_eYoFtsrT52o0cp4Xa7uaQ),或者用`git status`確認
然後記得:
1. 不要在自己的branch pull
2. 不要在master branch push
## 進度篇
### Demo
每個禮拜五下午會是Demo的時間,到時候會讓大家稍微看一下我們這禮拜做了些什麼
### 每週建議進度
* 第一週(7/5~7/9)
熟悉開發流程、開發架構。在開始寫之前先想一下架構。
架構包括前端排版設計、後端資料庫資料設計,哪些地方要寫死、哪些地方要可以更新
* 第二週(7/12~7/16)
後端基本雛型要寫出來,前端排版要大致確定。
* 第三週(7/19~7/23)
大致完成電腦版,並且可以開始思考、實做手機版。
後端要完成到讓企劃組員能夠上資料,這樣之後才能檢查實際上資料後,前端排版跟後端功能有沒有什麼問題。
* 第四週(7/26~7/30)
開始寫手機版,進度比較快的可以開始請企劃組員幫忙測試網站
可以留時間補齊之前沒完成的部份
* 第五週(8/2~8/6)
全力測試網站!!有東西沒完成的也要在這週完成
## 提醒篇
### 技術方面
* 開工第一週應該會不太確定要幹麻,但滿正常的。建議可以先思考一下分頁前後端設計,或者看看前幾屆的Code以及網頁,或許會有些幫助
* 不會寫的功能或動畫要怎麼辦?
1. 問問看神奇的Google大神、Stackoverflow、CSDN
2. 看看前幾屆類似功能是怎麼寫的(Gitlab repo)
3. 問問看組長
* 盡量把程式碼寫的優美、有架構一點,但我相信用Vue的大家這方面應該沒什麼問題(?
* 開發過程可以寫一些註解,之後比較容易看懂自己在寫什麼
* [分頁注意事項](https://hackmd.io/QYN5sZ8iQWav6tumguSwXw)
### 團隊溝通方面
* **溝通、溝通、溝通**,雖然線上遠距這有點困難
* 跟企劃組溝通的時候不要一開始就打槍他們提出的功能,但也不要誇下海口所有提議都接受
* 美工組是你的好朋友,要打好關係
## 參考篇
### 1. 幾次的教學
- [Bootstrap, Sass, Eslint](https://hackmd.io/y0FEN_pMQhmdecu-uY58rw?both)
- [網路基本概念](/OfVaSgDeT4KZpuF-MN5U8A)
- [Javascript](/Zm8s8sZoQZyNEtg7KDDXdw)
- [DOM, Ajax](/@2021ncu-fresh-code/ry9j7CwdO)
- [動畫, RWD, Git](/_eYoFtsrT52o0cp4Xa7uaQ)
- [Vue]
### 2. EJS
* 標籤
* 普通輸出用`<%= %>`
* 只有在輸出html用`<%- %>`
* 不是輸出用`<% %>`
* 註解
* `<% /* 我是不會顯示的註解。 */ %>`
這樣註解才不會被解釋出來
* `<!-- 我是會顯示的註解。 -->`
這樣一般的HTML註解會被解釋出來
### 3. TinyMCE
後端讓企劃組上資料的文字編輯器
[TinyMCE文件](https://www.tiny.cloud/docs/quick-start/)
* 配置
```=
<textarea id="editor"></textarea>
<script src="/tinymce/js/tinymce/tinymce.js"></script> // 加入tinymce的必要套件
<script>
tinymce.init({
selector: 'textarea#editor', // selector要選到上面的textarea
height: 500,
menubar: false,
plugins: [
'advlist autolink lists link image charmap print preview anchor',
'searchreplace visualblocks code fullscreen',
'insertdatetime media table paste code help wordcount'
],
toolbar: 'undo redo | formatselect | ' +
'bold italic backcolor | alignleft aligncenter ' +
'alignright alignjustify | bullist numlist outdent indent | ' +
'removeformat | help',
content_style: 'body { font-family:Helvetica,Arial,sans-serif; font-size:14px }'
});
</script>
```
* 讓TinyMCE更fancy
在toolbar跟plugins調整,詳細可以看官方文件
上方的toolbar是可以客製化的
### 4. Fontawesome
一些好用的Icon
可以到[這邊](https://fontawesome.com/v5.15/icons?d=gallery&p=2)看有什麼Icon可以用
### 5. Multer
上傳圖片用
#### 前端
```=
//name需要為img
<form action="uplaodimg" method="post" enctype="multipart/form-data">
<input type="file" name="img">
<button type="submit">submit</button>
</form>
```
#### 後端
```=
var multer = require('multer');
var storage = multer.diskStorage({
destination:`../public/分頁名`,
filename(req, file, callback) {
cb(null,file.originalname);
}
})
var upload = multer({storage:storage});
//上傳單一圖片
router.post('/uploadimg',upload.single('img'),(req,res,next)=>{
//req.file可以get到圖片的各種資料
})
//上傳多張圖片
router.post('/uploadimg',upload.arrays('img'),(req,res,next)=>{
//req.files可以get到圖片的各種資料
})
/*******注意路徑********/
<img src="........">
//刪除
fs.unlink(req.file.path, (err)=>{
if(err){return next(err)};
})
```
### 6. check-user.js
檢查使用者狀態
```=
module.exports = {
isLoggedIn:
function(req, res, next){
if(!req.isAuthenticated()){
return res.redirect('/login');
} else {
next();
}
},
isAllowtoLogin:
function(req, res, next){
if(req.isAuthenticated()) {
return res.redirect('/');
} else {
next();
}
},
isAdmin:
function(req,res,next) {
if(req.isAuthenticated() && req.user.role === "admin" ){
return next();
} else {
return res.redirect('/');
}
}
}
```
#### 用來當作middleware檢查使用者狀態
```=
var checkUser = require('./check-user');
router.post('/edit', checkUser.isAdmin, function(req, res, next) {
...
})
```