原地址:http://www.9miao.com/question-15-54671.html

学习笔记一传送门
学习笔记二传送门

学习笔记三导读:
        笔记三主要就是各个模块的封装了,这里贴出各个模块一览表,封装完毕我就更新一个状态,并且补上模块说明

模块名方法名方法说明封装状态用户基础模块userModeluserLogin用于用户登陆时的方法已封装regUser注册用户的方法已封装heartCheck用户更新心跳时间的方法已封装heartCheck用户心跳检测的方法已封装fundsCheck检查资金是否异常的方法暂不封装loginUpdate登陆时更新用户登陆记录并写日志的方法暂不封装sysMsg发送系统消息的方法已封装userTalk用户在游戏中发言的方法(这里我考虑是像QQ斗地主一样固定发言防止作弊,还是不限制用户发言,个人觉得防作弊好一点)已封装日志模块logModelsysLog系统日志的方法(保存log日志的方法)暂不封装userLoginLog用户写登陆日志的方法暂不封装userActionLog用户写操作日志的方法暂不封装gameResultLog游戏结果日志的方法暂不封装rfloatLog写资金流水的方法暂不封装游戏主模块gameMainModelshowUserCount在线用户统计的方法已封装pushMessage推送消息的方法取消封装joinGameQueue加入游戏队列的方法已封装gameMatching匹配玩家并生成游戏空间,随机用户顺序的方法已封装shufflingLicensing洗牌发牌的方法,并整理排序已封装grabLandlord抢地主的方法未封装landlordCards地主牌分发及公示的方法未封装showCards出牌的方法未封装doubledFunds炸弹倍数翻倍计算的方法未封装cardAlarm报警的方法未封装settleAccounts结算并将用户清除队列的方法未封装系统模块sysModelmysqlObject数据库模块,具体方法不再罗列,这里采取封装主从库已封装memcacheExmemcached封装的模块,用于分布式集群已封装

=========================================
每个模块中都有调用Demo,可直接使用
更新记录:
后续更新
============2013-12-12=============
1、封装完成洗牌发牌的方法
2、将所有储存用户数据的指针转储memcached
============2013-12-11=============
1、封装用户登录验证的方法并确定socket验证方案
2、封装心跳检查等方法
3、封装用户发言和系统发言方法
3、封装在线统计方法
4、封装加入队列方法
5、封装随机匹配玩家方法
6、封装扑克牌生成方法
7、封装洗牌的方法
先放出userModel
============2013-12-10=============
1、由于封装的那个数据库操作类及其不方便使用,而且功能不强大,我想,要做就做好,所以,狠心重新封装mysqlDB类,由于懒,所以参考http://my.oschina.net/zhouguanghu/blog/32422作者进行二次封装,新增错误代码及错误提示方法,新增多库支持,新增事物多库支持,并贴上示例代码:

  1. #s = MysqlObject()

  2. #print s.getAll('us', 'select * from us_user')

  3. #print s.getOne('us', 'select * from us_user')

  4. #print s.getMany('us', 'select * from us_user',4)

  5. #print s.insertOne('us', "insert into us_user (user_name, user_pass, pass_rand, balance, funds_key, is_lock) values (%s, %s, %s, %s, %s, %s)", ['ddd33', '1s','2sa',5,'3df',1],1)                                        #参数4默认1,返回新增的主键,为0时返回修改的行数

  6. #如果是innoDB请commit()

  7. #s.commit('us')

  8. #print s.getErrorMsg().decode('UTF-8').encode('gb2312')

  9. #print s.update('us', 'update us_user set user_name=%s where user_id=%s',['dddd34', 1])

  10. #s.commit('us')

  11. #print s.delete('us', 'delete from us_user where user_id=%s',[15])

  12. #s.commit('us')

  13. '''开启事务,涉及到几个库就要开启几个前缀'''

  14. #s.begin('us')

  15. #s.begin('lo')

  16. '''执行代码操作,用try执行,捕获异常,如果执行数据库返回值为False,那么就创建异常'''

  17. #......

  18. #try:

  19. #        .....如果出错了,可以自定义错误

  20. #        raise Exception('err')  #抛出异常

  21. #        .....如果没有出现异常,则提交

  22. #        s.commit('us')

  23. #        s.commit('lo')

  24. #        return True                                #根据需要附上返回值

  25. #except Exception, e:

  26. #        ......返回自定义错误

  27. #        s.rollback('us')                                #回滚

  28. #        s.rollback('lo')

复制代码

2、由于大鸡蛋没封装cursorclass、autocommit等参数和方法,所以我没办法取返回数据的key值以及设置事务模式,很是无奈,好了,话不多说,先贴上更新的sysModel,此次更新后,userModel貌似就不能用了,必须改,好在我没有上传,哈哈
3、重新封装用户注册类,其实我有PHP版的注册登录验证机制,但是为了学习嘛,就在这里封装了。
============2013-12-3=============
申明:没有在日记中贴太多的代码,是因为:
第一、代码太多,贴不过来,压缩包都有,无需画蛇添足
第二、上面有各模块的命名及功能说明,对照文件中的各个模块可以很清晰的看到代码的设计思路以及流程走向,这些,说起来太麻烦,部分代码也体现不出来,索性要么初学者直接调用,要么进阶者逐行读代码理解,甚至可以自己修改封装。也算设置一个门槛,因为在我看来,这些都是摸索路程,我给你们提供一个方向,你们自行去走适合自己的路。同时,这也是我自己参考的笔记,所以,就不贴太多代码了,只是一些需要说明的,我会贴出来
============2013-12-2=============
因前几日事情繁多,故暂停更新,将于本日起重新更新
1、修正sysModel中的部分导致异常的BUG
2、修改query方法抛出异常时的返回值为-1(原为False,由于外键返回的IDENTITY为0,会与False冲突,故如此改动)
3、新增事务模拟函数,支持InnolDB, MyISAM
4、新增事务回滚函数uncommit()                                                #目前暂只支持insert回滚,后续加上
sysModel暂时存在问题,主要是事务模块,故暂不同步文件压缩包到本贴
5、完成用户注册模块

============2013-11-26=============
1、重新封装MemcacheEx模块,集成了memcache for firefly自带的功能,如get_multi,并新增hostname参数
2、合并MemcacheEx与MysqlObject为sysModel模块
3、MysqlObject支持多库,config.json增加多库配置
4、创建数据库表,上传数据库备份的SQL文件
5、MysqlObject扩展了方法调用参数,分离sql语句与用户参数组合成tuple,用execute占位符的方式避免sql注入
由于我时间不多,所以没从webpy的数据库层里面抠代码出来自己改个sqlbuilder,
这里感谢Lany大神的指导

  1. #mysql

  2. obj = MysqlObject()

  3. print obj.getOne('us', ('select * from us_user', []))                #无参数情况下

  4. print obj.getOne('us',('select * from us_user where user_name=?', ['ddd33']))

  5. #有参数情况下,这里用?还是%s根据你mysqldb默认格式来定,我的默认格式是format,所以我用%s

复制代码

...
6、更新依赖关系,userModel等其他模块依赖sysModel
============2013-11-25=============
1、mysqlObject封装在学习笔记一基础上分离长连接模式,使mysql连接方式分离为主从库连接模式

2、memcacheEx封装原有memcache并加入分布式集群的调用方式

随机推荐

  1. LeetCode[3] Longest Substring Without Repeating Characters

    题目描述 Given a string, find the length of the longest substring without repeating characters. For exam ...

  2. C#实现局域网文件传输

    网络通信一般都是通过Socket进行的,称为进程通信机制,通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄. 先学习一下socket基本原理: socket原理: ...

  3. HashMap完全解读

    一.什么是HashMap 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 Has ...

  4. iOS开发--XMPPFramework--框架的导入(二)

    创了一个XMPP即时通讯交流群140147825,欢迎大家来交流~我们是一起写代码的弟兄~ xmpp协议开发即时通讯,最常用的就是XMPPFramework. 第一种方法,是直接拖进项目 1.可以下载 ...

  5. Nginx故障排错及一个网站小实例

    Nginx访问403错误: 1.没有首页文件 2.没有权限 例:chmod  700 /application/nginx/html/index.html 3.nginx.conf配置文件和首页文件不 ...

  6. 吴恩达机器学习笔记25-神经网络的模型表示2(Model Representation of Neural Network II)

    ( FORWARD PROPAGATION ) 相对于使用循环来编码,利用向量化的方法会使得计算更为简便.以上面的神经网络为例,试着计算第二层的值: 这只是针对训练集中一个训练实例所进行的计算.如果我 ...

  7. Web Performance and Load Test Project错误集

    当我们创建Web Performance and Load Test Project时,经常会遇到下面这些问题: 1. 当点击Add Recording时, 左边的record tree没有出现: 解 ...

  8. Javassist学习总结

    今天在弄dubbo时出现了一个依赖缺少问题,就好奇研究一下,这个依赖是啥. javassist是一个字节码类库,可以用他来动态生成类,动态修改类等等 1.介绍Javassist 要想将编译时不存在的类 ...

  9. 取值为[1,n-1]含n个元素的整数数组,至少存在一个重复数,即可能存在多个重复数,O(n)时间内找出其中任意一个重复数,不使用额外存储空间。

    有一种非常诡异的算法,就是采用类似于单链表是否存在环的问题.“判断单链表是否存在环”是一个非常经典的问题,同时单链表可以采用数组实现,此时每个元素值作为next指针指向下一个元素.本题可以转换化为“已 ...

  10. MAC系统常用快捷键 基本常用的都整理在这里了

    写在前面 Mac系统中有几个比较特殊的功能键,和Win系统的区别也主要在这里比如在Win系统中我们常用的Ctrl键,在Mac系统中对应的不是长得比较像的Cnotrol,而是Command键,貌似也是M ...