前端开发流程与技术选型

目录

一、简介

二、前端职责

三、开发步骤

四、技术选型

五、页面展示


一、简介

做一个网站时,能看到的一切都是前端程序员的工作,负责网页或者app的结构、样式、用户操作网站时的事件逻辑(比如点击一个按钮)。

二、前端职责

前端程序员工作职责:

        ①和产品经理沟通需求,按照产品经理要求完成相应功能。

        ②和UI设计师沟通样式,按照UI设计图还原样式。

        ③和后端协作,对接后端api接口进行调试,进行登录验证,以及根据用户操作数据的增删改查。

三、开发步骤

从0-1开发一个前端项目,我们需要经历11个步骤。

具体步骤有:

其中有几个步骤详细说明一下:

四、技术选型

前端目前主要使用的技术有:

        ①前端运行环境:Node.js(npm是Node.js的官方包管理工具)

        ②框架:Vue、React、Uniapp、微信原生小程序框架、bootstrap、Angular等

        ③结构:HTML

        ④样式:CSS、CSS预处理器(Scss、Less、Stylus)

        ⑤逻辑:JavaScript(ECMAScript、Bom、Dom)

        ⑥代码分布式存储工具:Git、远程库(Gitee、Github、阿里云、腾讯云)

        ⑦打包工具:Webpack、Vite

        ⑧调试工具:Chrome DevTools(谷歌浏览器调试工具,可以调试手机端电脑端)、微信开发者工具(用来调试微信小程序、企业微信小程序、小游戏)

        ⑨兼容性:电脑端(各种尺寸的电脑、各种厂家的浏览器的样式和方法)、手机端(Android、iOS、Harmony等手机系统的差异) 、响应式开发

        ⑩浏览器:谷歌(google chrome)、360、火狐(Firefox)、Microsoft Edge、Safari

五、页面展示

这是一个Web前端页面:

使用Node.js环境、vue框架、Less(CSS预处理器)、谷歌浏览器展示。

这是一个微信小程序页面:

使用Node.js环境、Uniapp框架(vue3版本)、Scss(CSS预处理器)、微信开发者工具展示。

这是相应前端代码:

<template><!-- 左右滑动切换月份 --><view @touchstart="handleTouchStart" @touchend="handleTouchEnd"><view class="titleBox"><view class="title">{{ currentYear }}.{{ currentMonth }}</view></view><view class="week"><view v-for="(item, index) in week" :key="index">{{ item }}</view></view><!-- 日历 --><view class="calendarbBox"><view class="singleDay" v-for="(item, index) in state.currentMonthAllDate" :key="index" @tap="selectedDate(item.date)"><!-- 不是当前月日期 class="dayTextB",如果选中则跳转至所属月份--><text class="dayTextB" v-if="item.month != 'current'">{{ item.number }}</text><!-- 没有选中当前日期class="dayText",选中当前日期class="dayTextA"--><text class="dayTextA" v-if="item.month == 'current' && String(state.currentToday) == String(item.date)">{{ item.number }}</text><text class="dayText" v-if="item.month == 'current' && String(state.currentToday) != String(item.date)">{{ item.number }}</text><!-- 当天有计划+当前日期没有选中的标志 --><view class="point" v-if="item.isPlan"></view><!-- 当前日期选中的标志 --><view class="selectedDayBGColor" v-if="String(state.currentToday) == String(item.date)"></view><!-- 当天有计划+当前日期选中的标志 --><view class="pointA" v-if="String(state.currentToday) == String(item.date) && item.isPlan"></view></view></view><!-- 箭头 ,箭头向下展示周,箭头向上展示月--><view class="arrowBox"><view class="arrowButtonRegion" @tap="changeShowWeekOrMonth">周/月</view></view></view>
</template><script setup>import { reactive, toRefs, computed, onMounted, ref } from 'vue';
import { useStore } from 'vuex';
import { onLoad, onHide } from '@dcloudio/uni-app';const store = useStore();
const state = reactive({week: ['日', '一', '二', '三', '四', '五', '六'],currentYear: '',currentMonth: '',currentToday: '',// 0周日,1周一monthFirstDayCurrentWeek: '',monthFinallyDayCurrentWeek: '',//currentMonthAllDate里面是一个一个的对象 ,对象属性number当前日期,isPlan当天是否有计划,month是否是当前月里面的日期,因为要显示不同的样式。还以根据需要在添加其他属性。currentMonthAllDate: [],lastMonthDateNumber: 0,nextMonthDateNumber: 0,// showMonthOrWeek为true,代表显示周,false显示月showMonthOrWeek: true,currentTodayDate: '',initialX: '',currentMonthNum: ''
});
const {currentMonthNum,initialX,currentTodayDate,showMonthOrWeek,lastMonthDateNumber,nextMonthDateNumber,currentMonthAllDate,week,currentMonth,currentYear,currentToday,monthFirstDayCurrentWeek,monthFinallyDayCurrentWeek
} = toRefs(state);// 今天凌晨
state.currentTodayDate = new Date(new Date(new Date().toLocaleDateString()).getTime());/*** 记录手指触碰初始位置*/
const handleTouchStart = (event) => {state.initialX = event.changedTouches[0].clientX;
};/*** 左右滑动事件*/
const handleTouchEnd = (event, index) => {const currentX = event.changedTouches[0].clientX;if (currentX - state.initialX > 20) {//往右滑动,上个月state.currentTodayDate = state.currentMonth == 1 ? new Date(`${state.currentYear - 1}/12/1`) : new Date(`${state.currentYear}/${state.currentMonthNum - 1}/1`);getAllDatesOfCurrentMonth(state.currentTodayDate);return;}if (state.initialX - currentX > 20) {// 往左滑动,下个月state.currentTodayDate = state.currentMonth == 12 ? new Date(`${state.currentYear + 1}/1/1`) : new Date(`${state.currentYear}/${state.currentMonthNum + 1}/1`);getAllDatesOfCurrentMonth(state.currentTodayDate);return;}
};/*** 选中哪天*/
const selectedDate = (date) => {state.currentTodayDate = date;getAllDatesOfCurrentMonth(state.currentTodayDate);// 下面去后端请求计划数据,并展示
};/*** 切换显示周还是月*/
const changeShowWeekOrMonth = () => {state.showMonthOrWeek = !state.showMonthOrWeek;getAllDatesOfCurrentMonth(state.currentTodayDate);
};/*** 得到当前月份/当前周的所有日期,dateData某天日期*/
const getAllDatesOfCurrentMonth = (dateData) => {state.currentMonthAllDate = [];const today = new Date(dateData);state.currentToday = today;state.currentYear = today.getFullYear();state.currentMonthNum = today.getMonth() + 1;if (today.getMonth() + 1 < 10) {state.currentMonth = '0' + (today.getMonth() + 1);} else {state.currentMonth = today.getMonth() + 1;}// 上个月总天数const lastMonth = new Date(today.getFullYear(), today.getMonth() - 1, 1);state.lastMonthDateNumber = new Date(lastMonth.getFullYear(), lastMonth.getMonth() + 1, 0).getDate();// 下个月总天数const nextMonth = new Date(today.getFullYear(), today.getMonth() + 1, 1);state.nextMonthDateNumber = new Date(nextMonth.getFullYear(), nextMonth.getMonth() + 1, 0).getDate();const dates = [];// 用if,else判断显示周还是月if (state.showMonthOrWeek) {// 显示当前选中日期所在周let day = today.getDay();let startDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - day);let endDate = new Date(today.getFullYear(), today.getMonth(), today.getDate() - day + 6);let currentMonthTwo = today.getMonth() + 1;for (let i = startDate; i <= endDate; ) {let monthFlag = '';if (new Date(i).getMonth() + 1 == currentMonthTwo) {monthFlag = 'current';} else if (new Date(i).getMonth() + 1 > currentMonthTwo) {monthFlag = 'last';} else {monthFlag = 'next';}dates.push(new Date(i));state.currentMonthAllDate.push({ number: i.getDate(), month: monthFlag, date: new Date(i) });i.setDate(i.getDate() + 1);}} else {// 显示当前选中日期所在月const firstDayOfMonth = new Date(today.getFullYear(), today.getMonth(), 1);const lastDayOfMonth = new Date(today.getFullYear(), today.getMonth() + 1, 0);state.monthFirstDayCurrentWeek = firstDayOfMonth.getDay();state.monthFinallyDayCurrentWeek = lastDayOfMonth.getDay();// 补充上个月显示在本月的天数,例如5.1是周三,则周日周一周二显示上个月if (state.monthFirstDayCurrentWeek != 0) {// 判断上个月是不是上一年let isLastYearNumber = lastMonth.getMonth() + 1 == 12 ? 1 : 0;for (let i = 0; i < state.monthFirstDayCurrentWeek; i++) {state.currentMonthAllDate.push({number: state.lastMonthDateNumber - state.monthFirstDayCurrentWeek + 1,month: 'last',date: `${state.currentYear - isLastYearNumber}/${lastMonth.getMonth() + 1}/${state.lastMonthDateNumber - state.monthFirstDayCurrentWeek + 1}`});state.lastMonthDateNumber++;}}for (let i = firstDayOfMonth; i <= lastDayOfMonth; ) {dates.push(new Date(i));state.currentMonthAllDate.push({ number: dates.length, month: 'current', date: new Date(i) });i.setDate(i.getDate() + 1);}if (state.monthFinallyDayCurrentWeek != 6) {// 判断下个月是不是下一年let yearNumber = nextMonth.getMonth() + 1 == 1 ? 1 : 0;for (let i = 0; i < 6 - state.monthFinallyDayCurrentWeek; i++) {state.currentMonthAllDate.push({ number: i + 1, month: 'next', date: `${state.currentYear + yearNumber}/${nextMonth.getMonth() + 1}/${i + 1}` });}}}return dates;
};
getAllDatesOfCurrentMonth(state.currentTodayDate);// 可删除,做了几个假数据,假装几天有计划的,isPlan为true代表当天有计划。
state.currentMonthAllDate[2].isPlan = true;
state.currentMonthAllDate[4].isPlan = true;
state.currentMonthAllDate[0].isPlan = true;
</script><style scoped lang="scss">
.calendarbBox {width: 735rpx;margin-left: 7.5rpx;display: flex;justify-content: space-around;flex-wrap: wrap;.singleDay {width: 105rpx;height: 87rpx;line-height: 87rpx;color: #333;font-size: 32rpx;font-weight: bold;text-align: center;position: relative;.dayText {position: relative;z-index: 9;}.dayTextA {position: relative;z-index: 9;color: #fff;font-size: 32rpx;font-weight: bold;text-align: center;}.dayTextB {position: relative;z-index: 9;color: #e1e1e1;font-size: 32rpx;font-weight: bold;text-align: center;}.point {width: 12rpx;height: 12rpx;background-color: #00b498;position: absolute;top: 65rpx;left: 50%;transform: translate(-50%, 0);border-radius: 50%;}.selectedDayBGColor {width: 87rpx;height: 87rpx;background-color: #00b498;border-radius: 50%;position: absolute;top: 0;left: 9rpx;}.pointA {width: 12rpx;height: 12rpx;background-color: #fff;position: absolute;top: 65rpx;left: 50%;transform: translate(-50%, 0);border-radius: 50%;}}
}
.transitionTime {transition: transform 0.5s;
}
.arrowBox {width: 750rpx;height: 109rpx;line-height: 109rpx;position: relative;.arrowButtonRegion {width: 100rpx;height: 50rpx;line-height: 50rpx;@include fsc();position: absolute;left: 50%;top: 50%;transform: translate(-50%, -50%);background-color: #00b488;border-radius: 10rpx;color: #fff;font-size: 28rpx;text-align: center;}
}
.titleBox {width: 750rpx;height: 92rpx;background-color: #fff;position: relative;padding-bottom: 60rpx;.title {position: absolute;left: 30rpx;top: 25rpx;color: #333;font-size: 53rpx;font-weight: bold;text-align: left;}
}
.week {width: 750rpx;height: 39rpx;color: #999;font-size: 32rpx;font-weight: bold;text-align: left;display: flex;justify-content: space-around;margin-left: 7.5rpx;margin-bottom: 49rpx;
}
</style>

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

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

相关文章

2024广东省职业技能大赛云计算赛项实战——容器云平台搭建

容器云平台搭建 前言 容器镜像使用的是斗学培训平台提供的镜像包&#xff0c;这东西网上都没有&#xff0c;一堆人要&#xff0c;我是靠自己想的方法获取到了&#xff0c;也不敢给。你们可以通过在这个网站申请环境进行操作https://ncc.douxuedu.com/ 虚拟机使用的是自行创建…

分类算法和回归算法区别

分类算法和回归算法在机器学习中扮演着不同的角色&#xff0c;它们的主要区别体现在输出类型、应用场景以及算法目标上。以下是对两者区别和使用场景的详细分析&#xff1a; 一、区别 1.输出类型&#xff1a; 分类算法&#xff1a;输出是离散的类别标签&#xff0c;通常表示为…

【网络安全的神秘世界】文件上传、JBOSS、Struct漏洞复现

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 攻防环境搭建及漏洞原理学习 Kali安装docker 安装教程 PHP攻防环境搭建 中间件介绍 介于应用系统和系统软件之间的软件。…

class的流光效果

效果图&#xff1a; 代码示例 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title&g…

链表OJ

GDUFE 在期末前再刷一次链表题 ~ 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* removeElements(struct ListNode* head, int …

学习笔记——网络管理与运维——SNMP(SNMP版本)

二、SNMP版本 1、SNMP版本 SNMP共有三个版本&#xff1a;SNMPv1、SNMPv2c和SNMPv3。 (1)SNMPv1 1990年5月&#xff0c;RFC1157定义了SNMP的第一个版本SNMPv1。RFC1157提供了一种监口控和管理计算机网络的系统方法。SNMPv1基于团体名认证&#xff0c;安全性较差&#xff0c;…

快速编译安装tensorrt_yolo

快速编译安装 安装 tensorrt_yolo 通过 PyPI 安装 tensorrt_yolo 模块&#xff0c;您只需执行以下命令即可&#xff1a; pip install -U tensorrt_yolo 如果您希望获取最新的开发版本或者为项目做出贡献&#xff0c;可以按照以下步骤从 GitHub 克隆代码库并安装&#xff1a; …

手机天线都去哪里了?

在手机的演变历程中&#xff0c;天线的设计和位置一直是工程师们不断探索和创新的领域。你是否好奇&#xff0c;现在的手机为什么看不到那些曾经显眼的天线了呢&#xff1f; 让我们一起揭开这个谜题。 首先&#xff0c;让我们从基础开始&#xff1a;手机是如何发出电磁波的&…

WDF驱动开发-中断处理(三)

使用中断唤醒设备 当设备转换为低功耗状态时&#xff0c;框架会断开连接 (或报告为非活动) 用于 I/O 处理的中断。 从在 Windows 8.1 上运行的 KMDF 1.13 和 UMDF 2.0 开始&#xff0c;WDF 驱动程序可以创建一个框架中断对象&#xff0c;该对象在设备转换为低功耗状态时保持活…

【QT】实现无边框窗口+可拖动+可调整大小

QT无边框 // 在widget构造中添加如下即可实现无边框 setWindowFlags(Qt::FramelessWindowHint); //设置无边框可拖动 当实现无边框之后&#xff0c;你会发现无法拖动了。 或许我们需要了解下窗口是怎么被拖动的 通过标题栏拖动窗口move窗口位置 因此有两种方案可以解决无法…

Redis—String数据类型及其常用命令详解

文章目录 Redis概述1.Redis-String数据类型概述2.常用命令2.1 SET&#xff1a;添加或者修改已经存在的一个String类型的键值对2.2 GET&#xff1a;根据key获取String类型的value2.3 MSET&#xff1a;批量添加多个String类型的键值对2.4 MGET&#xff1a;根据多个key获取多个Str…

CDN缓存命中率较低可能的原因

背景&#xff1a; 网站使用CDN加速以后&#xff0c;大部分静态文件都将会被离用户较近的CDN边缘节点缓存&#xff0c;由此起到访问加速效果。如果用户访问的文件由CDN节点直接响应&#xff0c;无需回源&#xff0c;则称之为缓存命中。CDN缓存命中率越高&#xff0c;也就意味着…

腾讯云开端口

轻量服务器 由于开发者计划&#xff0c;这些腾讯云 阿里云什么的小vps&#xff0c;是非常之便宜&#xff0c;甚至到了白送的地步&#xff08;小阿&#xff09;&#xff0c;但是作为一个web安全学习者必要的vps操作还是要会的 开启端口 腾讯云的轻量服务器是没有安全组的&…

【服务器02】之阿里云平台

百度一下阿里云官网 点击注册直接使用支付宝注册可以跳过认证 成功登录后&#xff0c;点击产品 点击免费试用 点击勾选 选一个距离最近的 点满GB 注意&#xff1a;一般试用的时用的是【阿里云】&#xff0c;真正做项目时用的是【腾讯云】 现在开始学习使用&#xff1a; 首先…

排序方法——《归并排序》

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …

如何使用LangChain自定义agent的制作(1) - 自定义一个可以执行 SQL 查询的 Agent

文章目录 前言一、准备工作梳理一、 安装依赖包二、 设置数据库连接三、 自定义 Agent四、 运行示例五、 完整代码六、使用agent的好处1. **模块化和可重用性**2. **扩展性**3. **简化复杂性**4. **增强可维护性**5. **集成大语言模型的能力**6. **易于扩展到其他任务** 继续思…

Web前端期末项目报告:探索、实践与反思

Web前端期末项目报告&#xff1a;探索、实践与反思 随着Web技术的不断发展&#xff0c;前端开发在软件开发中扮演着越来越重要的角色。本次期末项目&#xff0c;我们致力于构建一个功能完善、用户体验优良的Web应用&#xff0c;以实践所学知识&#xff0c;提升技能水平。接下来…

算法体系-23 第二十三节:暴力递归到动态规划(五)

一 求K次打击之后&#xff0c;英雄把怪兽砍死的概率 1.1 描述 给定3个参数&#xff0c;N&#xff0c;M&#xff0c;K 怪兽有N滴血&#xff0c;等着英雄来砍自己 英雄每一次打击&#xff0c;都会让怪兽流失[0~M]的血量 到底流失多少&#xff1f;每一次在[0~M]上等概率的获得一个…

搭建预约咨询小程序,高效便捷新选择

一、预约咨询小程序是什么&#xff1f; 预约咨询小程序是一款适用于各种生活场景包括医疗、保洁、宠物护理、法律等方面的预约咨询类小程序。 二、这款小程序有什么亮点优势&#xff1f; 预约咨询小程序适用场景广泛&#xff0c;无论是心理咨询、法律咨询&#xff0c;还是宠物…

让图片开口说话的模型Hallo: 基于音频驱动的肖像图像动画,精准唇形同步,支持多种语言和风格

前言 让静态的图片“开口说话”&#xff0c;一直是人们对人工智能的期待。近年来&#xff0c;随着深度学习技术的发展&#xff0c;音频驱动的肖像图像动画技术取得了长足的进步。各种模型涌现&#xff0c;但如何实现精准的唇形同步、保持视频的真实感和流畅性&#xff0c;以及…