V 1.0.3
DB conf — раздел, отвечающий за конфигурацию базы данных: подключение, параметры окружения и общие настройки
{
"ConnectionStrings": {
"Default": "Server=(localdb)\\MSSQLLocalDb;Database=WepAppDb; Trusted_Connection=True;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
builder.WebHost.UseUrls("http://*:7010");
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));
using Microsoft.EntityFrameworkCore;
using WebApplication2.Models;
namespace WebApplication2.Data
{
public class AppDbContext : DbContext
{
public DbSet<Product> Products => Set<Product>();
public DbSet<User> Users => Set<User>();
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
}
}
namespace WebApplication2.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = "";
public int Price { get; set; }
}
public class User
{
public int Id { get; set; }
public string Name { get; set; } = "";
public string Useranme { get; set; } = "";
public string password { get; set; } = "";
public string? Image { get; set; }
}
}
Раздел нужен для управления параметрами запроса, обработки данных и контролем взаимодействия клиента с сервером.
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Identity.Client;
using WebApplication2.Data;
using WebApplication2.Models;
namespace WebApplication2.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
private readonly AppDbContext _db;
public UserController(AppDbContext db)
{
_db = db;
}
[HttpGet]
public async Task<IActionResult> GetAll()
{
var result = await _db.Users.ToListAsync();
return Ok(result);
}
[HttpPost("sign-up")]
[Consumes("multipart/form-data")]
public async Task<IActionResult> SignUp([FromForm] IFormFile image, [FromForm] string useranme,
[FromForm] string name, [FromForm] string password)
{
var ext = Path.GetExtension(image.FileName);
if (string.IsNullOrEmpty(ext)) ext = ".png";
var filename = Guid.NewGuid() + ext;
Directory.CreateDirectory("wwwroot/images");
await using var f = System.IO.File.Create($"wwwroot/images/{filename}");
await image.CopyToAsync(f);
var user = new User
{
Useranme = useranme,
Name = name,
password = password,
Image = $"images/{filename}"
};
await _db.Users.AddAsync(user);
await _db.SaveChangesAsync();
return Ok(user);
}
[HttpPost("sign-in")]
public async Task<IActionResult> SignIn([FromBody] User login)
{
var user = await _db.Users.FirstOrDefaultAsync(x => x.Useranme == login.Useranme);
if (user == null)
return NotFound();
var validUser = await _db.Users.FirstOrDefaultAsync(x => x.password == login.password);
if (validUser == null)
return BadRequest(ModelState);
return Ok(user);
}
[HttpGet("profile/{id}")]
public async Task<IActionResult> Profile(int id)
{
var user = await _db.Users.FirstOrDefaultAsync(x => x.Id == id);
return Ok(user);
}
}
[ApiController]
[Route("api/[controller]")]
public class ProductController : ControllerBase
{
private readonly AppDbContext _db;
public ProductController(AppDbContext db)
{
_db = db;
}
[HttpGet]
public async Task<IActionResult> GetAll([FromQuery] string? name, [FromQuery] int? price)
{
var query = _db.Products.AsQueryable();
if (!string.IsNullOrEmpty(name))
query = query.Where(x => x.Name == name);
if (price.HasValue)
query = query.Where(x => x.Price >= price.Value);
var result = await query.ToListAsync();
return Ok(result);
}
[HttpGet("{id}")]
public async Task<IActionResult> GetById(int id)
{
var item = await _db.Products.FirstOrDefaultAsync(x => x.Id == id);
if (item == null)
return NotFound();
return Ok(item);
}
[HttpPost]
public async Task<IActionResult> CreateProduct([FromBody] Product product)
{
if (!ModelState.IsValid)
return BadRequest(ModelState);
await _db.Products.AddAsync(product);
await _db.SaveChangesAsync();
return CreatedAtAction(nameof(GetById), new { id = product.Id }, product);
}
[HttpPatch("{id}")]
public async Task<IActionResult> UpdateProduct([FromBody] Product update, int id)
{
var product = await _db.Products.FindAsync(id);
if (product == null)
return NotFound();
if (!string.IsNullOrEmpty(update.Name))
product.Name = update.Name;
if (update.Price > 0)
product.Price = update.Price;
await _db.SaveChangesAsync();
return Ok(product);
}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteProduct(int id)
{
var product = await _db.Products.FindAsync(id);
if (product == null)
return NotFound();
_db.Products.Remove(product);
await _db.SaveChangesAsync();
return NoContent();
}
}
}
var http = new HttpClient();
var payload = new
{
Username = Username.Text,
Password = Password.Text
};
var json = JsonConvert.SerializeObject(payload);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var res = await http.PostAsync("http://localhost:5139/api/User/sign-up", content);
if (res.IsSuccessStatusCode)
{
await Navigation.PushAsync(new Home());
}
else if (res.StatusCode == System.Net.HttpStatusCode.NotFound)
{
await DisplayAlert("Инфо", "Пользователь не найден", "OK");
}
else if (res.StatusCode == System.Net.HttpStatusCode.BadRequest)
{
await DisplayAlert("Инфо", "Неверный пароль", "OK");
}
else
{
await DisplayAlert("Инфо", $"Ошибка: {res.StatusCode}", "OK");
}
Pages — это набор страниц, из которых состоит приложение. Каждая страница отвечает за отображение определённого контента или функциональности и формирует структуру маршрутов.
// На странице, с которой хочешь перейти
await Navigation.PushAsync(new HomePage()); // "HomePage" — это твоя новая страница
// Чтобы вернуться назад
await Navigation.PopAsync();
private string connApp = @"Server=(localdb)\MSSQLLocalDB;Integrated Security=true;";
public class User
{
public int Id { get; set; }
public string name { get; set; } = "";
}
public partial class MainWindow : Window
{
private Class1 _db;
public MainWindow()
{
InitializeComponent();
_db = new Class1();
var list = new List<User>();
var data = _db.All();
for (int i = 0; i < data.Count; i++)
{
list.Add(new User { Id = data[i].id, name = data[i].name });
}
DataGrid1.ItemsSource = list;
}
}
var selected = DataGrid1.SelectedItem as User;
if (selected != null)
{
MessageBox.Show(selected.Id.ToString());
}
Link — компонент, который используется для переходов внутри приложения. Обеспечивает навигацию без перезагрузки страницы и улучшает пользовательский опыт.
<NavLink to="/message">Messages</NavLink>
// Using render props
<NavLink
to="/messages"
className={({ isActive, isPending }) =>
isPending ? "pending" : isActive ? "active" : ""
}
>
Messages
</NavLink>
Query — механизм выполнения запросов на чтение данных. Позволяет получать, обновлять и кэшировать данные из различных источников, обеспечивая эффективное взаимодействие приложения с бекендом или БД. Пример показывает динамический поиск с пагинацией.
const { username, title, page, limit } = req.query
const skip = page && limit ? (Number(page) - 1) * Number(limit) : undefined
const take = limit ? Number(limit) : undefined
const tweets = await prisma.post.findMany({
where: {
AND: [
username
? { author: { username: { contains: String(username) } } }
: {},
title
? { title: { contains: String(title) } }
: {}
]
},
include: {
author: { select: { username: true, email: true } }
},
skip,
take
});