AR app項目知識點深扒

(一)數據庫

1、設計相關

數據庫使用的是什麼?

MySQL 5.7以及搭配了Navicat for mysql5.7數據庫管理工具。

你數據庫中使用了幾個表?怎麼設計的?

總共有三個表,分別是掃描區域劃分類目表(scan_info)、位置信息詳情表(location_info)和人員信息表(person_info)。具體來說在scan_info表中有scan_id作爲這個二維碼的唯一標識,scan_name作爲這個表的區域名稱,scan_type作爲這個區域的唯一標識編號,以及這個二維碼區域信息的創建時間和更新時間。然後在位置信息詳情表中有location_id表示位置ID,location_name來表示這個位置的名稱。然後分別使用經度、緯度、高度來唯一確定該位置的存在。使用location_description來對該位置進行描述。使用了location_picture來顯示二維圖像,然後又新增了全景外鏈,在改位置的人員,和這個位置的更新時間和創建時間,利用時間戳實現,該表唯一標識是location_id。然後是人員信息表,表示某地點的人員信息(id作爲唯一標識,該位置的人員,姓名等信息)

create table `scan_info`(
  `scan_id` int not null auto_increment,
  `scan_name` varchar(64) not null comment '區域名稱',
  `scan_type` int not null comment '類目編號',
  `create_time` timestamp not null default current_timestamp comment '創建時間',
  `update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改時間',
    primary key(`scan_id`),
    unique key `uqe_scan_type` (`scan_type`)
)comment '掃描區域劃分類目表';
create table `location_info`(
  `location_id` varchar(32) not null comment '位置ID',
  `location_name` varchar(64) not null comment '位置名稱',
  `location_latitude` decimal(8) not null comment '經度',
  `location_longitude` decimal(8) not null comment '緯度',
  `location_altitude` decimal(8) not null comment '高度',
  `location_description` varchar(512) comment '位置描述',
  `location_picture` varchar(512) comment '位置二維圖像',
  `panoramic_link` varchar(512) comment '全景外鏈',
  `scan_type` int not null comment '類目編號',
  `person_type` int not null comment '該位置的人員',
  `create_time` timestamp not null default current_timestamp comment '創建時間',
  `update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改時間',
  primary key(`location_id`),
  unique key `uqe_person_type` (`person_type`),
  foreign key (`scan_type`) references `scan_info`(`scan_type`) on delete cascade on update cascade
)comment '位置信息詳情表';

create table `person_info`(
  `person_id` varchar(32) not null comment '人員ID',
  `person_type` int not null comment '該位置的人員',
  `person_name` varchar(32) not null comment '姓名',
  `person_age` tinyint(3)  comment '年齡',
  `person_sex` char(2)   comment '性別',
  `person_responsibility` varchar(32) comment '職責',
  `person_phone` varchar(32) comment '聯繫方式',
  `create_time` timestamp not null default current_timestamp comment '創建時間',
  `update_time` timestamp not null default current_timestamp on update current_timestamp comment '修改時間',
  primary key(`person_id`),
  foreign key (`person_type`) references `location_info`(`person_type`) on delete cascade on update cascade
)comment '人員信息表';

爲什麼要這樣設計,設計的初衷是什麼?

因爲當時的需求大概是這樣的,用戶掃描二維碼,系統需要聽過用戶掃描的二維碼信息來確定用戶所在的區域,這就有了掃描區域劃分類目表,然後在這個區域內查找一些店鋪、景點之類的建築物,而這個建築物理論上是可以通過經度、緯度、高度來唯一確定的,並且希望的是通過AR的形式來顯示建築物的標籤,用戶可以通過點擊標籤來獲取該位置的詳細信息、VR全景等信息,這就需要位置信息詳情表,而建築物中一般來說會有人,這就需要人員信息表。當時的想法大致是這樣的,主要是爲了以後擴展方便,可以應用於旅遊、房地產等產業。

2、關於mysql的一些基礎知識點

索引相關的內容?

 MySQL索引使用的數據結構主要有BTree索引和哈希索引。對於哈希索引來說,底層的數據結構就是哈希表,因此在絕大多數需求爲單條記錄的時候,可以選擇哈希索引,查詢性能更快;其餘大部分場景,建議選擇BTree索引。
 Mysql的BTree索引使用的是B樹中的B+Tree,但對於主要的兩種存儲引擎的實現方式(MylSAM和InnoDB)是不同的。我是用的是InnoDB.
 InnoDB:其數據文件本身就是索引文件。相比MylSAM,索引文件和數據文件是分離的,其表數據文件本身就是按B+Tree組織的一個索引結構,樹的葉結點data域保存了完整的數據記錄。這個索引的Key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引,被稱爲“聚簇索引”,而其餘的索引都作爲輔助索引,輔助索引的data域存儲相應記錄主鍵的值而不是地址。在根據主索引搜索時,直接找到key所在的節點即可取出數據;在根據輔助索引查找時,則需要先取出主鍵的值,再走一遍主索引。 因此,在設計表的時候,不建議使用過長的字段作爲主鍵,也不建議使用非單調的字段作爲主鍵,這樣會造成主索引頻繁分裂。

事務機制知識點?

在這裏插入圖片描述
在這裏插入圖片描述

關於幻讀和可重複讀的解釋?

參考 (1)幻讀和可重複讀
(2)事務隔離級別

鎖機制和InnoDB算法?

在這裏插入圖片描述

(二)服務端

1、後端框架設計

MVC設計模式?

在這裏插入圖片描述

日誌的使用?

我使用的只要是logback,故僅簡單介紹一下

Logback是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適應諸多的運行環境,同時天然支持SLF4J。
默認情況下,Spring Boot會用Logback來記錄日誌,並用INFO級別輸出到控制檯。在運行應用程序和其他例子時,你應該已經看到很多INFO級別的日誌了。
logback有五種日誌級別

  • Trace級別最小,打印信息最爲詳細
  • DEBUG
  • INFO
  • WARN
  • ERROR級別最大,打印信息最爲簡略

SpringBoot框架簡單介紹?
在這裏插入圖片描述

2、項目中出現的註解

在這裏插入圖片描述

3、項目結構圖

在這裏插入圖片描述

4、數據封裝邏輯實現
  • API文檔如下所示
//獲取該區域的所有定位點以及相關信息
 GET /ar/client/location/show

參數

scanType:1

返回

{
  "code":0,
  "msg":"success",
  "data":{
       "name": "黃河路",
       "type": 1,
             "locationList":[
               {
                 "id":"123456",
                 "name":"丹尼斯",
                 "latitude":12.335,
                 "longitude":34.225,
                 "altitude":5.2,
                 "description":"一個購物的地方",
                 "icon":"http://www.dennis.com.cn/u/cms/www/201707/191157482x37.jpg",
                 "link":"http://122.114.223.188/toShow?VRourEditor=206",
                 "people":[
                       {
                         "name":"jack",
                         "responsibility":"doctor",
                         "phone":"13052312154"
                       },
                       {
                         "name":"evan",
                         "responsibility":"護士",
                         "phone":"13565667488"
                       }
                 ]
               },
               {
                 "id":"123457",
                 "name":"微阿科技",
                 "latitude":44.123,
                 "longtitude":33.124,
                 "altitude":5.2,
                 "description":"公司",
                 "icon":"http://www.dennis.com.cn/u/cms/www/201707/191157482x37.jpg",
                 "link":"http://122.114.223.188/toShow?VRourEditor=206",
                 "people":[
                       {
                         "name":"linda",
                         "responsibility":"doctor",
                         "phone":"1325355555"
                       },
                       {
                         "name":"tim",
                         "responsibility":"護士",
                         "phone":"13561125488"
                       }
                 ]
               }
             ]
       }
}
  • 邏輯分析
    1.接收APP端請求的參數,這裏是scantype
    2.查詢所掃描的ID信息,返回Object
    ==3.=通過掃描的id所確定的scantype來查找所有的位置信息,返回一個鏈表=
    4.通過查找的位置信息中的persontype查找所有人員信息,返回鏈表
    由上述可以分析,返回的json數據應該是一個鏈表嵌套着另一個鏈表
  • 數據拼裝
    1.遍歷locationlist進行逐個賦值
    2.遍歷personlist進行逐個賦值
    3.將personlist加入到locationlist中
    4.將得到的locationlist加入到data中,然後返回data

(三)Android APP端

1、基本的設計思路是什麼?

 當時是想着用戶可以打開App,然後通過掃描二維碼,然後向後臺發出請求,後臺查詢數據庫相關數據,然後返回給APP端,APP端接收數據,將所獲得的點以AR浮層的形式展現給用戶。

2、Android基礎

在這裏插入圖片描述

3、該程序需要獲取哪些權限?

在這裏插入圖片描述

4、數據是怎麼進行解析的

==專門寫了一個封裝工具類FAST.java,使用了阿里的fastjson插件,可以將json格式解析成類、鏈表等,調用相關接口實現。==用戶掃碼過後,系統返回json數據,新建一個請求隊列RequestQueue,它可以緩存所有的http請求,然後按照一定的算法併發的發出這些請求,非常適合高併發,因此我們不必爲每一次的請求都創建一個RequestQueue對象,僅需創建一個即可。然後將通過FAST.java解析過的(數據)類,怎麼封裝的就怎麼解析,然後加入UI 線程返回到AR效果生成頁面。

5、掃碼功能是如何實現的?

使用了一個github上面的開源組件z-xing,該組件就是專門實現掃碼功能的,識別速度很快,效率高,調用相關api即可實現掃碼識別功能。

6、AR效果是怎麼實現的?

先獲取要在ar浮層上面畫的點的經緯高度,然後通過算法將GPS座標轉換成手機導航座標系,然後在AR浮層(以camera作爲背景)上面將點畫上去,然後顯示,注意這個點是動態的,會根據該點在浮層上面的座標系而浮動。

7、如何實現將一個GPS座標轉換爲局部平面座標系的?

詳參考:算法設計思路

(四)其它

1、項目中用到的方法/重要知識點詳解

在這裏插入圖片描述

(五)參考文獻

【1】併發編程面試必備:樂觀鎖與悲觀鎖
【2】幻讀和不可重複讀的區別
【3】Springboot日誌系統logback使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章