aardio提供异步多线程http服务器,用来设计非常快捷,且语法优美,用来练手,非常适合。
结合前端的vue.data数据传入,aardio接口进行数据处理,保存至sqlite数据库中。
sql数据表名称由前端页面传入,数据表为宽表设计,数据来源导入的excel表,后端所有的sql采用参数化处理,基本无需维护,扩展性非常强,且安全性高。
<?
// aardio_api_vue.aardio
// 接口
// import web.json;
// var tab = web.json.parse(json);
// var json = web.json.stringify(tab,true);
// request.postData() //输入
// request.postFileData() //输入
// response.write //输出返回对象结果
// console.log //aardio控制台
if(request.method=='POST'){
var db = sqlite("/test-sqlite.db");
// console.log("post",request.postData()); //字符串
var tab = web.json.parse(request.postData()); //字符串转对象
tab.data = tab.datav;
console.log('tab------------');
// console.dump("tab",tab);
console.log('dbname: ',dbname);
console.log('flag: ',tab.flag);
// dbname='film';
dbname = tab.dbname;
// tab.maxi=tonumber(tab.maxi);
// tab.maxj=tonumber(tab.maxj);
// tab.pageno=tonumber(tab.pageno);
// tab.pageline=tonumber(tab.pageline); //all
editcols=''; //编辑列
// db.exec("DROP TABLE ??",{dbname} );
//arrdio 数组下标1
db_tab={'aa','ab','ac','ad','ae','af','ag','ah','ai','aj',
'ak','al','am','an','ao','ap','aq','ar','ass','at',
'au','av','aw','ax','ay','az'};
if( not db.existsTable(dbname) ){
db.exec( "CREATE TABLE ??(?);",{dbname,db_tab} );
}
if(tab.flag=='add'){
console.log("add");
for(i=1;#tab.data;1){ //ajax data 下标1
seli = tab.data[i].si;
rowid = tab.data[i].id;
console.log('add rowid',rowid)
if(rowid==''){
console.log('data',tab.data[i])
new_db_tab={};
new_data_tab={};
for(key,value in tab.data[i]){
if(key!='si' and key !='id'){
table.push(new_db_tab,key);
table.push(new_data_tab,value);
}
}
// new_data_tab=table.slice(new_data_tab,0,-2); //j=0
// console.dump('new',new_db_tab,new_data_tab);
db.exec("REPLACE INTO ??(?) VALUES (?);",
{dbname,new_db_tab,new_data_tab} );
}
}
tab.flag='qry'; //切换查询
}
if(tab.flag=='xlsxadd'){
console.log("xlsxadd");
db.beginTrans();
// data={[1]={[1]="name";[2]="title"}
have_time_flag=0;
for(i=1;#tab.data;1){ //line 1 title
var datav = tab.data[i];
console.dump('xlsxadd datav:', datav, #datav);
// console.dump("insert:",datav[1],datav[2]);
if(i==1 and tab.data[1][#datav]=='修改时间') have_time_flag=1;
if(i>1 and have_time_flag) datav[#datav]=time.now();
new_db_tab={};
new_data_tab={};
for(j=1;#datav;1){
table.push(new_db_tab,db_tab[j]);
table.push(new_data_tab,datav[j]);
}
db.exec("REPLACE INTO ??(?) VALUES (?);",
{dbname,new_db_tab,new_data_tab} );
}
db.commitTrans();
tab.flag='qry'; //切换查询
}
edit_rowid_tab={};
if(tab.flag=='edit'){
console.log("edit");
edit_data_flag=0; //数据修改标志
db.beginTrans();
for(i=1;#tab.data;1){ //0标题,导表
seli = tab.data[i].si;
rowid = tonumber(tab.data[i].id);
console.log('edit i:',i,seli,rowid);
if(seli and rowid){
console.log("update i: ", i, rowid, tab.data[i].aa, tab.data[i].ab);
table.push(edit_rowid_tab,rowid);
//逐个修改
// for(j,key in db_tab){
// if(#tab[key+'_'+i]){
// edit_data_flag=1; //数据修改标志
// if(tab[key+'_0']=='修改时间') tab[key+'_'+i]=time.now();
// db.exec("UPDATE ?? SET ?=? WHERE rowid=?;",
// {dbname,key,tab[key+'_'+i],rowid} );
// }
// }
//多个修改
//非数组的命名表,则格式化为 SQL 键值对,默认以逗号为分隔符
new_data_tab={};
for(key,value in tab.data[i]){
// console.log('tab data:',key,value,tab.data[1][key]);
if(key!='si' and key!='id'){
edit_data_flag=1; //数据修改标志
if(i>1 and tab.data[1][key]=='修改时间') value=time.now();
new_data_tab[key]=value; //aa='aa'
}
}
if(edit_data_flag){
// console.dump('new',new_data_tab);
db.exec("UPDATE ?? SET ? WHERE rowid=?;",{dbname,new_data_tab,rowid} );
}
//replace,顺序问题
//单选(无值)修改报错问题
// new_db_tab={};
// new_data_tab={};
// for(j=1;tab.maxj;1){
// key = db_tab[j];
// table.push(new_db_tab,key);
// if(tab[key+'_0']=='修改时间') tab[key+'_'+i]=time.now();
// table.push(new_data_tab,tab[key+'_'+i]);
// }
// console.dump('new: ',new_db_tab,new_data_tab);
// db.exec("REPLACE INTO ??(rowid,?) VALUES (?,?);",
// {dbname,new_db_tab,tab['id_'+i],new_data_tab} );
}
}
db.commitTrans();
if(edit_data_flag) { //数据修改标志
edit_rowid_tab={};
}
}
if(tab.flag=='del'){
console.log("del");
db.beginTrans();
for(i=1;#tab.data;1){ //ajax data下标1
seli = tab.data[i].si;
rowid = tonumber(tab.data[i].id);
if(seli and rowid){
console.log("delete:", i, rowid);
db.exec("DELETE FROM ?? WHERE rowid=?;",{dbname,rowid} );
}
}
db.commitTrans();
tab.flag='qry'; //切换查询
}
if(tab.flag!='count'){
console.log("qry");
cfg_dbname='config';
if( dbname!=cfg_dbname && db.existsTable(cfg_dbname) ){
for rowid,aa,ab in db.each("SELECT rowid,* FROM ?? where ??;",{cfg_dbname,{aa=dbname}}){ //?? in
// console.log('each:',rowid,aa,ab);
if(ab) editcols=ab;
}
// for i,v in table.eachIndex(dataTable){
//应当使用专门用于遍历数组的 table.eachIndex 创建迭代器
// console.dump(v.rowid,v.aa,v.ab)
// }
}
rowid_cond="rowid"; //缺省条件
// console.dump('rowid:',edit_rowid_tab);
if(#edit_rowid_tab){
rowid_cond={rowid=edit_rowid_tab};
// console.dump('rowid_cond:',rowid_cond);
}
if(#tab.namev==0) {
// ??占位符用于格式化 SQL 键值对则以 AND 为分隔符,数组值转换为IN语句
result = db.each("SELECT rowid,* FROM ?? WHERE aa='单位' or ??;",{dbname,rowid_cond});
} else {
if(#tab.name and #tab.namev) {
console.log("name namev",tab.name,tab.namev);
result = db.each("SELECT rowid,* FROM ?? WHERE 1 and (?? like ? or ?? like @namev);",{
dbname,
tab.name,
'单位',
tab.name,
namev='%'+tab.namev+'%'});
}
}
data = {};
//rowid,* 可预防第一列为空
for rowid,
aa,ab,ac,ad,ae,af,ag,ah,ai,aj,
ak,al,am,an,ao,ap,aq,ar,ass,at,
au,av,aw,ax,ay,az
in result {
// console.log("result data:",rowid,aa,ab,ac,ad,ae,af);
table.push(data,{
'id':rowid,
'aa':aa,'ab':ab,'ac':ac,'ad':ad,'ae':ae,'af':af,'ag':ag,'ah':ah,'ai':ai,'aj':aj,
'ak':ak,'al':al,'am':am,'an':an,'ao':ao,'ap':ap,'aq':aq,'ar':ar,'ass':ass,'at':at,
'au':au,'av':av,'aw':aw,'ax':ax,'ay':ay,'az':az
});
};
}
if(tab.flag=='count'){
console.log("count");
result = db.each("SELECT aa,ab,ac,ad,ae,count(*) FROM ?? WHERE 1 group by aa,ab,ac,ad,ae order by aa desc;",{
dbname
});
data={};
for rowid,aa,ab,ac,ad,ae,af in result {
// console.log("result data:",aa,ab,ac,ad,ae,af)
table.push(data,{
'id':rowid,
'aa':aa,'ab':ab,'ac':ac,'ad':ad,'ae':ae,'af':af
});
};
}
console.log('res',tab.flag,tab.dbname,editcols);
response.write({
'flag':tab.flag,
'dbname':tab.dbname,
'pageno':tab.pageno,
'pageline':tab.pageline,
'editcols':editcols,
'data':data}); //输出返回json对象
}
?>