123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- <template>
- <div class="message-rating-star">
- <p class="rating-head">
- {{ props.ratingTemplate.head }}
- </p>
- <div class="rating-card">
- <span class="card-title">请对本次服务进行评价</span>
- <div class="card-wrapper">
- <div style="max-width: 250px">
- <div
- v-for="(item, index) in numberList"
- :key="index"
- :class="{
- 'active': !(index !== selectValue && index !== hoverValue),
- 'de-active': index !== selectValue && index !== hoverValue,
- }"
- :style="{
- marginLeft: index === 0 ? 0 + 'px' : 20 + 'px',
- margin: 5 + 'px',
- }"
- @click="setValue(index)"
- @mouseenter="setHoverValue(index)"
- @mouseleave="setHoverValue(-1)"
- >
- {{ item + 1 }}
- </div>
- </div>
- </div>
- <div :style="{ marginTop: 10 + 'px', marginBottom: 10 + 'px' }">
- {{
- hoverValue === -1
- ? selectValue === -1
- ? "如果满意请给好评哦~"
- : desc[selectValue]
- : desc[hoverValue]
- }}
- </div>
- <button
- class="submit-button"
- :disabled="hasReply || hasExpire"
- @click="submitRatingStar"
- >
- 提交评价
- </button>
- </div>
- <p
- v-if="hasReply"
- class="rating-tail"
- :style="{
- marginTop: 20 + 'px',
- }"
- >
- {{ props.ratingTemplate.tail }}
- </p>
- </div>
- </template>
- <script lang="ts">
- import vue from '../../adapter-vue';
- import { CUSTOM_MESSAGE_SRC } from '../../constant';
- import { ratingTemplateType } from '../../interface';
- const { computed, ref, watchEffect } = vue;
- interface Props {
- ratingTemplate: ratingTemplateType;
- }
- export default {
- props: {
- ratingTemplate: {
- type: Object as () => ratingTemplateType,
- default: () => ({}),
- },
- },
- emits: ['sendMessage'],
- setup(props: Props, { emit }) {
- const hasReply = ref<boolean>(false);
- const sessionId = ref<string>('');
- const selectValue = ref<number>(-1);
- const hoverValue = ref<number>(-1);
- const hasExpire = ref<boolean>(false);
- const desc = computed(() => {
- return props.ratingTemplate?.menu.map(item => item.content);
- });
- const numberList = computed(() => {
- return props.ratingTemplate?.menu.map((item, index) => index);
- });
- watchEffect(() => {
- sessionId.value = props.ratingTemplate.sessionId || '';
- if (props.ratingTemplate.selected != undefined) {
- for (let i = 0; i < props.ratingTemplate.menu.length; i++) {
- if (props.ratingTemplate.menu[i].id == props.ratingTemplate.selected.id) {
- hasReply.value = true;
- selectValue.value = i;
- break;
- }
- }
- }
- const timestamp = Math.floor(new Date().getTime() / 1000);
- if (timestamp > props.ratingTemplate.expireTime) {
- hasExpire.value = true;
- }
- });
- const setValue = (val: number) => {
- if (!hasReply.value) {
- selectValue.value = val;
- }
- };
- const setHoverValue = (value: number) => {
- if (!hasReply.value) {
- hoverValue.value = value;
- }
- };
- const submitRatingStar = () => {
- if (selectValue.value >= 0) {
- const submitData = {
- data: JSON.stringify({
- src: CUSTOM_MESSAGE_SRC.MENU_SELECTED,
- menuSelected: {
- id: props.ratingTemplate.menu[selectValue.value].id,
- content: props.ratingTemplate.menu[selectValue.value].content,
- sessionId: sessionId.value,
- },
- customerServicePlugin: 0,
- }),
- };
- hasReply.value = true;
- emit('sendMessage', submitData);
- }
- };
- return {
- props,
- hasReply,
- sessionId,
- selectValue,
- hoverValue,
- hasExpire,
- desc,
- numberList,
- setValue,
- setHoverValue,
- submitRatingStar,
- };
- },
- };
- </script>
- <style lang="scss" scoped>
- .rating-head {
- font-size: 14px;
- font-weight: 400;
- color: #999;
- }
- .rating-tail {
- font-size: 14px;
- font-weight: 400;
- color: #999;
- }
- .card-title {
- font-size: 14px;
- font-weight: 500;
- }
- .rating-card {
- min-width: 270px;
- width: 50%;
- background: #fbfbfb;
- border-radius: 20px;
- border: 0;
- margin-top: 10px;
- padding-top: 20px;
- padding-bottom: 20px;
- button:disabled {
- background: #d8d8d8;
- }
- }
- .message-rating-star {
- text-align: center;
- display: flex;
- flex-flow: column wrap;
- justify-content: center;
- padding-bottom: 30px;
- align-items: center;
- }
- .card-wrapper {
- display: flex;
- flex-wrap: wrap;
- justify-content: center;
- padding-top: 10px;
- }
- .submit-button {
- width: 50%;
- height: 50px;
- background-color: #0365f9;
- font-size: 18px;
- font-weight: 400;
- color: white;
- border: 0;
- border-radius: 8px;
- cursor: pointer;
- }
- .de-active {
- height: 34px;
- width: 34px;
- display: inline-block;
- border: 0 solid #006eff0d;
- border-radius: 5px;
- color: #006eff;
- font-weight: 400;
- font-size: 16px;
- text-align: center;
- line-height: 34px;
- background: #006eff0d;
- }
- .active {
- width: 34px;
- height: 34px;
- display: inline-block;
- background: linear-gradient(
- 136.96deg,
- rgba(10, 124, 255, 0.3) -39.64%,
- #0a7cff 131.39%
- );
- border-radius: 5px;
- color: white;
- font-weight: 400;
- font-size: 16px;
- border: 0 solid #0a7cff;
- text-align: center;
- line-height: 34px;
- }
- </style>
|