草庐IT

【小程序开发之制作首页】

隐隐池玉 2023-12-17 原文

博客阅读顺序

1.准备工作  链接:(41条消息) 【小程序开发之微信登录】_隐隐池玉的博客-CSDN博客

2.实现调用微信登录  链接:(41条消息) 【小程序开发之微信登录】_隐隐池玉的博客-CSDN博客

3.制作首页(本篇博客)

系统框架图

我完成的小程序包括以下模块和功能,之后将一一介绍,但是有些功能的代码逻辑有些乱,或者使用的方法比较笨。

首页实现的效果

个人档案 查看报表按钮旁边的插图也是在阿里巴巴矢量图标库找的,轮播图是用美图秀秀的海报设计里面公众号首图的模板自己修改出来的,感觉更加清晰美观(也可以在百度上找轮播图广告的图片或者随便放几张长度较大的图片),食谱和文章的图片都是百度找的图片

购物商城首页的实现过程也大同小异啦

实现步骤

首页轮播图的数据、食谱的数据、文章的数据都是存放在数据库里面

步骤1  打开cms内容管理系统,创建内容模型 

首先填写内容模型的信息,我创建了三个内容模型,包括首页轮播图的内容模型、食谱数据表的内容模型、文章数据表的内容模型。

新建文章数据表的内容模型,如图。

我的食谱数据表的内容模型  其数据库名称为recipelist,我的首页轮播图内容模型 其数据库名称为banners。

步骤2 在内容模型里面添加字段

 我的首页轮播图数据表的内容模型,一共有三个字段。字段可以设置是否隐藏、是否必须,默认值、最小长度,根据自己的需要设置内容模型就好

  我的食谱数据表的内容模型,一共有三个字段,如下图所示。中文是字段的展示名称,英文是实际的数据库字段名,图片、富文本、单行字符串这些是字段的类型。这里就不一一展示字段的具体信息了。

 我的文章数据表的内容模型,一共有三个字段,如下图所示。不一一展示字段的具体信息了。

步骤3 在内容集合里新建记录

填写你的数据库记录的内容(下图是我填写好的数据)

 

 步骤4 编写代码,获取数据库的数据

下面直接展示我的首页页面的js文件的完整代码,注意:需要先创建page页面才能写函数进行跳转。

let nowstate=""
const app = getApp()

Page({
  data: {
  
  },
  tocreateprofile:function(){   //跳转到个人档案填写界面
   
        if(app.globalData.userInfo!=null){//判断用户是否登录(登录的用户userInfo不会为null)
          wx.navigateTo({
            url: '../createprofile/createprofile',
          })
        }else{
          wx.showToast({
            title: '您还没有登录噢',
            icon:'none'
          })
        }
 
   
     
    
    
  },
  tosearchmenu:function(){   //跳转到查找菜谱界面
  
        if(app.globalData.userInfo!=null){   //判断用户是否登录
          wx.navigateTo({
            url: '../searchmenu/searchmenu',
          })
        }else{
          wx.showToast({
            title: '您还没有登录噢',
            icon:'none'
          })
        }
   
    
  },
  torankinglist:function(){   //跳转到食物排行界面
 
        if(app.globalData.userInfo!=null){//判断用户是否登录
          wx.navigateTo({
            url: '../rankinglist/rankinglist',
          })
        }else{
          wx.showToast({
            title: '您还没有登录噢',
            icon:'none'
          })
        }
   


   
  },
  todailyreport:function(){   //跳转到日报周报界面
  
        if(app.globalData.userInfo!=null){//判断用户是否登录
          wx.navigateTo({
            url: '../report/report',
          })
        }else{
          wx.showToast({
            title: '您还没有登录噢',
            icon:'none'
          })
        }
  


  },

 
 

  onLoad() {
 var that=this;
 that.getbanners();//调用自定义函数获取轮播图数据
 that.getrecipe();//调用自定义函数获取食谱数据
   that.getarticle();调用自定义函数获取文章数据
  },

  
  getbanners(){//获取轮播图数据
    var that=this;
    wx.cloud.database().collection('banners').get()  //banners是我的数据表名称
    .then(res=>{
      console.log(res)
      that.setData({
        bannerlist:res.data
      })
    })
    },

    getrecipe(){//获取食谱
      var that=this;
      wx.cloud.database().collection('recipelist').aggregate().sample({ 
             //随机获取数据表里面的三条记录。
             //recipelist是我的数据表名称

        size: 3
      }).end()
      .then(res=>{
        console.log(res)
        that.setData({
          recipe:res.list
        })
     
      })
    
    },
    torecipedetail(event){//在首页显示的食谱图片和食谱标题组件处绑定了这个函数
       //点击了食谱图片或者食谱标题时会获取这个食谱的在数据库里面的id        
      console.log(event.currentTarget.dataset.id)
      let id=event.currentTarget.dataset.id
      wx.navigateTo({
        url: '/pages/recipedetail/recipedetail?id='+id,
  //携带食谱的id跳转到我创建的recipedetail页面(展示食谱详情)
      })
    },
    tobannerdetail(event){//在首页显示的轮播图图片组件处绑定了这个函数
       //点击了食谱图片或者食谱标题时会获取这个食谱的在数据库里面的id  
      console.log(event.currentTarget.dataset.id)
      let id=event.currentTarget.dataset.id
      wx.navigateTo({
        url: '/pages/bannerdetail/bannerdetail?id='+id,
     //携带轮播图的id跳转到我创建的bannerdetail页面(展示轮播图文章详情)
      })
    },
 getarticle(){//获取文章
      var that=this;
      wx.cloud.database().collection('article-list').aggregate().sample({
          //随机获取数据表里面的三条记录。
             //article-list是我的数据表名称
        size: 3
      }).end()
      .then(res=>{
        console.log(res)
        that.setData({
          articlelist:res.list,
        })
     
      })
    
    },
    toarticle(event){//在首页显示的文章图片和文章标题组件处绑定了这个函数
       //点击了文章图片或者文章标题时会获取这个文章的在数据库里面的id          
      console.log(event.currentTarget.dataset.id)
      let id=event.currentTarget.dataset.id
      wx.navigateTo({
        url: '/pages/article/article?id='+id,  
     //携带文章的id跳转到我创建的article页面(展示文章详情)
      })
    },
  
})

步骤4 编写WXML布局和WXSS样式

<!--轮播图-->
<view>

    <swiper autoplay indicator-dots interval="6000" circular class="swiper-wrap">
       <block wx:for="{{bannerlist}}" wx:key="_id">
       <swiper-item>
          <image bindtap="tobannerdetail" data-id="{{item._id}}" class="swiper-img" src="{{item.cover}}"> </image>
       </swiper-item>
       </block>
    </swiper>
</view>

<!--导航模块 -->
<view class="nav">
  <view class="nav-item"  bindtap="tocreateprofile">
    <view>
      <view class="nav-content" >个人档案</view>
  
    </view>
        
    <view>
      <image class="nav-img"  src="cloud://cloud1-2gyv1gezf9b6eeb9.636c-cloud1-2gyv1gezf9b6eeb9-1308464701/5.png"  style="height:100rpx;width:100rpx;"  alt=""></image>
    </view> 
  </view> 
  <view class="nav-item" bindtap="todailyreport">
    <view>
      <view  class="nav-content">查看报表</view>
     
    </view>
        
    <view>
      <image class="nav-img"  src="cloud://cloud1-2gyv1gezf9b6eeb9.636c-cloud1-2gyv1gezf9b6eeb9-1308464701/9.png"  style="height:100rpx;width:100rpx;"  alt=""></image>
    </view> 
  </view> 
  
</view>
<view class="nav">
<view class="nav-item"  bindtap="torankinglist">
    <view>
      <view  class="nav-content" >食物排行</view>
     
    </view>
        
    <view>
      <image class="nav-img"  src="cloud://cloud1-2gyv1gezf9b6eeb9.636c-cloud1-2gyv1gezf9b6eeb9-1308464701/6.png"  style="height:100rpx;width:100rpx;"  alt=""></image>
    </view> 
  </view> 
  <view class="nav-item" bindtap="tosearchmenu">
    <view>
      <view class="nav-content" >查找菜谱</view>
     
    </view>
        
    <view>
      <image class="nav-img" src="cloud://cloud1-2gyv1gezf9b6eeb9.636c-cloud1-2gyv1gezf9b6eeb9-1308464701/3.png" style="height:100rpx;width:100rpx;" alt=""></image>
    </view> 
  </view> 
</view>
<!--热门搜索 -->
	<!-- 猜你喜欢 -->
	<view class="hmly-like">
		<view class="hmly-bar-title">
			<view class="hmly-title-left" >食谱推荐</view>
			<view class="hmly-title-right" bindtap="getrecipe">换一换</view>
		</view>
                                
		<view class="hmly-like-item-box">
			<view 
				class="hmly-like-item" 
			
				
				wx:for="{{recipe}}"
				wx:key="index"
			>
				<view class="hmly-like-img">
					<image 	bindtap="torecipedetail"  class="hmly-like-item-icon" data-id="{{item._id}}" src="{{item.recipecover}}" mode="widthFix"></image>
					<view class="hmly-like-cover">
						
					</view>
				</view>
				<view data-id="{{item._id}}"bindtap="torecipedetail"  class="hmly-like-text">{{item.recipename}}</view>
			</view>
		</view>
	</view>

<!--分割线 -->
<view class="hr">
</view>
<!-- 列表  -->
<view class="weekText">-文章-</view>






<view  class="content-box" >
   <view class="box-top">
     
       <text class="content-box-title">今天也要好好吃饭</text>
       <view class="content-box-change" bindtap="getarticle">换一换</view>
    </view>
         <view class="articlebox" wx:for="{{articlelist}}" wx:key="_id">
            <image class="article-img" src="{{item.cover}}"></image>   
            <view class="article-center">
               <view>{{item.title}}</view>
               
         
             </view>      
            <view class="article-right">
               <button data-id="{{item._id}}"bindtap="toarticle" plain="true" size="mini"><text class="article-btu-txt">进入</text></button>
            </view>

           </view>


        </view>

<view class="indexbottom-tip">

<view class="indexbottom-cont">休息一会吧,已经到底啦</view>
</view>

wxss的完整代码如下

/* pages/my/my.wxss */
/* 轮播图*/
.swiper-img{
 width: 750rpx;
 height: 400rpx;
 border-radius: 30rpx;
}
.swiper-wrap{
  height: 400rpx;
}
/* 导航栏*/
.nav{
  display: flex;
  flex-direction: row;
  text-align: center;
 margin: 20rpx 15rpx 20rpx 15rpx;
}
.nav-item{
  display: flex;
  flex-direction: row;
  width: 360rpx;
  height: 120rpx;

  margin:0 5rpx 0 5rpx;
  font-size: 40rpx;
  font-weight: bold;
  background-color: #faead3;
  border-radius: 10rpx;
}
.nav-img{
  padding: 15rpx  40rpx 15rpx 40rpx;
}
.nav-content{
  padding: 0 30rpx;
}
/*食谱推荐的样式*/

.hmly-like {
	width: 95%;
	margin: 0rpx auto;
	margin-top: 20rpx;
}

.hmly-like-item-box {
	width: 100%;
	display: flex;
	justify-content: space-between;
	overflow: hidden;
}
.hmly-bar-title{
  display: flex;
  flex-direction: row;
  margin-bottom: 8rpx;
  margin-left:5rpx ;
}
.hmly-like-item {
	width: 210rpx;
	height: 260rpx;
	border-radius: 15rpx;
}

.hmly-like-img {
	width: 210rpx;
	height: 210rpx;
	border-radius: 15rpx;
	position: relative;
}

.hmly-like-item-icon {
	width: 100%;
	height: 100%;
	border-radius: 15rpx;
}

.hmly-like-text {
	font-size: 28rpx;
	color: #333;
	margin-top: 10rpx;
	display: -webkit-box;
	-webkit-line-clamp: 2;
	/*行数n*/
	-webkit-box-orient: vertical;
	overflow: hidden;
  text-overflow: ellipsis;
  text-align: center;
}

.hmly-like-cover {
	width: 190rpx;
	height: 40rpx;
	
	/* opacity: 0.3; */
	position: absolute;
	bottom: 0rpx;
	color: #fff;
	font-size: 25rpx;
	padding: 5rpx 10rpx;
	border-bottom-left-radius: 15rpx;
	border-bottom-right-radius: 15rpx;
}
.hmly-title-left{
font-size: larger;
font-weight: bolder;
}
.hmly-title-right{
padding-left: 420rpx;
}
/*分割线*/
.hr{
  height: 15rpx;
  background-color: #ccc;
  margin:10rpx 0;
  opacity: 0.3;
}
.weekText{
  text-align: center;
  margin:30rpx 0;
}


/*首页底部提示的样式*/

.indexbottom-tip{
  align-items: center;
  justify-content: center;
  margin-top: 10rpx;
  margin-bottom: 20rpx;
  display: flex;
  flex-direction: row;
}
.indexbottom-cont{
  color: #ea9518;
}
/*文章部分的样式*/
.content-box-change{
  margin-left: 250rpx;
  margin-top: 20rpx;
}
 
  .content-box-title{
    font-size:larger;
    font-weight: bold;
    margin-top: 10rpx;
    margin-bottom: 10rpx;
  }
  .content-box{
    background-color: #faead3;
    width: 710rpx;
    height: 620rpx;
    margin-left:20rpx;
    margin-right: 20rpx;
    border-radius: 20rpx;
    }

    .box-top{
      display: flex;
      flex-direction: row;
      margin-left: 20rpx;
    }
  
    .articlebox{ /*一个文章盒子的样式 包括方形图片 标题 描述  点击进入的按钮*/
    display: flex;
    flex-direction: row;
    margin-left: 20rpx;
    margin-top: 10rpx;
    margin-bottom: 20rpx;
    align-items: center;

    }
    .article-img{/*一个文章盒子中方形图片的样式 */
     width: 150rpx;
     height: 150rpx;
     margin-right: 20rpx;
    }
    .article-center{/*一个文章盒子中间文字部分的样式 是竖向的*/
    display: flex;
    flex-direction: column;
    margin-right: 20rpx;
    width: 300rpx;
    }
    .article-right{/*一个文章盒子中间文字部分的样式 是竖向的*/
      display: flex;
      flex-direction: column;
     
      }
      .article-btu-txt{
     color: #ea9518;
      }
   

json文件的代码

{
  "usingComponents": {},
  "navigationBarTitleText": "首页",
  "navigationBarBackgroundColor": "#faead3"
}

TIP:

1  可以找一些别人公开的小程序项目,复制一些好看的样式,修改一下用到自己的小程序里面或者是跟着视频一点点敲代码也是可以的,附上一些我参考过的项目和跟着敲过代码的视频

(42条消息) 推荐几个微信小程序开源项目_xiangzhihong8的博客-CSDN博客_微信小程序开源项目

一天搞定微信小程序开发-JavaScript项目实战教学-新手必学零基础项目实战(小程序框架、小程序组件、小程序API)_哔哩哔哩_bilibili

我个人参考的是里面的仿喜马拉雅的小程序,这个小程序只使用了微信原生的组件,也没有使用什么其他的复杂的框架之类的,比较适合初学者吧。

2  在制作小程序的过程中我也尝试过使用第三方组件库,当时尝试了Vant组件库,但是出现了一个问题(使用这些组件进行编译时控制台出现很多warnings    提示  [Component] slot ““ is not found.) 我暂时找不到解决办法,所以项目里面都只使用微信原生的组件。想省事并且让页面快速美观起来的朋友可以试一试Vant组件库或者其他的组件库。附上Vant的官方网页和使用教程

介绍 - Vant Weapp (youzan.github.io)

 (42条消息) 微信小程序组件库 iView Weapp使用教程_前端王小婷的博客-CSDN博客_iview 微信

2  可以使用美图秀秀的海报设计里面的模板去制作竖屏海报、电商主图等等,会比百度的图片更清晰,也更符合自己小程序的需求(比如我的小程序里面的轮播图是用美图秀秀里面公众号首图的模板自己修改出来的)

3  在一开始开发小程序的时候可以选择好小程序的基调颜色,统一基调颜色会让小程序看起来更加和谐,比如我选择的是#faead3(从米兰迪色系里面选的一个偏浅棕黄的颜色),我的按钮、提示文字使用橙色,商城标价使用红色。用浅色作为底色去配深色。

莫兰迪色系博客 链接:(42条消息) 莫兰迪色系表_白鳯的博客-CSDN博客_莫兰迪色系rgb数值

传统色 渐变色网页  链接:中国色彩-中国传统颜色配色方案-禾坡网 (hepou.com)

有关【小程序开发之制作首页】的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  3. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  4. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  10. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

随机推荐