KindyunGraphic 发布了

Version 1.0 | 基于 Cairo 1.18.4 | 纯 C 接口 DLL
官网:http://www.kindyun.com

下载地址:https://github.com/jayitiontony/KindyunGraphic

1. 简介

KindyunGraphic.dll 是基于 Cairo 1.18.4 矢量绘图库封装的纯 C 接口 DLL。

  • 零外部依赖:cairo / libpng / pixman / freetype / zlib 全部静态链入 DLL,运行时只需 KindyunGraphic.dll 一个文件(外加 Windows 系统 DLL 与 MSVC 运行时)
  • 内置双缓冲:默认开启,每帧绘制后自动 swap,外部读到的永远是一帧完整画面,不会闪烁 / 撕裂
  • 像素格式CAIRO_FORMAT_ARGB32,Windows x86/x64 上是 BGRA 字节序(与 Win32 GDI / Direct2D / WPF 完全一致,零拷贝对接)
  • C 接口extern "C" 风格,无 C++ 依赖,可被 C / C++ / MFC / Qt / .NET / Rust / Go 等任意语言调用
  • 两种使用模式

    • 托管模式KG_Create() → DLL 内部分配两个 buffer,最简单
    • 零拷贝模式KG_CreateFromBuffer() → 绑定调用方自己的 RGBA buffer,真正零内存拷贝

2. 目录结构(编译完成后)

Install/
├── README.md                         # 本文件
├── include/
│   └── KindyunGraphic.h              # 唯一需要 include 的头文件
├── lib/
│   ├── Debug/
│   │   └── KindyunGraphic.lib        # Debug 版导入库
│   └── Release/
│       └── KindyunGraphic.lib        # Release 版导入库
├── bin/
│   ├── Debug/
│   │   ├── KindyunGraphic.dll        # Debug 版 DLL (含调试符号)
│   │   └── KindyunGraphicMfc.exe     # MFC 示例程序 (Debug)
│   └── Release/
│       ├── KindyunGraphic.dll        # Release 版 DLL
│       └── KindyunGraphicMfc.exe     # MFC 示例程序 (Release)
├── docs/
│   └── README.md                     # 调用说明 (本文件)
└── samples/
    └── KindyunGraphicMfc/            # MFC 示例源码
        ├── KindyunGraphicMfc.cpp
        ├── MainFrm.cpp
        ├── MainFrm.h
        ├── stdafx.cpp
        ├── stdafx.h
        ├── targetver.h
        ├── resource.h
        ├── KindyunGraphicMfc.rc
        ├── KindyunGraphicMfc.ico
        ├── KindyunGraphicMfc.vcxproj
        └── KindyunGraphicMfc.vcxproj.filters
编译方案之后,所有 DLL / LIB / EXE / 头文件 / 示例源码 / 文档都会自动部署到 Install/ 下。第三方项目只需要把 Install\includeInstall\lib\ReleaseInstall\bin\Release 三个目录加入工程即可。

3. 部署到自己的项目

3.1 在自己的项目里加入链接

把下面三个目录加到你的 Visual Studio 项目:

类型路径
头文件Install\include
导入库Install\lib\Release(或 Install\lib\Debug
运行时 DLLInstall\bin\Release(或 Install\bin\Debug

在 vcxproj 里配置(也可用 Visual Studio 图形界面):

<PropertyGroup>
  <IncludePath>$(IncludePath);Install\include</IncludePath>
</PropertyGroup>

<ItemDefinitionGroup>
  <Link>
    <AdditionalLibraryDirectories>Install\lib\Release;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
    <AdditionalDependencies>KindyunGraphic.lib;%(AdditionalDependencies)</AdditionalDependencies>
  </Link>
</ItemDefinitionGroup>

运行时把 KindyunGraphic.dll 放到 .exe 同目录(或者加入 PATH)。

3.2 你的代码

#include "KindyunGraphic.h"   // 唯一需要 include 的头

int main() {
    // 1. 创建画布 (800x600, 默认开双缓冲, DLL 内部分配 2 个 buffer)
    KGCanvas canvas = KG_Create(800, 600);
    if (!canvas) { /* 错误处理 */ }

    // 2. 绘制一帧
    KG_Clear(canvas, 0.1, 0.1, 0.2, 1.0);                     // 深色背景
    KG_SetSourceColor(canvas, 1.0, 0.6, 0.2, 1.0);            // 橙色
    KG_SetLineWidth(canvas, 3.0);
    KG_DrawCircle(canvas, 400, 300, 80, 1);                   // 填充圆

    KG_SetSourceColor(canvas, 1.0, 1.0, 1.0, 1.0);            // 白色文字
    KG_SetFont(canvas, "Microsoft YaHei", 24, 1, 0);
    KG_DrawText(canvas, 30, 50, "Hello, KindyunGraphic!");

    // 3. 提交本帧 (内部自动 swap, 外部 GetData 即可拿到完整画面)
    KG_Flush(canvas);

    // 4. 取本帧数据 (例如给 GDI / Direct2D / OpenGL 上传)
    unsigned char* pixels = KG_GetData(canvas);
    int stride = KG_GetStride(canvas);
    // ... 把 pixels + stride 喂给 GDI StretchDIBits / D2D / SDL ...

    // 5. 销毁
    KG_Destroy(canvas);
    return 0;
}

4. 关键 API 速查

4.1 画布生命周期

函数用途
KGCanvas KG_Create(int w, int h)托管模式创建,默认开双缓冲。DLL 内部 2 个 buffer,最简用法
KGCanvas KG_CreateFromBuffer(int w, int h, unsigned char* buf, int stride, int fmt)零拷贝模式,绑定调用方自己的 RGBA buffer。适合你已经管好内存(Direct2D bitmap / SDL texture / 自定义内存池)
void KG_Destroy(KGCanvas)销毁画布(不释放调用方提供的 buffer)
int KG_GetWidth(KGCanvas) / KG_GetHeight / KG_GetStride元信息
int KG_IsLiveMode(KGCanvas)1 = 零拷贝模式,0 = 托管模式
int KG_IsDoubleBuffered(KGCanvas)1 = 当前启用了双缓冲

4.2 取图(关键!)

函数用途
unsigned char* KG_GetData(KGCanvas)拿 read buffer 指针。BGRA 字节序,与 Win32 DIB / D2D / WPF 兼容
void KG_Flush(KGCanvas)每帧结束必须调用。把内部 Cairo 缓存写回 buffer + 自动 swap(双缓冲模式)
void KG_SwapBuffers(KGCanvas)手动 swap(关闭 auto-swap 后才有意义)
void KG_SetAutoSwapOnFlush(KGCanvas, int enabled)设置 KG_Flush 是否自动 swap(默认 1)
void KG_MarkDirty(KGCanvas) / KG_MarkDirtyRect(KGCanvas, x, y, w, h)标脏(让 Cairo 跳过内部缓存)

4.3 状态

函数用途
KG_SetSourceColor(canvas, r, g, b, a)设置当前颜色(实色或带 alpha),r/g/b/a ∈ [0,1]
KG_SetSourceRGB(canvas, r, g, b, a)同上,r/g/b/a ∈ [0,255]
KG_SetLineWidth(canvas, width)线宽(用户空间单位)
KG_SetLineCap(canvas, cap)0=Butt, 1=Round, 2=Square
KG_SetLineJoin(canvas, join)0=Miter, 1=Round, 2=Bevel
KG_SetDash(canvas, dashes, count, offset)虚线模式,dashes 是 {实, 虚, 实, 虚...} 长度
KG_ClearDash(canvas)取消虚线
KG_Clear(canvas, r, g, b, a)用指定颜色清空整张画布
KG_Translate/Scale/Rotate/Save/Restore坐标变换和 gstate

4.4 高级图形

函数用途
KG_DrawLine(x1, y1, x2, y2)直线
KG_DrawRectangle(x, y, w, h, fill)矩形(fill: 0=描边, 1=填充)
KG_DrawCircle(cx, cy, r, fill)
KG_DrawEllipse(cx, cy, rx, ry, rotation, fill)椭圆(带旋转)
KG_DrawArc(cx, cy, r, startAngle, endAngle)圆弧(起止角,弧度)
KG_DrawPolyline(points, pointCount)描迹线(多段连续折线),points={x0,y0,x1,y1,...}
KG_DrawPolygon(points, pointCount, fill)描迹闭合多边形

4.5 文字(支持中文)

KG_SetFont(canvas, "Microsoft YaHei", 24, /*bold*/1, /*italic*/0);
KG_SetSourceColor(canvas, 1.0, 1.0, 1.0, 1.0);
KG_DrawText(canvas, x, y, "你好, cairo! 矢量绘图 ✓");
函数用途
KG_SetFont(canvas, family, size, bold, italic)设置字体。family 传系统字体名
KG_DrawText(canvas, x, y, text)绘制文字,(x, y) 是基线起点
KG_GetTextWidth(canvas, text)文字渲染宽度

字体名用 Windows 上已安装的字体(运行 KindyunGraphicMfc.exe 试一下效果)。常用:

Microsoft YaHei        微软雅黑(中文)
SimSun                  宋体
SimHei                  黑体
Arial                   西文
Consolas                等宽
Times New Roman         衬线

4.6 保存文件

函数用途
int KG_SaveToFile(canvas, "out.png", 0)0=PNG, 1=SVG, 2=PDF, 3=PS。返回 1=成功 0=失败
注意:托管双缓冲模式下,SVG/PDF/PS 导出是位图嵌入(不是真矢量)。
如要真矢量,请用 KG_CreateFromBuffer 零拷贝模式(不启用双缓冲)。

5. 性能与帧率参考

测试环境:Debug 编译,纯 CPU 渲染,800×600 画布,负载 = 移动圆 + 6 个旋转方块 + 60 段螺旋 + 两行文字。

分辨率平均帧率平均帧耗时
800×600~190 FPS5.4 ms
1920×1080~140 FPS7.2 ms
2560×1440~115 FPS8.6 ms

Release 编译通常比 Debug 再快 30-50%。 2K 也能稳 100+ FPS,远超 60 / 120 / 144 Hz 显示器刷新率

每帧 swap 的开销:rebuild cairo_t 大约 < 0.5 ms,可忽略。

6. 典型场景

6.1 Win32 GDI 显示(最简单,MFC 示例程序用的就是这个)

// 启动时
KGCanvas canvas = KG_Create(800, 600);
unsigned char* pixels = KG_GetData(canvas);
int stride = KG_GetStride(canvas);

// 绘制一帧
KG_Clear(canvas, 0, 0, 0, 1);
KG_SetSourceColor(canvas, 1, 1, 0, 1);
KG_DrawCircle(canvas, 400, 300, 100, 1);
KG_Flush(canvas);          // 内部 swap

// 显示 (OnPaint / WM_PAINT)
BITMAPINFO bmi = {};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = 800;
bmi.bmiHeader.biHeight = -600;          // 顶向下 DIB
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;

CRect rc;
GetClientRect(hWnd, &rc);
::StretchDIBits(hdc, 0, 0, rc.Width(), rc.Height(),
                0, 0, 800, 600, pixels, &bmi, DIB_RGB_COLORS, SRCCOPY);

6.2 Direct2D 显示(GPU 加速,最佳性能)

// 启动
KGCanvas canvas = KG_Create(1920, 1080);
D2D1_BITMAP_PROPERTIES props = D2D1::BitmapProperties(D2D1::PixelFormat(
    DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED));
ID2D1Bitmap* d2dBitmap = nullptr;
m_d2dContext->CreateBitmap(D2D1::SizeU(1920, 1080), nullptr, 0, props, &d2dBitmap);

// 绘制
KG_Flush(canvas);
unsigned char* pixels = KG_GetData(canvas);
d2dBitmap->CopyFromMemory(nullptr, pixels, KG_GetStride(canvas));
m_d2dContext->DrawBitmap(d2dBitmap, D2D1::RectF(0, 0, w, h));

6.3 SDL / SDL2 纹理上传

KGCanvas canvas = KG_Create(1280, 720);
SDL_Texture* tex = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_ARGB8888,
                                      SDL_TEXTUREACCESS_STREAMING, 1280, 720);

// 绘制 + 显示
KG_Flush(canvas);
unsigned char* pixels = KG_GetData(canvas);
SDL_UpdateTexture(tex, nullptr, pixels, KG_GetStride(canvas));
SDL_RenderCopy(renderer, tex, nullptr, nullptr);
SDL_RenderPresent(renderer);

6.4 零拷贝模式(自己管内存)

适合:你已经有 Direct2D bitmap / SDL texture / 显存映射 / 自定义内存池。

// 启动
std::vector<unsigned char> buf(800 * 600 * 4);  // 你的 buffer
KGCanvas canvas = KG_CreateFromBuffer(800, 600, buf.data(),
                                       800 * 4, KG_FMT_ARGB32);
// 此后不需要再 KG_Flush (用户直接读 buf 即可), 但调了也没事

7. 字节序

CAIRO_FORMAT_ARGB32 在 Windows x86/x64 上是 BGRA 字节序(B 在低地址)。

内存地址字节
buf[0]B
buf[1]G
buf[2]R
buf[3]A

这与以下框架字节序一致

  • Win32 BITMAPINFOHEADER / CreateDIBSection
  • Direct2D DXGI_FORMAT_B8G8R8A8_*
  • WPF / WinUI
  • GDI+ PixelFormat32bppARGB(注意名字虽然叫 ARGB 但实际内存里也是 BGRA)

所以这些框架对接都是零拷贝

如果你的 buffer 是严格 R,G,B,A 顺序(OpenGL ES 部分平台、Cairo 旧文档示例),需要手动 swap 一道,或用 KG_SaveToFile 之类走 Cairo 的转换。

8. 常见问题

Q1: 编译找不到 KindyunGraphic.h

A: 把 Install\include 加入 VC++ 头文件路径(项目属性 → C/C++ → 常规 → 附加包含目录)。

Q2: 链接报 LNK2019 找不到 KG_* 符号

A: 把 Install\lib\Release(或 Debug)加入库目录,链接器输入加 KindyunGraphic.lib

Q3: 运行时弹"找不到 KindyunGraphic.dll"

A: 把 Install\bin\Release\KindyunGraphic.dll 复制到 .exe 同目录。

Q4: 文字显示成方块

A: 系统找不到指定字体。在 cmd 跑 dir C:\Windows\Fonts\*.ttf 看有哪些字体,把 KG_SetFont 第一个参数换成确实存在的字体名。

Q5: 中文不显示

A: cairo 1.18 的 toy text API 按 UTF-8 解析字节。代码里必须传 UTF-8 字符串,不能是 GBK 编码:

// 正确: UTF-8 源文件, 中文字面量
KG_DrawText(canvas, x, y, "中文测试");

// 错误: GBK 源文件
KG_DrawText(canvas, x, y, "中文测试");

MSVC 编译加 /utf-8 即可保证源文件是 UTF-8 编码(见本项目示例 vcxproj)。

Q6: 实时绘制会闪烁

A: 用托管模式 KG_Create(默认开双缓冲),并在每帧绘制后调 KG_Flush。外部分别通过 KG_GetData 拿数据时就永远是一帧完整画面,不会撕裂 / 闪烁

Q7: 想要真矢量 SVG 导出

A: 用零拷贝模式 KG_CreateFromBuffer,不要开双缓冲。KG_SaveToFile(..., 1) 导出 SVG 时是真正的 <path> / <circle> 等元素(可被 Illustrator / Inkscape 二次编辑缩放)。

9. 函数索引(按字母)

KG_Arc                  KG_Clear              KG_ClearDash
KG_Create               KG_CreateFromBuffer   KG_CurveTo
KG_Destroy              KG_DrawArc            KG_DrawCircle
KG_DrawEllipse          KG_DrawLine           KG_DrawPolygon
KG_DrawPolyline         KG_DrawRectangle      KG_DrawText
KG_Fill                 KG_Flush              KG_GetData
KG_GetHeight            KG_GetStride          KG_GetTextWidth
KG_GetWidth             KG_IsDoubleBuffered   KG_IsLiveMode
KG_LineTo               KG_MarkDirty          KG_MarkDirtyRect
KG_MoveTo               KG_NewPath            KG_Restore
KG_Rotate               KG_Save               KG_SaveToFile
KG_Scale                KG_SetAutoSwapOnFlush KG_SetDash
KG_SetFont              KG_SetFontSize        KG_SetLineCap
KG_SetLineJoin          KG_SetLineWidth       KG_SetSourceColor
KG_SetSourceRGB         KG_Stroke             KG_SwapBuffers
KG_Translate            KG_ClosePath          KG_SetFillRule (略)

完整签名见 KindyunGraphic.h

10. 故障排查清单

  • [ ] KindyunGraphic.h 在 include 路径中
  • [ ] KindyunGraphic.lib 在 lib 路径中
  • [ ] KindyunGraphic.dll.exe 同目录(或 PATH 里)
  • [ ] 工程字符集设 Unicode,编译加 /utf-8
  • [ ] 如果用 MFC:项目属性 → 高级 → MFC 使用 → 在共享 DLL 中使用 MFC
  • [ ] 如果还不行:用 dumpbin /dependents your.exe 看缺什么 DLL

© 2026 KindyunGraphic | Cairo 1.18.4 backend | VS 2022 / v143 toolset

标题: KindyunAI 发布说明 (Release Notes) — Version 1.0.0
发布日期: 2026-06-21

源代码下载地址:https://github.com/jayitiontony/KindyunAI
预编译版本:https://github.com/jayitiontony/KindyunAI/tree/main/Release
本地下载地址:本站下载,方便上不了Github的用户。

概述: 欢迎使用 KindyunAI v1.0.0!这是 KindyunAI 本地 AI 助手的首个稳定版本。本次发布将命令行 REPL、Web 服务与外部 API 集成于单一进程中,提供了完整的 RESTful API、流式响应支持、内置安全机制以及开箱即用的 Web 前端界面。

🌟 新增功能 (New Features)

  • 单进程一体化架构KindyunAI.exe 同时运行 CLI REPL、Web 服务与外部 API,简化部署。
  • Web 管理界面:内置深色主题单页应用(Vanilla JS),提供直观的浏览器前端。
  • 完整的 REST API:支持会话管理、同步/流式聊天、工具列表与调用、外部服务适配等。
  • 流式响应 (SSE) 增强:支持推理模型 (reasoning_content)、工具调用流式累积 (delta.tool_calls),兼容完整的事件流 (meta, delta, tool, tool_result, done, error)。
  • 内置外部服务:提供 echo(调试)、weather(wttr.in 天气查询)、http(通用 HTTP 转发,带主机白名单与 SSRF 防护)。
  • 安全机制:Bearer Token 认证(支持回环地址自动放行)、CORS、令牌级速率限制(默认 120 次/分钟)、路径黑名单(如 /etc, C:\Windows)。
  • 可视化配置:支持通过 config/config.jsonweb 段进行灵活配置。

🐛 问题修复 (Bug Fixes)

  • 修复了 CLI REPL 在 Ctrl+C 退出后的悬空 this 指针问题(改用 shared_ptr)。
  • 修正 cpp-httplib 在 Windows 下的版本兼容性问题(配置 _WIN32_WINNT=0x0A00)。
  • 修复静态资源路由匹配问题(优化 /static/* 为正则路由)。
  • 完善推理模型 SSE 支持,正确读取 delta.reasoning_content
  • 优化流式工具调用解析,按 index 正确累积 delta.tool_calls
  • 修复循环地址(loopback)的 Token 认证逻辑,开发模式下自动跳过验证。

📦 运行环境与依赖 (Runtime & Dependencies)

  • 编译平台:Windows x86_64 (MinGW-w64 GCC 14.2)
  • 运行依赖libcurl-x64, libstdc++-6, libgcc_s_seh-1, libwinpthread-1
  • 第三方组件:cpp-httplib v0.28, nlohmann/json, libcurl, SQLite

📖 核心接口速览 (API Highlights)
(List key endpoints briefly)

  • GET /api/v1/health — 服务健康检查
  • POST/GET/DELETE /api/v1/sessions — 会话管理
  • POST /api/v1/chat & /api/v1/chat/stream — 同步/流式对话
  • GET /api/v1/tools & POST /api/v1/tools/{name}/invoke — 工具管理与调用
  • POST /api/v1/external/{service} — 外部服务适配器

📜 许可与版权 (License & Copyright)

  • 版权:© 2026 Kindyun.com. All rights reserved.
  • 许可协议:专有软件 (Proprietary),允许项目内使用、学习与修改。禁止未经授权的对外分发、逆向工程及删除版权标识。
  • 联系作者:jayition mailto:jayition@qq.com
  • 官方网站:https://Kindyun.com

🙏 致谢 (Acknowledgments)
感谢 cpp-httplib, nlohmann/json, libcurl, SQLite 等开源项目为本次发布提供的支持。

牡桂跨步进入大厅,“国老,终于见到您了,可把我气坏了,那帮家伙,咋说都说不通,唉!赶紧给我上壶茶。”急冲冲地对管家说道:“可多亏了云姨,要不然我还不知如何是好。”

管家忙递过一杯茶水,放到牡桂的桌上,道:“老爷请用茶!”然后退到一旁。

“哦!说来听听!”国老笑道。

“我到城门守卫那边,跟他们说,要放开城防,他们死活不听。说这是他们将军的命令,要我找将军去。我没办法,就跑到将军府,守将也是听不进一个字,后来正好云姨拿着您的书信过来了。这还是让云姨来说吧!我先缓一缓。”牡桂道。

云姨接着道:“我刚到那边就听桂大人在跟将士们争吵,两边脸都快贴到一起了,就差动手了,我在旁边听了一会儿,桂大人好像是希望守将放宽城门进出条件,让生意先流动起来,让老百姓生活正常起来;守将的意思好像是他负不起这个责任,他也是为百姓着想,并不是只有桂大人为百姓着想。我其实也没做啥,就是劝了劝!嘿嘿嘿!”

“哈哈哈,你那劝得好!真解气,说得守将屁话没有!你们不知道,云姨见我们在争吵,他把守将骂得狗血淋头!最好乖乖妥协了!我给你们学学哈!”

接着阿桂模仿云百辣的样子学道:“哟哟哟!为百姓好,是啊!将军真是百姓的好将军啊!都亏了你们百姓才天天饿肚子,钱也不敢乱花,东西贵得离谱!粮食一天一个价,为啥?外面的粮进不来,进来你们就怀疑别人是奸细。里面的粮店老板是有粮,不过人家巴不得天天涨价呢!就你为老百姓好,你到城南去看看,有本事你去啊!你只管守城门。里面乱不乱你不管是吧!”阿桂接着说:“你猜守将说什么?”

“守将说,你是哪位?敢在本府中胡说八道?他还摆架子了,然后我一把拦住。跟他说这是我请来的百姓,你不是说你是为百姓嘛,那听听百姓怎么说吧!这句话把他噎回去了。”阿桂描述道,

“云姨,下面还是您来说吧,我学着不像,也有点说不出口,您那气势,我学不来!”,众人哈哈哈笑起来,阿桂朝云姨使了个眼色,求助,求助的眼神。

“哈哈哈,我来说吧!不过我平时说话就这样,大伙别笑啊!”云姨接着道:“我说,你怕屎拉裤兜是不是每天叫你娘把屁股缝上再出门,怕尿身上把丁丁绑上?外面有风声你们就城门紧闭,不管百姓死活,反正出了问题最后你们没责任。有你们这样当官的嘛?来来来,让我看看,你是不是缝好了出门的?”众人憋着笑愣楞地看着云百辣。

“守将也气了,说我又不是不让大伙进出城,不是可以凭文书进出嘛!那我就说了:就你们官大,啥文书都没用,非得你这个大将军的文书才管用,排个队要老半天,到这儿还得被你问东问西,谁愿意来看你脸色啊?不想着好好练兵,就爱摆官架子,窝里横。对百姓喝五喝六地,对外敌像个鹌鹑,就知道躲。”说到这里云姨也觉得有点过分了,看了看牡桂,低下头,喃喃道:“我不是说你们哈,就是说秃噜嘴了!”

“哈哈哈!没事,就是这样,你们没见那个守将脸都绿了,我在那边他也不好发飙,气得差点没背过气去,甩下一句,明天就开城,我不管了,然后气冲冲地走了,估计到城主那里去告状去了。”牡桂笑道。

“嗯!不错,不错,后面你们俩去盯着点,城门算是放开了,但还是要解决其它的问题,造成这个问题的根源没解决,要想办法解决。另外百姓经过这么长时间折腾,也伤着元气了,要想办法恢复民生,更要让大家有自保的能力。过会儿将离会过来。等他来了我们一起商量一下。另外阿桂,还要借你的管家一用。”国老微笑道。

“行,听国老安排!”牡桂还意犹未尽地微笑道。

摘自:https://baijiahao.baidu.com/s?id=1845784107376205165

“术儿,我们该找的人还差一位就找齐了。我们先下楼去跟老板聊一聊。”国老道。

“还差一位,是哪位?”术儿疑惑。

“这位名叫百益红,不过我们不用找,他就在朝堂之中。”国老与术儿便下楼去了。楼下将离正在烧水,见二位下来,便放下手中的灶铁,笑脸迎了上来。

“老板,您忙您的,我在您边上跟您聊聊天。”国老拍了拍将离地背道。老板见状便不再客气,拉过两张凳子,请二位坐下。

“您二位有什么指教?”将离问道。

“哈哈哈,不知老板对当下的形势怎么看?有何良策?”国老问。

“草民不敢问政事,只是当下的情况实在让人无语,说有问题吧,好像又没有,没有人做的是错的;说没问题吧,现在的现状不正常。依草民之见,应该收敛财物,控制住物价,这样百姓才能安居乐业,您老说是吧?”将离送了一把柴,用灶铁往里捅了捅道。

“不错,我们所见相同,您老今天晚上不知是否有空?我这里有一封书信,您拿着它去找牡桂,我们一起来想办法解决这边的问题。不知您意下如何?”国老从怀中掏出一封书信道给老板。

“我吗?我能解决城中困境?您太抬举我了。不过如果能为卫凉城出一份力,我肯定是一百个愿意,我就希望这卫凉城恢复往日的繁华。”将离收过信件,揣到怀中接着道:“反正店中也就您二位顾客,闲着也是闲着!全听二位安排。”

“好!好!好!哈哈哈!那我们酉时在牡桂府上会合。”国老站起身,领着术儿出门往牡桂府上走去。

牡桂府是一个比平民大不了多少的府邸,不同的是用青砖砌成,与周围民居的泥墙木结构比倒显得威严了不少。刚到门口术儿就小心翼翼地掏出令牌举过头顶,门口管家见到令牌是牡桂随身之物,很是谨慎,忙迎上来道:“不知二位来府上有何事?”

“我要吃糖葫芦,要好多好多糖葫芦。”术儿仰着头道。

“好的,小的这就去给您买。”管家应到,然后就吩咐下人上街去买,赶紧回头对国老说:“不知国老到来,快快请进,牡将军刚特地差人回来给小的说,您会过来,让您到里面等一下,他过会就回来。”管家抬手将国老二人迎进大厅,递上茶水。这大厅也不大,中堂一幅山水画,一张八仙桌摆在画下,桌上摆着几盘点心,桌旁两张太师椅。下面还有四张桌椅分列两旁,是个常见的摆设。

国老在左侧椅子上坐下,术儿站在旁边,眼睛盯着八仙桌上的点心直流口水。

“师父,嗯~嗯~”术儿哼哼唧唧的想说什么又说不出来。

国老见术儿眼睛盯着的点心道:“想吃?”

“嗯!”术儿重重地点了下头。

“管家,我这小徒跟了我半天了,不知桌上的点心可否……”国老还没说完,管理赶心把桌上的点心端过来递到术儿面前道:“哦!哦!哦!是小的招呼不周,这本就是给二位准备的,我正准备去准备茶,把这给忘了。小师傅,您坐下吃。”管家赔笑脸又端了张小凳子请茅术坐在国老身边,接着道:“下人已经在准备茶了,也该好了。”

这时见门外从厨房端着两碗热腾腾的食物走了上来,放在国老面前的桌上道:“请用子茶!”两个碗里第碗有三个清水烫的鸡蛋,雪白雪白的。茅术眼睛一亮,放下糕点就开始喝了口茶里的汤。

“真甜!”茅术道。

“这是用鸡子泡的茶,国老您的是咸的,小朋友的喜欢吃甜,所以放了糖。”管家解释道。

“这是当地的待客之道,客人上门,首先上子茶,术儿,不过你不能全吃完哦,要留一个,这也是为客之道。”国老对术儿道。

“啊?为什么要留一个啊?那,那汤能喝完么?”术儿笑着问。

“想吃就一起吃掉,都是自家人不用客气。您有老爷给的令牌,您就是这里的主人。”管家笑着客气道。

“嗯嗯!”术儿不管三七二十一,全都灌进肚里了。国老吃了两个蛋,放下碗筷。

“我回来了!国老他们到了吗?”门外听到牡桂的声音,身后跟着云百辣,匆匆地走进来。

“到了,到了,就等老爷您了!”管家忙迎出去。

摘自:https://baijiahao.baidu.com/s?id=1845149512896983558

"等等,我好像找到我要找的人了!"走了一段路,国老突然拉住术儿说道。

“哪呢?哪呢?”术儿忙问。

“在那边,在那边柜台里那位掌柜的。”国老指了指一旁客栈的掌柜,客栈里冷冷清清,掌柜的在跟旁边粮铺老板寒暄。

“我们店哪像您店里生意那么好,这年头,城外也没来了,我这店里这十几天都没开张了,哪像您店里,每天都有客人,米面的价钱一天比一天高。”掌柜酸道。

“师父,我听着老板说的话咋这么酸啊?这牙都要酸倒了!”茅术捂着牙道。

“哈哈哈,就是他了!”国老抬腿往客栈里走,老板一看来人,回头跟粮铺老板道别:“不嚼舌头了,我这儿来人了,您赶紧回你店里,你那边来人买米了。”说完就赶紧迎到门口,脸笑得像一朵花:“两位客官这是住店?”

“哦!哈哈哈,对,住店。不过怕贫道付不起房钱啊!这城里物价实在太高了!”国老打趣道。

“不贵不贵,我们客栈不涨价,还给您打八折。天字一号平时都百文,今天只要八十文一天。普通房今天打折四十文一天。”老板赶紧解释。

“这倒确实不贵,那给我俩开一间普通房就可以了。我们把行李先放下。”国老道。

“好嘞!请跟我来,看二位远道而来,您也是这十几天来第一位顾客,我做主,带您去天字一号房,还是收您四十文一间。”老板赶紧把国老二人领到楼上最大的房间。

“老板真会做生意!那我们就占您这便宜了!”国老道。

“客官这是说哪的话,您来咱们店里是帮我们解决大问题了,不怕您笑话,我们这一家就守着这家客栈生计,以前生意还不错,现在啊!唉!都快揭不开锅了!”老板叹道。

“会好起来的,会好起来的!不知老板怎么称呼?”国老边给老板递过一块碎银一边道。

老板笑脸答着,边收下碎银:“小的叫将离,大伙都叫我阿离,那就谢谢两位客官,我这就下去给您二位烧水。”然后兴冲冲地退出房间下楼去了。

“师父!奇怪啊!为什么其它店里的东西都涨价,这客栈反而降价啊?”茅术关上房门回头歪着个小脑袋问道。

“哈哈哈!嗯,不错,这是供需决定的,需要的人多,东西少,自然就涨价;需要的人少了,东西多了,自然就降价了。”国老道,茅术一脸懵,在旁边琢磨起来了。

摘自:https://baijiahao.baidu.com/s?id=1844968754414748293