برنامه نویسی

با Blazor یک تولید کننده تصویر ایجاد کنید

سلام بچه ها، جمعه مبارک! امروز بخش جدیدی را افتتاح خواهم کرد که نام آن “API جمعه“. این جمعه API درباره چه خواهد بود؟ خوب، اساساً هر جمعه (یا هر دو جمعه) من یک پروژه .net (blazor، asp net mvc، web API، و غیره) را پست می کنم که با استفاده از یک وب API جالب ساخته شده است، به عنوان مثال، پروژه ای مانند Blazor Pokedex من که با pokemon API.

من واقعاً برای باز کردن این بخش جدید هیجان زده هستم زیرا مدتی است که منتظر انجام آن بودم. من قول می دهم که همه پروژه ها جالب و سرگرم کننده خواهند بود و می توانید از آنها برای به نمایش گذاشتن آنها در نمونه کار توسعه دهندگان خود استفاده کنید تا شغلی پیدا کنید.

این پروژه‌ها از برنامه‌های ساده‌ای که برخی داده‌ها مانند blazor pokedex را نمایش می‌دهند به برنامه‌های پیچیده‌تر تبدیل می‌شوند که نه تنها API را دریافت می‌کنند، بلکه از آن برای تکمیل یک برنامه بسیار بزرگ‌تر نیز استفاده می‌کنند.

وب API امروزی

برای این پروژه، ما از Lorem Picsum web API استفاده خواهیم کرد که اساساً کاری که این وب API انجام می دهد این است که بسته به پارامترهای پرس و جو که به URL درخواست ارسال می کنید، به طور تصادفی یک تصویر با چند فیلتر و ابعاد مشخص شده تولید می کند تا بتوانید از آن استفاده کنید. آنها در پروژه های شخصی شما

مستندات بسیار ساده است، بنابراین می توانید یک بار بروید و آن را بخوانید و من تقریباً مطمئن هستم که می توانید از آن استفاده کنید. این API پاسخ JSON را برنمی‌گرداند، در عوض تصویر خام را به ما می‌دهد تا مستقیماً از آن استفاده کنیم، بنابراین همانطور که در blazor pokedex استفاده می‌کنیم، برای این پروژه از Http Client استفاده نمی‌کنیم.

پس بدون بحث بیشتر وارد کدنویسی می شویم!

یک پروژه جدید blazor wasm خالی ایجاد کنید

یک پروژه خالی جدید Blazor WebAssembly ایجاد کنید، برای این کار، باید آخرین نسخه dotnet را از هم اکنون داشته باشید (dotnet 7.0). اکنون پروژه را با استفاده از دات نت کلی ایجاد کنید.

dotnet new blazorwasm-empty -o ImageGenerator

ما از این الگو برای جلوگیری از داشتن کد دیگ بخار که پروژه معمولی blazor wasm به طور پیش فرض دارد استفاده می کنیم.

مدل تصویر را اضافه کنید

a اضافه کنید Models پوشه را به ریشه پروژه وارد کرده و داخل آن یک مدل جدید به نام ایجاد کنید Image و کد زیر را اضافه کنید

public class Image
    {
        public string Width { get; set; }
        public string Height { get; set; }
        public bool HasId { get; set; }
        public int ImageId { get; set; }
        public bool Grayscale { get; set; }
        public bool Blur { get; set; }
        public int BlurLevel { get; set; }
        public string Extension { get; set; }
    }
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این مدل حاوی ویژگی هایی است که برای تولید یک تصویر تصادفی باید مشخص کنیم، اگر مایلید در مورد این ویژگی ها بیشتر بدانید، می توانید برای درک بهتر اسناد API را بخوانید.

کلاس تنظیمات تصویر

برای دادن ویژگی های مورد نظر به تصویر، از یک کلاس سازنده مانند فلوئنت برای ساخت تصویر به همراه ویژگی های آن استفاده می کنیم.

public class ImageSettings
{
    private Image image;

    public ImageSettings()
    {
        image = new Image();
    }

    public ImageSettings SetWidth(string width){
        image.Width = width;
        return this;
    }

    public ImageSettings SetHeight(string height){
        image.Height = height;
        return this;
    }

    public ImageSettings SetGrayscale(bool hasGrasyScale){
        image.Grayscale = hasGrasyScale;
        return this;
    }

    public ImageSettings SetBlur(bool hasBlur, int blurLevel = 0){
        image.Blur = hasBlur;
        image.BlurLevel = blurLevel;
        return this;
    }

    public ImageSettings SetImageId(bool hasId,int id){
        image.HasId = hasId;
        image.ImageId = id;
        return this;
    }

    public ImageSettings SetImageExtensions(string extension)
    {
        image.Extension = extension;
        return this;
    }

    public Image Build(){
        return image;
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

کاری که این کلاس انجام می دهد این است که مقادیر تمام ویژگی های Image را تنظیم می کند و سپس شی Image را برمی گرداند.

کلاس Link Builder

این وب API نیازی ندارد که ما از طریق کلاس HTTP Client با آن ارتباط برقرار کنیم، در عوض، فقط باید از URL API و به دنبال آن پارامترهای پرس و جو مورد نیاز برای تولید تصویر استفاده کنیم. بنابراین ما به راهی برای ساخت URL با پارامترهایی که به آن ارسال کردیم نیاز داریم ImageSettings کلاس و این کار خواهد بود LinkBuilder کلاس

public static class LinkBuilder
{
    public static string BuildLink(Image image)
    {
        var sb = new StringBuilder("https://picsum.photos");

        if (image.HasId is true)
        {
            sb.Append($"/id/{image.ImageId}");
        }

        sb.Append($"/{image.Width}");

        if (image.Height is not null)
        {
            sb.Append($"/{image.Height}");
        }

        if (!string.IsNullOrEmpty(image.Extension))
        {
            sb.Append($".{image.Extension}");
        }

        if (image.Blur is true && image.Grayscale is true)
        {
            sb.Append("?grayscale&blur");

            if (image.BlurLevel > 0)
            {
                sb.Append($"={image.BlurLevel}");
            }
        }
        else
        {
            if (image.Grayscale is true)
            {
                sb.Append("?grayscale");
            }

            if (image.Blur is true)
            {
                sb.Append("?blur");
                if (image.BlurLevel > 0)
                {
                    sb.Append($"={image.BlurLevel}");
                }
            }
        }

        return sb.ToString();
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این کلاس یک را می پذیرد Image کلاس به عنوان یک پارامتر و از a استفاده می کند StringBuilder برای ساختن URL که از طریق مجموعه ای از دستورات if می گذرد تا هر ویژگی را که Image برای ساخت آن نگه می دارد بررسی کند.\

بیایید کد و نشانه گذاری را به آن اضافه کنیم Index.razor

حالا بیایید وارد فایل Index اصلی شویم که برنامه ما را نمایش می دهد. بیایید با اضافه کردن کد با استفاده از @code{ به جای تگ کنید @ برچسب زدن

@code {
    //Fields & Properties
    private string height;
    private string width;
    private bool hasGrasyScale;
    private bool hasBlur;
    private int blurLevel = 1;
    private string imageExtension;
    private int imageId;
    private bool hasId = false;
    private bool isIdInputDisabled = true;
    private bool isBlurInputDisabled = true;
    private string imageSrc = "";

    //Functions
    void GenerateImage()
    {
        Image randomImage = new ImageSettings()
                            .SetWidth(width)
                            .SetHeight(height)
                            .SetGrayscale(hasGrasyScale)
                            .SetBlur(hasBlur, blurLevel)
                            .SetImageExtensions(imageExtension)
                            .SetImageId(hasId, imageId)
                            .Build();

        imageSrc = BuildLink(randomImage);

        Console.WriteLine(imageSrc);
    }

    string BuildLink(Image image) => LinkBuilder.BuildLink(image);

    private void DisableIdInput()
    {
        isIdInputDisabled = !isIdInputDisabled;
        hasId = !hasId;
    }

    private void DisableBlurInput()
    {
        hasBlur = !hasBlur;
        isBlurInputDisabled = !isBlurInputDisabled;
    }
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یک فیلد برای تمام پارامترهایی که تصویر ما باید توسط آنها دنبال شود تنظیم می کنیم GenerateImage تابعی که همانطور که از نامش می‌گوید تصویر تصادفی ما را با استفاده از ImageSettings کلاس و BuildLink روش و سپس URL تصویر را فقط برای اهداف اشکال زدایی چاپ می کند و در نهایت هر بار که وضعیت علامت زده شده چک باکس ها تغییر می کند، توابع ورودی غیرفعال کردن فعال می شوند.

حالا مقداری نشانه گذاری اضافه کنید

قسمت جلویی برنامه شامل یک نوار کناری با مجموعه‌ای از ورودی‌ها برای کاربر خواهد بود تا ابعاد و فیلترهای تصویر تولید شده را انتخاب کند و بخش محتوا پس از ارسال فرم، تصویر را نگه می‌دارد.

@page "https://dev.to/"
@using Util
@using Models

<div class="main-container d-flex">

    <div class="sidebar" id="side-nav">

        <h4 class="my-3">Image Dimensions</h4>
        <div class="col-10 mx-3 mb-2">
            <label for="" class="form-label">Width</label>
            <input class="form-control" type="number" placeholder="Width" @bind="@width" />
        </div>

        <div class="col-10 mx-3 mb-3">
            <label for="" class="form-label">Height</label>
            <input class="form-control" type="number" placeholder="Height" @bind="@height" />
        </div>
        <hr>

        <h4 class="my-3">Specific Image</h4>

        <div class="col-10 mx-3 mb-3">
            <div class="form-check">
                <input id="imageId" class="form-check-input" type="checkbox" @onchange="@DisableIdInput" />
                <label for="imageId" class="form-check-label">Use Image Id</label>
            </div>
        </div>

        <div class="col-10 mx-3 mb-3">
            <label for="" class="form-label">Image Id</label>
            <input class="form-control" type="number" placeholder="Image Id" @bind="@imageId"
                disabled="@isIdInputDisabled" />
        </div>
        <hr>

        <h4 class="my-3">Filters</h4>

        <div class="col-10 mx-3 mb-3">
            <div class="form-check">
                <input id="grayscaleCheck" class="form-check-input" type="checkbox" placeholder="Grayscale"
                    @bind="@hasGrasyScale" />
                <label for="grayscaleCheck" class="form-check-label">Grayscale</label>
            </div>
        </div>

        <div class="col-10 mx-3 mb-3">
            <div class="form-check">
                <input id="blurCheck" class="form-check-input" type="checkbox" placeholder="Blur"
                    @onchange="@DisableBlurInput" />
                <label for="blurCheck" class="form-check-label">Blur Image</label>
            </div>
        </div>

        <div class="col-10 mx-3 mb-3">
            <label class="form-check-label" for="">Blur level</label>
            <input class="form-control" type="number" placeholder="Blur Level" @bind="@blurLevel"
                disabled="@isBlurInputDisabled" min="1" max="10"/>
        </div>

        <div class="col-11 d-flex justify-content-end">
            <button class="btn btn-primary" @onclick="@GenerateImage" type="button">
                Generate Image
            </button>
        </div>
    </div>

    <div class="container">
        <div class="my-3 d-flex justify-content-center">
            <h1 class="app-title">Image Generator</h1>
        </div>

        <div class="d-flex justify-content-center mt-3 mb-4">
            <img src="@imageSrc" alt="" srcset="">
        </div>
    </div>
</div>
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بوت استرپ 5 را نصب کنید

برای استایل ما از بوت استرپ و فقط کمی css سفارشی استفاده خواهیم کرد، اما قبل از اینکه نیاز به نصب بوت استرپ با استفاده از Libman داشته باشیم. کنسول داخل کد ویژوال استودیو را باز کنید و دستورات زیر را اجرا کنید.

libman init

libman install twitter-bootstrap@5.2.3

سپس از شما خواسته می شود که مقصد پوشه را انتخاب کنید، اگر مقصد پیش فرض را انتخاب کنید باید چیزی شبیه به زیر داشته باشید.

https://cdn.hashnode.com/res/hashnode/image/upload/v1675315211033/0656d7f2-eed8-4f65-8ad7-a1bbbfd563a5.png?auto=compress,format&format=webp

حالا برو داخل index.html فایل کنید و تگ پیوند cdn را به بوت استرپ وارد کنید و یک تگ پیوند css دیگر را به پروژه ما وارد کنید، این باید نام پروژه شما را داشته باشد، مال من ImageGenerator است.

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link rel="stylesheet" href="Imagegenerator.styles.css">
<link href="css/app.css" rel="stylesheet" />
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با CSS یک استایل اضافه کنید

حالا بیایید یک استایل برای نوار کناری اضافه کنیم تا به درستی نمایش داده شود، محفظه برای جلوگیری از سرریز شدن تصاویر بزرگ و پوشش کل صفحه و رنگ ورودی ها در صورت غیرفعال شدن.

#side-nav {
    background: #30343F;
    min-width: 250px;
    max-width: 250px;
    color: #fff;
    padding-left: 10px;
}

.container {
    min-height: 100vh;
    width: 100%;
    overflow: scroll;
    padding: 10px;
}

input[type="number"]:disabled {
    background: #aaa;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

به برنامه تست بدهید!

اکنون باید برای آزمایش برنامه آماده باشید، پروژه را با استفاده از دستور dotnet اجرا کنیدdotnet run و هنگامی که ابعاد و فیلترهای تصویر را مشخص کردید، باید چیزی شبیه به زیر را ببینید.

نسخه ی نمایشی برنامه

در اینجا ما یک تصویر تصادفی با ابعاد مشخص شده (800×600) تولید می کنیم و یک فیلتر خاکستری اعمال می کنیم.

تمامی همکاری ها پذیرفته میشود

اگر ایده‌ای برای بهبود طراحی، کد یا استفاده از برنامه دارید، می‌توانید مخزن GitHub را برای ارسال درخواست کشش شبیه‌سازی کنید، زیرا این پروژه نه تنها مال من است، بلکه مال شما نیز است، اگر می‌خواهید از آن در نمونه کار خود استفاده کنید. شما آزاد هستید که این کار را انجام دهید و هرگونه بهبود یا رفع اشکال را ارسال کنید.

و قبل از رفتن باید بگویم که فراموش کردم ورودی را برای انتخاب پسوند تصویر اضافه کنم 🙄، تمام قابلیت ها وجود دارد، فقط فراموش کردم علامت گذاری را برای انتخاب آن اضافه کنم، بنابراین این چیزی است که شما می توانید به عنوان اولین درخواست کشش اضافه کنید. سعی می کنم بعداً در وقت آزادم این مشکل را برطرف کنم.

با تشکر برای خواندن!

از اینکه در اولین شماره این مقاله به من پیوستید متشکرمجمعه APIسری ”، من از قبل برای پروژه هفته آینده هیجان زده هستم و همچنین قصد دارم آن را بسیار بهتر از این پروژه بسازم، حتی اگر تمام تلاشم را برای ایجاد پروژه ای انجام دادم که بتوانید از آن استفاده کنید و آن را به دوستان خود یا خود نشان دهید. نمونه کارها. فراموش نکنید که من را در وبلاگ من دنبال کنید Unit Coding تا بدانید چه زمانی پروژه بعدی را منتشر می کنم و همچنین برای خواندن پست های مفید در C# و توسعه .net خود را توسعه دهنده بهتری کنید. متشکرم و تو را به زودی میبینم!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا