开发
思路
使用 Map 对象管理 rss 订阅列表。自带基础的 get、set、delete 方法。
当添加一条订阅列表时,使用 uuid 作为 Map 的 key,value 为下面 Object 结构
type RSSItemType = {
key: string
name: string
status: 'normal' | 'deactivate'
update_interval: number
rss_link: string
type: 'default'
include: string
exclude: string
download_categories: string
download_items?: string[]
}
当每次 set、delete 时将 Map 转换为 json 字符串写入文件。
rss 链接内容使用的 rss-parser 解析
增删改查
// ....
import { v4 } from 'uuid'
import Parser from 'rss-parser'
// ....
const getRSSJson = () => {
if (!fs.existsSync(config_path)) {
fs.mkdirSync(path.dirname(config_path), { recursive: true })
fs.writeFileSync(config_path, '{}', 'utf-8')
return {}
}
return JSON.parse(fs.readFileSync(config_path, 'utf-8'))
}
const getRSSMap = () => {
return new Map(Object.entries(getRSSJson()))
}
const writeConfig = (rssMAP) => {
fs.writeFile(config_path, JSON.stringify(Object.fromEntries(rssMAP), null, 2), 'utf-8', () => {})
}
export const setRSS = (key, value) => {
const rssMAP = getRSSMap()
const rss_info = rssMAP.get(key) || def_rss_item
if (!rss_info.key) {
rss_info.key = v4()
}
for (let key in value) {
rss_info[key] = value[key]
}
rssMAP.set(rss_info.key, rss_info)
writeConfig(rssMAP)
return value
}
export const deleteRSS = (key) => {
const rssMAP = getRSSMap()
const status = rssMAP.delete(key)
writeConfig(rssMAP)
return status
}
export const getRSS = (key) => {
const rssMAP = getRSSMap()
return rssMAP.get(key)
}
export const getRSSLinkDetail = async (key) => {
const parser = new Parser()
const { rss_link } = getRSS(key)
const detail = await parser.parseURL(rss_link)
return detail.items.map(({ title, link, pubDate, enclosure }) => {
return { title, link, pubDate, enclosure: { ...enclosure } }
})
}
//.....
页面呈现
这个就使用 antd 的 List 组件。并按数据条件进行额外呈现
效果
列表
添加、编辑