Files
2023-12-01 23:57:44 +08:00

569 lines
14 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template name="zy-search">
<view class="good-search-page" :class="Theme">
<view class="good-search-head">
<input :class="{'clearvalue':clearValuebtn}" :maxlength="maxLength" :style="{'line-height': inputHeight+'px','height': inputHeight+'px'}" :focus="isFocus" type="text" confirm-type="search" @confirm="searchStart()" :placeholder="inputPlaceholder" :confirm-hold="true" v-model="searchText" />
<!-- <view v-if="searchText.length>0&&clearValuebtn" class="good-search-icon clearvalue-icon iconfont iconshanchu1" @click="clearvalue()"></view> -->
<view class="good-search-icon search-icon2" @click="goback()">取消</view>
<view class="good-search-icon search-icon iconfont iconsousuo-copy" @click="searchStart()"></view>
<scroll-view class="autocomplay" :style="{'top': inputHeight+5+'px'}" v-if="autocomplaystate" scroll-y>
<view class="autocomplay-item" v-for="(item,index) in autocomplayarr" :key="index" @click="tagsClick(item.value)">
<rich-text :nodes="item.richtxt"></rich-text>
</view>
<view style="color: #999;text-align: center;justify-content: center; line-height: 70rpx;" v-if="autocomplayarr.length<1">没有相关信息</view>
</scroll-view>
</view>
<view class="good-search-body">
<view class="search-history" v-if="hList.length > 0">
<view class="header">
<text>历史记录</text>
<view class="good-search-icon delete-icon iconfont iconshanchu" @click="delhistory()"></view>
</view>
<view class="list">
<view v-for="(item,index) in hList" :key="index" @click="tagsClick(item)">{{item}}</view>
</view>
</view>
<view class="search-showhot" v-if="hotList.length>0">
<view class="header">
<text>猜你想搜的</text>
</view>
<view class="list">
<view v-for="(item,index) in hotList" :key="index" @click="tagsClick(item)">{{item}}</view>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
clearValuebtn: { //是否显示清空按钮
type: Boolean,
default: true
},
isFocus: { //是否自动获取焦点
type: Boolean,
default: false
},
Theme: { //选择主题class
type: String,
default: 'good-search-circle'
},
maxLength: { //字符最大长度
type: [String, Number],
default: '140'
},
inputHeight: { //搜索框高度单位px
type: [String, Number],
default: '35'
},
inputPlaceholder: { //搜索框默认提示
type: String,
default: '请输入关键词搜索'
},
autoComplaylist: { //自动联想数据
type: Array,
default () {
return []
}
},
historyNum: { //历史记录保存数量
type: Number,
default: 6
},
hotList: { //推荐列表数据
type: Array,
default () {
return []
}
},
speechEngine: { //语音引擎=>讯飞:iFly,百度:'baidu'
type: String,
default: 'iFly'
},
Punctuation: { //是否开启语音识别标点符号
type: Boolean,
default: false
},
callbackTime: { //input回调缓冲时间(不返回500毫秒以内输入的数据防止每输入一个值就会触发一次)
type: Number,
default: 500
},
},
data() {
return {
speechengine: this.speechEngine,
punctuation: this.Punctuation,
historynum: this.historyNum,
callbacktime: this.callbackTime,
autocomplaylist: this.getcomplaylist(this.autoComplaylist),
autocomplayarr: [],
autocomplaystate: false,
searchText: '',
hList: uni.getStorageSync('search_cache'),
};
},
watch: {
historyNum: function(val) {
this.historynum = val;
},
speechEngine: function(val) {
this.engine = val;
},
hotList: function(val) {
this.hotList = val;
},
autoComplaylist: function(val) {
this.autocomplaylist = this.getcomplaylist(val);
if (!this.searchText || this.searchText == '') {
this.autocomplaystate = false
return
}
this.autocomplayarr = this.replacekeyword(this.autocomplaylist, this.searchText)
this.autocomplaystate = this.autocomplayarr.length > 0 ? true : false;
},
searchText: function(val) {
let _this = this;
var searchWords = val.replace(/^ +| +$/g, '');
if (!searchWords || searchWords == '') {
this.autocomplaystate = false
return
}
if (this.calbacktime) {
clearTimeout(_this.calbacktime)
}
this.calbacktime = setTimeout(function() {
_this.inputChange(searchWords)
}, _this.callbackTime);
this.autocomplayarr = this.replacekeyword(this.autocomplaylist, searchWords)
this.autocomplaystate = this.autocomplayarr.length > 0 ? true : false;
},
},
methods: {
goback(){
uni.navigateBack({
delta:1
})
},
clearvalue() { //删除input值
let _this = this;
setTimeout(function() { //增加延时解决键盘收回时导致的@input事件
_this.searchText = ''
}, 20);
this.searchText = ''
},
getcomplaylist(arr) { //初始化自动联想数组
var data = []
for (var i = 0; i < arr.length; i++) {
data.push({
richtxt: arr[i],
value: arr[i]
})
}
return data
},
replacekeyword(arr, searchWords) { //返回符合关键词的高亮数组
var data = []
for (var i = 0; i < arr.length; i++) {
if (arr[i].richtxt.search(searchWords) != -1) {
data.push({
richtxt: arr[i].richtxt.replace(searchWords, "<span style='color: #333;font-weight:bold'>" + searchWords +
"</span>"),
value: arr[i].value
})
}
}
return data
},
tagsClick(item) { //标签点击事件
let _this = this;
setTimeout(function() { //增加延时解决键盘收回时导致的@input事件
_this.searchText = item
_this.searchStart()
}, 20);
this.$emit('tagsClick', item)
},
inputChange(e) { //input回调
this.$emit('inputChange', e)
},
notSupport() { //不支持提醒
uni.showToast({
title: '该平台暂不支持',
icon: 'none',
duration: 1000
});
},
searchStart() { //触发搜索
let _this = this;
if (_this.searchText == '') {
uni.showToast({
title: '请输入关键字',
icon: 'none',
duration: 1000
});
return false;
}
// else {
// if(this.autocomplayarr.length<1){
// this.autocomplaystate=true
// return
// }
// uni.getStorage({
// key: 'search_cache',
// success(res) {
// let list = res.data;
// if (list.length >= _this.historynum) {
// for (let item of list) {
// if (item == _this.searchText) {
// return false;
// }
// }
// list.pop();
// list.unshift(_this.searchText);
// } else {
// for (let item of list) {
// if (item == _this.searchText) {
// return false;
// }
// }
// list.unshift(_this.searchText);
// }
// _this.hList = list;
// uni.setStorage({
// key: 'search_cache',
// data: _this.hList
// });
// },
// fail() {
// _this.hList = [];
// _this.hList.push(_this.searchText);
// uni.setStorage({
// key: 'search_cache',
// data: _this.hList
// });
// }
// })
// }
this.$emit('clickSearch', _this.searchText)
},
delhistory() { //清空历史记录
this.hList = [];
uni.setStorage({
key: 'search_cache',
data: []
});
this.$emit('delhHistory')
},
startRecognize() { //语音输入
let _this = this;
let options = {};
options.engine = _this.speechengine;
options.punctuation = _this.punctuation; // 是否需要标点符号
options.timeout = 1000;
plus.speech.startRecognize(options, function(s) {
_this.searchText = _this.searchText + s;
});
}
}
}
</script>
<style scoped>
@font-face {
font-family: 'iconfont';
src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAARsAAsAAAAACTAAAAQeAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDMgqFOIR/ATYCJAMUCwwABCAFhG0HXhshCBEVnP3IfiTGtg+yYk9cckRpaoLn+Ty/c9976WTSnw8NxB3gNgOIO3pXjJjRVmgD9Ab4PpuONYw5YTol8dSz/I/7dt/vpPE4jVIIiZD8//ctbT0e2HotiyTD+1qXxepTJ4rjgALadwoja4DGBsTHZGxxVg7MnJ/5HAI4FKQ80rBxy47YGGidADJs8MDe2B0bZoEj2MbAxFGDrMLCVovVA2Bl8fPyhapig8LS0Na2Axr1o66P31LPSsyiW0ZDfjgPYJ0CDZQHDMiYSd8wdJUrj8YJfs9QF3CwUSgfP9sv7bdMJCBU3ZDBkT5QN/OPp0ECkC4J7Lp5Az6JCAr8bBEE/NKyZX1L2NA60zI4Byq8AakDdnGd+mjadOnkCgUCQZe2JBWQrrOPLDlENBrCKQ7NOhx0lx6dfcRxJB73ZLxDIpGOsVjY60kZ8igzOXw9LgUBGelc6m3cuuVAZsRx5GvKIpG66zZnkSW0fl+aqQyrs2/PC4MqGm3k3o57OnjwGM/GYh13Xl76sMCgA5cKaldtu1A8yVt6VE6qgY0tiXyypWtSP/W45FhtsVi3dUuywx3Tq47MzuWFN8w+ujQr5G1cenhWZsfQenHrt0Nual5cNWf/2RnJgwa45BXXcaVvHjDIwtCj5mC0pbqoUevXj0rVykS01XygQmPGhkWi1q5CD1V4zJiwAgLTK6ixKmnjng+VFzQ3pz5/PqlPaRCoT+KaU6ZLu+LnFx6adKNhoZbr9a1bap1EeNbrdQ2mn6ZhlWmvN9uLq2TsP7U4b5W8FB5bv7F076IbRQtPLDExo9Ibadiy2+o5q1t1pdHrcsP37+hG3bvu21zld1OnSNq6uuWtV79fm/JtF9YYl+plfM3wiugNm1M99VW1huenTU6hsK5/2fz9ay5L1EmqairU5E15Nq0kzL1F8ywu6YspBjsP5znMJAAS1011/YKXvq7rYabb2/VcX9P+QgCB5CWns3um1PxmBw0AT9ymU0Q0kYEv+0/oCeR/Hjmzz4RKslvG701kftwixF9Dp4KSAyQQSufFYQxZ7EYQbLIaUOSgAGhsitMNuzxYBKkOAWzqgEM5PdXpIBlYa8TkBMryFiCk8gFFMpdBk8qXbtg/sMjmDwFSZQ0O4WVcGaSktKcGFplHCXyGVtCklNOfyuYb1mFgtq0suC+0rk1Ckeb9YoUT2kPscLEuvVegLI1wFa/hMBBoSx0Knzbe60uWqakPpYLGxYkGLMR4SAK4GdASyERlo73T4Ps3qBYMGLtAGYi/IMtpJwcKUnIGvdJNLMpLme1EtRLPU/oqxSIj4AoPGmSOAHp6UQcJXkqzQ0a7kGmDFFeXnt4wvsdjgAPNtkSJFiOWBEi7b3fydkLpGqZRkJ7PYym4QEmj2U8UJtGEQ+EtFgsAAA==') format('woff2');
}
.iconfont {
font-family: 'iconfont' !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.iconcombinedshapecopy:before {
content: "\e616";
}
.iconsousuo-copy:before {
content: "\e600";
}
.iconshanchu:before {
content: "\e64c";
}
.iconshanchu1:before {
content: "\e628";
}
page {
display: flex;
flex-direction: column;
box-sizing: border-box;
background-color: #F5F5F5;
}
view {
display: flex;
font-size: 28upx;
line-height: inherit
}
.good-search-page {
box-sizing: border-box;
width: 750rpx;
padding: 30rpx;
display: flex;
flex-direction: column;
}
.good-search-head {
position: relative;
}
.good-search-head input {
box-sizing: border-box;
width: 100%;
background-color: #F7F7F7;
font-size: 28rpx;
border-radius: 50rpx;
padding: 0 73rpx;
padding-left: 34rpx;
padding-right: 160rpx;
}
.good-search-head input.clearvalue{
}
.good-search-icon {
color: #888;
justify-content: center;
align-items: center;
font-size: 38rpx;
}
.good-search-head .good-search-icon {
width: 73rpx;
height: 100%;
position: absolute;
z-index: 2;
top: 0rpx;
}
.good-search-head .voice-icon {
left: 0;
}
.good-search-head .search-icon {
width: 63rpx;
right: 97rpx;
}
.good-search-head .search-icon2 {
font-size: 28rpx;
right: 0;
width: 73rpx;
padding-right: 24rpx;
}
.good-search-head .clearvalue-icon {
width: auto;
right: 146rpx;
color: #ccc;
}
.good-search-head .autocomplay {
left: 0;
top: 80rpx;
border-radius: 20rpx;
height: 70vh;
background: #f7f7f7;
position: absolute;
z-index: 9;
}
.good-search-head .autocomplay .autocomplay-item {
padding: 0 24rpx;
line-height: 70rpx;
height: 70rpx;
border-bottom: 1px #eee solid;
color: #999;
}
.good-search-body {
display: flex;
flex-direction: column;
}
.good-search-page .search-history {
display: flex;
flex-direction: column;
}
.good-search-page .search-showhot {
display: flex;
flex-direction: column;
}
/* 主题1 */
.good-search-rect {}
.good-search-rect .good-search-head input {
border-radius: 0;
}
.good-search-rect .good-search-head input.clearvalue{
}
.good-search-rect .good-search-head .voice-icon {}
.good-search-rect .good-search-head .search-icon {}
.good-search-rect .good-search-head .clearvalue-icon {}
.good-search-rect .header {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
margin: 24rpx 0;
padding: 0 12rpx;
}
.good-search-rect .header text {
color: #666;
font-weight: bold;
font-size: 32rpx;
margin-right: auto;
}
.good-search-rect .list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.good-search-rect .list view {
display: block;
width: 49%;
color: #8A8A8A;
font-size: 28rpx;
box-sizing: border-box;
text-align: center;
padding: 20rpx;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
background-color: #F7F7F7;
margin: 0.5%;
}
.good-search-rect .search-showhot {}
/* 主题2 */
.good-search-circle {}
.good-search-circle .good-search-head input {
border-radius: 50rpx;
}
.good-search-circle .good-search-head input.clearvalue{
}
.good-search-circle .good-search-head .voice-icon {}
.good-search-circle .good-search-head .search-icon {}
.good-search-circle .good-search-head .clearvalue-icon {}
.good-search-circle .header {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
margin: 24rpx 0;
padding: 0 12rpx;
}
.good-search-circle .header text {
color: #666;
font-weight: bold;
font-size: 32rpx;
margin-right: auto;
}
.good-search-circle .list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.good-search-circle .list view {
display: block;
padding: 8rpx 18rpx;
margin: 12rpx;
margin-top: 0;
font-size: 28rpx;
color: #8A8A8A;
background-color: #F7F7F7;
box-sizing: border-box;
text-align: center;
border-radius: 20rpx;
}
.good-search-circle .search-showhot {}
/* 主题3 */
.good-search-tb {}
.good-search-tb .good-search-head input {
border-radius: 0;
}
.good-search-tb .good-search-head input.clearvalue{
padding-right: 133rpx;
}
.good-search-tb .good-search-head .voice-icon {}
.good-search-tb .good-search-head .search-icon {
background: #FF9A33;
color: #fff;
}
.good-search-tb .good-search-head .clearvalue-icon {
width: 60rpx;
}
.good-search-tb .header {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
margin: 24rpx 0;
padding: 0 12rpx;
}
.good-search-tb .header text {
color: #666;
font-weight: bold;
font-size: 32rpx;
margin-right: auto;
}
.good-search-tb .list {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.good-search-tb .list view {
display: block;
padding: 8rpx 30rpx;
margin: 12rpx;
margin-top: 0;
font-size: 28rpx;
color: #8A8A8A;
background-color: #F7F7F7;
box-sizing: border-box;
text-align: center;
border-radius: 20rpx;
}
.good-search-tb .search-showhot {}
</style>