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

Vue用户管理系统代码逐行详解

Vue用户管理系统代码逐行详解

1. Login.vue - 登录页面完整解析

模板部分 (Template)

<!-- src/views/Login.vue -->

解释:这是注释,标明文件路径,方便开发者定位文件位置。

<template>

解释:Vue组件的模板标签开始。每个Vue组件必须有且只有一个根模板标签。

  <div class="login-container">

解释

  • <div>:HTML的块级容器元素
  • class="login-container":给这个div添加CSS类名,用于样式控制
  • 作为整个登录页面的最外层容器
    <el-card class="login-card">

解释

  • <el-card>:Element Plus提供的卡片组件
  • 创建一个带阴影的卡片容器,让登录表单看起来像悬浮在页面上
  • class="login-card":自定义样式类,控制卡片的宽度等属性
      <h2 class="login-title">用户管理系统</h2>

解释

  • <h2>:二级标题标签
  • 显示系统名称,作为登录页面的标题
  • class="login-title":用于居中和美化标题样式
      <el-formref="loginFormRef":model="loginForm":rules="rules"label-width="0px">

解释

  • <el-form>:Element Plus的表单组件,提供表单验证等功能
  • ref="loginFormRef":创建一个引用,允许在JavaScript中直接访问这个表单组件实例
    • 为什么需要ref?因为我们需要调用表单的validate()方法来触发验证
  • :model="loginForm":v-bind语法,将表单绑定到loginForm数据对象
    • 冒号(:)是v-bind的简写,用于动态绑定属性
  • :rules="rules":绑定表单验证规则
  • label-width="0px":设置标签宽度为0,因为我们不显示标签文字
        <el-form-item prop="username">

解释

  • <el-form-item>:表单项组件,包装每个表单输入控件
  • prop="username":指定这个表单项对应loginForm对象中的username属性
    • 这个prop很重要,它告诉表单验证系统要验证哪个字段
          <el-inputv-model="loginForm.username"prefix-icon="User"placeholder="请输入用户名"size="large"/>

解释

  • <el-input>:Element Plus的输入框组件
  • v-model="loginForm.username":双向数据绑定
    • 用户输入的内容会自动更新到loginForm.username
    • loginForm.username的值改变也会自动更新输入框显示
  • prefix-icon="User":在输入框前面显示用户图标
  • placeholder="请输入用户名":输入框为空时的提示文字
  • size="large":设置输入框大小为大号,提升用户体验
  • />:自闭合标签写法,等同于</el-input>
        </el-form-item><el-form-item prop="password"><el-inputv-model="loginForm.password"type="password"prefix-icon="Lock"placeholder="请输入密码"size="large"show-password@keyup.enter="handleLogin"/>

解释

  • type="password":将输入框类型设为密码,输入内容会显示为圆点
  • show-password:显示一个眼睛图标,点击可切换密码可见性
  • @keyup.enter="handleLogin":监听键盘事件
    • @是v-on的简写,用于事件监听
    • keyup:键盘按键抬起事件
    • .enter:事件修饰符,只监听回车键
    • 按回车键时触发handleLogin函数,提升用户体验
        <el-form-item><el-buttontype="primary"size="large"style="width: 100%":loading="loading"@click="handleLogin">登 录</el-button>

解释

  • type="primary":按钮类型为主要按钮,显示为蓝色
  • style="width: 100%":内联样式,让按钮宽度占满父容器
  • :loading="loading":动态绑定loading状态
    • 当loading为true时,按钮显示加载动画并禁用点击
    • 防止用户重复提交
  • @click="handleLogin":点击按钮时触发登录函数
      <div class="login-tips"><p>管理员账号:admin / 123456</p><p>普通用户:zhangsan / 123456</p></div>

解释:提供测试账号信息,方便开发和演示。生产环境应该删除。

脚本部分 (Script)

<script setup>

解释

  • Vue 3的Composition API语法糖
  • setup:组件的setup函数,在组件创建之前执行
  • 使用<script setup>后,顶层的绑定会自动暴露给模板
import { ref, reactive } from "vue";

解释

  • 从Vue核心库导入响应式API
  • ref:创建响应式的基本类型数据(如布尔值、字符串、数字)
  • reactive:创建响应式的对象或数组
import { useRouter } from "vue-router";

解释

  • 导入路由钩子函数
  • useRouter:获取路由实例,用于编程式导航(跳转页面)
import { useStore } from "vuex";

解释

  • 导入状态管理钩子
  • useStore:获取Vuex store实例,用于全局状态管理
import { ElMessage } from "element-plus";

解释

  • 导入Element Plus的消息提示组件
  • 用于显示成功、错误等提示信息
const router = useRouter();
const store = useStore();

解释

  • 获取路由和store实例
  • const声明常量,这些实例在组件生命周期内不会改变
const loginFormRef = ref();

解释

  • 创建一个ref引用,初始值为undefined
  • 这个ref会自动绑定到模板中设置了ref="loginFormRef"的表单组件
  • 通过loginFormRef.value可以访问表单组件实例
const loading = ref(false);

解释

  • 创建响应式的loading状态,初始值为false
  • 控制登录按钮的加载状态
  • 使用ref因为这是一个布尔值(基本类型)
const loginForm = reactive({username: "",password: "",
});

解释

  • 创建响应式的表单数据对象
  • reactive用于对象,因为表单有多个字段
  • 初始化为空字符串,等待用户输入
const rules = {username: [{ required: true, message: "请输入用户名", trigger: "blur" }],password: [{ required: true, message: "请输入密码", trigger: "blur" }],
};

解释

  • 定义表单验证规则
  • required: true:必填项
  • message:验证失败时显示的错误信息
  • trigger: "blur":在输入框失去焦点时触发验证
  • 为什么不用reactive?因为rules不需要响应式,它是静态配置
const handleLogin = async () => {

解释

  • 定义登录处理函数
  • async:声明异步函数,因为内部有异步操作(API调用)
  const valid = await loginFormRef.value.validate();

解释

  • 调用表单组件的validate方法,触发表单验证
  • await:等待验证完成
  • validate()返回布尔值,true表示验证通过
  • .value:访问ref的实际值
  if (!valid) return;

解释

  • 如果验证不通过,直接返回,不执行后续登录逻辑
  • 简洁的防御性编程写法
  loading.value = true;

解释

  • 设置loading为true
  • 按钮会显示加载动画并禁用,防止重复点击
  try {await store.dispatch("login", loginForm);

解释

  • try-catch用于捕获异步操作的错误
  • dispatch:触发Vuex的action
  • “login”:action的名称
  • loginForm:传递给action的参数(用户名和密码)
    ElMessage.success("登录成功");

解释:显示成功提示消息,提升用户体验

    router.push("/");

解释

  • 编程式路由跳转
  • 跳转到根路径(通常是首页/仪表盘)
  } catch (error) {ElMessage.error(error.message || "登录失败");

解释

  • 捕获登录失败的错误
  • 显示错误信息,如果error.message不存在则显示默认文字
  } finally {loading.value = false;}

解释

  • finally块无论成功失败都会执行
  • 重置loading状态,恢复按钮可点击状态

样式部分 (Style)

<style scoped lang="scss">

解释

  • scoped:样式只作用于当前组件,不影响其他组件
  • lang="scss":使用SCSS预处理器,支持嵌套等高级特性
.login-container {height: 100vh;display: flex;justify-content: center;align-items: center;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}

解释

  • height: 100vh:高度占满整个视窗
  • display: flex:使用弹性布局
  • justify-content: center:水平居中
  • align-items: center:垂直居中
  • background: linear-gradient:渐变背景,提升视觉效果

2. Layout.vue - 布局组件详解

模板结构分析

<el-container class="layout-container">

解释

  • Element Plus的布局容器组件
  • 用于创建页面的整体布局结构
  • 可以嵌套header、aside、main、footer等子组件
  <!-- 侧边栏 --><el-aside width="200px" class="sidebar">

解释

  • el-aside:侧边栏组件
  • width="200px":固定宽度200像素
  • 注释帮助理解代码结构
    <div class="logo"><h3>用户管理系统</h3></div>

解释

  • Logo区域,显示系统名称
  • 通常放在侧边栏顶部,作为品牌标识
    <el-menu:default-active="activeMenu"background-color="#304156"text-color="#bfcbd9"active-text-color="#409eff"router>

解释

  • el-menu:菜单组件
  • :default-active="activeMenu":设置默认激活的菜单项
    • activeMenu计算属性返回当前路由路径
  • background-color:菜单背景色
  • text-color:文字颜色
  • active-text-color:激活项的文字颜色
  • router:启用路由模式,点击菜单项会自动跳转
      <el-menu-item index="/dashboard"><el-icon><Odometer /></el-icon><span>仪表盘</span></el-menu-item>

解释

  • index="/dashboard":菜单项对应的路由路径
  • <Odometer />:图标组件
  • 每个菜单项包含图标和文字,提升识别度
      <el-menu-item index="/users" v-if="isAdmin">

解释

  • v-if="isAdmin":条件渲染
  • 只有管理员才能看到用户管理菜单
  • 这是前端的权限控制(注意:真正的权限控制应该在后端)
  <!-- 顶部栏 --><el-header class="header"><div class="header-left"><h4>{{ pageTitle }}</h4></div>

解释

  • {{ pageTitle }}:插值表达式
  • 显示当前页面标题
  • 双花括号用于在模板中显示JavaScript表达式的值
    <el-dropdown @command="handleCommand">

解释

  • 下拉菜单组件
  • @command="handleCommand":监听菜单项点击事件
  • command事件会传递点击项的command值
      <span class="user-info"><el-icon><UserFilled /></el-icon>{{ user.username }}<el-icon><ArrowDown /></el-icon></span>

解释

  • 下拉菜单的触发器
  • 显示用户名和下拉箭头
  • 点击这个区域会展开下拉菜单
      <template #dropdown>

解释

  • 具名插槽语法
  • #v-slot:的简写
  • 定义下拉菜单的内容
        <el-dropdown-item command="profile">个人信息</el-dropdown-item><el-dropdown-item command="logout" divided>退出登录</el-dropdown-item>

解释

  • command:点击时传递给handleCommand的值
  • divided:在项目上方显示分割线

Layout脚本部分

const route = useRoute();
const router = useRouter();

解释

  • useRoute():获取当前路由信息(只读)
  • useRouter():获取路由实例(可跳转)
  • 为什么需要两个?route用于读取信息,router用于操作
const user = computed(() => store.getters.user);

解释

  • computed:计算属性
  • 自动追踪依赖,当store中的user改变时自动更新
  • 为什么用computed而不是直接赋值?保持响应性
const isAdmin = computed(() => store.getters.isAdmin);

解释

  • 计算用户是否为管理员
  • getters是Vuex中的计算属性
const activeMenu = computed(() => route.path);

解释

  • 获取当前路由路径
  • 用于高亮对应的菜单项
const pageTitle = computed(() => route.meta.title || "页面");

解释

  • 从路由元信息获取页面标题
  • ||:逻辑或运算符,提供默认值
const handleCommand = async (command) => {if (command === "profile") {router.push("/profile");} else if (command === "logout") {

解释

  • 处理下拉菜单命令
  • 根据不同的command执行不同操作
    try {await ElMessageBox.confirm("确定要退出登录吗?", "提示", {confirmButtonText: "确定",cancelButtonText: "取消",type: "warning",});

解释

  • 显示确认对话框
  • await等待用户确认
  • 如果用户取消,会抛出异常
      await store.dispatch("logout");router.push("/login");

解释

  • 调用logout action清除用户信息
  • 跳转回登录页
    } catch (error) {// 用户取消}

解释

  • 捕获用户取消的情况
  • 空的catch块,不做任何处理

3. Dashboard.vue - 仪表盘详解

数据统计卡片部分

<el-row :gutter="20">

解释

  • Element Plus的栅格行组件
  • :gutter="20":列之间的间隔为20px
  <el-col :span="6" v-for="item in statsCards" :key="item.title">

解释

  • :span="6":每列占6格(总共24格,所以一行4个)
  • v-for:循环渲染
  • :key:为每个循环项提供唯一标识,帮助Vue优化渲染
<div class="stats-icon" :style="{ backgroundColor: item.color }">

解释

  • :style:动态绑定内联样式
  • 使用对象语法设置背景色

分数分布展示

<el-progressv-for="item in scoreDistribution":key="item.label":text-inside="true":stroke-width="26":percentage="item.percentage":color="item.color"style="margin-bottom: 20px"
>

解释

  • 进度条组件
  • :text-inside="true":文字显示在进度条内部
  • :stroke-width="26":进度条高度
  <template #default="{ percentage }"><span>{{ item.label }}:{{ item.count }}人 ({{ percentage }}%)</span></template>

解释

  • 作用域插槽
  • { percentage }:解构插槽props
  • 自定义进度条内的文字显示

Dashboard脚本部分

const statsCards = ref([{title: "总用户数",value: 0,icon: "User",color: "#409eff",},// ...
]);

解释

  • ref包装数组使其响应式
  • 每个卡片包含标题、值、图标和颜色
const loadDashboardData = async () => {try {const res = await getAllUsers();const users = res.data;

解释

  • 异步加载数据
  • 调用API获取所有用户
    // 计算统计数据statsCards.value[0].value = users.length;

解释

  • 更新响应式数据
  • .value访问ref的值
  • 直接通过索引更新数组元素
    statsCards.value[1].value = users.filter((u) => u.status === 1).length;

解释

  • filter():数组过滤方法
  • 箭头函数(u) => u.status === 1:筛选状态为1的用户
  • .length:获取筛选结果的数量
    const avgScore =users.reduce((sum, u) => sum + (u.score || 0), 0) / users.length;

解释

  • reduce():数组归约方法,累加所有分数
  • (u.score || 0):如果score为null/undefined,使用0
  • 除以用户总数得到平均分
    const distribution = [{ range: [90, 100], index: 0 },{ range: [70, 89], index: 1 },// ...];

解释

  • 定义分数区间映射
  • 每个区间对应scoreDistribution数组的索引
    users.forEach((user) => {const score = user.score || 0;const item = distribution.find((d) => score >= d.range[0] && score <= d.range[1]);if (item) {scoreDistribution.value[item.index].count++;}});

解释

  • forEach:遍历每个用户
  • find():查找分数所属的区间
  • 增加对应区间的计数
    scoreDistribution.value.forEach((item) => {item.percentage = Math.round((item.count / users.length) * 100);});

解释

  • 计算每个区间的百分比
  • Math.round():四舍五入到整数
    recentUsers.value = users.sort((a, b) => new Date(b.createTime) - new Date(a.createTime)).slice(0, 5);

解释

  • sort():排序,最新的在前
  • 日期相减得到时间差,用于排序
  • slice(0, 5):取前5个
onMounted(() => {loadDashboardData();
});

解释

  • 生命周期钩子
  • 组件挂载后立即加载数据

4. UserManagement.vue - 用户管理详解

搜索栏部分

<el-inputv-model="searchForm.username"placeholder="请输入用户名"clearable@clear="handleSearch"@keyup.enter="handleSearch"
>

解释

  • clearable:显示清空按钮
  • @clear:清空时触发搜索(刷新列表)
  • 两个事件让搜索更便捷

文件上传组件

<el-upload:show-file-list="false":before-upload="handleImport"accept=".csv"style="display: inline-block; margin-left: 10px"
>

解释

  • :show-file-list="false":不显示文件列表
  • :before-upload:上传前的钩子函数
  • accept=".csv":只接受CSV文件

数据表格

<el-table:data="tableData"v-loading="loading"stripestyle="width: 100%"
>

解释

  • :data:表格数据源
  • v-loading:显示加载动画
  • stripe:斑马纹样式
<el-table-column prop="status" label="状态" width="100"><template #default="{ row }"><el-switchv-model="row.status":active-value="1":inactive-value="0"@change="handleStatusChange(row)"/></template>
</el-table-column>

解释

  • 自定义列内容
  • { row }:解构获取当前行数据
  • Switch组件直接修改行数据

分页组件

<el-paginationv-model:current-page="pagination.pageNum"v-model:page-size="pagination.pageSize":page-sizes="[10, 20, 50, 100]":total="pagination.total"layout="total, sizes, prev, pager, next, jumper"@size-change="handleSizeChange"@current-change="handleCurrentChange"
/>

解释

  • v-model:current-page:Vue 3的新语法,双向绑定具名参数
  • :page-sizes:每页条数选项
  • layout:分页组件的布局

新增/编辑对话框

<el-dialogv-model="dialogVisible":title="dialogTitle"width="500px"@close="resetForm"
>

解释

  • v-model:控制对话框显示/隐藏
  • :title:动态标题(新增/编辑)
  • @close:关闭时重置表单

UserManagement脚本部分

const getList = async () => {loading.value = true;try {const params = {pageNum: pagination.pageNum,pageSize: pagination.pageSize,};if (searchForm.username) {params.username = searchForm.username;}

解释

  • 构建请求参数
  • 条件性添加搜索参数(如果有搜索关键词)
    const res = await getUserList(params);tableData.value = res.data.list;pagination.total = res.data.total;

解释

  • 更新表格数据和总条数
  • 后端返回分页数据结构
const showEditDialog = (row) => {isEdit.value = true;dialogTitle.value = "编辑用户";Object.assign(userForm, row);dialogVisible.value = true;
};

解释

  • Object.assign():将row的属性复制到userForm
  • 为什么用Object.assign?保持userForm的响应性
const handleDelete = async (row) => {try {await ElMessageBox.confirm(`确定要删除用户 ${row.username} 吗?`,"删除确认",{confirmButtonText: "确定",cancelButtonText: "取消",type: "warning",});

解释

  • 模板字符串:${row.username}嵌入变量
  • 删除前确认,防止误操作
const handleExport = async () => {try {const res = await exportUsersCsv();const url = window.URL.createObjectURL(new Blob([res], { type: "text/csv;charset=utf-8;" }));

解释

  • Blob:二进制大对象,用于文件操作
  • createObjectURL:创建临时URL
    const link = document.createElement("a");link.href = url;link.download = `用户数据_${new Date().getTime()}.csv`;document.body.appendChild(link);link.click();

解释

  • 创建隐形链接触发下载
  • 使用时间戳避免文件名重复
    setTimeout(() => {document.body.removeChild(link);window.URL.revokeObjectURL(url);}, 100);

解释

  • 清理DOM和内存
  • revokeObjectURL:释放URL占用的内存
const handleImport = async (file) => {const formData = new FormData();formData.append("file", file);

解释

  • FormData:用于文件上传
  • 模拟表单的multipart/form-data格式
  return false; // 阻止默认上传行为

解释

  • 返回false阻止el-upload的默认行为
  • 我们已经手动处理了上传

5. Profile.vue - 个人信息详解

密码验证规则

const passwordRules = {confirmPassword: [{validator: (rule, value, callback) => {if (value !== passwordForm.newPassword) {callback(new Error("两次输入密码不一致"));} else {callback();}},trigger: "blur",},],
};

解释

  • 自定义验证器
  • callback():验证通过
  • callback(new Error()):验证失败

密码修改流程

const handleChangePassword = async () => {const valid = await passwordFormRef.value.validate();if (!valid) return;try {await changePassword(currentUser.id, {oldPassword: passwordForm.oldPassword,newPassword: passwordForm.newPassword,});ElMessage.success("密码修改成功,请重新登录");resetPasswordForm();setTimeout(async () => {await store.dispatch("logout");router.push("/login");}, 1500);

解释

  • 验证表单
  • 调用API修改密码
  • 延迟1.5秒后退出
  • 为什么延迟?让用户看到成功提示

关键设计模式和最佳实践

1. 响应式数据选择

  • ref: 用于基本类型(布尔、数字、字符串)
  • reactive: 用于对象和数组
  • computed: 用于派生状态

2. 组件通信

  • Props: 父组件向子组件传递数据
  • Events: 子组件向父组件发送消息
  • Vuex: 跨组件的全局状态管理

3. 异步处理

  • async/await: 更清晰的异步代码
  • try-catch: 错误处理
  • finally: 清理操作

4. 防御性编程

  • 输入验证
  • 空值检查(|| 默认值)
  • 错误边界

5. 用户体验优化

  • Loading状态
  • 操作确认
  • 即时反馈(消息提示)
  • 键盘快捷键

这个系统展示了Vue 3开发的完整流程和最佳实践,是学习现代前端开发的优秀案例。

1. 为什么使用 ref 和 reactive?

// 基本类型用 ref
const loading = ref(false);// 对象用 reactive  
const userForm = reactive({username: "",password: ""
});

原因

  • Vue 3需要知道哪些数据应该被追踪
  • JavaScript原生的数据类型无法被监听变化
  • ref和reactive将普通数据转换为响应式数据
  • 当数据改变时,视图会自动更新

2. 为什么使用 computed?

const isAdmin = computed(() => store.getters.isAdmin);

原因

  • computed会缓存计算结果
  • 只有依赖的数据改变时才重新计算
  • 比方法调用更高效
  • 自动追踪依赖关系

3. 为什么使用 async/await?

const handleLogin = async () => {loading.value = true;try {await store.dispatch("login", loginForm);// 登录成功后的代码} catch (error) {// 错误处理} finally {loading.value = false;}
};

原因

  • 让异步代码看起来像同步代码
  • 避免回调地狱
  • 更容易进行错误处理
  • finally确保loading状态总是被重置

4. 为什么要用 v-model?

<el-input v-model="loginForm.username" />

等价于

<el-input :value="loginForm.username"@input="loginForm.username = $event"
/>

原因

  • 简化双向数据绑定
  • 减少代码量
  • 提高可读性

5. 为什么要用组件化?

每个.vue文件都是一个独立组件:

  • 可复用:组件可以在多个地方使用
  • 可维护:每个组件负责自己的功能
  • 可测试:可以独立测试每个组件
  • 关注点分离:模板、逻辑、样式分离

6. 为什么使用 Vuex 状态管理?

// 不用Vuex - 数据传递困难
// 爷爷组件 -> 父组件 -> 子组件 -> 孙子组件// 使用Vuex - 任何组件都能访问
store.getters.user  // 获取用户信息
store.dispatch("login")  // 触发登录

原因

  • 解决组件间数据共享问题
  • 集中管理应用状态
  • 便于调试和追踪状态变化

7. 为什么要进行表单验证?

const rules = {email: [{ required: true, message: "请输入邮箱", trigger: "blur" },{ type: "email", message: "请输入正确的邮箱地址", trigger: "blur" }]
};

原因

  • 前端验证:即时反馈,提升用户体验
  • 减少无效请求:不合法的数据不发送到后端
  • 安全性:防止恶意输入(但不能只依赖前端验证)

8. 为什么使用 scoped 样式?

<style scoped>
.login-container { }
</style>

原因

  • 样式隔离,避免组件间样式冲突
  • Vue会给元素添加独特的属性,确保样式只作用于当前组件

9. 为什么要使用生命周期钩子?

onMounted(() => {loadDashboardData();
});

原因

  • onMounted:DOM已经渲染完成,可以安全地操作DOM或发起请求
  • 合适的时机:不同的钩子用于不同的场景

10. 为什么要用 try-catch-finally?

try {// 可能出错的代码await apiCall();
} catch (error) {// 错误处理 - 告诉用户出了什么问题ElMessage.error("操作失败");
} finally {// 无论成功失败都执行 - 清理工作loading.value = false;
}

原因

  • 优雅地处理错误
  • 防止应用崩溃
  • 给用户友好的错误提示

💡 初学者常见疑问解答

Q: 为什么有时用 .value,有时不用?

// ref需要.value
const count = ref(0);
count.value++;  // 脚本中需要.value// 模板中自动解包,不需要.value
<template>{{ count }}</template>// reactive不需要.value
const user = reactive({ name: "" });
user.name = "张三";  // 直接访问属性

Q: 为什么箭头函数和普通函数混用?

// 箭头函数 - 简洁,不绑定this
const handleClick = () => { };// 普通函数 - 需要this或arguments时使用
function handleSubmit() { }

Q: v-ifv-show 的区别?

// v-if - 条件性渲染,false时不渲染DOM
<div v-if="isAdmin">管理员内容</div>// v-show - 始终渲染,通过CSS display控制显示
<div v-show="isVisible">切换频繁的内容</div>

Q: 为什么要用 :key

<li v-for="user in users" :key="user.id">
  • Vue使用key来识别节点
  • 帮助Vue高效地更新虚拟DOM
  • 避免渲染错误

这套代码遵循了Vue 3的最佳实践,每一行都有其存在的理由。理解这些"为什么"比记住"怎么写"更重要,这样你才能在自己的项目中灵活运用这些概念。

http://www.xdnf.cn/news/1468927.html

相关文章:

  • 【Linux】系统部分——进程间通信1(管道)
  • 从零到上线:直播美颜SDK中人脸美型功能的技术实现与效果优化
  • 【ARDUINO】ESP8266的AT指令返回内容集合
  • 【教程】快速入门golang
  • (计算机网络)DNS解析流程及两种途径
  • 51单片机-串口通信
  • 系统性学习数据结构-第三讲-栈和队列
  • 通信安全员【单选题】考试题库及答案
  • Android的DTBO详解
  • SQL Server 原生备份与第三方备份:哪个更适合您的组织?
  • 服务器测试网速教程:基于iperf进行测试带宽
  • 基于单片机金属探测器设计
  • 「数据获取」《中国包装业发展研究报告(2008)》
  • 人大金仓:创建数据库分区
  • AI助力决策:告别生活与工作中的纠结,明析抉择引领明智选择
  • 基于单片机老人居家环境健康检测/身体健康检测设计
  • EI会议:第三届大数据、计算智能与应用国际会议(BDCIA 2025)
  • 解释一下roberta,bert-chinese和bert-case有啥区别还有bert-large这些
  • 大基座模型与 Scaling Law:AI 时代的逻辑与困境
  • AAB包转apks转apk
  • docker重启redis报错:iptables failed
  • 边缘计算设备+深度学习辅导
  • 信息系统安全保护措施文件方案
  • Selenium元素定位终极指南:8种方式全面解析+实战代码,告别找不到元素的烦恼!
  • IPD变革,是中国企业实现产品与技术领先之路
  • 使用tomcat本地部署draw.io
  • 项目管理方法与企业战略目标如何对齐
  • VQ-VAE-2:开启高保真多样化图像生成的新范式
  • maven只使用本地仓库依赖
  • Maven常见问题解决方案