上篇文章我們利用wx.login方法獲取了用戶的唯一標識openid,有了這個標識我們就可以針對每一位用戶進行數據上的功能制作。
首先,我們將用戶的openid存到數據庫,完成用戶注冊的第一步。
1.添加數據
(1)后端,以php的thinkphp6框架為例。
第一步 ,我們在數據庫創建一個user表,因為種種原因我想為表加一個后綴,所以我將表命名為user_green。

其中id和用戶的openid都為該字段的主鍵,依靠強大的主鍵功能強制避免用戶進行多次注冊。
第二步 ,在tp6框架中創建一個模型,模型名需要與數據庫表名對應,所以根據命名規則設置模型名為UserGreen。

```
<?php
namespace app\web\model;
use think\Model;
class UserGreen extends Model{
// // 定義json數據
protected $json = ['information'];
// // 定義json數據查詢時返回數組
protected $jsonAssoc = true;
// 設置字段信息
protected $schema = [
'id' => 'int',
'openid' => 'string',
'information' => 'text'
];
}
```
此時查閱數據,id和openid沒問題,而個人信息information字段中我打算以json格式直接存入取出,里面可以包含很多數據。
另外update_time和create_time字段可以利用tp6框架自動填充,無需在模型中設置。
第三步 ,創建后端接口,使用戶注冊。
復制之前講過的restful路由,實現高復用路由接口設置,并使用tp6中間件完成跨域操作:
```
// 通用模型操作
Route::group('/api/rest/:model', function(){
// 新增數據到數據庫
Route::post('/', 'index/add');
// 查詢單個數據到數據庫
Route::get('/:id', 'index/find');
// 查詢所有數據到數據庫
Route::get('/', 'index/findall');
// 修改單個數據到數據庫
Route::put('/:id/', 'index/update');
// 刪除單個數據到數據庫
Route::delete('/:id', 'index/delete');
})->middleware([\app\admin\middleware\compareToken::class]);
```

編輯add方法,接收前端傳來的數據添加到數據庫。
```
public function add()
{
// 獲取前端傳值
$data = request() -> param();
// return $data;
if($data['model'] == "user"){
// 使用模型格式化傳來的數據
$db_data = new UserGreen;
// 利用模型將數據傳到數據庫
$db_data->save([
'openid' => $data['openid'],
'information' => $data,
]);
// 返回結果
return '新增數據成功';
}
}
```

注意 ,我們的方法中要使用之前創建的模型UserGreen,所以最上方就需要引入這個模型:

此時后端就位。
(2)前端,完成用戶登錄后將openid發送到后端
修改login方法:
```
login() {
wx.login({
success(res) {
console.log('code', res)
if (res.code) {
// 獲取到code后進行下一步操作,通過auth.code2Session獲取openid
uni.request({
url: 'http://localhost:3000/web/openid/' + res.code,
success(res) {
console.log('openid', res)
// 將openid存儲到緩存,減少資源消耗
wx.setStorage({
key: "openid",
data: res.data.openid
})
// 注冊
uni.request({
url: 'http://localhost:3000/web/api/rest/user',
header: {
'content-type': 'application/x-www-form-urlencoded'
},
method: 'POST',
data: {
openid: res.data.openid
},
success(res) {
console.log('注冊成功', res)
}
})
}
})
} else {
console.log('登錄失敗!' + res.errMsg)
}
}
})
}
```
點擊授權按鈕進行測試,發現總是會報錯:

報錯500一般就是后端的問題,于是我開始以為自己哪里復制錯了,經過一系列查找,發現去掉跨域的中間件就正常了:

猜想可能我在本地localhost可能與微信小程序不存在跨域問題,這也是微信小程序發送請求必須在https而卻能在http://localhost正常運行的原因吧。
之后后端上線時再加上跨域就行。
改動之后測試:

沒問題,再看數據庫是否有了數據:

沒問題,再看本地緩存是否正常:

OK,完成添加數據。
2.完成注冊
大家多測試幾次就會注意到兩個問題,一是數據中 update_time 和 create_time 并沒有數據填入,第二就是設置openid主鍵后依然會有新數據產生:

(1)先解決時間戳問題:
進入user模型中,添加這兩個字段,屬性為datetime:

我錯啦各位大哥,我記錯了,這里并不是不用寫,是不用設置傳入的數據。前邊的有太多地方截圖了,我實在懶得改了!!!
然后授權測試:

沒問題。
(2)避免重復注冊:
避免重復注冊的方法就是提前在數據庫查一下這個用戶是否注冊過,也就是查一下數據庫中是否有該openid。
第一步 ,為了避免代碼混亂,將注冊過程封裝成方法 register() :

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

第二步 ,后端封裝一個查詢是否注冊的方法:
路由:
```
// 查詢是否注冊
Route::get('/is_register/:openid', 'index/is_register');
```
方法:
```
// 查詢是否注冊
public function is_register() {
$data = request() -> param();
$db_data = UserGreen::where("openid", $data['openid']) -> select();
return json($db_data);
}
```
第三步 ,當用戶進入頁面時,檢查用戶本地緩存是否有openid,并獲取openid:
```
created() {
var that = this
wx.getStorage({
key: 'openid',
success(res) {
// 如果本地緩存有openid,說明一定注冊過,無需驗證,直接使用openid即可
that.openid = res.data
},
fail() {
// 如果沒有本地緩存的openid,可能有兩個原因
// 第一,用戶是第一次登錄,沒有進行過注冊
// 第二,用戶的本地緩存過期或清理,需要驗證是否注冊過
// 都跳轉到login進行登錄獲取openid,獲取到openid后使用下一步的isRegister()方法驗證是否需要注冊
this.login()
}
})
},
```
第四步 ,前端注冊一個調用后端是否注冊的方法 isRegister() ,并傳值openid:
```
isRegister(openid) {
// 是否注冊
uni.request({
url: 'http://localhost:3000/web/is_register/' + openid,
header: {
'content-type': 'application/x-www-form-urlencoded'
},
method: 'GET',
success(res) {
console.log('是否注冊', res)
if(!res.data[0]) {
// 如果沒有注冊過,則跳轉register()方法進行注冊
this.register(openid)
}
// 如果注冊過,則到此為止
},
error(err){
console.log(err)
}
})
}
```
感覺比較復雜,但主要邏輯自己考慮一下就能明白,主要就兩個判斷, 是否有之前登陸的緩存 ,沒有的話查一下 是否注冊 。
而且形式上我為了邏輯通順多出了很多步驟,大家可以根據自己的需求進行設計。主要的前后端方法和接口就是上邊那些了。
- tp6+vue
- 1.工具和本地環境
- 2.啟動項目
- 3.路由、模型與數據庫操作
- 4.優化后端接口,前端使用axios實現接口功能
- 5.用戶登錄,bcrypt(hash)加密與驗證
- 6.用戶登錄(二),token驗證
- 7.分類的模型關聯和通用CRUD接口
- 8.使用vue的markdown編輯器并批量上傳圖片
- Node.js + Vue.js
- 工具,本地環境
- 2.1啟動項目
- 3.element-ui和vue-router路由的安裝和使用
- 4.使用axios,并創建接口上傳數據到mongodb數據庫
- 5.mongoodb數據庫的“刪、改、查”操作
- 6.mongodb數據庫無限層級的數據關聯(子分類)
- 7.使用mongodb數據庫關聯多個分類(關聯多個數據)
- 8.server端使用通用CRUD接口
- 9.圖片上傳
- 10.vue的富文本編輯器(vue2-editor)
- 11.動態添加分欄上傳多組數據
- 12-1.管理員模塊
- 13-1.搭建前臺web端頁面
- 1.使用sass工具搭建前臺web端頁面
- 2.sass工具的變量
- 3.使用flex布局并開始搭建web端
- 4.vue廣告輪播圖,并使用接口引入數據
- 5.使用字體圖標(iconfont)
- 6.卡片組件的封裝
- 14-1.生產環境編譯
- 1.環境編譯
- 2.購買域名服務器并解析域名到服務器
- 3.nginx配置web服務器并安裝網站環境
- 4.git拉取代碼到服務器
- 5.配置Nginx反向代理
- 6.遷移本地數據到服務器(mongodump)
- uni
- 1.工具&本地環境
- 2.頁面制作
- 3.頁面制作、組件與輪播
- 4.頁面跳轉與橫向滑動
- 5.用戶授權登錄和用戶信息獲取
- 6.用戶注冊和數據存儲
- 7.用戶填寫表單信息