贴代码框架PasteForm特性介绍之image

news2024/12/26 11:50:41

简介

PasteForm是贴代码推出的 “新一代CRUD” ,基于ABPvNext,目的是通过对Dto的特性的标注,从而实现管理端的统一UI,借助于配套的PasteBuilder代码生成器,你可以快速的为自己的项目构建后台管理端!目前管理端只有Html+js版本的,后续将支持小程序,Vue等

案例源码

案例源码在

https://gitee.com/pastecode/paste-template

不定期升级

AllInDto!

通过引入PasteForm,一个项目哪怕100个数据表,一般的管理页面也才不到10个,除非有非常多的特殊功能,否则都能用PasteForm中的表格和表单来实现!

在这里插入图片描述

本次的特性介绍,涉及的东西会多一些,你可以下载源码后,看看详细的,我们先来查看下各个特性的信息

image

当前特性可以作用于所有的Dto中,具体的样式由前端决定,支持单图和多图模式

字段类型示例说明
args1数字1图片数量
args2字符cate存放在什么位置,上传图片的时候会附带到参数type中 也会用于图片的样式?
args3字符60*60图片是否需要压缩,压缩的宽高,不压缩的设置为0,比如60*0
args4字符smallsmall,normal,big表示图片的大小三个规格,默认normal,如果要返回格式,则由dataFrom决定

UI

在这里插入图片描述

Dto

    /// <summary>
    /// 图片案例
    /// </summary>
    public class ImageModel
    {
        /// <summary>
        /// 图片1
        /// </summary>
        [ColumnDataType("image","1","icon","120*120")]
        public string Img1 { get; set; }

        /// <summary>
        /// 图片2
        /// </summary>
        [ColumnDataType("image", "1", "head", "750*0")]
        public string Img2 { get; set; }

        /// <summary>
        /// 图片3
        /// </summary>
        [ColumnDataType("image", "2", "head", "750*0")]
        public string Img3 { get; set; }

        /// <summary>
        /// 图片4
        /// </summary>
        [ColumnDataType("image", "2", "head", "120*0")]
        public string[] Img4 { get; set; }
    }

提交的数据

在这里插入图片描述
提交的json数据如下
在这里插入图片描述
注意看提交的信息中的img3,和img4,一个是字符串,使用了拼接,一个是数组,这个是由原来的Dto的数据类型决定的!

默认上传文件的地址为/api/app/Upload/UpImage,注意看上图的url的参数type和size就是特性中配置的类型和大小!

表格中显示

如果你对ListDto的字段进行image特性标注,则在表格中会以image的模式显示,而不是字符串!

UpImage

你可以基于这个案例,自己修改API是现实上传图片

        /// <summary>
        /// 上传图片
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        [TypeFilter(typeof(RoleAttribute), Arguments = new object[] { "data", "view" })]
        public WangEditorUpload UpImage(string type = "bookmark", string size = "")
        {
            var one = new WangEditorUpload();
            one.errno = 1;
            var _month = DateTime.Now.ToString("yyyyMM");
            if (base.Request.Form != null)
            {
                if (base.Request.Form.Files != null)
                {
                    if (base.Request.Form.Files.Count > 0)
                    {
                        one.errno = 0;
                        one.data = new List<WangEditorUploadItem>();
                        for (var k = 0; k < base.Request.Form.Files.Count; k++)
                        {
                            var finput = base.Request.Form.Files[k];
                            //这里还要进行文件后缀的过滤
                            var item = new WangEditorUploadItem();
                            var extension = System.IO.Path.GetExtension(finput.FileName);
                            if (String.IsNullOrEmpty(extension))
                            {
                                extension = ".jpg";
                            }
                            else
                            {
                                if (!extension.StartsWith("."))
                                {
                                    extension = "." + extension;
                                }
                            }
                            if (extension != ".gif")
                            {
                                extension = ".webp";
                            }
                            var filename = $"{finput.FileName}{k}{DateTimeOffset.Now.ToUnixTimeMilliseconds()}".ToMd5Lower();
                            var _char = Path.DirectorySeparatorChar.ToString();
                            var savepath = $"upload/{type}/{_month}/{filename}{extension}";


                            var path = System.IO.Path.GetDirectoryName(savepath);
                            if (!System.IO.Directory.Exists(path)) { System.IO.Directory.CreateDirectory(path); }
                            if (System.IO.File.Exists(savepath)) { System.IO.File.Delete(savepath); }

                            item.alt = finput.FileName;
                            item.href = $"/{savepath}";
                            item.url = $"/{savepath}";
                            if (IsImageExtension(finput.FileName))
                            {
                                var _width = 0;
                                var _height = 0;
                                if (!String.IsNullOrEmpty(size))
                                {
                                    var _sizes = size.Split('*');
                                    int.TryParse(_sizes[0], out _width);
                                    int.TryParse(_sizes[1], out _height);
                                }
                                using var image = Image.Load<Rgba32>(finput.OpenReadStream());
                                if (image.Width > _width && _width != 0)
                                {
                                    image.Mutate(x => x.Resize(_width, _height));
                                }
                                else
                                {
                                    if (image.Height > _height && _height != 0)
                                    {
                                        image.Mutate(x => x.Resize(_width, _height));
                                    }
                                }
                                if (extension == ".webp")
                                {
                                    image.Save(savepath, new WebpEncoder());
                                }
                                else
                                {
                                    image.Save(savepath);
                                }
                                item.url = $"/{savepath}";
                                finput.OpenReadStream().Dispose();
                            }
                            else
                            {
                                using (FileStream fs = new FileStream(savepath, FileMode.Create))
                                {
                                    finput.CopyTo(fs);
                                    fs.Flush();
                                }
                            }
                            item.size = finput.Length;
                            one.data.Add(item);
                        }
                    }
                }
            }
            return one;
        }

PasteForm附加信息

特性处理

                    case "image":
                        {
                            item.dataType = 'image';
                            if (_attribute.args1) {
                                item.num = parseInt(_attribute.args1);
                            } else {
                                item.num = 1;
                            }
                            if (_attribute.args2) {
                                item.type = _attribute.args2;
                            }
                            if (_attribute.args3) {
                                item.size = _attribute.args3;
                            }
                            if (item.value) {
                                if (item.num > 1) {
                                    if (item.dataFrom == "String[]") {
                                        item.images = item.value;//多个图片是一个数组,字符串数组的形式
                                        item.value = item.value.join(',');
                                    } else {
                                        item.images = item.value.split(',');//多个图片之间使用,隔开
                                    }
                                }
                            }
                            if (item.num > 1) {
                                item.singlerow = true;
                            }
                        }
                        break;

UI逻辑

                        <% if(item.dataType == "image" || item.dataType=="images"){ %>
                            <input type="text" style="display:none" name="<%:=item.name%>" value="<%:=item.value%>">
                            <input type="file" multiple id="<%:=item.name%>" datanum="<%:=item.num%>" onchange="handlerUploadFile(this)" datatype="<%:=item.type%>" datasize="<%:=item.size%>" style="display:none;" />
                            <% if(item.num ==1){%>
                                <label for="<%:=item.name%>">
                                    <img class="form-image-head" <% if(item.value && item.value !=null ){ %>src="<%:=item.value%>"<%}%> >
                                    <%if(!item.value || item.value ==null){%>
                                        <span class="iconadd icon-add">
                                            <i class="Hui-iconfont Hui-iconfont-add2 icon"></i>
                                        </span>
                                    <%}%>
                                </label>
                                <span class="placeholder"><%:=item?.placeholder || ''%></span>
                            <% }else{ %>
                                <span class="placeholder"><%:=item?.placeholder || ''%></span>
                                <ul class="imageul">
                                    <li><label for="<%:=item.name%>"><span class="icon-add">
                                        <i class="icon Hui-iconfont Hui-iconfont-add2"></i>
                                    </span></label></li>
                                    <%if(item.images){%>
                                        <%item.images.forEach(_img=>{%>
                                            <li><img src="<%:=_img%>"><i class="Hui-iconfont Hui-iconfont-close2 icon-close"  onclick="handlerRemoveImageItem(this)"></i></li>
                                        <%})%>
                                    <%}%>
                                    <!-- <li>
                                        <img>
                                        <i class="iconfont icon-close" οnclick="handlerRemoveImageItem(this)"></i>
                                    </li> -->
                                </ul>
                            <% } %>
                        <%}%>

更多特性见

贴代码PasteForm专题介绍

我们下期见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++异常: cv::Exception 解决

原因是C中文件路径错误&#xff0c;\ 号在字符串中表示转义字符&#xff0c;"C:\Users\14421\Desktop\123.png" "C:Usersd21DesktopS.png" &#xff0c;所以应该改为 C:\\Users\\14421\\Desktop\\123.png 或者 C:/Users/14421/Desktop/123.png 即可解决问…

libphone desktop编译

linphone-desktop 在ubuntu20.04 下编译 linphone 介绍 Linphone是一款遵循GPL的开源网络视频电话系统&#xff0c;支持多种平台如Windows、Linux、Android等。它基于SIP协议&#xff0c;提供语音、视频通话及即时文本消息功能。核心功能包括SIP用户代理、音频视频Codec支持、…

高精度计算题目合集

高精度计算题目合集 1168&#xff1a;大整数加法 1168&#xff1a;大整数加法 1168&#xff1a;大整数加法 高精度加法原理&#xff1a; a&#xff0c;b&#xff0c;c 都可以用数组表示。这些都是基于c语言的算术运算符形成的运算。 c 3 ( c 1 c 2 ) % 10 c_3(c_1c_2)\%1…

【Python】爬虫实战:高效爬取电影网站信息指南(涵盖了诸多学习内容)

本期目录 1 爬取思路 2 爬虫过程 2.1 网址 2.2 查看网页代码 3 爬取数据 3.1 导入包 3.2 爬取代码 01 爬取思路 \*- 第一步&#xff0c;获取页面内容\*- 第二步&#xff1a;解析并获取单个项目链接 \*- 第三步&#xff1a;获取子页面内容 \*- 第四步&#xff1a;解析…

【bug】使用transformers训练二分类任务时,训练损失异常大

使用transformers训练二分类任务时&#xff0c;训练损失异常大 问题分析 问题 training_loss异常大&#xff0c;在二分类损失中&#xff0c;收敛在1~2附近&#xff0c;而eval_loss却正常&#xff08;小于0.5&#xff09; 分析 参考&#xff1a; Bug in gradient accumulation…

uni-app 认识条件编译,了解多端部署

一. 前言 在使用 uni-app 进行跨平台开发的过程中&#xff0c;经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术&#xff0c;可以帮助我们在不同平台或环境下编写不同的代码&#xff0c;以适应不同的平…

HarmonyOS Next原创项目

学友市集 HarmonyOS毕设,项目完整,代码原创,可接毕设 项目展示 项目简介 学友集市是一款基于HarmonyOS Next开发的二手交易平台,适配HarmonyOS5.0&#xff0c;采用前后端分离架构&#xff0c;致力于为用户提供安全、便捷、高品质的二手商品交易服务。平台整合了华为云认证服…

现代密码学

概论 计算机安全的最核心三个关键目标&#xff08;指标&#xff09;/为&#xff1a;保密性 Confidentiality、完整性 Integrity、可用性 Availability &#xff0c;三者称为 CIA三元组 数据保密性&#xff1a;确保隐私或是秘密信息不向非授权者泄漏&#xff0c;也不被非授权者使…

深度学习实战人脸识别

文章目录 前言一、人脸识别一般过程二、人脸检测主流算法1. MTCNN2. RetinaFace3. CenterFace4. BlazeFace5. YOLO6. SSD7. CascadeCNN 三、人脸识别主流算法1.deepface2.FaceNet3.ArcFace4.VGGFace5.DeepID 四、人脸识别系统实现0.安装教程与资源说明1. 界面采用PyQt5框架2.人…

51c自动驾驶~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12121357 #大语言模型会成为自动驾驶的灵丹妙药吗 人工智能&#xff08;AI&#xff09;在自动驾驶&#xff08;AD&#xff09;研究中起着至关重要的作用&#xff0c;推动其向智能化和高效化发展。目前AD技术的发展主要遵循…

2023年3月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题目123456789101112131415答案BAACBDDAADBCDBC 1.以下不属于计算机输入设备的有&#xff08; &#xff09;。 A &#xff0e;键盘 B &#xff0e;音箱 C &#xff0e;鼠标 D &#xff0e;传感器 【答案】 …

深度学习实验十二 卷积神经网络(3)——基于残差网络实现手写体数字识别实验

目录 一、模型构建 1.1残差单元 1.2 残差网络的整体结构 二、统计模型的参数量和计算量 三、数据预处理 四、没有残差连接的ResNet18 五、带残差连接的ResNet18 附&#xff1a;完整的可运行代码 实验大体步骤&#xff1a; 先前说明&#xff1a; 上次LeNet实验用到的那…

第10章JavaScript的应用

10.1 JavaScript概述 10.1.1 JavaScript简介 10.1.1.1 简单性 10.1.1.2 动态性 10.1.1.3 跨平台性 10.1.1.4 安全性 10.1.1.5 基于对象的语言 10.1.2 JavaScript入门案例 10.1.3 JavaScript放置的位置 10.1.3.1 head标记中的脚本 代码 <!DOCTYPE html> <ht…

Linux操作系统:进程控制_进程的创建、终止、等待

一、进程创建 这一块我们在前篇都已经讲过&#xff0c;第一部分就简单带大家回顾一下之前的知识。 1.1 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include<unistd.h>…

MySQL数据库学习(持续更新ing)

1. 什么是数据库&#xff1f;什么是数据库管理系统&#xff1f;什么是SQL&#xff1f;他们之间的关系是什么&#xff1f; 数据库&#xff1a;Database&#xff0c; 简称DB。按照一定格式存储数据&#xff0c;一些文件的组合。 数据库管理系统&#xff1a;DataBaseManagement&…

电脑自动关机时间如何定?Wise Auto Shutdown 设置关机教程

在日常使用电脑的过程中&#xff0c;有时我们需要让电脑在特定的时间自动关机&#xff0c;比如在下载大文件完成后、执行长时间的任务结束时&#xff0c;或者只是单纯想在某个预定时间让电脑自动关闭以节省能源。这时候&#xff0c;Wise Auto Shutdown 这款软件就能派上大用场了…

【LeetCode热题100】队列+宽搜

这篇博客是关于队列宽搜的几道题&#xff0c;主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …

【数据结构】二叉树(2)

目录 1. 二叉树的遍历 前序遍历 中序遍历 后序遍历 2. 计算二叉树中的节点个数 3. 计算二叉树中叶子节点个数 4. 计算二叉树的深度 5. 计算二叉树第k层节点个数 6. 二叉树基础练习 7. 二叉树的创建 8. 二叉树的销毁 9. 层序遍历 10. 判断二叉树是否为完全二叉树 1…

mysql | limit X, -1 早已不可使用,本身也是一个错误

一、背景 需求&#xff1a;使用 mysql 时&#xff0c;需要获取第 X 条数据之后的所有数据。 这时&#xff0c;首先想到的就是利用 limit 来实现。 早期的部分文章或者资料中&#xff0c;提到可以使用&#xff1a; limit X,-1 例如&#xff0c;获取第一条后的所有数据&…

C++:探索AVL树旋转的奥秘

文章目录 前言 AVL树为什么要旋转&#xff1f;一、插入一个值的大概过程1. 插入一个值的大致过程2. 平衡因子更新原则3. 旋转处理的目的 二、左单旋1. 左单旋旋转方式总处理图2. 左单旋具体会遇到的情况3. 左单旋代码总结 三、右单旋1. 右单旋旋转方式总处理图2. 右单旋具体会遇…