From 0c58fa32195f5f42e77d66515793267087dc90a7 Mon Sep 17 00:00:00 2001
From: Kinfey <93169410+kinfey@users.noreply.github.com>
Date: Sun, 22 Sep 2024 08:26:22 +0800
Subject: [PATCH] Convert demo folder project to Python
Convert the `demo` folder project from C# and .NET to Python.
* **Controllers:**
- Add `order_controller.py` to handle order-related routes.
- Add `payment_controller.py` to handle payment-related routes.
- Add `user_controller.py` to handle user-related routes.
* **Models:**
- Add `order.py` to define the Order model.
- Add `order_status.py` to define the OrderStatus model.
- Add `payment.py` to define the Payment model.
- Add `payment_status.py` to define the PaymentStatus model.
- Add `user.py` to define the User model.
- Add `user_login_request.py` to define the UserLoginRequest model.
- Add `user_login_response.py` to define the UserLoginResponse model.
- Add `user_profile.py` to define the UserProfile model.
- Add `user_registration_request.py` to define the UserRegistrationRequest model.
- Add `user_registration_response.py` to define the UserRegistrationResponse model.
* **Data Access:**
- Add `db.py` to set up SQLAlchemy database connection.
- Add `order_repository.py` to handle order data access.
- Add `payment_repository.py` to handle payment data access.
- Add `user_repository.py` to handle user data access.
* **Services:**
- Add `order_service.py` to handle order-related business logic.
- Add `payment_service.py` to handle payment-related business logic.
- Add `user_service.py` to handle user-related business logic.
* **Application Setup:**
- Add `app.py` to set up the Flask application and register blueprints.
* **Remove C# and .NET files:**
- Delete `ChengFenStore.sln`, `ChengFenStore.csproj`, and all C# files in `Controllers`, `Data`, `Models`, and `Services` directories.
---
For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/kinfey/GitHubCopilotWorkShop?shareId=XXXX-XXXX-XXXX-XXXX).
---
demo/ChengFenStore.sln | 21 ---
demo/ChengFenStore/ChengFenStore.csproj | 19 ---
.../Controllers/OrderController.cs | 60 ---------
.../Controllers/OrderControllerTests.cs | 122 ------------------
.../Controllers/PaymentController.cs | 38 ------
.../Controllers/PaymentControllerTests.cs | 71 ----------
.../Controllers/UserController.cs | 56 --------
.../Controllers/UserControllerTests.cs | 119 -----------------
demo/ChengFenStore/Data/AppDbContext.cs | 16 ---
demo/ChengFenStore/Data/OrderRepository.cs | 41 ------
demo/ChengFenStore/Data/PaymentRepository.cs | 40 ------
demo/ChengFenStore/Data/UserRepository.cs | 34 -----
demo/ChengFenStore/Models/Order.cs | 12 --
demo/ChengFenStore/Models/OrderStatus.cs | 9 --
demo/ChengFenStore/Models/Payment.cs | 11 --
demo/ChengFenStore/Models/PaymentStatus.cs | 9 --
demo/ChengFenStore/Models/User.cs | 9 --
demo/ChengFenStore/Models/UserLoginRequest.cs | 9 --
.../ChengFenStore/Models/UserLoginResponse.cs | 9 --
demo/ChengFenStore/Models/UserProfile.cs | 9 --
.../Models/UserRegistrationRequest.cs | 10 --
.../Models/UserRegistrationResponse.cs | 9 --
demo/ChengFenStore/Program.cs | 57 --------
demo/ChengFenStore/Services/OrderService.cs | 44 -------
demo/ChengFenStore/Services/PaymentService.cs | 30 -----
demo/ChengFenStore/Services/UserService.cs | 99 --------------
demo/ChengFenStore/app.py | 16 +++
.../controllers/order_controller.py | 24 ++++
.../controllers/payment_controller.py | 14 ++
.../controllers/user_controller.py | 29 +++++
demo/ChengFenStore/data/db.py | 8 ++
demo/ChengFenStore/data/order_repository.py | 13 ++
demo/ChengFenStore/data/payment_repository.py | 13 ++
demo/ChengFenStore/data/user_repository.py | 10 ++
demo/ChengFenStore/models/order.py | 8 ++
demo/ChengFenStore/models/order_status.py | 5 +
demo/ChengFenStore/models/payment.py | 7 +
demo/ChengFenStore/models/payment_status.py | 5 +
demo/ChengFenStore/models/user.py | 5 +
.../models/user_login_request.py | 5 +
.../models/user_login_response.py | 5 +
demo/ChengFenStore/models/user_profile.py | 5 +
.../models/user_registration_request.py | 6 +
.../models/user_registration_response.py | 5 +
demo/ChengFenStore/services/order_service.py | 20 +++
.../ChengFenStore/services/payment_service.py | 12 ++
demo/ChengFenStore/services/user_service.py | 65 ++++++++++
47 files changed, 280 insertions(+), 963 deletions(-)
delete mode 100644 demo/ChengFenStore.sln
delete mode 100644 demo/ChengFenStore/ChengFenStore.csproj
delete mode 100644 demo/ChengFenStore/Controllers/OrderController.cs
delete mode 100644 demo/ChengFenStore/Controllers/OrderControllerTests.cs
delete mode 100644 demo/ChengFenStore/Controllers/PaymentController.cs
delete mode 100644 demo/ChengFenStore/Controllers/PaymentControllerTests.cs
delete mode 100644 demo/ChengFenStore/Controllers/UserController.cs
delete mode 100644 demo/ChengFenStore/Controllers/UserControllerTests.cs
delete mode 100644 demo/ChengFenStore/Data/AppDbContext.cs
delete mode 100644 demo/ChengFenStore/Data/OrderRepository.cs
delete mode 100644 demo/ChengFenStore/Data/PaymentRepository.cs
delete mode 100644 demo/ChengFenStore/Data/UserRepository.cs
delete mode 100644 demo/ChengFenStore/Models/Order.cs
delete mode 100644 demo/ChengFenStore/Models/OrderStatus.cs
delete mode 100644 demo/ChengFenStore/Models/Payment.cs
delete mode 100644 demo/ChengFenStore/Models/PaymentStatus.cs
delete mode 100644 demo/ChengFenStore/Models/User.cs
delete mode 100644 demo/ChengFenStore/Models/UserLoginRequest.cs
delete mode 100644 demo/ChengFenStore/Models/UserLoginResponse.cs
delete mode 100644 demo/ChengFenStore/Models/UserProfile.cs
delete mode 100644 demo/ChengFenStore/Models/UserRegistrationRequest.cs
delete mode 100644 demo/ChengFenStore/Models/UserRegistrationResponse.cs
delete mode 100644 demo/ChengFenStore/Program.cs
delete mode 100644 demo/ChengFenStore/Services/OrderService.cs
delete mode 100644 demo/ChengFenStore/Services/PaymentService.cs
delete mode 100644 demo/ChengFenStore/Services/UserService.cs
create mode 100644 demo/ChengFenStore/app.py
create mode 100644 demo/ChengFenStore/controllers/order_controller.py
create mode 100644 demo/ChengFenStore/controllers/payment_controller.py
create mode 100644 demo/ChengFenStore/controllers/user_controller.py
create mode 100644 demo/ChengFenStore/data/db.py
create mode 100644 demo/ChengFenStore/data/order_repository.py
create mode 100644 demo/ChengFenStore/data/payment_repository.py
create mode 100644 demo/ChengFenStore/data/user_repository.py
create mode 100644 demo/ChengFenStore/models/order.py
create mode 100644 demo/ChengFenStore/models/order_status.py
create mode 100644 demo/ChengFenStore/models/payment.py
create mode 100644 demo/ChengFenStore/models/payment_status.py
create mode 100644 demo/ChengFenStore/models/user.py
create mode 100644 demo/ChengFenStore/models/user_login_request.py
create mode 100644 demo/ChengFenStore/models/user_login_response.py
create mode 100644 demo/ChengFenStore/models/user_profile.py
create mode 100644 demo/ChengFenStore/models/user_registration_request.py
create mode 100644 demo/ChengFenStore/models/user_registration_response.py
create mode 100644 demo/ChengFenStore/services/order_service.py
create mode 100644 demo/ChengFenStore/services/payment_service.py
create mode 100644 demo/ChengFenStore/services/user_service.py
diff --git a/demo/ChengFenStore.sln b/demo/ChengFenStore.sln
deleted file mode 100644
index f1ed4c7..0000000
--- a/demo/ChengFenStore.sln
+++ /dev/null
@@ -1,21 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.0.31912.275
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChengFenStore", "ChengFenStore\ChengFenStore.csproj", "{8A2F5E1B-5A5B-4D3A-8A2F-5E1B5A5B4D3A}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {8A2F5E1B-5A5B-4D3A-8A2F-5E1B5A5B4D3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8A2F5E1B-5A5B-4D3A-8A2F-5E1B5A5B4D3A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8A2F5E1B-5A5B-4D3A-8A2F-5E1B5A5B4D3A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8A2F5E1B-5A5B-4D3A-8A2F-5E1B5A5B4D3A}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/demo/ChengFenStore/ChengFenStore.csproj b/demo/ChengFenStore/ChengFenStore.csproj
deleted file mode 100644
index 2c625d7..0000000
--- a/demo/ChengFenStore/ChengFenStore.csproj
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
- net7.0
- enable
- enable
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/demo/ChengFenStore/Controllers/OrderController.cs b/demo/ChengFenStore/Controllers/OrderController.cs
deleted file mode 100644
index 5ae6762..0000000
--- a/demo/ChengFenStore/Controllers/OrderController.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using ChengFenStore.Services;
-using ChengFenStore.Models;
-using Microsoft.AspNetCore.Authorization;
-
-namespace ChengFenStore.Controllers
-{
- [Authorize]
- [ApiController]
- [Route("api/[controller]")]
- public class OrderController : ControllerBase
- {
- private readonly OrderService _orderService;
-
- public OrderController(OrderService orderService)
- {
- _orderService = orderService;
- }
-
- [HttpPost("create")]
- public IActionResult CreateOrder([FromBody] Order order)
- {
- var createdOrder = _orderService.CreateOrder(order);
- return CreatedAtAction(nameof(GetOrderById), new { id = createdOrder.OrderId }, createdOrder);
- }
-
- [HttpGet("{id}")]
- public IActionResult GetOrderById(int id)
- {
- var order = _orderService.GetOrderById(id);
- if (order == null)
- {
- return NotFound();
- }
- return Ok(order);
- }
-
- [HttpPut("confirm/{id}")]
- public IActionResult ConfirmOrder(int id)
- {
- var order = _orderService.ConfirmOrder(id);
- if (order == null)
- {
- return NotFound();
- }
- return Ok(order);
- }
-
- [HttpGet("track/{id}")]
- public IActionResult TrackOrder(int id)
- {
- var order = _orderService.TrackOrder(id);
- if (order == null)
- {
- return NotFound();
- }
- return Ok(order);
- }
- }
-}
diff --git a/demo/ChengFenStore/Controllers/OrderControllerTests.cs b/demo/ChengFenStore/Controllers/OrderControllerTests.cs
deleted file mode 100644
index 8581a21..0000000
--- a/demo/ChengFenStore/Controllers/OrderControllerTests.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-using Xunit;
-using Moq;
-using Microsoft.AspNetCore.Mvc;
-using ChengFenStore.Controllers;
-using ChengFenStore.Services;
-using ChengFenStore.Models;
-
-namespace ChengFenStore.Tests
-{
- public class OrderControllerTests
- {
- private readonly Mock _mockOrderService;
- private readonly OrderController _orderController;
-
- public OrderControllerTests()
- {
- _mockOrderService = new Mock();
- _orderController = new OrderController(_mockOrderService.Object);
- }
-
- [Fact]
- public void CreateOrder_ReturnsCreatedAtActionResult()
- {
- // Arrange
- var order = new Order { OrderId = 1, UserId = 1, ProductDetails = "Product 1", DeliveryMethod = "Delivery", OrderStatus = "Pending" };
- _mockOrderService.Setup(service => service.CreateOrder(order)).Returns(order);
-
- // Act
- var result = _orderController.CreateOrder(order);
-
- // Assert
- var createdAtActionResult = Assert.IsType(result);
- Assert.Equal("GetOrderById", createdAtActionResult.ActionName);
- Assert.Equal(order.OrderId, createdAtActionResult.RouteValues["id"]);
- Assert.Equal(order, createdAtActionResult.Value);
- }
-
- [Fact]
- public void GetOrderById_ReturnsOkObjectResult_WhenOrderExists()
- {
- // Arrange
- var order = new Order { OrderId = 1, UserId = 1, ProductDetails = "Product 1", DeliveryMethod = "Delivery", OrderStatus = "Pending" };
- _mockOrderService.Setup(service => service.GetOrderById(order.OrderId)).Returns(order);
-
- // Act
- var result = _orderController.GetOrderById(order.OrderId);
-
- // Assert
- var okObjectResult = Assert.IsType(result);
- Assert.Equal(order, okObjectResult.Value);
- }
-
- [Fact]
- public void GetOrderById_ReturnsNotFoundResult_WhenOrderDoesNotExist()
- {
- // Arrange
- _mockOrderService.Setup(service => service.GetOrderById(It.IsAny())).Returns((Order)null);
-
- // Act
- var result = _orderController.GetOrderById(1);
-
- // Assert
- Assert.IsType(result);
- }
-
- [Fact]
- public void ConfirmOrder_ReturnsOkObjectResult_WhenOrderExists()
- {
- // Arrange
- var order = new Order { OrderId = 1, UserId = 1, ProductDetails = "Product 1", DeliveryMethod = "Delivery", OrderStatus = "Pending" };
- _mockOrderService.Setup(service => service.ConfirmOrder(order.OrderId)).Returns(order);
-
- // Act
- var result = _orderController.ConfirmOrder(order.OrderId);
-
- // Assert
- var okObjectResult = Assert.IsType(result);
- Assert.Equal(order, okObjectResult.Value);
- }
-
- [Fact]
- public void ConfirmOrder_ReturnsNotFoundResult_WhenOrderDoesNotExist()
- {
- // Arrange
- _mockOrderService.Setup(service => service.ConfirmOrder(It.IsAny())).Returns((Order)null);
-
- // Act
- var result = _orderController.ConfirmOrder(1);
-
- // Assert
- Assert.IsType(result);
- }
-
- [Fact]
- public void TrackOrder_ReturnsOkObjectResult_WhenOrderExists()
- {
- // Arrange
- var order = new Order { OrderId = 1, UserId = 1, ProductDetails = "Product 1", DeliveryMethod = "Delivery", OrderStatus = "Pending" };
- _mockOrderService.Setup(service => service.TrackOrder(order.OrderId)).Returns(order);
-
- // Act
- var result = _orderController.TrackOrder(order.OrderId);
-
- // Assert
- var okObjectResult = Assert.IsType(result);
- Assert.Equal(order, okObjectResult.Value);
- }
-
- [Fact]
- public void TrackOrder_ReturnsNotFoundResult_WhenOrderDoesNotExist()
- {
- // Arrange
- _mockOrderService.Setup(service => service.TrackOrder(It.IsAny())).Returns((Order)null);
-
- // Act
- var result = _orderController.TrackOrder(1);
-
- // Assert
- Assert.IsType(result);
- }
- }
-}
diff --git a/demo/ChengFenStore/Controllers/PaymentController.cs b/demo/ChengFenStore/Controllers/PaymentController.cs
deleted file mode 100644
index f6654df..0000000
--- a/demo/ChengFenStore/Controllers/PaymentController.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using ChengFenStore.Services;
-using ChengFenStore.Models;
-using Microsoft.AspNetCore.Authorization;
-
-namespace ChengFenStore.Controllers
-{
- [Authorize]
- [ApiController]
- [Route("api/[controller]")]
- public class PaymentController : ControllerBase
- {
- private readonly PaymentService _paymentService;
-
- public PaymentController(PaymentService paymentService)
- {
- _paymentService = paymentService;
- }
-
- [HttpPost("process")]
- public IActionResult ProcessPayment([FromBody] Payment payment)
- {
- var result = _paymentService.ProcessPayment(payment);
- if (result)
- {
- return Ok(new { message = "Payment processed successfully" });
- }
- return BadRequest(new { message = "Payment processing failed" });
- }
-
- [HttpGet("records")]
- public IActionResult GetPaymentRecords()
- {
- var records = _paymentService.GetPaymentRecords();
- return Ok(records);
- }
- }
-}
diff --git a/demo/ChengFenStore/Controllers/PaymentControllerTests.cs b/demo/ChengFenStore/Controllers/PaymentControllerTests.cs
deleted file mode 100644
index f24ed06..0000000
--- a/demo/ChengFenStore/Controllers/PaymentControllerTests.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-using ChengFenStore.Controllers;
-using ChengFenStore.Models;
-using ChengFenStore.Services;
-using Microsoft.AspNetCore.Mvc;
-using Moq;
-using Xunit;
-
-namespace ChengFenStore.Tests
-{
- public class PaymentControllerTests
- {
- private readonly Mock _mockPaymentService;
- private readonly PaymentController _controller;
-
- public PaymentControllerTests()
- {
- _mockPaymentService = new Mock();
- _controller = new PaymentController(_mockPaymentService.Object);
- }
-
- [Fact]
- public void ProcessPayment_ReturnsOkResult_WhenPaymentIsProcessed()
- {
- // Arrange
- var payment = new Payment { PaymentId = 1, OrderId = 1, PaymentMethod = "CreditCard", PaymentStatus = "Pending" };
- _mockPaymentService.Setup(service => service.ProcessPayment(payment)).Returns(true);
-
- // Act
- var result = _controller.ProcessPayment(payment);
-
- // Assert
- var okResult = Assert.IsType(result);
- Assert.Equal("Payment processed successfully", ((dynamic)okResult.Value).message);
- }
-
- [Fact]
- public void ProcessPayment_ReturnsBadRequest_WhenPaymentProcessingFails()
- {
- // Arrange
- var payment = new Payment { PaymentId = 1, OrderId = 1, PaymentMethod = "CreditCard", PaymentStatus = "Pending" };
- _mockPaymentService.Setup(service => service.ProcessPayment(payment)).Returns(false);
-
- // Act
- var result = _controller.ProcessPayment(payment);
-
- // Assert
- var badRequestResult = Assert.IsType(result);
- Assert.Equal("Payment processing failed", ((dynamic)badRequestResult.Value).message);
- }
-
- [Fact]
- public void GetPaymentRecords_ReturnsOkResult_WithPaymentRecords()
- {
- // Arrange
- var payments = new List
- {
- new Payment { PaymentId = 1, OrderId = 1, PaymentMethod = "CreditCard", PaymentStatus = "Processed" },
- new Payment { PaymentId = 2, OrderId = 2, PaymentMethod = "PayPal", PaymentStatus = "Processed" }
- };
- _mockPaymentService.Setup(service => service.GetPaymentRecords()).Returns(payments);
-
- // Act
- var result = _controller.GetPaymentRecords();
-
- // Assert
- var okResult = Assert.IsType(result);
- var returnedPayments = Assert.IsType>(okResult.Value);
- Assert.Equal(2, returnedPayments.Count);
- }
- }
-}
diff --git a/demo/ChengFenStore/Controllers/UserController.cs b/demo/ChengFenStore/Controllers/UserController.cs
deleted file mode 100644
index c01e89d..0000000
--- a/demo/ChengFenStore/Controllers/UserController.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using ChengFenStore.Services;
-using ChengFenStore.Models;
-using Microsoft.AspNetCore.Authorization;
-
-namespace ChengFenStore.Controllers
-{
- [ApiController]
- [Route("api/[controller]")]
- public class UserController : ControllerBase
- {
- private readonly IUserService _userService;
-
- public UserController(IUserService userService)
- {
- _userService = userService;
- }
-
- [AllowAnonymous]
- [HttpPost("register")]
- public IActionResult Register(UserRegistrationRequest request)
- {
- var result = _userService.Register(request);
- if (result.Success)
- {
- return Ok(result);
- }
- return BadRequest(result);
- }
-
- [AllowAnonymous]
- [HttpPost("login")]
- public IActionResult Login(UserLoginRequest request)
- {
- var result = _userService.Login(request);
- if (result.Success)
- {
- return Ok(result);
- }
- return Unauthorized(result);
- }
-
- [Authorize]
- [HttpGet("profile")]
- public IActionResult GetUserProfile()
- {
- var userId = User.Identity.Name;
- var userProfile = _userService.GetUserProfile(userId);
- if (userProfile == null)
- {
- return NotFound();
- }
- return Ok(userProfile);
- }
- }
-}
diff --git a/demo/ChengFenStore/Controllers/UserControllerTests.cs b/demo/ChengFenStore/Controllers/UserControllerTests.cs
deleted file mode 100644
index f6cff68..0000000
--- a/demo/ChengFenStore/Controllers/UserControllerTests.cs
+++ /dev/null
@@ -1,119 +0,0 @@
-using ChengFenStore.Controllers;
-using ChengFenStore.Models;
-using ChengFenStore.Services;
-using Microsoft.AspNetCore.Mvc;
-using Moq;
-using Xunit;
-
-namespace ChengFenStore.Tests
-{
- public class UserControllerTests
- {
- private readonly Mock _mockUserService;
- private readonly UserController _userController;
-
- public UserControllerTests()
- {
- _mockUserService = new Mock();
- _userController = new UserController(_mockUserService.Object);
- }
-
- [Fact]
- public void Register_ValidRequest_ReturnsOkResult()
- {
- // Arrange
- var request = new UserRegistrationRequest
- {
- PhoneNumber = "1234567890",
- Name = "Test User",
- Password = "password"
- };
- var response = new UserRegistrationResponse
- {
- Success = true,
- Message = "User registered successfully."
- };
- _mockUserService.Setup(service => service.Register(request)).Returns(response);
-
- // Act
- var result = _userController.Register(request);
-
- // Assert
- var okResult = Assert.IsType(result);
- Assert.Equal(response, okResult.Value);
- }
-
- [Fact]
- public void Register_InvalidRequest_ReturnsBadRequest()
- {
- // Arrange
- var request = new UserRegistrationRequest
- {
- PhoneNumber = "1234567890",
- Name = "Test User",
- Password = "password"
- };
- var response = new UserRegistrationResponse
- {
- Success = false,
- Message = "User already exists."
- };
- _mockUserService.Setup(service => service.Register(request)).Returns(response);
-
- // Act
- var result = _userController.Register(request);
-
- // Assert
- var badRequestResult = Assert.IsType(result);
- Assert.Equal(response, badRequestResult.Value);
- }
-
- [Fact]
- public void Login_ValidRequest_ReturnsOkResult()
- {
- // Arrange
- var request = new UserLoginRequest
- {
- PhoneNumber = "1234567890",
- Password = "password"
- };
- var response = new UserLoginResponse
- {
- Success = true,
- Message = "Login successful."
- };
- _mockUserService.Setup(service => service.Login(request)).Returns(response);
-
- // Act
- var result = _userController.Login(request);
-
- // Assert
- var okResult = Assert.IsType(result);
- Assert.Equal(response, okResult.Value);
- }
-
- [Fact]
- public void Login_InvalidRequest_ReturnsUnauthorizedResult()
- {
- // Arrange
- var request = new UserLoginRequest
- {
- PhoneNumber = "1234567890",
- Password = "password"
- };
- var response = new UserLoginResponse
- {
- Success = false,
- Message = "Invalid phone number or password."
- };
- _mockUserService.Setup(service => service.Login(request)).Returns(response);
-
- // Act
- var result = _userController.Login(request);
-
- // Assert
- var unauthorizedResult = Assert.IsType(result);
- Assert.Equal(response, unauthorizedResult.Value);
- }
- }
-}
diff --git a/demo/ChengFenStore/Data/AppDbContext.cs b/demo/ChengFenStore/Data/AppDbContext.cs
deleted file mode 100644
index 1ae3667..0000000
--- a/demo/ChengFenStore/Data/AppDbContext.cs
+++ /dev/null
@@ -1,16 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using ChengFenStore.Models;
-
-namespace ChengFenStore.Data
-{
- public class AppDbContext : DbContext
- {
- public AppDbContext(DbContextOptions options) : base(options)
- {
- }
-
- public DbSet Users { get; set; }
- public DbSet Orders { get; set; }
- public DbSet Payments { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Data/OrderRepository.cs b/demo/ChengFenStore/Data/OrderRepository.cs
deleted file mode 100644
index a2fa12f..0000000
--- a/demo/ChengFenStore/Data/OrderRepository.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using ChengFenStore.Models;
-using System.Collections.Generic;
-using System.Linq;
-using Microsoft.EntityFrameworkCore;
-
-namespace ChengFenStore.Data
-{
- public interface IOrderRepository
- {
- void AddOrder(Order order);
- Order GetOrderById(int orderId);
- void UpdateOrder(Order order);
- }
-
- public class OrderRepository : IOrderRepository
- {
- private readonly AppDbContext _context;
-
- public OrderRepository(AppDbContext context)
- {
- _context = context;
- }
-
- public void AddOrder(Order order)
- {
- _context.Orders.Add(order);
- _context.SaveChanges();
- }
-
- public Order GetOrderById(int orderId)
- {
- return _context.Orders.FirstOrDefault(o => o.OrderId == orderId);
- }
-
- public void UpdateOrder(Order order)
- {
- _context.Orders.Update(order);
- _context.SaveChanges();
- }
- }
-}
diff --git a/demo/ChengFenStore/Data/PaymentRepository.cs b/demo/ChengFenStore/Data/PaymentRepository.cs
deleted file mode 100644
index 7d3f194..0000000
--- a/demo/ChengFenStore/Data/PaymentRepository.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-using ChengFenStore.Models;
-using Microsoft.EntityFrameworkCore;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace ChengFenStore.Data
-{
- public interface IPaymentRepository
- {
- void AddPayment(Payment payment);
- List GetPayments();
- Payment GetPaymentById(int paymentId);
- }
-
- public class PaymentRepository : IPaymentRepository
- {
- private readonly AppDbContext _context;
-
- public PaymentRepository(AppDbContext context)
- {
- _context = context;
- }
-
- public void AddPayment(Payment payment)
- {
- _context.Payments.Add(payment);
- _context.SaveChanges();
- }
-
- public List GetPayments()
- {
- return _context.Payments.ToList();
- }
-
- public Payment GetPaymentById(int paymentId)
- {
- return _context.Payments.FirstOrDefault(p => p.PaymentId == paymentId);
- }
- }
-}
diff --git a/demo/ChengFenStore/Data/UserRepository.cs b/demo/ChengFenStore/Data/UserRepository.cs
deleted file mode 100644
index 899ba0e..0000000
--- a/demo/ChengFenStore/Data/UserRepository.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-using ChengFenStore.Models;
-using System.Collections.Generic;
-using System.Linq;
-using Microsoft.EntityFrameworkCore;
-
-namespace ChengFenStore.Data
-{
- public interface IUserRepository
- {
- void AddUser(User user);
- User GetUserByPhoneNumber(string phoneNumber);
- }
-
- public class UserRepository : IUserRepository
- {
- private readonly AppDbContext _context;
-
- public UserRepository(AppDbContext context)
- {
- _context = context;
- }
-
- public void AddUser(User user)
- {
- _context.Users.Add(user);
- _context.SaveChanges();
- }
-
- public User GetUserByPhoneNumber(string phoneNumber)
- {
- return _context.Users.FirstOrDefault(u => u.PhoneNumber == phoneNumber);
- }
- }
-}
diff --git a/demo/ChengFenStore/Models/Order.cs b/demo/ChengFenStore/Models/Order.cs
deleted file mode 100644
index d9ae0f9..0000000
--- a/demo/ChengFenStore/Models/Order.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class Order
- {
- public int OrderId { get; set; }
- public int UserId { get; set; }
- public string ProductDetails { get; set; }
- public string DeliveryMethod { get; set; }
- public string OrderStatus { get; set; }
- public List OrderStatusHistory { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/OrderStatus.cs b/demo/ChengFenStore/Models/OrderStatus.cs
deleted file mode 100644
index 4bd4d87..0000000
--- a/demo/ChengFenStore/Models/OrderStatus.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class OrderStatus
- {
- public int OrderId { get; set; }
- public string Status { get; set; }
- public DateTime Timestamp { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/Payment.cs b/demo/ChengFenStore/Models/Payment.cs
deleted file mode 100644
index df04f77..0000000
--- a/demo/ChengFenStore/Models/Payment.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class Payment
- {
- public int PaymentId { get; set; }
- public int OrderId { get; set; }
- public string PaymentMethod { get; set; }
- public string PaymentStatus { get; set; }
- public List PaymentStatusHistory { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/PaymentStatus.cs b/demo/ChengFenStore/Models/PaymentStatus.cs
deleted file mode 100644
index d3d84db..0000000
--- a/demo/ChengFenStore/Models/PaymentStatus.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class PaymentStatus
- {
- public int PaymentId { get; set; }
- public string Status { get; set; }
- public DateTime Timestamp { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/User.cs b/demo/ChengFenStore/Models/User.cs
deleted file mode 100644
index 60a8f78..0000000
--- a/demo/ChengFenStore/Models/User.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class User
- {
- public string PhoneNumber { get; set; }
- public string Name { get; set; }
- public string Password { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/UserLoginRequest.cs b/demo/ChengFenStore/Models/UserLoginRequest.cs
deleted file mode 100644
index 9f4465a..0000000
--- a/demo/ChengFenStore/Models/UserLoginRequest.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class UserLoginRequest
- {
- public string PhoneNumber { get; set; }
- public string Password { get; set; }
- public string VerificationCode { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/UserLoginResponse.cs b/demo/ChengFenStore/Models/UserLoginResponse.cs
deleted file mode 100644
index dab3045..0000000
--- a/demo/ChengFenStore/Models/UserLoginResponse.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class UserLoginResponse
- {
- public bool Success { get; set; }
- public string Message { get; set; }
- public string Token { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/UserProfile.cs b/demo/ChengFenStore/Models/UserProfile.cs
deleted file mode 100644
index b39490e..0000000
--- a/demo/ChengFenStore/Models/UserProfile.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class UserProfile
- {
- public string PhoneNumber { get; set; }
- public string Name { get; set; }
- public List Orders { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/UserRegistrationRequest.cs b/demo/ChengFenStore/Models/UserRegistrationRequest.cs
deleted file mode 100644
index 4ab673b..0000000
--- a/demo/ChengFenStore/Models/UserRegistrationRequest.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class UserRegistrationRequest
- {
- public string PhoneNumber { get; set; }
- public string Name { get; set; }
- public string Password { get; set; }
- public string VerificationCode { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Models/UserRegistrationResponse.cs b/demo/ChengFenStore/Models/UserRegistrationResponse.cs
deleted file mode 100644
index d286426..0000000
--- a/demo/ChengFenStore/Models/UserRegistrationResponse.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-namespace ChengFenStore.Models
-{
- public class UserRegistrationResponse
- {
- public bool Success { get; set; }
- public string Message { get; set; }
- public string Token { get; set; }
- }
-}
diff --git a/demo/ChengFenStore/Program.cs b/demo/ChengFenStore/Program.cs
deleted file mode 100644
index ee96bc8..0000000
--- a/demo/ChengFenStore/Program.cs
+++ /dev/null
@@ -1,57 +0,0 @@
-using Microsoft.EntityFrameworkCore;
-using ChengFenStore.Services;
-using ChengFenStore.Data;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.IdentityModel.Tokens;
-using System.Text;
-
-var builder = WebApplication.CreateBuilder(args);
-
-// Add services to the container.
-builder.Services.AddControllers();
-builder.Services.AddScoped();
-builder.Services.AddScoped();
-builder.Services.AddScoped();
-builder.Services.AddScoped();
-builder.Services.AddScoped();
-builder.Services.AddScoped();
-
-// Configure database connection
-var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
-builder.Services.AddDbContext(options =>
- options.UseSqlServer(connectionString));
-
-// Add authentication and authorization services
-builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
- .AddJwtBearer(options =>
- {
- options.TokenValidationParameters = new TokenValidationParameters
- {
- ValidateIssuer = true,
- ValidateAudience = true,
- ValidateLifetime = true,
- ValidateIssuerSigningKey = true,
- ValidIssuer = builder.Configuration["Jwt:Issuer"],
- ValidAudience = builder.Configuration["Jwt:Audience"],
- IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
- };
- });
-
-builder.Services.AddAuthorization();
-
-var app = builder.Build();
-
-// Configure the HTTP request pipeline.
-if (app.Environment.IsDevelopment())
-{
- app.UseDeveloperExceptionPage();
-}
-
-app.UseHttpsRedirection();
-
-app.UseAuthentication();
-app.UseAuthorization();
-
-app.MapControllers();
-
-app.Run();
diff --git a/demo/ChengFenStore/Services/OrderService.cs b/demo/ChengFenStore/Services/OrderService.cs
deleted file mode 100644
index 8e6e9ba..0000000
--- a/demo/ChengFenStore/Services/OrderService.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-using ChengFenStore.Models;
-using ChengFenStore.Data;
-
-namespace ChengFenStore.Services
-{
- public class OrderService
- {
- private readonly AppDbContext _context;
-
- public OrderService(AppDbContext context)
- {
- _context = context;
- }
-
- public Order CreateOrder(Order order)
- {
- _context.Orders.Add(order);
- _context.SaveChanges();
- return order;
- }
-
- public Order GetOrderById(int id)
- {
- return _context.Orders.FirstOrDefault(o => o.OrderId == id);
- }
-
- public Order ConfirmOrder(int id)
- {
- var order = _context.Orders.FirstOrDefault(o => o.OrderId == id);
- if (order != null)
- {
- order.OrderStatus = "已支付";
- _context.Orders.Update(order);
- _context.SaveChanges();
- }
- return order;
- }
-
- public Order TrackOrder(int id)
- {
- return _context.Orders.FirstOrDefault(o => o.OrderId == id);
- }
- }
-}
diff --git a/demo/ChengFenStore/Services/PaymentService.cs b/demo/ChengFenStore/Services/PaymentService.cs
deleted file mode 100644
index fcadac6..0000000
--- a/demo/ChengFenStore/Services/PaymentService.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-using ChengFenStore.Models;
-using ChengFenStore.Data;
-
-namespace ChengFenStore.Services
-{
- public class PaymentService
- {
- private readonly AppDbContext _context;
-
- public PaymentService(AppDbContext context)
- {
- _context = context;
- }
-
- public bool ProcessPayment(Payment payment)
- {
- // Implement payment processing logic here
- // For example, call external payment gateway API and update payment status
- payment.PaymentStatus = "Processed";
- _context.Payments.Add(payment);
- _context.SaveChanges();
- return true;
- }
-
- public List GetPaymentRecords()
- {
- return _context.Payments.ToList();
- }
- }
-}
diff --git a/demo/ChengFenStore/Services/UserService.cs b/demo/ChengFenStore/Services/UserService.cs
deleted file mode 100644
index 24cef69..0000000
--- a/demo/ChengFenStore/Services/UserService.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-using System;
-using System.IdentityModel.Tokens.Jwt;
-using System.Security.Claims;
-using System.Text;
-using ChengFenStore.Data;
-using ChengFenStore.Models;
-using Microsoft.IdentityModel.Tokens;
-
-namespace ChengFenStore.Services
-{
- public interface IUserService
- {
- UserRegistrationResponse Register(UserRegistrationRequest request);
- UserLoginResponse Login(UserLoginRequest request);
- }
-
- public class UserService : IUserService
- {
- private readonly IUserRepository _userRepository;
- private readonly IConfiguration _configuration;
-
- public UserService(IUserRepository userRepository, IConfiguration configuration)
- {
- _userRepository = userRepository;
- _configuration = configuration;
- }
-
- public UserRegistrationResponse Register(UserRegistrationRequest request)
- {
- // Check if user already exists
- var existingUser = _userRepository.GetUserByPhoneNumber(request.PhoneNumber);
- if (existingUser != null)
- {
- return new UserRegistrationResponse
- {
- Success = false,
- Message = "User already exists."
- };
- }
-
- // Create new user
- var user = new User
- {
- PhoneNumber = request.PhoneNumber,
- Name = request.Name,
- Password = request.Password // Note: In a real application, you should hash the password before storing it
- };
-
- _userRepository.AddUser(user);
-
- return new UserRegistrationResponse
- {
- Success = true,
- Message = "User registered successfully."
- };
- }
-
- public UserLoginResponse Login(UserLoginRequest request)
- {
- // Get user by phone number
- var user = _userRepository.GetUserByPhoneNumber(request.PhoneNumber);
- if (user == null || user.Password != request.Password) // Note: In a real application, you should hash the password and compare the hashes
- {
- return new UserLoginResponse
- {
- Success = false,
- Message = "Invalid phone number or password."
- };
- }
-
- // Generate JWT token
- var token = GenerateJwtToken(user);
-
- return new UserLoginResponse
- {
- Success = true,
- Message = "Login successful.",
- Token = token
- };
- }
-
- private string GenerateJwtToken(User user)
- {
- var tokenHandler = new JwtSecurityTokenHandler();
- var key = Encoding.ASCII.GetBytes(_configuration["Jwt:Key"]);
- var tokenDescriptor = new SecurityTokenDescriptor
- {
- Subject = new ClaimsIdentity(new[]
- {
- new Claim(ClaimTypes.Name, user.PhoneNumber)
- }),
- Expires = DateTime.UtcNow.AddDays(7),
- SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
- };
- var token = tokenHandler.CreateToken(tokenDescriptor);
- return tokenHandler.WriteToken(token);
- }
- }
-}
diff --git a/demo/ChengFenStore/app.py b/demo/ChengFenStore/app.py
new file mode 100644
index 0000000..ed25f95
--- /dev/null
+++ b/demo/ChengFenStore/app.py
@@ -0,0 +1,16 @@
+from flask import Flask
+from controllers.order_controller import order_bp
+from controllers.payment_controller import payment_bp
+from controllers.user_controller import user_bp
+from data.db import init_db
+
+app = Flask(__name__)
+
+app.register_blueprint(order_bp, url_prefix='/orders')
+app.register_blueprint(payment_bp, url_prefix='/payments')
+app.register_blueprint(user_bp, url_prefix='/users')
+
+init_db(app)
+
+if __name__ == '__main__':
+ app.run(debug=True)
diff --git a/demo/ChengFenStore/controllers/order_controller.py b/demo/ChengFenStore/controllers/order_controller.py
new file mode 100644
index 0000000..47864c7
--- /dev/null
+++ b/demo/ChengFenStore/controllers/order_controller.py
@@ -0,0 +1,24 @@
+from flask import Blueprint, request, jsonify
+
+order_bp = Blueprint('order', __name__)
+
+@order_bp.route('/create', methods=['POST'])
+def create_order():
+ order_data = request.get_json()
+ # Implement order creation logic here
+ return jsonify({'message': 'Order created successfully'}), 201
+
+@order_bp.route('/', methods=['GET'])
+def get_order_by_id(order_id):
+ # Implement logic to get order by ID here
+ return jsonify({'order_id': order_id, 'message': 'Order details'}), 200
+
+@order_bp.route('/confirm/', methods=['PUT'])
+def confirm_order(order_id):
+ # Implement order confirmation logic here
+ return jsonify({'order_id': order_id, 'message': 'Order confirmed'}), 200
+
+@order_bp.route('/track/', methods=['GET'])
+def track_order(order_id):
+ # Implement order tracking logic here
+ return jsonify({'order_id': order_id, 'message': 'Order status'}), 200
diff --git a/demo/ChengFenStore/controllers/payment_controller.py b/demo/ChengFenStore/controllers/payment_controller.py
new file mode 100644
index 0000000..d76f40c
--- /dev/null
+++ b/demo/ChengFenStore/controllers/payment_controller.py
@@ -0,0 +1,14 @@
+from flask import Blueprint, request, jsonify
+
+payment_bp = Blueprint('payment', __name__)
+
+@payment_bp.route('/process', methods=['POST'])
+def process_payment():
+ payment_data = request.get_json()
+ # Implement payment processing logic here
+ return jsonify({'message': 'Payment processed successfully'}), 200
+
+@payment_bp.route('/records', methods=['GET'])
+def get_payment_records():
+ # Implement logic to get payment records here
+ return jsonify({'records': 'Payment records'}), 200
diff --git a/demo/ChengFenStore/controllers/user_controller.py b/demo/ChengFenStore/controllers/user_controller.py
new file mode 100644
index 0000000..c265da3
--- /dev/null
+++ b/demo/ChengFenStore/controllers/user_controller.py
@@ -0,0 +1,29 @@
+from flask import Blueprint, request, jsonify
+from services.user_service import UserService
+
+user_bp = Blueprint('user', __name__)
+
+@user_bp.route('/register', methods=['POST'])
+def register_user():
+ data = request.get_json()
+ phone_number = data.get('phone_number')
+ name = data.get('name')
+ password = data.get('password')
+ verification_code = data.get('verification_code')
+ result = UserService.register(phone_number, name, password, verification_code)
+ return jsonify(result)
+
+@user_bp.route('/login', methods=['POST'])
+def login_user():
+ data = request.get_json()
+ phone_number = data.get('phone_number')
+ password = data.get('password')
+ verification_code = data.get('verification_code')
+ result = UserService.login(phone_number, password, verification_code)
+ return jsonify(result)
+
+@user_bp.route('/profile', methods=['GET'])
+def get_user_profile():
+ phone_number = request.args.get('phone_number')
+ result = UserService.get_user_profile(phone_number)
+ return jsonify(result)
diff --git a/demo/ChengFenStore/data/db.py b/demo/ChengFenStore/data/db.py
new file mode 100644
index 0000000..6a67eb9
--- /dev/null
+++ b/demo/ChengFenStore/data/db.py
@@ -0,0 +1,8 @@
+from flask_sqlalchemy import SQLAlchemy
+
+db = SQLAlchemy()
+
+def init_db(app):
+ db.init_app(app)
+ with app.app_context():
+ db.create_all()
diff --git a/demo/ChengFenStore/data/order_repository.py b/demo/ChengFenStore/data/order_repository.py
new file mode 100644
index 0000000..bee8084
--- /dev/null
+++ b/demo/ChengFenStore/data/order_repository.py
@@ -0,0 +1,13 @@
+from .db import db
+from ..models.order import Order
+
+class OrderRepository:
+ def add_order(self, order):
+ db.session.add(order)
+ db.session.commit()
+
+ def get_order_by_id(self, order_id):
+ return Order.query.get(order_id)
+
+ def update_order(self, order):
+ db.session.commit()
diff --git a/demo/ChengFenStore/data/payment_repository.py b/demo/ChengFenStore/data/payment_repository.py
new file mode 100644
index 0000000..04050ab
--- /dev/null
+++ b/demo/ChengFenStore/data/payment_repository.py
@@ -0,0 +1,13 @@
+class PaymentRepository:
+ def __init__(self, db):
+ self.db = db
+
+ def add_payment(self, payment):
+ self.db.session.add(payment)
+ self.db.session.commit()
+
+ def get_payment_by_id(self, payment_id):
+ return self.db.session.query(Payment).filter_by(payment_id=payment_id).first()
+
+ def update_payment(self, payment):
+ self.db.session.commit()
diff --git a/demo/ChengFenStore/data/user_repository.py b/demo/ChengFenStore/data/user_repository.py
new file mode 100644
index 0000000..acd9715
--- /dev/null
+++ b/demo/ChengFenStore/data/user_repository.py
@@ -0,0 +1,10 @@
+class UserRepository:
+ def __init__(self, db):
+ self.db = db
+
+ def add_user(self, user):
+ self.db.session.add(user)
+ self.db.session.commit()
+
+ def get_user_by_phone_number(self, phone_number):
+ return self.db.session.query(User).filter_by(phone_number=phone_number).first()
diff --git a/demo/ChengFenStore/models/order.py b/demo/ChengFenStore/models/order.py
new file mode 100644
index 0000000..1fbddc5
--- /dev/null
+++ b/demo/ChengFenStore/models/order.py
@@ -0,0 +1,8 @@
+class Order:
+ def __init__(self, order_id, user_id, product_details, delivery_method, order_status, order_status_history):
+ self.order_id = order_id
+ self.user_id = user_id
+ self.product_details = product_details
+ self.delivery_method = delivery_method
+ self.order_status = order_status
+ self.order_status_history = order_status_history
diff --git a/demo/ChengFenStore/models/order_status.py b/demo/ChengFenStore/models/order_status.py
new file mode 100644
index 0000000..e9ac14f
--- /dev/null
+++ b/demo/ChengFenStore/models/order_status.py
@@ -0,0 +1,5 @@
+class OrderStatus:
+ def __init__(self, order_id, status, timestamp):
+ self.order_id = order_id
+ self.status = status
+ self.timestamp = timestamp
diff --git a/demo/ChengFenStore/models/payment.py b/demo/ChengFenStore/models/payment.py
new file mode 100644
index 0000000..1a98983
--- /dev/null
+++ b/demo/ChengFenStore/models/payment.py
@@ -0,0 +1,7 @@
+class Payment:
+ def __init__(self, payment_id, order_id, payment_method, payment_status, payment_status_history):
+ self.payment_id = payment_id
+ self.order_id = order_id
+ self.payment_method = payment_method
+ self.payment_status = payment_status
+ self.payment_status_history = payment_status_history
diff --git a/demo/ChengFenStore/models/payment_status.py b/demo/ChengFenStore/models/payment_status.py
new file mode 100644
index 0000000..c907dda
--- /dev/null
+++ b/demo/ChengFenStore/models/payment_status.py
@@ -0,0 +1,5 @@
+class PaymentStatus:
+ def __init__(self, payment_id, status, timestamp):
+ self.payment_id = payment_id
+ self.status = status
+ self.timestamp = timestamp
diff --git a/demo/ChengFenStore/models/user.py b/demo/ChengFenStore/models/user.py
new file mode 100644
index 0000000..8863f0e
--- /dev/null
+++ b/demo/ChengFenStore/models/user.py
@@ -0,0 +1,5 @@
+class User:
+ def __init__(self, phone_number, name, password):
+ self.phone_number = phone_number
+ self.name = name
+ self.password = password
diff --git a/demo/ChengFenStore/models/user_login_request.py b/demo/ChengFenStore/models/user_login_request.py
new file mode 100644
index 0000000..4fc2e1b
--- /dev/null
+++ b/demo/ChengFenStore/models/user_login_request.py
@@ -0,0 +1,5 @@
+class UserLoginRequest:
+ def __init__(self, phone_number, password, verification_code):
+ self.phone_number = phone_number
+ self.password = password
+ self.verification_code = verification_code
diff --git a/demo/ChengFenStore/models/user_login_response.py b/demo/ChengFenStore/models/user_login_response.py
new file mode 100644
index 0000000..d02d93c
--- /dev/null
+++ b/demo/ChengFenStore/models/user_login_response.py
@@ -0,0 +1,5 @@
+class UserLoginResponse:
+ def __init__(self, success, message, token):
+ self.success = success
+ self.message = message
+ self.token = token
diff --git a/demo/ChengFenStore/models/user_profile.py b/demo/ChengFenStore/models/user_profile.py
new file mode 100644
index 0000000..11f3d54
--- /dev/null
+++ b/demo/ChengFenStore/models/user_profile.py
@@ -0,0 +1,5 @@
+class UserProfile:
+ def __init__(self, phone_number, name, orders):
+ self.phone_number = phone_number
+ self.name = name
+ self.orders = orders
diff --git a/demo/ChengFenStore/models/user_registration_request.py b/demo/ChengFenStore/models/user_registration_request.py
new file mode 100644
index 0000000..77e273f
--- /dev/null
+++ b/demo/ChengFenStore/models/user_registration_request.py
@@ -0,0 +1,6 @@
+class UserRegistrationRequest:
+ def __init__(self, phone_number, name, password, verification_code):
+ self.phone_number = phone_number
+ self.name = name
+ self.password = password
+ self.verification_code = verification_code
diff --git a/demo/ChengFenStore/models/user_registration_response.py b/demo/ChengFenStore/models/user_registration_response.py
new file mode 100644
index 0000000..0e1ccfa
--- /dev/null
+++ b/demo/ChengFenStore/models/user_registration_response.py
@@ -0,0 +1,5 @@
+class UserRegistrationResponse:
+ def __init__(self, success, message, token):
+ self.success = success
+ self.message = message
+ self.token = token
diff --git a/demo/ChengFenStore/services/order_service.py b/demo/ChengFenStore/services/order_service.py
new file mode 100644
index 0000000..98829a4
--- /dev/null
+++ b/demo/ChengFenStore/services/order_service.py
@@ -0,0 +1,20 @@
+class OrderService:
+ def __init__(self, order_repository):
+ self.order_repository = order_repository
+
+ def create_order(self, order):
+ self.order_repository.add_order(order)
+ return order
+
+ def get_order_by_id(self, order_id):
+ return self.order_repository.get_order_by_id(order_id)
+
+ def confirm_order(self, order_id):
+ order = self.order_repository.get_order_by_id(order_id)
+ if order:
+ order.order_status = "已支付"
+ self.order_repository.update_order(order)
+ return order
+
+ def track_order(self, order_id):
+ return self.order_repository.get_order_by_id(order_id)
diff --git a/demo/ChengFenStore/services/payment_service.py b/demo/ChengFenStore/services/payment_service.py
new file mode 100644
index 0000000..8283d69
--- /dev/null
+++ b/demo/ChengFenStore/services/payment_service.py
@@ -0,0 +1,12 @@
+class PaymentService:
+ def __init__(self, payment_repository):
+ self.payment_repository = payment_repository
+
+ def process_payment(self, payment):
+ # Implement payment processing logic here
+ payment.payment_status = "Processed"
+ self.payment_repository.add_payment(payment)
+ return True
+
+ def get_payment_records(self):
+ return self.payment_repository.get_all_payments()
diff --git a/demo/ChengFenStore/services/user_service.py b/demo/ChengFenStore/services/user_service.py
new file mode 100644
index 0000000..51f1948
--- /dev/null
+++ b/demo/ChengFenStore/services/user_service.py
@@ -0,0 +1,65 @@
+class UserService:
+ def __init__(self, user_repository, configuration):
+ self.user_repository = user_repository
+ self.configuration = configuration
+
+ def register(self, request):
+ existing_user = self.user_repository.get_user_by_phone_number(request.phone_number)
+ if existing_user:
+ return {
+ "success": False,
+ "message": "User already exists."
+ }
+
+ user = {
+ "phone_number": request.phone_number,
+ "name": request.name,
+ "password": request.password
+ }
+
+ self.user_repository.add_user(user)
+
+ return {
+ "success": True,
+ "message": "User registered successfully."
+ }
+
+ def login(self, request):
+ user = self.user_repository.get_user_by_phone_number(request.phone_number)
+ if not user or user["password"] != request.password:
+ return {
+ "success": False,
+ "message": "Invalid phone number or password."
+ }
+
+ token = self.generate_jwt_token(user)
+
+ return {
+ "success": True,
+ "message": "Login successful.",
+ "token": token
+ }
+
+ def get_user_profile(self, user_id):
+ user = self.user_repository.get_user_by_id(user_id)
+ if not user:
+ return None
+
+ return {
+ "phone_number": user["phone_number"],
+ "name": user["name"],
+ "orders": user["orders"]
+ }
+
+ def generate_jwt_token(self, user):
+ import jwt
+ import datetime
+
+ payload = {
+ "user_id": user["phone_number"],
+ "exp": datetime.datetime.utcnow() + datetime.timedelta(days=7)
+ }
+ key = self.configuration["Jwt"]["Key"]
+ token = jwt.encode(payload, key, algorithm="HS256")
+
+ return token