VUE+AJAX+AARDIO架构的后端设计

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对象

}

?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值