基于Angular+BootStrap+SpringBoot简单的购物网站

server/2024/11/27 17:58:03/

目录

一、项目结构图

二、目录结构解析

后端 (Spring Boot)

前端 (Angular)

三、技术栈

四、具体功能实现

五、数据库设计

六、后端实现

1. 设置Spring Boot项目

2. 数据库实体类

3. 创建Repository

4. 创建Service层

5. 创建Controller层

七、前端实现(Angular)

1、创建 Angular 服务层  

2、创建 Angular 路由配置

3、配置文件

4、用户登录与注册

5、商品浏览与添加购物车

6、订单管理与收货地址

7、后台管理系统

八、部署与测试


一、项目结构图

/shopping-website
├── /backend (Spring Boot 项目)
│   ├── /src
│   │   ├── /main
│   │   │   ├── /java
│   │   │   │   ├── /com
│   │   │   │   │   ├── /example
│   │   │   │   │   │   ├── /shopping
│   │   │   │   │   │   │   ├── /config              # 配置文件,如Spring Security等
│   │   │   │   │   │   │   ├── /controller          # 控制器,处理API请求
│   │   │   │   │   │   │   ├── /entity              # 实体类,映射数据库表
│   │   │   │   │   │   │   ├── /exception           # 异常处理类
│   │   │   │   │   │   │   ├── /repository          # 数据访问层(JPA)
│   │   │   │   │   │   │   ├── /security            # 安全配置,Spring Security配置
│   │   │   │   │   │   │   ├── /service             # 业务逻辑层
│   │   │   │   │   │   │   └── /util                # 工具类
│   │   │   │   │   │   ├── /resources
│   │   │   │   │   │   │   └── application.yml      # 配置文件,数据库连接等
│   │   │   │   │   │   └── /static
│   │   └── /test
│   ├── /pom.xml                                       # Maven 配置文件,包含所有依赖
│
├── /frontend (Angular 项目)
│   ├── /src
│   │   ├── /app
│   │   │   ├── /components                           # 公共组件
│   │   │   │   ├── /login
│   │   │   │   ├── /register
│   │   │   │   ├── /product-list
│   │   │   │   ├── /cart
│   │   │   │   └── /order
│   │   │   ├── /services                             # 服务层,处理API请求
│   │   │   │   ├── /auth.service.ts
│   │   │   │   ├── /product.service.ts
│   │   │   │   ├── /cart.service.ts
│   │   │   │   ├── /order.service.ts
│   │   │   ├── /guards                               # 路由守卫
│   │   │   │   └── /auth.guard.ts
│   │   │   ├── /models                               # 数据模型类
│   │   │   │   ├── /user.ts
│   │   │   │   ├── /product.ts
│   │   │   │   ├── /order.ts
│   │   │   └── /app.module.ts                        # Angular 主模块
│   │   ├── /assets                                   # 静态资源(图片、字体等)
│   │   └── /environments                            # 环境配置文件
│   ├── /angular.json                                 # Angular 配置文件
│   ├── /package.json                                 # Node.js 配置文件
│   └── /tsconfig.json                               # TypeScript 配置文件
│
└── README.md                                          # 项目说明文件

二、目录结构解析

后端 (Spring Boot)

  • /src/main/java/com/example/shopping/config

    • SecurityConfig.java:Spring Security 配置类,设置权限控制。
    • PaymentConfig.java:支付接口配置类(集成支付宝、微信支付等)。
  • /controller
    处理HTTP请求的Controller类,通常负责接收前端请求、调用服务层逻辑并返回数据。例如:

    • UserController.java:处理用户注册、登录请求。
    • ProductController.java:处理商品展示、商品查询等请求。
    • OrderController.java:处理订单相关请求,订单创建、查询、状态更新等。
  • /entity

    • User.java:用户实体类。
    • Product.java:商品实体类。
    • Order.java:订单实体类,包含订单的各个字段,如商品、用户、支付状态等。
  • /repository

    • UserRepository.java:操作用户数据的JPA接口。
    • ProductRepository.java:操作商品数据的JPA接口。
    • OrderRepository.java:操作订单数据的JPA接口。
  • /security

    • UserDetailsServiceImpl.java:用户认证服务,实现UserDetailsService接口,加载用户信息。
  • /service

    • UserService.java:处理用户逻辑,包含注册、登录等业务逻辑。
    • ProductService.java:商品逻辑处理,处理商品的添加、修改、查询等。
    • OrderService.java:订单管理,处理订单的创建、支付、发货等业务。
    • PaymentService.java:支付相关的服务,集成支付宝、微信支付等接口。
  • /util

    • PaymentUtil.java:支付工具类,封装与第三方支付平台交互的工具方法。
    • OrderUtil.java:订单处理工具类,包含生成订单号、处理订单状态等功能。

前端 (Angular)

  • /components

    • login/:登录组件,提供用户登录界面和逻辑。
    • register/:注册组件,提供用户注册界面和逻辑。
    • product-list/:商品列表组件,展示商品信息。
    • cart/:购物车组件,展示购物车中的商品,支持修改商品数量和删除商品。
    • order/:订单组件,展示订单信息和订单管理功能。
  • /services

    • auth.service.ts:认证服务,处理用户的登录、注册、权限检查等操作。
    • product.service.ts:商品服务,提供与商品相关的API调用。
    • cart.service.ts:购物车服务,提供购物车操作功能。
    • order.service.ts:订单服务,提供订单创建、查询、支付等功能。
  • /guards

    • auth.guard.ts:路由守卫,用于保护用户路由,确保未登录用户无法访问需要登录的页面。
  • /models

    • user.ts:用户模型类,定义用户的数据结构。
    • product.ts:商品模型类,定义商品的数据结构。
    • order.ts:订单模型类,定义订单的数据结构。
  • /app.module.ts:主模块,包含Angular应用的模块配置,声明所有组件、服务和路由。

三、技术栈

  • 前端:Angular + Bootstrap
  • 后端:Spring Boot + Spring Security + JPA + MySQL
  • 数据库:MySQL

四、具体功能实现

  1. 用户管理(登录、注册、权限控制)

    • 前端:使用 Angular 路由守卫和服务实现登录、注册和角色管理。
    • 后端:通过 Spring Security 配置用户权限,确保不同角色用户的不同访问权限。
  2. 支付功能(支付宝、微信支付等)

    • 后端:集成支付宝和微信支付接口,处理支付请求、支付回调等。
    • 前端:在订单确认页面显示支付二维码(支付宝、微信支付),并处理支付回调。
  3. 商品管理和购物车

    • 后端:提供商品的增删改查接口,支持用户浏览商品,添加到购物车。
    • 前端:购物车组件提供购物车的管理功能,支持增加、删除商品和修改商品数量。
  4. 订单管理(创建、支付、发货)

    • 后端:管理订单的创建、支付、发货等流程,处理订单状态的更新。
    • 前端:用户可以查看自己的订单,并进行支付和查看订单详情。管理员可以查看所有订单并发货。
  5. 后台管理

    • 后端:管理员角色可以访问商品管理、订单管理、用户管理等功能。
    • 前端:管理界面提供商品、订单、用户管理的后台页面。

五、数据库设计

  • 用户表:用于存储用户信息。
  • 角色表:用于存储用户角色(如管理员、普通用户等)。
  • 商品表:用于存储商品信息。
  • 订单表:用于存储订单信息。
  • 订单项表:用于存储每个订单中的商品项。
  • 购物车表:用于存储用户的购物车商品。
  • 支付表:用于记录支付信息(与支付宝、微信等支付集成相关)。
  1. User (用户表)

    CREATE TABLE `user` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',`username` VARCHAR(100) NOT NULL UNIQUE COMMENT '用户名',`password` VARCHAR(255) NOT NULL COMMENT '用户密码',`email` VARCHAR(255) DEFAULT NULL COMMENT '邮箱',`phone` VARCHAR(15) DEFAULT NULL COMMENT '手机号',`address` TEXT DEFAULT NULL COMMENT '收货地址',`status` TINYINT(1) DEFAULT 1 COMMENT '状态 1-启用 0-禁用',`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
    

  2. Role(角色表)

    CREATE TABLE `role` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '角色ID',`role_name` VARCHAR(50) NOT NULL UNIQUE COMMENT '角色名称',`description` VARCHAR(255) DEFAULT NULL COMMENT '角色描述',`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
    
  3. user_role(用户角色关联表)

    CREATE TABLE `user_role` (`user_id` BIGINT(20) NOT NULL COMMENT '用户ID',`role_id` BIGINT(20) NOT NULL COMMENT '角色ID',PRIMARY KEY (`user_id`, `role_id`),CONSTRAINT `fk_user` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE,CONSTRAINT `fk_role` FOREIGN KEY (`role_id`) REFERENCES `role`(`id`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表';
    
  4. product(商品表)

    CREATE TABLE `product` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '商品ID',`name` VARCHAR(255) NOT NULL COMMENT '商品名称',`description` TEXT DEFAULT NULL COMMENT '商品描述',`price` DECIMAL(10, 2) NOT NULL COMMENT '商品价格',`stock` INT(11) NOT NULL DEFAULT 0 COMMENT '商品库存',`category_id` BIGINT(20) DEFAULT NULL COMMENT '商品类别ID',`image_url` VARCHAR(255) DEFAULT NULL COMMENT '商品图片URL',`status` TINYINT(1) DEFAULT 1 COMMENT '商品状态 1-上架 0-下架',`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品表';
    
  5. order(订单表)

    CREATE TABLE `order` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '订单ID',`user_id` BIGINT(20) NOT NULL COMMENT '用户ID',`total_price` DECIMAL(10, 2) NOT NULL COMMENT '订单总价',`status` ENUM('PENDING', 'PAID', 'SHIPPED', 'DELIVERED', 'CANCELLED') NOT NULL DEFAULT 'PENDING' COMMENT '订单状态',`shipping_address` TEXT NOT NULL COMMENT '收货地址',`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`payment_method` VARCHAR(50) DEFAULT NULL COMMENT '支付方式',`payment_status` ENUM('PENDING', 'SUCCESS', 'FAILED') NOT NULL DEFAULT 'PENDING' COMMENT '支付状态',CONSTRAINT `fk_user_order` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';
    
  6. order_item(订单项表)
    CREATE TABLE `order_item` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '订单项ID',`order_id` BIGINT(20) NOT NULL COMMENT '订单ID',`product_id` BIGINT(20) NOT NULL COMMENT '商品ID',`quantity` INT(11) NOT NULL DEFAULT 1 COMMENT '商品数量',`unit_price` DECIMAL(10, 2) NOT NULL COMMENT '商品单价',CONSTRAINT `fk_order` FOREIGN KEY (`order_id`) REFERENCES `order`(`id`) ON DELETE CASCADE,CONSTRAINT `fk_product` FOREIGN KEY (`product_id`) REFERENCES `product`(`id`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单项表';
    
  7. cart(购物车表)
    CREATE TABLE `cart` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '购物车ID',`user_id` BIGINT(20) NOT NULL COMMENT '用户ID',`product_id` BIGINT(20) NOT NULL COMMENT '商品ID',`quantity` INT(11) NOT NULL DEFAULT 1 COMMENT '商品数量',`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',CONSTRAINT `fk_user_cart` FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE,CONSTRAINT `fk_product_cart` FOREIGN KEY (`product_id`) REFERENCES `product`(`id`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='购物车表';
    
  8. payment(支付表)
    ​
    CREATE TABLE `payment` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '支付ID',`order_id` BIGINT(20) NOT NULL COMMENT '订单ID',`payment_method` ENUM('ALIPAY', 'WECHAT', 'CREDIT_CARD') NOT NULL COMMENT '支付方式',`payment_status` ENUM('PENDING', 'SUCCESS', 'FAILED') NOT NULL DEFAULT 'PENDING' COMMENT '支付状态',`payment_date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '支付时间',`transaction_id` VARCHAR(255) DEFAULT NULL COMMENT '交易流水号',`amount` DECIMAL(10, 2) NOT NULL COMMENT '支付金额',CONSTRAINT `fk_order_payment` FOREIGN KEY (`order_id`) REFERENCES `order`(`id`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付表';​
  9. 商品类别表 category(可选)

    CREATE TABLE `category` (`id` BIGINT(20) NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT '类别ID',`name` VARCHAR(255) NOT NULL COMMENT '类别名称',`description` TEXT DEFAULT NULL COMMENT '类别描述',`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商品类别表';
    
  10. 触发器(可选)

    在某些情况下,你可能需要一些触发器来自动更新库存或记录日志。

    DELIMITER $$CREATE TRIGGER update_stock_after_order_insert
    AFTER INSERT ON `order_item`
    FOR EACH ROW
    BEGINUPDATE `product`SET `stock` = `stock` - NEW.quantityWHERE `id` = NEW.product_id;
    END$$DELIMITER ;
    

六、后端实现

1. 设置Spring Boot项目

首先,创建一个Spring Boot项目,集成Spring Web, Spring Data JPA, Spring Security。

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Starter Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- MySQL Connector --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!-- Thymeleaf for templates --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
</dependencies>

2. 数据库实体类

java">@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;private String email;private String role;  // ROLE_USER, ROLE_ADMIN// getters and setters
}
  • Product.java                                                                                                                      
java">@Entity
public class Product {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String description;private double price;private int stock;// getters and setters
}

  • Cart.java
    java">@Entity
    public class Cart {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@ManyToOneprivate User user;@ManyToOneprivate Product product;private int quantity;// getters and setters
    }
    
  • Order.java
    java">@Entity
    public class Order {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@ManyToOneprivate User user;private double totalPrice;private String status;  // PENDING, COMPLETEDprivate String address;private LocalDateTime createTime;@OneToMany(mappedBy = "order")private List<OrderItem> orderItems;// getters and setters
    }
    
  • OrderItem.java
    java">@Entity
    public class OrderItem {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@ManyToOneprivate Order order;@ManyToOneprivate Product product;private int quantity;private double price;// getters and setters
    }
    

3. 创建Repository

java">@Repository
public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);
}@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
}@Repository
public interface CartRepository extends JpaRepository<Cart, Long> {List<Cart> findByUser(User user);
}@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {List<Order> findByUser(User user);
}

4. 创建Service层

  • UserService.java
    java">@Service
    public class UserService {@Autowiredprivate UserRepository userRepository;public User register(User user) {// 处理密码加密return userRepository.save(user);}public User login(String username, String password) {// 密码验证逻辑return userRepository.findByUsername(username).orElse(null);}
    }
    
  • ProductService.java
    java">@Service
    public class ProductService {@Autowiredprivate ProductRepository productRepository;public List<Product> getAllProducts() {return productRepository.findAll();}public Product getProduct(Long id) {return productRepository.findById(id).orElse(null);}public Product addProduct(Product product) {return productRepository.save(product);}
    }
    

5. 创建Controller层

  • UserController.java
    java">@RestController
    @RequestMapping("/api/user")
    public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public ResponseEntity<User> register(@RequestBody User user) {return ResponseEntity.ok(userService.register(user));}@PostMapping("/login")public ResponseEntity<User> login(@RequestParam String username, @RequestParam String password) {User user = userService.login(username, password);if (user == null) {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(null);}return ResponseEntity.ok(user);}
    }
    
  • ProductController.java
    java">@RestController
    @RequestMapping("/api/products")
    public class ProductController {@Autowiredprivate ProductService productService;@GetMappingpublic List<Product> getAllProducts() {return productService.getAllProducts();}@GetMapping("/{id}")public Product getProduct(@PathVariable Long id) {return productService.getProduct(id);}
    }
    
  • CartController.java
    java">@RestController
    @RequestMapping("/api/cart")
    public class CartController {@Autowiredprivate CartRepository cartRepository;@PostMapping("/add")public ResponseEntity<Cart> addToCart(@RequestBody Cart cart) {return ResponseEntity.ok(cartRepository.save(cart));}@GetMapping("/list")public List<Cart> getCartItems(@RequestParam Long userId) {return cartRepository.findByUser(new User(userId));}
    }
    

七、前端实现(Angular)

1、创建 Angular 服务层  

auth.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { environment } from '../environments/environment';@Injectable({providedIn: 'root'
})
export class AuthService {private baseUrl = `${environment.apiBaseUrl}/api/user`;constructor(private http: HttpClient) {}register(user: any): Observable<any> {return this.http.post(`${this.baseUrl}/register`, user);}getUserByUsername(username: string): Observable<any> {return this.http.get(`${this.baseUrl}/${username}`);}
}

2、创建 Angular 路由配置

app-routing.module.ts 中配置路由,指向用户注册和商品展示页面。

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { RegisterComponent } from './register/register.component';
import { ProductListComponent } from './product-list/product-list.component';const routes: Routes = [{ path: 'register', component: RegisterComponent },{ path: 'products', component: ProductListComponent },{ path: '', redirectTo: '/register', pathMatch: 'full' }
];@NgModule({imports: [RouterModule.forRoot(routes)],exports: [RouterModule]
})
export class AppRoutingModule {}

3、配置文件

确保在前端项目中配置了 API 基本路径和其他环境配置。比如,在 environments/environment.ts 中配置:

export const environment = {production: false,apiBaseUrl: 'http://localhost:8080'
};

4、用户登录与注册

  • 使用Angular表单来处理用户输入。
    register.component.tsimport { Component } from '@angular/core';
    import { AuthService } from '../services/auth.service';@Component({selector: 'app-register',templateUrl: './register.component.html',styleUrls: ['./register.component.css']
    })
    export class RegisterComponent {user = {username: '',password: '',email: '',phone: '',address: ''};constructor(private authService: AuthService) {}register() {this.authService.register(this.user).subscribe(response => {console.log('User registered successfully!', response);}, error => {console.error('Error registering user', error);});}
    }
    

  • 后端/api/user/register/api/user/login接口交互。

5、商品浏览与添加购物车

  • 显示商品列表(调用/api/products接口)。product.service.ts
    import { Injectable } from '@angular/core';
    import { HttpClient } from '@angular/common/http';
    import { Observable } from 'rxjs';
    import { environment } from '../environments/environment';@Injectable({providedIn: 'root'
    })
    export class ProductService {private baseUrl = `${environment.apiBaseUrl}/api/products`;constructor(private http: HttpClient) {}addProduct(product: any): Observable<any> {return this.http.post(`${this.baseUrl}/add`, product);}getProduct(id: number): Observable<any> {return this.http.get(`${this.baseUrl}/${id}`);}
    }
    

    product-list.component.ts

    import { Component, OnInit } from '@angular/core';
    import { ProductService } from '../services/product.service';@Component({selector: 'app-product-list',templateUrl: './product-list.component.html',styleUrls: ['./product-list.component.css']
    })
    export class ProductListComponent implements OnInit {products: any[] = [];constructor(private productService: ProductService) {}ngOnInit(): void {this.productService.getProduct(1).subscribe(data => {this.products = [data];});}
    }
    

  • 添加商品到购物车(调用/api/cart/add接口)。

6、订单管理与收货地址

  • 用户下单,提交购物车中的商品到订单接口。
  • 用户管理自己的订单和收货地址。

7、后台管理系统

  • 管理员可以增、删、改商品,查看所有用户和订单。

八、部署与测试

  1. 配置Spring Boot与数据库连接。
  2. 在MySQL中创建数据库并运行Spring Boot应用。
  3. 使用Angular构建前端并与后端API交互。

http://www.ppmy.cn/server/145398.html

相关文章

【es6进阶】如何使用Proxy实现自己的观察者模式

观察者模式&#xff08;Observer mode&#xff09;指的是函数自动观察数据对象&#xff0c;一旦对象有变化&#xff0c;函数就会自动执行。这里&#xff0c;我们是使用es6的proxy及reflect来实现这个效果。 实现效果 业务分析 源数据 const object2 {name: "张三"…

如何使用OCR技术批量识别图片中的文字并重命名文件,OCR 技术批量识别图片中的文字可能出现的错误

字符识别错误 形近字混淆&#xff1a;例如 “已” 和 “己”、“未” 和 “末” 等&#xff0c;由于外形极为相似&#xff0c;OCR 软件在识别时可能出现误判&#xff0c;将原本正确的字识别成与之形近的另一个字。比如在识别一篇手写的文章中&#xff0c;手写体的 “已” 可能就…

软件测试面试之常规问题

1.描述一下测试过程 类似题目:测试的生命周期 思路:这是一个“范围”很大的题目&#xff0c;而且回答时间一般在3分钟之内&#xff0c;不可能非常详细的描述整个过程&#xff0c;因此答题的思路要从整体结构入手&#xff0c;不要过细。为了保证答案的准确性&#xff0c;可以引…

SpringBoot(三十九)SpringBoot集成RabbitMQ实现流量削峰添谷

前边我们有具体的学习过RabbitMQ的安装和基本使用的情况。 但是呢&#xff0c;没有演示具体应用到项目中的实例。 这里使用RabbitMQ来实现流量的削峰添谷。 一&#xff1a;添加pom依赖 <!--rabbitmq-需要的 AMQP 依赖--> <dependency><groupId>org.springfr…

TCP IP协议和网络安全

传输层的两个协议&#xff1a; 可靠传输 TCP 分段传输 建立对话&#xff08;消耗系统资源&#xff09; 丢失重传netstat -n 不可靠传输 UDP 一个数据包就能表达完整的意思或屏幕广播 应用层协议&#xff08;默认端口&#xff09;&#xff1a; httpTCP80 网页 ftpTCP21验证用户身…

在Ubuntu2004中搭建基于ESP-IDF v5.1的ESP32-S3开发环境

在Ubuntu2004中搭建基于ESP-IDF v5.1的ESP32-S3开发环境 目录 1 基本资料 2 注意事项 2.1 子模块检出失败处理 2.2 选择 Espressif 下载服务器 2.3 自定义工具安装路径 2.4 导出环境变量 2.5 测试基础环境 3 创建自己的工程 3.1 创建基础应用工程 3.2 创建组件(…

Linux 虚拟机下安装RedisJSON

文章目录 一、安装 Redis二、安装RedisJSON 一、安装 Redis 安装地址 二、安装RedisJSON RedisJSON github 地址 选择版本&#xff0c;下载压缩包。 RedisJson 是根据 Rust 开发编译的&#xff0c;所以我们要在系统中安装 Rust。官网地址。 国内下载 Rust 下载较慢&#x…

Http 响应协议

HTTP的响应协议 响应数据格式 响应行 响应数据的第一行&#xff0c;包括协议、状态码、描述 响应头 从响应数据格式的第二行开始&#xff0c;也是以key:value的格式 响应体 和响应头之间有一个空行&#xff0c;是响应数据格式的最后一部分&#xff0c;用于存放响应的数据 常见响…