GithubHelp home page GithubHelp logo

hackplan / rootpanel Goto Github PK

View Code? Open in Web Editor NEW
145.0 17.0 45.0 4.04 MB

A pluggable PaaS service development framework.

Home Page: http://rootpanel.io/docs/

License: GNU Affero General Public License v3.0

CoffeeScript 76.17% CSS 2.41% HTML 21.26% JavaScript 0.05% Nginx 0.11%

rootpanel's Issues

2014.4.27 目前进度

完成的工作:

  • 初步设计服务插件的接口和结构
  • 美化/优化工单页面
  • 工单回复的前端逻辑

正在进行的工作:

  • 插件的加载
  • 订阅套餐相关功能

下一步工作:

  • 完成一个插件
  • 展示 WIKI

在服务器上运行时的 Bug (POST /account/login)

[app.coffee-0 (err) 2014-03-17T12:54:16] ReferenceError: callback is not defined
[app.coffee-0 (err) 2014-03-17T12:54:16]   at /root/RootPanel/core/model/Account.coffee:94:16
[app.coffee-0 (err) 2014-03-17T12:54:16]   at /root/RootPanel/core/model/Account.coffee:83:7
[app.coffee-0 (err) 2014-03-17T12:54:16]   at /root/RootPanel/core/model/Model.coffee:53:9
[app.coffee-0 (err) 2014-03-17T12:54:16]   at args.(anonymous function) (/root/RootPanel/core/model/Model.coffee:13:5)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at /root/RootPanel/node_modules/mongodb/lib/mongodb/collection/query.js:147:5
[app.coffee-0 (err) 2014-03-17T12:54:16]   at Cursor.nextObject (/root/RootPanel/node_modules/mongodb/lib/mongodb/cursor.js:733:5)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at commandHandler (/root/RootPanel/node_modules/mongodb/lib/mongodb/cursor.js:713:14)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at /root/RootPanel/node_modules/mongodb/lib/mongodb/db.js:1806:9
[app.coffee-0 (err) 2014-03-17T12:54:16]   at Server.Base._callHandler (/root/RootPanel/node_modules/mongodb/lib/mongodb/connection/base.js:442:41)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at /root/RootPanel/node_modules/mongodb/lib/mongodb/connection/server.js:485:18
[app.coffee-0 (err) 2014-03-17T12:54:16]   at [object Object].MongoReply.parseBody (/root/RootPanel/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at [object Object].<anonymous> (/root/RootPanel/node_modules/mongodb/lib/mongodb/connection/server.js:443:20)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at [object Object].EventEmitter.emit (events.js:95:17)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at [object Object].<anonymous> (/root/RootPanel/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:191:13)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at [object Object].EventEmitter.emit (events.js:98:17)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at Socket.<anonymous> (/root/RootPanel/node_modules/mongodb/lib/mongodb/connection/connection.js:418:22)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at Socket.EventEmitter.emit (events.js:95:17)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at Socket.<anonymous> (_stream_readable.js:746:14)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at Socket.EventEmitter.emit (events.js:92:17)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at emitReadable_ (_stream_readable.js:408:10)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at emitReadable (_stream_readable.js:404:5)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at readableAddChunk (_stream_readable.js:165:9)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at Socket.Readable.push (_stream_readable.js:127:10)
[app.coffee-0 (err) 2014-03-17T12:54:16]   at TCP.onread (net.js:528:21)

这个是 POST /account/login/ 的时候的。

用户系统功能讨论稿

功能

页面(3 个):

  • 注册
  • 登录
  • 主面板

登录后是一个主面板,类似 RP2 现在的面板。
左面是导航条,右面是主体区域,具体有什么内容要取决于插件,这部分我们在插件系统中再讨论。

登录后,顶部导航条会显示用户名,和提醒(其实就是工单)数量,这个和 RP2 现在的情况也是差不多的。

数据库

数据库中的每条用户数据大致是这样的。

首先基本信息:

  • username
  • email
  • passwd
  • passwd_salt
  • signup_at

验证相关的信息:

  • tokens[]
    • token
    • created_at
    • updated_at
    • available
    • attribute

插件化相关的信息:

  • groups[]
  • settings{}
  • attribute{}

groups 即用户所属的组,这个组可以是管理员,或者付费用户,或者试用用户等等。

settings 主要是由用户输入的一些个性化信息,如联系方式,默认语言等。

attribute 是用户的一些其他属性,如是否启用了某个服务。

安全

密码散列算法会使用一个和 RP2 不兼容的算法:

sha256(sha256(passwd) + passwd_salt)

其中 passwd_salt 是一个 256 bit 的 Hex 随机数,这个算法是我前两天调研的,最简单也最安全的用户密码储存方案。

tokens.token 也是一个 256 bit 的Hex 随机数,tokens.available 记录了这个 Token 是否可用,tokens.attribute 里会储存一些额外信息,例如 IP 和 UA.

2014.2.18 目前进度

以后每周都会有进度总结。

已完成的工作:

  • 前端页面:login, signup
  • 国际化、路由、前端的大致框架
  • 数据库结构:users

正在进行:

  • 调研如何实现 Model(改用了 mongodb)
  • 用户登录状态验证的基础设施(已经完成了一部分), 包括在上方导航栏显示用户信息

下一步工作:

  • 前端的配色还没有做,目前的配色是直接取自 NodeTalk 的
  • 调研前后端交互,即 API 约定
  • 用户系统的处理器
  • 设计工单系统

2014.3.16 目前进度

已完成的工作:

  • 设计工单系统的数据库结构
  • API: account/logout
  • API: ticket/create, 未测试
  • 前端顶部导航的用户登录状态条
  • 前端错误处理框架
  • 前端逻辑:注册,登录,注销
  • 在边栏显示版本号

正在进行:

  • 整理文档
  • 创建用户手册 WIKI
  • 前端部署工具
  • 工单系统 API

下一步工作:

  • 工单系统各前端页面
  • 工单系统前端逻辑
  • 重写原状态监视器

2014.4.9 目前进度

完成的工作:

  • 左侧导航条
  • 前端页面:工单列表,创建工单
  • 前端 JS: 创建工单
  • API: 回复工单,更新工单

下一步工作:

  • 重构 Model
  • 测试工单相关 API
  • 前端页面:工单页面

登录之后进入panel报错

TypeError: /Users/Yudong/github/RootPanel/core/view/panel.jade:31
    29|           table.table.table-hover
    30|             tbody
  > 31|               for plan in plans
    32|                 tr
    33|                   td= plan.t_name
    34|                   td= plan.t_service

Cannot read property 'length' of undefined
    at jade_debug.unshift.lineno (eval at <anonymous> (/Users/Yudong/github/RootPanel/node_modules/jade/lib/jade.js:172:8), <anonymous>:310:31)
    at eval (eval at <anonymous> (/Users/Yudong/github/RootPanel/node_modules/jade/lib/jade.js:172:8), <anonymous>:449:4)
    at eval (eval at <anonymous> (/Users/Yudong/github/RootPanel/node_modules/jade/lib/jade.js:172:8), <anonymous>:512:21)
    at res (/Users/Yudong/github/RootPanel/node_modules/jade/lib/jade.js:173:38)
    at Object.exports.render (/Users/Yudong/github/RootPanel/node_modules/jade/lib/jade.js:269:10)
    at Object.exports.renderFile (/Users/Yudong/github/RootPanel/node_modules/jade/lib/jade.js:305:18)
    at View.exports.renderFile [as engine] (/Users/Yudong/github/RootPanel/node_modules/jade/lib/jade.js:290:21)
    at View.render (/Users/Yudong/github/RootPanel/node_modules/express/lib/view.js:76:8)
    at Function.app.render (/Users/Yudong/github/RootPanel/node_modules/express/lib/application.js:502:10)
    at ServerResponse.res.render (/Users/Yudong/github/RootPanel/node_modules/express/lib/response.js:779:7)
GET /panel/ 500 310ms - 1.43kb

需要制作的宣传页面

  • / - 首页
  • /panel/pay/ - 支付页面,上面也会显示支付历史
  • /public/wiki/ - 用户手册(WIKI)
  • /public/monitor/ - 服务器状态监视器(NodeMonitor)
  • /public/services/ - 介绍 RP 主机支持的各种服务

注销登录时的崩溃

/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/base.js:245
        throw message;      
              ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
    at ServerResponse.res.setHeader (/Users/Yudong/github/RootPanel/node_modules/connect/lib/patch.js:63:22)
    at ServerResponse.res.set.res.header (/Users/Yudong/github/RootPanel/node_modules/express/lib/response.js:524:10)
    at ServerResponse.res.location (/Users/Yudong/github/RootPanel/node_modules/express/lib/response.js:636:8)
    at ServerResponse.res.redirect (/Users/Yudong/github/RootPanel/node_modules/express/lib/response.js:677:8)
    at /Users/Yudong/github/RootPanel/core/api/panel.js:13:22
    at /Users/Yudong/github/RootPanel/core/model/account.js:99:14
    at /Users/Yudong/github/RootPanel/core/db.js:55:14
    at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/collection/query.js:156:5
    at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/cursor.js:744:35

/ticket/reply

/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/base.js:245
        throw message;      
              ^
Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
    at new ObjectID (/Users/Yudong/github/RootPanel/node_modules/mongodb/node_modules/bson/lib/bson/objectid.js:35:11)
    at Object.exports.ObjectID (/Users/Yudong/github/RootPanel/core/db.js:33:10)
    at Object.that.findId (/Users/Yudong/github/RootPanel/core/db.js:60:20)
    at /Users/Yudong/github/RootPanel/core/api/ticket.js:138:24
    at /Users/Yudong/github/RootPanel/core/db.js:55:14
    at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/collection/query.js:156:5
    at Cursor.nextObject (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/cursor.js:739:5)
    at commandHandler (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/cursor.js:713:14)
    at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/db.js:1843:9
    at Server.Base._callHandler (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/base.js:445:41)

2014.5.7:工单/用户/套餐系统全面完工

总结一下剩余的工作:

  • 工单系统的状态管理,成员管理
  • 细化工单系统的权限
  • 美化工单页面的 UI
  • 在管理员面板上显示更多信息,可以删除用户,修改用户信息
  • 套餐的订购和退订

还是bug了。

/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/base.js:245
        throw message;      
              ^
TypeError: Cannot read property 'map' of undefined
  at _map (/Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:54:16)
  at _asyncMap (/Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:237:15)
  at Object.map (/Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:219:23)
  at async.map.widgets (/Users/Yudong/github/RootPanel/core/api/panel.js:42:26)
  at /Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:249:17
  at /Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:125:13
  at Array.forEach (native)
  at _each (/Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:46:24)
  at async.each (/Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:124:9)
  at _asyncMap (/Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:248:13)
  at Object.map (/Users/Yudong/github/RootPanel/node_modules/async/lib/async.js:219:23)
  at /Users/Yudong/github/RootPanel/core/api/panel.js:39:24
  at Object.exports.checkBilling (/Users/Yudong/github/RootPanel/core/billing.js:13:14)
  at module.exports.get./panel/ (/Users/Yudong/github/RootPanel/core/api/panel.js:26:24)
  at /Users/Yudong/github/RootPanel/core/api/index.js:69:14
  at /Users/Yudong/github/RootPanel/core/api/index.js:59:16
  at /Users/Yudong/github/RootPanel/core/db.js:63:16
  at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/collection/query.js:159:5
  at Cursor.nextObject (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/cursor.js:742:5)
  at commandHandler (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/cursor.js:716:14)
  at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/db.js:1846:9
  at Server.Base._callHandler (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/base.js:445:41)
  at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/server.js:468:18
  at [object Object].MongoReply.parseBody (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/responses/mongo_reply.js:68:5)
  at [object Object].<anonymous> (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/server.js:426:20)
  at [object Object].EventEmitter.emit (events.js:95:17)
  at [object Object].<anonymous> (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:201:13)
  at [object Object].EventEmitter.emit (events.js:98:17)
  at Socket.<anonymous> (/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/connection.js:422:22)
  at Socket.EventEmitter.emit (events.js:95:17)
  at Socket.<anonymous> (_stream_readable.js:746:14)
  at Socket.EventEmitter.emit (events.js:92:17)
  at emitReadable_ (_stream_readable.js:408:10)
  at emitReadable (_stream_readable.js:404:5)
  at readableAddChunk (_stream_readable.js:165:9)
  at Socket.Readable.push (_stream_readable.js:127:10)
  at TCP.onread (net.js:526:21)

make: *** [run] Error 8

无法创建工单回复+排序建议

填写内容并且创建回复后
Cannot POST /ticket/view/?id=IDIDIDIDIDIDIDDIDIDIDID

目前工单的排序顺序是创建时间晚的在下面,建议反过来。

充值和套餐相关逻辑

RootPanel 支持在配置文件里设置多套餐,每个套餐可以选择要开放的服务,以及每个服务的资源限额,以及价格。
每个用户同时只能属于一个套餐。
充值到账户里,数据库里储存的是金额,但显示的是按照当前套餐,可以维持的剩余天数。
充值每次可以充任意金额,单次达到 19 元(以前的季付价格), 给予 20% 的折扣(原季付折扣).

2014.4.14 目前进度

完成的工作:

  • 重构 Model
  • 测试工单相关 API
  • 为所有 API 编写了单元测试

下一步:

  • 前端页面:工单页面
  • 完成工单系统的前端逻辑
  • 重新设计国际化系统
  • 开始设计服务插件

关于ticket API

update ticket
{
    "id": "525284cc2cebb6d0008b4567",
    // optional
    "type": "linux",
    // optional
    "status": "closed",

    // only for admin group user
    "attribute": {
        "public": true
    },
    "members": {
        // add a user
        "525284cc2cebb6d0008b4567": true,
        // remove a user
        "4cc2cebb6d5254567280008b": false
    }
}

添加删除成员是不是这样好点

members: {
  add: ['525284cc2cebb6d0008b4567', '525284cc2cebb6d0008b4567'],
  remove: ['525284cc2cebb6d0008b4567','525284cc2cebb6d0008b4567']
}

关于前后端交互

考虑到表单在提交前需要检查,提交后需要错误处理。而且很多表单项目会是 JSON 格式的,所以打算所有表单都用 JS 重新处理再用 XHR 发给后端。请求和响应都使用 application/json 格式。

2014.2.11 目前进度

数据库驱动打算用 mongous, 然后第一步是调研怎么写 Model...
还有 mongoose 这东西似乎是用来写 Model 的,总之和 mongous 的关系很乱套。

UI 上,你不想写我可以写,反正就是 bootstrap 嘛,色调继续蓝色调,知乎蓝。

未来两个月的时间表

  • 5.7 - 工单/用户/套餐系统全面完工
  • 5.15 - 完成 SSH 插件,开放测试
  • 6.1 - 补全其他服务插件,完整测试
  • 6.6 - 迁移 us1, jp1, 正式上线
  • 6.25 - 补全其他插件,用户手册,宣传页面,去 V2EX 发广告

工单系统功能初步讨论稿

工单就是用户和管理员沟通的主要途径,相比于 RP2, RP3 计划实现这些功能:

  • 管理员可以公开工单,作为类似 FAQ 的东西
  • 可以合并多个工单,比如多个用户提出同一个问题时,管理员可以合并多个工单,以便统一汇报进度
  • 工单支持 Markdown

RP2 的工单类型一直都是个摆设,我本来打算根据工单类型,会在工单页面上显示最常见的问题 FAQ 的。

和之前一样,在 RP3 里所有通知都体现为工单,顶部导航条的右边会显示当前开放中的工单数量。和之前一样,工单是有邮件提醒的。

工单的类型,也算是处理流程,和之前也差不多:

  • 等待管理员回复
  • 等待用户回复
  • 管理员标记已完成
  • 关闭

根据我使用 RP2 的体验,应该增加一个 15 天后自动关闭工单的功能。

2014.4.21 目前进度

完成的工作:

  • 重新设计了后端的国际化系统
  • 前端页面:工单详情,管理员面板
  • 设计了付费和套餐相关的逻辑
  • 测试了在 Ubuntu 14.04 下的部署

正在进行的工作:

  • 设计服务插件的接口
  • 前端逻辑:工单回复

下一步工作:

  • 管理员面板
  • 完善工单和用户系统

访问报错

/Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/connection/base.js:245
throw message;
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
at ServerResponse.res.setHeader (/Users/Yudong/github/RootPanel/node_modules/connect/lib/patch.js:63:22)
at ServerResponse.res.set.res.header (/Users/Yudong/github/RootPanel/node_modules/express/lib/response.js:524:10)
at ServerResponse.res.location (/Users/Yudong/github/RootPanel/node_modules/express/lib/response.js:636:8)
at ServerResponse.res.redirect (/Users/Yudong/github/RootPanel/node_modules/express/lib/response.js:677:8)
at /Users/Yudong/github/RootPanel/core/api/panel.js:13:22
at /Users/Yudong/github/RootPanel/core/model/account.js:99:14
at /Users/Yudong/github/RootPanel/core/db.js:55:14
at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/collection/query.js:156:5
at /Users/Yudong/github/RootPanel/node_modules/mongodb/lib/mongodb/cursor.js:744:35

2014.5.7 目前进度

完成的工作:

  • 为插件加载国际化文件
  • API: account/update_passwd, ticket/list
  • 工单状态变更和细化权限
  • /plan/subscribe/

正在进行的工作:

  • 前端逻辑:工单状态变更的,成员管理
  • /plan/unsubscribe/

下一步工作:

  • 完成一个插件
  • 展示 WIKI
  • 理员面板的更多选项

作为一个设计师牛的工作 @oranzhang

  • 给 Bootstrap3 配色:知乎蓝
  • 调研前端要不要使用某种框架(我倾向于不要)
  • UI 的草图

其他工作:

  • 调研用户系统和工单系统应该实现哪些功能

2014.3.3 目前进度

已完成的工作:

  • 用户部分的登录和注册 API, 但还未测试
  • Model, 未测试
  • 用户登录状态验证的基础设施,未测试
  • 前端使用『鞋拔子紫』配色
  • 对路由机制做了一些修改

正在进行:

  • 测试已完成的 API

下一步工作:

  • 完善用户部分的 API
  • 设计工单部分的数据库和 API
  • 前端提交表单的功能

2014.3.28 目前进度

完成的工作:

  • 前端部署工具和文档

正在进行:

  • 左侧导航条
  • 整理文档
  • 创建用户手册 WIKI
  • 工单系统 API

下一步工作:

  • 工单系统各前端页面
  • 工单系统前端逻辑
  • 重写原状态监视器

参与成员介绍

@jysperm RP2 作者,RP 主机维护者,RP3 牵头人。对前端 JS 了解较少,审美观畸形,除此之外可以完成其他所有工作。预定负责和 Linux 系统服务联系较为紧密的部分,即各『服务插件』。

@lyd600lty 主动参加,前后端 JS 都能写。不情愿写 UI 以及设计 UI.

@sxd1140 主动参加,可以写 Node, 对 Linux 系统服务不太了解。

@oranzhang 著名设计师,擅长前端,时间不多,被强拉来的。

@RicterZ Python 独立开发者,Web 安全牛,写过前端,初学 Node。被强拉来的,时间不多。

@faceair

描述不准确大家可以补充。

2014.3.9 目前进度

已完成的工作:

  • 测试完成 user/signup, user/login
  • 测试完成 Model 的大部分功能,Model 基本稳定

正在进行:

  • 编写注册和登录功能对应的前端

下一步工作:

  • 完善用户部分的 API
  • 设计工单部分的数据库和 API

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.