GithubHelp home page GithubHelp logo

hackplan / rootpanel Goto Github PK

View Code? Open in Web Editor NEW
145.0 145.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 People

Contributors

jysperm avatar kanakin avatar kinosang avatar lyd600lty avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

rootpanel's Issues

用户系统功能讨论稿

功能

页面(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.5.7:工单/用户/套餐系统全面完工

总结一下剩余的工作:

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

关于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']
}

2014.5.7 目前进度

完成的工作:

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

正在进行的工作:

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

下一步工作:

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

关于前后端交互

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

2014.3.9 目前进度

已完成的工作:

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

正在进行:

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

下一步工作:

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

2014.2.18 目前进度

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

已完成的工作:

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

正在进行:

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

下一步工作:

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

未来两个月的时间表

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

2014.4.14 目前进度

完成的工作:

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

下一步:

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

注销登录时的崩溃

/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.3.3 目前进度

已完成的工作:

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

正在进行:

  • 测试已完成的 API

下一步工作:

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

访问报错

/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

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

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

其他工作:

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

参与成员介绍

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

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

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

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

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

@faceair

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

登录之后进入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

2014.2.11 目前进度

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

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

工单系统功能初步讨论稿

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

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

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

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

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

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

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

需要制作的宣传页面

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

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

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

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

2014.3.28 目前进度

完成的工作:

  • 前端部署工具和文档

正在进行:

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

下一步工作:

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

2014.4.21 目前进度

完成的工作:

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

正在进行的工作:

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

下一步工作:

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

在服务器上运行时的 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/ 的时候的。

2014.3.16 目前进度

已完成的工作:

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

正在进行:

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

下一步工作:

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

还是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

充值和套餐相关逻辑

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

2014.4.27 目前进度

完成的工作:

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

正在进行的工作:

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

下一步工作:

  • 完成一个插件
  • 展示 WIKI

2014.4.9 目前进度

完成的工作:

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

下一步工作:

  • 重构 Model
  • 测试工单相关 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.