Skip to content

Commit ff64714

Browse files
author
zhongchubing
committed
refactor: 前台输入链接自动爬取优化
1 parent 7e758a8 commit ff64714

File tree

6 files changed

+61
-35
lines changed

6 files changed

+61
-35
lines changed

geekape-nav-main/api/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ function objToQuery(obj) {
1414
}
1515

1616
export const API_NAV = '/api/nav'
17+
export const API_NAV_REPTILE = '/api/nav/reptile'
1718
export const API_NAV_RANDOM = '/api/nav/random'
1819
export const API_NAV_FIND = '/api/nav/find'
1920
export const API_CATEGORY_LIST = '/api/category/list'

geekape-nav-main/components/AddNavPopup.vue

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,10 @@
88
@close="$emit('update:show', false)"
99
>
1010
<el-form ref="ruleForm" label-width="100px" :model="form" :rules="rules">
11-
<el-form-item label="网站名称" prop="name" v-if="isMoreForm">
12-
<el-input placeholder="输入网站名称" v-model="form.name" />
13-
</el-form-item>
14-
<el-form-item label="网站描述" prop="desc" v-if="isMoreForm">
15-
<el-input placeholder="输入网站描述" v-model="form.desc" />
16-
</el-form-item>
11+
1712
<el-form-item label="网站链接" prop="url">
18-
<el-input placeholder="http://www.baidu.com/" v-model="form.url" :disabled="type === 'update'" />
13+
<el-input placeholder="http://www.baidu.com/" v-model="form.url" :disabled="type === 'update'" @blur="getNavInfo" />
14+
<span style="color: red">输入链接自动爬取信息</span>
1915
</el-form-item>
2016

2117
<el-form-item label="网站分类" prop="categoryId">
@@ -34,6 +30,16 @@
3430
</el-option-group>
3531
</el-select>
3632
</el-form-item>
33+
<el-form-item label="网站名称" prop="name">
34+
<el-input placeholder="输入网站名称" v-model="form.name" />
35+
</el-form-item>
36+
<el-form-item label="网站logo" prop="name">
37+
<el-input placeholder="输入网站logo" v-model="form.logo" />
38+
<img :src="form.logo" />
39+
</el-form-item>
40+
<el-form-item label="网站描述" prop="desc">
41+
<el-input type="textarea" placeholder="输入网站描述" v-model="form.desc" />
42+
</el-form-item>
3743
<el-form-item label="作者名称" prop="authorName">
3844
<el-input placeholder="填写你推广的名称" v-model="form.authorName" />
3945
</el-form-item>
@@ -52,6 +58,9 @@
5258
</template>
5359

5460
<script>
61+
import axios from "../plugins/axios";
62+
import {API_NAV, API_NAV_RANDOM, API_NAV_REPTILE} from "../api";
63+
5564
export default {
5665
props: {
5766
show: {
@@ -74,6 +83,7 @@ export default {
7483
url: '',
7584
categoryId: '',
7685
name: '',
86+
logo: '',
7787
desc: '',
7888
authorName: '',
7989
authorUrl: ''
@@ -89,8 +99,9 @@ export default {
8999
categoryId: [
90100
{ required: true, message: '请选择分类', trigger: 'blur' },
91101
],
92-
name: [],
93-
desc: [],
102+
name: [{ required: true, message: '请输入名称', trigger: 'blur' },],
103+
desc: [{ required: true, message: '请输入描述', trigger: 'blur' },],
104+
logo: [{ required: true, message: '请输入logo', trigger: 'blur' },],
94105
authorUrl: [
95106
{
96107
pattern: /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/,
@@ -143,6 +154,15 @@ export default {
143154
}
144155
})
145156
},
157+
async getNavInfo() {
158+
const { url } = this.form
159+
if (!url) return
160+
const { data } = await axios.get(API_NAV_REPTILE + `?url=${url}`)
161+
162+
this.form.logo = `${url}/favicon.ico`
163+
this.form.name = data?.name
164+
this.form.desc = data?.desc
165+
}
146166
},
147167
watch: {
148168
item(ite) {

geekape-nav-server/app/controller/nav.ts

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ import Controller from './common';
22
const request = require('request');
33
const cheerio = require('cheerio');
44

5+
enum NAV_STATUS {
6+
wait,
7+
pass,
8+
refuse,
9+
}
10+
511
export default class NavController extends Controller {
612
async list() {
713
const { ctx } = this
@@ -65,45 +71,38 @@ export default class NavController extends Controller {
6571
const { ctx } = this
6672
const { request: req, model } = ctx
6773
try {
68-
const { url, name } = req.body
6974
req.body.status = 1
70-
req.body.logo = `https://www.google.com/s2/favicons?domain=${url}`
71-
req.body.href = url
72-
req.body.submitTime = new Date()
73-
74-
// if (req.isLogin) {
75-
// // 已经登录了,提交网站直接审核通过
76-
// req.body.status = 0
77-
// }
78-
79-
// 手动输入
80-
if (name) {
81-
model.Nav.create(req.body, (_err, doc) => {
82-
this.success(doc)
83-
})
84-
return
85-
}
75+
req.body.createTime = new Date()
76+
const res = model.Nav.create(req.body);
77+
this.success(res)
78+
} catch (error) {
79+
this.error(error.message)
80+
}
81+
}
8682

83+
async reptile() {
84+
const { ctx } = this
85+
const { url } = ctx.query
86+
const that = this
87+
const res = await new Promise((resolve)=> {
8788
request(url, (error, requestData, body) => {
8889
if (!error && requestData.statusCode == 200) {
8990
const $ = cheerio.load(body)
9091
const name = $('title').text()
9192
const desc = $('meta[name="description"]').attr('content')
92-
model.Nav.create({
93-
...req.body,
93+
94+
resolve({
9495
name,
9596
desc,
9697
href: url,
97-
}, (_err, doc) => {
98-
this.success(doc)
9998
})
10099
} else {
101-
this.error('爬虫爬取失败')
100+
that.error('爬虫爬取失败')
102101
}
103102
})
104-
} catch (error) {
105-
this.error(error.message)
106-
}
103+
})
104+
105+
this.success(res)
107106
}
108107

109108
async del() {
@@ -114,6 +113,10 @@ export default class NavController extends Controller {
114113

115114
async edit() {
116115
const { body } = this.ctx.request
116+
117+
if (body.status === NAV_STATUS.pass || body.status === NAV_STATUS.refuse) {
118+
body.auditTime = new Date()
119+
}
117120
const res = this.ctx.service.common.update(body, 'Nav')
118121
this.success(res);
119122
}

geekape-nav-server/app/model/nav.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ module.exports = app => {
1010
logo: String,
1111
authorName: String,
1212
authorUrl: String,
13-
submitTime: Date,
13+
auditTime: Date,
1414
createTime: Date,
1515
view: {
1616
type: Number,

geekape-nav-server/app/router.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export default (app: Application) => {
1313
router.get("/api/nav/list", controller.nav.list)
1414
router.post("/api/nav", controller.nav.add)
1515
router.get("/api/nav", controller.nav.get)
16+
router.get("/api/nav/reptile", controller.nav.reptile)
1617
router.get("/api/nav/random", controller.nav.random)
1718
router.delete("/api/nav", controller.nav.del)
1819
router.put("/api/nav", controller.nav.edit)

geekape-nav-server/config/config.default.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export default (appInfo: EggAppInfo) => {
3939
"/api/nav",
4040
"/api/nav/random",
4141
"/api/nav/find",
42+
"/api/nav/reptile",
4243
"/api/login",
4344
"/api/index",
4445
"/api/category/list"

0 commit comments

Comments
 (0)