專案程序-20090419

功能性規格

    • 故事1:「要能夠辨識登入的帳號跟人名啊!」

    • 故事2:「這個帳號要跟主系統相同,不需要再登入了。」

    • 故事3:「選擇的標註要能儲存並顯示。」

繼之前的前端介面,加入一些跟資料庫相關的功能。之後再慢慢加上其他功能吧,如果物件導向架構寫得好的話,是不怕多一個屬性或少一個屬性的!

技術性規格

    • 你有一個標註工具了!這個標註工具能夠得知「現在的網域(host)」、「這個網址(uri)」、「使用者的帳號(String userID)」、「使用者的名字(String userName)」、「選擇標註的範圍(Array highlightScope)」,但他還不能跟資料庫互動。

    • 首先我們要先訂出資料庫中的架構。每個資料表前面應該都要有prefix_name,只是我們此時先省略。

    • 使用者權限相關的資料表:

            • host

            • (主機名+網域,區隔權限的重要根據)

                • SERIAL id (PrimaryKey, IndexKey)

                • text host NOT NULL

            • 預設的值

                • array(0, "*")

            • user

            • (使用者,要注意到不同主機上可以有相同名稱的使用者,還好他們不會因此搞混。)

                • SERIAL id (PrimaryKey)

                • int host_id (ForeignKey host.id) NOT NULL

                • text host_user_id NOT NULL

                • text host_user_name DEFAULT "user"

                • text password DEFAULT ""

                • int role (ForeignKey role.id) DEFAULT 2 //user

            • 預設的值

                • array(0, 0, "root", "KALS ROOT", "kalsroot", 0) //管理者

            • role

            • (設定可以執行的角色)

            • 預設的值

                • array(0, "root") //可以作設定所有人的權限

                • array(1, "administrator") //可以設定相同主機使用者的權限

                • array(2, "user") //只能發言

                • array(3, "guest") //連發言都不行了

            • group

            • (使用者的群組)

                • SERIAL id (PrimaryKey)

                • int host_id (ForeignKey host.id) NOT NULL

                • text name DEFAULT "misc" //意思是五花八門的

            • user2group

            • (使用者與群組的關聯)

                • SERIAL id (PrimaryKey)

                • int user_id (ForeignKey user.id) NOT NULL

                • int group_id (ForeignKey group.id) NOT NULL

            • policy

            • (權限設定,根據網域、)

                • SERIAL id (PrimaryKey)

                • int resource_type DEFAULT 0 //0=groud.id; 1=user.id

                • int resource_id (ForeignKey 依據上面的規則決定)

                • text privilege DEFAULT ""

                • int action DEFAULT 0

                • //0=不可讀取其他人的annotation

                • //1=不可寫入,但是可以讀取annotation

                • //2=不可寫入也不可讀取……也就是暫時鎖定某些頁面

                • boolean enable DEFAULT TRUE

    • (待新增)

    • 與anntation相關的資料表:

            • annotation

            • (記錄一筆一筆的標註)

                • SERIAL id (PrimaryKey)

                • int uri_id (ForeignKey annotation_uri.id) NOT NULL

                • int user_id (ForeignKey user.id) NOT NULL

                • int class_id (ForegnKey annotation_class.id) DEFAULT 0

                • text comment DEFAULT ""

                • timestamp time DEFAULT LOCALTIMESTAMP //新增的時間

                • int reply DEFAULT NULL (ForeignKey annotation.id) //回覆對象

            • annotation_scope

            • (記錄每筆標註的範圍)

                • SERIAL id (PrimaryKey)

                • int annotation_id (ForeignKey annotation.id) NOT NULL

                • int start NOT NULL

                • int end NOT NULL

            • annotation_class

            • (標註的類型)

                • SERIAL id (PrimaryKey)

                • text class NOT NULL

            • 預設的值

                • array(0, highlight)

                • (其他要新增什麼……請看設定檔!)

            • annotation_uri

            • (標註的網址)

                • SERIAL id (PrimaryKey)

                • int host_id (ForeignKey host.id) NOT NULL

                • text uri NOT NULL

            • annotation_search

            • (全文檢索用,詳細設定參考此網頁)

                • SERIAL id (PrimaryKey) (ForeignKey annotation.id)

                • tsvector comment_fti //評論的內文

    • (待新增)

(尚未完成,以下只是草稿!)

    • 你會有一個網頁,網頁內只有特定部份需要進行標註。你可以輸入DOM指定物件來選擇要標註的範圍。

    • 範圍內每一個字都成為標註的單位,註明位置的ID編號,除了空格之外。

    • 承上,但是英文的話則必須以空格切割,一個單字是一個標註的單位。

    • 選擇取完之後,選取範圍最後一個字下方會顯示一個選單,可供讀者選擇接下來的動作。

    • 請設計一個「Highlight」的按鈕,讀者按下去之後會對伺服器送出讀者選擇的範圍,也就是起始的ID位置跟結束的ID位置,請以二維陣列的方式送出,以供未來可以支援多範圍的選取。

    • JavaScript的檔案將以PHP寫成,以便支援後端的操作。

    • JavaScript必須實作一個測試的機制,像是PHPUnit那樣的統一測試工具。PHPUnit的功能在書中有詳述。 (未完成)

設計階段

本階段以功能實做為主,介面設計待之後專案程序再進行。

建構階段

  • 設計一個JavaScript檔案,並且給予引入。

  • 最後將JavaScript檔拆開放入CodeIgniter的架構,並適當地使用viewlang的功能。

建構階段中參考的網址如下:

    • PostgreSQL China:PostgreSQL 8.3 以上的中文全文索引使用介绍

    • (其他待補)

待辦事項 (皆完成

    • 研讀極致軟體製程(eXtreme Programming)

    • 把KALSJS的每個tag的class設計成具有統一的prefix吧!

    • 來作個JavaScript的測試環境吧。由於測試方式沒辦法由程式來主動進行,所以必需要由系統指示使用者操作,然後看操作成果是否能成功。我們來寫一個簡單的範例來測測看之前的成品,看它能不能顯示出正確的座標位置吧。

結案

很遺憾的是這次比較趕著把大部分功能做完,這次階段說明並沒有很完整的文件。看完極致軟體製程之後,其實覺得這麼仔細地寫專案說明好像也頗多餘,還是用測試案例來溝通吧!

以下附件附上這次的製作成果,可以參考看看!