用的是一个单例来管理 ,数据是存在本地的xml文件里的格式如下

<?xml version="1.0" encoding = "utf-8" ?>
<rootNode>
<userinfo time="1449905923">
<account>abc002</account>
<password>a123456</password>
</userinfo>
<userinfo time="1430905758">
<account>abc001</account>
<password>a123456</password>
</userinfo>
</rootNode>

首先定义要用到的一些数信息

#include "AccountManager.h"
#include "external/tinyxml2/tinyxml2.h" #define ACCOUNT_FILE_NAME "userAccounts.xml"
#define ACCOUNT_SAVE_COUNT 5 //保存的账号数量
#define SECONDS_OF_DAY 86400 //一天的秒数
#define LIMIT_DAY 30LL //过效天数 AccountManager * AccountManager::m_pSelf = nullptr; struct LoginAccountInfo
{
string strAccount; //账号
string strPassword; //密码
string strDate; //最近登陆日期
};

在构造对象的时候获取以前保存的账号信息

AccountManager::AccountManager()
{
string strPath = FileUtils::getInstance()->getWritablePath() + ACCOUNT_FILE_NAME; if (FileUtils::getInstance()->isFileExist(strPath))
{
//提取账号信息到内存
tinyxml2::XMLDocument *pxmlDocument = new tinyxml2::XMLDocument;
pxmlDocument->LoadFile(strPath.c_str()); auto pxmlRootNode = pxmlDocument->RootElement(); auto pxmlNodeUinfo = pxmlRootNode->FirstChildElement();
while (pxmlNodeUinfo)
{
LoginAccountInfo accinfo;
accinfo.strDate = pxmlNodeUinfo->Attribute("time"); auto pxmlNodeAccunt = pxmlNodeUinfo->FirstChildElement();
accinfo.strAccount = pxmlNodeAccunt->GetText(); auto pxmlNodePassword = pxmlNodeAccunt->NextSiblingElement();
accinfo.strPassword = pxmlNodePassword->GetText(); m_vectorAccountsInfo.push_back(accinfo);
pxmlNodeUinfo = pxmlNodeUinfo->NextSiblingElement();
}
}
}

保存账号信息到文件

//保存账号到文件
void AccountManager::saveAccountInfoToFile(const string &strAccounts, const string &strPassword)
{
//排序账号
auto iteratorStr = m_vectorAccountsInfo.begin();
for (; iteratorStr != m_vectorAccountsInfo.end();++iteratorStr)
{
if ((*iteratorStr).strAccount == strAccounts)
{
m_vectorAccountsInfo.erase(iteratorStr);
break;
}
} //判断保存的账号是否超过5个
if (m_vectorAccountsInfo.size() >= ACCOUNT_SAVE_COUNT) m_vectorAccountsInfo.pop_back(); LoginAccountInfo accinfo;
accinfo.strAccount = strAccounts;
accinfo.strPassword = strPassword;
accinfo.strDate = getCurrentDate();
m_vectorAccountsInfo.insert(m_vectorAccountsInfo.begin(), accinfo); tinyxml2::XMLDocument *pxmlDoc = new tinyxml2::XMLDocument();
//声明
tinyxml2::XMLDeclaration *pxmlDeclare = pxmlDoc->NewDeclaration("xml version=\"1.0\" encoding = \"utf-8\" ");
assert(pxmlDeclare);
if (pxmlDeclare == nullptr) return;
pxmlDoc->LinkEndChild(pxmlDeclare); //根结点
tinyxml2::XMLElement *pxmlRootNode = pxmlDoc->NewElement("rootNode"); //添加账号子节点
for (size_t i = ; i < m_vectorAccountsInfo.size(); i++)
{
auto pxmlNodeUInfo = pxmlDoc->NewElement("userinfo");
pxmlNodeUInfo->SetAttribute("time", m_vectorAccountsInfo.at(i).strDate.c_str()); auto pxmlNodeAccount = pxmlDoc->NewElement("account");
pxmlNodeAccount->LinkEndChild(pxmlDoc->NewText(m_vectorAccountsInfo.at(i).strAccount.c_str()));
pxmlNodeUInfo->LinkEndChild(pxmlNodeAccount); auto pxmlNodePassword = pxmlDoc->NewElement("password");
pxmlNodePassword->LinkEndChild(pxmlDoc->NewText(m_vectorAccountsInfo.at(i).strPassword.c_str()));
pxmlNodeUInfo->LinkEndChild(pxmlNodePassword); pxmlRootNode->LinkEndChild(pxmlNodeUInfo);
}
pxmlDoc->LinkEndChild(pxmlRootNode); //保存到文件
if (pxmlDoc)
{
string strPath = FileUtils::getInstance()->getWritablePath() + ACCOUNT_FILE_NAME;
pxmlDoc->SaveFile(FileUtils::getInstance()->getSuitableFOpen(strPath).c_str());
delete pxmlDoc;
}
}
//获取当前时间 总秒值
string AccountManager::getCurrentDate()
{
time_t llTimeStamp = time(nullptr); string strDate; strDate = StringUtils::format("%lld", llTimeStamp); return strDate;
}
//判断账号是否保存超过限制天数
bool AccountManager::IsAcccountOutOfDate(const string &strAccount)
{
for (auto accinfo : m_vectorAccountsInfo)
{
if (accinfo.strAccount == strAccount)
{
long long llLoginTime = atoll(accinfo.strDate.c_str());
long long llNowTime = atoll(getCurrentDate().c_str());
long long llDay = (llNowTime - llLoginTime) / SECONDS_OF_DAY; if (llDay > LIMIT_DAY)
{
return true;
}
return false;
}
}
return false;
}

下面是UI部分会用到的数据获取,UI部分用了TableView

//获取所有账号
vector<string> AccountManager::getAllAccount()
{
vector<string> vectorAccounts; for (auto accinfo : m_vectorAccountsInfo)
{
vectorAccounts.push_back(accinfo.strAccount);
} return vectorAccounts;
}

以上只是数据管理,UI部分就不上代码了,大概思路就是登陆界面默认加载填充账号密码的时候判断账号是否超过给定天数(这里是30天,最上面宏定义),获取数据列表的时候把所有账号填充到定义有tableview的那个UI,登陆的时候刷新账号信息,把最近登陆的排在最前面(代码里面有写),然后保存到本地。

cocos2d 保存最近登陆多个账号最多一个月的更多相关文章

  1. python日志按天分割,保存近一个月日志,日志自动清理

    python日志按天分割,保存近一个月日志 import os import logging import re from logging.handlers import TimedRotatingF ...

  2. php 账号不能同时登陆,当其它地方登陆时,当前账号失效

    解决的思路是每当用户登陆时我们必需记录当前的用户id和session_id,如果有人在其它地方用此账号登陆时,我们把此用户id对应的session_id的session文件删除,并重新记录当前的ses ...

  3. java的web项目中使用cookie保存用户登陆信息

    本文转自:http://lever0066.iteye.com/blog/1735963 最近在编写论坛系统的实现,其中就涉及到用户登陆后保持会话直到浏览器关闭,同时可以使用cookie保存登陆信息以 ...

  4. laravel框架——保存用户登陆信息(session)

    public function inlog(Request $request) { //获取表单提交的数据 $input = $request->all(); //根本获取的数据去数据库中查询 ...

  5. jQuery cookie插件保存用户登陆信息

    通过jquery cookie插件保存用户登录信息. 代码: <html>  <head>  <title>cookies.html</title>  ...

  6. 如何禁止浏览器自动填充非登陆input的账号和密码?

    发现浏览器填充密码的方式,那就是,找到页面上第一个type为password的input填充.发现了这个规律后,很自然的就想到了,是不是可以在真正的password前面加一个隐藏的password,形 ...

  7. Ionic Cordova Sqlite 实现保存用户名登陆

    1.添加sqlite 组件 cordova plugin add https://github.com/litehelpers/Cordova-sqlite-storage.git --save 2. ...

  8. ie浏览器多开-----同时登陆多个账号

    1.在电脑桌面右键 找到 新建快捷方式 在上图输入框中输入 "C:\Program Files\Internet Explorer\iexplore.exe" -noframeme ...

  9. #写一个登陆的程序 ( 1.最多登录失败3次 2.登陆成功,提示欢迎XX登录,今天的日期是XXX,程序结束 3.要检验输入是否为空,账户和密码不能为空 4.账户不区分大小写)

    import datetime import MySQLdb today=datetime.datetime.today() username=str(input('请输入账户:')) passwd1 ...

随机推荐

  1. 【Unity3D游戏开发】之利用语法糖添加自定义拓展方法(下) (十八)

    首先需要声明的是“语法糖”这个词绝非贬义词,它可以给我带来方便,是一种便捷的写法,编译器会帮我们做转换:而且可以提高开发编码的效率,在性能上也不会带来损失.这让java开发人员羡慕不已,呵呵. 1.  ...

  2. iOS - Mac OS X 终端设置

    Mac OS X 终端设置 1)Finder 中显示资源库 方法一: 在 "终端" 中输入下面的命令: 显示: chflags nohidden ~/Library/ 隐藏: ch ...

  3. java程序调用存储过程

    java程序调用存储过程       PL/SQL子程序,很多情况下是给应用程序来调用的,所有我们要掌握使用其他编程语言来调用我们写好的存储过程.下面我们介绍下使用java调用Oracle的存储过程. ...

  4. python 发送邮件实例

    留言板回复作者邮件提醒 -----------2016-5-11 15:03:58-- source:python发送邮件实例

  5. static(静态、修饰符)

    static(静态.修饰符) static修饰成员变量时:static修饰成员变量时,那么该成员变量的数据就是一个共享的数据. 静态成员变量的访问方式: 方式一: 使用对象进行访问. 对象.属性名 方 ...

  6. Pycharm使用问题# 快捷键设置

    Pycharm内部设置也已经变得非常复杂,此处说明我改变字体大小的快捷键设置. 在Settings中找到Keymap一项,默认显示会展开Editor Actions一项: 在里面分别找到Decreas ...

  7. C++学习笔记一 —— 两个类文件互相引用的处理情况

    先记录一些零碎的知识点: 1. 一个类可以被声明多次,但只能定义一次,也就是可以 class B;  class B;  class B; ……;  class B {……};  这样子. 2. 一个 ...

  8. 转:C语言 可变参数

    C语言 可变参数 堆栈一般是怎么压栈处理的 /* * stack space: * *        参数3   |    up *        参数2   | *        参数1   v   ...

  9. MAC air 安装redis-3.0.6

    redis版本: p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #c33720; background-colo ...

  10. 【转】selenium之 定位以及切换frame

    转载自:http://www.voidcn.com/blog/huilan_same/article/p-6155896.html 很多人在用selenium定位页面元素的时候会遇到定位不到的问题,明 ...