## 數據庫設計
```mysql
DROP DATABASE IF EXISTS lost;
CREATE DATABASE lost;
use lost;
DROP TABLE IF EXISTS `think_event`;
CREATE TABLE `think_event`
(
`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`user_id` int(11) COMMENT '用戶ID',
`type` varchar(10) NOT NULL COMMENT '事件類型:lost|found',
`title` varchar(50) NOT NULL COMMENT '事件標題',
`linkman` varchar(50) NOT NULL COMMENT '聯系人',
`mobile` varchar(50) NOT NULL COMMENT '聯系電話',
`create_time` int(11) COMMENT '事件發生時間',
`image_ids` varchar(500) COMMENT '關聯的圖片ID串',
`tags` varchar(500) COMMENT 'tags',
`address` varchar(500) COMMENT '事件發生的地點',
`description` TEXT COMMENT '簡要描述',
`status` int(11) COMMENT '狀態',
`finished` int(11) COMMENT '事件已經結束?',
`deleted` int(11) DEFAULT 0 COMMENT '事件被發布人取消?'
) ENGINE = InnoDB
DEFAULT CHARSET = utf8 COMMENT ='失物招領事件表';
DROP TABLE IF EXISTS `think_image`;
CREATE TABLE IF NOT EXISTS `think_image`
(
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵id自增',
`storage` varchar(50) NOT NULL,
`path` varchar(255) NOT NULL DEFAULT '' COMMENT '路徑',
`base_url` varchar(255) NOT NULL DEFAULT '' COMMENT '圖片鏈接',
`md5` char(32) NOT NULL DEFAULT '' COMMENT '文件md5',
`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '創建時間',
PRIMARY KEY (`id`)
) ENGINE = MyISAM
DEFAULT CHARSET = utf8
AUTO_INCREMENT = 1;
--
-- 表的結構 `think_user`
--
/*用戶基礎信息,記錄登陸賬號信息*/
DROP TABLE IF EXISTS `think_user`;
CREATE TABLE `think_user`
(
`id` int(10) AUTO_INCREMENT PRIMARY KEY NOT NULL,
`username` varchar(50) NOT NULL,
`user_type` varchar(50) NOT NULL DEFAULT 'user', #注冊用戶的類型,user,school,student,teacher,company
`mobile` varchar(11) DEFAULT NULL,
`email` varchar(100) DEFAULT NULL,
`password` varchar(32) NOT NULL,
`encrypt` varchar(10) NOT NULL,
`avator_id` int DEFAULT 0 COMMENT '頭像在image庫中的ID',
`last_login_time` int DEFAULT 0,
`last_login_ip` varchar(50) DEFAULT '',
`login_count` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '登錄次數',
`login_fail_count` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '登錄失敗次數',
`deletable` tinyint(2) NOT NULL DEFAULT 0 COMMENT '可刪除,默認不可刪除',
`status` tinyint(2) NOT NULL DEFAULT 1 COMMENT '狀態,默認激活',
`deleted_flag` int NOT NULL DEFAULT 0,
`create_time` int NOT NULL DEFAULT 0,
`create_ip` varchar(50) NOT NULL DEFAULT ''
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
--
-- 轉存表中的數據 `think_user`
-- password:123456
--
INSERT INTO `think_user` (`id`, `username`, `password`, `encrypt`)
VALUES (1, 'admin', 'ce9ac4724c59b5167ae89ecc345a57c9', 'Cc6bSCcc3N'),
(2, 'guest', 'ce9ac4724c59b5167ae89ecc345a57c9', 'Cc6bSCcc3N'),
(3, 'user', 'ce9ac4724c59b5167ae89ecc345a57c9', 'Cc6bSCcc3N');
/*用戶的會員信息*/
DROP TABLE IF EXISTS `think_user_member`;
CREATE TABLE `think_user_member`
(
`uid` int NOT NULL,
`puid` int NOT NULL DEFAULT 0,
`invitation_code` VARCHAR(6) NULL DEFAULT NULL COMMENT '邀請碼',
`qq` varchar(15) DEFAULT NULL,
`github` varchar(100) DEFAULT NULL,
`zhihu` varchar(100) DEFAULT NULL,
`weibo` varchar(100) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8mb4;
INSERT INTO `think_user_member` (`uid`, `puid`, `invitation_code`)
VALUES (1, 0, 'ROOT12'),
(2, 0, 'ADMIN1'),
(3, 0, 'USER12');
```
## 修改配置文件
修改`/src/config/adapter.js`,設置數據庫連接
```js
/**
* model adapter config
* @type {Object}
*/
exports.model = {
type: 'mysql',
common: {
logConnect: isDev,
logSql: isDev,
logger: msg => think.logger.info(msg)
},
mysql: {
handle: mysql,
database: 'lost',
prefix: 'think_',
encoding: 'utf8',
host: '127.0.0.1',
port: '3306',
user: 'root',
password: 'root',
dateStrings: true
}
};
```
## 添加測試數據
文件:src/controller/index.js
```js
const Base = require('./base.js');
const Mock = require('mockjs');
module.exports = class extends Base {
indexAction() {
return this.display();
}
async mockAction() {
if (this.isPost) {
//生成模擬數據
let mockOption = {
'data|20': [
{
'type|1': ['lost', 'found'], //事件類型
'user_id': 1,
'title|1': '@ctitle(10,20)', //學校名稱
'address': '@county(true)', //學校地址
'image_ids': "1,2,3",
"linkman": '@cname()',
"mobile": /^1[38][1-9]\d{8}/, //聯系電話
"create_time": "@integer(1547394126,1557762084)", //時間戳(秒)
"status": 1,
"finished": 0,
'description': '@cparagraph(10,20)', //介紹
}],
};
let data = await Mock.mock(mockOption);
//刪除已有的數據
await this.model('event').where(true).delete();
//添加新的模擬數據
// for (let item of data.data) {
// await this.model('event').add(item);
// }
await this.model('event').addMany(data.data);
data = await this.model('event').select();
return this.success(data);
}
}
};
```
> 執行測試mockAction,添加測試數據
使用RESTer瀏覽器插件等發送POST請求執行 `http://localhost:8360/index/mock`。

生成的模擬數據樣本

- 內容介紹
- EcmaScript基礎
- 快速入門
- 常量與變量
- 字符串
- 函數的基本概念
- 條件判斷
- 數組
- 循環
- while循環
- for循環
- 函數基礎
- 對象
- 對象的方法
- 函數
- 變量作用域
- 箭頭函數
- 閉包
- 高階函數
- map/reduce
- filter
- sort
- Promise
- 基本對象
- Arguments 對象
- 剩余參數
- Map和Set
- Json基礎
- RegExp
- Date
- async
- callback
- promise基礎
- promise-api
- promise鏈
- async-await
- 項目實踐
- 標簽系統
- 遠程API請求
- 面向對象編程
- 創建對象
- 原型繼承
- 項目實踐
- Classes
- 構造函數
- extends
- static
- 項目實踐
- 模塊
- import
- export
- 項目實踐
- 第三方擴展庫
- immutable
- Vue快速入門
- 理解MVVM
- Vue中的MVVM模型
- Webpack+Vue快速入門
- 模板語法
- 計算屬性和偵聽器
- Class 與 Style 綁定
- 條件渲染
- 列表渲染
- 事件處理
- 表單輸入綁定
- 組件基礎
- 組件注冊
- Prop
- 自定義事件
- 插槽
- 混入
- 過濾器
- 項目實踐
- 標簽編輯
- 移動客戶端開發
- uni-app基礎
- 快速入門程序
- 單頁程序
- 底部Tab導航
- Vue語法基礎
- 模版語法
- 計算屬性與偵聽器
- Class與Style綁定
- 樣式與布局
- Box模型
- Flex布局
- 內置指令
- 基本指令
- v-model與表單
- 條件渲染指令
- 列表渲染指令v-for
- 事件與自定義屬性
- 生命周期
- 項目實踐
- 學生實驗
- 貝店商品列表
- 加載更多數據
- 詳情頁面
- 自定義組件
- 內置組件
- 表單組件
- 技術專題
- 狀態管理vuex
- Flyio
- Mockjs
- SCSS
- 條件編譯
- 常用功能實現
- 上拉加載更多數據
- 數據加載綜合案例
- Teaset UI組件庫
- Teaset設計
- Teaset使用基礎
- ts-tag
- ts-badge
- ts-button
- ta-banner
- ts-list
- ts-icon
- ts-load-more
- ts-segmented-control
- 代碼模版
- 項目實踐
- 標簽組件
- 失物招領客戶端原型
- 發布頁面
- 檢索頁面
- 詳情頁面
- 服務端開發技術
- 服務端開發環境配置
- Koajs快速入門
- 快速入門
- 常用Koa中間件介紹
- 文件上傳
- RestfulApi
- 一個復雜的RESTful例子
- 使用Mockjs生成模擬數據
- Thinkjs快速入門
- MVC模式
- Thinkjs介紹
- 快速入門
- RESTful服務
- RBAC案例
- 關聯模型
- 應用開發框架
- 服務端開發
- PC端管理界面開發
- 移動端開發
- 項目實踐
- 失物招領項目
- 移動客戶端UI設計
- 服務端設計
- 數據庫設計
- Event(事件)
- 客戶端設計
- 事件列表頁面
- 發布頁面
- 事件詳情頁面
- API設計
- image
- event
- 微信公眾號開發
- ui設計規范