精华内容
下载资源
问答
  • 微信小程序开发-新闻列表新闻列表绑定开发教程

    微信小程序开发-新闻列表之新闻列表绑定开发教程:

    1、效果图预览

    这里写图片描述


    2、准备工作

    在拿到效果图后不要先急着去写代码,而是要去分析一下页面的整体结构,用什么方式定位和布局。小程序里建议使用flex布局,因为小程序对flex的支持是很好的。

    上一篇博客中完成了轮播图部分,接下来继续完成下面的新闻列表部分

    3、wxml部分

    新闻列表部分整体使用flex纵向布局比较合适, 
    先把页面内的元素标签和类名写好。

        <view class="post-container">
          <view class="post-author-date">
            <image class="post-author" src="{{item.avatar}}"></image>
            <text class="post-date">{{item.date}}</text>
          </view>
          <text class="post-title">{{item.title}}</text>
          <image class="post-image" src="{{item.imgSrc}}"></image>
          <text class="post-content">{{item.content}}</text>
          <view class="post-like">
            <image class="post-like-image" src="{{item.view_img}}"></image>
            <text class="post-like-font">{{item.reading}}</text>
            <image class="post-like-image" src="{{item.collect_img}}"></image>
            <text class="post-like-font">{{item.collection}}</text>
          </view>
        </view>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4、wxss部分

    .post-container{
      display: flex;
      flex-direction: column;
      margin-top: 20rpx;
      margin-bottom: 40rpx;
      background-color: #fff;
      border-bottom: 1px solid #ededed;
      border-top: 1px solid #ededed;
      padding-bottom: 5px;
    }
    .post-author-date{
      margin: 10rpx 0 20rpx 10rpx;
    }
    .post-author{
      width: 60rpx;
      height: 60rpx;
      vertical-align: middle;
    }
    .post-date{
      margin-left: 20rpx;
      vertical-align: middle;
      margin-bottom: 5px;
      font-size: 26rpx;
    }
    .post-title{
      font-size: 34rpx;
      font-weight: 600;
      color: #333;
      margin-bottom: 10px;
      margin-left: 10px;
    }
    .post-image{
    
      width: 100%;
      height: 340rpx;
      margin: auto 0;
      margin-bottom: 15px;
    }
    .post-content{
      color: #666;
      font-size: 28rpx;
      margin-bottom: 20rpx;
      margin-left: 20rpx;
      letter-spacing: 2rpx;
      line-height: 40rpx;
    }
    .post-like{
      font-size: 13px;
      flex-direction: row;
      line-height: 16px;
      margin-left: 10px;
    }
    .post-like-image{
      width: 16px;
      height: 16px;
      margin-right: 8px;
      vertical-align: middle;
    }
    .post-like-font{
      vertical-align: middle;
      margin-right: 20px;
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    5、数据绑定

    数据绑定很重要,那么多的新闻列表,不可能每个新闻都复制粘贴一下代码。况且小程序还限制在1MB大小。

    我们把数据内容单独放在一个文件夹里,模拟从网络加载的情况

    如图,在根目录新建一个data文件夹,里面新建一个posts-data.js文件 
    这里写图片描述


    5.1、posts-data.js

    在posts-data.js里定义一个local_database数组

    var local_database=[
          {
            date:"Nov 10 2016",
            title:"文章标题1",
            imgSrc:"/images/post/crab.png",
            avatar:"/images/avatar/1.png",
            content:"文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介",
            reading:"92",
            collection:"65",
            view_img:"/images/icon/chat.png",
            collect_img:"/images/icon/view.png",
          },
          {
            date:"Nov 20 2016",
            title:"文章标题2",
            imgSrc:"/images/post/bl.png",
            avatar:"/images/avatar/2.png",
            content:"文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介",
            reading:"88",
            collection:"66",
            view_img:"/images/icon/chat.png",
            collect_img:"/images/icon/view.png",
          },
          {
            date:"Nov 25 2016",
            title:"文章标题3",
            imgSrc:"/images/post/cat.png",
            avatar:"/images/avatar/3.png",
            content:"文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介文章简介",
            reading:"123",
            collection:"55",
            view_img:"/images/icon/chat.png",
            collect_img:"/images/icon/view.png",
          }
        ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    别忘了在posts-data.js文件最后加上输出

    module.exports={
            postList:local_database
        }
    • 1
    • 2
    • 3
    • 1
    • 2
    • 3

    5.2、post.wxml使用数据绑定:

    例如用户头像图片的路径,用双大括号括起来 里面和数组里定义的要相同,然后前面要加上item. 意思是绑定数组里定义的avatar,代码如下:

     <image class="post-author" src="{{item.avatar}}"></image>
    • 1
    • 1

    5.3、post.js

    先把posts-data.js文件引入:

    var postsData=require('../../data/posts-data.js')
    • 1
    • 1

    然后在onLoad: 函数内设置Data的值

    onLoad:function(options){
        // 生命周期函数--监听页面加载
        this.setData({
          posts_key:postsData.postList
        })
      },
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    6、for循环

    在wxml要循环的部分外面加上<block> </block>标签

    <block wx:for="{{posts_key}}" wx:for-item="item">
    <view class="post-container">
          <view class="post-author-date">
            <image class="post-author" src="{{item.avatar}}"></image>
            <text class="post-date">{{item.date}}</text>
          </view>
          <text class="post-title">{{item.title}}</text>
          <image class="post-image" src="{{item.imgSrc}}"></image>
          <text class="post-content">{{item.content}}</text>
          <view class="post-like">
            <image class="post-like-image" src="{{item.view_img}}"></image>
            <text class="post-like-font">{{item.reading}}</text>
            <image class="post-like-image" src="{{item.collect_img}}"></image>
            <text class="post-like-font">{{item.collection}}</text>
          </view>
        </view>
    </block>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    语法是:

    wx:for=”{{数组名}}”


    7、源码下载

    ——>csdn免积分下载

    展开全文
  • redis 缓存新闻列表

    千次阅读 2018-01-25 20:00:59
    * 1、实现关于新闻列表缓存 、收藏 、点赞 、视频点击等功能使用redis缓存技术 * * 2、列表新闻数据缓存模式 , 采用sorted set + hash * 使用zadd 缓存文章id , hset 缓存文章标题等详情信息 * * 3、视屏...
    /**
     * 1、实现关于新闻列表缓存 、收藏 、点赞 、视频点击等功能使用redis缓存技术
     * 
     * 2、列表新闻数据缓存模式 , 采用sorted set + hash 
     *        使用zadd 缓存文章id , hset 缓存文章标题等详情信息
     *
     * 3、视屏点赞存储在hash 中
     *
     * 4、用户对单个视频的收藏和点赞使用hash 
     *
     * 5、视频点击统计使用hash ,一小时同步数据
     *
     * 6、后台抓取回来的数据缓存问题
     *    
              $videoId = $redis->ZREVRANGE('mi_new_video_id_' , 0 ,0)[0]; // 获取最新视频id
              $maxValue = $redis->ZSCORE('mi_new_video_id_' , $videoId);  // 获取视屏对应的score
              # 存入视屏id
              $redis->ZADD('mi_new_video_id_' , time()+1 ,$video_id );
    
     */
    
    
    
    namespace app\api\controller;
    use think\Controller;
    use think\Cache;
    use think\Error;
    use think\Exception;
    use think\Log;
    use think\Request;
    use app\api\common\RedisKeyConts;
    use app\api\common\OutJson;
    use app\api\common\Hint;
    use app\api\common\Helper;
    use app\api\model\VideoModel;
    use app\api\model\SlideModel;
    use app\api\model\UserPraiseModel;
    use app\api\model\UserCollectionModel;
    
    class Homepage extends Common
    {
        public function __construct()
        {
            parent::__construct();
            $this->videoDao = new VideoModel();
        }
    
    
        /**
         * [getNewList 获取新闻列表]
         * @param  Request $request [description]
         * @return [type]           [description]
         */
        public function getNewList(Request $request)
        {
    
            $wr_applet  = $request->post('wr_applet' , 0);        // 系统请求规则
    
            $page       = $request->post('page' , 1);             // 默认第一页
    
            $limit      =  10;                                    // 每页显示
    
            $uid        = $request->post('uid' , 0);               //  用户id
    
            if (empty($wr_applet) ||  empty($page) || $wr_applet != Hint::WR_APPLET)
               OutJson::outJsonNoData(Hint::PARAM_ERROR); // 返回错误码
    
    
            $videoIdtablePrefix = RedisKeyConts::$sortSetKey['mi_new_video_id_']; //  视屏id
    
            $videoInfoTablePrefix =  RedisKeyConts::$hastKey['mi_new_video_info_']; // 视屏详情
    
            $sortCluser = self::$redis->ZREVRANGE($videoIdtablePrefix ,  ($page - 1)*$limit , ($page - 1)*$limit+$limit-1); // 获取最新的分页集合 
    
            //$sortCluser ='';
            if (!empty($sortCluser)) {
    
                // 格式化列表
                $resultVideoList = $this->formatVideoListData($sortCluser ,$videoInfoTablePrefix ,$page ,$limit , $videoIdtablePrefix ,$uid);
    
                OutJson::outJsonResult(Hint::SUCCESS , $resultVideoList);
    
            }else{
                //获取mysql 当前页数据
    
                $this->getMysqlVideoList($page ,$limit , $videoIdtablePrefix ,$videoInfoTablePrefix);
    
            }
    
        }
    
    
        /**
         * @param $sortCluser sort set 存放的视频id
         * @param $videoInfoTablePrefix 视频详情表前缀
         * @param $page                当前页
         * @param $limit               每页显示条数
         * @param $videoIdtablePrefix  当前页获取到sort set 中的video_id 集合
         * @return array
         */
        public function formatVideoListData($sortCluser ,$videoInfoTablePrefix ,$page ,$limit , $videoIdtablePrefix ,$uid )
        {
            $videoPraiseNumTablePrefix  = RedisKeyConts::$hastKey['mi_new_video_praise_num_']; // 视屏点赞前缀
    
            $videoPlayNumTablePrefix  = RedisKeyConts::$hastKey['mi_new_video_play_num_'];     // 视屏点击前缀
    
            $pieTablePrefix  = RedisKeyConts::$hastKey['mi_new_user_video_praise_history_'];   // 获取用户对当前视频赞历史
    
            $cloTablePrefix  = RedisKeyConts::$hastKey['mi_new_user_video_collect_history_'];  // 获取用户对当前视频收藏历史
    
            $resultVideoList = []; // 输出集合
    
            foreach ($sortCluser as $key => $value) { // $value => $video_id
    
                $setTable = Helper::getSplitTable($videoInfoTablePrefix , $value , 10); // 获取视屏存储的表
    
                $resultVideoList[$key] = unserialize(self::$redis->hget($setTable,$value));
    
                $resultVideoList[$key]['video_praise_num'] = $this->getSingleVideoFieldInfo($value ,$videoPraiseNumTablePrefix ,'video_praise_num'); // 获取点赞
    
                $resultVideoList[$key]['video_play_num']   = $this->getSingleVideoFieldInfo($value ,$videoPlayNumTablePrefix ,'video_play_num'); // 获取播放
    
                $resultVideoList[$key]['check_praise'] = 0; // 标记当前用户对当前视屏是否点过赞
    
                $resultVideoList[$key]['check_collect'] = 0; // 标记当前用户对当前视屏是否点收藏
    
                if(!empty($uid)){ //检测用户是否收藏 和点赞 当前
    
                    $resultVideoList[$key]['check_praise']  =  $this->getUserAtPresentVideoCheck( $pieTablePrefix, $value , $uid);
    
                    $resultVideoList[$key]['check_collect'] =  $this->getUserAtPresentVideoCheck($cloTablePrefix , $value , $uid); // 标记用户是否收藏
                }
    
                $resultVideoList[$key]['ls_time']           =   date('Y-m-d',$value['ls_time']);                                                                // 格式化时间
            }
    
            if (empty($resultVideoList)) {
                // 异常
                Log::write( date('Y-m-d H:i:s').'get sort set article_id exist , hset article_id null' ,  implode(',',$sortCluser) );
                // 删除sort set 中的article_id
                $this->unsetSortSetArticleId($sortCluser);
                // 重写生成缓存
                $this->getMysqlVideoList($page ,$limit , $videoIdtablePrefix ,$videoInfoTablePrefix);
    
            }
            return $resultVideoList;
        }
    
        /**
         * @desc  移除sorted set 中的文章id
         * @param $sortCluser article_ids 集合
         */
        public function unsetSortSetArticleId($sortCluser)
        {
            $articleColTable = RedisKeyConts::$hastKey['mi_new_video_id_'];
    
            foreach ($sortCluser as $k=>$v)
            {
                self::$redis->zrem($articleColTable , $v);
            }
        }
    
        /**
         * @desc 从表中获取视屏列表
         * @param $page
         * @param $limit
         * @param $videoIdtablePrefix
         * @param $videoInfoTablePrefix
         */
        public function getMysqlVideoList($page ,$limit , $videoIdtablePrefix ,$videoInfoTablePrefix )
        {
            $where =  [
                'status'=>1,  
                'is_index'=>0 // 显示首页
            ];
            $offset =  ($page-1) * $limit;
    
            $order_by = ['sort'=>'asc' , 'ls_time'=>'desc'];
    
            // 获取首页列表
            $videoList =  $this->videoDao->getPageVideoList( $where , $order_by ,$offset , $limit);
    
            if (!empty($videoList)) {
    
                foreach($videoList as $key=>$value){
                    // 缓存sort set video id
                    self::$redis->zadd($videoIdtablePrefix , time()+$key  ,   $value['id']); // name score value
    
                    // 缓存video info 分表存储
                    $setTable = Helper::getSplitTable($videoInfoTablePrefix , $value['id'] , 10); // 分成10 张表
    
                    self::$redis->hset($setTable , $value['id'] , serialize($value));  
    
                }
    
                OutJson::outJsonResult(Hint::SUCCESS , $videoList);
    
            } else {
    
                OutJson::outJsonNoData(Hint::HOMEPAGE_VIDEO_LIST_NULL);
    
            }
        }
    
        /**
         * @desc 获取单个视频的点赞数
         * @param $id 视频id
         */
        public function getSingleVideoFieldInfo($id , $videoFieldTablePrefix , $field)
        {
            $videoFieldTablePrefix = Helper::getSplitTable($videoFieldTablePrefix , $id , 10);
    
            $rdsVideoFieldNum  = self::$redis->hget($videoFieldTablePrefix , $id); // redis 视屏赞数量
            //$rdsVideoPraiseNum ='';
            if (empty($rdsVideoFieldNum))
            {
                $rdsVideoFieldNum  = $this->videoDao->getVideoInfo($id)[$field];
    
                $rdsVideoFieldNum =  $rdsVideoFieldNum == 0 ? rand(1 , 1000) : $rdsVideoFieldNum ;
    
                self::$redis->hsetnx( $videoFieldTablePrefix, $id , $rdsVideoFieldNum);
    
            }
    
            return $rdsVideoFieldNum;
    
        }
    
        /**
         * @param $checkTablePrefix 表前缀
         * @param $video_id
         * @param $uid
         * @return int
         */
        public function getUserAtPresentVideoCheck( $checkTablePrefix , $video_id , $uid)
        {
            //单用户对首页单个视频 的收藏只缓存30天
            // 对用户进行分表
            $tablePrefix =  RedisKeyConts::$hastKey[$checkTablePrefix];
    
            $setTable = Helper::getSplitTable($tablePrefix , $uid , 10); // 分成10 张表
    
            $hisResult= self::$redis->hget($setTable , $uid.'_video_'.$video_id);
    
            return $hisResult = $hisResult == '' || 0  ?  0 : $hisResult;
    
        }
    
        /**
         * @desc 增加视频点击  定时脚本统计入库
         */
        public function addVideoClick(Request $request)
        {
            $wr_applet  = $request->post('wr_applet' , 0);
    
            $video_id  = $request->post('video_id' , 0); // 视频id
    
            $uid  = $request->post('uid' , 0);             //  用户id
    
            if (empty($wr_applet) || empty($video_id) || empty($uid) || $wr_applet != Hint::WR_APPLET)
                OutJson::outJsonNoData(Hint::PARAM_ERROR);
    
    
            $videoTablePrefix = RedisKeyConts::$hastKey['mi_new_video_play_num_']; // 视屏点击前缀
    
            $videoTable  = Helper::getSplitTable($videoTablePrefix , $video_id , 10);
    
            if (self::$redis->HEXISTS($videoTable , $video_id)) {
    
                self::$redis->HINCRBY($videoTable , $video_id , 1);
    
            }else{
    
                self::$redis->hset( $videoTable, $video_id , 1); // 第一次点击
    
            }
    
            // 统计有更新的视频 ,用于同步mysql
            $videoClickTablePrefix  = RedisKeyConts::$hastKey['mi_new_video_click_update'];
            self::$redis->Hsetnx($videoClickTablePrefix , $video_id , $video_id); 
    
            if(!self::$redis->EXISTS($videoClickTablePrefix)){
    
                self::$redis->expire($videoClickTablePrefix , RedisKeyConts::$expireTime[$videoClickTablePrefix]);
    
            }
    
            OutJson::outJsonResult(Hint::SUCCESS); //
        }
    
        /**
         * @desc 增加视频点赞 , +1 -1 定时脚本统计入库
         */
        public function addMinusVideoPraise(Request $request)
        {
            $wr_applet  = $request->post('wr_applet' , 0);
    
            $video_id  = $request->post('video_id' , 0); // 视频id
    
            $uid  = $request->post('uid' , 0);             //  用户id
    
            $is_type  = intval($request->post('is_type' , 1));             // is_type 点赞类型  默认为[1 +赞   0 - 赞 ]
    
            if (empty($wr_applet) || empty($video_id) || empty($uid)  || $wr_applet != Hint::WR_APPLET)
                OutJson::outJsonNoData(Hint::PARAM_ERROR);
    
    
            $videoPraiseNumTablePrefix  = RedisKeyConts::$hastKey['mi_new_video_praise_num_']; // 视屏点赞前缀
    
            $videoPraise = Helper::getSplitTable($videoPraiseNumTablePrefix , $video_id , 10);
    
    
            $userVideoPraiseHistoryPrefix = RedisKeyConts::$hastKey['mi_new_user_video_praise_history_'];
    
            $userVideoPraiseHistoryTable = Helper::getSplitTable($userVideoPraiseHistoryPrefix , $uid , 10); // 分成10 张表
    
            // +1
            if($is_type == 1){
    
                if (self::$redis->HEXISTS($videoPraise , $video_id)) {
    
                    self::$redis->HINCRBY($videoPraise , $video_id , 1);
    
                }else{
    
                    self::$redis->hset( $videoPraise, $video_id , 1); // 第一次点赞
    
                    self::$redis->expire($videoPraise , RedisKeyConts::$expireTime[$videoPraiseNumTablePrefix]); // 设置单张表的缓存时间
    
                }
                // 增加用户赞历史
                self::$redis->hset($userVideoPraiseHistoryTable , $uid.'_video_'.$video_id  ,1);
    
            }else{
                if (self::$redis->HEXISTS($videoPraise , $video_id)) {
    
                    // 视频总赞-1
                    self::$redis->HINCRBY($videoPraise , $video_id , -1);
    
                    // 移除当前用户 当前赞历史
                    self::$redis->Hdel($userVideoPraiseHistoryTable , $uid.'_video_'.$video_id);
    
                    // 更新数据表 , 用户取消赞
                    //$userPraise = new UserPraiseModel();
    
                    //$userPraise -> updateUserVideoPraise( $uid ,$video_id ,  $is_type);
    
                }
    
            }
    
            $videoClickUpdateTablePrefix  = RedisKeyConts::$hastKey['mi_new_video_praise_update']; // 一个小时视屏点赞前缀
    
            self::$redis->Hsetnx($videoPraiseNumTablePrefix , $video_id , $video_id); // 缓存一个小时内,有点击的视频 , 定时脚本同步mysql video_praise_num
    
            if(!self::$redis->EXISTS($videoClickUpdateTablePrefix)){
    
                self::$redis->expire($videoClickUpdateTablePrefix , RedisKeyConts::$expireTime[$videoClickUpdateTablePrefix]);
    
            }
    
            OutJson::outJsonResult(Hint::SUCCESS); //
        }
    
    
        /**
         * @desc 用户点击收藏
         */
        public function userClickVideoCollect(Request $request)
        {
            $wr_applet  = $request->post('wr_applet' , 0);
    
            $video_id  = $request->post('video_id' , 0); // 视频id
    
            $uid  = $request->post('uid' , 0);             //  用户id
    
            $is_type = $request->post('is_type' , 1); // 默认收藏 , [1 收藏 , 0 取消收藏]
    
    
            if (empty($wr_applet) || empty($video_id) || empty($uid) || $wr_applet != Hint::WR_APPLET)
                OutJson::outJsonNoData(Hint::PARAM_ERROR);
    
    
            $userVideoCollectHistoryPrefix = RedisKeyConts::$hastKey['mi_new_user_video_collect_history_'];
    
            $userVideoPraiseHistoryTable = Helper::getSplitTable($userVideoCollectHistoryPrefix , $uid , 10); // 分成10 张表
    
            try{
                if($is_type == 1){
                    // 设置收藏
                    self::$redis->Hsetnx($userVideoPraiseHistoryTable , $uid.'_video_'.$video_id , 1);
    
                }else{
    
                    // 取消收藏
                    self::$redis->hdel($userVideoPraiseHistoryTable ,  $uid.'_video_'.$video_id);
                    // 更新用户收藏表
    
                    $userCollectionModel = new UserCollectionModel();
    
    
                    $userCollectionModel->updateUserVideoCollect( $uid ,$video_id ,  $is_type);
    
                }
                OutJson::outJsonNoData(Hint::SUCCESS);
    
            }catch (\Exception $e){
    
                Log::write('userClickVideoCollect Exception' , array('uid'=>$uid , 'video'=>$video_id , 'is_type'=>$is_type));
    
            }
    
        }
    
    
    }
    
    
    展开全文
  • vue 新闻列表滚动效果

    2020-03-06 13:54:23
    1.vue 新闻列表滚动效果
    展开全文
  • vue新闻列表和详情

    千次阅读 2019-01-09 11:56:12
    新闻列表路由改造 路由改造 详情页

    新闻列表路由改造

    路由改造

    详情页

    展开全文
  • 今天又学习了一些新的知识–网页中新闻列表的写法,以下是学习的笔记以及案例(有不足之处还望小伙伴们多多指出哦) 练习案例: HTML代码: CSS样式代码: 效果图: 笔记:总结新闻列表的写法 新闻列表的流程: 1...
  • 微信小程序新闻列表详情页

    千次阅读 2020-02-20 09:42:55
    微信小程序新闻列表详情页  不忘初心,方得始终。初心易得,始终难守  首先创建 post-detail 文件夹,创建四种文件。   修改 post.wxml 文件代码,给每个新闻块添加一个点击事件。并且我们要知道我们点击的是...
  • Android中实现简单的新闻列表 “本文主要针对Android新手,大神请绕道…” 使用到的第三方库 Retrofit2+RxJava2进行网络请和json数据的解析,注解框架:Butterknife 8.5.1如果以上的框架还有同学不知道怎么使用...
  • 基本功能是:用户未登录,踢回登录页面,点击新闻列表,跳转相应新闻详情 相关代码如下: 需要下载vue和vue-router <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> ...
  • android listview实现新闻列表展示效果

    万次阅读 2017-10-25 08:29:23
    这篇文章主要为大家详细介绍了android listview实现新闻列表展示效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了android listview列表展示效果的具体代码,供大家参考,具体内容...
  • mui实现新闻列表和详情查看

    千次阅读 2020-01-21 20:43:17
    1.新闻列表首页代码: <!doctype html> <html> <head> <meta charset="UTF-8"> <title>列表到详情最佳实践</title> <meta name="viewport" content="width=device-...
  • Jquery 实现新闻列表的滚动

    千次阅读 2018-06-26 17:51:17
    Jquery 实现新闻列表的滚动 //1、鼠标移入移出事件,定义定时器时间 //2、鼠标移入,停止新闻滚动,清除定时器 //3、鼠标移出,定时器开始使新闻滚动,定义定时器 //4、显示图片效果(a获取第一行ul,b获取li...
  • html5获取新闻列表查看详细内容

    万次阅读 2016-05-27 09:32:04
    一、通过客户端发送异步请求Ajax解析json返回新闻列表给用户,当用户进行查看新闻标题时,上拉可以加载更多的数据,每次是通过网络请求查询10条记录,下拉如果有新的新闻可以实时刷新。 二、通过点击新闻标题可以...
  • ViewPager+Fragment+ListView打造新闻列表

    千次阅读 2016-08-09 22:38:08
    那么今天我用ViewPager、Fragment和ListView做了一个新闻列表,分享给大家。效果图里上方的指示器是用了第三方工具PagerSlidingTabStrip完成的,非常好用!省去了好多我之前写的监听事件。 首先,我们建一个Activity...
  • uni-app渲染新闻列表,跳转详情页

    千次阅读 2019-12-30 17:56:01
    1:新建两个vue界面,list列表页,details详情页 2:打开pages.json,配置新增页面的路径等信息 { "path": "pages/main/list", ... "navigationBarTitleText": "新闻列表" } }, { ...
  • 这一讲中我们将对如何实现新闻列表做一个详细的介绍,新闻列表会把所有我们从网上获取的新闻的标题显示给用户,用户通过阅读标题,选择自己想要查看的新闻,进入具体的新闻显示页。 下图是我们设计的样式,最上方的...
  • 微信小程序入门-新闻列表

    万次阅读 2017-01-18 20:54:03
    前言前面已经完成欢迎页面的编写,下面将写一个新闻页面,主要包含导航栏,轮播图,新闻列表,包含的技术主要有swiper组件的使用。为了方便代码的管理,把之前的代码同步到github上,在这基础上写新闻列表。准备工作...
  • css3+html5——新闻列表设计

    万次阅读 2018-06-11 19:10:55
    随便写了个仿腾讯新闻列表,主要是布局和标题栏的设计(不随页面滚动而滚动)、当鼠标移动到图片上的时候实现图片的放大功能:大概效果如下: 代码如下:&lt;!DOCTYPE html&gt; &lt;html lang="en...
  • 记一次scrapy抓取腾讯新闻列表

    千次阅读 2019-04-16 11:56:11
    本次采用python3.6+scrapy+splash+mysql 等工具进行腾讯新闻列表抓取。由于腾讯新闻全部采用js动态渲染,爬出来得数据全部是js未渲染得东西,没有任何得数据,所以得借助splash 进行动态js渲染后,再进行爬取。这也...
  • joomla最新新闻列表扩展 News Show SP2

    千次阅读 2018-03-14 09:22:10
    在用了joomla自带的最新文章的扩展之后,真心感到无奈。简单的功能和展示,作为小白的我还在酷比地啃wordpress自定义开发中,至今还没有太多的时间来啃joomla相关二次开发...然后通过自定义新闻列表样式,渲染出来。...
  • 新闻列表中标题和日期的左右分别对齐的几种处理方法前言在新闻列表中,有标题和日期,然后分别对齐,这种应用场景非常广泛。而在前端实践中,其也有很多中布局方式。很多前端新手在入门时,可能会稍微有点迷茫。今天...
  • 今天,我们要构建一个如下图所示的新闻列表页面(手机截不了长图,大家将就看吧QAQ): 首先,在pages同级目录创建一个news目录,用于放有关新闻列表页面的各种文件,然后创建news.wxml,news.wxss,news.js,news...
  • 新闻列表接口:http://www.phonegap100.com/appapi.php?a=getPortalList&amp;catid=20&amp;page=1 新闻详情接口:http://www.phonegap100.com/appapi.php?a=getPortalArticle&amp;aid=488 main.js中 ...
  • 实例:新闻列表。while循环,读取每一条数据,并显示为一行 //声明PHP输出数据的字符集 header("content-type:text/html;charset=utf-8"); //(0)数据库配置信息 $db_host = "localhost:3306"; //mysql服务器的ip...
  • 新闻列表页网页结构: 输出h2: res = requests.get('http://news.sina.com.cn/china/') res.encoding = 'utf-8' soup = BeautifulSoup(res.text,'html.parser') for news in soup.select('.new
  • 当用户请求 / 或 /index 时,显示新闻列表 - get请求 当用户请求 /detail 时,显示新闻详情 - get请求 当用户请求 /submit 时,显示添加新闻页面 - get请求 当用户请求 /add 时,将用户提交的新闻保存到 data....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,795
精华内容 42,318
关键字:

新闻列表