perf: 支持搜索在线表情

This commit is contained in:
kuaifan 2022-11-18 00:15:45 +08:00
parent f49b157d13
commit 8cdfe01afa
9 changed files with 114 additions and 14 deletions

View File

@ -338,6 +338,30 @@ class IndexController extends InvokeController
return abort(404); return abort(404);
} }
/**
* 搜索表情
* @return array
*/
public function emo__search()
{
$key = Request::input('key');
if (empty($key)) {
return Base::retError("key empty");
}
return Cache::remember("emo__search:" . md5($key), now()->addDay(), function () use ($key) {
$res = Ihttp::ihttp_get("http://www.adoutu.com/search?keyword=" . urlencode($key));
if (Base::isError($res)) {
return $res;
}
$content = Base::getMiddle($res['data'], '<!--图片列表-->', '<!--分页器-->');
preg_match_all("/<img\s+src=\"(.*?)\"/s", $content, $matchs);
if ($matchs && $matchs[1]) {
return Base::retSuccess('success', array_slice($matchs[1], 0, 20));
}
return Base::retError("result empty");
});
}
/** /**
* 设置语言和皮肤 * 设置语言和皮肤
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View

View File

@ -1,6 +1,6 @@
{ {
"name": "DooTask", "name": "DooTask",
"version": "0.20.78", "version": "0.20.79",
"description": "DooTask is task management system.", "description": "DooTask is task management system.",
"scripts": { "scripts": {
"start": "./cmd dev", "start": "./cmd dev",

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
7c46245fccbbfd5f 1232463f96c3b53b

View File

@ -1235,6 +1235,10 @@
"/uploads/chat/202211/33/b59239e2c85d1830.png": "/uploads/chat/202211/33/b59239e2c85d1830.png", "/uploads/chat/202211/33/b59239e2c85d1830.png": "/uploads/chat/202211/33/b59239e2c85d1830.png",
"/uploads/chat/202211/33/b59239e2c85d1830.png_thumb.jpg": "/uploads/chat/202211/33/b59239e2c85d1830.png_thumb.jpg", "/uploads/chat/202211/33/b59239e2c85d1830.png_thumb.jpg": "/uploads/chat/202211/33/b59239e2c85d1830.png_thumb.jpg",
"/uploads/chat/202211/33/f682a136679c12bb641bb6967a9ff475.mov": "/uploads/chat/202211/33/f682a136679c12bb641bb6967a9ff475.mov", "/uploads/chat/202211/33/f682a136679c12bb641bb6967a9ff475.mov": "/uploads/chat/202211/33/f682a136679c12bb641bb6967a9ff475.mov",
"/uploads/chat/202211/45/088a642eb13ee5cf.jpg": "/uploads/chat/202211/45/088a642eb13ee5cf.jpg",
"/uploads/chat/202211/45/088a642eb13ee5cf.jpg_thumb.jpg": "/uploads/chat/202211/45/088a642eb13ee5cf.jpg_thumb.jpg",
"/uploads/chat/202211/45/f242ea07dda50e76.jpg": "/uploads/chat/202211/45/f242ea07dda50e76.jpg",
"/uploads/chat/202211/45/f242ea07dda50e76.jpg_thumb.jpg": "/uploads/chat/202211/45/f242ea07dda50e76.jpg_thumb.jpg",
"/uploads/desktop/0.12.0/builder-debug.yml": "/uploads/desktop/0.12.0/builder-debug.yml", "/uploads/desktop/0.12.0/builder-debug.yml": "/uploads/desktop/0.12.0/builder-debug.yml",
"/uploads/desktop/0.12.0/builder-effective-config.yaml": "/uploads/desktop/0.12.0/builder-effective-config.yaml", "/uploads/desktop/0.12.0/builder-effective-config.yaml": "/uploads/desktop/0.12.0/builder-effective-config.yaml",
"/uploads/desktop/0.12.0/latest-mac.yml": "/uploads/desktop/0.12.0/latest-mac.yml", "/uploads/desktop/0.12.0/latest-mac.yml": "/uploads/desktop/0.12.0/latest-mac.yml",

View File

@ -696,6 +696,7 @@ export default {
}, },
updateEmojiQuick(text) { updateEmojiQuick(text) {
this.emojiSearchKey = "";
if (!this.isFocus || !text) { if (!this.isFocus || !text) {
this.emojiQuickShow = false this.emojiQuickShow = false
return return
@ -709,13 +710,15 @@ export default {
&& text.length >= 1 && text.length >= 1
&& text.length <= 8 && text.length <= 8
&& $A.isArray(window.emoticonData)) { && $A.isArray(window.emoticonData)) {
// 线
this.searchEmoji(text);
// //
this.emojiQuickItems = []; this.emojiQuickItems = [];
window.emoticonData.some(data => { window.emoticonData.some(data => {
let item = data.list.find(({name}) => $A.strExists(name, text)) let item = data.list.find(({name}) => $A.strExists(name, text))
if (item) { if (item) {
this.emojiQuickItems.push({data, item}) this.emojiQuickItems.push({data, item})
if (this.emojiQuickItems.length >= 3) { if (this.emojiQuickItems.length >= 2) {
return true return true
} }
} }
@ -732,6 +735,70 @@ export default {
}, 100) }, 100)
}, },
searchEmoji(text) {
this.emojiSearchKey = text;
this.emojiSearchTimer && clearTimeout(this.emojiSearchTimer);
this.emojiSearchTimer = setTimeout(_ => {
if (this.emojiSearchKey !== text) {
return;
}
this.$store.dispatch("call", {
url: '../emo/search',
data: {
key: text,
}
}).then(({data}) => {
if (this.emojiSearchKey !== text) {
return;
}
let maxNum = 3;
if (this.windowWidth > 1000) maxNum = 5;
else if (this.windowWidth > 900) maxNum = 4;
const array = this.getRandomArrayElements(data.map(item => {
return {
data: {},
item: {
type: "online",
name: this.$L("动画表情"),
src: this.asciiConvertNative(item)
}
}
}), maxNum - this.emojiQuickItems.length)
if (array.length > 0) {
this.emojiQuickItems.push(...array)
this.$nextTick(_ => {
this.emojiQuickShow = true
this.$refs.emojiQuickRef.updatePopper()
})
}
});
}, 800)
},
asciiConvertNative(val) {
let asciicode = val.split("\\u");
let nativeValue = asciicode[0];
for (let i = 1; i < asciicode.length; i++) {
let code = asciicode[i];
nativeValue += String.fromCharCode(parseInt("0x" + code.substring(0, 4)));
if (code.length > 4) {
nativeValue += code.substring(4, code.length);
}
}
return nativeValue
},
getRandomArrayElements(arr, count) {
let shuffled = arr.slice(0), i = arr.length, min = i - count, temp, index;
while (i-- > min) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(min);
},
setText(value) { setText(value) {
if (this.quill) { if (this.quill) {
this.quill.setText(value) this.quill.setText(value)
@ -907,6 +974,10 @@ export default {
}, },
onEmojiQuick({data, item}) { onEmojiQuick({data, item}) {
if (item.type === 'online') {
this.$emit('input', "")
this.$emit('on-send', `<img src="${item.src}"/>`)
} else {
const baseUrl = $A.apiUrl("../images/emoticon") const baseUrl = $A.apiUrl("../images/emoticon")
const emoji = { const emoji = {
asset: `images/emoticon/${data.path}/${item.path}`, asset: `images/emoticon/${data.path}/${item.path}`,
@ -915,6 +986,7 @@ export default {
} }
this.$emit('input', "") this.$emit('input', "")
this.$emit('on-send', `<img class="emoticon" data-asset="${emoji.asset}" data-name="${emoji.name}" src="${emoji.src}"/>`) this.$emit('on-send', `<img class="emoticon" data-asset="${emoji.asset}" data-name="${emoji.name}" src="${emoji.src}"/>`)
}
this.emojiQuickShow = false this.emojiQuickShow = false
this.focus() this.focus()
}, },