\r
showip : false, //IPアドレスを表示するなら真。そうでないなら、偽\r
\r
- //詳細画面と編集画面に表示するフィールド名と表示名の組み合わせ\r
+ //詳細画面と編集画面に表示するフィールド名と表示名の組み合わせおよびテーブル定義\r
//表示される順番はこの変数によって決まります\r
- //連想配列の名称と型はinit.sqlと一致させること\r
//\r
//name 表示名を指定する\r
//type データ型を指定する。指定可能な型は以下の通り\r
// text 文字列型を受け付ける\r
// password パスワードとして指定できるものを受け付ける。デフォルトではすべての文字列です\r
- // number 数値型を受け付ける\r
+ // number 符号付数値型を受け付ける\r
+ // unsignednumber 符号なし数値型を受け付ける\r
// textarea 改行を含む文字列型を受け付ける\r
+ // bool BOOL型を受け付ける\r
+ // datetime DATETIME型を受け付ける\r
+ //length 長さを指定する\r
+ // numberの場合、2がSMALLINT、4がINTに対応する\r
+ // textとpasswordの場合、最大長を指定する\r
+ //defaultvalue デフォルト値を指定する\r
+ //primary プライマリーキーとして指定するなら真。そうでないなら偽\r
+ //isnotempty:真なら必須メンバーであることを表し、そうでないなら空欄でも構わないことを表す\r
//visible 詳細画面に表示するなら真。そうでないなら偽\r
- //rule バリテーション時のルール\r
- // 関数もしくは連想配列を指定する\r
- // 関数を指定した場合は成功時にnullを返す\r
- // 連想配列にしていできるメンバーは以下の通り\r
- // isnotempty:真なら必須メンバーであることを表し、そうでないなら空欄でも構わないことを表す\r
+ //visible_edit 編集画面に表示するなら真。そうでないなら偽\r
+ //rule バリテーション時に実行される関数を指定する\r
+ // 実行される関数でバリテーションが成功した場合、nullを返さなければならない\r
alias : {\r
+ //name以外の項目を編集しないでください。正常に動作しなくなります\r
+ //ここから\r
+ name_hash:\r
+ {\r
+ name : "名前(ハッシュ)",\r
+ type : "unsignednumber",\r
+ length : 4,\r
+ primary : true,\r
+ visible : false,\r
+ visible_edit : false,\r
+ isnotempty : true\r
+ },\r
name :\r
{\r
name : "名前",\r
type : "text",\r
visible : true,\r
- rule : {isnotempty : true}\r
+ visible_edit : true,\r
+ length : 64,\r
+ isnotempty : true\r
},\r
password :\r
{\r
name : "パスワード",\r
type : "password",\r
+ length : 32,\r
+ visible : false,\r
+ visible_edit : true,\r
+ },\r
+ lastmodified :\r
+ {\r
+ name : "更新日付",\r
+ type : "datetime",\r
visible : false,\r
+ visible_edit : false,\r
},\r
+ //ここまで\r
mailto :\r
{\r
name : "メールアドレス",\r
type : "mail",\r
+ length : 255,\r
visible : false,\r
+ visible_edit : true,\r
},\r
age :\r
{\r
name : "年齢",\r
type : "number",\r
+ defaultvalue : 0,\r
+ length : 2,\r
visible : true,\r
+ visible_edit : true,\r
},\r
height :\r
{\r
name : "身長",\r
type : "number",\r
+ defaultvalue : 0,\r
+ length : 2,\r
visible : true,\r
+ visible_edit : true,\r
},\r
weight :\r
{\r
name : "体重",\r
type : "number",\r
+ defaultvalue : 0,\r
+ length : 2,\r
visible : true,\r
+ visible_edit : true,\r
},\r
gender :\r
{\r
name : "性別",\r
type : "text",\r
+ length : 8,\r
visible : true,\r
+ visible_edit : true,\r
},\r
race :\r
{\r
name : "種族",\r
type : "text",\r
+ length : 64,\r
visible : true,\r
+ visible_edit : true,\r
},\r
etc :\r
{\r
name : "備考",\r
type : "textarea",\r
visible : true,\r
+ visible_edit : true,\r
},\r
},\r
};\r
--- /dev/null
+var util = require("util");
+var config = require("./configure.js");
+var async = require("async");
+
+var MySQLPool = new require("./mysql_pool.js");
+var pool = new MySQLPool({
+ host : config.db_host,
+ user : config.db_user,
+ password : config.db_password,
+ port : config.db_port,
+ database : "webchat",
+ });
+
+async.waterfall([
+ function(next){
+ var query = GetDropTableQuery("list");
+ pool.query(query,null,next);
+ },
+ function(result,next){
+ var query = GetCreateQuery(config.alias,"list");
+ pool.query(query,null,next);
+ },
+ function(result,next){
+ var query = GetDropTableQuery("ipbanlist");
+ pool.query(query,null,next);
+ },
+ function(result,next){
+ var def = {
+ ip:{
+ type : "text",
+ length : 64,
+ primary : true,
+ },
+ type:{
+ type : "text",
+ length : 1,
+ primary : true,
+ },
+ };
+ var query = GetCreateQuery(def,"ipbanlist");
+ pool.query(query,null,next);
+ },
+ function(result,next){
+ var query = GetDropTableQuery("rooms");
+ pool.query(query,null,next);
+ },
+ function(result,next){
+ var def = {
+ number:
+ {
+ type : "unsignednumber",
+ length:2,
+ isnotempty : true,
+ primary : true,
+ },
+ password:{
+ type : "text",
+ length : 16,
+ },
+ hiddenlog:{
+ type : "bool",
+ },
+ };
+ var query = GetCreateQuery(def,"rooms");
+ pool.query(query,null,next);
+ },
+],function(err){
+ console.log(err);
+ process.exit();
+});
+
+
+function GetDropTableQuery(tablename)
+{
+ var result = util.format("DROP TABLE IF EXISTS %s;",tablename);
+
+ console.log(result);
+
+ return result;
+}
+
+function GetCreateQuery(def,tablename)
+{
+ var result = "CREATE TABLE " + tablename + "(";
+ for(key in def)
+ {
+ switch(def[key].type)
+ {
+ case "text":
+ result += util.format("%s VARCHAR(%d) ",key,def[key].length);
+ break;
+ case "number":
+ result += util.format("%s %s ",key,GetIntType(def[key].length));
+ break;
+ case "unsignednumber":
+ result += util.format("%s %s UNSIGNED ",key,GetIntType(def[key].length));
+ break;
+ case "mail":
+ result += util.format("%s VARCHAR(%d) ",key,def[key].length);
+ break;
+ case "password":
+ result += util.format("%s VARCHAR(%d) ",key,def[key].length);
+ break;
+ case "textarea":
+ result += util.format("%s TEXT ",key);
+ break;
+ case "bool":
+ result += util.format("%s BOOL ",key);
+ break
+ case "datetime":
+ result += util.format("%s DATETIME ",key);
+ break;
+ default:
+ throw util.format("invaild %s type:%s",key,def[key].type);
+ }
+ if(typeof(def[key].isnotempty) != "undefined" && def[key].isnotempty)
+ result += " NOT NULL ";
+ result += ",";
+ }
+
+ for(key in def)
+ {
+ if(typeof(def[key].primary) != "undefined" && def[key].primary)
+ {
+ result += util.format("PRIMARY KEY(%s)",key);
+ break;
+ }
+ }
+ result += ");";
+
+ console.log(result);
+
+ return result;
+}
+
+function GetIntType(len)
+{
+ switch(len)
+ {
+ case 1:
+ return "TINYINT";
+ case 2:
+ return "SMALLINT";
+ case 4:
+ return "INT";
+ }
+ console.log(len);
+ throw "Invaild Length";
+}
update on *.* to user identified by 'user';
flush privileges;
CREATE DATABASE IF NOT EXISTS webchat DEFAULT CHARSET=utf8;
-use webchat;
-DROP TABLE IF EXISTS list;
-CREATE TABLE list(
-# does not edit
-# from
- name_hash INT UNSIGNED NOT NULL,
- name VARCHAR(64) NOT NULL,
- lastmodified DATETIME,
- password VARCHAR(32),
-# to
- mailto VARCHAR(255),
- age SMALLINT UNSIGNED DEFAULT 0,
- height SMALLINT UNSIGNED DEFAULT 0,
- weight SMALLINT UNSIGNED DEFAULT 0,
- gender VARCHAR(8),
- race VARCHAR(64),
- etc TEXT,
-# does not edit
-# from
- PRIMARY KEY(name_hash));
-# to
-
-DROP TABLE IF EXISTS ipbanlist;
-CREATE TABLE ipbanlist(ip VARCHAR(64) NOT NULL,
- type CHAR(1));
-
-DROP TABLE IF EXISTS rooms;
-CREATE TABLE rooms(number SMALLINT UNSIGNED NOT NULL,
- password VARCHAR(16),
- hiddenlog BOOL);
pool.query("SELECT * FROM list WHERE name_hash = ? and name = ?",[murmurhash.v3(name),name],cb);\r
}\r
this.AddAsync = function(data,cb){\r
- var item = GetItem(data);\r
+ var item = GetItem(data);;\r
pool.query("INSERT INTO list SET ?",[item],cb);\r
}\r
this.UpdatAsync = function(name,data,newpassword,cb){\r
for(var key in config.alias)\r
{\r
if(key == "password")\r
+ {\r
item[key] = md5_hex(data[key]);\r
- else\r
- item[key] = data[key];\r
+ }\r
+ else if(config.alias[key].visible_edit)\r
+ {\r
+ if(data[key] == "")\r
+ item[key] = config.alias[key].defaultvalue;\r
+ else\r
+ item[key] = data[key];\r
+ }\r
}\r
return item;\r
}\r
this.Message = "";\r
for(var key in alias)\r
{\r
- var message = IsValidate(body[key],alias[key].type,alias[key].rule);\r
+ if(alias[key].visible_edit == false)\r
+ continue;\r
+ var message;\r
+ if(typeof(alias[key].isnotempty) != "undefined" &&\r
+ alias[key].isnotempty && body[key] == "")\r
+ message = resource.is_not_empty;\r
+ message = IsValidate(body[key],alias[key].type,alias[key].rule);\r
if(message != null)\r
{\r
this.Message += "<p>" + alias[key].name + ":" + message + "</p>\n";\r
\r
var result = null;\r
\r
- if(typeof(rule) != "undefined" && typeof(rule.isnotempty) != "undefined"\r
- && rule.isnotempty && data == "")\r
- return resource.is_not_empty;\r
-\r
switch(type)\r
{\r
case "text":\r
\r
return result;\r
}\r
-}
\ No newline at end of file
+}\r
<form action="/profile/edit" method="POST">\r
<table>\r
<% for(var key in alias) {%>\r
- <tr>\r
- <td><%= alias[key].name %></td>\r
- <td>\r
- <% if(alias[key].type == "textarea"){ %>\r
- <textarea name="<%= key %>" rows="4" cols="50"><%= list[0][key] %></textarea>\r
- <% }else if(alias[key].type == "password"){ %>\r
- <input type="text" value="" name="<%= key %>"/><br/>\r
- <input type="checkbox" name="update<%= key %>" value="true">更新する</input>\r
- <% }else{ %>\r
- <input type="text" value="<%= list[0][key] %>" name="<%= key %>"/>\r
- <% } %>\r
- </td>\r
- </tr>\r
+ <% if(typeof alias[key] != "undefined" && alias[key].visible_edit) {%>\r
+ <tr>\r
+ <td><%= alias[key].name %></td>\r
+ <td>\r
+ <% if(alias[key].type == "textarea"){ %>\r
+ <textarea name="<%= key %>" rows="4" cols="50"><%= list[0][key] %></textarea>\r
+ <% }else if(alias[key].type == "password"){ %>\r
+ <input type="text" value="" name="<%= key %>"/><br/>\r
+ <input type="checkbox" name="update<%= key %>" value="true">更新する</input>\r
+ <% }else{ %>\r
+ <input type="text" value="<%= list[0][key] %>" name="<%= key %>"/>\r
+ <% } %>\r
+ </td>\r
+ </tr>\r
+ <% } %>\r
<% } %>\r
</table>\r
<input type="hidden" name="_csrf" value="<%= token %>"></input>\r
<form action="/profile/registor" method="POST">\r
<table>\r
<% for(var key in alias) {%>\r
- <tr>\r
- <td><%= alias[key].name %></td>\r
- <td>\r
- <% if(alias[key].type == "textarea"){ %>\r
- <textarea name="<%= key %>" rows="4" cols="50"></textarea>\r
- <% }else{ %>\r
- <input type="text" value="" name="<%= key %>"/>\r
- <% } %>\r
- </td>\r
- </tr>\r
+ <% if(typeof alias[key] != "undefined" && alias[key].visible_edit) {%>\r
+ <tr>\r
+ <td><%= alias[key].name %></td>\r
+ <td>\r
+ <% if(alias[key].type == "textarea"){ %>\r
+ <textarea name="<%= key %>" rows="4" cols="50"></textarea>\r
+ <% }else{ %>\r
+ <input type="text" value="" name="<%= key %>"/>\r
+ <% } %>\r
+ </td>\r
+ </tr>\r
+ <% } %>\r
<% } %>\r
</table>\r
<input type="hidden" name="_csrf" value="<%= token %>"></input>\r
<li><a href="http://nodejs.org/">ここ</a>のDownloadページからをnode.jsダウンロードし、インストールする</li>\r
<li><a href="http://www-jp.mysql.com/">ここ</a>のダウンロードからMySQLをダウンロードし、インストールする</li>\r
<li>mysql -u root -p < init.sqlを実行する</li>\r
+ <li>node init.jsを実行する</li>\r
<li>npm installを実行する</li>\r
<li>configue.jsのusernameとpasswordを適切なものに変更する</li>\r
<li>configue.jsのredis~を変更する(ローカル内でRedisSeverを起動する場合は不要)</li>\r
<li>configue.jsのredis~を変更する(ローカル内でRedisSeverを起動する場合は不要)</li>\r
<li>configue.jsのdb_~を変更する(ローカル内でRedisSeverを起動する場合は不要)</li>\r
<li>mysql -u root -p < init.sqlを実行する</li>\r
+ <li>node init.jsを実行する</li>\r
<li>main.jsを起動する</li>\r
</ol>\r
<h2>チャットの管理</h2>\r