related movies sql modified

This commit is contained in:
mubai
2023-04-24 00:20:44 +08:00
parent 36b8ef7ed9
commit cebaf2cdbf
13 changed files with 158 additions and 99 deletions

View File

@@ -1,7 +1,7 @@
<template>
<div class="c_content" >
<div class="item" v-for="item in list" :style="{width: `calc(${ list.length <= 12 ? 16 : 14}% - 16px)`}">
<a :href="`/filmDetail?link=${item.id}`" class="default_image" >
<a :href="`/filmDetail?link=${item.id}`" class="default_image link_content" >
<div class="tag_group">
<span class="cus_tag ">{{ item.year?item.year.slice(0,4):'未知' }}</span>
<span class="cus_tag ">{{ item.cName }}</span>
@@ -51,7 +51,7 @@ const handleImg =(e:Event)=>{
overflow: hidden;
}
.item a {
.item .link_content {
padding-top: 125%;
position: relative;
border-radius: 5px;
@@ -115,7 +115,7 @@ const handleImg =(e:Event)=>{
box-sizing: border-box;
}
.item a {
.item .link_content {
border-radius: 5px;
padding-top: 125%;
background-size: cover;
@@ -167,9 +167,10 @@ const handleImg =(e:Event)=>{
width: 96%!important;
padding: 2px 10px 2px 2px !important;
text-align: left;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.cus_remark {

View File

@@ -1,7 +1,7 @@
<template>
<div class="container">
<el-empty style="height: 100%; line-height: 100%; font-size: 20px" :image-size="400"
image="/src/assets/image/404.png">
:image="notFoundImg">
<template #description>
<p style="font-size: 32px;width: 100%;color: #a574b7;margin-bottom: 20px">你好像走错地方了哦!!!</p>
<button @click="handleError('home')" >主页</button>
@@ -13,6 +13,7 @@
<script setup lang="ts">
import {useRouter} from "vue-router";
import notFoundImg from '../../assets/image/404.png'
const router = useRouter()
const handleError = (t:string) =>{

View File

@@ -3,10 +3,11 @@
<div class="header">
<p>{{ d.category.name }}</p>
<div class="c_header">
<a :class="`nav ${d.list.length >0 && d.list[0].cid == c.id?'active':''}`" href="javascript:;"
@click="changeCategory(c.id)"
<!--默认全部-->
<a :class="`nav ${d.cid == -1?'active':''}`" :href="`/categoryFilm?pid=${d.category.id}`">全部{{d.category.name}}</a>
<!--子分类-->
<a :class="`nav ${d.cid == c.id?'active':''}`" :href="`/categoryFilm?pid=${c.pid}&cid=${c.id}&current=1`"
v-for="c in d.category.children">{{ c.name }}</a>
<!-- <a :class="`nav `" href="javascript:;" @click="changeCategory">{{ d.category.name }}</a>-->
</div>
</div>
@@ -46,6 +47,7 @@ const d = reactive({
page: {
current: 0,
},
cid: -1
})
// 获取路由参数查询对应数据
@@ -63,11 +65,10 @@ const changeCurrent = (currentVal: number) => {
}
// 点击分类事件
const changeCategory = (cid?: any) => {
let params = new URLSearchParams(location.search)
// location.href = `/categoryFilm?pid=${params.get('pid')}&cid=${cid}&current=${params.get('current')?params.get('current'):1}`
location.href = cid ? `/categoryFilm?pid=${params.get('pid')}&cid=${cid}&current=1` : `/categoryFilm?pid=${params.get('pid')}`
}
// const changeCategory = (cid?: any) => {
// let params = new URLSearchParams(location.search)
// location.href = cid ? `/categoryFilm?pid=${params.get('pid')}&cid=${cid}&current=1` : `/categoryFilm?pid=${params.get('pid')}`
// }
const getFilmData = (param: any) => {
@@ -76,6 +77,8 @@ const getFilmData = (param: any) => {
d.category = resp.data.category
d.list = resp.data.list
d.page = resp.page
// 设置当前请求的分类id
d.cid = param.cid? param.cid:-1
} else {
ElMessage.error({message: "请先输入影片名称关键字再进行搜索", duration: 1000})
}

View File

@@ -7,10 +7,13 @@
<div class="title_mt_right">
<h3>{{ data.detail.name }}</h3>
<ul class="tags">
<li style="margin: 2px 0">{{ data.detail.descriptor.classTag?`${data.detail.descriptor.classTag}`.replaceAll(",", " | "):'未知' }}</li>
<li style="margin: 2px 0">{{
data.detail.descriptor.classTag ? `${data.detail.descriptor.classTag}`.replaceAll(",", " | ") : '未知'
}}
</li>
</ul>
<p><span>导演:</span> {{data.detail.descriptor.director }}</p>
<p><span>主演:</span> {{handleLongText(data.detail.descriptor.actor)}}</p>
<p><span>导演:</span> {{ data.detail.descriptor.director }}</p>
<p><span>主演:</span> {{ handleLongText(data.detail.descriptor.actor) }}</p>
<p><span>上映:</span> {{ data.detail.descriptor.releaseDate }}</p>
<p><span>地区:</span> {{ data.detail.descriptor.area }}</p>
<p v-if="data.detail.descriptor.remarks"><span>连载:</span>{{ data.detail.descriptor.remarks }}</p>
@@ -27,12 +30,16 @@
<h2>{{ data.detail.name }}</h2>
<ul class="tags">
<li class="t_c">
<el-icon>
<Promotion/>
</el-icon>
{{ data.detail.descriptor.cName }}
<a :href="`/categoryFilm?pid=${data.detail.pid}`">
<el-icon>
<Promotion/>
</el-icon>
{{ data.detail.descriptor.cName }}
</a>
</li>
<li v-if="data.detail.descriptor.classTag">
{{ `${data.detail.descriptor.classTag}`.replaceAll(",", "&emsp;") }}
</li>
<li v-if="data.detail.descriptor.classTag">{{ `${data.detail.descriptor.classTag}`.replaceAll(",", "&emsp;") }}</li>
<li>{{ data.detail.descriptor.year }}</li>
<li>{{ data.detail.descriptor.area }}</li>
</ul>
@@ -130,11 +137,11 @@ const data = reactive({
})
// 对部分信息过长进行处理
const handleLongText = (t:string):string=>{
const handleLongText = (t: string): string => {
let res = ''
t.split(',').forEach((s,i)=>{
t.split(',').forEach((s, i) => {
console.log(s)
if (i <3) {
if (i < 3) {
res += `${s} `
}
})
@@ -398,10 +405,13 @@ const showContent = (flag: boolean) => {
.tags > .t_c {
background: rgba(155, 73, 231, 0.72);
color: #c4c2c2;
margin-left: 0;
}
.t_c a {
color: #c4c2c2;
}
.title p {
text-align: left;
font-size: 14px;

View File

@@ -7,31 +7,31 @@ import {ElementPlusResolver} from "unplugin-vue-components/resolvers";
// https://vitejs.dev/config/
export default defineConfig({
// 本地测试环境
// server: {
// host: '0.0.0.0',
// port: 3600,
// proxy: {
// "/api": {
// target: `http://127.0.0.1:3601`,
// changeOrigin: true, // 允许跨域
// rewrite: path => path.replace(/^\/api/,'')
// }
// },
// },
// nginx发布构建时使用此配置
server: {
host: 'localhost',
host: '0.0.0.0',
port: 3600,
proxy: {
"/api": {
target: `http://localhost`,
target: `http://127.0.0.1:3601`,
changeOrigin: true, // 允许跨域
rewrite: path => path.replace(/^\/api/,'')
}
},
},
// nginx发布构建时使用此配置
// server: {
// host: 'localhost',
// port: 3600,
// proxy: {
// "/api": {
// target: `http://localhost`,
// changeOrigin: true, // 允许跨域
// rewrite: path => path.replace(/^\/api/,'')
// }
// },
// },
plugins: [
vue(),
AutoImport({

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -11,8 +11,8 @@
<meta charset="UTF-8"/>
<title>(╥﹏╥)</title>
<link rel="stylesheet" href="//at.alicdn.com/t/c/font_3992367_aj8j1lxiqyw.css">
<script type="module" crossorigin src="/assets/index-abd35057.js"></script>
<link rel="stylesheet" href="/assets/index-df719233.css">
<script type="module" crossorigin src="/assets/index-d8b9e3a3.js"></script>
<link rel="stylesheet" href="/assets/index-9cc0aebd.css">
</head>
<body>
<div id="app"></div>

View File

@@ -18,7 +18,11 @@ func SpiderRe(c *gin.Context) {
})
return
}
logic.SL.ReZero()
go logic.SL.ReZero()
c.JSON(http.StatusOK, gin.H{
"status": StatusOk,
"message": "ReZero 任务执行已成功开启",
})
}
// FixFilmDetail 修复因网络异常造成的影片详情数据丢失
@@ -33,7 +37,11 @@ func FixFilmDetail(c *gin.Context) {
return
}
// 如果指令正确,则执行详情数据获取
logic.SL.FixDetail()
go logic.SL.FixDetail()
c.JSON(http.StatusOK, gin.H{
"status": StatusOk,
"message": "FixDetail 任务执行已成功开启",
})
}
// RefreshSitePlay 清空附属站点影片数据并重新获取
@@ -49,6 +57,9 @@ func RefreshSitePlay(c *gin.Context) {
}
// 执行多站点播放数据重置
logic.SL.SpiderMtPlayRe()
go logic.SL.SpiderMtPlayRe()
c.JSON(http.StatusOK, gin.H{
"status": StatusOk,
"message": "SpiderMtPlayRe 任务执行已成功开启",
})
}

View File

@@ -280,29 +280,40 @@ func GetRelateMovieBasicInfo(search SearchInfo, page *Page) []MovieBasicInfo {
// sql 拼接查询条件
sql := ""
// 优先进行名称相似匹配
re := regexp.MustCompile("第.{1,3}季")
if re.MatchString(search.Name) {
search.Name = re.ReplaceAllString(search.Name, "")
sql = fmt.Sprintf(`select * from %s where name LIKE "%%%s%%" or sub_title LIKE "%%%[2]s%%" union`, search.TableName(), search.Name)
}
// 执行后续匹配内容
//search.Name = regexp.MustCompile("第.{1,3}季").ReplaceAllString(search.Name, "")
search.Name = regexp.MustCompile(`[第.{1,3}季\s~!@#$%^&*()+={}\[\]|\\:;"'<,>·.?/\-_].*`).ReplaceAllString(search.Name, "")
regexp.MustCompile(`[\s~!@#$%^&*()+={}\[\]|\\:;"'<,>.?/\-_]+`)
sql = fmt.Sprintf(`select * from %s where (name LIKE "%%%s%%" or sub_title LIKE "%%%[2]s%%") AND cid=%d union`, search.TableName(), search.Name, search.Cid)
// 执行后续匹配内容, 匹配结果过少,减少过滤条件
//sql = fmt.Sprintf(`%s select * from %s where cid=%d AND area="%s" AND language="%s" AND`, sql, search.TableName(), search.Cid, search.Area, search.Language)
// 地区限制取消, 过滤掉的影片太多
sql = fmt.Sprintf(`%s select * from %s where cid=%d AND language="%s" AND`, sql, search.TableName(), search.Cid, search.Language)
// 根据当前影片的分类查找相似影片
sql = fmt.Sprintf(`%s (select * from %s where cid=%d AND `, sql, search.TableName(), search.Cid)
// 根据剧情标签查找相似影片, classTag 使用的分隔符为 , | /
// 首先去除 classTag 中包含的所有空格
search.ClassTag = strings.ReplaceAll(search.ClassTag, " ", "")
// 如果 classTag 中包含分割符则进行拆分匹配
if strings.Contains(search.ClassTag, ",") {
s := "("
for _, t := range strings.Split(search.ClassTag, ",") {
s = fmt.Sprintf(`%s class_tag = "%s" OR`, s, t)
s = fmt.Sprintf(`%s class_tag like "%%%s%%" OR`, s, t)
}
sql = fmt.Sprintf("%s %s)", sql, strings.TrimSuffix(s, "OR"))
} else if strings.Contains(search.ClassTag, "/") {
s := "("
for _, t := range strings.Split(search.ClassTag, "/") {
s = fmt.Sprintf(`%s class_tag like "%%%s%%" OR`, s, t)
}
sql = fmt.Sprintf("%s %s)", sql, strings.TrimSuffix(s, "OR"))
} else {
sql = fmt.Sprintf(`%s class_tag = "%s"`, sql, search.ClassTag)
sql = fmt.Sprintf(`%s class_tag like "%%%s%%"`, sql, search.ClassTag)
}
// 除名称外的相似影片使用随机排序
sql = fmt.Sprintf("%s ORDER BY RAND() limit %d,%d)", sql, page.Current, page.PageSize)
// 条件拼接完成后加上limit参数
sql = fmt.Sprintf("(%s) limit %d,%d", sql, page.Current, page.PageSize)
// 执行sql
list := []SearchInfo{}
var list []SearchInfo
db.Mdb.Raw(sql).Scan(&list)
// 根据list 获取对应的BasicInfo
var basicList []MovieBasicInfo

View File

@@ -18,7 +18,11 @@ func SpiderRe(c *gin.Context) {
})
return
}
logic.SL.ReZero()
go logic.SL.ReZero()
c.JSON(http.StatusOK, gin.H{
"status": StatusOk,
"message": "ReZero 任务执行已成功开启",
})
}
// FixFilmDetail 修复因网络异常造成的影片详情数据丢失
@@ -33,7 +37,11 @@ func FixFilmDetail(c *gin.Context) {
return
}
// 如果指令正确,则执行详情数据获取
logic.SL.FixDetail()
go logic.SL.FixDetail()
c.JSON(http.StatusOK, gin.H{
"status": StatusOk,
"message": "FixDetail 任务执行已成功开启",
})
}
// RefreshSitePlay 清空附属站点影片数据并重新获取
@@ -49,6 +57,9 @@ func RefreshSitePlay(c *gin.Context) {
}
// 执行多站点播放数据重置
logic.SL.SpiderMtPlayRe()
go logic.SL.SpiderMtPlayRe()
c.JSON(http.StatusOK, gin.H{
"status": StatusOk,
"message": "SpiderMtPlayRe 任务执行已成功开启",
})
}

View File

@@ -280,29 +280,40 @@ func GetRelateMovieBasicInfo(search SearchInfo, page *Page) []MovieBasicInfo {
// sql 拼接查询条件
sql := ""
// 优先进行名称相似匹配
re := regexp.MustCompile("第.{1,3}季")
if re.MatchString(search.Name) {
search.Name = re.ReplaceAllString(search.Name, "")
sql = fmt.Sprintf(`select * from %s where name LIKE "%%%s%%" or sub_title LIKE "%%%[2]s%%" union`, search.TableName(), search.Name)
}
// 执行后续匹配内容
//search.Name = regexp.MustCompile("第.{1,3}季").ReplaceAllString(search.Name, "")
search.Name = regexp.MustCompile(`[第.{1,3}季\s~!@#$%^&*()+={}\[\]|\\:;"'<,>·.?/\-_].*`).ReplaceAllString(search.Name, "")
regexp.MustCompile(`[\s~!@#$%^&*()+={}\[\]|\\:;"'<,>.?/\-_]+`)
sql = fmt.Sprintf(`select * from %s where (name LIKE "%%%s%%" or sub_title LIKE "%%%[2]s%%") AND cid=%d union`, search.TableName(), search.Name, search.Cid)
// 执行后续匹配内容, 匹配结果过少,减少过滤条件
//sql = fmt.Sprintf(`%s select * from %s where cid=%d AND area="%s" AND language="%s" AND`, sql, search.TableName(), search.Cid, search.Area, search.Language)
// 地区限制取消, 过滤掉的影片太多
sql = fmt.Sprintf(`%s select * from %s where cid=%d AND language="%s" AND`, sql, search.TableName(), search.Cid, search.Language)
// 根据当前影片的分类查找相似影片
sql = fmt.Sprintf(`%s (select * from %s where cid=%d AND `, sql, search.TableName(), search.Cid)
// 根据剧情标签查找相似影片, classTag 使用的分隔符为 , | /
// 首先去除 classTag 中包含的所有空格
search.ClassTag = strings.ReplaceAll(search.ClassTag, " ", "")
// 如果 classTag 中包含分割符则进行拆分匹配
if strings.Contains(search.ClassTag, ",") {
s := "("
for _, t := range strings.Split(search.ClassTag, ",") {
s = fmt.Sprintf(`%s class_tag = "%s" OR`, s, t)
s = fmt.Sprintf(`%s class_tag like "%%%s%%" OR`, s, t)
}
sql = fmt.Sprintf("%s %s)", sql, strings.TrimSuffix(s, "OR"))
} else if strings.Contains(search.ClassTag, "/") {
s := "("
for _, t := range strings.Split(search.ClassTag, "/") {
s = fmt.Sprintf(`%s class_tag like "%%%s%%" OR`, s, t)
}
sql = fmt.Sprintf("%s %s)", sql, strings.TrimSuffix(s, "OR"))
} else {
sql = fmt.Sprintf(`%s class_tag = "%s"`, sql, search.ClassTag)
sql = fmt.Sprintf(`%s class_tag like "%%%s%%"`, sql, search.ClassTag)
}
// 除名称外的相似影片使用随机排序
sql = fmt.Sprintf("%s ORDER BY RAND() limit %d,%d)", sql, page.Current, page.PageSize)
// 条件拼接完成后加上limit参数
sql = fmt.Sprintf("(%s) limit %d,%d", sql, page.Current, page.PageSize)
// 执行sql
list := []SearchInfo{}
var list []SearchInfo
db.Mdb.Raw(sql).Scan(&list)
// 根据list 获取对应的BasicInfo
var basicList []MovieBasicInfo