国产编程语言CBrother的初见(二)

前情回述

在上一篇文章中,主要讲解了使用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;

如有问题,还请多多指教。谢谢!!!

上篇文章

微信登录LoginAction(一)

猜你喜欢

转载自blog.csdn.net/brewchen/article/details/88770024