inleft
2022-08-16 c14e3278893b9dd1022aa488cee53a888c2a4c7e
表情组件优化
4 files modified
3 files added
1 files deleted
1 files renamed
623 ■■■■ changed files
public/OWO.js 148 ●●●●● patch | view | raw | blame | history
public/OWO2.json patch | view | raw | blame | history
src/assets/OwO.json 11 ●●●●● patch | view | raw | blame | history
src/assets/md.less 6 ●●●●● patch | view | raw | blame | history
src/components/common/OwO.vue 65 ●●●●● patch | view | raw | blame | history
src/components/layouts/baseLayout.vue 2 ●●●●● patch | view | raw | blame | history
src/components/mini/box12-comment.vue 24 ●●●●● patch | view | raw | blame | history
src/components/mini/box13-reply.vue 202 ●●●● patch | view | raw | blame | history
src/js/myOwO.js 165 ●●●●● patch | view | raw | blame | history
public/OWO.js
File was deleted
public/OWO2.json
src/assets/OwO.json
New file
@@ -0,0 +1,11 @@
{
    "蛆音娘": {
        "type": "image",
        "container": [{
            "icon": "http://t.inleft.com/share/media_photo/biaoqing/E89B86E99FB3E5A898_E6918AE6898B.png",
            "css": "quyin",
            "data": ":&(蛆音娘_摊手)",
            "text": "蛆音娘_摊手"
        }]
    }
}
src/assets/md.less
@@ -15,6 +15,12 @@
     
    img{
         max-width: -webkit-fill-available;
         display: inline;
         box-shadow: 0 0 4px rgba(0,0,0,0.5);
         overflow: visible;
         border-radius: 12px;
         -webkit-filter: drop-shadow(4px 4px 10px rgba(0,0,0,.5));
         filter: drop-shadow(4px 4px 10px rgba(0,0,0,.5));
    }
    h1, h2, h3, h4 {
        color: #111111;
src/components/common/OwO.vue
New file
@@ -0,0 +1,65 @@
<template>
    <div id="area">
        <a-form-item>
            <a-textarea ref="targetArea" :rows="4" v-model="visitorContent" :placeholder="this.$attrs.replyHolder"
                class="OwO-textarea" />
        </a-form-item>
        <span class="myTip fadeIn" v-if="showTip">现在你可以发送表情啦</span>
        <div ref="container" class="OwO fadeIn" v-show="init || visitorContent.length>0"></div>
    </div>
</template>
<script>
    import 'owo/dist/OwO.min.css';
    import OWO from '../../js/myOwO.js'
    import OwOjsonConfig from '../../assets/OwO.json'
    export default {
        props: {
            content: String
        },
        data() {
            return {
                init: false,
                showTip: false,
                visitorContent: '',
            }
        },
        watch: {
            visitorContent: function(newValue, oldValue) {
                if (newValue.length > 0) {
                    this.init = true;
                    this.initOwO();
                    if (!this.showTip) {
                        this.showTip = true;
                        setTimeout(() => {
                            this.showTip = false;
                        }, 5000);
                    }
                }
                this.$emit("update:content", newValue)
            },
        },
        methods: {
            initOwO() {
                var OwO_demo = new OwO({
                    logo: 'OωO表情',
                    // container: document.getElementsByClassName('OwO')[0],
                    // target: document.getElementsByClassName('OwO-textarea')[0],
                    container: this.$refs.container,
                    target: this.$refs.targetArea.$el,
                    // api: './OwO.json',
                    // api: 'http://diygod.github.io/OwO/demo/OwO.json',
                    jsonText: OwOjsonConfig,
                    position: 'down',
                    width: '100%',
                    maxHeight: '250px'
                });
            }
        }
    }
</script>
<style>
</style>
src/components/layouts/baseLayout.vue
@@ -151,6 +151,8 @@
        -webkit-animation-duration: 2s;
        -webkit-animation-iteration-count: 1;
    }
    .fadeInLeft {
        -webkit-animation-name: "fadeInLeft";
src/components/mini/box12-comment.vue
@@ -6,12 +6,13 @@
            </a-collapse-panel>
        </a-collapse>
        <div v-else>
            <replyBox ref="commentBoxId" v-bind="$attrs" @sendMsg="sendMsg()"></replyBox>
            <replyBox ref="commentBoxId" v-bind="$attrs" @sendMsg="sendMsg()" ></replyBox>
        </div>
        <a-modal v-model="visible" :title="replyTaget" :footer="null"
            :bodyStyle="{'overflow':'overlay','maxHeight': '550px','scrollbarWidth': 'none'}">
            <replyBox ref="replyBoxId" v-bind="$attrs" @sendMsg="sendMsg()"></replyBox>
            :bodyStyle="{'overflow':'overlay','height': '700px','scrollbarWidth': 'none'}">
            <replyBox ref="replyBoxId" v-bind="$attrs" @sendMsg="sendMsg()" :parseContent="parseContent"
                :visible="visible"></replyBox>
        </a-modal>
        <div class="mySecret" style="max-height:250px ;" v-if="commentListData.length==0">
@@ -41,7 +42,7 @@
                        <div class="samllPadding">:</div>
                    </div>
                    <p :id="temp.id" slot="content" v-html="temp.commentContent" class="myContent"></p>
                    <p :id="temp.id" slot="content" v-html="parseContent(temp.commentContent)" class="myContent"></p>
                    <a-comment v-for="tempData in temp.replyList">
                        <div slot="actions" key="comment-nested-reply-to" class="actionList">
@@ -75,7 +76,7 @@
                                </a-tooltip>
                            </div>
                        </div>
                        <p :id="tempData.id" slot="content">{{tempData.commentContent}}</p>
                        <p :id="tempData.id" slot="content" v-html="parseContent(tempData.commentContent)"></p>
                    </a-comment>
                </a-comment>
@@ -98,15 +99,15 @@
<script>
    import replyBox from "./box13-reply.vue"
    import {
        queryBlogCommentList,
        queryBlogCommentSubList
    } from '../../api/blogArticleComment.js'
    import OwOjsonConfig from '../../assets/OwO.json'
    export default {
        components: {
            replyBox
            replyBox,
        },
        props: {
            "foldReply": {
@@ -114,6 +115,13 @@
            },
        },
        methods: {
            parseContent(content) {
                let  tempStrArray=content.match("\:\&\(.*\)");
                console.log(OwOjsonConfig);
                console.log(333);
                return content;
            },
            updateCommentList(articleId) {
                queryBlogCommentList({
                    pageNo: this.page.current,
@@ -183,7 +191,7 @@
    .myContent img {
        margin-bottom: -0.125rem;
        img min-height: 3.5rem;
        height: 3em;
        height: 2em;
    }
    .samllPadding {
src/components/mini/box13-reply.vue
@@ -28,17 +28,12 @@
                {{msgInfo.useName}}<span style="padding: 0px 3px;"> : </span>
            </div>
            <div>
                <span v-html="msgInfo.userComment.replace(/\n/g, '<br>')"></span>
                <span v-html="parseContent(msgInfo.userComment).replace(/\n/g, '<br>')"></span>
            </div>
        </div>
        <a-comment>
            <div slot="content">
                <a-form-item>
                    <a-textarea :rows="4" v-model="form.visitorContent" :placeholder="replyHolder"
                        class="OwO-textarea" />
                </a-form-item>
                <div class="OwO"></div>
                <MyOwO :content.sync="form.visitorContent" :replyHolder="replyHolder"></MyOwO>
                <div>
                    <a-button html-type="submit" type="primary" @click="send()" v-if="!showReplyMsgInfo"
                        :disabled="isSending || $attrs.isAllowedComment==0">
@@ -71,27 +66,23 @@
    } from '../../api/blogArticleComment.js'
    import md5 from 'js-md5';
    import 'owo/dist/OwO.min.css';
    // import OwO from 'owo/dist/OwO.min.js';
    // import OwO from '/public/OWO.js';
    const VisitorDataKey = "visitorData.inleft.com"
    import MyOwO from '../common/OwO.vue'
    import myConstant from "../../config/myConstant.js"
    export default {
        mounted() {
            var OwO_demo = new OwO({
                logo: 'OωO表情',
                container: document.getElementsByClassName('OwO')[0],
                target: document.getElementsByClassName('OwO-textarea')[0],
                api: './OwO.json',
                // api: 'http://diygod.github.io/OwO/demo/OwO.json',
                position: 'down',
                width: '100%',
                maxHeight: '250px'
            });
        components: {
            MyOwO
        },
        props: {
            parseContent: {
                type: Function,
                default: null
            }
        },
        methods: {
            // getTargetArea() {
            //     return this.$refs.targetArea;
            // },
            getMsgInfo(param) {
                this.msgInfo = param;
                this.showReplyMsgInfo = true;
@@ -126,7 +117,7 @@
                if (this.form.nickName == 'inleft' || this.form.nickName == '笔墨' || this.form.nickName == '阿墨') {
                    if (this.form.authCode == null || this.form.authCode == "") {
                        this.$message.info("不要成为我,你就是真的自己..")
                        this.$message.info("此名称在这里使用需要正确的授权码..")
                        return
                    }
                }
@@ -148,7 +139,7 @@
                    this.form.visitorId = year + (month > 10 ? month : '0' + month) + date + num
                }
                localStorage.setItem(VisitorDataKey, JSON.stringify(this.form))
                localStorage.setItem(this.VisitorDataKey, JSON.stringify(this.form))
                this.isSending = true;
                blogCommentAdd({
@@ -190,7 +181,7 @@
        },
        data() {
            let tempVisitorData = localStorage.getItem(VisitorDataKey);
            let tempVisitorData = localStorage.getItem(this.VisitorDataKey);
            let vistorData = {
                nickName: "",
                eMail: "",
@@ -216,6 +207,7 @@
            }
            return {
                VisitorDataKey: myConstant.VisitorDataKey,
                isSending: false,
                replyHolder: "",
                msgInfo: {
@@ -264,159 +256,15 @@
            }
        }
    }
    ;(() => {
        class OwO {
            constructor(option) {
                const defaultOption = {
                    container: document.getElementsByClassName('OwO')[0],
                    target: document.getElementsByTagName('textarea')[0],
                    position: 'down',
                    width: '100%',
                    maxHeight: '250px',
                    api: 'https://api.anotherhome.net/OwO/OwO.json'
                }
                for (let defaultKey in defaultOption) {
                    if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {
                        option[defaultKey] = defaultOption[defaultKey]
                    }
                }
                this.container = option.container
                this.target = option.target
                if (option.position === 'up') {
                    this.container.classList.add('OwO-up')
                }
                const xhr = new XMLHttpRequest()
                xhr.onreadystatechange = () => {
                    if (xhr.readyState === 4) {
                        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
                            this.odata = JSON.parse(xhr.responseText)
                            this.init(option)
                        } else {
                            console.log('OwO data request was unsuccessful: ' + xhr.status)
                        }
                    }
                }
                xhr.open('get', option.api, true)
                xhr.send(null)
            }
            init(option) {
                this.area = option.target
                this.packages = Object.keys(this.odata)
                // fill in HTML
                let html = `
                <div class="OwO-logo"><span>OωO</span></div>
                <div class="OwO-body" style="width: ${option.width}"><div class="OwO-jio"></div>`
                for (let i = 0; i < this.packages.length; i++) {
                    html += `
                    <ul class="OwO-items OwO-items-${this.odata[this.packages[i]].type}" style="max-height: ${parseInt(option.maxHeight) - 53 + 'px'};">`
                    var type = this.odata[this.packages[i]].type
                    let opackage = this.odata[this.packages[i]].container
                    for (let i = 0; i < opackage.length; i++) {
                        if (type == 'image') {
                            html += `
                        <li class="OwO-item" data-id="${opackage[i].data}" title="${opackage[i].text}"><img class="biaoqing ${opackage[i].css}" src="${opackage[i].icon}"></li>`
                        } else {
                            html += `
                        <li class="OwO-item" data-id="not-given" title="${opackage[i].text}">${opackage[i].icon}</li>`
                        }
                    }
                    html += `
                    </ul>`
                }
                html += `
                    <div class="OwO-bar">
                        <ul class="OwO-packages">`
                for (let i = 0; i < this.packages.length; i++) {
                    html += `
                            <li><span>${this.packages[i]}</span></li>`
                }
                html += `
                        </ul>
                    </div>
                </div>
                `
                this.container.innerHTML = html
                // bind event
                this.logo = document.getElementsByClassName('OwO-logo')[0]
                this.logo.addEventListener('click', e => {
                    e.stopPropagation()
                    this.toggle()
                })
                this.container.getElementsByClassName('OwO-body')[0].addEventListener('click', e => {
                    let target = null
                    if (e.target.classList.contains('OwO-item')) {
                        target = e.target
                    } else if (e.target.parentNode.classList.contains('OwO-item')) {
                        target = e.target.parentNode
                    }
                    if (target) {
                        const cursorPos = this.area.selectionEnd
                        let areaValue = this.area.value
                        //this.area.value = areaValue.slice(0, cursorPos) + target.innerHTML + areaValue.slice(cursorPos);
                        if (target.dataset.id == 'not-given') {
                            this.area.value = areaValue.slice(0, cursorPos) + target.innerHTML + areaValue.slice(cursorPos)
                        } else {
                            this.area.value = areaValue.slice(0, cursorPos) + target.dataset.id + areaValue.slice(cursorPos)
                        }
                        this.area.focus()
                        this.toggle()
                    }
                })
                this.packagesEle = this.container.getElementsByClassName('OwO-packages')[0]
                for (let i = 0; i < this.packagesEle.children.length; i++) {
                    ;(index => {
                        this.packagesEle.children[i].addEventListener('click', e => {
                            e.stopPropagation()
                            this.tab(index)
                        })
                    })(i)
                }
                this.tab(0)
            }
            toggle() {
                if (this.container.classList.contains('OwO-open')) {
                    this.container.classList.remove('OwO-open')
                } else {
                    this.container.classList.add('OwO-open')
                }
            }
            tab(index) {
                const itemsShow = this.container.getElementsByClassName('OwO-items-show')[0]
                if (itemsShow) {
                    itemsShow.classList.remove('OwO-items-show')
                }
                this.container.getElementsByClassName('OwO-items')[index].classList.add('OwO-items-show')
                const packageActive = this.container.getElementsByClassName('OwO-package-active')[0]
                if (packageActive) {
                    packageActive.classList.remove('OwO-package-active')
                }
                this.packagesEle.getElementsByTagName('li')[index].classList.add('OwO-package-active')
            }
        }
        if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
            module.exports = OwO
        } else {
            window.OwO = OwO
        }
    })()
</script>
<style lang="less">
    .replyMsgInfo img {
        margin-bottom: -0.125rem;
        img min-height: 3.5rem;
        height: 2em;
    }
    .replyMsgInfo {
        display: flex;
        flex-direction: column;
src/js/myOwO.js
New file
@@ -0,0 +1,165 @@
export default (() => {
    //此js已经被魔改,和原作者的OwO.js有所不同,CVer谨慎使用.. by inleft
    class OwO {
        constructor(option) {
            const defaultOption = {
                container: document.getElementsByClassName('OwO')[0],
                target: document.getElementsByTagName('textarea')[0],
                position: 'down',
                width: '100%',
                maxHeight: '250px',
                api: 'https://api.anotherhome.net/OwO/OwO.json'
            }
            for (let defaultKey in defaultOption) {
                if (defaultOption.hasOwnProperty(defaultKey) && !option.hasOwnProperty(defaultKey)) {
                    option[defaultKey] = defaultOption[defaultKey]
                }
            }
            this.container = option.container
            this.target = option.target
            if (option.position === 'up') {
                this.container.classList.add('OwO-up')
            }
            if (option.jsonText != null && option.jsonText != undefined && option.jsonText != '') {
                this.odata = option.jsonText
                this.init(option)
            } else {
                const xhr = new XMLHttpRequest()
                xhr.onreadystatechange = () => {
                    if (xhr.readyState === 4) {
                        if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304) {
                            this.odata = JSON.parse(xhr.responseText)
                            this.init(option)
                        } else {
                            console.log('OwO data request was unsuccessful: ' + xhr.status)
                        }
                    }
                }
                xhr.open('get', option.api, true)
                xhr.send(null)
            }
        }
        init(option) {
            this.area = option.target
            this.packages = Object.keys(this.odata)
            // fill in HTML
            let html = `
                    <div class="OwO-logo"><span>OωO表情</span></div>
                    <div class="OwO-body" style="width: ${option.width}"><div class="OwO-jio"></div>`
            for (let i = 0; i < this.packages.length; i++) {
                html +=
                    `
                        <ul class="OwO-items OwO-items-${this.odata[this.packages[i]].type}" style="max-height: ${parseInt(option.maxHeight) - 53 + 'px'};">`
                var type = this.odata[this.packages[i]].type
                let opackage = this.odata[this.packages[i]].container
                for (let i = 0; i < opackage.length; i++) {
                    if (type == 'image') {
                        html +=
                            `
                            <li class="OwO-item" data-id="${opackage[i].data}" title="${opackage[i].text}"><img loading="lazy" class="biaoqing ${opackage[i].css}" src="${opackage[i].icon}"></li>`
                    } else {
                        html += `
                            <li class="OwO-item" data-id="not-given" title="${opackage[i].text}">${opackage[i].icon}</li>`
                    }
                }
                html += `
                        </ul>`
            }
            html += `
                        <div class="OwO-bar">
                            <ul class="OwO-packages">`
            for (let i = 0; i < this.packages.length; i++) {
                html += `
                                <li><span>${this.packages[i]}</span></li>`
            }
            html += `
                            </ul>
                        </div>
                    </div>
                    `
            this.container.innerHTML = html
            // bind event
            //this.logo = document.getElementsByClassName('OwO-logo')[0]
            //多个logo,获取当前容器下的子节点 by inleft
            this.logo = this.container.getElementsByClassName("OwO-logo")[0];
            this.logo.addEventListener('click', e => {
                e.stopPropagation()
                this.toggle()
            })
            this.container.getElementsByClassName('OwO-body')[0].addEventListener('click', e => {
                let target = null
                if (e.target.classList.contains('OwO-item')) {
                    target = e.target
                } else if (e.target.parentNode.classList.contains('OwO-item')) {
                    target = e.target.parentNode
                }
                if (target) {
                    const cursorPos = this.area.selectionEnd
                    let areaValue = this.area.value
                    //this.area.value = areaValue.slice(0, cursorPos) + target.innerHTML + areaValue.slice(cursorPos);
                    if (target.dataset.id == 'not-given') {
                        this.area.value = areaValue.slice(0, cursorPos) + target.innerHTML + areaValue
                            .slice(
                                cursorPos)
                    } else {
                        this.area.value = areaValue.slice(0, cursorPos) + target.dataset.id + areaValue
                            .slice(
                                cursorPos)
                    }
                    this.area.focus()
                    this.toggle()
                }
            })
            this.packagesEle = this.container.getElementsByClassName('OwO-packages')[0]
            for (let i = 0; i < this.packagesEle.children.length; i++) {
                ;
                (index => {
                    this.packagesEle.children[i].addEventListener('click', e => {
                        e.stopPropagation()
                        this.tab(index)
                    })
                })(i)
            }
            this.tab(0)
        }
        toggle() {
            if (this.container.classList.contains('OwO-open')) {
                this.container.classList.remove('OwO-open')
            } else {
                this.container.classList.add('OwO-open')
            }
        }
        tab(index) {
            const itemsShow = this.container.getElementsByClassName('OwO-items-show')[0]
            if (itemsShow) {
                itemsShow.classList.remove('OwO-items-show')
            }
            this.container.getElementsByClassName('OwO-items')[index].classList.add('OwO-items-show')
            const packageActive = this.container.getElementsByClassName('OwO-package-active')[0]
            if (packageActive) {
                packageActive.classList.remove('OwO-package-active')
            }
            this.packagesEle.getElementsByTagName('li')[index].classList.add('OwO-package-active')
        }
    }
    if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {
        module.exports = OwO
    } else {
        window.OwO = OwO
    }
})()