首页
> 计算机技术
> 后端开发
> Nim
B/S架构POS客户端开发之二-本地Web打印代理服务的实现
原创 lihf8515于2025年02月15日 17:54发表
来源:本站 阅读:87
本篇是 B/S架构POS客户端开发之二-本地Web打印代理服务的实现 篇
接上篇,B/S架构POS客户端开发之一-POS小票打印机动态链接库的实现
这里,我们使用Nim语言实现Web打印代理服务,为什么使用Nim语言而不使用C、Java或Python等语言呢?因为,Nim是一个优雅且高性能的静态语言,具有C语言的性能和Python语言的优雅高效,用它开发会起到高效、缩短开发周期的效果。
整个Web打印代理服务程序完全使用Nim语言,并且使用了其相关的第三方库,如:Prologue,它是一个全栈Web开发框架,开发一个Web服务非常简单。下面是完整代码:
import std/[encodings]
import wNim/[wApp]
import wNim/private/winimx
import prologue
{.link:"res/app.res".}
proc print*(ctx: Context) {.async.} =
ctx.response.setHeader("Access-Control-Allow-Origin", "*")
ctx.response.setHeader("Access-Control-Allow-Methods", "OPTIONS,PUT,GET,POST")
ctx.response.setHeader("Access-Control-Allow-Credentials", "true")
ctx.response.setHeader("Access-Control-Allow-Private-Network", "true")
ctx.response.setHeader("Content-Type", "application/json;charset=utf-8")
let cb = ctx.getQueryParams("callback")
try:
let json = parseJson(ctx.getQueryParams("data")) #获取参数
let action = getStr(json["action"])
let jiekou = getStr(json["interface"])
let desktopHwnd = GetDesktopWindow()
if action == "print":
let opencash = getStr(json["opencash"])
let cut = getStr(json["cut"])
let blankrow = getStr(json["blankrow"])
let data = encodings.convert(getStr(json["data"]), "GB2312", "UTF-8")
let param = "print PrintOut1.txt " & jiekou & " " & opencash & " " & cut & " " & blankrow
writeFile(r"PrintOut1.txt",data)
let ret = ShellExecute(desktopHwnd, "open", "hfpos_print.exe", param, "", SW_HIDE)
if ret > 32:
resp cb & "(\"打印命令发送成功!\");"
else:
resp cb & "(\"打印命令发送失败!\");"
elif action == "rijie":
let opencash = getStr(json["opencash"])
let cut = getStr(json["cut"])
let blankrow = getStr(json["blankrow"])
let data = encodings.convert(getStr(json["data"]), "GB2312", "UTF-8")
let param = "print RiJie.txt " & jiekou & " " & opencash & " " & cut & " " & blankrow
writeFile(r"RiJie.txt",data)
let ret = ShellExecute(desktopHwnd, "open", "hfpos_print.exe", param, "", SW_HIDE)
if ret > 32:
resp cb & "(\"打印日结命令发送成功!\");"
else:
resp cb & "(\"打印日结命令发送失败!\");"
elif action == "opencash":
let param = "opencash " & jiekou
let ret = ShellExecute(desktopHwnd, "open", "hfpos_print.exe", param, "", SW_HIDE)
if ret > 32:
resp cb & "(\"打开钱箱命令发送成功!\");"
else:
resp cb & "(\"打开钱箱命令发送失败!\");"
elif action == "display":
let display_type = getStr(json["display_type"])
let ysje = getStr(json["ysje"])
let baudrate = getStr(json["baudrate"])
let param = "display " & display_type & " " & ysje & " " & jiekou & " " & baudrate
let ret = ShellExecute(desktopHwnd, "open", "hfpos_print.exe", param, "", SW_HIDE)
if ret > 32:
resp cb & "(\"客显显示命令发送成功!\");"
else:
resp cb & "(\"客显显示命令发送失败!\");"
else:
resp cb & "(\"打印代理服务调用打印程序参数不正确!\");"
except:
let
e = getCurrentException()
msg = getCurrentExceptionMsg()
resp cb & "(" & repr(e) & "\" 详细消息: \"" & msg & ");"
let
settings = newSettings(appName = "hf pos agent server", debug = false)
let app = newApp(settings = settings)
app.addRoute("/", print, [HttpGet, HttpPost])
app.run()
代码中 hfpos_print.exe 则是本地打印程序,由它调用打印动态链接库实现打印小票的功能。我们将在下一篇文章中实现它。
下一篇将讲解 B/S架构POS客户端开发之三-本地打印程序的实现。
阅读排行榜