# frx-server **Repository Path**: iosfan/frx-server ## Basic Information - **Project Name**: frx-server - **Description**: web扩展插件 , 可以使用让web使用fastReport水晶报表等功能 - **Primary Language**: Delphi - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 7 - **Created**: 2024-04-20 - **Last Updated**: 2024-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FrxServer #### 介绍 - web扩展插件 , 可以使用让web使用fastreport水晶报表等功能 - javascript使用http,可以显示,设计,打印水晶报表 - 可用于的web系统 - 如ERP,MES系统 - 本人是java后端开发的,因为要生产要使用fastReport水晶报表,所以用Delphi写了这个,Delphi不熟 - 后续会增加扩展,不仅限于水晶报表 - 使web获取更多C/S的能力 #### 软件架构 - main.pas 界面相关和软件初始化 - ExtServiceUnit.pas 扩展服务(实际业务逻辑),不仅可以使用水晶报表,其他的扩展也可以 #### 安装教程 - 使用Delphi 10.4打开FrxServer.dproj编译运行,编译器要安装fastReportVcl(使用的6.7其他的没试验过) - 默认端口39598 - 打开### http://localhost:39598/log #### 使用说明 1. 设计报表 - 在状态栏找到FrxServer的图标右键,打开报表设计器 - ![输入图片说明](frx-server%E6%8A%A5%E8%A1%A8%E8%AE%BE%E8%AE%A1%E5%99%A8.png) - 设计报表并保存fr3文件,用编辑器打开实际是xml内容 - 数据源默认使用frxDBDataset1 - TfrxMenoView的Name也支持赋值 - ![输入图片说明](frx-serverfr3.png) 2. 准备数据 json数据 ``` { "fr3":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTg..............",//fr3文件的xml的base64 "data":[ { "bh":"2022-01-0011", "img":"(blob)NvZGluZz0idXRmLTg.............."//图片等二进制数据使用:前缀(blob)+base64, }, { "bh":"2022-01-0012", "img":"(blob)GluZz0idXRmLTg.............." } ], //在线编辑报表才要用到这些参数 "repId":"3B2648DB5CD0453DAD0FC9425765F304",//报表ID "token":"eyJ0eXR5nLNOtc....",//用户验证的token,默认写入HEARD的X-Access-Token "url":"http://localhost:8181/report/edit"//上传编辑的报表网址,数据json{id:"也就是repId","reptext":"和fr3类型"} } ``` 3. 使用 - 使用JavaScript的http请求连接 | URL | 方法 | 内容 | |--------------------------------------|------|--------------| | http://localhost:39598/ping | GET | 断程序是否打开 | | http://localhost:39598/report/show | POST | 显示报表 | | http://localhost:39598/report/print | POST | 打印报表 | | http://localhost:39598/report/design | POST | 设计报表 | | http://localhost:39598/report/pdf | POST | 导出pdf的base64 | 4. 前端接口 - http接口 ``` import axios from 'axios'//使用axios就行http请求 // 创建 axios 实例 const axService = axios.create({ baseURL: 'http://localhost:39598', timeout: 10000, // 请求超时时间 }) export function get(url, parameter) { return axService({ url: url, method: 'get', params: parameter }) } export function post(url, parameter) { return axService({ url: url, method: 'post', data: parameter }) } export function ping() { return get('/ping').then(res => { let data = res.data if (data.success) { return Promise.resolve(data) } else { return Promise.reject(data.msg) } }).catch(msg=>{ return Promise.reject("frx服务未启动") }) } ``` - 显示报表 ``` //map就是准备的数据,返回Promise对象 export function showHandle(map){ return repHandle(map,"show") } //实际处理逻辑 export function repHandle(map,method){ return ping().then(r=>{ map.token = ACCESS_TOKEN//需要在线编辑才要 map.url = ''//需要在线编辑才要 return post('/report/'+method, map).then(res => { let data = res.data if (data.success) { return Promise.resolve(data) } else { return Promise.reject(data.msg) } }) }).catch(msg => { return Promise.reject(msg) }) } ``` - (扩展)对接后端系统使用 ``` export function show(repId,dataId=undefined,tableName=undefined) { return getAction(url.genRepMap, { repId: repId,dataId: dataId,tableName:tableName }).then(res => { if (res.success) { let map = res.result//getAction到业务系统的后端获取json数据,map就是准备的数据 return showHandle(map) } else { return Promise.reject(res.message) } }).catch(msg => { return Promise.reject(msg) }) } ```