前端开发流程与技术选型

目录

一、简介

二、前端职责

三、开发步骤

四、技术选型

五、页面展示


一、简介

做一个网站时,能看到的一切都是前端程序员的工作,负责网页或者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,一经查实,立即删除!

相关文章

【网络安全的神秘世界】文件上传、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;…

手机天线都去哪里了?

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

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…

腾讯云开端口

轻量服务器 由于开发者计划&#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.                        …

算法体系-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;以及…

变长的时间戳设计

以前的时间戳有32位&#xff0c;以秒为单位&#xff0c;231秒≈68年&#xff0c;从1970年开始&#xff0c;到2038年会出问题。 后来出现的时间戳有64位&#xff0c;以纳秒为单位&#xff0c;263纳秒≈292年。 本次设计的变长时间戳&#xff0c;以32比特为单位&#xff0c;总共…

mysql8.0找不到my.ini

报错问题解释&#xff1a; MySQL 8.0 在Windows系统中通常不需要 my.ini 文件&#xff0c;因为安装程序会在 %PROGRAMDATA%\MySQL\MySQL Server 8.0\ &#xff08;通常是 C:\ProgramData\MySQL\MySQL Server 8.0\&#xff09;创建默认的配置文件。如果你的系统中找不到 my.ini…

Qt中利用QTextBrowser控件设计日志窗口

我们一般使用Qt开发应用程序时&#xff0c;都有将控制台窗口去掉。但是&#xff0c;有时候又需要查看一些调试信息&#xff0c;一般的处理方式是把log写到一个文件中。本文介绍一下日志窗口&#xff0c;可以更方便的查看日志信息。 UI设计 推拽UI控件&#xff0c;修改默认背景…

FFmpeg+SDL2实现音视频播放器项目

一、FFmpeg视频解码器 1.视频解码知识 1).纯净的视频解码流程 压缩编码数据->像素数据。 例如解码H.264&#xff0c;就是“H.264码流->YUV”。 2).一般的视频解码流程 视频码流一般存储在一定的封装格式&#xff08;例如MP4、AVI等&#xff09;中。封装格式中通常还…

反转链表(java精简版)

反转一个单向链表。 public class ReversingLinkedList {static class Node {int val;Node next;public Node(int val) {this.val val;}public boolean hasNext() {return next ! null;}}public static void main(String[] args) {//构造Node head null;Node shift null;for…

高效电商数据分析:电商爬虫API与大数据技术的融合应用

一、引言 随着电子商务的迅猛发展和数据量的爆炸式增长&#xff0c;电商数据分析已成为企业决策的关键依据。在竞争激烈的电商市场中&#xff0c;如何高效、准确地获取并分析数据&#xff0c;以洞察市场趋势、优化运营策略、提升用户体验&#xff0c;成为电商企业面临的重要挑…

期货止损口诀需牢记

实战操作难免错&#xff0c;心中不必一团火&#xff1b; 出错认输是常事&#xff0c;亏损不止闯大祸。 止损纪律要定死&#xff0c;价格不能差豪丝&#xff1b; 触及止损要出局&#xff0c;管它价格怎放肆。 强势多空价放宽&#xff0c;价格波动要空间&#xff1b; 大势不改…

【数学】什么是傅里叶级数与傅里叶变换?

傅里叶级数与傅里叶变换 背景 傅里叶级数和傅里叶变换是数学和工程领域中的重要工具&#xff0c;特别是在信号处理、图像处理和物理学中。傅里叶级数用于将周期函数表示为正弦和余弦函数的和&#xff0c;而傅里叶变换用于将任意函数表示为频率的函数。 公式 傅里叶级数&…