制作web端的图片搜索站点(看冰冰)
  6DMaaPzJglxt 2023年12月05日 28 0



vue2制作图片搜索引擎

  • 前言
  • 预览
  • 背景
  • 技术选型
  • 思路
  • ui框架
  • 结束
  • 结束



制作web端的图片搜索站点(看冰冰)_前端

前言

大家好,我是yma16,本文分享制作web端的图片搜索站点。
antdeisgnvue image用法
代码嵌入:

<template>
  <a-image
    :width="200"
    src="https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png"
  />
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({});
</script>

预览

发布链接:http://yongma16.xyz/emoji/index/ pc端

制作web端的图片搜索站点(看冰冰)_python_02


手机端

制作web端的图片搜索站点(看冰冰)_vue.js_03

github地址:点击传送

制作web端的图片搜索站点(看冰冰)_图片搜索_04

例:搜索央视主持人王冰冰则出现冰冰的图片(可选择缩放)

制作web端的图片搜索站点(看冰冰)_图片搜索_05

制作web端的图片搜索站点(看冰冰)_分页_06

背景

有时候聊天,斗图找不到图片以级想欣赏精致的五官和风景放松心情,同时近期又在使用vue3+antd,所以想制作一个图片搜索引擎的站点。

技术选型

前端:vue3+antd+axios
后端:django的爬虫制作接口(模拟百度搜索图片返回搜索结果的json数据)

思路

前端:
目录结构

trickers前端项目           
├─public
│      favicon.ico
│      index.html
│      
└─src
    │  App.vue
    │  main.js
    │  tricher.txt
    │  
    ├─assets
    │      background.png
    │      happy.gif
    │      
    ├─components
    │      Home.vue
    │      
    ├─emoji
    │      Emoji.vue
    │      
    └─services
            getEmojiApi.js

制作web端的图片搜索站点(看冰冰)_前端_07


后端:

制作web端的图片搜索站点(看冰冰)_vue.js_08

ui框架

ant-design-vue

主要代码块:

<template>
  <div class="emoji">
    <a-spin :spinning="spinning" :delay="delay" class="home-emoji-loading">
      <div class="emoji-img">
        <a-card :title="searchTitle ? '关键词:' + searchTitle : '欢迎搜索图片与表情包'">
          <template v-for="(item, index) in showEmoji.showImg" :key="index">
            <!-- <a-card-grid class="grid-img-class"> -->
            <a-image :src="item" class="card-img-image" />
            <!-- </a-card-grid> -->
          </template>
        </a-card>
      </div>
      <!-- 分页 -->
      <div class="emoji-page">
        <a-pagination
          v-model:current="pageData.crurentPage"
          :page-size="pageData.splitNum"
          @change="gotoCurrentPage(pageData.crurentPage, pageData.total)"
          :total="pageData.total"
          :show-total="(total) => `总共 ${total} 记录`"
        />
      </div>
    </a-spin>
  </div>
</template>

<script>
import { reactive, onMounted, toRefs, watch } from "vue";
export default {
  name: "Emoji",
  props: {
    spinning: Boolean,
    delay: Number,
    emojiData: Array,
    emojiTotal: Number,
    searchWords: String,
    searchTitle: String,
  },
  setup(props) {
    const { emojiData } = toRefs(props);
    const cardTitle = reactive({
      title: "搜索结果",
    });
    const pageData = reactive({
      crurentPage: 1,
      total: emojiData.value.length,
      splitNum: 15,
    });
    // 展示数据
    const showEmoji = reactive({
      showImg: [],
    });
    // 制作一个分页,一页有十张图片
    function pageSplit() {
      if (emojiData && emojiData !== []) {
        // 存在
        pageData.crurentPage = 1;
        showEmoji.showImg = [];
        pageData.total = props.emojiTotal;
        if (props.pageTotal <= pageData.splitNum) {
          // 开始分页
          showEmoji.showImg = emojiData;
        } else {
          for (let imgLoc = 0; imgLoc < pageData.splitNum; ++imgLoc) {
            showEmoji.showImg.push(props.emojiData[imgLoc]);
          }
        }
      }
    }

    onMounted(() => {
      // 分页
      pageSplit();
    });
    watch(
      () => {
        props.emojiData;
      },
      () => {
        console.log(props.searchTitle, "emoji组件渲染图片");
        pageSplit();
      },
      {
        immediate: false,
        deep: true,
      }
    );
    //点击分页跳转

    watch(
      () => {
        pageData;
      },
      () => {
        pageSplit();
        const page = (pageData.crurentPage = 1);
        const pageSize = (pageData.total = props.emojiTotal);
        gotoCurrentPage(page, pageSize);
      },
      {
        immediate: true,
        deep: true,
      }
    );

    function gotoCurrentPage(page, pageSize) {
      console.log("翻页", page);
      let length = pageSize;
      showEmoji.showImg = [];
      for (
        let imgLoc = pageData.splitNum * (page - 1);
        imgLoc < pageData.splitNum * page && imgLoc < length;
        ++imgLoc
      ) {
        //
        showEmoji.showImg.push(props.emojiData[imgLoc]);
      }
    }
    return {
      ...props,
      cardTitle,
      showEmoji,
      pageData,
      gotoCurrentPage,
    };
  },
};
</script>

<style scoped>
.emoji {
  position: relative;
  display: block;
  left: 50%;
  transform: translateX(-50%);
  width: 80%;
  overflow: auto;
  box-sizing: border-box;
  box-shadow: 5px 5px 20px rgba(0, 0, 0, 0.18);
}
.emoji-img {
  position: relative;
  width: 100%;
}
.emoji-page {
  margin-top: 5px;
  text-align: right;
}
.grid-img-class {
  width: 20%;
  height: 200px;
  text-align: center;
  overflow: auto;
  align-content: center;
  justify-items: center;
}

.grid-img-class::-webkit-scrollbar-track {
  border-radius: 2px;
  background: #b46868;
}

/* 滚动条的滑轨背景颜色 */

.grid-img-class::-webkit-scrollbar-thumb {
  height: 5px;
  border-radius: 2px;
  background: rgba(17, 227, 255, 0.2);
}

/* 滑块颜色 */

.grid-img-class::-webkit-scrollbar-button {
  border-radius: 2px;
  background: #ffa581;
}

/* 滑轨两头的监听按钮颜色 */

.grid-img-class::-webkit-scrollbar-corner {
  border-radius: 2px;
  background: rgb(81, 255, 226);
}

/* 横向滚动条和纵向滚动条相交处尖角的颜色 */
.card-img-image {
  position: relative;
  height: 110px;
}

@media only screen and (max-width: 600px) {
  .grid-img-class {
    width: 100%;
  }

  .emoji {
    overflow: auto;
  }

  .card-img-image {
    height: auto;
  }
}
</style>

结束

感谢阅读!

制作web端的图片搜索站点(看冰冰)_vue.js_09

结束

本文分享到这结束,如有错误或者不足之处欢迎指出,感谢大家的阅读!


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月05日 0

暂无评论

推荐阅读
  E929ZvlRxyUs   2023年12月23日   38   0   0 前端url前端URL
6DMaaPzJglxt