Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >根据swagger.json生成flutter model,暂无空安全支持

根据swagger.json生成flutter model,暂无空安全支持

作者头像
FreeTimeWorker
发布于 2021-06-10 07:55:30
发布于 2021-06-10 07:55:30
70100
代码可运行
举报
文章被收录于专栏:C#开发点点滴滴C#开发点点滴滴
运行总次数:0
代码可运行

一般的服务端类型都有泛型支持,对于flutter来说虽然也支持泛型,但是在序列化这里却始终存在问题,flutter不允许用反射,对于flutter项目的开发来说除了画页面,可能最烦人的就是跟服务端打交道的时候对对象创建以及序列化,虽然目前网上也有通过json to dart之类的在线工具根据json生成model,但一个项目中那么多类,都这么做一遍太费劲,在有上下级类的情况下需要手动去一个个的调整,烦人,于是写了一个小工具通过 swagger.json 生成flutter model。

1,首先在C#中 我们知道可以的可以生成代码的有razor模板和T4模板,我是基于.net 5开发的于是就顺其自然的使用了当下流行的razor模板来生成代码

在代码引入类库RazorEngine.NetCore

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var config = new TemplateServiceConfiguration();
config.Language = Language.CSharp; // CSharp.NET as template language.
config.AllowMissingPropertiesOnDynamic = true;
config.CachingProvider = new DefaultCachingProvider(t => { });
config.EncodedStringFactory = new HtmlEncodedStringFactory(); // Html encoding.
config.Debug = false;
var service = RazorEngineService.Create(config);
var enummodel= File.ReadAllText("fluttermodel.cshtml");
var  result = Engine.Razor.RunCompile(enummodel, "fluttermodel", null, modelsinfo[i]);

result 就是根据模板生成的最终代码,代码量非常少,代码生成中最主要的地方在于传入template的model,model中需要定义一个dart类中需要用到的所有信息,

2 template fluttermodel.cshtml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@using flutter_model_genrate_swagger;
@using System.Linq;
@using System.Text;
@{
    var modeldes = "";
    if (!string.IsNullOrEmpty(Model.Description))
    {
        modeldes = string.Concat("///", Model.Description);
    }
    var modelparams = "";//参数

    var package = "";
    if (Model.Package != null && Model.Package.Count > 0)
    {
        foreach (var pk in Model.Package)
        {
            package += string.Concat("import '", pk, ".dart';\n");
        }
    }
}


@Raw(package)
@Raw(modeldes)
class @Model.Name {
@foreach (var proptey in Model.ModelPropties)
{
    if (!string.IsNullOrEmpty(proptey.Description))
    { 
        @Raw(string.Concat("///", proptey.Description,"\n"))   
    }
    @switch (proptey.Type)
    {
        case "array":
            @{
                string type = string.Concat("List<", @proptey.SubType, ">");
            }
            @Raw(type) @proptey.LowCaseName@(";")
            break;
        case "integer":
            @("int ") @proptey.LowCaseName@(";")
            break;
        case "string":
            @("String ") @proptey.LowCaseName@(";")
            break;
        case "boolean":
            @("bool ") @proptey.LowCaseName@(";")
            break;
        case "number":
            if (proptey.Format == "double")
            {
                @("double ") @proptey.LowCaseName@(";")
            }
            else
            {
                @Raw("///类型不确定")
                @("double ") @proptey.LowCaseName@(";")
            }
            break;
        default:
            @Raw(proptey.Type + " ")@proptey.LowCaseName@(";")
            break;
    }
    @Raw("\n");
    if (string.IsNullOrEmpty(modelparams))
    {
        modelparams += string.Concat("this.", proptey.LowCaseName);
    }
    else
    {
        modelparams += string.Concat(",this.", proptey.LowCaseName);
    }
}
@Model.Name @("({")@modelparams@("});")
@Raw("\n")
@Model.Name@Raw(".fromJson(Map<String, dynamic> json) {") @Raw("\n")
@foreach (var proptey in Model.ModelPropties)
{
    @switch (proptey.Type)
    {
        case "array":
            @{
                string type = string.Concat("List<", @proptey.SubType, ">");
            }
            @Raw("if (json['")@proptey.Name@Raw("'] != null) {")@Raw("\n")
            @proptey.LowCaseName@Raw("=[];")@Raw("\n")
            @Raw("json['")@proptey.Name@Raw("'].forEach((v) {")@Raw("\n")
            @if (proptey.SubTypeDes == "baseType")
            {
                @proptey.LowCaseName@(".add(v);")@Raw("\n")
            }
            else
            {
                @proptey.LowCaseName@(".add(")@proptey.SubType@Raw(".fromJson(v));")@Raw("\n")
            }
            @Raw("});\n")
            @Raw(" } else {\n")
            @proptey.LowCaseName@Raw("=[];\n")
            @Raw("}\n")
            break;
        case "integer":
        case "string":
        case "boolean":
        case "number":
            @proptey.LowCaseName@("=")@Raw("json['") @proptey.Name@Raw("'];")
            break;
        default:
            //判断类型的
            if (proptey.TypeDes == "object")
            {
                @proptey.LowCaseName@Raw("=json['")@proptey.Name@Raw("']!=null? ")@proptey.Type@Raw(".fromJson(json['")@proptey.Name@Raw("']) : null;\n")
            }
            else
            {
                @proptey.LowCaseName@("=")@Raw("json['") @proptey.Name@Raw("'];")
            }
            break;
    }
    @Raw("\n");
}
}
@Raw("Map<String, dynamic> toJson() { \n")
@Raw("final Map<String, dynamic> data = new Map<String, dynamic>();\n")
@foreach (var proptey in Model.ModelPropties)
{
    switch (proptey.Type)
    {
        case "integer":
        case "string":
        case "boolean":
        case "number":
            @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(";\n")
            break;
        case "array":
            //data['Data'] = this.data.map((v) => v.toJson()).toList();
            @Raw("if (this.")@proptey.LowCaseName@Raw(" != null) { \n")

            @if (proptey.SubTypeDes == "baseType")
            {
                @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(".toList();\n")
            }
            else
            {
                @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(".map((v) => v.toJson()).toList();\n")
            }
            @Raw("}\n")

            break;//普通对象
        default:
            if (proptey.TypeDes == "object")
            {

                @Raw("if (this.")@proptey.LowCaseName@Raw(" != null) { \n")
                @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(".toJson();\n")
                @Raw("}\n")
            }
            else
            {
                @Raw("data['")@proptey.Name@Raw("'] = this.")@proptey.LowCaseName@Raw(";\n")
            }
            break;
    }
}
@Raw("return data;\n")
@Raw("}\n")

}

3 传入template的类定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public enum ModelInfoType
    { 
        Obj,
        Enum
    }
    public class ModelInfo
    {
        public ModelInfo() {
            ModelPropties = new List<ModelPropty>();
        }
        public ModelInfoType Type { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public List<ModelPropty> ModelPropties { get; set; }

        public string LowCaseName
        {
            get
            {
                if (string.IsNullOrEmpty(Name) || Name.Length < 2)
                {
                    return Name;
                }
                else
                { 
                    return Name.Substring(0, 1).ToLower() + Name.Substring(1);
                }
            }
        }
        public List<string> Package
        {
            get
            {
                if (this.ModelPropties.Count == 0)
                {
                    return null;
                }
                else
                {
                    var result = new List<string>();
                    foreach (var item in ModelPropties)
                    {
                        if (item.Type == "array")//包含arry
                        {
                            if (string.IsNullOrEmpty(item.SubType))
                            {
                                if (!ServiceAgent.BaseTypes.Contains(item.Type))
                                {
                                    result.Add(item.Type.Substring(0, 1).ToLower() + item.Type.Substring(1));
                                }
                               
                            }
                            else
                            {
                                if (!ServiceAgent.BaseTypes.Contains(item.SubType.ToLower()))
                                {
                                    result.Add(item.SubType.Substring(0, 1).ToLower() + item.SubType.Substring(1));
                                }
                            }
                        }
                        else if (!ServiceAgent.BaseTypes.Contains(item.Type))//基础类型外
                        {
                            result.Add(item.Type.Substring(0, 1).ToLower() + item.Type.Substring(1));
                        }
                    }
                    return result;
                }
            }
        }


    }

    public class ModelPropty
    { 
        public string Name { get; set; }
        /// <summary>
        /// List<....> | 具体类型
        /// </summary>
        public string Type { get; set; }
        /// <summary>
        /// 如果是arry,这里是arry的子类,
        /// </summary>
        public string SubType { get; set; }
        /// <summary>
        /// 子类描述
        /// </summary>
        public string SubTypeDes { get; set; }
        /// <summary>
        /// 类型描述
        /// </summary>
        public string TypeDes { get; set; }
        public string Format { get; set; }

        public string Description { get; set; }

        public string LowCaseName
        {
            get
            {
                if (string.IsNullOrEmpty(Name)|| Name.Length<2)
                {
                    return Name;
                }
                else
                {
                    return Name.Substring(0, 1).ToLower() + Name.Substring(1);
                }
            }
        }
    }

4 接下去的事情就简单了,把swagger.json下载到本地,用system.text.json解析拿到swagger.json中的所有model,挨个生成

5 最后调用flutter format {文件夹位置} 将所有生成的model类格式化一遍,如果这里发生错误,手动执行以下命令就大功告成了。

6 最后附上项目地址: https://gitee.com/zzf_1/flutter-model-genrate-swagger

release版本下载地址:https://gitee.com/zzf_1/flutter-model-genrate-swagger/tags 【release版本稍微有点大,但是release版本不需要.net环境,对于专职flutter的开发人员来说这个应该会比较有用】

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用SSM+easyui做个简单的增删改查
使用SSM+easyui做个简单的增删改查
Java架构师必看
2021/04/13
1.9K0
MVC5+EasyUI+EF6增删改查以及登录登出的演示
创建StudentController、 及Index视图, 在Index上按F5运行
明志德道
2023/10/21
2610
MVC5+EasyUI+EF6增删改查以及登录登出的演示
easyui+ssm+shiro做的登录注册修改密码审核用户添加角色(五)
easyui+ssm+shiro做的登录注册修改密码审核用户添加角色(五)
Java架构师必看
2021/04/13
1.6K1
easyui+ssm+shiro做的登录注册修改密码审核用户添加角色(五)
thinkjs crud练习
该文章介绍了一种使用 ES6 实现模板引擎,并使用 ThinkJS 引擎进行模板渲染的方法。该方法包括配置 ES6 环境、定义模板引擎接口、实现模板引擎基类、定义模板语法、实现模板编译和渲染、编写测试用例和代码示例。
用户1141560
2017/12/26
1.5K0
thinkjs crud练习
EasyUI使用笔记——Datagrid的使用及排序
Datagrid的使用: 添加一个table,其中class设置为easyui-datagrid,在data-options中设置datagrid的参数,我这里是这样写的:
徐大嘴
2019/03/21
1.5K0
利用easyui实现增删改查(四):修改数据
数据列表后面是有修改的按钮,点击之后,会弹出一个模态框,并且对应的数据是会回填到模态框,之后我们修改之后,点击模态框里面的修改按钮,那么就可以将修改的数据传到后台,这样就可以完成修改功能
一写代码就开心
2020/11/19
6560
利用easyui实现增删改查(四):修改数据
nodejs操作excel并配合edatagrid使用
nodejs读取文件夹下子文件(夹)名称: /** * 查询tmp文件夹下子文件夹名称 */ router.post("/tmpList", function (req, res) { f
用户1141560
2017/12/26
1.4K0
nodejs操作excel并配合edatagrid使用
ASP.NET MVC5+EF6+EasyUI 后台管理系统(82)-Easyui Datagrid批量操作(编辑,删除,添加)
前言 有时候我们的后台系统表单比较复杂,做过进销存或者一些销售订单的都应该有过感觉 虽然Easyui Datagrid提供了行内编辑,但是不够灵活,但是我们稍微修改一下来达到批量编辑,批量删除,批
用户1149182
2018/01/12
1.8K0
ASP.NET MVC5+EF6+EasyUI 后台管理系统(82)-Easyui Datagrid批量操作(编辑,删除,添加)
基于asp.net + easyui框架,一步步学习easyui-datagrid—实现添加、编辑、删除
基于asp.net + easyui框架,一步步学习easyui-datagrid——界面(一)
程序猿小亮
2021/01/29
1.6K0
利用easyui实现增删改查:ssm项目的全部代码
index.jsp页面 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <link rel="stylesheet" type="text/css" href="/themes/default/easyui.css"> <link rel="stylesheet" type="text/css" href="/themes/icon.css"> <script type="text/javasc
一写代码就开心
2020/11/19
1.4K0
利用easyui实现增删改查:ssm项目的全部代码
初试JqueryEasyUI(附Demo)[通俗易懂]
  关于easyui不多说,对于我们这样没有美术功底的程序员来说,简直是大大的福利,园里面也有不少人在用,自己在整理一个个站,后台管理要用,正好可以学习下。网上找了相关的教程什么的,但是发现还是官网上的demo讲的狠详细,还有就是下载后的demo示例,但都是某个控件示例,很遗憾,没有整个系统的demo。
全栈程序员站长
2022/09/07
2K0
初试JqueryEasyUI(附Demo)[通俗易懂]
利用easyui实现增删改查(四):添加数据
写了以上的代码,那么就有模态框了,只是我们看不见,因为 closed:true 关闭了
一写代码就开心
2020/11/19
6500
利用easyui实现增删改查(四):添加数据
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查
文章于2016-12-17日重写 在第八讲中,我们已经做到了怎么样分页。这一讲主要讲增删改查。第六讲的代码已经给出,里面包含了增删改,大家可以下载下来看下。 这讲主要是,制作漂亮的工具栏,虽然ea
用户1149182
2018/01/16
1.9K0
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查
SpringMVC+easyUI CRUD 添加数据C
接一篇文章,今天上午实现了添加数据。以下是Jsp。里面主要是看newUser()和saveUser().注意这函数里的url,newUser()里面去掉url属性。还要注意的一个问题
全栈程序员站长
2022/07/08
2370
【php增删改查实例】第十节 - 部门管理模块(新增功能)
正常情况下,在一个部门管理页面,不仅仅需要展示列表数据,还需要基本的增删改操作,所以,我们先把之前写好的新增功能集成进来。 在toolbar中,添加一个新增按钮。 <div id="toolbar" style="padding:10px 12px;"> <a href="javascript:openDialog()" class="easyui-linkbutton" iconCls="icon-add" plain="true">新增部门</a> <br><br> 请输入
剽悍一小兔
2018/06/21
7790
very-easyUI 框架快速上手文档
这是我自己闲暇之余封装的一个工具,当然还有一大堆BUG,但是对于自己接接小活还是挺方便的,分享出来。后面会慢慢持续更新。
剽悍一小兔
2019/10/10
1.7K0
very-easyUI 框架快速上手文档
商城项目回顾整理(一)前台页面布局
登录页面: 1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 6 <head> 7 <
二十三年蝉
2018/02/28
1.8K0
jquery easyui datagrid 保存/加载自定义配置每列属性
直接附上源代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Format DataGrid Columns - jQuery EasyUI Demo</title> <link rel="stylesheet" type="text/css" href="css/material/easyui.css"> <script type="text/javascript" src="js/jquery.mi
阿新
2019/10/06
1.2K0
【Java框架型项目从入门到装逼】第十一节 用户新增之把数据传递到后台
让我们继续来做“主线任务”,这一节,我们来做具体的用户新增功能。首先,为了简单起见,我把主页面改了一些,改的是列表那一块。删去了一些字段,和数据库表对应一致: 现在,我们要实现一个效果,就是当我点击新
剽悍一小兔
2018/05/17
1.5K0
Spring Boot 之整合 EasyUI 打造 Web 应用
EasyUI 下载地址:http://www.jeasyui.cn/download.html
静默虚空
2022/03/23
8050
推荐阅读
相关推荐
使用SSM+easyui做个简单的增删改查
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验