cocos2d 保存最近登陆多个账号最多一个月
用的是一个单例来管理 ,数据是存在本地的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 保存最近登陆多个账号最多一个月的更多相关文章
- python日志按天分割,保存近一个月日志,日志自动清理
python日志按天分割,保存近一个月日志 import os import logging import re from logging.handlers import TimedRotatingF ...
- php 账号不能同时登陆,当其它地方登陆时,当前账号失效
解决的思路是每当用户登陆时我们必需记录当前的用户id和session_id,如果有人在其它地方用此账号登陆时,我们把此用户id对应的session_id的session文件删除,并重新记录当前的ses ...
- java的web项目中使用cookie保存用户登陆信息
本文转自:http://lever0066.iteye.com/blog/1735963 最近在编写论坛系统的实现,其中就涉及到用户登陆后保持会话直到浏览器关闭,同时可以使用cookie保存登陆信息以 ...
- laravel框架——保存用户登陆信息(session)
public function inlog(Request $request) { //获取表单提交的数据 $input = $request->all(); //根本获取的数据去数据库中查询 ...
- jQuery cookie插件保存用户登陆信息
通过jquery cookie插件保存用户登录信息. 代码: <html> <head> <title>cookies.html</title> ...
- 如何禁止浏览器自动填充非登陆input的账号和密码?
发现浏览器填充密码的方式,那就是,找到页面上第一个type为password的input填充.发现了这个规律后,很自然的就想到了,是不是可以在真正的password前面加一个隐藏的password,形 ...
- Ionic Cordova Sqlite 实现保存用户名登陆
1.添加sqlite 组件 cordova plugin add https://github.com/litehelpers/Cordova-sqlite-storage.git --save 2. ...
- ie浏览器多开-----同时登陆多个账号
1.在电脑桌面右键 找到 新建快捷方式 在上图输入框中输入 "C:\Program Files\Internet Explorer\iexplore.exe" -noframeme ...
- #写一个登陆的程序 ( 1.最多登录失败3次 2.登陆成功,提示欢迎XX登录,今天的日期是XXX,程序结束 3.要检验输入是否为空,账户和密码不能为空 4.账户不区分大小写)
import datetime import MySQLdb today=datetime.datetime.today() username=str(input('请输入账户:')) passwd1 ...
随机推荐
- KNN算法与Kd树
最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...
- C#报修系统Ⅱ
用户需求: 1.用户可以注册,可以登录. 2.需要一个报修界面,当点击“报修”按钮时,软件会把用户报修的信息保存起来,更新报修次数,同时会清空相应的文本框,软件还要要检查所有文本框是否为空,空的话给出 ...
- consul笔记
1 webui 默认最新的webui只支持127.0.0.1这种的本机网站的 不支持192.168.1.2 启用192.168.1.2的支持 命令加 -client 192.168.2.156 感谢赵 ...
- PHP操作MySQL的常用函数
某些情况下(如html中),调用php的变量时,要给变量加{},若要使字符串变量加上引号,则还需要在{}外加引号 如: $sql="select * from admin where use ...
- php : 类常量
使用总结: 1.不能使用 define 来定义 2.通过 "类名::常量名" 来获取 /** * PHP类常量 * * 类常量属于类自身,不属于对象实例,不能通过对象实例访问 * ...
- ★Java多线程编程总结 系列 转
下面是Java线程系列博文的一个编目: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Jav ...
- [原创] RT7 Lite win7旗舰版精简方案
[原创] RT7 Lite win7旗舰版精简方案 墨雪SEED 发表于 2016-1-26 21:23:54 https://www.itsk.com/thread-362912-1-5.html ...
- bootstrap笔记-布局
1.通过文本对齐类,可以简单方便的将文字重新对齐. <p class="text-left">Left aligned text.</p> <p cl ...
- SPSS数据分析—描述性统计分析
描述性统计分析是针对数据本身而言,用统计学指标描述其特征的分析方法,这种描述看似简单,实际上却是很多高级分析的基础工作,很多高级分析方法对于数据都有一定的假设和适用条件,这些都可以通过描述性统计分析加 ...
- 0512 Scrum 项目3.0
SCRUM 流程的步骤2: Spring 计划 1. 确保product backlog井然有序.(参考示例图1) 2. Sprint周期,一个冲刺周期,长度定为两周,本学期还有三个冲刺周期. 3. ...