作任何開發前咱們都要作一個產品的規劃,公司通信錄雖然看起來很簡單,可是這個步驟依然少不了。php
通信錄的功能:
1. 後臺通信錄管理,包括分級、錄入、修改、刪除;
2. 後臺日誌查詢,包括後臺操做記錄和前臺修改記錄;
3. 公司員工微信帳號與通信錄綁定;
4. 已綁定帳號可查詢;
5. 部門、關鍵詞等查詢;
6. 前臺已綁定帳號可更新本身信息。前端
前臺邏輯圖:數據庫
數據庫的設計segmentfault
員工表:序號、姓名、工號、照片、性別、生日、手機、電話、部門、郵箱、微信號、員工狀態數組
部門表:序號、部門名、上級部門序號、部門狀態瀏覽器
日誌表:序號、操做內容、操做時間、操做人、操做類別緩存
管理員表:序號、用戶名、密碼bash
我設計的公司通信錄是先人工輸入到後臺,而後前臺進行綁定、查詢、更新等操做微信
在開發前咱們先要上傳一個文件「base-class.php」,這個文件主要是用來作傳遞參數的過濾以及格式驗證,好比是否郵箱、手機等是否正確輸入架構
第一個要開發的模塊是部門設置,通常的公司架構都是多層級的,好比總經理-》部門-》小組,所以咱們的部門設置裏也要具有多層級的功能。
首先第一個頁面部門錄入頁面,咱們新建一個文件,命名爲class_add.php,主要實現功能爲添加和修改部門名稱及上下級分類。代碼以下:
後臺頁面是須要在瀏覽器裏打開操做的,所以須要有HTML代碼部分,通常正規開發都會將數據操做、邏輯操做、網頁模板分離,我這裏圖方便就混排了。
這個頁面實現的是兩個功能:一是新增部門,二是修改部門,兩個是放在同一個頁面裏的,那麼如何判斷是新增操做仍是修改操做呢?根據url裏是否有傳遞過來部門的序號即ID號,若是有就是修改,沒有就是新增,具體後面會有解釋。
命名爲class_manager.php,代碼以下:
昨天有很多朋友在問如何測試不知道如何綁定帳號,具體步驟是先在後臺添加一個員工,而後在微信公衆帳號里根據提示將添加的員工信息輸入完成綁定,如圖添加一個員工:
微信帳號綁定
微信用戶的帳號如何與本身網站的用戶系統打通,這個是不少人關心的問題,其實很簡單,咱們都知道微信用戶在關注公衆號或者發送消息時都會有一個惟一的OPENID傳過來,這個OPENID就是這個用戶對應這個公衆帳號的惟一身份標示,咱們只要將這個OPENID與本身網站的用戶系統一一綁定就能夠了。
方法有兩種,一是將OPENID做爲登錄頁面或者註冊頁面的URL參數,當用戶點擊這個URL時跳轉到WAP頁面(即本身網站)上進行綁定,另外就是在對話框裏進行綁定,我今天介紹的就是在對話框裏進行綁定。
首先是檢測用戶是否綁定了微信號,這裏我寫了個函數,以下圖:
第593行是定義函數的名字爲check_user,函數傳入的變量爲$fromUsername,即微信用戶的OPENID。
第598行是經過傳入的OPENID爲條件,檢測在員工數據表中是否存在某條記錄的roster_openid等於該OPENID。
第600到609行是返回函數運行的記過,若是有記錄的話返回該條數據,若是沒有就返回失敗。
在用戶關注公衆帳號時我就判斷是否有綁定過帳號,而且根據綁定狀況回覆不一樣的歡迎詞,以下圖:
當檢測到用戶關注的事件,調用check_user這個函數,若是返回不是失敗則提示使用幫助,不然提示綁定帳號,效果如圖:
當用戶輸入BD字符時進入帳號綁定模式,以下圖:
先判斷用戶是否已經綁定過,綁定過給提醒中斷執行。不然進入綁定流程,因爲綁定操做須要分多個步驟驗證多個條件,而後一併查詢數據庫,所以咱們要保存每一步的動做和數據,這裏使用memcache來保存每一個用戶的上一步操做。這裏先保存了BD_0標示這是綁定的第一個步驟,提示用戶信息爲「請輸入你的姓名」。
memcache服務的開啓請查看《微信公衆平臺入門到精通》Vol.13,在程序裏使用方法爲在代碼最開頭啓動memcache,以下圖:
保存memcache的方法爲:
$mc->set(緩存變量名, 保存的數據, 0, 緩存時間單位秒);
讀取memcache的方法爲:
$mc->get(緩存變量名);
我在程序的開頭加了獲取memcache值的代碼,每次用戶請求時都會從memcache中獲取用戶上一步的操做和數據。其中$fromUsername."_do"
爲用戶操做,$fromUsername."_data"
爲用戶數據,用 $fromUsername
能夠保證每一個用戶都有獨立的緩存變量名。
接下來等用戶輸入姓名後,接口會收到新的請求,這個時候因爲memcache保存過上步標示,所以這裏會根據操做緩存的數據判斷進入到第二步,$last_do的值是從程序開始就獲取memcache值後獲取的,以下圖:
這裏多了一個保存數據的緩存設置,保存了用戶提交的姓名數據,同時將操做緩存的值改成了BD_1,而後繼續提示用戶輸入工號。
當用戶輸入工號後,會進入第三步,以下圖:
繼續保存數據,將上一步的數據(姓名)與本次數據(工號)合併用「||」分割,同時將操做緩存的值改成了BD_2,而後繼續提示用戶輸入手機號。
當用戶輸入手機號後,就進入最後一步驗證,以下圖:
進入最後一步後先清空操做和數據緩存,而後將以前保存的數據$last_do加上本次用戶輸入內容合併轉換成數組,並用list函數分別賦值給$roster_name,$roster_number,$roster_mp。
再進行數據庫查詢知足用戶姓名、工號和手機與輸入數據徹底相同而且roster_openid(員工openid)爲空的記錄,若是有符合條件的記錄則更新該記錄,將$fromUsername(當前操做用戶的openid)保存到roster_openid裏,完成綁定。
這個時候咱們輸入「help」就會能夠進行後續操做了。
PS:「輸入exit退出操做」這個也很簡單,當用戶輸入exit的時候程序會清空操做和數據緩存,也就是說全部以前的操做和數據都沒有了,即全部操做從新開始,以下圖:
這個流程使用了memcache來保存一些臨時變量和多步驟操做,除了用來綁定用戶帳戶外,也適合一些調查問卷或者註冊登錄操做。
搜索其實就是編輯模式下的關鍵字自動回覆,我這裏拿姓名搜索舉例,首先咱們要先切換當前模式到姓名搜索,以下圖:
這部分代碼與帳號綁定的第一步是同樣的,咱們用memcache存放當前的操做,這個時候存放操做動做的緩存變量裏就標示了當前是在姓名搜索狀態下。同時輸出提示,請輸入員工姓名。
其實這步能夠理解爲進入網站的二級導航頁面,一個網站有首頁和各類導航欄目,那麼在這個通信錄裏幫助就是首頁,你輸入HELP就到了首頁,輸入XM就到員工查詢這個二級欄目,以後除非你輸入BM、GH等一些欄目名,其餘的操做都默認是在員工欄目下進行。
而後根據提示輸入員工名字進行查詢,以下圖:
從數據庫中查找與用戶輸入一致的記錄,若是沒有則返回提醒:
若是查詢到則返回一個圖文消息,這裏沒有去考慮員工重名的狀況,因此查詢和返回結果都是隻取一條記錄的。
前端展示緣由我只取工號、姓名、當前狀態、照片等字段返回,查看詳情點擊閱讀原文進入到detail頁,把該員工的ID號(不是工號)做爲URL參數傳遞過去,而後再作一次數據庫查詢將全部字段提取出來展示。
不少人很是好奇ZTalk的公衆帳號是如何實現文章查詢翻頁的,其實原理也很簡單,只是把網頁上的翻頁代碼稍微改裝一下,而後使用memcache保存每一個用戶當前的頁碼和搜索的關鍵字就能夠了。
在通信錄裏是用部門查詢來示例的,首先依然是進入部門查詢這個欄目,以下圖:
上面的代碼除了保存當前操做狀態爲部門查詢之外,又用另一個memcache的變量保存當前搜索關鍵字和頁碼「null || 1」,其中null爲當前搜索關鍵字(由於一開始用戶沒有輸入因此是空的),1表示起始頁是第一頁,而後輸出提示,請輸入部門名稱。
當用戶輸入部門名稱後,先查詢這個部門的ID號,由於在員工表裏沒有直接存放部門名稱而是存放的與部門對應的ID號,以下圖:
在這裏咱們獲取搜索關鍵字會有兩個來源,一個是用戶輸入的,一個是在翻頁時在緩存中保存的,因此先得嘗試從緩存裏獲取用戶以前保存的搜索關鍵字,若是值爲null則表示這是第一次搜索,關鍵字爲用戶輸入的$from_content,不然就使用緩存中保存的關鍵字,這就是爲何可以翻頁的關鍵,咱們利用緩存機制存放了用戶以前輸入的搜索關鍵字。
有了搜索關鍵字而後查詢部門表獲取部門ID號,獲取到後再去查詢員工表裏該ID下的員工總數,若是總數爲0則表示該部門尚未員工直接提示。不然進入到翻頁計算和結果返回,以下圖:
第一個是設置每頁顯示的條數,我這裏是設置成3條,加上封面消息和尾部翻頁提示消息最後顯示會是5條。
當前頁碼是從緩存中獲取,$last_data在前面已經使用explode函數以||爲分割字符變成數組,$last_data[0]爲搜索關鍵字,$last_data1爲頁碼,根據當前頁碼計算數據庫查詢開始的記錄指針位置。
查詢出結果後進行數據轉化,這裏作了一個數組方便後面循環輸入多圖文消息,每一個圖文消息其實就4個元素:標題、描述、圖片、連接,先直接用搜索關鍵字+當前頁等作一個封面消息,而後循環將數據庫查詢結果也轉化成圖文消息的元素。
而後是判斷是否有下一頁,以下圖:
用符合搜索條件的記錄總數去除以每頁顯示數量,ceil是一個向上舍入爲最接近的整數的函數,就是ceil(5/4)=2,而不是1.25,這樣就知道總頁數了,而後判斷當前頁是否最後一頁,若是不是最後一頁則將當前頁加1而後存放到memcache裏,在下次翻頁查詢時保存數據的這個memcache變量裏其實已經變成「搜索關鍵字||2」。
最後就是輸出多圖文消息了,以下圖:
在微信裏顯示的效果以下:
可能還有不少人很迷茫,如何輸入任何字符查看下一頁的呢?我畫個流程圖可能會比較清楚,看下圖:
你們能夠看到其實從第二頁開始用戶輸入的字符只是觸發程序運行,而不能干涉程序運行的結果,除非輸入EXIT,或者HELP這些一級欄目關鍵字。