这是一个通过javascript模拟数据库控制台的小程序,不过目前的功能十分简单仅能完成简单的创建表,删除表和简单的select,update,insert,delete操作。想做这个已经很久了,但由于自己的水平有限到目前为止也只能做成这个样子,如果大家有什么好的想法或建议,还望多多指教。
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width; initial-scale=1.0">
<title>虚拟数据库控制台</title>
<link rel="stylesheet" href="./css/css.css" />
</head>
<body>
<div class="console">
<div class="output">
<pre class="systemInfo">
******************************************
* *
* Virtual Database Console *
* *
******************************************
</pre>
<div class="userOutput"></div>
</div>
<div class="input" contenteditable="true"></div>
</div>
<div class="data">
</div>
<script type="text/javascript" src="./js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="./js/main.js"></script>
</body>
</html>
html,body{
margin:0px;
padding: 0px;
}
body{
background-color: #000;
}
.console{
width:100%;
margin: 0 5px;
}
.input{
height:200px;
color: #fff;
outline: none;
}
.systemInfo{
color:#0f0;
}
.userOutput{
color:#00d;
}
.userOutput table{
color:red;
margin-left:20px;
border:0px;
}
.data{
display: none;
}
$(function(){
initEditAndFocus();
//处理按键事件
$(".input").keydown(function(event){
//keyCode:13(代表回车)
if(event.keyCode==13){
var command=$(".input").text();
command=$.trim(command);
if(command.substr(-1)==';'){
showInfo(command);
//处理sql命令
executeCommand(command.replace(/SQL>/,''));
initEditAndFocus();
return false;
}
}
});
//初始化编辑框并定位光标
function initEditAndFocus(){
$(".input").html("SQL>");
$(".input").focus();
var sel = window.getSelection();
var range = document.createRange();
range.selectNodeContents($(".input").get(0));
range.collapse(false);
sel.removeAllRanges();
sel.addRange(range);
}
//向控制台输出信息
function showInfo(info){
$(".userOutput").append("<p>"+info+"</p>");
}
//sql命令正则表达式
var createTableRegexp=/^create\stable\s(\w+)\s*\(([\s|\w|,|\(|\)]+?)\);$/i;
var dropTableRegexp=/^drop\s+table\s+(\w+);$/i;
var selectRegexp=/^select\s+([\w|\*|\s|,]+?)\s+from\s+(\w+)(\swhere\s([\s|\w|=|'|"]+))?;$/i;
var insertRegexp=/^insert\sinto\s(\w+)\s*(\([\s|\w|,]+?\))?\s+values\s*\(([\s|\w|,|'|"]+)\);$/i;
var updateRegexp=/^update\s+(\w+)\s+set\s+([\s|\w|=|,|'|"]+?)(\swhere\s([\s|\w|=|'|"]+))?;$/i;
var deleteRegexp=/^delete\s+from\s+(\w+)(\swhere\s([\s|\w|=|'|"]+))?;$/i;
//执行sql命令
function executeCommand(command){
var result="";
//判断sql类型
if((result=createTableRegexp.exec(command))!=null){
/*创建表*/
var tableName=result[1];
var colDefs=[];
var temp=result[2].split(",");
for(var i=0;i<temp.length;i++){
var temp2=temp[i].split(" ");
var colDef={};
colDef.name=$.trim(temp2[0]);
colDef.type=$.trim(temp2[1]);
colDefs.push(colDef);
}
createTable(tableName,colDefs);
}else if((result=dropTableRegexp.exec(command))!=null){
/*删除表*/
var tableName=result[1];
dropTable(tableName);
}else if((result=selectRegexp.exec(command))!=null){
/*执行查询*/
var selectCols=result[1];
var tableName=result[2];
var where=result[4];
if(typeof where=='undefined'||/^\s*(\w+)\s*=\s*(['|"]?\w+['|"]?)\s*$/.test(where)){
exeSelect(tableName,selectCols,where);
}else{
showInfo("目前where条件支持有限,我已经尽力了,期待明天会更好吧!");
}
}else if((result=insertRegexp.exec(command))!=null){
/*执行插入*/
var tableName=result[1];
var cols=(typeof result[2]!='undefined')?result[2].replace(/[\(|\)]/g,"").split(","):[];
var values=result[3].replace(/['|"]/g,"").split(",");
exeInsert(tableName,cols,values);
}else if((result=updateRegexp.exec(command))!=null){
/*执行更新*/
var tableName=result[1];
var updateCols=result[2];
var where=result[4];
if(typeof where=='undefined'||/^\s*(\w+)\s*=\s*(['|"]?\w+['|"]?)\s*$/.test(where)){
exeUpdate(tableName,updateCols,where);
}else{
showInfo("目前where条件支持有限,我已经尽力了,期待明天会更好吧!");
}
}else if((result=deleteRegexp.exec(command))!=null){
/*执行删除*/
var tableName=result[1];
var where=result[3];
if(typeof where=='undefined'||/^\s*(\w+)\s*=\s*(['|"]?\w+['|"]?)\s*$/.test(where)){
exeDelete(tableName,where);
}else{
showInfo("目前where条件支持有限,我已经尽力了,期待明天会更好吧!");
}
}else{
showInfo("不晓得你输入的是啥玩意,我咋就看不懂呢。也许你是对的,敬请期待以后的版本吧!");
}
}
function createTable(tableName,colDefs){
var table=$(".data db_table[name='"+tableName+"']");
if(table.length!=0){
showInfo("表【"+tableName+"】已存在!");
}else{
$(".data").append("<db_table name='"+tableName+"'><table_def></table_def><table_data></table_data></db_table>");
for(var i=0;i<colDefs.length;i++){
$(".data db_table[name='"+tableName+"'] table_def").append("<column name='"+colDefs[i].name+"' type='"+colDefs[i].type+"'/>");
}
showInfo("表【"+tableName+"】已创建!");
}
}
function dropTable(tableName){
var table=$(".data db_table[name='"+tableName+"']");
if(table.length==0){
showInfo("表【"+tableName+"】不存在!");
}else{
table.remove();
showInfo("表【"+tableName+"】已删除!");
}
}
function exeSelect(tableName,selectCols,where){
var table=$(".data db_table[name='"+tableName+"']");
if(table.length==0){
showInfo("表【"+tableName+"】不存在!");
}else{
cols=[];
if(selectCols=="*"){
table.find("table_def column").each(function(i){
cols.push($(this).attr("name"));
});
}else{
cols=selectCols.split(/,|\s/);
}
var selectOutput="<table>"
selectOutput+="<tr>"
for(var i=0;i<cols.length;i++){
selectOutput+="<th>"+cols[i]+"</th>";
}
selectOutput+="</tr>"
var selectRowData;
if(typeof where=='undefined'){
selectRowData=table.find("table_data").find("row_data");
}else{
var condition=where.split("=");
var colName=$.trim(condition[0]);
var colVal=$.trim(condition[1]).replace(/['|"]/g,"");
selectRowData=table.find("table_data").find("row_data["+colName+"='"+colVal+"']");
}
selectRowData.each(function(i){
selectOutput+="<tr>"
for(var i=0;i<cols.length;i++){
selectOutput+="<td>"+$(this).attr(cols[i])+"</td>";
}
selectOutput+="</tr>"
});
selectOutput+="</table>"
showInfo(selectOutput);
showInfo("查询完毕!");
}
}
function exeInsert(tableName,cols,values){
var table=$(".data db_table[name='"+tableName+"']");
if(table.length==0){
showInfo("表【"+tableName+"】不存在!");
}else{
if(cols==""||cols==[]){
cols=[];
table.find("table_def column").each(function(i){
cols.push($(this).attr("name"));
});
}
var rowId=randomString(32);
table.find("table_data").append("<row_data id='"+rowId+"' />");
var newRow=table.find("table_data").find("row_data[id='"+rowId+"']");
for(var i=0;i<cols.length;i++){
newRow.attr(cols[i],values[i]);
}
showInfo("记录已插入!");
}
}
function exeUpdate(tableName,updateCols,where){
var table=$(".data db_table[name='"+tableName+"']");
if(table.length==0){
showInfo("表【"+tableName+"】不存在!");
}else{
updateCols=updateCols.replace(/['|"]/g,"");
var updateColArray=updateCols.split(",");
for(var i=0;i<updateColArray.length;i++){
var updateInfo=updateColArray[i].split("=");
var updateColName=$.trim(updateInfo[0]);
var updateColVal=$.trim(updateInfo[1]);
if(typeof where=='undefined'){
table.find("table_data").find("row_data").attr(updateColName,updateColVal);
}else{
var condition=where.split("=");
var colName=$.trim(condition[0]);
var colVal=$.trim(condition[1]).replace(/['|"]/g,"");
table.find("table_data").find("row_data["+colName+"='"+colVal+"']").attr(updateColName,updateColVal);
}
}
showInfo("数据已更新!");
}
}
function exeDelete(tableName,where){
var table=$(".data db_table[name='"+tableName+"']");
if(table.length==0){
showInfo("表【"+tableName+"】不存在!");
}else{
if(typeof where=='undefined'){
table.find("table_data").find("row_data").remove();
}else{
var condition=where.split("=");
var colName=$.trim(condition[0]);
var colVal=$.trim(condition[1]).replace(/['|"]/g,"");
table.find("table_data").find("row_data["+colName+"='"+colVal+"']").remove();
}
showInfo("记录已删除!");
}
}
//生成随机字符串
function randomString(len){
len = len || 32;
var $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
var maxPos = $chars.length;
var str = '';
for (i = 0; i < len; i++) {
str += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return str;
}
});