用的是一个单例来管理 ,数据是存在本地的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. MySQL数据库一个字段对应多个值得模糊查询

    当一个字段想模糊查询出多个字段的时候,正常情况下一般会这么作 select * from a where name like 'a%' or name like 'b%' ....or ...; 但是 ...

  2. svn server

    svn server: 1.c:\Program Files\TortoiseSVN\bin>svnserve -d -r C:\Jasper\Repositories2.change the ...

  3. Gitblit Go

    1.Download the "Gitblit Go" package from the www.gitblit.com 2.UnZip the package 3.Open th ...

  4. Apache—DBUtils框架

    1.所需要jar包 commons-collections-2.1.1.jarmchange-commons-java-0.2.11.jarmysql-connector-java-5.1.18-bi ...

  5. 《利用python进行数据分析》读书笔记--第十一章 金融和经济数据应用(一)

    自2005年开始,python在金融行业中的应用越来越多,这主要得益于越来越成熟的函数库(NumPy和pandas)以及大量经验丰富的程序员.许多机构发现python不仅非常适合成为交互式的分析环境, ...

  6. 利用反射和ResultSetMetaData实现DBUtils的基本功能

    DBUtils大大简化了JDBC的书写,极大的提高了开发效率,和数据库连接池一起,简化了JDBC开发的流程.简易的自定义数据库连接池可以通过装饰者设计模式和动态代理模式得到很简单的实现,那么DBUti ...

  7. 初试 Matlab 之去除水印

    这几天很痛苦地去学习了下用 Matlab 来处理图像,其实那些算法我觉得还不算很难理解,可是 Matlab 这种反人类的语法(可能对于我来说是这样吧,毕竟熟悉了 C++ / Java 的语法一时间很难 ...

  8. Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

    在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. ...

  9. python窗体——pyqt初体验

    连续两周留作业要写ftp的作业,从第一周就想实现一个窗体版本的,但是时间实在太短,qt零基础选手表示压力很大,幸好又延长了一周时间,所以也就有了今天这篇文章...只是为了介绍一些速成的方法,还有初学者 ...

  10. JavaScipt 源码解析 异步

    我们常见的异步操作: 定时器setTimeout postmessage WebWorkor CSS3 动画 XMLHttpRequest HTML5的本地数据 等等- JavaScript要求在与服 ...