Browse Source

Merge pull request '微博小妙招搜索' (#101) from zbx_weibo into master

Reviewed-on: #101
master
longchao 4 weeks ago
parent
commit
d9eec11bee
  1. 39
      control/weibo.php
  2. 107
      model/mEs.php
  3. 11
      model/mWeibo.php
  4. 326
      tools/es.php
  5. 92
      tools/es_add_comments.php
  6. 66
      tools/es_search.php
  7. 95
      tools/es_setting.php
  8. 0
      tools/nohup.out
  9. 31
      view/js/index.js
  10. 3
      view/templates/include/header.html
  11. 211
      view/templates/weibo/search.html
  12. 170
      view/templates/weibo/weibo_search.html

39
control/weibo.php

@ -59,17 +59,32 @@ class weibo extends publicBase {
$cur_page = $this->post('currentPage') ? $this->post('currentPage') : 1;
$page_size = $this->post('pageSize') ? $this->post('pageSize') : 20;
$condition = array();
if ($spider_comment_status) {
$condition['spider_comment_status'] = $spider_comment_status;
$condition['uid'] = WEIBO_USER_ZHANG;
$es_search = $this->post('es_search') + 0;
$obj = new mWeibo();
if($es_search) {
$total = 0;
$list = array();
$eobj = new mEs('weibo');
$page_size = 50;
$keyword = trim($this->post('keyword'));
if (!empty($keyword)) {
$weibo_list = $eobj->searchWeibo($keyword);
$total = $weibo_list['total'];
$list = $weibo_list['list'];
}
}else{
$condition['status'] = $status;
}
$condition = array();
if ($spider_comment_status) {
$condition['spider_comment_status'] = $spider_comment_status;
$condition['uid'] = WEIBO_USER_ZHANG;
}else{
$condition['status'] = $status;
}
$obj = new mWeibo();
$total = $obj->getWeiboTotal($condition);
$list = $obj->getWeiboList($condition, $cur_page, $page_size);
$total = $obj->getWeiboTotal($condition);
$list = $obj->getWeiboList($condition, $cur_page, $page_size);
}
$rdata = array(
'total' => $total,
@ -209,4 +224,10 @@ class weibo extends publicBase {
$this->ajax_json(true, '333');
}
public function search() {
$keyword = trim($this->get('keyword'));
if(!empty($keyword)) $this->view['keyword'] = urldecode($keyword);
}
}

107
model/mEs.php

@ -0,0 +1,107 @@
<?php
/**
*
*/
include_once(SERVER_ROOT . "/model/mBase.php");
class mEs extends mBase {
public $es_host = '127.0.0.1';
public $es_port = 9200;
public $es_index = '';
public function __construct($index) {
$this->es_index = $index;
}
public function search($body) {
$es_url = "http://" . $this->es_host . ":" . $this->es_port . "/{$this->es_index}/_search";
return $this->postCUrl($es_url, $body, 10, false, true);
}
public function searchWeibo($keywords) {
if(empty($keywords)) return false;
$from = 0;
$size = 50;
$body = [
'query' => [
'bool' => [
'should' => [
[
'match' => [
'content' => [
'query' => $keywords,
'boost' => 4,
]
]
],
],
],
],
'highlight' => [
'fields' => [
'content' => [
'fragment_size' => 2,
'number_of_fragments' => 20,
'pre_tags' => [''],
'post_tags' => ['']
]
]
],
'from' => $from,
'size' => $size
];
$res = $this->search(json_encode($body));
$list = json_decode($res, true);
if(empty($res) || empty($list['hits'])) {
$this->setError('获取失败');
return false;
}
$rdata['total'] = $list['hits']['total']+0;
$data['list'] = $list['hits']['hits'];
if($rdata['total'] <= 0) {
$rdata['list'] = array();
return $rdata;
}
$rdata['total'] = $size;
$weibo_ids = array_column($data['list'], '_id');
$obj = new mWeibo();
$list = $obj->getWeiboByIds($weibo_ids);
$rlist = array();
foreach($data['list'] as $v) {
$weibo_id = $v['_id'];
$weibo = $list[$weibo_id];
if(empty($weibo)) continue;
$highlights = $v['highlight']["content"];
if(!empty($highlights)) {
foreach($highlights as $k=>$val) {
$weibo['text'] = str_replace($val, '<em class="highlight" style="color:green;">'.$val.'</em>', $weibo['text']);
}
}
$weibo['name'] = '张宝旬';
$pic_ids = json_decode($weibo['pic_ids'], 1);
$pic_arr = array();
if ($pic_ids) {
foreach ($pic_ids as $pic_id) {
$pic_arr[] = $obj->getPicOssUrl($pic_id, $weibo['created_at']);
}
}
$weibo['pic_arr'] = $pic_arr;
if ($weibo['video_url']) $weibo['video_url'] = $obj->getVideoOssUrl($weibo['wid'], $weibo['created_at']);
if ($weibo['video_cover']) $weibo['video_cover'] = $obj->getPicOssUrl($weibo['video_cover'], $weibo['created_at']);
$rdata['list'][] = $weibo;
}
return $rdata;
}
}

11
model/mWeibo.php

@ -123,4 +123,15 @@ class mWeibo extends mBase {
public function getWeiboByWids($wids) {
return $this->obj->selectIn($this->tbl, array('wid'=>$wids));
}
public function getWeiboByIds($ids) {
$res = $this->obj->selectIn($this->tbl, array('id'=>$ids));
if (empty($res)) return array();
$list = array();
foreach ($res as $v) {
$list[$v['id']] = $v;
}
return $list;
}
}

326
tools/es.php

@ -0,0 +1,326 @@
<?php
use Elasticsearch\ClientBuilder;
class ES
{
//ES客户端链接
private $client;
private $index_name;
/**
* 初始化ES连接
* ES constructor.
*/
public function __construct($index)
{
$params = array(
'127.0.0.1:9200'
);
$this->client = ClientBuilder::create()->setHosts($params)->build();
$this->index_name = $index;
return $this->client;
}
/**
* 判断索引是否存在
* @param string $index_name
* @return bool|mixed|string
*/
public function exists_index($index_name = 'test_ik')
{
$params = [
'index' => $index_name
];
try {
return $this->client->indices()->exists($params);
} catch (\Exception $e) {
return false;
}
}
/**
* 创建索引
* @param string $index_name
* @return array|mixed|string
*/
public function create_index($index_name = 'test_ik')
{
$params = [
'index' => $index_name,
'body' => [
'settings' => [
'number_of_shards' => 3,
'number_of_replicas' => 0
]
]
];
try {
return $this->client->indices()->create($params);
} catch (\Exception $e) {
return false;
}
}
/**
* 删除索引
* @param string $index_name
* @return array
*/
public function delete_index($index_name = 'test_ik')
{
$params = ['index' => $index_name];
$response = $this->client->indices()->delete($params);
return $response;
}
/**
* 添加文档
* @param $params
* $params = [
* 'index' => "es",
* 'type' => "article",
* "body" => [
* "title" => "",
* ]
* ];
* @return array
*/
public function add_doc($params)
{
return $this->client->index($params);
}
/**
* 判断文档存在
* @param int $id
* @param string $index_name
* @param string $type_name
* @return array|bool
*/
public function exists_doc($id = 1, $index_name = 'test_ik', $type_name = 'goods')
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id
];
$response = $this->client->exists($params);
return $response;
}
/**
* 获取文档
* @param int $id
* @param string $index_name
* @param string $type_name
* @return array
*/
public function get_doc($id = 1, $index_name = 'test_ik', $type_name = 'goods')
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id
];
$response = $this->client->get($params);
return $response;
}
/**
* 修改文档
*$params = [
'index' => "es",
'type' => "article",
'id' => "OIwzxXgBzF70K-DobSSC",
"body" => [
"doc" => [
"title" => "6100万颗心的共同记忆 再次C位亮相,闪耀全球!",
"desn" => "刚刚过去的这个清明节,与往年一样,有人凭寄哀思,有人缅怀忠魂。但也有一些瞬间,让人记起久久不能释怀,给这个特殊节气增添了一些格外不同的味道。"
]
]
];
* @param array $params
* @return array
*/
public function update_doc($params = [])
{
$response = $this->client->update($params);
return $response;
}
/**
* 删除文档
* @param int $id
* @param string $index_name
* @param string $type_name
* @return array
*/
public function delete_doc($id = 1, $index_name = 'test_ik', $type_name = 'goods')
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id
];
$response = $this->client->delete($params);
return $response;
}
/**
* 搜索文档 (分页,排序,权重,过滤)
* @param string $index_name
* @param string $type_name
* @param array $body
$body = [
'query' => [
'bool' => [
'should' => [
[
'match' => [
'cate_name' => [
'query' => $keywords,
'boost' => 4, // 权重大
]
]
],
[
'match' => [
'goods_name' => [
'query' => $keywords,
'boost' => 3,
]
]
],
[
'match' => [
'goods_introduce' => [
'query' => $keywords,
'boost' => 2,
]
]
]
],
],
],
'sort' => ['id'=>['order'=>'desc']],
'from' => $from,
'size' => $size
];
* @return array
*/
public function search_doc($index_name = "test_ik", $type_name = "goods", $body = [])
{
$params = [
'index' => $index_name,
'type' => $type_name,
'body' => $body
];
$results = $this->client->search($params);
return $results;
}
/**
* @param string $index_name 搜索列表
* @param string $type_name
* @return array|callable
*
*/
public function select_doc($index_name = 'test_ik', $type_name = 'goods'){
$params=[
'index' => $index_name,
'type' => $type_name,
];
$response = $this->client->search($params);
return $response;
}
/**
* @param string $index_name // 高亮显示
* @param string $type_name
* @param array $body
* @return array|callable
*
*
$body=[
'query' => [
'match' => [
'desn' => '董事长'
]
],
'highlight' => [
'pre_tags' => ["<b class='key' style='color:red'>"],
'post_tags' => ["</b>"],
'fields' => [
"desn" => new \stdClass()
]
],
];
*/
public function highlight_doc($index_name = 'test_ik', $type_name = 'goods' , $body = []){
$params=[
'index' => $index_name,
'type' => $type_name,
'body' => $body
];
$response = $this->client->search($params);
return $response;
}
public function create_weibo_index() {
$res = $this->exists_index($this->index_name);
if($res) return true;
$params = [
'index' => $this->index_name,
'body' => [
'settings' => [
'number_of_shards' => 2,
'number_of_replicas' => 1,
'analysis' => [
'analyzer' => [
'ik_analyzer' => [
'type' => 'custom',
'tokenizer' => 'ik_max_word'
]
]
]
],
'mappings' => [
'properties' => [
'id' => ['type' => 'long'],
'uid' => ['type' => 'long'],
'wid' => ['type' => 'long'],
'content' => [
'type' => 'text',
'analyzer' => 'ik_max_word',
// 'fields' => [
// 'semantic' => [
// 'type' => 'dense_vector',
// 'dims' => 768
// ]
// ]
],
'created_at' => ['type' => 'date'],
'comments_count' => ['type' => 'long'],
'attitudes_count' => ['type' => 'long'],
'status' => ['type' => 'long']
]
]
]
];
try {
return $this->client->indices()->create($params);
} catch (\Exception $e) {
return false;
}
}
}

92
tools/es_add_comments.php

@ -0,0 +1,92 @@
<?php
// nohup php /data1/www/zhishiku.kuailelunwen.com/tools/es_add_comments.php &
include_once(dirname(dirname(__FILE__))."/vendor/autoload.php");
include_once(dirname(dirname(__FILE__))."/tools/es.php");
function parseDbCnf($dbflag) {
$configs = parse_ini_file(dirname(dirname(__FILE__)).'/config/database.ini', true);
$config = $configs[strtolower($dbflag)];
$host_port = $config['master'];
$hps = explode(',', $host_port);
$random = rand(0, count($hps)-1);
$hp = $hps[$random];
list($host, $port) = explode(':', $hp);
$cnf = array();
$cnf['host'] = trim($host);
$cnf['port'] = trim($port);
$cnf['user'] = trim($config['user']);
$cnf['pwd'] = trim($config['passwd']);
$cnf['db'] = trim($config['db']);
return $cnf;
}
$mysqlconfig = parseDbCnf('simplyphp');
$servername = $mysqlconfig['host'];
$username = $mysqlconfig['user'];
$password = $mysqlconfig['pwd'];
$dbname = $mysqlconfig['db'];
$obj = new \ES('weibo');
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
$limit = 5000;
$min_id = 0;
$log_path = '/datacenter/zhishiku/es_comment.log';
$log_path_success = '/datacenter/zhishiku/es_success_comment.log';
$log_path_err = '/datacenter/zhishiku/es_error_comment.log';
for($page=0;;$page++){
$sql = "SELECT * FROM spider_weibo_comments where is_search=1 and id>".$min_id." order by id asc limit ".$limit;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$min_id = $row['id'];
if(str_replace(" ", "", $row["content"])=="") continue;
$data['id'] = $row['id']+0;
$data['uid'] = $row['uid']+0;
$data['weibo_id'] = $row['weibo_id']+0;
$data['content'] = $row['content'];
if (!empty($row['comment_time'])) {
$data['comment_time'] = date('c', strtotime($row['comment_time']));
} else {
$data['comment_time'] = null;
}
$params['index'] = 'comments';
$params['type'] = 'doc';
$params['id'] = $data['id'];
$params['body'] = $data;
try {
$resc = $obj->add_doc($params);
if($resc['result'] != 'created') {
error_log('error:'.json_encode($data)."\n", 3, $log_path_err);
}else{
error_log($resc['_id']."|{$min_id}\n", 3, $log_path_success);
}
} catch (\Exception $th) {
error_log('excption:'.$th->getMessage().'|'.json_encode($data).'|'.$min_id."\n", 3, $log_path_err);
}
}
error_log((($page*$limit)+$result->num_rows)."|".$page."\n", 3, $log_path);
if($result->num_rows<$limit) break;
} else {
error_log((($page*$limit)+$result->num_rows)."|".$page."\n", 3, $log_path);
break;
}
}
$conn->close();
?>

66
tools/es_search.php

@ -0,0 +1,66 @@
<?php
error_reporting(0);
ini_set('display_errors', 0);
// nohup php /data1/www/zhishiku.kuailelunwen.com/tools/es_search.php &
include_once(dirname(dirname(__FILE__))."/vendor/autoload.php");
include_once(dirname(dirname(__FILE__))."/tools/es.php");
$data['status'] = false;
$data['info'] = '';
$data['data'] = [];
$obj = new \ES('weibo');
$from = 0;
$size = 25;
$keywords = $_POST['key'];
$token = $_POST['token'];
// $keywords = '发烧';
// $token = "ahckexb@!@#!@#$%cdasd%$";
if($token != "ahckexb@!@#!@#$%cdasd%$") {
echo 'succ';
exit;
}
if(empty($keywords)) {
$data['info'] = '错误';
echo json_encode($data, true);
exit;
}
$body = [
'query' => [
'bool' => [
'should' => [
[
'match' => [
'content' => [
'query' => $keywords,
'boost' => 4,
]
]
],
],
],
],
'from' => $from,
'size' => $size
];
$res = $obj->search_doc('weibo', 'doc', $body);
$hits = $res['hits']['hits'];
if(empty($hits)){
$data['info'] = '数据为空';
echo json_encode($data, true);
exit;
}
$rdata = [];
foreach($hits as $val) {
$rdata[] = $val['_source'];
}
$data['status'] = true;
$data['data'] = $rdata;
echo json_encode($data, true);
exit;

95
tools/es_setting.php

@ -0,0 +1,95 @@
<?php
// nohup php /data1/www/zhishiku.kuailelunwen.com/tools/es_setting.php &
include_once(dirname(dirname(__FILE__))."/vendor/autoload.php");
include_once(dirname(dirname(__FILE__))."/tools/es.php");
function parseDbCnf($dbflag) {
$configs = parse_ini_file(dirname(dirname(__FILE__)).'/config/database.ini', true);
$config = $configs[strtolower($dbflag)];
$host_port = $config['master'];
$hps = explode(',', $host_port);
$random = rand(0, count($hps)-1);
$hp = $hps[$random];
list($host, $port) = explode(':', $hp);
$cnf = array();
$cnf['host'] = trim($host);
$cnf['port'] = trim($port);
$cnf['user'] = trim($config['user']);
$cnf['pwd'] = trim($config['passwd']);
$cnf['db'] = trim($config['db']);
return $cnf;
}
$mysqlconfig = parseDbCnf('simplyphp');
$servername = $mysqlconfig['host'];
$username = $mysqlconfig['user'];
$password = $mysqlconfig['pwd'];
$dbname = $mysqlconfig['db'];
$obj = new \ES('weibo');
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
$conn->set_charset("utf8mb4");
$limit = 5000;
$min_id = 0;
$log_path = '/datacenter/zhishiku/es.log';
$log_path_success = '/datacenter/zhishiku/es_success.log';
$log_path_err = '/datacenter/zhishiku/es_error.log';
for($page=0;;$page++){
$sql = "SELECT * FROM spider_weibo where uid=2282201403 and id>".$min_id." order by id asc limit ".$limit;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$min_id = $row['id'];
if(str_replace(" ", "", $row["text"])=="") continue;
$data['id'] = $row['id']+0;
$data['uid'] = $row['uid']+0;
$data['wid'] = $row['wid']+0;
$data['content'] = $row['text'];
if (!empty($row['created_at'])) {
$data['created_at'] = date('c', strtotime($row['created_at']));
} else {
$data['created_at'] = null;
}
$data['comments_count'] = $row['comments_count']+0;
$data['attitudes_count'] = $row['attitudes_count']+0;
$data['reposts_count'] = $row['reposts_count']+0;
$data['status'] = $row['status']+0;
$params['index'] = 'weibo';
$params['type'] = 'doc';
$params['id'] = $data['id'];
$params['body'] = $data;
try {
$resc = $obj->add_doc($params);
if($resc['result'] != 'created') {
error_log('error:'.json_encode($data)."\n", 3, $log_path_err);
}else{
error_log($resc['_id']."|{$min_id}\n", 3, $log_path_success);
}
} catch (\Exception $th) {
error_log('excption:'.$th->getMessage().'|'.json_encode($data).'|'.$min_id."\n", 3, $log_path_err);
}
}
error_log((($page*$limit)+$result->num_rows)."|".$page."\n", 3, $log_path);
if($result->num_rows<$limit) break;
} else {
error_log((($page*$limit)+$result->num_rows)."|".$page."\n", 3, $log_path);
break;
}
}
$conn->close();
?>

0
tools/nohup.out

31
view/js/index.js

@ -4,6 +4,7 @@ $(document).ready(function () {
var cur_editdata = {}; //当前编辑数据
var vediourl = ''
var hidecomments = $('#hidecomments').length
var hidesearch = $('#hidesearch').length
$('.radio-wrap').on('click', '.radio_box input', function () {
var radio_val = $(this).attr('value')
@ -464,6 +465,16 @@ $(document).ready(function () {
}
}
if(hidesearch == 1) {
var param = {
currentPage,
pageSize,
spider_comment_status:2,
es_search:1,
keyword:$('#hidekeyword').text()
}
}
$.ajax({
type: "post",
dataType: 'json',
@ -473,7 +484,6 @@ $(document).ready(function () {
if(!res.status){
alert(`请求失败`);
}
renderData(res.data)
}
})
@ -490,6 +500,25 @@ $(document).ready(function () {
renderList()
var html1 = '';
if(pageData.length == 0 && hidesearch == 1) {
var desctxt = '请输入症状进行查询'
if($('#hidekeyword').text().trim().length>0) desctxt = '暂无数据'
html1 = `<div class="list_item">
<div class="list_item_content">
<div class="list_item_title" style="text-align:center;">
<span class="list_item_title_name">`+desctxt+`</span>
</div>
</div>
</div>`
$('#data-list').html(html1);
}
if(hidesearch == 1 && pageData.length > 0) {
$('#data-list').html(html1);
}
// 渲染当前页数据
pageData.forEach(item => {
let imagesHTML = '';

3
view/templates/include/header.html

@ -15,6 +15,9 @@
{if $_user_info.is_super_admin}
<a href="/weibo/comments">微博评论</a>
{/if}
{if $_user_info.is_super_admin}
<a href="/weibo/search">微博小妙招</a>
{/if}
<a href="/loginout">退出</a>
</div>
</div>

211
view/templates/weibo/search.html

@ -0,0 +1,211 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>知识库</title>
<link rel="stylesheet" href="{$smarty.const.CSS_URL}/css/common.css?v={$smarty.const.CSS_JS_VERSION}">
<link rel="stylesheet" href="{$smarty.const.CSS_URL}/css/index.css?v={$smarty.const.CSS_JS_VERSION}">
<script src="{$smarty.const.CSS_URL}/js/jquery-3.6.0.min.js"></script>
{literal}
<style>
.search-wrapper{
column-gap: 12px;
width: 100%;
}
.search-wrapper input{
width: 200px;
padding-left: 8px;
}
.addNewBtn2 {
width: 121px;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
height: 32px;
border-radius: 3px;
opacity: 1;
height: 32px;
border:none;
background: #006AFF;
font-weight: normal;
line-height: normal;
letter-spacing: 0.08em;
color: #FFFFFF;
}
</style>
{/literal}
</head>
<body>
<div class="home-page">
{include file="include/header.html"}
<div class="home-main-content">
<div class="home-main">
<div class="tab-list index-nav-wrap flex">
<div class="search-wrapper flex">
<input type="text" placeholder="输入症状进行查询" id="search-input" value="{$keyword}">
<button class="addNewBtn2" id="searchWeibo">
搜索
</button>
</div>
</div>
<div class="list_all" id="data-list">
</div>
<!-- 数据列表 -->
<!-- <ul id="data-list"></ul> -->
<!-- 分页控件 -->
<div class="pagination hide">
<img id="prev-page" src="{$smarty.const.CSS_URL}/images/prev.svg" alt="">
<ul id="page-numbers"></ul>
<img id="next-page" src="{$smarty.const.CSS_URL}/images/next.svg" alt="">
<div class="input-page">
<span>前往</span>
<input type="number" id="jump-to-page" min="1" placeholder="页码">
<span></span>
</div>
<button id="go-to-page">跳转</button>
</div>
<!-- 放大后的图片容器 -->
<div id="large-image-container">
<h2>预览</h2>
<img id="large-image" src="{$smarty.const.CSS_URL}/images/viewimg1.png" alt="Large Image">
<span id="close-btn2">×</span>
</div>
<!-- 放大后的视频容器 -->
<div id="large-video-container">
<video id="large-video" controls>
<source id="large-viedo-url" src="" type="video/mp4">
Your browser does not support the video tag.
</video>
<button id="close-btn">×</button>
</div>
<!-- 弹框 -->
<div class="modal-overlay"></div>
<div class="modal">
<div class="modal_top">
<b id="header_title">编辑</b>
<img src="{$smarty.const.CSS_URL}/images/close_modal.svg" id="close_modal" alt="">
</div>
<div class="add-form">
<div class="form-item radio-form">
<input type="hidden" id="id" value="">
<div class="form-left">
录入形式
</div>
<div class="form-right radio-wrap flex">
<div class="radio_box radio_box_active">
<input value="1" type="radio"id="edu1">
<div></div>
<label >信息段录入</label>
</div>
<div class="radio_box">
<input value="2" type="radio"id="edu2">
<div></div>
<label >问答式录入</label>
</div>
</div>
</div>
<div class="form-item normal-form" style="display: none;">
<div class="form-left">
提问信息
</div>
<div class="form-right">
<div class="text-area-container">
<textarea class="edit-input normal-input" ></textarea>
<div class="char-count wordNum">0/200</div>
</div>
</div>
</div>
<div class="form-item">
<div class="form-left common-input">
回答信息
</div>
<div class="form-right">
<div class="text-area-container">
<textarea class="edit-input answer-input" ></textarea>
<div class="char-count1 wordNum">0/200</div>
</div>
</div>
</div>
</div>
{literal}
<script>
const maxLength = 100; // 设置最大字数限制
$('.normal-input').on('input', function () {
var currentLength = $(this).val().length;
$('.char-count').text(currentLength + '/' + maxLength);
if (currentLength > maxLength) {
$('.normal-input').val($('.normal-input').val().slice(0, maxLength))
$('.char-count').text(maxLength + '/' + maxLength);
}
});
$('.answer-input').on('input', function () {
var currentLength = $(this).val().length;
$('.char-count1').text(currentLength + '/' + maxLength);
if (currentLength > maxLength) {
$('.answer-input').val($('.answer-input').val().slice(0, maxLength))
$('.char-count1').text(maxLength + '/' + maxLength);
}
});
</script>
{/literal}
<div class="img_list2" style="display: none;"></div>
<div class="preview"></div>
<div class="modal_upload_btn flex hide">
<div class="flex modal_btns">
<button id="upload-image-btn" class="button upload_btn">
<img src="{$smarty.const.CSS_URL}/images/img_upload.svg" alt="">上传图片
</button>
<button id="upload-video-btn" class="button upload_btn">
<img src="{$smarty.const.CSS_URL}/images/vedio_upload.svg" alt="">上传视频
</button>
</div>
<p>支持 jpg、png、mp4 格式,单个文件不超过 10MB</p>
</div>
<input type="file" id="upload-image" accept="image/*" style="display: none;" multiple>
<input type="file" id="upload-video" accept="video/*" style="display: none;" multiple>
<div class="buttons flex">
<button id="submit" class="button ">仅保存</button>
<button id="savePass" class="button button-primary">保存并通过审批</button>
</div>
</div>
</div>
</div>
{include file="include/footer.html"}
</div>
<div id="hidecomments" style="display: none;"></div>
<div id="hidesearch" style="display: none;"></div>
<div id="hidekeyword" style="display: none;">{$keyword}</div>
</body>
<script src="{$smarty.const.CSS_URL}/js/index.js?v={$smarty.const.CSS_JS_VERSION}589"></script>
{literal}
<script>
$('#searchWeibo').click(function () {
var keyword = $('#search-input').val()
if (keyword) {
window.location.href = '/weibo/search?keyword=' + keyword
} else {
window.location.href = '/weibo/search'
}
})
</script>
{/literal}
</html>

170
view/templates/weibo/weibo_search.html

@ -0,0 +1,170 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>知识库</title>
<link rel="stylesheet" href="{$smarty.const.CSS_URL}/css/common.css?v={$smarty.const.CSS_JS_VERSION}">
<link rel="stylesheet" href="{$smarty.const.CSS_URL}/css/index.css?v={$smarty.const.CSS_JS_VERSION}">
<script src="{$smarty.const.CSS_URL}/js/jquery-3.6.0.min.js"></script>
</head>
<body>
<div class="home-page">
{include file="include/header.html"}
<div class="home-main-content">
<div class="home-main">
<div class="tab-list index-nav-wrap flex">
<ul class="tab-wrap" style="display: none;">
<li class="index-nav-wrap-li" type="1"><span class="active">待审批</span></li>
<li class="index-nav-wrap-li" type="2"><span>已审批</span></li>
<li class="index-nav-wrap-li" type="3"><span>已删除</span></li>
</ul>
<button class="addNewBtn" style="display: none;">
<img src="{$smarty.const.CSS_URL}/images/add.svg" alt="">新增自录入
</button>
</div>
<div class="list_all" id="data-list">
</div>
<!-- 数据列表 -->
<!-- <ul id="data-list"></ul> -->
<!-- 分页控件 -->
<div class="pagination hide">
<img id="prev-page" src="{$smarty.const.CSS_URL}/images/prev.svg" alt="">
<ul id="page-numbers"></ul>
<img id="next-page" src="{$smarty.const.CSS_URL}/images/next.svg" alt="">
<div class="input-page">
<span>前往</span>
<input type="number" id="jump-to-page" min="1" placeholder="页码">
<span></span>
</div>
<button id="go-to-page">跳转</button>
</div>
<!-- 放大后的图片容器 -->
<div id="large-image-container">
<h2>预览</h2>
<img id="large-image" src="{$smarty.const.CSS_URL}/images/viewimg1.png" alt="Large Image">
<span id="close-btn2">×</span>
</div>
<!-- 放大后的视频容器 -->
<div id="large-video-container">
<video id="large-video" controls>
<source id="large-viedo-url" src="" type="video/mp4">
Your browser does not support the video tag.
</video>
<button id="close-btn">×</button>
</div>
<!-- 弹框 -->
<div class="modal-overlay"></div>
<div class="modal">
<div class="modal_top">
<b id="header_title">编辑</b>
<img src="{$smarty.const.CSS_URL}/images/close_modal.svg" id="close_modal" alt="">
</div>
<div class="add-form">
<div class="form-item radio-form">
<input type="hidden" id="id" value="">
<div class="form-left">
录入形式
</div>
<div class="form-right radio-wrap flex">
<div class="radio_box radio_box_active">
<input value="1" type="radio"id="edu1">
<div></div>
<label >信息段录入</label>
</div>
<div class="radio_box">
<input value="2" type="radio"id="edu2">
<div></div>
<label >问答式录入</label>
</div>
</div>
</div>
<div class="form-item normal-form" style="display: none;">
<div class="form-left">
提问信息
</div>
<div class="form-right">
<div class="text-area-container">
<textarea class="edit-input normal-input" ></textarea>
<div class="char-count wordNum">0/200</div>
</div>
</div>
</div>
<div class="form-item">
<div class="form-left common-input">
回答信息
</div>
<div class="form-right">
<div class="text-area-container">
<textarea class="edit-input answer-input" ></textarea>
<div class="char-count1 wordNum">0/200</div>
</div>
</div>
</div>
</div>
{literal}
<script>
const maxLength = 100; // 设置最大字数限制
$('.normal-input').on('input', function () {
var currentLength = $(this).val().length;
$('.char-count').text(currentLength + '/' + maxLength);
if (currentLength > maxLength) {
$('.normal-input').val($('.normal-input').val().slice(0, maxLength))
$('.char-count').text(maxLength + '/' + maxLength);
}
});
$('.answer-input').on('input', function () {
var currentLength = $(this).val().length;
$('.char-count1').text(currentLength + '/' + maxLength);
if (currentLength > maxLength) {
$('.answer-input').val($('.answer-input').val().slice(0, maxLength))
$('.char-count1').text(maxLength + '/' + maxLength);
}
});
</script>
{/literal}
<div class="img_list2" style="display: none;"></div>
<div class="preview"></div>
<div class="modal_upload_btn flex hide">
<div class="flex modal_btns">
<button id="upload-image-btn" class="button upload_btn">
<img src="{$smarty.const.CSS_URL}/images/img_upload.svg" alt="">上传图片
</button>
<button id="upload-video-btn" class="button upload_btn">
<img src="{$smarty.const.CSS_URL}/images/vedio_upload.svg" alt="">上传视频
</button>
</div>
<p>支持 jpg、png、mp4 格式,单个文件不超过 10MB</p>
</div>
<input type="file" id="upload-image" accept="image/*" style="display: none;" multiple>
<input type="file" id="upload-video" accept="video/*" style="display: none;" multiple>
<div class="buttons flex">
<button id="submit" class="button ">仅保存</button>
<button id="savePass" class="button button-primary">保存并通过审批</button>
</div>
</div>
</div>
</div>
{include file="include/footer.html"}
</div>
<div id="hidecomments" style="display: none;"></div>
</body>
<script src="{$smarty.const.CSS_URL}/js/index.js?v={$smarty.const.CSS_JS_VERSION}589"></script>
</html>
Loading…
Cancel
Save