## 1 源碼結構
```
/-- |
|-- default 存放用戶的默認頭像、檢測報告的模板、DEMO.apk
|-- dist 網頁的css樣式、js、圖片和字體等資源
|-- modules 前端php
| |-- class 涉及前端動作處理的php
| |-- ui 前端界面的公共包含頁
|-- php 后端的php,**該部分與前端的代碼分離**
| |-- COS 騰訊云對象存儲的SDK
| |-- file 文件操作相關
| |-- func smtp發送
| |-- user 用戶操作相關
| |-- annhub_func.php 函數集合
| |-- b.php 暫未使用,后期改用https協議的模板
| |-- conf.php 數據庫、smtp等參數配置
|-- src
|-- vendors bootstrap內核框架、各類組件、一些js特效
|-- 404.php 404頁面,用于處理頁面不存在的錯誤
|-- 500.php 500頁面,用于處理其他類型的錯誤
|-- favicon.ico 瀏覽器導航欄的圖標
|-- index.php 主頁
|-- information.php 個人信息頁面
|-- login.php 登錄頁面
|-- signup.php 注冊頁面
|-- manage_index 登陸后的后臺管理頁面
|-- my_app.php 我的應用頁面
```
## 2 設備體系
### 2.1 域、實體和關系
我們的設備由三大部分組成,我們將其稱之為**域**,分別是Web服務器、對象存儲服務器和用戶,其中Web服務器是在阿里云上搭建的,開發采用**前后端分離**的模式,對象存儲則使用了騰訊云提供的服務,用戶是使用PC和移動終端的群體。
詳細的實體說明見下表:
| 域 | 環境 | 配置 |
|---------------------|-------------------------|-----------------------|
|Web服務器 |阿里云</br>前端、后端</br>Linux(CentOS 7.3 x64)</br>apache</br>mysql</br>PHP | 公網IP 118.89.192.69|
|對象存儲服務器 |騰訊云</br>存儲桶annhub-1252789527</br>地區上海 | https://annhub-1252789527.cos.ap-shanghai.mycloud.com
|用戶域 | PC</br>移動終端 | Andorid</br>iOS|

這里我們規定:
> **實體**是域中的具體的對象,用形象的圖標表示,而實體與實體、實體與域、域與域之間的**關系**,我們用箭頭和大寫字母表示。
* 用戶域(包括用戶、PC和移動終端)
* Web服務器(包括前端、后端、MySQL數據庫)
* 對象存儲(包括APK文件、掃描報告)
### 2.2 功能詳述
* APK的上傳、刪除和下載
前端由`modules/class/file.php`和騰訊云提供的SDK`modules/class/COS`來控制,而` modules/class/progress.php`處理文件上傳過程中進度條的顯示問題;
后端由
php/file_upload_request.php
php/file_upload_succceed.php
php/file_delete_request.php
php/file_delete_succced.php
上傳和刪除關系的實現過程:A-C-F-G-H-C-D-E-F-B
用戶首先發起上傳APK(A)的請求到Web服務器,又前端代理用戶向后端發起curl請求(C),后端收到請求后傳遞給前端一個數據集合(F),里面包含文件名、文件標識和能夠獲許上傳至對象存儲COS的憑證等。前端將會根據后端的數據集合,打開上傳通道接收用戶上傳的APK,先將APK文件暫存在服務器,進行校驗,并依據后端的信息進行處理后,將文件轉移至騰訊云的對象存儲服務器(G),并將本地的文件刪除。待騰訊云對象存儲返回成功的信息后(H),前端便告知后端上傳完成(C),由后端完成數據庫更新的相應的操作(DE)。完成后,后端告知前端,數據庫的相應操作完成(F),最終由前端提示用戶,APK文件上傳成功(B)。
刪除操作的流程與上傳是一樣的,只需要將上一段中所有“上傳”的關鍵詞替換為“刪除”即可。
下載的實現過程:A-B-I
用戶打開網頁,可以直接鏈接到對象存儲文件的URL,完成下載任務。
* 用戶頭像的上傳
實現過程同APK的上傳和刪除
前端由
`modules/class/file.php
`和騰訊云提供的SDK
`modules/class/COS
`控制
后端由
php/user_head_upload_request.php
php/user_head_upload_succceed.php
控制
* 注冊、登錄和登出
實現過程:A-C-D-E-F-B
前端由
`modules/class/authenticate.php
`控制
后端由
php/user_register.php
php/user_login.php
php/user_logout.php
用戶在進行注冊、登錄和登出時,由前端的authenticate.php向后端對應的php發起curl請求(C),由后端進行數據庫相應的操作后(DE),告知前端操作完成后(F),由前端負責在進行瀏覽器端相應的顯示(B)。
* 用戶郵箱修改、用戶昵稱修改、用戶密碼修改
原理和關系鏈同注冊、登錄和登出
前端由
modules/class/user.php
控制
后端由
php/user_email_change.php
php/user_nickname_change.php
php/user_password_change.php
* 頁面數據的填充
實現過程:A-C-D-E-F-B
我們可以認為網站根目錄下的頁面文件(index.php/information.php等)是一個框架,就像沒有血肉之軀的骷髏,類似人類的骨架。我們挖開古人的墳墓,看到堆砌的白骨,我們再厲害也沒辦法想象出死主生前的模樣,那是因為沒有肉體的點綴,不同人的白骨對于我們來說沒有區別,可見一具“皮囊”對我們來說至關重要,甚至是我們獨特性的重要組成部分。
頁面的數據就像是我們的皮囊,包括我們的用戶名、昵稱、密碼、通知、消息等等獨屬于我們的數據,包含了我們存在的印記,而頁面文件就像我們的軀殼,提供了一個容納數據的架子,對不同的用戶只需要將不同人的數據從數據庫中提取出來,填充在空置的架子上,就完成的顯示的任務。
這項任務由前端
modules/data.php
來完成,它會向后端的
php/file/file_info_get.php
php/user/user_info_get.php
發起curl請求,由后端完成數據的查詢任務,返回json格式的數據,經過解碼后完成數據的填充,最后展示給用戶看。
## 3 交互邏輯
用戶的交互邏輯見下方的流程圖
