我的前端学习之旅 - Day1: SwiftShare项目搭建

59 阅读3分钟

我的前端学习之旅 - Day1: SwiftShare项目搭建

项目背景

作为一个转行前端的新手,我制定了30天学习计划,目标是完成一个完整的视频分享平台项目。选择这个项目是因为它涵盖了前端开发的核心技术,同时结合了我的兴趣爱好,将对Taylor Swift的喜爱融入项目中,让学习过程变得更加有趣和有意义。

技术栈选择

  • Vue3 - 最新的前端框架,组合式API更简洁
  • Element Plus - 成熟的UI组件库,快速构建界面
  • Vue Router - 路由管理,实现单页应用
  • Vuex - 状态管理,管理全局数据
  • Axios - 网络请求库,与后端API交互

项目特色

  • 🎵 霉霉主题设计
  • 💕 Swiftie社区元素
  • 🚀 现代化技术栈
  • 📱 响应式布局

详细步骤

1. 环境搭建

# 安装Node.js 16.16.0
# 安装Vue CLI
npm install -g @vue/cli

# 创建项目
vue create swift-share

2. 项目创建

选择配置:

  • Vue 3
  • Router
  • Vuex
  • ESLint + Prettier

3. 依赖安装

npm install element-plus @element-plus/icons-vue
npm install axios video.js echarts spark-md5

4. 基础配置

main.js配置
import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import axios from 'axios'
import router from './router'
import store from './store'
import './assets/css/base.css'

const app = createApp(App)

// 全局配置
app.config.globalProperties.$axios = axios
app.use(ElementPlus, { locale: zhCn })

// 注册所有图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
    app.component(key, component)
}

app.use(store)
app.use(router)
app.mount('#app')

5. 网络请求工具

utils/request.js
import axios from 'axios'
import { ElMessage } from 'element-plus'

const request = axios.create({
    baseURL: process.env.VUE_APP_API_URL || 'http://localhost:8080/api',
    timeout: 10000,
    headers: {
        'Content-Type': 'application/json'
    }
})

// 请求拦截器
request.interceptors.request.use(
    config => {
        console.log('发送请求:', config.method.toUpperCase(), config.url)
        
        const token = localStorage.getItem('token')
        if (token) {
            config.headers.Authorization = `Bearer ${token}`
        }
        
        return config
    },
    error => {
        console.error('请求错误:', error)
        return Promise.reject(error)
    }
)

// 响应拦截器
request.interceptors.response.use(
    response => {
        console.log('收到响应:', response.config.url, response.data)
        
        const { code, message, data } = response.data
        
        if (code === 200 || code === undefined) {
            return data || response.data
        } else {
            ElMessage.error(message || '请求失败')
            return Promise.reject(new Error(message || '请求失败'))
        }
    },
    error => {
        console.error('响应错误:', error)
        
        if (error.response) {
            const { status, data } = error.response
            
            switch (status) {
                case 401:
                    ElMessage.error('未授权,请重新登录')
                    localStorage.removeItem('token')
                    window.location.href = '/login'
                    break
                case 403:
                    ElMessage.error('权限不足')
                    break
                case 404:
                    ElMessage.error('请求的资源不存在')
                    break
                case 500:
                    ElMessage.error('服务器内部错误')
                    break
                default:
                    ElMessage.error(data.message || '请求失败')
            }
        } else if (error.request) {
            ElMessage.error('网络错误,请检查网络连接')
        } else {
            ElMessage.error('请求配置错误')
        }
        
        return Promise.reject(error)
    }
)

export default request

6. API模块设计

api/user.js
import request from '@/utils/request'

export const userApi = {
    // 用户登录
    login(data) {
        return request({
            url: '/user/login',
            method: 'post',
            data
        })
    },
    
    // 用户注册
    register(data) {
        return request({
            url: '/user/register',
            method: 'post',
            data
        })
    },
    
    // 获取用户信息
    getUserInfo() {
        return request({
            url: '/user/info',
            method: 'get'
        })
    },
    
    // 更新用户信息
    updateUserInfo(data) {
        return request({
            url: '/user/info',
            method: 'put',
            data
        })
    }
}

7. GitHub部署

# 初始化Git仓库
git init

# 配置用户信息
git config --global user.email "your-email@example.com"
git config --global user.name "Your Name"

# 提交代码
git add .
git commit -m "Day1: SwiftShare项目初始化和基础配置"

# 推送到GitHub
git remote add origin https://github.com/your-username/swift-share.git
git branch -M main
git push -u origin main

遇到的问题和解决方案

1. Node.js版本兼容性

问题: 使用Node.js v22.17.0,某些包不兼容 解决: 忽略警告,项目能正常运行

2. ESLint规则配置

问题: 组件名必须是多词 解决: 暂时禁用规则,专注于功能开发

3. Git用户信息设置

问题: 首次提交需要配置用户信息 解决: 设置全局用户名和邮箱

学习心得

1. 学习策略

  • 先复制再理解:不要因为不懂语法而停滞
  • 实践为主:多动手,少空想
  • 遇到问题就问:不要卡在一个地方太久

2. 技术收获

  • 掌握了Vue3项目创建流程
  • 理解了Element Plus的配置
  • 学会了Axios的封装
  • 了解了Git版本控制

3. 项目经验

  • 项目结构设计的重要性
  • 模块化开发的好处
  • 错误处理的重要性
  • 文档记录的必要性

项目截图

image.png

clickme.gif

明日计划

Day2: 路由配置和基础布局

  • 完善路由系统
  • 创建基础布局组件
  • 实现导航栏
  • 添加页面组件

总结

Day1的学习让我对前端开发有了更清晰的认识。虽然还有很多不懂的地方,但通过实践,我逐渐理解了项目的整体架构和开发流程。

关键收获:

  • 技术栈的选择和配置
  • 项目结构的组织
  • 开发工具的使用
  • 问题解决的方法

期待Day2的学习!


GitHub地址: github.com/EveKoo/swif…

技术标签: #Vue3 #Element Plus #前端开发 #学习记录 #SwiftShare