diff --git a/index.js b/index.js index d9abcf2..a541d9e 100644 --- a/index.js +++ b/index.js @@ -73,11 +73,30 @@ function session_list(req, res) { }) } +import Cache from './cache.js' +const cache = new Cache() + // 登录会话 function session_create(req, res) { - return db('user').findOne({ name: req.body.name }, function (err, doc) { + let { mobile, code, name, password } = req.body + + // 也许使用验证码登录(临时验证码) && code !== '000000' + if (mobile && code) { + if (code !== cache.get(mobile)) return res.status(400).send('验证码错误') + return db('user').findOne({ mobile }, function (err, doc) { + if (!doc) return res.status(400).send('账户不存在') + return req.session.regenerate(function (err) { + req.session.account = { uid: doc._id, gid: doc.gid ?? 0 } + let { salt, password, ...user } = doc + return res.json(user) + }) + }) + } + + // 也许使用账号密码登录 + return db('user').findOne({ name }, function (err, doc) { if (!doc) return res.status(400).send('账户不存在') - if (md5(req.body.password + doc.salt) !== doc.password) return res.status(400).send('密码错误') + if (md5(password + doc.salt) !== doc.password) return res.status(400).send('密码错误') return req.session.regenerate(function (err) { req.session.account = { uid: doc._id, gid: doc.gid ?? 0 } let { salt, password, ...user } = doc diff --git a/src/cache.js b/src/cache.js new file mode 100644 index 0000000..69e07dc --- /dev/null +++ b/src/cache.js @@ -0,0 +1,21 @@ +// 实现一个简单的缓存,默认10分钟自动过期 +export default class Cache { + constructor(date=10) { + this.date = date * 60 * 1000; + this.cache = new Map(); + } + set(key, value) { + this.cache.set(key, { value, expire: Date.now() + this.date }); + } + get(key) { + let item = this.cache.get(key); + if (!item) { + return null; + } + if (item.expire < Date.now()) { + this.cache.delete(key); + return null; + } + return item.value; + } +} diff --git a/src/restful.js b/src/restful.js new file mode 100644 index 0000000..4314211 --- /dev/null +++ b/src/restful.js @@ -0,0 +1,88 @@ +// 标准 +// 所有访问路径皆为对象 +// 所有对象都有共同的属性和方法 +// 使用权限管理 + +// 因此, 一个 RESTful API 的模型 +// 由无限对象组成 +// 由无限权限组成 +// 由无限方法组成 + +// 对象 +export class object { + // 对象可以删除, 修改, 添加子项 + // 对象可以赋权, 取消赋权, 引用赋权 + + constructor(id) { + // 通过 ID 载入对象(虚拟) + // 仅在确实读取到数据时, 才会从数据库中读入数据 + } + + PUT(data) { + // data, 应具有对象模型的基本属性 + // ID, 名称, 描述, 父级, 权限, 子项 + } + + PATCH(data) {} + + DELETE() { + // 删除对象(自身而不是子项) + // 从数据库删除对象 + // 从内存中删除对象 + // 因此, 对象是虚拟的, 并没有数据 + } + +} + +// 权限 +export class permission { +} + +// 方法 +export class method { +} + + +// 数据并不需要固定的模型 +// 因为只要及时更改迁移或虚拟引用(集,交集,并集,差集) + + +// (因为后端程序的用意, 便是灵活管理数据) +// 权限也只是一个数据集(虚拟) + + + +// 无限虚拟集中取常用集及查询方式(针对反复查询的纬度建立索引) + + + +// 1. 无限新建对象 +// 2. 无限新建集合(集合模型)(虚拟对象) +// 3. 对象归类于集合 +// 4. 权限是集合之一 + +// 单体数据也属于集合(非重复) +// 单体数据只有摘要 +// 没有关联数据不需要关系型数据库 + +// 使用 levelDB 作为数据库, 无需配置依赖 +// 无限创建库 + +import level from 'level' + +export class mono { + constructor() { + // 无需初始化基础库, ROOT无需注册 + // 载入热数据 + } + + 检查并创建目录(dirname) { + if (fs.existsSync(dirname)) { + return true + } else if (thiss.检查并创建目录(path.dirname(dirname))) { + fs.mkdirSync(dirname) + return true + } + return false + } +}