Ting-Jun (snsd0805)

Ting-Jun (snsd0805)

Developer. Student

© 2019

[工程日誌]教官室宿舍新生申請系統

最近教官室找我建宿舍的新生申請系統
準備要在7月新生報到的時候使用。
這次要用設計模式寫,畢竟設計模式的書看了很久還是沒有實作過,
這次就當作練功。然後同樣在這篇寫下過程。

日誌

2018 3/29

從段考後到今天看了一下指導老師給的Design Pattern(設計模式)的範例,
工廠模式的物件丟來丟去真的很難看懂,
很難搞懂工廠和產品為什麼要這樣丟。
雖然前幾天就想寫下一些心得和思考方向,
可是一看了文件然後稍微寫了程式碼,
不注意就已經一兩點了,所以一直沒有時間寫工程日誌。

Design Pattern,包含工廠模式、裝飾者模式等等模式,
我之所以想要學設計模式是因為以前用物件導向寫的系統不容易維護,
常常要修改或新增功能時就要去翻舊的code並且修改,
其實這並不符合物件導向所謂的封閉原則,
而看過指導老師寫的code,就會發現他寫的code非常方便維護
只要另外新增物件,並且聚合到原有程式碼就可以了
方便維護就是Design Pattern最吸引我的地方。

以下是我看過範例後依照自己想法寫出來的設計模式架構,
因為是第一次寫所以可能會有很多不適當的地方。

index.php(舉例,呼叫工廠模式client端的網址)

Client_Order.php(每當實例化client端時,__construct就新增一個工廠,並且傳回client對應的產品)

Product_Order.php(各個產品,當實例化產品時,將介面內容回傳)

指導老師一直說要對介面寫程式,
一開始聽不太懂什麼意思,但今天實際寫過一遍終於是比較有概念了。
加上上次meeting過後,有稍微跟老師聊了一下科學班成績系統的code
懂了更多關於前後端分離的概念,這次應用在設計模式上,
感覺有比以前好多了

另外因為這次要連前端的頁面都自己寫,
所以這幾天也花了不少時間在研究前端,
因為覺得前端很麻煩,所以都懶得學CSS或JS
現在才覺得以前真是不應該XD

突然想起來以前有跟學長學過bootstrap玩了一陣子,
所以決定前端介面就用bootstrap來寫,
昨天加上今天兩天的時間,已經把系統中的申請表格以及列表都完成
因為是比較簡單的系統,本來應該很快就能完成了
但是耗了超過大半的時間都在寫前端,
前端真的很討厭耶!!
邊coding還要一邊翻文件找元件的code,
真的快吐血了XD

這次就只是當作設計模式的練功,
目前把表單和列表都完成了,過幾天去demo給教官看看應該就算完成了
當然前提是沒有要另外加麻煩的功能…


(2018 03/29 23:30 update)

2018 3/31

今天拿去給教官看,一開始說沒問題,
但是晚上就mail給我要修改的部份,
增加一些功能還可以理解,例如:讓個人可以列印pdf表單以及全資料列表。
但是最討厭的是要改運作模式,
一開始是說要在新生報到時架設電腦讓新生填報,
但是現在說要改成開放系統讓學生可以在家裡就上網填報
這樣就要增加登入的部份,
這樣連資料表也要跟著更改了,
想到還要增加session就覺得煩,
雖然工作起來是很簡單的事情,
可是現在就是覺得很不開心。

雖然不開心,但今天還是有一些動作了,
今天弄好了匯出PDF檔案的部份,
使用了TCPDF的函式庫,
使用函式大致如下(使用了各式學習紀錄的程式碼)

require_once('Acada-tcpdf_min-master/tcpdf.php');
$text = "PDF輸出";
$pdf = new TCPDF("P", "mm", "A4", true, "UTF-8", false);
$pdf -> setPrintHeader(false);						//是否有header
$pdf -> setPrintFooter(false);						//是否有footer
$pdf -> setAutoPageBreak(true);						//是否自動分頁
$pdf -> setFontSubsetting(true);					//產生字型子集
$pdf -> setFont('droidsansfallback','','10','',true);	//設定字型
$pdf -> addPage();										//新增頁面
$pdf -> writeHTML($content);								//撰寫內容
$pdf -> Output('test.pdf', 'D');						//輸出

而因為TCPDF的預設字型無法與繁體中文相容,
因此必須使用自訂字型的方式,
但在網路上搜尋的將ttf檔轉成fonts可讀取檔案的方法都不可行,
目前推測是該轉檔函式已經有修改或者是與筆者的系統不相容,
確切原因還沒有找到。
而本篇選用droidsansfallback字型,
它是Android的中文繁體原生字體,
字體的結構與筆者常用的文泉驛微米黑相同。
一開始我是下載該字型的ttf檔,並且使用網路上的code
欲將其轉檔成可用的檔案

require_once('../tcpdf.php');
$font = TCPDF_FONTS::addTTFfont('DroidSansFallback.ttf');

雖然並沒有出現500error,但是仍然沒有結果檔案出現。
一開始懷疑是檔案位置錯誤,但先後試了好幾次還是失敗,
最後選擇放棄。
經過多番尋找仍然沒有看到相關的資訊,但被我翻到了@liuning587的github
裏面正好有轉檔過後的檔案,馬上pull下來使用。
感恩讚嘆liunung587!!感恩讚嘆Github!!
字型的問題是處理好了,
但是如何將html檔案正確的轉成pdf檔則有待明日再研究,
因為今天的實品仍然無法將文字排版在正確的地方。


(2018 04/04 00:15 update)

2018 4/01

今天睡到中午才起來,因為昨天太晚睡了,
起床後就幫忙推友刷票,本來刷到搖A 85號,
可惜那天不能去QQ。

今天依舊是假日常有的進度,
增加了登入介面,因為要增加登入,改了資料表的許多地方。
用登入的STU_LOGIN的uid與STU_LIST的uid欄位交叉比對,
再用STU_LIST的Id和其他張表比對。

為了這個部份,整個系統分析都要全部重來,
寫到最後後端的Datamenger.php被我搞到我快看不懂了。
今天遇到的麻煩就是session的處理,
因為是第一次寫設計模式,
所以常常會忘了哪個介面已經放了session_start()
常常就會有error跳出來,
今天大概就是被系統規劃和session搞到快要瘋掉,
工程師就是這種時候最讓人頭疼……。
今天進度就是這種假日進度慢到爆炸,
明天會繼續研究PDF的產出。


(2018 04/02 00:15 update)

2018 4/02

今天完成了PDF檔下載的部份,
因為是要將HTML移植到PDF上,所以使用writeHTML()函式,

$pdf->writeHTML($html, $ln=1, $fill=0, $align='');
/**
* ***本處謹紀錄筆者使用到的屬性***
 * $html:放HTML內容
 * $ln:下一個元件的位置(0 右 1下行左 2下)
 * $fill:是否填色
 * $align:對齊方向(L C R)
 */

但是因為我很不會寫HTML,
所以排版就花了不少時間,
加上一直處理還沒有解決的session_start()問題,
另外還有重複include php文件的問題,
include的問題找了一下資料很快就解決了!
不知道是不是基礎不扎實的關係,
其實只要把include改成include_once就可以解決了…

其實看了下前幾天寫的日誌,
覺得很多重點都沒有紀錄到,
但現在卻也都無法想起來並補上,
沒有在發生問題時馬上紀錄是個問題,
腦袋被過度燃燒似乎也是個問題。
這個系統其實是個很簡單只有填表單的系統,
頂多只是加幾個其他的功能罷了。
只是自己的心情似乎愈來愈浮躁,
可能是因為中途被告知要更改系統架構所引起的吧…

明天把管理員介面寫完應該就差不多了吧!
就是加個輸出excel檔的function……

(2018 04/03 00:15 update)

2018 4/04

昨天沒有任何進度,下午本來有Meeting,
不過被放鴿子…
下午回到家以後就頹廢接著看書。
最近真的遇到撞牆期,有一種技術上一直卡在同一個地方的感覺。
一直想要看paper讓腦袋多點新東西,
無奈已經高二,好像也沒有什麼時間了。

今天會完成最後兩個個部份,輸出excel和學生資料的上傳。
輸出excel檔會使用到PHPExcel函式庫
只要從github將檔案pull下來,接著就可以引用Classes裡面的PHPExcel.php文件,
實例化PHPExcel類別就可以使用。

$objPHPExcel = new PHPExcel();//實例化PHPExcel類別
$objSheet=$objPHPExcel->getActiveSheet();//選取操作的sheet
$objSheet->setTitle("宿舍申請清單");//命名當前的sheet
$objSheet->setCellValue("A1","姓名");//將內容填入欄位

header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename=彰化高中宿舍申請清單.xls');
header('Cache-Control: max-age=0');
//設定輸出檔案相關變數
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
//按照指定格式生成excel檔
$objWriter->save($dir."/demo.xlsx"); //儲存資料


接著admin登入的介面很快就可以寫完,大概花了10分鐘就好了。
另外學生資料的上傳直接使用上次系統用的csv上傳就可以了。
今天大概就這樣,再來可能要改掉原本Datamanger.php裡的後端作業,
因為怕會有SQL Injection,要改成用PDO的prepare前置作業,
一直以來都是用PDO寫資料庫處理,
只是一直沒有使用PDO防SQL Injection的優點。

(2018 04/03 00:15 update)