评论的组件封装

在这里插入图片描述
在这里插入图片描述

主评论的人在数组第一层级,回复的评论都在children里面

【{
name:"张三"
idGenerator: 475403892531269
info_Conmment":"今天天气晴朗😀"
children:[
{
mainIdGenerator:475388950118469
name:"张三"
name1:"李四"
idGenerator:475403933356101
info_Conmment:"哈哈哈哈"
}
]
}】
<template>
  <div
    style="margin: 20px; margin-top: 40px"
    v-if="route.query.isComment == 'true' || props.isComment"
  >
    <p style="font-size: 18px; color: #1d2129">
      <el-divider
        style="width: 3px; height: 18px; background: #2c68ff; margin-left: 0px"
        direction="vertical"
      />{{$t('view.course.comment')}}:
    </p>
    <el-form :model="commentForm">
      <!-- maxlength="1000"
          show-word-limit -->
      <el-form-item>
        <el-input
          v-model="commentForm.commentText"
          :rows="3"
          type="textarea"
          maxlength="150"
          @input="handleInput(commentForm.commentText)"
          :placeholder="$t('view.course.add_comment')"
        >
        </el-input>
        <div class="commentOperate">
          <div class="numberLimit">
           还能输入<span class="remainingCount">{{ remainingCount }}</span
            >个字符
          </div>
          <div class="comment-operate-item">
            <VueEmoji @chooseEmoji="chooseEmoji" />
            <el-button class="commentBtn" type="primary" @click="userCommont"
              >评论
            </el-button>
          </div>
        </div>
      </el-form-item>
    </el-form>
    <!-- 评论列表 -->
    <div v-if="comments.length > 0">
      <div
        v-for="(comment, index) in comments"
        :key="comment.idGenerator"
        style="
          margin-top: 12px;
          border-bottom: 1px #f4f3f3;
          display: flex;
          align-items: flex-start;
        "
      >
        <el-avatar
          :size="40"
          style="margin-right: 12px; margin-left: 10px"
          :src="comment.avatarUrl || profile"
        ></el-avatar>
        <div style="flex: 1">
          <span style="font-size: 16px">{{ comment.name }}</span>
          <p>
            {{ comment.info_Conmment }}
          </p>
          <p style="font-size: 12px; color: #86909c; margin-top: 5px">
            {{ comment.createdTime }}
            <el-button
              link
              style="font-size: 12px; color: #86909c"
              @click="
                toggleLikeComment(comment.idGenerator, comment.isThumbsUp)
              "
            >
              <!-- <svg-icon
                  :icon-class="getCommentIconClass(comment.idGenerator)"
                  :src="getCommentIconSrc(comment.idGenerator)"
                  class="svg-icon"
                  style="
                    margin-left: 20px;
                    margin-right: 3px;
                    transform: translateY(-1px);
                  "
                  :class="{ liked: isCommentLiked(comment.idGenerator) }"
                /> -->
              <svg-icon
                :icon-class="getCommentzanIconClass(comment.isThumbsUp)"
                :src="getCommentzanIconSrc(comment.isThumbsUp)"
                class="svg-icon"
                style="
                  margin-left: 20px;
                  margin-right: 3px;
                  transform: translateY(-1px);
                "
              />
              <span v-if="comment.thumbsUpCount > 0">{{
                comment.thumbsUpCount
              }}</span
              >{{ $t('view.course.like') }}
            </el-button>
            <el-button
              link
              style="font-size: 12px; color: #86909c"
              @click="toggleReply(comment.idGenerator)"
            >
              <el-icon style="margin-right: 3px; font-size: 16px">
                <ChatLineSquare />
              </el-icon>
              {{ $t('view.course.reply') }}
            </el-button>
            <el-dropdown trigger="click">
              <template #default>
                <span>
                  <el-button link>
                    <el-icon
                      style="
                        margin-left: 12px;
                        color: #4e5969;
                        font-size: 12px;
                        transform: translateY(4px);
                      "
                    >
                      <MoreFilled />
                    </el-icon>
                  </el-button>
                </span>
              </template>
              <template #dropdown>
                <el-dropdown-menu>
                  <el-dropdown-item @click="deleteComment(comment.idGenerator)"
                    >删除评论</el-dropdown-item
                  >
                  <el-dropdown-item>
                    <el-dropdown trigger="hover" placement="right-start">
                      <span
                        >禁言<el-icon
                          style="transform: translateY(3px); margin-left: 20px"
                        >
                          <ArrowRight /> </el-icon
                      ></span>
                      <template #dropdown>
                        <el-dropdown-menu>
                          <el-dropdown-item @click="banUserHour(comment.id)"
                            >一个小时</el-dropdown-item
                          >
                          <el-dropdown-item @click="banUserDay(comment.id)"
                            >一天</el-dropdown-item
                          >
                          <el-dropdown-item @click="banUserWeek(comment.id)"
                            >一周</el-dropdown-item
                          >
                          <el-dropdown-item @click="banUserForever(comment.id)"
                            >永久</el-dropdown-item
                          >
                        </el-dropdown-menu>
                      </template>
                    </el-dropdown>
                  </el-dropdown-item>
                </el-dropdown-menu>
              </template>
            </el-dropdown>
          </p>
          <!-- <el-input
              v-if="showReplyInput[comment.id]"
              v-model="replyTexts[comment.id]"
              type="textarea"
              placeholder="说点什么吧"
              rows="4"
              maxlength="150"
              show-word-limit
              style="margin-top: 10px"
            /> -->
          <el-form v-if="showReplyInput[comment.idGenerator]">
            <el-form-item class="childrenForm">
              <el-input
                v-model="replyTexts[comment.idGenerator]"
                :rows="3"
                type="textarea"
                maxlength="150"
                @input="
                  handleInput(
                    replyTexts[comment.idGenerator],
                    comment.idGenerator
                  )
                "
                 :placeholder="$t('view.course.add_comment')"
              >
              </el-input>
              <div class="commentOperate">
                <div class="numberLimit">
                  还能输入<span class="remainingCount">{{
                    remainCount[comment.idGenerator]
                  }}</span
                  >个字符
                </div>
                <div class="comment-operate-item">
                  <VueEmoji
                    @chooseEmoji="chooseEmoji"
                    :replyComment="replyTexts[comment.idGenerator]"
                    :keyId="comment.idGenerator"
                  />
                  <el-button
                    class="commentBtn"
                    type="primary"
                    @click="userChildrenCommont(comment)"
                    >评论
                  </el-button>
                </div>
              </div>
            </el-form-item>
          </el-form>
          <!-- 子评论列表 -->
          <div
            v-for="(reply, replyIndex) in comment.children"
            :key="reply.id"
            style="margin-top: 12px"
          >
            <div
              style="
                margin-top: 12px;
                border-bottom: 1px #f4f3f3;
                display: flex;
                align-items: flex-start;
              "
            >
              <el-avatar
                :size="30"
                :src="reply.avatarUrl || profile"
                style="margin-right: 12px"
              ></el-avatar>
              <div style="flex: 1">
                <span>{{ reply.name || "0713" }}</span>
                <span style="margin-left: 10px; color: #86909c">{{ $t('view.course.reply') }}</span>
                <span style="margin-left: 10px; margin-right: 10px"
                  >{{ reply.name1 }}:{{ reply.info_Conmment }}</span
                >
                <p style="font-size: 12px; color: #86909c; margin-top: 5px">
                  {{ reply.createdTime }}
                  <el-button
                    link
                    style="font-size: 12px; color: #86909c"
                    @click="
                      toggleLikeComment(reply.idGenerator, reply.isThumbsUp)
                    "
                  >
                    <!-- <svg-icon
                        :icon-class="getReplyIconClass(comment.id, reply.id)"
                        :src="getReplyIconSrc(comment.id, reply.id)"
                        class="svg-icon"
                        style="
                          margin-left: 20px;
                          margin-right: 3px;
                          transform: translateY(-1px);
                        "
                        :class="{ liked: isReplyLiked(comment.id, reply.id) }"
                      /> -->
                    <svg-icon
                      :icon-class="getCommentzanIconClass(reply.isThumbsUp)"
                      :src="getCommentzanIconSrc(reply.isThumbsUp)"
                      class="svg-icon"
                      style="
                        margin-left: 20px;
                        margin-right: 3px;
                        transform: translateY(-1px);
                      "
                    />
                    <span v-if="reply.thumbsUpCount > 0">{{
                      reply.thumbsUpCount
                    }}</span
                    >点赞                  </el-button>
                  <el-button
                    link
                    style="font-size: 12px; color: #86909c"
                    @click="toggleReply(reply.idGenerator)"
                  >
                    <el-icon style="margin-right: 3px; font-size: 16px">
                      <ChatLineSquare />
                    </el-icon>
                回复
                  </el-button>
                  <el-dropdown trigger="click">
                    <template #default>
                      <span>
                        <el-button link>
                          <el-icon
                            style="
                              margin-left: 12px;
                              color: #4e5969;
                              font-size: 12px;
                              transform: translateY(4px);
                            "
                          >
                            <MoreFilled />
                          </el-icon>
                        </el-button>
                      </span>
                    </template>
                    <template #dropdown>
                      <el-dropdown-menu>
                        <el-dropdown-item
                          @click="deleteComment(reply.idGenerator)"
                          >删除评论</el-dropdown-item
                        >
                        <el-dropdown-item>
                          <el-dropdown trigger="hover" placement="right-start">
                            <span
                              >禁言<el-icon
                                style="
                                  transform: translateY(3px);
                                  margin-left: 20px;
                                "
                              >
                                <ArrowRight /> </el-icon
                            ></span>
                            <template #dropdown>
                              <el-dropdown-menu>
                                <el-dropdown-item
                                  @click="banUserHour(comment.id)"
                                  >一个小时</el-dropdown-item
                                >
                                <el-dropdown-item
                                  @click="banUserDay(comment.id)"
                                  >一天</el-dropdown-item
                                >
                                <el-dropdown-item
                                  @click="banUserWeek(comment.id)"
                                  >一周</el-dropdown-item
                                >
                                <el-dropdown-item
                                  @click="banUserForever(comment.id)"
                                  >永久</el-dropdown-item
                                >
                              </el-dropdown-menu>
                            </template>
                          </el-dropdown>
                        </el-dropdown-item>
                      </el-dropdown-menu>
                    </template>
                  </el-dropdown>
                </p>
                <!-- <el-input
                    v-if="showReplyInput[reply.id]"
                    v-model="replyTexts[reply.id]"
                    type="textarea"
                     :placeholder="$t('view.course.add_comment')"
                    rows="3"
                    maxlength="150"
                    show-word-limit
                    style="margin-top: 10px"
                  /> -->
                <el-form>
                  <el-form-item
                    class="childrenForm"
                    v-if="showReplyInput[reply.idGenerator]"
                  >
                    <el-input
                      v-model="replyTexts[reply.idGenerator]"
                      :rows="3"
                      type="textarea"
                      maxlength="150"
                      @input="
                        handleInput(
                          replyTexts[reply.idGenerator],
                          reply.idGenerator
                        )
                      "
                      :placeholder="$t('view.course.add_comment')"
                    >
                    </el-input>
                    <div class="commentOperate">
                      <div class="numberLimit">
                        还能输入<span class="remainingCount">{{
                          remainCount[reply.idGenerator]
                        }}</span
                        >个字符
                      </div>
                      <div class="comment-operate-item">
                        <VueEmoji
                          @chooseEmoji="chooseEmoji"
                          :replyComment="replyTexts[reply.idGenerator]"
                          :keyId="reply.idGenerator"
                        />
                        <el-button
                          class="commentBtn"
                          type="primary"
                          @click="userChildrenCommont(reply)"
                          >评论
                        </el-button>
                      </div>
                    </div>
                  </el-form-item>
                </el-form>
              </div>
            </div>
          </div>
          <el-divider
            border-style="double"
            style="height: 1px; border: 1px solid #f4f3f3"
          />
        </div>
      </div>
    </div>
  </div>
</template>
<script setup>
import VueEmoji from "@/views/activity/activityDetail/VueEmoji.vue";
import { ElMessage, ElMessageBox } from "element-plus";
import {
  addComments,
  searchComments,
  commentThumbsUp,
  commentCancelThumbsUp,
  deleteCommentApi,
} from "@/api/common";
import {
  singleCourseCommentThumbsUp,
  singleCourseCommentCancelThumbsUp,
} from "@/api/course";
import { useRoute, useRouter } from "vue-router";
const likeIcon = new URL("@/assets/images/icons/svg/like.svg", import.meta.url)
  .href;
const yellowLikeIcon = new URL(
  "@/assets/images/icons/svg/yellowlike.svg",
  import.meta.url
).href;
import profile from "@/assets/images/profile.jpg";
import { onMounted } from "vue";
const route = useRoute();
const router = useRouter();
const isComment = ref(true);
const detailLoading = ref(false);
// 評論數據
const comments = ref([]);
//回覆評論
const replyTexts = ref({});
const showReplyInput = ref({});
const commentForm = reactive({
  commentText: "",
});
const props = defineProps({
  isComment: {
    type: Boolean,
    default: false,
  },
});

onMounted(()=>{
  searchCommentsFn()
})

const getCommentzanIconSrc = (isThumbsUp) => {
  return isThumbsUp ? yellowLikeIcon : likeIcon;
};

const getCommentzanIconClass = (isThumbsUp) => {
  return isThumbsUp ? "yellowlike" : "like";
};
const toggleReply = (commentId) => {
  remainCount.value[commentId] = 150;
  if (!showReplyInput.value[commentId]) {
    showReplyInput.value[commentId] = false;
  }
  showReplyInput.value[commentId] = !showReplyInput.value[commentId];
};

// 評論點讚狀態
const commentLikes = ref({});

const toggleLikeComment = (commentId, isThumbsUp) => {
  // if (!commentLikes.value[commentId]) {
  //   commentLikes.value[commentId] = false;
  // }
  // commentLikes.value[commentId] = !commentLikes.value[commentId];
  // console.log(commentLikes.value[commentId], "commentLikes.value[commentId]");
  if (!isThumbsUp) {
    singleCourseCommentThumbsUp({
      mainId: route.query.id,
      commentId: commentId,
    }).then((res) => {
      if (res.code == 200) {
        ElMessage.success("点赞成功");
        searchCommentsFn();
      }
    });
  } else {
    singleCourseCommentCancelThumbsUp({
      mainId: route.query.id,
      commentId: commentId,
    }).then((res) => {
      if (res.code == 200) {
        ElMessage.success("取消点赞");
        searchCommentsFn();
      }
    });
  }
};
const searchCommentsFn = () => {
  comments.value = []
  detailLoading.value = true;
  let params = {
    mainId: route.query.id,
    funType: 1,
    pageNum: 1,
    pageSize: 10,
  };
  searchComments(params).then((res) => {
    if (res.code == 200) {
      comments.value = res.data.items;
      detailLoading.value = false;
    } else {
      ElMessage.error(res.message);
      detailLoading.value = false;
    }
  });
};
const remainingCount = ref(150);
const remainCount = ref({});
const handleInput = (value, id) => {
  if (id) {
    remainCount.value[id] = 150 - value.length;
  } else {
    remainingCount.value = 150 - value.length;
  }

  // if (remainingCount.value < 0) {
  //   this.message = this.message.slice(0, this.maxLength);
  //   event.target.scrollTop = event.target.scrollHeight;
  // }
};

const chooseEmoji = (item, replyComment, keyId) => {
  if (keyId) {
    replyComment += item;
    replyTexts.value[keyId] = replyComment;
    remainCount.value[keyId]--;
  } else {
    commentForm.commentText += item;
    remainingCount.value--;
  }
};
const addCommont = (params) => {
  addComments(params).then((res) => {
    if (res.code == 200) {
      ElMessage.success("评论成功");
      showReplyInput.value[params.parentIdGenerator] = false;
      replyTexts.value[params.parentIdGenerator] = "";
      remainCount[params.parentIdGenerator] = 150;
      commentForm.commentText = "";
      remainingCount.value = 150;
      searchCommentsFn();
      detailLoading.value = false;
    } else {
      detailLoading.value = false;
      ElMessage.error(res.message);
    }
  });
};
const userChildrenCommont = (comment) => {
  detailLoading.value = true;
  let params = {
    info_Conmment: replyTexts.value[comment.idGenerator],
    mainIdGenerator: comment.mainIdGenerator,
    parentIdGenerator: comment.idGenerator,
    moduleTypeEnums: 1,
  };
  addCommont(params);
};
const userCommont = () => {
  detailLoading.value = true;
  let params = {
    info_Conmment: commentForm.commentText,
    mainIdGenerator: route.query.id,
    parentIdGenerator: 0,
    moduleTypeEnums: 1,
  };
  addCommont(params);
};
// 刪除評論(按鈕)
const deleteComment = (idValue) => {
  const data = {
    id: idValue,
  };
  ElMessageBox.confirm(`確定刪除评论?`, "提示", {
    confirmButtonText: "确定",
    cancelButtonText: "取消",
    type: "warning",
  })
    .then(() => {
      deleteCommentApi(data).then((res) => {
        if (res.code == 200) {
          ElMessage({
            type: "success",
            message: "刪除评论成功",
          });
          searchCommentsFn();
        } else {
          ElMessage({
            type: "error",
            message: res.message,
          });
        }
      });
    })
    .catch(() => {
      info;
      ElMessage.info("评论成功");
    });
};
watch(
  () => route.query,
  (newValue, oldValue) => {
    if (route.query.typeFlag == "courseindexEnter") {
      commentForm.commentText = "";
      showReplyInput.value = {};
      replyTexts.value = {};
      remainCount.value = {};
      remainingCount.value = 150;
    }
  },
  { immediate: true }
);
defineExpose({ searchCommentsFn });
</script>
<style scoped lang="scss">
:deep(.el-form-item__content) {
  position: relative;
  //   margin-left: 20px;
  margin-top: 10px;
  padding-bottom: 10px;
  border: 1px solid #e7e7e7;
  border-radius: 6px;
  .el-textarea.el-input--default {
    .el-textarea__inner {
      box-shadow: 0 0 0 1px transparent !important;
      padding: 5px 16px !important;
    }
  }
  .commentOperate {
    height: 20px;
    border: 1px solid transparent;
    .numberLimit {
      position: absolute;
      // bottom: 5px;
      left: 16px;
      color: #999aaa;
      .remainingCount {
        color: #1d2129;
        padding: 0 2px;
      }
    }
    .comment-operate-img {
      width: 20px;
      height: 20px;
    }
    .comment-operate-item {
      position: absolute;
      // bottom: 0px;
      right: 21px;
      display: flex;
      align-items: center;
      .comment-operate-img {
        width: 20px;
        height: 20px;
        margin-right: 16px;
        cursor: pointer;
      }
      .commentBtn {
        padding-right: 10px;
        border-radius: 16px;
        width: 60px;
        height: 24px;
        font-size: 14px;
      }
    }
  }
}
</style>

emoji.json

{
  "data": "😀,😁,😂,😃,😄,😅,😆,😉,😊,😋,😎,😍,😘,😗,😙,😚,😇,😐,😑,😶,😏,😣,😥,😮,😯,😪,😫,😴,😌,😛,😜,😝,😒,😓,😔,😕,😲,😷,😖,😞,😟,😤,😢,😭,😦,😧,😨,😬,😰,😱,😳,😵,😡,😠,💘,❤,💓,💔,💕,💖,💗,💙,💚,💛,💜,💝,💞,💟,❣,💪,👈,👉,☝,👆,👇,✌,✋,👌,👍,👎,✊,👊,👋,👏,👐,✍,🍇,🍈,🍉,🍊,🍋,🍌,🍍,🍎,🍏,🍐,🍑,🍒,🍓,🍅,🍆,🌽,🍄,🌰,🍞,🍖,🍗,🍔,🍟,🍕,🍳,🍲,🍱,🍘,🍙,🍚,🍛,🍜,🍝,🍠,🍢,🍣,🍤,🍥,🍡,🍦,🍧,🍨,🍩,🍪,🎂,🍰,🍫,🍬,🍭,🍮,🍯,🍼,☕,🍵,🍶,🍷,🍸,🍹,🍺,🍻,🍴,🌹,🍀,🍎,💰,📱,🌙,🍁,🍂,🍃,🌷,💎,🔪,🔫,🏀,⚽,⚡,👄,👍,🔥,🙈,🙉,🙊,🐵,🐒,🐶,🐕,🐩,🐺,🐱,😺,😸,😹,😻,😼,😽,🙀,😿,😾,🐈,🐯,🐅,🐆,🐴,🐎,🐮,🐂,🐃,🐄,🐷,🐖,🐗,🐽,🐏,🐑,🐐,🐪,🐫,🐘,🐭,🐁,🐀,🐹,🐰,🐇,🐻,🐨,🐼,🐾,🐔,🐓,🐣,🐤,🐥,🐦,🐧,🐸,🐊,🐢,🐍,🐲,🐉,🐳,🐋,🐬,🐟,🐠,🐡,🐙,🐚,🐌,🐛,🐜,🐝,🐞,🦋,😈,👿,👹,👺,💀,☠,👻,👽,👾,💣"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/873686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家&#xff0c;并整理七大洲和这些国家的KML矢量数据分析分享给大家&#xff0c;如果你需要这些数据&#xff0c;请在文末查看领取方式。 世界上横跨两大洲的国家 …

2024全开源彩虹晴天多功能系统源码/知识付费系统/虚拟商城系统 完美可用带教程

源码简介&#xff1a; 2024最新彩虹晴天多功能系统源码&#xff0c;知识付费虚拟商城&#xff0c;完美可用&#xff0c;无需授权、国内外服务器皆可搭建、无论是不是备案域名也都可以部署、可以商业运营。 这个源码实用&#xff0c;它不仅完美可用&#xff0c;而且完全免F&am…

CSS之我不会

非常推荐html-css学习视频&#xff1a;尚硅谷html-css 一、选择器 作用&#xff1a;选择页面上的某一个后者某一类元素 基本选择器 1.标签选择器 格式&#xff1a;标签{} <h1>666</h1><style>h1{css语法} </style>2.类选择器 格式&#xff1a;.类…

2024 乐鑫全球开发者大会精选 QA

2024 乐鑫科技全球开发者大会精彩落幕&#xff01;我们在这三天的大会中&#xff0c;收获了来自开发者们的热烈互动和丰富提问。在每晚的“研发主管一对一问答”环节中&#xff0c;来自乐鑫的技术专家们对这些技术问题进行了深入的剖析和详尽的解答。为了让错过这场思想碰撞的观…

百度大模型构建智能问答系统技术实践

背景 随着大模型的飞速发展&#xff0c; AI 技术开始在更多场景中普及。在数据库运维领域&#xff0c;我们的目标是将专家系统和 AI 原生技术相融合&#xff0c;帮助数据库运维工程师高效获取数据库知识&#xff0c;并做出快速准确的运维决策。 传统的运维知识库系统主要采用…

FPGA低功耗设计

FPGA低功耗设计 文章目录 FPGA低功耗设计前言一、功耗类型1.1 动态功耗1.2 静态功耗1.3 浪涌功耗 二、系统级低功耗设计2.1 **多电压技术&#xff1a;**即工作频率、电压和功耗的关系2.2 系统时钟分配&#xff1a;2.3 软硬件划分2.4 p 或单元库选择 三、RTL级别低功耗设计3.1 并…

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始&#xff0c;按照书籍的划分&#xff0c;第10章开始就进入保护模式&#xff08;Protected Mode&#xff09;部分了&#xff0c;感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断&#xff08;Interrupt&#xff09;的设计&#…

jantic/DeOldify部署(图片上色)附带Dockerfile和镜像

克隆代码到DeOldify git clone https://github.com/jantic/DeOldify.git DeOldifyDeOldify源码 安装依赖 这里会安装python以及创建deoldify环境 cd DeOldify conda env create -f environment.yml(base) rootDESKTOP-1FOD6A8:~/DeOldify# conda env create -f environment.ym…

MySQL递归查询

一、为什么要使用MySQL递归查询 在很多场景下有树形表需要去遍历&#xff0c;若通过编程语言去递归遍历树将多次进行与数据库的交互操作&#xff0c;相当于100个葡萄去楼下超市买100次&#xff0c;在路上多走了99次浪费了大量时间&#xff0c;肯定不如一次买100葡萄省事。所以与…

景联文科技:专业数据标注公司,推动AI技术革新

数据标注作为AI技术发展的重要支撑&#xff0c;对于训练高质量的机器学习模型以及推动应用领域的创新具有不可替代的作用。 景联文科技作为专业的数据标注公司&#xff0c;致力于提供专业的数据标注服务&#xff0c;帮助客户解决AI链条中的数据处理难题&#xff0c;共同推动人工…

2024霸王餐小程序cps,h5公众号小程序开源版系统搭建开发,外卖霸王餐小程序系统源码

目录 前言&#xff1a; 一、霸王餐小程序的操作是怎么样的&#xff1f; 二、霸王餐系统后台 三、怎么搭建部署? 前言&#xff1a; 霸王餐项目基于美团和饿了么平台开发的小程序。 一、霸王餐小程序的操作是怎么样的&#xff1f; 1、进入小程序后选择自己要下单的店铺&am…

RTMP播放器延迟最低可以做到多少?

技术背景 RTMP播放器的延迟可以受到多种因素的影响&#xff0c;包括网络状况、推流设置、播放器配置以及CDN分发等。因此&#xff0c;RTMP播放器的延迟并不是一个固定的数值&#xff0c;而是可以在一定范围内变化的。 正常情况下&#xff0c;网上大多看到的&#xff0c;针对R…

华为手机找不到wifi调试?不急,没有wifi调试一样可以进行局域网模式调试

最近小黄在使用uniapp启动无线调试的时候突然发现华为的手机突然找不到wifi调试了&#xff0c;那么我们怎么进行无线调试呢&#xff1f; 其实他只是找不到开关而已&#xff0c;正常使用就行。 1.使用数据线连接手机。 打开cmd命令行执行&#xff1a;adb tcpip 5555 2.再执行ad…

论文120:Giga-SSL: Self-supervised learning for gigapixel images (2023, CVPR, 开源)

文章目录 1 要点2 方法2.1 算法设计2.2 设计选择 1 要点 题目&#xff1a;用于千兆像素图像的自监督学习 (Giga-SSL: Self-Supervised Learning for Gigapixel Images) 代码&#xff1a;https://github.com/trislaz/gigassl 研究目的&#xff1a; 现有的WSI分类方法依赖于有…

云计算之大数据(上)

目录 一、Elasticsearch 1.1 产品组件 1.1.1 X-Pack 1.1.2 Beats数据采集中心 1.1.3 Logstash 1.1.4 Kibana 1.2 架构特性 1.2.1 性能 1.2.2 安全性 1.2.3 可用性 1.2.4 可扩展性 1.2.5 可维护性 1.2.6 国际化 1.3 综合检索分析 1.4 全观测 1.5 大数据检索加速…

PAT甲级-1029 Median

题目 题目大意 给定两个递增序列&#xff0c;求这两个序列合并为一个递增序列后的中位数。 思路 直接用一个数组接收两个数组的输入&#xff0c;然后用sort()暴力求解&#xff0c;也可以过&#xff0c;但是时间复杂度较高。 更好的方法是双指针法&#xff0c;两个数组各一个…

在线plotly绘制动态旭日图,展示复杂数据层次结构

探索数据的层次之美&#xff1a;旭日图&#xff0c;以环环相扣的视觉效果&#xff0c;清晰展现数据的层级关系。搭配Plotly的动态可视化技术&#xff0c;不仅让数据层次一目了然&#xff0c;更通过交互式操作&#xff0c;让用户轻松探索每个层级的详细信息&#xff0c;享受数据…

解决移动端1px 边框优化的8个方法

前言 您是否注意到 1px 边框在移动设备上有时会显得比预期的要粗&#xff1f;这种不一致源于移动屏幕的像素密度不同。 在 Web 开发中&#xff0c;我们使用 CSS 来设置页面样式。但是&#xff0c;CSS 中的 1px 并不总是转换为设备上的物理 1px。这种差异就是我们的“1px 边框…

如何在网上找客户资源

在网上寻找客户资源可以通过多种渠道和方法来实现&#xff0c;这些方法结合不同的工具和平台&#xff0c;可以帮助你快速定位目标客户。以下是一些常见且有效的途径&#xff1a; 1. 利用搜索引擎 使用搜索引擎&#xff08;如百度、Google&#xff09;通过关键词搜索目标客户或…

JAVA一键开启缘分之旅红娘相亲交友系统小程序源码

一键开启缘分之旅 —— 红娘相亲交友系统 &#x1f496; 初遇心动&#xff0c;一键启程 在这个快节奏的时代&#xff0c;找到那个对的人似乎成了一种奢侈。但别担心&#xff0c;有了“红娘相亲交友系统”&#xff0c;你的缘分之旅只需一键即可开启&#xff01;无需复杂的注册流…