当前位置: 首页 > article >正文

【商城实战(18)】后台管理系统基础搭建:从0到1构建电商中枢

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想深入钻研技术细节,还是探寻商城运营之道,本专栏都能提供从 0 到 1 的系统讲解,助力你打造独具竞争力的电商平台,开启电商实战之旅。

目录

  • 一、创建基于 Element Plus 的后台管理项目
    • 1.1 项目初始化
    • 1.2 安装 Element Plus
    • 1.3 基础页面布局搭建
  • 二、配置后台管理系统菜单及路由
    • 2.1 定义路由规则
    • 2.2 创建菜单组件
    • 2.3 关联菜单与路由
  • 三、搭建后台管理系统用户登录及权限验证机制
    • 3.1 用户登录流程
    • 3.2 Token 验证机制​
    • 3.3 权限控制实现​
  • 四、总结与展望
    • 4.1 回顾搭建过程
    • 4.2 后续优化方向


一、创建基于 Element Plus 的后台管理项目

在开发后台管理系统时,使用 Element Plus 能极大地提高开发效率,它提供了丰富的组件和美观的样式。下面我们将逐步创建基于 Element Plus 的后台管理项目,并搭建基础页面布局。

1.1 项目初始化

首先,确保你已经安装了 Node.js 和 Vue CLI。如果尚未安装 Vue CLI,可以通过以下命令进行全局安装:

npm install -g @vue/cli

安装完成后,使用 Vue CLI 创建一个新的项目,执行以下命令:

vue create admin-system

在创建过程中,会出现一系列选项让你选择项目配置。你可以根据项目需求选择合适的配置,例如是否使用 TypeScript、是否安装路由、是否使用状态管理等。这里我们选择默认配置,快速搭建项目基础框架。选择完成后,Vue CLI 会自动下载项目所需的依赖并初始化项目结构。

1.2 安装 Element Plus

项目初始化完成后,进入项目目录:

cd admin-system

然后使用 npm 安装 Element Plus,执行以下命令:

npm install element - plus --save

安装完成后,有两种方式在项目中引入 Element Plus:全局引入和按需引入。

  • 全局引入:在main.js文件中添加以下代码:
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/lib/theme-chalk/index.css'
import App from './App.vue'const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')

这样,Element Plus 的所有组件都可以在项目中全局使用。

  • 按需引入:如果项目体积对大小比较敏感,希望只引入需要的组件,可以使用按需引入的方式。首先安装unplugin - vue - components和unplugin - auto - import插件,执行以下命令:
npm install -D unplugin - vue - components unplugin - auto - import

然后在vite.config.js(如果使用 Vite 构建工具)或webpack.config.js(如果使用 Webpack 构建工具)中进行配置。以 Vite 为例,在vite.config.js中添加以下配置:

import { defineConfig } from 'vite'
import Components from 'unplugin - vue - components/vite'
import { ElementPlusResolver } from 'unplugin - vue - components/resolvers'export default defineConfig({plugins: [Components({resolvers: [ElementPlusResolver()]})]
})

这样配置后,在使用 Element Plus 组件时,无需手动导入,直接在模板中使用即可,例如:

<template><el - button type="primary">主要按钮</el - button>
</template>

1.3 基础页面布局搭建

使用 Element Plus 的 Container 布局容器来搭建基础页面布局,它提供了el - container、el - header、el - aside、el - main和el - footer等组件,方便快速构建页面结构。

在App.vue文件中编写如下代码:

<template><el - container style="height: 100vh"><el - header><!-- 头部内容,例如导航栏、logo等 --><h1>商城后台管理系统</h1></el - header><el - container><el - aside width="200px"><!-- 侧边栏内容,菜单等 --><el - menu :default - openeds="['1']"><el - sub - menu index="1"><template #title><i class="el - icon - message"></i>商品管理</template><el - menu - item index="1 - 1">商品列表</el - menu - item><el - menu - item index="1 - 2">添加商品</el - menu - item></el - sub - menu><el - sub - menu index="2"><template #title><i class="el - icon - setting"></i>订单管理</template><el - menu - item index="2 - 1">订单列表</el - menu - item><el - menu - item index="2 - 2">订单详情</el - menu - item></el - sub - menu></el - menu></el - aside><el - main><!-- 主要内容区域,根据路由显示不同页面 --><router - view></router - view></el - main></el - container></el - container>
</template><style scoped>
.el - header {background - color: #333;color: #fff;display: flex;justify - content: space - between;align - items: center;padding: 0 20px;
}.el - aside {background - color: #f4f4f4;
}.el - main {background - color: #fff;padding: 20px;
}
</style>

上述代码中,el-container作为外层容器,设置高度为视口高度100vh。el-header用于显示头部内容,设置了背景颜色和样式。el-aside作为侧边栏,包含了商品管理和订单管理的菜单。el-main作为主要内容区域,通过router-view来显示不同路由对应的页面内容。这样就完成了基础页面布局的搭建,一个简单的后台管理系统框架初见雏形。

二、配置后台管理系统菜单及路由

在完成后台管理系统的基础页面布局搭建后,配置菜单及路由是实现页面导航功能的关键步骤。合理的菜单及路由配置能够让用户方便地在不同功能页面之间进行切换,提升系统的易用性和交互性。下面我们将详细介绍如何配置后台管理系统的菜单及路由。

2.1 定义路由规则

在 Vue 项目中,我们使用 Vue Router 来定义路由规则。Vue Router 是 Vue.js 官方的路由管理器,它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。

首先,确保已经安装了 Vue Router。如果在项目初始化时没有选择安装,可以通过以下命令进行安装:

npm install vue-router --save

安装完成后,在src目录下创建router文件夹,并在该文件夹下新建index.js文件,用于定义路由规则。

假设我们有商品列表、添加商品、订单列表、订单详情等页面组件,分别位于src/views/goods和src/views/order目录下,以下是定义路由规则的示例代码:

import { createRouter, createWebHistory } from 'vue-router'
// 引入页面组件
import GoodsList from '@/views/goods/GoodsList.vue'
import AddGoods from '@/views/goods/AddGoods.vue'
import OrderList from '@/views/order/OrderList.vue'
import OrderDetail from '@/views/order/OrderDetail.vue'const routes = [{path: '/goods',name: 'Goods',component: () => import('@/views/goods/Goods.vue'),children: [{path: 'list',name: 'GoodsList',component: GoodsList},{path: 'add',name: 'AddGoods',component: AddGoods}]},{path: '/order',name: 'Order',component: () => import('@/views/order/Order.vue'),children: [{path: 'list',name: 'OrderList',component: OrderList},{path: 'detail/:id',name: 'OrderDetail',component: OrderDetail,props: true // 将路由参数作为props传递给组件}]}
]const router = createRouter({history: createWebHistory(),routes
})export default router

在上述代码中:

  • 使用createRouter和createWebHistory创建路由实例,createWebHistory表示使用 HTML5 的 history 模式,去除 URL 中的#。
  • routes数组定义了路由规则,每个路由对象包含path(路径)、name(路由名)和component(组件)等属性。
  • 对于商品管理和订单管理模块,使用了嵌套路由的配置方式。在Goods和Order路由下,通过children属性定义了子路由,例如GoodsList和AddGoods是Goods路由的子路由,OrderList和OrderDetail是Order路由的子路由。
  • 在OrderDetail路由中,使用了动态路由参数/:id,表示该路由可以匹配不同的订单 ID,例如/order/detail/123,并且通过props: true将路由参数id作为 props 传递给OrderDetail组件,在组件中可以通过this.$route.params.id获取该参数值。

2.2 创建菜单组件

使用 Element Plus 的 Menu 组件来创建后台管理系统的菜单,Menu 组件提供了丰富的功能和样式,方便我们构建出美观且易用的菜单。

在App.vue文件中,我们已经搭建了基础的侧边栏结构,现在进一步完善菜单部分。修改el - aside部分的代码如下:

<el-aside width="200px"><el-menu :default - openeds="['1']" router><el-sub-menu index="1"><template #title><i class="el - icon - message"></i>商品管理</template><el-menu-item :index="'/goods/list'">商品列表</el-menu-item><el-menu-item :index="'/goods/add'">添加商品</el-menu-item></el-sub-menu><el-sub-menu index="2"><template #title><i class="el-icon-setting"></i>订单管理</template><el-menu-item :index="'/order/list'">订单列表</el-menu-item><el-menu-item :index="'/order/detail/1'">订单详情</el-menu-item></el-sub-menu></el-menu>
</el-aside>

在上述代码中:

  • el - menu组件设置了router属性,这使得菜单能够与路由进行关联,实现点击菜单时自动切换到相应的路由页面。
  • :default - openeds="[‘1’]"表示默认展开索引为1的子菜单,即商品管理子菜单。
  • el - sub - menu用于创建二级菜单,index属性为子菜单的唯一标识。
  • el - menu - item为菜单项,index属性指定了菜单项对应的路由路径,例如’/goods/list’和’/goods/add’分别对应商品列表和添加商品的路由路径。

2.3 关联菜单与路由

通过前面的步骤,我们已经定义了路由规则并创建了菜单组件,接下来需要将菜单与路由进行关联,实现点击菜单时切换到相应页面的功能。

由于在el-menu组件上设置了router属性,Element Plus 会自动根据菜单项的index属性值来匹配路由。当用户点击菜单项时,Vue Router 会根据匹配到的路由规则,将对应的组件渲染到router - view中。

此外,路由导航守卫在路由切换过程中起着重要作用。路由导航守卫可以用来对路由的进入和离开进行控制,例如进行权限验证、页面加载前的准备工作等。

在router/index.js文件中,可以使用全局前置守卫beforeEach来实现简单的权限验证功能。假设我们需要用户登录后才能访问后台管理系统的页面,代码如下:

import router from './router'
import store from './store'const whiteList = ['/login'] // 白名单,不需要登录即可访问的页面router.beforeEach((to, from, next) => {const hasToken = store.getters.token // 从状态管理中获取用户登录令牌if (hasToken) {if (to.path === '/login') {next('/') // 如果已登录,访问登录页则重定向到首页} else {next() // 已登录,允许访问其他页面}} else {if (whiteList.includes(to.path)) {next() // 未登录,在白名单内的页面允许访问} else {next(`/login?redirect=${to.path}`) // 未登录,重定向到登录页,并携带当前访问路径}}
})

在上述代码中:

  • beforeEach函数接收三个参数:to表示即将进入的目标路由对象,from表示当前导航正要离开的路由对象,next是一个函数,必须调用它来继续导航。
  • 通过store.getters.token获取用户登录令牌,判断用户是否已登录。如果已登录,且访问的不是登录页,则允许访问;如果已登录但访问登录页,则重定向到首页。
  • 如果未登录,判断当前访问路径是否在白名单内,在白名单内则允许访问,否则重定向到登录页,并将当前访问路径作为参数传递,以便登录成功后能自动跳转到原访问页面。

通过以上步骤,我们成功地配置了后台管理系统的菜单及路由,并实现了页面导航功能和简单的权限验证机制,为后续的功能开发奠定了坚实的基础。

三、搭建后台管理系统用户登录及权限验证机制

在后台管理系统中,用户登录及权限验证机制是保障系统安全的重要环节。它能够确保只有合法用户能够访问系统,并且根据用户的角色和权限限制其对系统功能和数据的访问。下面我们将详细介绍如何搭建后台管理系统的用户登录及权限验证机制,并展示相关的实现源码。

3.1 用户登录流程

在前端登录页面,使用 Element Plus 的 Form 组件收集用户输入的用户名和密码,通过 Axios 发送 POST 请求到后端进行验证。前端代码示例如下:​

<template><el - container class="login - container"><el - form ref="loginFormRef" :model="loginForm" :rules="loginRules" label - width="80px"><el - form - item label="用户名" prop="username"><el - input v - model="loginForm.username" placeholder="请输入用户名"></el - input></el - form - item><el - form - item label="密码" prop="password"><el - input v - model="loginForm.password" type="password" placeholder="请输入密码"></el - input></el - form - item><el - form - item><el - button type="primary" @click="handleLogin">登录</el - button></el - form - item></el - form></el - container></template>​
​
<script setup lang="ts">import { ref } from 'vue';import axios from 'axios';import { useUserStore } from '../stores/user';​
​
const loginForm = ref({​username: '',​password: ''});​
​
const loginRules = ref({​username: [{ required: true, message: '请输入用户名', trigger: 'blur' }],​password: [{ required: true, message: '请输入密码', trigger: 'blur' }]});​
​
const handleLogin = async () => {try {const response = await axios.post('/api/login', loginForm.value);if (response.data.success) {const userStore = useUserStore();​userStore.setToken(response.data.token);​userStore.setUserInfo(response.data.user);// 这里可以根据业务需求进行页面跳转,如跳转到首页​} else {// 提示用户登录失败信息​}} catch (error) {console.error('登录请求失败', error);}};</script>​
​
<style scoped lang="scss">.login - container {​display: flex;​justify - content: center;​align - items: center;​height: 100vh;​background - color: #f0f2f5;}</style>


后端使用 Spring Boot 处理登录请求,在UserController中编写登录接口:​

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RestController;import com.example.mallbackend.dto.LoginRequest;import com.example.mallbackend.dto.LoginResponse;import com.example.mallbackend.service.UserService;​
​
@RestControllerpublic class UserController {@Autowiredprivate UserService userService;​
​@PostMapping("/api/login")public LoginResponse login(@RequestBody LoginRequest loginRequest) {return userService.login(loginRequest);}}


LoginRequest和LoginResponse是自定义的数据传输对象,用于封装前端传递的登录信息和返回给前端的登录结果。​

3.2 Token 验证机制​

前端在每次发送请求时,将 Token 添加到请求头中。在 Axios 的拦截器中进行统一处理:​

import axios from 'axios';import { useUserStore } from '../stores/user';​
​
const service = axios.create({​baseURL: '/api',​timeout: 5000});​
​
service.interceptors.request.use(​config => {const userStore = useUserStore();if (userStore.token) {​config.headers['Authorization'] = `Bearer ${userStore.token}`;}return config;},​error => {return Promise.reject(error);});​
​
service.interceptors.response.use(​response => {return response;},​error => {if (error.response.status === 401) {// Token失效,进行相应处理,如跳转到登录页面​}return Promise.reject(error);});​
​
export default service;


后端在 Spring Boot 项目中,使用过滤器对请求头中的 Token 进行验证。创建一个JwtAuthenticationFilter过滤器:​

import java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.security.core.userdetails.UserDetails;import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;import org.springframework.web.filter.GenericFilterBean;import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jwts;import com.example.mallbackend.service.UserService;​
​
public class JwtAuthenticationFilter extends GenericFilterBean {private static final String HEADER_STRING = "Authorization";private static final String TOKEN_PREFIX = "Bearer ";private final UserService userService;private final String secret;​
​public JwtAuthenticationFilter(UserService userService, String secret) {this.userService = userService;this.secret = secret;}​
​@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;String header = request.getHeader(HEADER_STRING);if (header != null && header.startsWith(TOKEN_PREFIX)) {String token = header.replace(TOKEN_PREFIX, "");Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();String username = claims.getSubject();UserDetails userDetails = userService.loadUserByUsername(username);UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(​userDetails, null, userDetails.getAuthorities());​authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(authentication);}​filterChain.doFilter(servletRequest, servletResponse);}}


在 Spring Security 配置类中注册该过滤器:​

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.security.config.annotation.web.builders.HttpSecurity;import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;import org.springframework.security.config.http.SessionCreationPolicy;import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;import com.example.mallbackend.service.UserService;import com.example.mallbackend.filter.JwtAuthenticationFilter;​
​
@Configuration@EnableWebSecuritypublic class SecurityConfig extends WebSecurityConfigurerAdapter {private final UserService userService;private final String secret;​
​public SecurityConfig(UserService userService, String secret) {this.userService = userService;this.secret = secret;}​
​@Overrideprotected void configure(HttpSecurity http) throws Exception {​http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().addFilterBefore(new JwtAuthenticationFilter(userService, secret),UsernamePasswordAuthenticationFilter.class).authorizeRequests().antMatchers("/api/login").permitAll().anyRequest().authenticated();}}


上述代码实现了前端和后端的 Token 验证机制,确保只有合法的用户请求能够访问受保护的资源。​

3.3 权限控制实现​

在前端,根据用户的角色动态显示或隐藏菜单和页面元素。例如,在菜单组件中根据用户角色判断是否显示某些菜单项:​

<template><el - menu :default - active="activeIndex" class="el - menu - vertical - demo" @select="handleSelect"><el - menu - item index="/"><el - icon><HomeFilled /></el - icon><span>首页</span></el - menu - item><el - menu - item v - if="userStore.role === 'admin'" index="/user"><el - icon><UserFilled /></el - icon><span>用户管理</span></el - menu - item><el - menu - item v - if="userStore.role === 'admin' || userStore.role ==='seller'" index="/product"><el - icon><GoodsFilled /></el - icon><span>商品管理</span></el - menu - item></el - menu></template>​
​
<script setup lang="ts">import { ref } from 'vue';import { HomeFilled, UserFilled, GoodsFilled } from '@element - plus/icons - vue';import { useUserStore } from '../stores/user';​
​
const activeIndex = ref('/');const handleSelect = (index: string) => {// 这里可以添加点击菜单后的额外逻辑,如记录操作日志等​activeIndex.value = index;};</script>​
​
<style scoped lang="scss">.el - menu - vertical - demo {​height: 100%;​border - right: none;}</style>



在后端,通过 Spring Security 的注解和配置来实现对接口的权限控制。例如,在UserController中对某些接口添加权限注解:​

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.access.prepost.PreAuthorize;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.example.mallbackend.service.UserService;​
​
@RestController@RequestMapping("/api/user")public class UserController {@Autowiredprivate UserService userService;​
​@GetMapping("/admin - only")@PreAuthorize("hasRole('ADMIN')")public String adminOnly() {return "This is an admin - only endpoint";}}


上述代码展示了前端和后端协同实现的权限控制机制,确保不同角色的用户只能访问其被授权的功能和页面。

四、总结与展望

4.1 回顾搭建过程

在本次后台管理系统的基础搭建中,我们首先使用Vue CLI创建了项目,并成功安装和引入了Element Plus组件库,通过其Container布局容器搭建了美观且实用的基础页面布局,包含了清晰的头部、侧边栏和主要内容区域。

接着,利用Vue Router定义了详细的路由规则,涵盖了商品管理、订单管理等多个模块及其子路由,同时创建了基于Element Plus Menu组件的菜单,并通过设置router属性实现了菜单与路由的无缝关联,还运用路由导航守卫实现了简单的权限验证,确保只有合法用户能够访问特定页面。

最后,搭建了用户登录及权限验证机制。完善的用户登录流程确保了用户身份的准确识别,可靠的 Token 验证机制保障了请求的安全性,细致的权限控制实现则从前端和后端两个层面保证了不同角色用户对系统资源的合理访问,为整个商城后台管理系统的稳定运行和数据安全奠定了坚实基础。

4.2 后续优化方向

在后续的开发中,我们可以从多个方面对后台管理系统进行优化。性能优化方面,通过代码压缩、缓存机制、异步加载等技术,提高系统的响应速度和运行效率,减少页面加载时间,提升用户体验。安全加固方面,进一步完善权限管理,采用更复杂的加密算法和安全策略,防止数据泄露和非法访问,例如对用户数据进行加密存储,对敏感操作进行详细的日志记录以便追溯。用户体验改进方面,优化界面设计,使其更加简洁美观、易于操作,增加操作提示和反馈机制,让用户在使用过程中更加清晰地了解系统状态和操作结果。同时,不断完善系统的功能,根据业务需求添加更多实用的功能模块,如数据分析、报表生成等,以满足商城运营和管理的多样化需求 。通过持续的优化和完善,使后台管理系统更加稳定、高效、安全,为商城的顺利运营提供坚实的支持。

相关文章:

【商城实战(18)】后台管理系统基础搭建:从0到1构建电商中枢

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

新能源汽车充电综合解决方案:安科瑞电气助力绿色出行

安科瑞 华楠 18706163979 随着新能源汽车的迅猛发展&#xff0c;充电基础设施的建设成为了推动行业进步的关键。然而&#xff0c;充电技术滞后、运营效率低下、车桩比失衡等问题&#xff0c;依然困扰着广大车主和运营商。今天&#xff0c;我们要为大家介绍一款新能源汽车充电…...

蓝桥杯java-B组真题—动态规划

目录 一.什么是动态规划? 二.题目 第一种情况:集合本身之和为奇数 第二种情况:集合本身之和为偶数 下面是代码实现: 一.什么是动态规划? 这里就简单的解释一下&#xff0c;动态规划就是记录之前的计算结果&#xff0c;避免重复的计算之前已经计算过的结果&#xff0c;用…...

【网络编程】事件选择模型

十、基于I/O模型的网络开发 10.9 事件选择模型 10.0.1 基本概念 事件选择(WSAEventSelect) 模型是另一个有用的异步 I/O 模型。和 WSAAsyncSelect 模 型类似的是&#xff0c;它也允许应用程序在一个或多个套接字上接收以事件为基础的网络事件通知&#xff0c;最 主要的差别在…...

网易邮箱如何用大数据任务调度实现海量邮件数据处理?Apache DolphinScheduler用户交流会上来揭秘!

你是否对大数据领域的前沿应用充满好奇&#xff1f;网易邮箱作为互联网大厂网易的重要业务线&#xff0c;在大数据应用方面有着诸多值得借鉴的实践经验。你是否渴望深入了解网易邮箱如何借助 Apache DolphinScheduler 实现海量邮件数据处理、用户行为分析、实时监控等核心业务场…...

前端知识点---路由模式-实例模式和单例模式(ts)

在 ArkTS&#xff08;Ark UI 框架&#xff09;中&#xff0c;路由实例模式&#xff08;Standard Instance Mode&#xff09;主要用于管理页面跳转。当创建一个新页面时&#xff0c;可以选择标准实例模式&#xff08;Standard Mode&#xff09;或单实例模式&#xff08;Single M…...

固定表头、首列 —— uniapp、vue 项目

项目实地&#xff1a;也可以在 【微信小程序】搜索体验&#xff1a;xny.handbook 另一个体验项目&#xff1a;官网 一、效果展示 二、代码展示 &#xff08;1&#xff09;html 部分 <view class"table"><view class"tr"><view class&quo…...

langchain系列(九)- LangGraph 子图详解

目录 一、导读 二、原理说明 1、简介 2、子图图示 3、使用说明 三、基础代码实现 1、实现功能 2、Graph 图示 3、代码实现 4、输出 5、分析 四、人机交互 1、实现中断 2、历史状态&#xff08;父图&#xff09; 3、历史状态&#xff08;子图&#xff09; 4、历史…...

搜索引擎是如何理解你的查询并提供精准结果的?

目录 一、搜索引擎简单介绍 二、搜索引擎整体架构和工作过程 &#xff08;一&#xff09;整体分析 &#xff08;二&#xff09;爬虫系统 三个基本点 爬虫系统的工作流程 关键考虑因素和挑战 &#xff08;三&#xff09;索引系统 网页处理阶段 预处理阶段 反作弊分析…...

【前端】【组件】【vue2】封装一个vue2的ECharts组件,不用借助vue-echarts

在Vue2项目中使用ECharts 5.6的完整实现步骤如下&#xff1a; 安装依赖 npm install echarts5.6.2 --save # 指定安装5.x最新版本基础组件实现&#xff08;新建components/ECharts.vue&#xff09; <template><div ref"chartDom" class"echarts-co…...

18天 - 常见的 HTTP 状态码有哪些?HTTP 请求包含哪些内容,请求头和请求体有哪些类型?HTTP 中 GET 和 POST 的区别是什么?

常见的 HTTP 状态码有哪些&#xff1f; HTTP 状态码用于指示服务器对客户端请求的响应结果&#xff0c;常见的 HTTP 状态码可以分为以下几类&#xff1a; 1. 信息类&#xff08;1xx&#xff09; 100 Continue&#xff1a;客户端应继续发送请求。101 Switching Protocols&…...

IDEA软件安装环境配置中文插件

一、Java环境配置 1. JDK安装8 访问Oracle官网下载JDK8&#xff08;推荐JDK8&#xff0c;11&#xff09;Java Downloads | Oracle 双击安装程序&#xff0c;保持默认设置连续点击"下一步"完成安装 验证JDK安装&#xff0c;winR键 然后输入cmd&#xff0c;输入java…...

循环神经网络(RNN):时序建模的核心引擎与演进之路

在人工智能处理序列数据的战场上&#xff0c;循环神经网络&#xff08;RNN&#xff09;如同一个能够理解时间的智者。从 2015 年谷歌神经机器翻译系统颠覆传统方法&#xff0c;到 2023 年 ChatGPT 实现对话连续性&#xff0c;这些突破都植根于 RNN 对时序建模的深刻理解。本文将…...

HTML 表单 (form) 的作用解释

表单在网页中主要负责的是数据采集功能&#xff0c;一个表单基本由三部分组成&#xff1a; 表单标签&#xff1a;这里面包含了处理表单数据所用 CGI &#xff08;Common Gateway Interface&#xff0c;通用网关接口&#xff09;程序的 URL &#xff08;Uniform Resource Locati…...

Windows控制台函数:控制台读取输入函数ReadConsoleA()

目录 什么是 ReadConsoleA&#xff1f; 它长什么样&#xff1f; 怎么用它&#xff1f; 它跟 std::cin 有什么不一样&#xff1f; 注意事项 什么是 ReadConsoleA&#xff1f; ReadConsoleA 是一个 Windows API 函数&#xff0c;用来从控制台读取用户输入。想象一下&#…...

网络tcp协议设置,网络tcp协议设置不了

网络TCP协议的设置通常涉及到多个方面&#xff0c;包括IP地址、子网掩码、默认网关、DNS服务器等参数的配置&#xff0c;以及TCP/IP协议栈本身的配置。如果遇到网络TCP协议设置不了的问题&#xff0c;可能是由多种原因导致的。以下是一些可能的原因及解决方法&#xff1a; 一、…...

电脑总显示串口正在被占用处理方法

1.现象 在嵌入式开发过程中&#xff0c;有很多情况下要使用串口调试&#xff0c;其中485/422/232转usb串口是非常常见的做法。 根据协议&#xff0c;接口芯片不同&#xff0c;需要安装对应的驱动程序&#xff0c;比如ch340&#xff0c;cp2102&#xff0c;CDM212364等驱动。可…...

R语言和RStudio安装

整体还是比较简单的&#xff0c;主要是记录个流程。 官方镜像站列表R语言官网 1 安装R&#xff08;2025/3/6&#xff09; R语言官网&#xff1a;The R Project for Statistical Computing 打开之后就Hello world一下吧 配置环境变量 2 安装RStudio 下载地址&#xff1a;htt…...

RHEL/CentOS 7.9使用firewalld限制出方向策略

背景 通常使用firewalld时候多为限制入方向访问&#xff0c;本次因有系统需要在生产环境部署测试环境&#xff0c;需求人希望在该测试环境中限制访问的对象&#xff0c;避免对生产造成影响 基础团队小伙伴参照rich-files&#xff0c;通过CLI&#xff0c;GUI反复进行进行配置验…...

设计模式之建造者模式:原理、实现与应用

引言 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;它通过将复杂对象的构建过程分解为多个简单的步骤&#xff0c;使得对象的创建更加灵活和可维护。建造者模式特别适用于构建具有多个组成部分的复杂对象。本文将深入探讨建造者模式的原…...

1688店铺所有商品数据接口详解

​​一、接口概述淘宝开放平台提供 1688.items.onsale.get/taobao.item_search_shop 接口&#xff0c;可批量获取店铺在售商品列表&#xff0c;包含商品 ID、标题、价格、销量、图片等核心信息。该接口适用于商品库管理、竞品监控、数据分析等场景 ​二、接口调用流程 前期准…...

【C#学习笔记02】基本元素与数据类型

引言 深入了解C语言的基本元素、计算机存储器结构、常量与变量的概念以及数据类型。这些内容是C语言编程的基础&#xff0c;掌握它们对于编写高效、可靠的嵌入式程序至关重要。 1.C语言的基本元素 ​编程语言的发展离不开自然语言&#xff0c;所以编程语言的语法和词汇也是由…...

【语料数据爬虫】Python爬虫|批量采集工作报告数据(1)

前言 本文是该专栏的第4篇,后面会持续分享Python爬虫采集各种语料数据的的干货知识,值得关注。 在本文中,笔者将主要来介绍基于Python,来实现批量采集“工作报告”数据。同时,本文也是采集“工作报告”数据系列的第1篇。 采集相关数据的具体细节部分以及详细思路逻辑,笔…...

<建模软件安装教程1>Blender4.2系列

Blender4.2安装教程 0注意&#xff1a;Windows环境下安装 第一步&#xff0c;百度网盘提取安装包。百度网盘链接&#xff1a;通过网盘分享的文件&#xff1a;blender.zip 链接: https://pan.baidu.com/s/1OG0jMMtN0qWDSQ6z_rE-9w 提取码: 0309 --来自百度网盘超级会员v3的分…...

Docker极简部署开源播放器Splayer结合内网穿透远程流畅在线听歌

前言 嘿&#xff0c;各位音乐发烧友们&#xff01;如果你厌倦了广告的打扰&#xff0c;渴望在忙碌的生活中找到一片宁静的音乐天地&#xff0c;那么今天这篇教程绝对适合你——如何在Ubuntu上用Docker快速搭建一款高颜值、无广告的某抑云音乐播放器Splayer。 Splayer不仅界面…...

基于YOLO(以YOLOv8为例)模型开发算法的详细步骤,包含算法代码、训练指导、数据集准备以及可能的改进方向

以下是一个基于YOLO&#xff08;以YOLOv8为例&#xff09;模型开发算法的详细步骤&#xff0c;包含算法代码、训练指导、数据集准备以及可能的改进方向。 1. 环境准备 首先&#xff0c;你需要安装必要的库。可以使用以下命令创建一个新的虚拟环境并安装所需的库&#xff1a; …...

显示器长时间黑屏

现象 电脑启动后,进入登录界面前会随机黑屏,有时候十几秒,有时候几分钟 进入桌面后,长时间不操作电脑黑屏,移动鼠标,点击键盘后尝试点亮屏幕,也会消耗较长时间 尝试 重装系统,或者重新安装显卡,都能够恢复,但过段时间以后又出现黑屏情况 集成显卡,独立显卡都出现过 操作系统…...

linux docker相关指令

1、镜像操作 0&#xff09;、搜索&#xff1a;docker search 镜像名称 1&#xff09;、拉取&#xff1a;docker pull 2&#xff09;、推送&#xff1a;docker push 3&#xff09;、查看&#xff1a;docker images 4&#xff09;、查看所有镜像ID&#xff1a;d…...

V8引擎中的垃圾回收机制如何工作?

V8引擎中的垃圾回收机制主要通过分代回收和增量标记清除算法来管理内存。以下是其工作原理的详细说明&#xff1a; V8 的垃圾回收机制基于以下核心设计原则&#xff1a; 1. 分代假设&#xff1a;大多数对象的生命周期很短&#xff0c;只有少数对象会存活较长时间&#xff1b;…...

内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射

一.域横向pth&#xff0c;mimkatz&#xff0c;NTLM windwos server 2012 R2之前可能是NTLM和LM&#xff0c;之后为NTLM 1.mimkatz ptk 使用mimkatz进行横向移动 mimikatz sekurlsa::pth /user:administrator&#xff08;目标本地用户名&#xff09; /domain:192.168.3.32&a…...