finish mongodb plugin

This commit is contained in:
jysperm
2014-07-24 04:43:46 +08:00
parent 32b42068dc
commit 96be0a1aa5
10 changed files with 136 additions and 22 deletions

View File

@@ -16,7 +16,9 @@
mongo
use admin
db.addUser({user: 'rpadmin', pwd: 'password', roles: ['readWriteAnyDatabase', 'userAdminAnyDatabase', 'dbAdminAnyDatabase']})
db.addUser({user: 'rpadmin', pwd: 'password', roles: ['userAdminAnyDatabase', 'dbAdminAnyDatabase']})
use RootPanel
db.addUser({user: 'rpadmin', pwd: 'password', roles: ['readWrite']})
vi /etc/mongodb.conf

View File

@@ -26,7 +26,7 @@ RP3 的核心功能包括:
## 技术构成
* 前端Bootstrap3, jQuery, Jade, Less
* 前端Bootstrap(3), jQuery, Jade, Less
* 后端Express, Coffee
* 数据库MongoDB, redis
* 数据库MongoDB(2.4), Redis
* 操作系统支持Ubuntu 14.04

View File

@@ -7,6 +7,8 @@ i18n = require './i18n'
config = require './../config'
{requestAuthenticate} = require './router/middleware'
app.plugins = {}
exports.get = (name) ->
return require path.join(__dirname, "../plugin/#{name}")

View File

@@ -12,6 +12,27 @@ $ ->
.success ->
location.reload()
$('#widget-mongodb button.create-database').click ->
$.post '/plugin/mongodb/create_database', JSON.stringify
name: $(@).parents('.input-group').find('input').val()
.success ->
location.reload()
$('#widget-mongodb button.delete-database').click ->
if window.confirm 'Are you sure?'
$.post '/plugin/mongodb/delete_database', JSON.stringify
name: $(@).parents('tr').data 'name'
.success ->
location.reload()
$('#widget-mongodb button.update-password').click ->
$.post '/plugin/mongodb/update_password', JSON.stringify
password: $(@).parents('.input-group').find('input').val()
.success ->
location.reload()
# refactored above
service = $ '#service'
service.find 'button'
.on 'click', (e) ->

View File

@@ -58,7 +58,7 @@ block content
button(data-name= name).btn.btn-success 开启 #{t('plugins.' + name + '.name')}
for widget in widgets
.row
.row(id='widget-#{widget.plugin.name}')
!= widget.html
append footer

View File

@@ -1,5 +1,65 @@
crypto = require 'crypto'
{assertInService} = require '../../core/router/middleware'
mongodb = app.plugins.mongodb
mAccount = require '../../core/model/account'
module.exports = exports = express.Router()
exports.use assertInService 'mongodb'
exports.post '/update_password', (req, res) ->
unless req.body.password or /^[A-Za-z0-9\-_]+$/.test req.body.password
return res.error 'invalid_password'
md5 = crypto.createHash 'md5'
md5.update "#{req.account.username}:mongo:#{req.body.password}"
pwd = md5.digest 'hex'
mongodb.admin_users.update user: req.account.username,
$set:
pwd: pwd
, (err, result) ->
mongodb.admin.listDatabases (err, result) ->
dbs = _.filter result.databases, (i) ->
return i.name[..req.account.username.length] == "#{req.account.username}_"
async.each dbs, (db, callback) ->
db_users = app.db.db(db.name).collection 'system.users'
db_users.update user: req.account.username,
$set:
pwd: pwd
, ->
callback()
, ->
res.json {}
exports.post '/create_database', (req, res) ->
unless req.body.name[..req.account.username.length] == "#{req.account.username}_"
return res.error 'invalid_name'
unless /^[A-Za-z0-9_]+$/.test req.body.name
return res.error 'invalid_name'
mongodb.admin_users.findOne
user: req.account.username
, (err, result) ->
db_users = app.db.db(req.body.name).collection 'system.users'
db_users.insert
user: req.account.username
pwd: result.pwd
roles: ['readWrite', 'dbAdmin']
, (err) ->
res.json {}
exports.post '/delete_database', (req, res) ->
unless req.body.name[..req.account.username.length] == "#{req.account.username}_"
return res.error 'invalid_name'
unless /^[A-Za-z0-9_]+$/.test req.body.name
return res.error 'invalid_name'
app.db.db(req.body.name).dropDatabase ->
res.json {}

View File

@@ -1,3 +1,5 @@
app.plugins.mongodb = {}
action = require './action'
service = require './service'

View File

@@ -1,30 +1,56 @@
jade = require 'jade'
path = require 'path'
async = require 'async'
crypto = require 'crypto'
config = require '../../config'
mAccount = require '../../core/model/account'
mongodb = app.plugins.mongodb
mongodb.admin = app.db.admin()
mongodb.admin.authenticate config.mongodb.user, config.mongodb.password, ->
mongodb.admin_users = app.db.db('admin').collection 'system.users'
module.exports =
enable: (account, callback) ->
callback()
md5 = crypto.createHash 'md5'
md5.update "#{account.username}:mongo:#{mAccount.randomSalt()}"
pwd = md5.digest 'hex'
mongodb.admin_users.insert
user: account.username
pwd: pwd
roles: []
, (err, result) ->
console.log err, result
callback()
delete: (account, callback) ->
callback()
mongodb.admin_users.remove
user: account.username
, (err) ->
mongodb.admin.listDatabases (err, result) ->
dbs = _.filter result.databases, (i) ->
return i.name[..account.username.length] == "#{account.username}_"
async.each dbs, (db, callback) ->
app.db.db(db.name).dropDatabase ->
callback()
, ->
callback()
widget: (account, callback) ->
admin = app.db.admin()
admin.authenticate config.mongodb.user, config.mongodb.password, ->
admin.listDatabases (err, result) ->
dbs = _.filter result.databases, (i) ->
return i.name.slice(0, account.username.length + 1) == "#{account.username}_"
mongodb.admin.listDatabases (err, result) ->
dbs = _.filter result.databases, (i) ->
return i.name[..account.username.length] == "#{account.username}_"
jade.renderFile path.join(__dirname, 'view/widget.jade'),
account: account
dbs: dbs
, (err, html) ->
callback html
jade.renderFile path.join(__dirname, 'view/widget.jade'),
account: account
dbs: dbs
, (err, html) ->
callback html
preview: (callback) ->
jade.renderFile path.join(__dirname, 'view/preview.jade'), {}, (err, html) ->

View File

@@ -4,18 +4,19 @@ header MongoDB
.panel-heading
h3.panel-title 新建数据库
.panel-body
.input-group#mongodb-create
.input-group
input.form-control(value='#{account.username}_')
span.input-group-btn
button.btn.btn-default(type='button') 提交
button.create-database.btn.btn-default(type='button') 提交
.panel.panel-warning
.panel-heading
h3.panel-title 设置 MongoDB 密码
.panel-body
.input-group#mongodb-input
.input-group
input.form-control(type='password')
span.input-group-btn
button.btn.btn-default(type='button') 提交
button.update-password.btn.btn-default(type='button') 提交
.col-md-6
table(style= 'table-layout: fixed;').table.table-hover
thead
@@ -29,5 +30,5 @@ header MongoDB
td(style= 'white-space: nowrap; overflow: hidden;', title= db.name)= db.name
td #{(db.sizeOnDisk / 1024 / 1024).toFixed(1)}M
td
button.nginx-remove-btn.btn.btn-danger.btn-xs
button.delete-database.btn.btn-danger.btn-xs
span.glyphicon.glyphicon-remove-sign

View File

@@ -10,7 +10,7 @@ module.exports = exports = express.Router()
exports.use assertInService 'mysql'
exports.post '/update_password/', (req, res) ->
exports.post '/update_password', (req, res) ->
unless req.body.password or /^[A-Za-z0-9\-_]+$/.test req.body.password
return res.error 'invalid_password'