---
# System prepended metadata

title: 開工大禮包

---

# 開工大禮包

## 開始篇(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) {
...
})
```