【Vue 3】使用 <script setup> 实现常见网站功能

news2024/10/23 16:15:36

文章目录

  • 1. 用户管理
    • 1.1 用户注册和登录
  • 2. 数据管理(增删改查)
    • 2.1 CRUD 操作
  • 3. 文件管理
    • 3.1 文件上传示例:`FileUpload.vue`
  • 4. 消息通知系统
    • 4.1 消息通知示例
  • 5. 复杂表单处理
    • 5.1 多步骤表单示例:`MultiStepForm.vue`
  • 6. 权限管理
    • 6.1 权限控制逻辑示例
  • 7. 社交功能
    • 7.1 点赞功能示例:`LikeButton.vue`


在 Vue 3 的 <script setup> 中实现常见的网站用到的业务:

  1. 用户管理:用户注册、登录、权限控制、个人信息管理。
  2. 数据管理:增删改查(CRUD)操作、分页、搜索、过滤等。
  3. 文件管理:文件上传、预览、下载。
  4. 消息通知系统:发送消息、通知中心、实时更新。
  5. 复杂表单处理:多步骤表单、表单验证、表单数据预填充。
  6. 权限管理:基于用户角色的访问控制。
  7. 社交功能:点赞、评论、关注等。

1. 用户管理

用户管理是每个网站必不可少的部分,我们会实现用户的注册、登录、权限控制,以及个人信息的管理。

1.1 用户注册和登录

登录页面示例:Login.vue

<template>
  <div class="login-container">
    <el-form :model="form" ref="formRef">
      <el-form-item label="Email">
        <el-input v-model="form.email" />
      </el-form-item>
      <el-form-item label="Password">
        <el-input type="password" v-model="form.password" />
      </el-form-item>
      <el-button type="primary" @click="handleLogin">Login</el-button>
    </el-form>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import axios from 'axios';
import { useRouter } from 'vue-router';

const form = ref({
  email: '',
  password: ''
});

const formRef = ref(null);
const router = useRouter();

const handleLogin = async () => {
  try {
    const response = await axios.post('/api/login', form.value);
    // 假设 API 返回一个用户 token
    const { token } = response.data;

    // 存储 token (可以用 VueCookies 或 LocalStorage)
    localStorage.setItem('userToken', token);

    // 跳转到主页
    router.push('/');
  } catch (error) {
    console.error('Login failed:', error);
  }
};
</script>

<style scoped>
.login-container {
  max-width: 400px;
  margin: auto;
}
</style>
  • 登录表单:使用 Element Plus 创建表单。
  • handleLogin:通过 axios 发起登录请求,获取用户 token 并存储到 localStorage 中。
  • 路由跳转:登录成功后,使用 useRouter 跳转到主页。

2. 数据管理(增删改查)

2.1 CRUD 操作

以产品管理为例,展示如何实现产品的增删改查功能。

产品管理页面:ProductList.vue

<template>
  <el-table :data="products" style="width: 100%">
    <el-table-column prop="id" label="ID" width="50"></el-table-column>
    <el-table-column prop="name" label="Name"></el-table-column>
    <el-table-column prop="price" label="Price"></el-table-column>
    <el-table-column label="Actions" width="150">
      <template #default="{ row }">
        <el-button type="primary" @click="editProduct(row)">Edit</el-button>
        <el-button type="danger" @click="deleteProduct(row.id)">Delete</el-button>
      </template>
    </el-table-column>
  </el-table>
  <el-button type="success" @click="addProduct">Add Product</el-button>

  <ProductDialog :visible="dialogVisible" :product="selectedProduct" @close="fetchProducts" />
</template>

<script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';
import ProductDialog from './ProductDialog.vue';

const products = ref([]);
const dialogVisible = ref(false);
const selectedProduct = ref(null);

// 获取产品列表
const fetchProducts = async () => {
  try {
    const response = await axios.get('/api/products');
    products.value = response.data;
  } catch (error) {
    console.error('Error fetching products:', error);
  }
};

// 新增产品
const addProduct = () => {
  selectedProduct.value = null;
  dialogVisible.value = true;
};

// 编辑产品
const editProduct = (product) => {
  selectedProduct.value = product;
  dialogVisible.value = true;
};

// 删除产品
const deleteProduct = async (id) => {
  try {
    await axios.delete(`/api/products/${id}`);
    fetchProducts();
  } catch (error) {
    console.error('Error deleting product:', error);
  }
};

onMounted(fetchProducts);
</script>
  • fetchProducts:获取产品列表并更新 products 数据。
  • addProducteditProduct:控制对话框打开,并传递对应的产品数据。
  • deleteProduct:根据产品 id 删除产品。

3. 文件管理

文件上传和下载是常见的功能之一,例如用户上传头像或文件。

3.1 文件上传示例:FileUpload.vue

<template>
  <el-upload
    action="/api/upload"
    :on-success="handleUploadSuccess"
    :headers="uploadHeaders"
    :file-list="fileList"
  >
    <el-button slot="trigger" type="primary">Upload File</el-button>
  </el-upload>
</template>

<script setup>
import { ref } from 'vue';

const fileList = ref([]);
const token = localStorage.getItem('userToken');

const uploadHeaders = {
  Authorization: `Bearer ${token}`
};

const handleUploadSuccess = (response, file, fileList) => {
  console.log('File uploaded successfully:', response);
};
</script>
  • el-upload:使用 Element Plus 的上传组件。
  • 上传文件成功:通过 handleUploadSuccess 方法处理上传后的反馈。
  • Authorization:传递用户的 token 以确保用户有权限上传文件。

4. 消息通知系统

消息通知功能是一个现代应用不可或缺的部分。

4.1 消息通知示例

使用 WebSocket 实现实时消息通知:

<script setup>
import { ref, onMounted, onUnmounted } from 'vue';

const notifications = ref([]);
let socket;

onMounted(() => {
  // 建立 WebSocket 连接
  socket = new WebSocket('ws://example.com/notifications');

  // 收到消息时处理
  socket.onmessage = (event) => {
    notifications.value.push(JSON.parse(event.data));
  };
});

onUnmounted(() => {
  // 组件卸载时关闭 WebSocket 连接
  socket.close();
});
</script>

<template>
  <el-notification
    v-for="(note, index) in notifications"
    :key="index"
    :title="note.title"
    :message="note.message"
    type="info"
  />
</template>
  • WebSocket:用于接收来自服务器的实时通知。
  • onMountedonUnmounted:管理 WebSocket 的连接和断开。

5. 复杂表单处理

复杂表单通常包含多个步骤或输入项。

5.1 多步骤表单示例:MultiStepForm.vue

<template>
  <div>
    <div v-if="step === 1">
      <el-form :model="formStep1">
        <el-form-item label="Username">
          <el-input v-model="formStep1.username" />
        </el-form-item>
      </el-form>
      <el-button @click="nextStep">Next</el-button>
    </div>
    <div v-else-if="step === 2">
      <el-form :model="formStep2">
        <el-form-item label="Email">
          <el-input v-model="formStep2.email" />
        </el-form-item>
      </el-form>
      <el-button @click="prevStep">Previous</el-button>
      <el-button @click="submitForm">Submit</el-button>
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue';

const step = ref(1);
const formStep1 = ref({
  username: ''
});
const formStep2 = ref({
  email: ''
});

const nextStep = () => {
  step.value++;
};

const prevStep = () => {
  step.value--;
};

const submitForm = () => {
  console.log('Form Submitted:', {
    ...formStep1.value,
    ...formStep2.value
  });
};
</script>
  • 多步骤表单:通过 step 的值来控制显示的步骤页面。
  • nextStepprevStep:用于导航表单步骤。

6. 权限管理

6.1 权限控制逻辑示例

<script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router';

const router = useRouter();
const userRole = ref(localStorage.getItem('userRole') || 'guest');

const isAdmin = userRole.value === 'admin';

if (!isAdmin) {
  router.push('/login');
}
</script>
  • 用户角色管理:通过判断用户角色来控制权限。
  • 路由跳转:如果用户不是管理员,则重定向到登录页面。

7. 社交功能

7.1 点赞功能示例:LikeButton.vue

<template>
  <el-button :type="liked ? 'danger' : 'primary'" @click="toggleLike">
    {{ liked ? 'Unlike' : 'Like' }} ({{ likesCount }})
  </el-button>
</template>

<script setup>
import { ref } from 'vue';

const likesCount = ref(100);
const liked = ref(false);

const toggleLike = () => {
  liked.value = !liked.value;
  liked.value ? likesCount.value++ : likesCount.value--;
};
</script>
  • 点赞逻辑:控制 liked 状态和 likesCount 计数来实现点赞和取消点赞的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Apache Hive 帮助文档

Apache Hive 帮助文档 由于教学需要&#xff0c;本文主要介绍 hive 的 基础 和 哪里可以看帮助文档的介绍&#xff0c; 是一篇对帮助文档整理的文章 官方网站 文章目录 Apache Hive 帮助文档什么是 Hive&#xff1f;Hive 下载Hive帮助文档 什么是 Hive&#xff1f; Apache Hi…

ComfyUI 即将发布桌面版,更新内容前瞻

就在昨天&#xff0c;ComfyUI 宣布即将发布桌面版&#xff0c;一下是官方的介绍 官网发布页&#xff1a;https://blog.comfy.org/comfyui-v1-release/ 完全打包的桌面版本 在过去的两个月里&#xff0c;我们一直在努力为 ComfyUI 提供无缝的桌面体验。我们的目标是确保非技术…

Python教程:制作贪吃蛇游戏存以exe文件运行

Python&#xff0c;作为一种解释型、面向对象、动态数据类型的高级程序设计语言&#xff0c;其简洁易懂的语法和丰富的库使得它成为开发小游戏的理想选择。 下面&#xff0c;我们就来一步步教大家如何用Python制作一个贪食蛇小游戏&#xff0c;并将其打包成exe程序&#xff0c…

活体人脸识别技术总结及实践

文章目录 1、背景2、人脸反伪装技术2.1 活体人脸识别常见模式2.2 学术上反伪装研究 3、工程实现3.1 Silent-Face3.2 Silent-Face模型转rknn3.3 Silent-Face模型的限制 1、背景 1.1 什么是活体检测&#xff1f; 在人脸识别之前&#xff0c;先判断一下屏幕前摄像头捕捉到的人脸是…

【Golang】Gin框架中如何定义路由

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

计算机网络:数据链路层 —— 无线局域网 WLAN

文章目录 局域网无线局域网 WLAN802.11 无线局域网802.11无线局域网的组成WLAN 的组成有固定基础设施的802.11无线局域网漫游服务 无固定基础设施的802.11无线局域网 802.11无线局域网的物理层802.11无线局域网的数据链路层不使用碰撞检测 CD 的原因CSMA/CA 协议CSMA/CA 协议的…

新探索研究生英语读写教程pdf答案(基础级)

《新探索研究生英语读写教程》的设计和编写充分考虑国内研究生人才培养目标和研究生公共英语的教学需求&#xff0c; 教学内容符合研究生认知水平&#xff0c; 学术特征突出&#xff1b;教学设计紧密围绕学术阅读、学术写作和学术研究能力培养&#xff1b;教学资源立体多元&…

阀井燃气监控仪-燃气阀门井数据远程监测设备-旭华智能

在城市的地下&#xff0c;有无数条看不见的生命线——那是为千家万户输送温暖与光明的燃气管线。然而&#xff0c;在这复杂的网络之下&#xff0c;隐藏着不可预知的风险。为了保障每一位市民的安全&#xff0c;我们推出了一款革命性的产品——“智安卫士”可燃气体监测终端。 随…

Python字符串处理深度解析:高级操作技巧、性能优化与实用案例全解

文章目录 前言&#x1f497;一、字符串的定义与特点&#x1f498;1.1 字符串的定义1.1.1 单引号和双引号的字符串定义&#xff1a;1.1.2 三引号定义多行字符串&#xff1a; &#x1f498;1.2 特点&#xff1a;&#x1f498;1.3 字符串是序列小结&#xff1a; &#x1f497;二、…

软件设计模式------抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff0c;又称Kit模式&#xff0c;属于对象创建型模式。 一&#xff1a;先理解两个概念&#xff1a; &#xff08;1&#xff09;产品等级结构&#xff1a; 即产品的继承结构。 通俗来讲&#xff0c;就是不同品…

【计算机网络 - 基础问题】每日 3 题(四十九)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

如何通过智能T0算法增加持仓收益?

第一&#xff1a;什么是智能T0算法&#xff1f;什么是智能T0算法&#xff1f;简单来说&#xff0c;就是基于用户原有的股票持仓&#xff0c;针对同一标的&#xff0c;配合智能T0算法&#xff0c;每天全自动操作&#xff0c;高抛低吸&#xff0c;抓取行情波动价差。操作后每日持…

MySQL的安装(windows,Centos,ubuntu)

目录 在Windows下安装MySQL数据库 在Centos下安装MySQL数据库 在ubuntu下安装MySQL数据库 在Windows下安装MySQL数据库 安装程序的下载地址: https://dev.mysql.com/downloads/ 点击之后就会出现下面的页面 接下来根据安装提示进行操作即可 在Centos下安装MySQL数据库 1.确认…

VMware中Ubuntu安装

VMware官网&#xff1a;https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion 先在官网下载VMware&#xff0c;一直根据默认点下一步就好了&#xff0c;记得更改安装地址哦&#xff0c;否则默认下在C盘里。 先下载好Ubuntu映像文件&#xff1a;https://…

No.18 笔记 | XXE(XML 外部实体注入)漏洞原理、分类、利用及防御整理

一、XXE 漏洞概述 &#xff08;一&#xff09;定义 XXE&#xff08;XML 外部实体注入&#xff09;漏洞源于 XML 解析器对外部实体的不当处理&#xff0c;攻击者借此注入恶意 XML 实体&#xff0c;可实现敏感文件读取、远程命令执行和内网渗透等危险操作。 &#xff08;二&am…

[含文档+PPT+源码等]精品基于Nodejs实现的水果批发市场管理系统的设计与实现

基于Node.js实现的水果批发市场管理系统的设计与实现背景&#xff0c;可以从以下几个方面进行阐述&#xff1a; 一、行业背景与市场需求 水果批发市场的重要性&#xff1a; 水果批发市场作为农产品流通的重要环节&#xff0c;承载着从生产者到消费者之间的桥梁作用。它的运营效…

传统园区与智慧园区:现代化发展的差异和优势

传统园区和智慧园区代表着城市发展不同阶段的产物&#xff0c;两者在功能、管理、环境等多个方面存在显著差异。通过对传统园区和智慧园区进行对比&#xff0c;可以清晰地看到智慧园区的诸多优势所在。 1. 功能对比&#xff1a; 传统园区通常以简单的生产、办公和商业为主要功…

1.深入理解MySQL索引底层数据结构与算法

文章目录 索引的概念数据结构二叉树红黑树B-B两者的区别 Hash 引擎数据所在位置对应关系MyISAMInnoDB 索引主键聚集索引非聚集索引联合索引 如有写的不对的请指正。 索引的概念 索引是帮助MySQL高效获取数据的排好序的数据结构 数据结构 网址&#xff1a; https://www.cs.us…

Kafka-设计思想-2

一、消息传递语义 现在我们对生产者和消费者的工作方式有了一些了解&#xff0c;让我们讨论一下Kafka在生产者和消费者之间提供的语义保证。 1、最多发送一次&#xff1a;会造成数据丢失 2、至少发送一次&#xff1a;会造成数据重复消费 3、只发送一次&#xff1a;我们想要的效…

MDB收款适配器MDBPOS

LETPOS精简版MDBPOS&#xff08;直接连接MDB协议的刷卡器&#xff0c;按照设定价格收款&#xff0c;输出脉冲&#xff09; 通过串口设定价格&#xff0c;脉冲宽度。 有人刷卡&#xff0c;扣款成功&#xff0c;输出脉冲&#xff0c;使用简单 适合把MDB协议的刷卡器连接到脉冲投…