uni-app商城项目

黑马商城实战项目

项目搭建
  • 利用HBuilder X创建基本项目结构

  • 运行项目

  • 整理基本项目结构,并修改窗口外观

    "globalStyle": {
      "navigationBarTextStyle": "white",
      "navigationBarTitleText": "黑马商城",
      "navigationBarBackgroundColor": "#1989fa",
      "backgroundColor": "#F8F8F8"
    }
    
配置tabbar
  • 创建tabbar对应的四个页面和图标准备好

  • 将页面路径配置到pages.json中的pages数组中

    "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
          {
              "path": "pages/index/index"
          },
          {
              "path": "pages/member/member"
          },
          {
              "path": "pages/cart/cart"
          },
          {
              "path": "pages/search/search"
          }
      ]
    
  • 配置tabbar

    {
      "tabBar": {
          "list": [
              {
                  "pagePath":"pages/index/index",
                  "text":"首页",
                  "iconPath":"static/icon/home.png",
                  "selectedIconPath":"static/icon/home-active.png"
              },
              {
                  "pagePath":"pages/member/member",
                  "text":"会员",
                  "iconPath":"static/icon/member.png",
                  "selectedIconPath":"static/icon/member-active.png"
              },
              {
                  "pagePath":"pages/cart/cart",
                  "text":"购物车",
                  "iconPath":"static/icon/cart.png",
                  "selectedIconPath":"static/icon/cart-active.png"
              },
              {
                  "pagePath":"pages/search/search",
                  "text":"搜索",
                  "iconPath":"static/icon/search.png",
                  "selectedIconPath":"static/icon/search-active.png"
              }
          ]
          
      }
    }
    
获取轮播图数据
  • 封装uni.request请求,并挂在到全局

    • 创建util》api.js

      // 封装get请求
      const baseUrl = "http://localhost:8082"
      export const myRequest = (options)=>{
          return new Promise((resolve,reject)=>{
              uni.request({
                  method: options.method,
                  data: options.data,
                  url: baseUrl+options.url,
                  success(res) {
                      if(res.data.status !== 0) {
                          return uni.showToast({
                              title: '获取数据失败'
                          })
                      }
                      resolve(res)
                  },
                  fail(err) {
                      uni.showToast({
                          title: '获取数据失败'
                      })
                      reject(err)
                  }
              })
          })
      }
      
    • 在main.js中导入并挂载到全局

      import { myRequest } from './util/api.js'
      Vue.prototype.$myRequest = myReques
      
  • 获取轮播图的数据

    • 定义获取轮播图的方法

      methods: {
        async getSwipers () {
          const res = await this.$myRequest({
            method: 'GET',
            url: '/api/getlunbo'
          })
          this.swipers = res.data.message
        }
      }
      
    • 在onLoad中调用该方法

      this.getSwipers()
      
实现轮播图的结构和数据渲染
  • 定义轮播图的基本结构

    
      
        
      
    
    
  • 样式,在工具中安装scss

    
    
实现菜单导航结构
引入字体图标初始化样式

完成菜单导航基本结构

            
                
                黑马超市
            
            
                
                联系我们
            
            
                
                社区图片
            
            
                
                视频专区
            
        
菜单导航样式
.nav{
  display: flex;
  align-items: center;
  .item{
    width: 25%;
    text-align: center;
    view{
      background: $shop-color;
      line-height: 120rpx;
      width: 120rpx;
      height: 120rpx;
      border-radius: 90px;
      margin:10px auto;
    }
    text{
      font-size: 15px;
    }
  }
  .iconfont{
    font-size: 25px;
    color: #fff;
    height: 50px;
  }
  .icon-tupian{
    font-size: 20px;
  }
}
实现推荐商品列表
定义基本结构

  推荐商品
  
  
    
      
      
        1299
        12990
      
      华为(HUAWEI)荣耀6Plus 16G双4G版
    
  

美化样式
.hot_goods {
  background: #eee;
  .tit{
    border-top: 2px solid #eee;
    border-bottom: 2px solid #eee;
    margin-top: 20px;
    margin-bottom: 3px;
    color: $shop-color;
    height: 50px;
    line-height: 50px;
    text-align: center;
    letter-spacing: 20px;
    background: #fff;
  }
  .goods_list {
    display: flex;
    padding: 0 15rpx;
    justify-content: space-between;
    overflow: hidden;
    flex-wrap: wrap;
    .goods_item {
      width: 355rpx;
      margin-bottom: 15rpx;
      background: #fff;
      padding: 10px;
      box-sizing: border-box;
      image{
        height: 150px;
        width: auto;
        mix-width:160px;
        margin: 10px auto;
      }
      .price{
        font-size: 18px;
        color: red;
        padding: 8px 0;
        text:nth-child(2){
          color: #ccc;
          text-decoration: line-through;
          margin-left: 10px;
          font-size: 13px;
        }
      }
      .name {
        font-size: 14px;

      }
    }
  }
}
获取数据
  • 定义获取数据的方法

    // 获取推荐商品
    async getGoods () {
      const res = await this.$myRequest({
        url: '/api/getgoods?pageindex=1'
      })
      this.goods = res.data.message
    }
    
  • 在onLoad生命周期中调用该方法

    this.getGoods()
    
渲染数据
  • 通过v-for渲染数据

    
      推荐商品
      
      
        
          
          
            {{item.sell_price}}
            {{item.market_price}}
          
          {{item.title}}
        
      
    
    
完成黑马超市页面
改造导航菜单
  • 定义数据

    navs: [
      {
        icons: "iconfont icon-ziyuan",
        title: "黑马超市",
        path: "/pages/goods/list"
      },
      {
        icons: "iconfont icon-tupian",
        title: "社区图片",
        path: "/pages/pics/pics"
      },
      {
        icons: "iconfont icon-guanyuwomen",
        title: "联系我们",
        path: "/pages/contact/contact"
      },
      {
        icons: "iconfont icon-shipin",
        title: "学习视频",
        path: "/pages/videos/videos"
      }
    ]
    
  • 渲染数据

    
      
        
        {{item.title}}
      
    
    
  • 给导航菜单注册点击事件

    
    
  • 定义跳转的方法

    goNavigator (url) {
      uni.navigateTo({
        url
      })
    }
    
创建黑马超市页面
  • 创建页面,goods>list.vue
  • 将页面路劲配置到pages文件中,修改标题
封装商品列表组件
  • 在components下面创建goods>list.vue

    
    
    
    
    
    
  • 在首页引入该组件

    import goodsList from "../../components/goods-list/index.vue"
    
    components: {
      "goods-list":goodsList
    }
    
  • 使用组件并将数据传递到组件内部

    
    
渲染商品列表
  • 定义获取商品列表数据的方法并调用

    
    
  • 引入商品组件并使用

    
    
    
    
实现上拉加载更多
  • 通过onReachBottom来监听触底

    onReachBottom () {
      this.pageindex++
      this.getGoods()
    }
    
  • 修改给goods赋值

    this.goods = [...this.goods,...res.data.message]
    
  • 动态显示底线

    • 通过onReachBottom监听是否还有更多

      if(this.pageindex*10>this.goods.length) return this.flag = true
      
    • 通过v-if控制底线

      ----------我是有底线的----------
      
实现下拉刷新
  • 通过onPullDownRefresh进行下拉刷新的操作

    onPullDownRefresh() {
      this.goods = []
      this.pageindex = 1
      this.flag = false 
      setTimeout(()=>{
        this.getGoods(()=>{
          uni.stopPullDownRefresh()
        })
      },1000)
    }
    
关于我们
实现社区图片
实现资讯列表
实现列表项的结构和样式

结构


  
  
    1季度多家房企利润跌幅超50% 去库存促销战打响
    
      发表时间:2019-12-23
      浏览:1次
    
  

样式

.news{
    .news_item{
        display: flex;
        padding: 5px 10px;
        border-bottom: 3px solid $shop-color;
        image{
            width: 300rpx;
            height: 150rpx;
        }
        .content {
            padding: 5px 10px;
            position: relative;
            .tit{
                font-size: 30rpx;
            }
            .info{
                font-size: 26rpx;
                position: absolute;
                left: 10px;
                bottom: 5px;
                text:nth-child(2){
                    margin-left: 20px;
                }
            }
        }
    }
}
封装为组件

创建news-item.vue






在新闻页面导入并使用




点击列表进入详情
  • 点击子组件列表项通过this.$emit触发父组件的方法

    navigatorTo (item) {
      this.$emit('clickItem',item)
    }
    
  • 父组件通过注册clickItem事件及事件函数实现跳转操作

    
    
    
  • 新建/pages/news-detail/news-detail页面

实现资讯详情
实现基本结构





获取详情的数据
methods: {
  async getNewsDetail(id){
    const res = await this.$myRequest({
      url: '/api/getnew/'+id
    })
    console.log(res)
    this.newsDetail = res.data.message[0]
  }
},

  onLoad (options){
    this.getNewsDetail(options.id)
  }
实现详情的渲染

  {{newsDetail.title}}
    

  发表时间:{{newsDetail.add_time | formatDate}}
浏览:{{newsDetail.click}}


  

实现商品详情页
商品列表注册点击事件


父组件绑定自定义事件进行跳转

godetail (item) {
  uni.navigateTo({
     url: '/pages/goods-detail/goods-detail?id='+item.id
  })
}
创建商品详情页
获取详情轮播图数据
methods: {
  async getDetail(){
    const res = await this.$myRequest({
      url:'/api/getthumimages/'+this.id
    })
    console.log(res)
  }
},
onLoad(options){
    this.id = options.id
    this.getDetail()
}
渲染轮播图

  
    
  


获取商品信息
methods: {
  async getDetailInfo () {
    const res = await this.$myRequest({
      url:'/api/goods/getinfo/'+this.id
    })
    this.info = res.data.message[0]
  }
},
onLoad(options){
    this.id = options.id
    this.getDetailInfo()
}
完成商品信息结构和渲染

你可能感兴趣的:(uni-app商城项目)