# 服务端开发

框架的后台api都是通过SatRDA的JS脚本实现的,JS脚本代码在路径 server/plugins/erp 中。 推荐把 server/plugins/erp 导入VSCode中,方便进行修改和调试。 导入后如图: vscode

# 调试代码

  1. 安装NodeJS 如已安装nodejs可以忽略。

安装nodejs, 可以 https://nodejs.org/en 下载安装

  1. VSCode命令行窗口中输入npm install 安装依赖包。

  2. VSCode最左边找到运行和调试工具栏,点击切换到调试界面。

  3. 点击左上方开始调试按钮启动调试。

调试界面: debug

如果satrda服务启动了,可以看到连接成功。 debug_success

  1. 在相应的API代码处添加断点,前端调用API时,会执行到该断点。可以进行单步调试。

# 后台WebAPI实现

框架后台API通过SatRDA的JS脚本代码实现。

打开 app.js 主要代码如下:

let app = {
		captchaImage(ctx,r,w) {
			let captcha = satrda.Captcha;
			let data = captcha.create({type:"string",height:40,width:120})
			w.write(data);
		},
		login(ctx,r,w) {
			const data = r.jsonBody;
			const {
				username,
				password,
				code,
				uuid
			  } = data;

			//校验成功
			if (satrda.Captcha.verify(uuid,code.toLowerCase())) {

			} else {
				w.write({code:500,msg:"校验失败"})
				return;
			}

			const db = getDB();
			const userid = db.queryLong(`select user_id from sys_user where user_name = '${username}' and password = '${password}'`);
			if (userid === undefined) {
				w.write({code:500,msg:"登录失败"})
				return;
			} 

			const session = ctx.sessionStart();
			session.set('user',username);
			session.set('userId',userid);
			const token = session.id();
			w.write({code:0,token,msg:"操作成功"})
			
		},
		getInfo(ctx,r,w) {
			const session = ctx.getSession();
			const userId = session.get('userId');
			const userName = session.get('user');
			const user = {userId,userName,avatar:''};
			let roles = Array.from(permissionService.getRolePermission(user));
			let permissions = Array.from(permissionService.getMenuPermission(user));
			w.write({"msg":"操作成功","code":200,user,permissions,roles});

		},
		getRouters(ctx,r,w) {
			const session = ctx.getSession();
			const userId = session.get('userId');
			let list = menuService.selectMenuTreeByUserId(userId);
			let routers = buildMenus(list);
			w.write({code:200,msg:'操作成功',data:routers});		
		},
		logout(ctx,r,w) {
			let data = {msg:"操作成功",code:200};
			w.write(data);
		},
		testdb(ctx,r,w) {
			let db = getDB();
			let value = db.syntaxFromSQL('select id,name, 1 as col1 from test1');
			let ds = new DataStore();
			ds.setTransObject(db);
			ds.dataObject = value;
			ds.retrieve();
			
			ds.setItem(1,"name","jsname1");
			ds.update();
			w.write({count:ds.rowCount()});
			console.log(ds.rowCount());
		}
	}
	
	//将app对象加入到路由中,不同的请求会进入到app中的同名方法,如app中有方法login,则请求api
	// http://127.0.0.1:5555/erp/login 时会进入到该方法
    satrda.Router.all("/erp",app);

其中 satrda.Router.all("/erp",app) 表示将/erp开头的api注册到app对象中,注册后app中的方法会映射为webapi。如getRouters方法的webapi地址为/erp/getRouters,该方法提供了自定义的框架菜单。 app对象中还有一些方法,captchaImage 提供了验证码功能,login提供了用户登录验证。

需要了解更多JS插件内容,可查看 JS插件基本操作JS插件高级操作

# 发布脚本

参考 JS插件发布