跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 卖家故事 > 前端综合实训

前端综合实训

时间:2024-04-09 13:45:32 来源:网络cs 作者:康由 栏目:卖家故事 阅读:

标签: 综合 
阅读本书更多章节>>>>

Ⅰ.项目介绍

1.1项目概述

慕尚花坊是⼀款同城鲜花订购 的小程序,项目常用功能模块分为项目首页、商品分类、商品列表、商品详情、用户管理、收货地址、购物车、结算支付和订单管理等等。

1.2项目技术栈

小程序内置组件:采用小程序内置组件,结合 Vant 组件库实现⻚⾯结构的搭建。

项⽬中使⽤了 css 拓展语言 Scss 绘制页面的结构。

小程序内置API:交互、支付、文件上传、地图定位、网络请求、预览图片、本地存储等。

小程序分包加载:降低⼩程序的启动时间、包的体积,提升⽤户体验度。

小程序组件开发:将页面内的功能模块抽象成⾃定义组件,实现代码的复⽤。

网络请求封装:request 方法封装、快捷⽅式封装、响应拦截器、请求拦截器。

骨架屏组件:利⽤开发者⼯具提供了⾃动⽣成⻣架屏代码的能力,提⾼了整体使用体验和用户满意 度。

UI 组件库:使用 Vant 组件库实现小程序 结构的绘制。 

LBS :使⽤腾讯地图服务进行 LBS逆地址解析,实现选择收货地址功能。

miniprogram-licia :使用 licia 进行函数的防抖节流。

async-validator :使用async-validator 实现表单验证。

miniprogram-computed : 使用 miniprogram-computed 进行计算属性功能。

mobx-miniprogram :使用 mobx-miniprogram 进行项目状态的管理。

Ⅱ.项目初始化

1.1项目创建

1.2项目目录

1.3自定义构建

⾸先在project.config.json 配置 miniprogramRoot 选项,指定⼩程序源码的⽬录。

然后配置 project.config.json 的 setting.packNpmManually 为 true。

初始化项目,在内建终端打开

packageJsonPath 表示 node_modules 源对应的 package.json 

miniprogramNpmDistDir 表示 node_modules 的构建结果⽬标位置

安装 vant ,然后进⾏ npm 构建,测试是否能够正常 vant 构建成功。

1.4 scss集成

在 project.config.json ⽂件中,修改 setting 下的 useCompilerPlugins 字段为 scss,即可开 启⼯具内置的 scss 编译插件。

Ⅲ.构建项目界面

1.1项目整体框架

assets⽂件导⼊ 配置app.json⽂件

{  "pages": [    "pages/category/category",    "pages/index/index",        "pages/cart/cart",    "pages/my/my"  ],  "window": {    "navigationBarTextStyle": "white",    "navigationBarTitleText": "幕尚花坊",    "navigationBarBackgroundColor": "#FF734C"  },  "tabBar": {    "color": "#252933",    "selectedColor": "#FF734C",    "backgroundColor": "#ffffff",    "borderStyle":"black",    "list": [      {        "pagePath": "pages/index/index",        "text": "首页",        "iconPath": "assets/tabbar/index.png",        "selectedIconPath": "assets/tabbar/index-active.png"      },      {        "pagePath": "pages/category/category",        "text": "分类",        "iconPath": "assets/tabbar/cate.png",        "selectedIconPath": "assets/tabbar/cart-active.png"      },      {        "pagePath": "pages/cart/cart",        "text": "购物车",        "iconPath": "assets/tabbar/cart.png",        "selectedIconPath": "assets/tabbar/cate-active.png"      },      {        "pagePath": "pages/my/my",        "text": "我的",        "iconPath": "assets/tabbar/index.png",        "selectedIconPath": "assets/tabbar/my-active.png"      }    ]  },  "sitemapLocation": "sitemap.json",  "lazyCodeLoading": "requiredComponents",  "usingComponents": {    "van-button": "@vant/weapp/button/index",    "van-card": "@vant/weapp/card/index",    "van-submit-bar": "@vant/weapp/submit-bar/index"  }}

1.2样式图

Ⅳ.首页

1.1首页结构

在index.wxml构建首页结构

<view class="index-container">  <!-- 首页背景图 -->  <view class="window-bgc"></view>  <!-- 页面主体部分 -->  <view class="container">    <!-- 轮播图区域 -->    <banner />    <!-- 导航区域 -->    <entrance />    <!-- 广告区域 -->    <view class="adver">      <view class="adver-left">      <navigator url="">        <image src="../../assets/images/love.jpg" mode="widthFix" />      </navigator>    </view>    <view class="adver-right">    <view>    <navigator url="">      <image src="../../assets/images/elder.jpg" mode="widthFix" />    </navigator>  </view>  <view>    <navigator url="">      <image src="../../assets/images/friend.jpg" mode="widthFix" />    </navigator>  </view></view></view><!-- 商品列表 --><goods-list title="人气推荐"/><goods-list title="猜我喜欢"/><goods-card/></view></view>

1.1.1navigator

navigator是一个全局对象,它提供了与浏览器相关的信息和操作接口。在前端开发中,我们通常会使用 navigator 对象来获取用户浏览器的相关信息。
navigator 对象的常见属性和方法包括:
navigator.userAgent: 返回当前浏览器的用户代理字符串。
navigator.appName: 返回当前浏览器的名称。
navigator.appVersion: 返回当前浏览器的版本号。
navigator.language: 返回当前浏览器的语言设置。
navigator.platform: 返回当前浏览器所在设备的操作系统平台。
navigator.geolocation: 提供了一组 API,用于获取当前设备的地理位置信息。
navigator.mediaDevices: 提供了一组 API,用于访问当前设备的音频、视频、屏幕等媒体设备。
navigator.serviceWorker: 提供了一组 API,用于在浏览器中注册和管理 Service Worker,实现离线缓存和推送通知等功能

1.2首页背景图

在index.sass中构建首页样式

.index-container{  //首页背景图.window-bgc{  height: 200rpx;  position:absolute;  width:100%;  background-color: #f3514f;  border-radius:0rpx 0rpx 40% 40%;}.adver {  display: flex;  margin:0 auto;  width: 96%;  padding: 18rpx;  box-sizing: border-box;  background-color:rgb(177, 54, 54);  border-radius: 18rpx;  .adver-left{    width: 50%;    padding: 8rpx 8rpx 0rpx 8rpx;  }  .adver-right{    width: 50%;    padding: 8rpx 8rpx 0rpx 6rpx;    view:laat-child{      padding-top: 10rpx;    }  }  image{    width: 100%;  }}}

1.2.1 flex布局

            flex-direction属性

             flex-direction属性用于设置主轴方向,通过设置主轴方向可以规定项目的排列方向。 

             row:默认值,主轴为从左到右的水平方向。

              row-reverse:主轴为从右到左的水平方向。

              column:主轴为从上到下的垂直方向。

              column-reverse:主轴为从下到上的垂直方向。 

            justify-content属性

               justify-content属性用于设置项目在主轴方向上的对齐方式。能够分配项目之间及其周围                 多余的空间。 

               flex-start:默认值,表示项目对齐到主轴起点,项目间不留空隙。

               flex-end:项目对齐到主轴终点,项目间不留空隙。

               center:项目在主轴上居中排列,项目间不留空隙。

           

               space-between:两端对齐,两端的项目分别靠向容器的两端,其他项目之间的间隔相等                   space-around:每个项目之间的距离相等   

           

             align-items属性align-items属性用于设置项目在交叉轴上的对齐方式。

             center:项目在交叉轴的中间位置对齐。

             flex-start:项目顶部与交叉轴起点对齐,flex-end:项目底部与交叉轴终点对齐。

             baseline:项目的第一行文字的基线对齐。

1.3 banner组件

1.3.1构建banner组件结构

banner.js

Properties

(1)Properties类是专门用于读写配置文件的集合类

(2)配置文件的后缀名为.properties

(3)Properties类的方法可查找api文件

banner.json

1.4轮播图组件

在banner.wxml中通过swiper组件建立一个自动轮播列表

使用wx:for循环遍历bannerList数组

bannerList.length为数组长度

<view class="swiperbox"> <swiper autoplay class="swiper" indicator-active-color="#FF734C" interval="2000" duration="1000" indicator-color="rgba(0,0,0,3)"> <block wx:for="{{ bannerList }}" wx:key="index"> <swiper-item class="swiper-item">   <image class="img" src="{{item}}"></image> </swiper-item>    </block>    </swiper> <view class="indicator"> <text wx:for="{{bannerList.length}}" wx:key="id" class="rectangle"></text> </view></view>

设置swiperbox样式 

.swiperbox{  position: relative;  .swiper{    height: 320rpx;    //设置圆角弧度    border-radius: 18rpx;    //设置溢出隐藏    overflow: hidden;    width: 95%;    //margin设置外边距    margin: 0 auto;  }  .swiper-item{    .img{      width: 100%;      height: 100%;      border-radius: 18rpx;    }  }  .indicator{    display: flex;    justify-content: center;    position: absolute;    bottom: 16rpx;    left: 0rpx;    right: 0rpx;    .rectangle{      width: 30rpx;      height: 6rpx;      background-color: #f3514f;      margin: 0 8rpx;      border-radius: 6rpx;    }  }}

样式图

1.5entrance导航组件

在entrance.wxml中渲染一个导航列表

<view class="nav-list"><view wx:for="{{10}}" wx:key="index" class="nav-item"><navigator url="" class="navigator-nav"><image src="../../../assets/images/cate-1.png" mode="" class="nav-img"/><text class="nav-text">鲜花玫瑰</text></navigator></view></view>

导航分类样式

.nav-list {  //设置弹性布局  display: flex;  //设置换行  flex-wrap: wrap;  margin: 20rpx;  border-radius: 18rpx;  padding: 10px 0px 10px 10px;  background-color: white;}.nav-item {  .navigator-nav {    //更改主轴方向    //由默认的横向排列更改为纵向排列    display: flex;    flex-direction: column;    align-items: center;    justify-content: center;    margin-right: 10px;    margin-top: 10px;    .nav-text {      margin-top: 4px;      font-size: 12px;    }    .nav-img {      width: 66rpx;      height: 66rpx;    }  }}

1.6完成广告区域

广告区域结构

   <!-- 广告区域 -->    <view class="adver">      <view class="adver-left">      <navigator url="">        <image src="../../assets/images/love.jpg" mode="widthFix" />      </navigator>    </view>    <view class="adver-right">    <view>    <navigator url="">      <image src="../../assets/images/elder.jpg" mode="widthFix" />    </navigator>  </view>  <view>    <navigator url="">      <image src="../../assets/images/friend.jpg" mode="widthFix" />    </navigator>  </view></view></view>

广告区域样式

.adver {  display: flex;  margin:0 auto;  width: 96%;  padding: 18rpx;  box-sizing: border-box;  background-color:rgb(177, 54, 54);  border-radius: 18rpx;  .adver-left{    width: 50%;    padding: 8rpx 8rpx 0rpx 8rpx;  }  .adver-right{    width: 50%;    padding: 8rpx 8rpx 0rpx 6rpx;    view:laat-child{      padding-top: 10rpx;    }  }

样式图:

1.7注册goods-card和goods-list全局组件

在index.wxml设置两个标题

1.7.1完成goods-card组件

在goods-card.wxml中构建结构

<view class="goods_cart_container">  <navigator url="" class="navigator-nav">    <image src="../../assets/images/floor.jpg" mode="widthFix" class="good_img" />    <!-- 详细信息-->    <view class="goods_item_info">      <!-- 商品名称-->      <text class="goods_item_info_name">亲爱的/情人节网红款/19枝</text>      <!-- 商品描述-->      <text class="goods_item_info_promo">情人节新品情人节新品情人节新品</text>      <!-- 商品价钱-->      <view class="goods_item_info_bottom">        <!-- 优惠价钱 -->        <view class="goods_item_info_price">          <text class="text">$</text>99        </view>        <!-- 原价 -->        <view class="goods_item_info_origin_price">          <text class="text">$</text>199        </view>        <!-- 购物车 -->        <view class="goods_item_info_btn">          <image class="goods_image" src="../../assets/images/buybtn.png" mode="" />        </view>      </view>    </view>  </navigator></view>

在goods-card.scss中构建样式

.goods_cart_container{  width: 350rpx;  margin-top: 18rpx;  background: #fff;  border-radius: 18rpx;}.good_img{  width: 100%;  max-height: 360rpx;  border-top-left-radius: 18rpx;  border-top-right-radius: 18rpx ;  }.goods_item_info{  //设置弹性布局  display: flex;  //更改主轴方向为纵轴  flex-direction: column;  padding: 10rpx 20rpx;}.goods_item_info .goods_item_info_name{  //设置字体粗细  font-weight: 600;  font-size: 30rpx;  line-height: 20px;  //溢出隐藏  overflow: hidden;  //超过一行就算溢出  white-space: nowrap;  //溢出之后的文本为省略号  text-overflow: ellipsis;}.goods_item_info .goods_item_info_promo{  padding-top: 20rpx;  padding-bottom: 3px;  font-size: 12px;  color: #71797f;  overflow: hidden;  text-overflow: ellipsis;  white-space: nowrap;}.goods_item_info_bottom{  //弹性布局 在同一行显示  display: flex;  line-height: 50rpx;  margin-top: 20rpx;}.goods_item_info_bottom .goods_image{  width: 48rpx;  height: 48rpx;}.goods_item_info_price{  font-size: 30rpx;  font-weight: bold;  color: #f3514f;}.goods_item_info_price .text{  font-size: 24rpx;  padding-right: 4rpx;  font-weight: normal;}.goods_item_info_origin_price{  //设置flex为1 则该元素拥有所有剩余部分  flex:1;  font-size: 20rpx;  color: #71797f;  text-decoration-line:line-through;  margin-left: 6%;  margin-top: 4rpx;}.goods_item_info_origin_price .text{  font-size: 20rpx;}

1.7.2完成goods-list组件

在goods-list.wxml中构建结构

<!-- 商品列表组件--><view class="goods_container">  <!-- 标题-->  <view class="goods_title">{{ title }}</view>  <!-- 列表区域-->  <view class="goods_card_list">  <block wx:for="{{ 3 }}" wx:key="index">    <goods-card />  </block></view></view><!-- 查看更多--><view class="goods_more">  <navigator url="" class="goods_more_btn">查看更多</navigator></view>

在goods-list.scss中构建样式

.goods_title{  //设置文本居中  text-align: center;  font-size: 40rpx;  line-height: 52rpx;  font-weight: bold;  color: #232628;  padding: 20rpx 0 0rpx 0rpx;}.goods_card_list{  display: flex;  //设置换行  flex-wrap: wrap;  //设置元素在主轴上的排列方式  justify-content: space-between;}.goods_card_list::after{  content:'' ;  width: 350rpx;}.goods_more{  margin: 10rpx 0;}.goods_more_btn{  width: 95%;  display: block;  margin: 0 auto;  background: rgb(233, 94, 94);  margin: 0 auto;  border-radius: 20rpx;  height: 40px;  line-height: 40px;  text-align: center;  font-size: 14px;  color: rgba(35,38,40,0.7);}

样式图

Ⅴ.分类

1.1分类结构

<view>  <view class="category-container">    <scroll-view class="category-left-view" scroll-y>      <view class="left-view-item active">爱礼精选</view>      <view class="left-view-item ">鲜花玫瑰</view>      <view class="left-view-item ">永生玫瑰</view>      <view class="left-view-item ">玫瑰珠宝</view>    </scroll-view>    <scroll-view class="category-right-view" scroll-y>      <view class="test">        <view wx:for="{{ 10 }}" wx:key="index" class="right-view-item">          <navigator class="navigator" url="">            <image class="" src="../../assets/images/cate-1.png" mode="" />            <text class="goods_item_name">真情告白</text>          </navigator>        </view>      </view>    </scroll-view>  </view></view>

1.2分类样式

.category-container {  display: flex;  .category-left-view {    width: 220rpx;    height: 100vh;    background: #fff !important;    .left-view-item {      line-height: 99rpx;      //文本排列方式      text-align: center;      font-size: 26rpx;    }    .active {      background-color: #ffffff;      position: relative;      color: #f3514f;      //&表示当前标签      //::before是伪元素选择器      //在指定元素的添加内容      &::before {        content: '';        display: block;        width: 6rpx;        height: 66rpx;        background-color: #f3514f;        position: absolute;        left: 0;        top: 50%;        //沿着y轴平移        transform: translateY(-50%);      }    }  }}.category-right-view{  width: 100%;  height: 100vh;  flex-wrap: wrap;  background: #fff !important;  margin-left: 8rpx;  .right-view-item{    width: 33%;    float: left;    margin-top: 30rpx;    .navigator{      display: flex;      flex-direction: column;      align-items: center;    }    image{      width: 90rpx;      height: 90rpx;    }    text{      font-size: 26rpx;      margin-top: 18rpx;    }    &::before{      content: '';      display: block;      width: 6rpx;      height: 100vh;      background-color: rgb(177, 174, 174);      position: absolute;      left: 0;      top: 0%;      transform: translateY();    }  }}

1.2.1伪元素选择器

 所谓“伪元素” 就是在dom结构本来是不存在的 但是通过css创建出来的元素

        ::before   ::after

        用于向指定元素的前面或者后面加入特定的内容

样式图

Ⅵ.购物车

1.1购物车结构

<view class="container">  <!-- 购物车列表区域 -->  <view class="carList-container" wx:if="{{carList.length}}">    <view class="carList-container-cell" wx:for="{{carList}}" wx:key="index">      <van-swipe-cell right-width="{{ 65 }}" left-width="{{ 65 }}">        <view slot="left" class="van-swipe-cell__left">选择</view>        <van-cell-group>          <view class="goods-info">            <view class="left">              <van-checkbox value="{{ false }}" checked-color="#e60017" bind:change="onChange">              </van-checkbox>            </view>            <view class="mid">              <image src="../../assets/images/floor-img.jpg" mode="" />            </view>            <view class="right">              <view class="title">【11枝红玫瑰】买玫瑰送老婆</view>              <view class="buy">                <view class="price">¥99.00</view>                <view class="buy-btn">                  <van-stepper value="{{ 1 }}" bind:change="onChange" />                </view>              </view>            </view>          </view>        </van-cell-group>        <view slot="right" class="van-swipe-cell__right">删除</view>      </van-swipe-cell>    </view>  </view>  <!-- 购物车列表为空的情况 -->  <van-empty description="还没有商品,快去添加吧~" wx:else>    <navigator url="">      <van-button round type="danger">去购物</van-button>    </navigator>    <navigator url="">      <van-button round type="danger">去登录</van-button>    </navigator>  </van-empty>  <!-- 提交订单栏区域 -->  <van-submit-bar price="{{ 3050 }}" button-text="提交订单" bind:submit="onClickButton" tip="{{ true }}">    <van-checkbox value="{{ true }}" checked-color="#e60017" bind:change="onChange">      全选    </van-checkbox>  </van-submit-bar></view>

1.1.1  wx:for嵌套

wx:for 是用来做列表渲染,在组件上使用wx:for绑定一个数组,数组的下标变量名默认为index,数组当前项的变量名默认为item.

1.1.2  wx:key遍历数组

wx:key 提升性能。 

wx:key 属性值有两种添加属性。 

1. 字符串,需要是遍历的数组中 item 的某个属性,要求该属性是列表中唯一的字符串或者数字,不能进行动态改变。 

2. 保留关键字 *this ,*this代表的是 item 本身,item 本身是唯一的字符串或者数字

1.2购物车样式

.container {  background-color: whitesmoke;  height: 100vh;}.carList-container {  .carList-container-cell {    .goods-info {      display: flex;      background-color: white;      border-radius: 16rpx;      margin: 20rpx 20rpx 5rpx 20rpx;      padding: 24rpx 16rpx;      .left {        display: flex;        align-items: center;      }      .mid {        width: 200rpx;        height: 230rpx;        image {          width: 100%;          height: 100%;        }      }      .right {        display: flex;        flex-direction: column;        height: 230rpx;        justify-content: space-between;        padding-left: 20rpx;        .title {          font-size: 26rpx;        }        .buy {          display: flex;          justify-content: space-between;          .price {            font-size: 30rpx;            color: #fa4126;          }        }      }    }  }}.van-empty__bottom {  height: 250rpx;  display: flex;  flex-direction: column;  justify-content: space-between;}

1.2.1 margin和padding的使用(内外边距)

外边距(margin):

外边距定义了元素与其周围元素之间的空白区域。
外边距可以设置为正值、负值或百分比。
外边距可以用来控制元素之间的间距、对齐元素、扩展元素的可点击区域等。
外边距不会影响元素的背景颜色或边框。


内边距(padding):

内边距定义了元素的内容与其边框之间的空白区域。
内边距可以设置为正值、负值或百分比。
内边距可以用来控制元素内容与边框之间的间距、增加元素的可点击区域等。
内边距会影响元素的背景颜色。
在CSS中,可以使用以下属性来控制外边距和内边距:

外边距属性:

margin-top:顶部外边距
margin-right:右侧外边距
margin-bottom:底部外边距
margin-left:左侧外边距


内边距属性:

padding-top:顶部内边距
padding-right:右侧内边距
padding-bottom:底部内边距
padding-left:左侧内边距


这些属性可以接受不同的值,例如像素(px)、百分比(%)、em等

1.2.2  justify-content

justify-content 属性:设置主轴的对齐方式,弹性子元素在主轴方向上的对齐方式,

justify-content: flex-start; 默认值,主轴顶端对齐

justify-content: flex-end; 主轴的末端对齐

justify-content: center; 居中对齐,子元素位于弹性容器的中心

justify-content: space-between; 两端对齐,子元素和子元素之间有空白空间,项目之间的间隔都相等。

justify-content: space-around; 子元素之前、之间、之后都留有空白空间,且空间自行分配,项目之间的间隔比项目与边框的间隔大一倍。

space-evenly:弹性项目平均分布在该行上,相邻项目的间隔,项目与容器之间空间相等

1.3效果图

Ⅶ.我的

阅读本书更多章节>>>>

本文链接:https://www.kjpai.cn/gushi/2024-04-09/156011.html,文章来源:网络cs,作者:康由,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论