第一步的check
我们需要在SplashActivity中判断用户token和userId是否存在,如果存在,说明用户先前已经注册过了,需要请求服务器,询问用户是否填写了基本资料,如果没有填写,则跳转到基本资料填写界面,如果已经填写了则直接跳转到主界面。
这个是我们的设计逻辑,用户必须填写基本信息才能使用软件
所以这里新增一个获取用户基本信息的api
访问url:
users/account/basic/:userid get
返回:
{
"code": 0,
"msg": "success",
"result": {
"sex": 1,
"age_range": 1,
"live_province": 0,
}
}
为了以后操作方便,我们需要对先前的代码做一些修改。首先我们将客户端的token放在http头部而不是放在提交的数据里面,因get请求是没有提交数据的,获取http头部的相关信息很简单,使用这样的代码:let userToken = req.header("user_token");
也就是说客户端几乎所有的请都要在http请求的头部增加key值为user_token,value值为访问token的字段。其次我们增加一个验证token的方法:
function checkToken(token, userId, callback) {
User.findOne({token: token, _id: userId}, function (err, user) {
if (err) {
console.error(err);
callback(DATABASE_ERROR);
} else {
if (user) {
callback(user);
} else {
callback(NO_USER);
}
}
});
}
可以看出来这里就是查询用户,因为检验token已经获取了用户的基本信息,所以,我们获取基本信息的接口就不需要再获取一遍了:
//获取用户基本信息
router.get('/account/basic/:userid', function (req, res) {
let userId = req.params.userid;
console.log("get request user id:" + userId);
let userToken = req.header("user_token");
console.log("get request token:" + userToken);
checkToken(userToken, userId, function (checkResult) {
console.log("check result:" + checkResult);
let person = {};
if (typeof (checkResult) === "object") {
let user = checkResult;
if (user.sex && user.ageRange && user.liveProvince) {
let result = {};
result.sex = user.sex;
result.age_range = user.ageRange;
result.live_province = user.liveProvince;
person.code = 0;
person.msg = "success";
person.result = result;
res.send(person);
} else {
person.code = NO_BASIC_USER;
person.msg = "no user basic";
res.send(person);
}
} else {
person.code = checkResult;
person.msg = "token error";
res.send(person);
}
});
});
同样,先前的修改用户信息也需要做相应的修改,这里就不说明了。
登录界面需要做的事情
我们需要提供一个用户账号和密码的登录框,当用户不存在时走注册流程,即服务器生成userId并告诉客户端下一步提交用户基本资料。当用户存在时亦要根据基本资料是否完善走填写基本资料或者是跳转到主界面的流程。我们需要用户可以通过账号、手机号或者邮箱来登录注册。但是这部分功能目前还未实现!我们现在仅仅实现了QQ登录的功能。为了尽快完善软件,体验功能,我们将这些登录注册功能延后完成。所以,我们提供一个QQ登录的按钮,点击跳转到QQ登录的界面。QQ登录的相关接入工作先前已经完成了,请参考从无到有创建一个聊天App之一-创建项目,接入QQ登录。下面来看下具体的实现分析。
首先先定义一个腾讯的管理对象private var mTencent: Tencent? = null
,并在onCreate
方法中初始化mTencent = Tencent.createInstance(QQ_APP_ID, this)
。QQ登录的所有功能都是通过这个类来操作的。下面定义一个授权登录的回调:
private var loginListener = object : IUiListener {
override fun onComplete(response: Any?) {
if (response is JSONObject) {
try {
val token = response.getString(Constants.PARAM_ACCESS_TOKEN)
val expires = response.getString(Constants.PARAM_EXPIRES_IN)
val openId = response.getString(Constants.PARAM_OPEN_ID)
if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires) && !TextUtils.isEmpty(openId)) {
mTencent?.setAccessToken(token, expires)
mTencent?.openId = openId
}
} catch (e: Exception) {
Log.e(TAG, "any error", e)
}
} else {
}
}
override fun onError(e: UiError) {
}
override fun onCancel() {
}
}
这个回调里面定义了3个方法:成功,错误和取消。其中授权成功后返回一个JSONObject对象,可以从中获得openId,有了openId,我们就可以执行注册绑定流程了。回调定义完后我们执行mTencent?.login(this, "all", loginListener)
来打开QQ授权登录界面,这个方法一般定义在按钮的点击事件里。至此就大功告成了,只需3步,是不是很简单呢?
接下来要做的事情
接下来我将把代码整理一下,明天争取提交到GitHub上,如果你还记得代码地址。然后将进入软件的核心功能之一:好友系统。