Skip to content

🖥️ V8 函数列表 - 后端

服务器端 V8 引擎支持 ES6 语法,集成后端对象和方法


📌 介绍

  • 服务器端 V8 引擎代码与前端 V8 的编程语言均为 JavaScript 语法
  • 服务器端 V8 引擎支持 ES6 语法
  • 集成了后端对象、方法,可使用 JS 调用后端方法(非 HTTP)
  • 服务器端 V8 代码在服务器端执行
  • 主要用于表单属性的服务器端 V8 事件、接口引擎、数据源引擎等

接口引擎 V8.ApiEngine

  • 接口引擎详细介绍
  • 服务器端V8事件可以直接调用接口引擎(非http),接口引擎也可以调用接口引擎
  • V8事件或接口引擎在调用另外一个接口引擎时,可传入事件对象,即可保证在同一事务
javascript
//调用方式:
var result = V8.ApiEngine.Run('ApiEngineKey', { 
    Param1 : '1',
});
//同一事务
var resul2 = V8.ApiEngine.Run('ApiEngineKey', { 
    Param2 : '1',
}, V8.DbTrans);

表单引擎 V8.FormEngine

缓存操作 V8.Cache

  • 平台分布式缓存是L1、L2级联动的分布式缓存,L1为本地内存缓存,L2为redis缓存,V8.Cache操作的就是L2级redis缓存,平台会自动管理L1和L2的联动关系。当覆盖数据库、或直接修改数据库表结构数据后,可能需要手动重启api的docker容器以实现自动清除L1级缓存,然后可通过redis desktop manage软件清除L2级缓存。
  • 分布式缓存操作类,用法V8.Cache('Key', 'Value', '0.00:10:00');
  • 注意:过期时间的格式必须是d.HH:mm:ss,如0.12:00:000天12小时,1.10:10:00一天10小时10分钟,也可以不传过期时间参数,则为永久。
  • 建议使用的缓存Key命名规则为:Microi:${V8.OsClient}:{分类key值}:{Key},这样与平台的缓存Key命名规则一致,方便查看,并且区分SaaS租户,防止缓存混乱
javascript
var cacheKey = `Microi:${V8.OsClient}:FormData:baoming`;
var cacheValue = JSON.stringify(formData);
//写缓存
var result1 = V8.Cache.Set(cacheKey, cacheValue, '0.00:00:59');//返回bool类型
//获取缓存
var result2 = V8.Cache.Get(cacheKey);//返回string类型,无缓存返回null
//删除缓存。注:若在Set时设置了有效期,到期会自动删除。
var result3 = V8.Cache.Remove(cacheKey);//返回bool类型
  • 验证码缓存Key命名规则:
`Microi:${OsClient值}:{分类key值}:{Key}`
示例:
`Microi:iTdos:Captcha:aaaa-bbbb-cccc`
  • 平台的redis key前缀只总有4级:
  • 第一级用于区分其它第三方系统共用同一个redis实例时,区分哪个redis文件夹是吾码平台在用的
  • 第二级用于区分saas租户
  • 第三级用于区分redis分类,比如说验证码一类
  • 第四级就是最终要用的key

C#系统类 System

  • 服务器端V8代码能直接使用.net下的System命名空间
展开查看 C# 代码(39 行)
csharp
//生成一个服务器端GUID值
//强烈建议使用 V8.Method.NewUlid() 方法替代 System.Guid.NewGuid(),Ulid 具有更好的排序性和更短的字符串长度
System.Guid.NewGuid()


//将字符串转为base64字符串,建议使用后封装的V8.Base64
var bytes = System.Text.Encoding.UTF8.GetBytes(originalString);  
var base64String = System.Convert.ToBase64String(bytes);

//解密base64,,建议使用后封装的V8.Base64
var bytes = System.Text.Encoding.UTF8.GetBytes(originalString);  
var base64String = System.Convert.ToBase64String(bytes);

//等待1000毫秒
System.Threading.Thread.Sleep(1000);

//调用服务器端全局V8函数,获取yyyy-MM-dd HH:mm:ss格式的当前时间字符串。若获取日期格式,可使用new Date();
V8.Action.GetDateTimeNow()

//如果在服务器端全局V8函数是通过function DateNow(){}这样定义的,则可以直接使用DateNow()
var nowDate = DateNow('yyyy_mm-dd HH:mm:ss');

//异步执行V8代码,方法1(推荐)
var timer1 = setTimeout(function() {
    V8.FormEngine.UptFormData('diy_test1', {
      Id : '8007f94b-4883-4a0c-8c23-f25aca910722'
      Text45 : '2222',
    });
}, 1000);
//可在timer1开始执行前随时手动提前终止定时执行
clearTimeout(timer1);

//异步执行V8代码,方法2
System.Threading.Tasks.Task.Run(function(){
  //实现setTimeout(function, 1000)的效果,不加则是setTimeout(function, 0)的异步效果
  System.Threading.Thread.Sleep(1000);
  V8.FormEngine.UptFormData('diy_test1', {
    Id : '8007f94b-4883-4a0c-8c23-f25aca910722'
    Text45 : '2222',
  });
});

常用函数 V8.Method

  • 集成了一些常用函数,可自定义扩展
展开查看 JavaScript 代码(26 行)
javascript
//从redis中获取当前登陆用户的token和身份信息
//token:可选,是否包含Bearer均支持
//osClient:可选
var currentTokenObj = V8.Method.GetCurrentToken(token, osClient)
//返回:{ OsClient : '', CurrentUser : {}, Token : '不包含 Bearer ' } 或 null

//刷新用户的登陆身份redis缓存信息,必传userId、osClient
V8.Method.RefreshLoginUser(userId, osClient)

//获取私有文件的临时访问地址,可传入FilePathName、或FilePathNames
V8.Method.GetPrivateFileUrl()
var result = V8.Method.GetPrivateFileUrl({
    FilePathName : '/microi/file/2023-08-06/xxx.doc',
    //FilePathNameS : ['/microi/file/2023-08-06/xxx.doc']
});
//返回{ Code : 1/0, Data : '临时访问地址'/['临时访问地址'], Msg : '错误信息' }

//添加系统日志
V8.Method.AddSysLog({
	Type : '', //日志类型,自定义文字,如:接口日志、性能日志、登录日志等
	Title : '', //日志标题,如:张三登录了系统
	Content: '', //日志内容,如:张三在2024-12-12 20:13通过扫码登录了系统 
	OtherInfo : '', //其它信息,如:{ Append : 'test' }
	Remark : '', //日志备注
	Level : 1,//日志等级
});

V8.Base64

  • Base64转换,与System.Convert.ToBase64String(bytes)不同的是V8.Base64若遇异常会直接返回源字符串
javascript
var result = V8.Base64.StringToBase64('123456');
var result = V8.Base64.Base64ToString('MTIzNDU2');

图像处理 V8.Image

V8.Image 提供跨平台的服务端图片生成、合并和编辑能力。所有方法都以对象形式传参,只处理内存中的 Base64、Data URI 或字节数组,不直接读取本地路径,也不会主动访问 URL。

图片来源与返回值

图片来源支持以下形式:

javascript
// 顶层 Base64
{ FileByteBase64: '<base64>' }

// 等价字段
{ Base64: '<base64>' }
{ DataUrl: 'data:image/png;base64,...' }
{ Bytes: response.RawBytes }

// 单图方法也支持 Image / Source 嵌套,值可以是对象或字符串
{ Image: { FileByteBase64: '<base64>' } }
{ Source: '<base64>' }

处理成功时,除 GetInfo 外均返回标准 DosResult

javascript
{
  Code: 1,
  Data: {
    FileName: 'image.png',
    ContentType: 'image/png',
    FileByteBase64: '<base64>',
    Width: 800,
    Height: 600,
    Size: 12345,
    Format: 'png'
  },
  Msg: ''
}

每次调用后必须先判断 Code。接口引擎开启“响应文件”后,可以直接返回这个结果,在浏览器中预览或下载图片。

公共输出参数:

参数默认值说明
OutputFormat / Formatpng支持 pngjpeg / jpgwebpbmpOutputFormat 优先
Quality90编码质量,运行时限制到 1 至 100
BackgroundColor透明;JPEG 为白色画布背景色
FileNameimage.<扩展名>输出文件名,扩展名会按真实格式修正

兼容公共别名:ImageFormat / OutputTypeOutputFormatBackground / BgColorBackgroundColor,单图方法的 ImageBase64FileByteBase64

方法列表

方法说明
V8.Image.Create(param)生成纯色、渐变、文字或基础图形图片
V8.Image.Merge(param)横向、纵向、网格或覆盖合并图片
V8.Image.Overlay(param)覆盖合并快捷方法,未设置模式时自动使用 overlay
V8.Image.Resize(param)调整宽高
V8.Image.Crop(param)裁剪矩形区域
V8.Image.Rotate(param)旋转图片
V8.Image.Flip(param)水平或垂直翻转
V8.Image.Convert(param)转换图片编码格式
V8.Image.Draw(param)在已有图片上绘制文字和图形
V8.Image.Watermark(param)添加图片水印
V8.Image.CreateQRCode(param)生成二维码
V8.Image.GetInfo(param)读取宽高、格式、帧数等信息

Create 的专用参数:

参数默认值说明
Width / Height800 / 600新画布宽高
CanvasWidth / CanvasHeight未设置设置后分别覆盖 Width / Height
BackgroundColorEnd未设置设置后与 BackgroundColor 形成线性渐变
GradientDirectionleft-to-right支持横向、top-to-bottom / verticaldiagonal
Text / TextColor / FontSize / FontFamily未设置 / #111827 / 32 / 默认字体在画布中心追加快捷文字
Elements未设置文字、矩形、椭圆、圆形和线段列表

生成图片并覆盖合并

下面示例先生成大图和小图,再把小图覆盖到大图的指定坐标。覆盖模式按 ZIndex 从小到大绘制,数值更大的图层位于上方;相同 ZIndex 时数组中靠后的图层位于上方。

javascript
var baseResult = V8.Image.Create({
  Width: 1200,
  Height: 700,
  BackgroundColor: '#2563eb',
  BackgroundColorEnd: '#0f172a',
  GradientDirection: 'left-to-right',
  Text: 'Microi',
  TextColor: '#ffffff',
  FontSize: 72,
  FileName: 'poster.png'
});
if (baseResult.Code !== 1) return baseResult;

var badgeResult = V8.Image.Create({
  Width: 240,
  Height: 120,
  BackgroundColor: '#f97316',
  Text: 'NEW',
  TextColor: '#ffffff',
  FontSize: 42
});
if (badgeResult.Code !== 1) return badgeResult;

var result = V8.Image.Overlay({
  CanvasWidth: 1200,
  CanvasHeight: 700,
  Images: [
    {
      FileByteBase64: baseResult.Data.FileByteBase64,
      Width: 1200,
      Height: 700,
      Fit: 'fill',
      ZIndex: 0
    },
    {
      FileByteBase64: badgeResult.Data.FileByteBase64,
      X: 900,
      Y: 80,
      Scale: 0.75,
      Opacity: 0.95,
      CornerRadius: 16,
      ZIndex: 10
    }
  ],
  OutputFormat: 'png',
  FileName: 'poster-with-badge.png'
});
return result;

也可以使用双图简写:

javascript
return V8.Image.Overlay({
  BaseImage: baseResult.Data.FileByteBase64,
  OverlayImage: badgeResult.Data.FileByteBase64,
  X: 900,
  Y: 80,
  OverlayWidth: 180,
  OverlayHeight: 90,
  Opacity: 0.9
});

主图兼容 BaseImageBackgroundImageFirstImageBase;覆盖图兼容 OverlayImageForegroundImageSecondImageOverlay。简写结构中的顶层 XYPositionOpacityOverlayWidthOverlayHeightScale 会应用到覆盖图。

合并模式

javascript
// 左右拼接
var horizontal = V8.Image.Merge({
  Mode: 'horizontal',
  Direction: 'ltr',
  Gap: 20,
  Padding: 20,
  Alignment: 'center',
  Images: [
    { FileByteBase64: firstBase64, Height: 320 },
    { FileByteBase64: secondBase64, Height: 320 }
  ]
});

// 上下拼接
var vertical = V8.Image.Merge({
  Mode: 'vertical',
  Direction: 'ttb',
  Gap: 16,
  Alignment: 'left',
  Images: [firstBase64, secondBase64]
});

// 网格拼接
var grid = V8.Image.Merge({
  Mode: 'grid',
  Columns: 3,
  Gap: 12,
  Padding: 12,
  Images: imageBase64List
});
参数说明
Modehorizontalverticalgridoverlay
Layout优先于 Mode;支持 rowcolumncanvascover,以及 left/right/top/bottom/up/down 方向快捷值
Directionltrrtlttbbtt,也支持 left-to-right 等完整写法
Images / Layers图片或图层数组;数组项可以直接是 Base64 / Data URI 字符串
CanvasWidth / CanvasHeight固定画布尺寸;未设置时按布局自动计算
Padding / Gap内边距 / 图片间距,负数按 0 处理
Alignment横向时控制上下对齐,纵向时控制左右对齐,网格时控制单元格内对齐
Columns网格列数

合并兼容别名:MergeType / TypeModeItemsImages

图层参数

参数默认值说明
Width / Height原尺寸只设置一个时按比例计算另一个
Scale1在宽高计算后再次按比例缩放,范围大于 0 且不超过 100
Fitcontain同时设置宽高时支持 containcoverfill / stretchnone
X / Y未设置覆盖模式绝对坐标;设置其中一个后,另一个默认使用 Padding
Position / Anchortop-left未设置坐标时的锚点;Position 优先
OffsetX / OffsetY0坐标或锚点定位后的偏移
Opacity1透明度,限制到 0 至 1
Rotation0顺时针旋转角度
ZIndex0覆盖顺序,数值越大越靠上
FlipHorizontal / FlipVerticalfalse翻转当前图层
CropX / CropY / CropWidth / CropHeight原图范围缩放前裁剪源图
CornerRadius0圆角半径
BorderColor / BorderWidth未设置 / 0图层边框
BlendModesrc-over混合模式

contain 保持完整内容并等比缩放;cover 居中裁剪并填满目标宽高;fill / stretch 强制拉伸;none 使用原尺寸。Scale 在上述计算后继续生效。

常用锚点:top-lefttoptop-rightleftcenterrightbottom-leftbottombottom-right。混合模式支持 src-overmultiplyscreenoverlaydarkenlightenplus / addsrcdst-over

图层兼容别名:OrderZIndexAlphaOpacityRotateRotationLeft / TopX / Y

其它图片操作

javascript
// 缩放:Width、Height 至少设置一个;Pad=true 时保留完整目标画布
var resized = V8.Image.Resize({
  Image: sourceBase64,
  Width: 800,
  Height: 600,
  Fit: 'cover',
  Pad: false,
  AllowUpscale: true,
  Alignment: 'center'
});

// 裁剪;Clamp=true 时把部分越界区域收缩到图片范围
var cropped = V8.Image.Crop({
  Image: sourceBase64,
  X: 100,
  Y: 80,
  Width: 640,
  Height: 360,
  Clamp: false
});

// 旋转;Expand=false 时保持原画布,边缘可能被裁掉
var rotated = V8.Image.Rotate({
  Image: sourceBase64,
  Degrees: 30,
  Expand: true
});

// 水平、垂直翻转;Horizontal 默认 true,Vertical 默认 false
var flipped = V8.Image.Flip({
  Image: sourceBase64,
  Horizontal: true,
  Vertical: false
});

// 格式转换
var converted = V8.Image.Convert({
  Image: sourceBase64,
  OutputFormat: 'webp',
  Quality: 85,
  FileName: 'converted.webp'
});

// 图片水印
var watermarked = V8.Image.Watermark({
  BaseImage: sourceBase64,
  Watermark: logoBase64,
  Width: 180,
  Height: 90,
  Scale: 1,
  Position: 'bottom-right',
  Margin: 24,
  OffsetX: 0,
  OffsetY: 0,
  Opacity: 0.7,
  Rotation: 0
});

// 二维码;Content 优先于 Text,Size 默认 300
var qr = V8.Image.CreateQRCode({
  Content: 'https://microi.net/',
  Size: 420,
  FileName: 'qrcode.png'
});

// 读取原始图片信息
var info = V8.Image.GetInfo({ Image: sourceBase64 });
// Data: Width、Height、Format、ContentType、Size、FrameCount、
// RepetitionCount、Origin、HasAlpha

WatermarkBaseImage 也可写为 Image,兼容 BaseBaseImageOverlayWatermark

绘制文字和图形

CreateDraw 使用相同的 ElementsCreate 在新画布上绘制;Draw 在输入图片上绘制,输出宽高与原图相同。

javascript
var result = V8.Image.Draw({
  Image: sourceBase64,
  Elements: [
    {
      Type: 'text',
      X: 40,
      Y: 40,
      Text: 'CONFIDENTIAL',
      Color: 'rgba(239,68,68,0.75)',
      FontSize: 36,
      FontFamily: 'Arial',
      FontStyle: 'bold-italic',
      Align: 'left',
      VerticalAlign: 'top',
      Rotation: -8
    },
    {
      Type: 'round-rect',
      X: 40,
      Y: 90,
      Width: 320,
      Height: 100,
      FillColor: '#ffffff88',
      StrokeColor: '#ef4444',
      StrokeWidth: 3,
      CornerRadius: 16,
      Opacity: 0.9
    },
    {
      Type: 'line',
      X: 40,
      Y: 220,
      X2: 360,
      Y2: 220,
      StrokeColor: '#ef4444',
      StrokeWidth: 3
    }
  ]
});
元素类型参数
textTextColorFontSizeFontFamilyFontStyleAlignVerticalAlign
rectangle / rect / round-rectXYWidthHeight、填充、描边、圆角
ellipse / circleXYWidthHeight、填充、描边
lineXYX2Y2WidthHeight、描边

所有元素还支持 OpacityRotation。单次最多绘制 500 个元素。

颜色、安全与资源限制

颜色支持常用英文颜色名、transparent#RGB#RGBA#RRGGBB#RRGGBBAArgb(...)rgba(...)。颜色自身的 Alpha 会与 Opacity 相乘。

运行时内置限制:单次最多合并 50 张图;单边不超过 16,384 像素;单张输入或输出画布不超过 25,000,000 像素;单次解码和单次缩放后图层分别不超过 50,000,000 像素;单张输入不超过 25 MB;单次输入总量不超过 100 MB;输出不超过 50 MB。

这些限制是保护上限,不是业务推荐值。匿名接口应增加更严格的数量、尺寸、并发和权限限制。远程图片必须先通过 V8.Http 下载,并对用户可控 URL 做协议、域名和目标地址白名单校验,不能把 URL 或服务器路径直接传给 V8.Image

FontFamily 是首选字体。运行时会逐个 Unicode 字符验证字形:未传字体、指定字体不存在或某个字体缺少部分字符时,先回退到服务器已安装且包含该字形的字体,再回退到随 Dos.Common 程序集发布的 Noto Sans CJK SC;同一段中英文混排文字可使用多个字体段。因此没有安装任何系统字体的 Linux / 群晖 / 精简容器也能绘制基础拉丁字符、数字和简体中文。如果系统字体与内置字体都不包含某字符,接口会返回带字符及 U+XXXX 码位的明确错误,绝不会生成“口口”缺字方框。内置字体解决可用性,不替代品牌字体、繁体异体字、特殊符号或 Emoji 字体;要求固定字形时仍应在服务器安装业务字体并显式传 FontFamily

当前用户 V8.CurrentUser

  • 当前登陆用户信息,包含用户所属角色、组织机构等,包含使用表单引擎对sys_user表新增字段的信息。
  • 未登录时访问到的值为{}
js
var userName = V8.CurrentUser.Name;

数据库对象 V8.Db

  • 数据库访问对象,支持Dos.ORM、SqlSugar切换
  • FromSql 只传 SQL 字符串;动态值请使用 .AddInParameter("@p0", value) 链式绑定,不要写 FromSql(sql, value)
csharp
//用例:
var list = V8.Db.FromSql("select * from table")//也可以使用V8.DbTrans.FromSql()
                .ToArray(); //返回数组数据,一般用于select查询多条数据语句
                //返回受影响行数,一般用于update、delete、insert语句
                .ExecuteNonQuery(); 
                //返回单条数据,一般用于select查询单条数据语句
                .First(); 
                //返回单条数据的单个字段值,一般用于select单条数据查询、聚合函数、单个字段,如:select sum(Money) from table、select Name from table
                .ToScalar(); 

// 参数化查询
var user = V8.Db.FromSql("select * from sys_user where Id = @p0")
                .AddInParameter("@p0", userId)
                .First();

数据库只读对象 V8.DbRead

  • 数据库只读对象,用法和V8.Db一样,当数据库未部署读写分离时,此对象与V8.Db对象值一致。

扩展数据库对象 V8.Dbs.DbKey

  • 访问多数据库(扩展库)的对象,扩展库管理见:https://web.microi.net/#/database
  • 注意:老的数据库版本上面的表缺少【DbKey】字段,需要更新数据库、或手动添加、或等待应用商城上线【数据库管理】应用安装。
  • 示例:访问oracle扩展库,DbKey的值为OracleDB1,其中V8.Dbs.OracleDB1对象就等同于V8.Db对象。
js
var dataList = V8.Dbs.OracleDB1.FromSql('').ToArray();

//扩展数据库的事务用法
//【注意】emptyExTrans 是扮展库自己创建的事务,与 V8.DbTrans 完全独立,需要手动管理生命周期
var emptyExTrans = V8.Dbs.EmptyEx.BeginTransaction();
var count = emptyExTrans.FromSql("delete from diy_extend_test where Id='49ec484d-a2cf-47fe-b498-6efb2bf9f99d'").ExecuteNonQuery();
emptyExTrans.Commit();//提交事务
//emptyExTrans.Rollback();//回滚事务
emptyExTrans.Close();//释放事务对象
return { Code : 1, Data : count };
  • 已知问题:在平台中添加扩展库后,需要重启api的docker容器才会生效

数据库事务 V8.DbTrans

  • 数据库事务对象,可以像V8.Db一样使用,如:
js
var array = V8.DbTrans.FromSql('...').ToArray();
  • 无需在接口引擎中手动调用【V8.DbTrans.Rollback()】,平台会自动管理事务的提交与回滚(返回Code=1时自动提交,否则自动回滚)。事务生命周期由平台统一管理,调用V8.DbTrans.Commit()或Rollback()均无效。
  • 接口引擎示例
javascript
//操作第一张表,带事务
var result1 = V8.FormEngine.UptFormData('表名或表Id,不区分大小写', {
    Id : '',//必传
    Age : 20, //要修改的字段,注意字段值不能是{}或[],需要序列化
    Sex : '女'
}, V8.DbTrans);
//操作第二张表,带事务
var result2 = V8.FormEngine.UptFormData('表名或表Id,不区分大小写', {
    Id : '',//必传
    Age : 20, //要修改的字段,注意字段值不能是{}或[],需要序列化
    Sex : '女'
}, V8.DbTrans);
//如果第二张表操作成功
if(result2.Code == 1){
  return { Code : 1 };//平台会自动提交事务,因为返回的Code=1
}else{//如果第二张表操作失败
  return { Code : 0, Msg : result.Msg };//平台会自动回滚事务,因为返回的Code=0
}

V8.MongoDb

介绍

  • 本篇介绍如何在接口引擎、后端V8事件中对MongoDB进行相关操作
  • 对MongoDB的新增操作会自动生成对应数据库名和表名,因此可自定义分库、分表规则

新增数据 AddFormData

*自定义数据库名、表名,不存在时会自动创建

javascript
//可以指定固定的Id值
var newId = V8.MongoDb.NewId();
V8.MongoDb.AddFormData({
	DbName : '', //数据库名称,如:sys_log_2024
	TableName: '', //表名名称,如:log_2024_12
	Id : newId, //也可以不指定,会自动生成
	_FormData : {
		Name : '张三',
		Sex : '男',
		Age : 18
	}
});

修改数据 DelFormData

javascript
V8.MongoDb.UptFormData({
	DbName : '', //数据库名称,如:sys_log_2024
	TableName: '', //表名名称,如:log_2024_12
	Id : '', //数据Id
	_FormData : {
		Name : '张三',
		Sex : '男',
		Age : 18
	}
});

删除数据 DelFormData

javascript
V8.MongoDb.DelFormData({
	DbName : '', //数据库名称,如:sys_log_2024
	TableName: '', //表名名称,如:log_2024_12
	Id : '', //数据Id
});

查询数据列表 GetTableData

javascript
V8.MongoDb.GetTableData({
	DbName : '', //数据库名称,如:sys_log_itdos
	TableName: '', //表名名称,如:log_202412
  _Where : [
    ['Type', '=', '访问菜单'], 
    ['OR', 'Type', '=', '点击V8按钮']
  ]
});

查询单条数据 GetFormData

javascript
V8.MongoDb.GetFormData({
	DbName : '', //数据库名称,如:sys_log_2024
	TableName: '', //表名名称,如:log_2024_12
	Id : '', //数据Id
});

V8.Http

  • 对 RestSharp 的受控封装,支持 GET、POST、PATCH。前后端 V8 使用相同的 PascalCase 对象参数;后端接口引擎同步返回,前端浏览器端需使用 await
方法主要参数返回值
V8.Http.GetGetParam响应字符串
V8.Http.PostPostParam / PostParamString响应字符串
V8.Http.PatchPatchParam / PatchParamString响应字符串
GetResponse/PostResponse/PatchResponse同上完整响应对象

完整响应对象包含 ContentHeadersRawBytesStatusCodeErrorMessageTimeout 与兼容参数名 TimeOut 的单位均为秒,默认 600 秒(10 分钟);HeadersHeader 等效;ParamType 支持 form(默认)、jsonxmlbinaryGetParam 是 URL 查询参数,GET、POST、PATCH 均可使用。

javascript
// POST JSON。嵌套对象使用 PostParamString,避免对象转换丢失层级。
var loginText = V8.Http.Post({
  Url: 'https://api.example.com/login',
  PostParamString: JSON.stringify({
    User: { Account: 'admin', Pwd: '******' },
    OsClient: 'demo'
  }),
  ParamType: 'json',
  Timeout: 10,
  Headers: { 'X-Trace-Id': V8.Method.NewGuid() }
});
var loginResult = JSON.parse(loginText);

// GET 查询参数
var listText = V8.Http.Get({
  Url: 'https://api.example.com/users',
  GetParam: { page: 1, size: 20 },
  Headers: { Authorization: 'Bearer ' + loginResult.token }
});

// PATCH JSON。嵌套对象使用 PatchParamString。
var patchText = V8.Http.Patch({
  Url: 'https://api.example.com/users/123',
  PatchParamString: JSON.stringify({ profile: { name: '新名字' } }),
  ParamType: 'json',
  Headers: { Authorization: 'Bearer ' + loginResult.token }
});

// PATCH 完整响应
var patchResp = V8.Http.PatchResponse({
  Url: 'https://api.example.com/users/123',
  PatchParam: { Status: 1 },
  ParamType: 'json'
});
if (patchResp.StatusCode < 200 || patchResp.StatusCode >= 300) {
  return { Code: 0, Msg: patchResp.ErrorMessage || patchResp.Content };
}

// XML 请求
var xmlText = V8.Http.Post({
  Url: 'https://api.example.com/xml',
  ParamType: 'xml',
  PostParamString: '<xml><text>1</text></xml>'
});

// 上传文件:键同时作为表单字段名和文件名
var uploadText = V8.Http.Post({
  Url: 'https://api.example.com/upload',
  PostParam: { title: '附件' },
  FilesByteBase64: { 'report.pdf': pdfBase64 }
});

接口引擎中必须使用对象参数格式,例如 V8.Http.Get({ Url: url })。不要使用 V8.Http.Get(url);旧的 .NET 同名异步重载可能被 Jint 解析为 Promise。

V8.Header、V8.Param

  • 目前两者均只支持在接口引擎中使用,用于获取客户端http post请求接口引擎地址发送的报文和Request Payload参数。

加密类 V8.EncryptHelper

  • Dos.Common加密帮助类
javascript
var pwd = V8.EncryptHelper.DESEncode('123456');//DES加密
var pwd = V8.EncryptHelper.DESDecode('JdZe5gWKjZo=');//DES解密
var pwd = V8.EncryptHelper.SHA1('123456');
var pwd = V8.EncryptHelper.SHA256('123456');
var pwd = V8.EncryptHelper.SHA512('123456');
var pwd = V8.EncryptHelper.MD5Encrypt('123456');//MD5加密
var pwd = V8.EncryptHelper.Sha256Hex('123456');

V8.Office

V8.Office 可在接口引擎中生成 Excel、Word、PowerPoint 文件。导出方法返回 DosResult<byte[]>,接口引擎需要开启【响应文件】,并把 Data 转成 Base64 返回。

方法说明
ExportExcel({...})导出 .xlsx,支持单 Sheet、多 Sheet、图片和动态表头
ExcelToList({...})解析 Excel;SheetIndex0 开始
ExportWordText({...})旧版纯文本 Word 导出,继续兼容
ExportWord({...})导出 .docx,支持段落、章节、表格、图片、页眉页脚、页码
ExportPowerPoint({...})导出 .pptx,支持多页、文本、项目符号、表格、图片、主题、页码
SendEmail({...})发送 HTML 邮件

导出 Excel

单 Sheet:

js
var excelResult = V8.Office.ExportExcel({
  OsClient: V8.OsClient,
  ExcelData: dataList,
  ExcelHeader: [
    { Name: 'Name', Label: '姓名', Component: 'Text' },
    { Name: 'Amount', Label: '金额', Component: 'NumberText', Type: 'decimal' }
  ]
});
if (excelResult.Code !== 1) return excelResult;

return {
  Code: 1,
  Data: {
    FileName: '业务数据.xlsx',
    ContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    FileByteBase64: System.Convert.ToBase64String(excelResult.Data)
  }
};

多 Sheet:

js
var excelResult = V8.Office.ExportExcel({
  OsClient: V8.OsClient,
  ExcelSheets: [
    {
      SheetName: '订单',
      ExcelData: orderList,
      ExcelHeader: [
        { Name: 'OrderNo', Label: '订单号', Component: 'Text' },
        { Name: 'Amount', Label: '金额', Component: 'NumberText', Type: 'decimal' }
      ]
    },
    {
      SheetName: '客户',
      ExcelData: customerList,
      ExcelHeader: [
        { Name: 'Name', Label: '客户名称', Component: 'Text' },
        { Name: 'Phone', Label: '联系电话', Component: 'Text' }
      ]
    }
  ]
});
if (excelResult.Code !== 1) return excelResult;
return {
  Code: 1,
  Data: {
    FileName: '订单与客户.xlsx',
    ContentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    FileByteBase64: System.Convert.ToBase64String(excelResult.Data)
  }
};

ExcelSheets 每项可分别传 SheetNameExcelDataExcelHeader,也可传 FormEngineKey/TableId/_Where/_OrderBy/_PageSize 等查询参数。Sheets 是兼容别名,新代码使用 ExcelSheets。Sheet 名称中的非法字符、31 字符上限和重名会自动处理。

导出 Word

新代码使用对象参数的 ExportWordExportWordText 仅作为旧版纯文本接口继续保留。页面边距、图片宽高单位为厘米,字体大小单位为磅。

js
var wordResult = V8.Office.ExportWord({
  Title: '月度经营报告',
  Subtitle: DateNow('yyyy年MM月'),
  Author: V8.CurrentUser.Name,
  Subject: '经营分析',
  Keywords: '经营,月报',
  Description: '月度经营分析报告',
  PageSize: 'A4',                 // A4 | Letter
  Orientation: 'Portrait',       // Portrait | Landscape
  MarginTop: 2.2,
  MarginRight: 2.0,
  MarginBottom: 2.2,
  MarginLeft: 2.0,
  FontFamily: 'Microsoft YaHei',
  FontSize: 10.5,
  TitleFontSize: 20,
  SubtitleFontSize: 12,
  TitleAlignment: 'Center',
  LineSpacing: 1.25,
  ParagraphSpacingAfter: 6,
  HeaderText: '吾码经营中心',
  FooterText: '内部资料',
  ShowPageNumber: true,
  Paragraphs: [
    { Text: '本月经营情况总体稳定。', FirstLineIndent: 0.74 },
    { Text: '以下数据未经授权不得外传。', Bold: true, FontColor: 'C00000' }
  ],
  Sections: [{
    Heading: '一、核心指标',
    HeadingLevel: 1,
    Content: '本节展示主要经营指标。',
    Tables: [{
      Title: '指标明细',
      Headers: ['指标', '本月', '同比'],
      Rows: [['销售额', 1280000, '12.5%'], ['订单数', 860, '8.1%']],
      ColumnWidths: [4, 4, 4],
      HeaderBackgroundColor: 'D9EAF7',
      BorderColor: 'B7C9D6'
    }]
  }],
  Images: [{
    FileByteBase64: chartBase64,  // 纯 Base64 或 data URI
    FileName: 'chart.png',
    ContentType: 'image/png',
    Width: 15,
    Height: 8,
    Alignment: 'Center',
    Caption: '图 1:趋势分析'
  }]
});
if (wordResult.Code !== 1) return wordResult;
return {
  Code: 1,
  Data: {
    FileName: '月度经营报告.docx',
    ContentType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
    FileByteBase64: System.Convert.ToBase64String(wordResult.Data)
  }
};

常用子参数:

对象支持参数
Paragraphs[]Text/Alignment/Bold/Italic/Underline/FontFamily/FontSize/FontColor/SpacingBefore/SpacingAfter/LineSpacing/FirstLineIndent/PageBreakBefore
Sections[]Heading/HeadingLevel/Content/Paragraphs/Tables/Images/PageBreakBefore
Tables[]Title/Headers/Rows/ColumnWidths/Alignment/HeaderBold/HeaderBackgroundColor/HeaderFontColor/BorderColor/FontSize
Images[]FileByteBase64/FileName/ContentType/Width/Height/Alignment/Caption

导出 PowerPoint

幻灯片尺寸、图片/表格位置和宽高单位均为英寸;默认画布为 16:9(13.333 × 7.5)。

js
var pptResult = V8.Office.ExportPowerPoint({
  Title: '季度经营汇报',
  Author: V8.CurrentUser.Name,
  Subject: '季度复盘',
  Keywords: '经营,季度',
  SlideWidth: 13.333,
  SlideHeight: 7.5,
  FontFamily: 'Microsoft YaHei',
  BackgroundColor: 'FFFFFF',
  TitleColor: '17365D',
  TextColor: '222222',
  TitleFontSize: 28,
  BodyFontSize: 18,
  ShowSlideNumber: true,
  Slides: [
    {
      Layout: 'TitleSlide',
      Title: '季度经营汇报',
      Subtitle: DateNow('yyyy-MM-dd')
    },
    {
      Layout: 'TitleAndContent',
      Title: '核心结论',
      Bullets: ['收入保持增长', '重点客户续约稳定'],
      TextItems: [
        { Text: '风险:回款周期延长', Bullet: true, Level: 0, Bold: true, FontColor: 'C00000' }
      ],
      Tables: [{
        Headers: ['指标', '本期', '目标'],
        Rows: [['销售额', '128万', '120万']],
        X: 0.7, Y: 4.0, Width: 11.9, Height: 2.2,
        HeaderBackgroundColor: '17365D'
      }]
    },
    {
      Title: '趋势图',
      Images: [{
        FileByteBase64: chartBase64,
        FileName: 'trend.png',
        ContentType: 'image/png',
        X: 1.2, Y: 1.5, Width: 10.9, Height: 5.2
      }]
    }
  ]
});
if (pptResult.Code !== 1) return pptResult;
return {
  Code: 1,
  Data: {
    FileName: '季度经营汇报.pptx',
    ContentType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
    FileByteBase64: System.Convert.ToBase64String(pptResult.Data)
  }
};
对象支持参数
顶层Title/Author/Subject/Keywords/Company/SlideWidth/SlideHeight/FontFamily/BackgroundColor/TitleColor/TextColor/TitleFontSize/BodyFontSize/ShowSlideNumber/Slides
Slides[]Layout/Title/Subtitle/Content/Bullets/TextItems/Images/Tables/BackgroundColor/TitleColor/TextColor/TitleFontSize/BodyFontSize
TextItems[]Text/Level/Bullet/Bold/Italic/FontSize/FontColor/Alignment
Images[]FileByteBase64/FileName/ContentType/X/Y/Width/Height
Tables[]Headers/Rows/ColumnWidths/X/Y/Width/Height/HeaderBackgroundColor/HeaderFontColor/CellBackgroundColor/CellFontColor/FontSize

解析 Excel

js
var rows = V8.Office.ExcelToList({
  FileByteBase64: excelBase64,
  SheetIndex: 0
});

发送邮件 SendEmail

js
return V8.Office.SendEmail({
  SmtpServer : 'smtp.qq.com',
  SmtpPort : 587,
  EnableSSL : true,
  SystemEmail : 'admin@itdos.com',
  SystemEmailPwd : 'uuzrnazvv*******',
  EmailSubject : '测试接口引擎发邮件标题',
  EmailBody : '<b>测试接口引擎发邮件内容,<span style="color:red;">支持html</span></b>',
  Receivers : ['123446172@qq.com', '973702@qq.com']
});

系统设置 V8.SysConfig

  • 访问系统设置信息,可以访问到系统设置sys_config表的任意字段
js
var sysTitle = V8.SysConfig.SysTitle;

SaaS引擎信息 V8.OsClientModel

  • 访问当前SaaS引擎敏感配置数据
  • 第三方系统敏感配置也均应该放到SaaS引擎的配置中,如第三方系统key、secret等
js
//获取redis host
var redisHost = V8.OsClientModel.RedisHost;

表单数据 V8.Form

  • 表单提交事件中可访问表单数据,接口引擎中此对象为空。

V8.OldForm

  • 在修改数据时,后端V8事件可访问到V8.OldForm修改前的数据值

V8.FormSubmitAction

  • 表单提交类型:可能的值:Insert Delete Update(string类型)
  • 注意服务器端V8事件里面没有FormOutActionFormOutAfterAction,只有FormSubmitAction

V8.EventName

  • 后端V8事件名称,在全局V8引擎代码中比较好用,可能的值:
js
FormSubmitBefore:表单提交前V8事件
FormSubmitAfter:表单提交后V8事件
DataFilter:数据处理V8事件
WFNodeLine:流程节点条件判断V8事件
WFNodeEnd:流程节点结束V8事件
WFNodeStart:流程节点开始V8事件

V8.Param

  • 用于访问前端传入的参数,能访问到url参数、form-data参数、payload-json参数

V8.Action

  • 用于访问在全局服务器V8代码处自定义的方法

V8.InvokeType

  • 访问当前调用类型,可能的值:ServerClient,当访问到的V8.InvokeType为空时,则默认Server
  • Server:服务器端调用,如在接口引擎中调用接口引擎,在后端V8事件中调用接口引擎
  • Client:前端调用,如在前端V8事件中调用接口引擎,在前端提交表单

V8.TableModel

  • 在后端V8事件中,可访问到操作的当前diy_table表的信息

V8.OsClient

  • 访问当前的OsClient值

console

  • Microi.net.dll从v3.5.1开始支持console往服务器端输出日志
js
console.log('日志输出');
console.error('日志输出');
console.warn('日志输出');
console.info('日志输出');
//服务端查看日志
docker logs microi-api

MIT License.