前情回述
在上一篇文章中,主要讲解了使用CBrother脚本开发后端——微信登录LoginAction(),比较简单。
今日剧情
这篇文章将着重讲解以下三方面内容:
(一)创建线程类(Thread)
(二)创建事件同步类(Event)
(三)Thread类、Event与LoginAction的关联
废话不多说,直接上代码!!!
初始化部分
import CBHttp.code
var m_LoginDataThread;
function main(a)
{
//初始化数据库
var mysql = new MySQL("********", 3306, "root", "***", "***");
//判断数据库是否已连接成功
if(!mysql.connect())
{
print "mysql connect err!!!";
return;
}
//注册登录线程
m_LoginDataThread = new Thread();
//DBLoginData类处理数据
m_LoginDataThread.setThreadAction(new DBLoginData(mysql));
m_LoginDataThread.start();
var httpServer = new HttpServer();
httpServer.addAction("login.cb", new LoginAction());
//启用log
httpServer.openLog();
//我使用8080端口
httpServer.startServer(8080);
//省略
}
创建DBLoginData类
class UserInfo //微信登录用户信息类
{
var _ID;
var _Type;
var _OpenID;
var _UnionID;
var _NickName;
var _Gender;
var _AvatarUrl;
var _LastTime;
}
class DBLoginData
{
var m_DataServer;
var m_OpenIDUserMap = new Map();
var m_UserIdx = 0;
//带有参数构造方法
function DBLoginData(server)
{
m_DataServer = server;
}
function onInit()
{
//初始化数据(从数据库读取数据)
InitUserData();
}
function onMsg(msg)
{
switch(msg._msgid)
{
case LOGIN_USERDATA:
{
onCommandLogin(msg)
break;
}
default:
{
break;
}
}
}
function InitUserData()
{
var sql1 = "select * from userinfo";
m_DataServer.query(sql1);
while(m_DataServer.next())
{
var index = 0;
var id = m_DataServer.getInt(index++);
var type = m_DataServer.getInt(index++);
if(type != ACCOUNT_TYPE_WX)
{
continue;
}
var openId = m_DataServer.getString(index++);
var unionId = m_DataServer.getString(index++);
var nickName = m_DataServer.getString(index++);
var gender = m_DataServer.getInt(index++);
var avatarUrl = m_DataServer.getString(index++);
var userdata = new UserInfo();
userdata._ID = id;
userdata._Type = type;
userdata._OpenID = openId;
userdata._UnionID = unionId;
userdata._NickName = nickName;
userdata._Gender = gender;
userdata._AvatarUrl = avatarUrl;
//登录用户数据存储到Map中
m_OpenIDUserMap.add(openId, userdata);
}
m_DataServer.closeConnect();
sql1 = "SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE table_name='userinfo'";
m_DataServer.query(sql1);
if(m_DataServer.next())
{
//读取数据库用户表的当前索引
m_UserIdx = m_DataServer.getInt(0);
}
m_DataServer.closeConnect();
if(m_UserIdx < 0)
{
print "user AUTO_INCREMENT is 0!!!";
}
}
function onCommandLogin(msg)
{
var parm = msg._data;
var openId = parm.get("openId");
var unionId = parm.get("unionId");
var nickName = parm.get("nickName");
var gender = parm.get("gender");
var avatarUrl = parm.get("avatarUrl");
var userdata = m_OpenIDUserMap.get(openId);
if(userdata == null)
{
userdata = new UserInfo();
userdata._ID = m_UserIdx++;
userdata._Type = ACCOUNT_TYPE_WX;
userdata._OpenID = openId;
userdata._UnionID = unionId;
userdata._NickName = nickName;
userdata._Gender = gender;
userdata._AvatarUrl = avatarUrl;
userdata._LastTime = time();
m_OpenIDUserMap.add(openId,userdata);
var sql = "INSERT INTO userinfo VALUES (0,1,'" + openId + "','" + unionId + "','" + nickName + "'," + gender + ",'" + avatarUrl + "')";
m_DataServer.upDate(sql);
}
else
{
userdata._LastTime = time();
if(unionId != userdata._UnionID || nickName != userdata._NickName || gender != userdata._Gender || avatarUrl != userdata._AvatarUrl)
{
userdata._UnionID = unionId;
userdata._NickName = nickName;
userdata._Gender = gender;
userdata._AvatarUrl = avatarUrl;
var sql = "update userinfo set unionId='" + unionId + "',nickName='" + nickName + "',gender=" + gender + ",avatarUrl='" + avatarUrl + "',lasttime=" + time() + " where id=" + userdata._ID;
m_DataServer.upDate(sql);
}
else
{
var sql = "update userinfo set lasttime=" + time() + " where id=" + userdata._ID;
m_DataServer.upDate(sql);
}
}
msg._event.endWait(userdata._ID);
}
}
LoginAction类
class LoginAction
{
function DoAction(req, respon)
{
//已忽略(上篇文章查看)
var userjson = new Json(userdatajson);
//上篇文章使用该代码(本人封装了一层,忽略该代码)
//var res = m_HttpServer.Command(m_UserDataIdx, LOGIN_USERDATA, userjson);
//创建事件同步类Event
var loginEvent = new Event();
//将触发DBLoginData类onMsg函数
m_LoginDataThread.addMsg(new ThreadMsg(LOGIN_USERDATA, loginEvent, userjson));
loginEvent.wait();
//返回数据
var res = loginEvent.getData();
if(res > 0)
{
respon.addCookie("" + res);
result.add("status", SERVER_CODE_SUCCESS);
result.add("uid",res);
respon.write(result.toJsonString());
}
else
{
result.add("status", SERVER_CODE_FAILED);
respon.write(result.toJsonString());
}
respon.flush();
}
}
ThreadMsg类
class ThreadMsg
{
var _msgid;
var _event;
var _data;
function ThreadMsg(id, e, data)
{
_msgid = id;
_event = e;
_data = data;
}
}
const LOGIN_USERDATA = 0;
如有问题,还请多多指教。谢谢!!!