=> {
78 | try {
79 | const api = createRelasesApi()
80 | const data: githubReleaseItemInterface = await get(api)
81 | const lastVersionCode = data.tag_name
82 | const lastBody = data.body
83 | const ctx = mdjs(lastBody)
84 | const jquery = cheerio.load(``)
85 | const closeText = `关闭`
86 | const closeID = `close-action`
87 | jquery('head').append(``)
88 | jquery('head').append(`
89 |
94 | `)
95 | jquery('.markdown-body').append(ctx)
96 | jquery('body').append(`
97 |
98 |
117 |
118 | `)
119 | jquery('body').append(``)
120 | jquery('body').append(`
121 |
149 |
150 | `)
151 | const body = jquery.html()
152 | let code: githubReleaseStatus
153 | if (lastVersionCode == version) {
154 | code = githubReleaseStatus.last
155 | } else {
156 | code = githubReleaseStatus.old
157 | }
158 | const R: githubReleaseResultCat = {
159 | code
160 | }
161 | if (code == githubReleaseStatus.old) R.body = body
162 | return R
163 | } catch (error) {
164 | return {
165 | code: githubReleaseStatus.unknown
166 | }
167 | }
168 | }
--------------------------------------------------------------------------------
/src/utils/index.ts:
--------------------------------------------------------------------------------
1 | import dayjs from 'dayjs'
2 | import { isNumber, isObject } from './is'
3 | import { colors } from '@/const'
4 | import { colorItemInterface } from '@/interface/tool'
5 |
6 | const qs = require('@/plugins/qs2string')
7 |
8 | // 获取网络状态
9 | export const getNetwork = (): Promise => {
10 | return new Promise((res, rej) => {
11 | uni.getNetworkType({
12 | success: r => res(r.networkType),
13 | fail: err => rej(err)
14 | })
15 | })
16 | }
17 |
18 | interface deviceWidthAndHeight {
19 | width: number
20 | height: number
21 | }
22 |
23 | // 获取设备宽高
24 | export const getWidthAndHeight = (): deviceWidthAndHeight=> {
25 | const result: deviceWidthAndHeight = { width: 0, height: 0 }
26 | const data = uni.getSystemInfoSync()
27 | result.width = data['windowWidth'] || 0
28 | result.height = data['windowHeight'] || 0
29 | return result
30 | }
31 |
32 | interface jqueryArgsInterface {
33 | hack: Vue
34 | ele: string | string[]
35 | }
36 |
37 | export const jquery = (data: jqueryArgsInterface): Promise => {
38 | try {
39 | const { hack, ele } = data
40 | const query = uni.createSelectorQuery().in(hack)
41 | const exec = (ele: string)=> new Promise((res=> {
42 | query.select(ele).boundingClientRect((data: any)=> {
43 | res(data)
44 | }).exec(()=>{})
45 | }))
46 | return new Promise(async res=> {
47 | let result: any = null
48 | if (typeof ele === 'string') {
49 | result = await exec(ele)
50 | } else if (Array.isArray(ele)){
51 | let temp = ele
52 | const next = temp.map(async item=> {
53 | const data = await exec(item)
54 | return data
55 | })
56 | const sp = Promise.all(next)
57 | result = sp
58 | }
59 | res(result)
60 | })
61 | } catch (error) {
62 | throw new Error(error)
63 | }
64 | }
65 |
66 | export const $ = jquery
67 |
68 | // 格式化
69 | // 参考: https://www.codota.com/web/assistant/code/rs/5c7cb0752ef5570001df2fd3#L97
70 | export const toIpAddress = (ipAddress: any): string => {
71 | try {
72 | let x1 = ipAddress & 0xff, x2 = ipAddress >> 8 & 0xff, x3 = ipAddress >> 16 & 0xff, x4 = ipAddress >> 24 & 0xff
73 | return `${ x1 }.${ x2 }.${ x3 }.${ x4 }`
74 | } catch (error) {
75 | console.error(error)
76 | return ''
77 | }
78 | }
79 |
80 | // 浅拷贝, 主要为了解决 `ts` 语法问题和js内存机制
81 | export const copy = (data: any): any=> {
82 | try {
83 | const newVal = data
84 | return JSON.parse(JSON.stringify(newVal))
85 | } catch (error) {
86 | throw new Error(error)
87 | }
88 | }
89 |
90 | // 生成空的数组
91 | export const MockCreateArray = (len: number): any[]=> {
92 | if (!isNumber(len)) return []
93 | return Object.keys([...new Array(len)])
94 | }
95 |
96 | // 获取当前格式化好的时间
97 | export const getCurrentTime = (): string=> {
98 | const now = dayjs().format('YYYY-MM-DD-HH:mm:ss')
99 | return now
100 | }
101 |
102 | // 生成一个uuid
103 | // https://stackoverflow.com/a/46352326/10272586
104 | export const createID = ()=> Math.random().toString(26).slice(2)
105 |
106 | export const createRandomLen = (len: number): number=> {
107 | return Math.floor(Math.random()*len)
108 | }
109 |
110 | // 返回随机的颜色
111 | export const createRandomColor = (): colorItemInterface=> colors[createRandomLen(colors.length)]
112 |
113 | /**
114 | * 获取域名后缀
115 | * @param domain 域名
116 | */
117 | export const easyGetDomainSuffix = (domain: string): string=> {
118 | const index = domain.lastIndexOf('.')
119 | return index > 0 ? domain.substring(index + 1) : ""
120 | }
121 |
122 | // 路由
123 | export const router = {
124 | push(url: string, query?: any, isFullPath?: boolean) {
125 | try {
126 | let _qs = ''
127 | if (query && isObject(query)) _qs = `?${ qs(query) }`
128 | let _c = `/views/${ url }${ _qs }`
129 | if (isFullPath) _c = `/${ url }${ _qs }`
130 | uni.navigateTo({
131 | url: _c
132 | })
133 | } catch (error) {
134 | uni.showModal({
135 | title: '跳转错误, 未知错误',
136 | content: error
137 | })
138 | throw new Error(error)
139 | }
140 | },
141 | back(delta: number = 1) {
142 | uni.navigateBack({
143 | delta,
144 | animationType: 'auto',
145 | animationDuration: +'500'
146 | })
147 | },
148 | redirect(url: string) {
149 | uni.redirectTo({ url: `/views/${ url }` })
150 | },
151 | tab(url: string) {
152 | uni.switchTab({ url: `/views/${ url }` })
153 | },
154 | // https://blog.csdn.net/liuxin00020/article/details/104842217
155 | // 获取当前路由信息
156 | current() {
157 | let curRoute: any
158 | try {
159 | curRoute = (this as any).$mp.page; // 直接获取当前页面路由
160 | } catch (error) {
161 | let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
162 | curRoute = routes[routes.length - 1]
163 | }
164 | return curRoute
165 | },
166 | reload() {
167 | // TODO 重新加载
168 | }
169 | }
--------------------------------------------------------------------------------
/src/pages.json:
--------------------------------------------------------------------------------
1 | {
2 | "pages": [
3 | {
4 | "path": "views/index/index",
5 | "style": {
6 | "navigationStyle": "custom"
7 | },
8 | "description": "首页"
9 | },
10 | {
11 | "path": "views/switch/flow",
12 | "style": {
13 | "navigationStyle": "custom",
14 | "disableScroll": true
15 | },
16 | "description": "切换镜像站"
17 | },
18 | {
19 | "path": "views/detail/index",
20 | "style": {
21 | "navigationStyle": "custom"
22 | },
23 | "description": "本子详情"
24 | },
25 | {
26 | "path": "views/reader/index",
27 | "style": {
28 | "navigationStyle": "custom"
29 | },
30 | "description": "阅读页面"
31 | },
32 | {
33 | "path": "views/theme/index",
34 | "style": {
35 | "navigationStyle": "custom"
36 | },
37 | "description": "主题页面"
38 | },
39 | {
40 | "path": "views/home/index",
41 | "style": {
42 | "navigationStyle": "custom"
43 | },
44 | "description": "我的页面"
45 | },
46 | {
47 | "path": "views/settings/index",
48 | "style": {
49 | "navigationStyle": "custom"
50 | },
51 | "description": "设置页面"
52 | },
53 | {
54 | "path": "views/search/index",
55 | "style": {
56 | "navigationStyle": "custom"
57 | },
58 | "description": "搜索页面"
59 | },
60 | {
61 | "path": "views/topic/index",
62 | "style": {
63 | "navigationStyle": "custom"
64 | },
65 | "description": "话题"
66 | },
67 | {
68 | "path": "views/guide/index",
69 | "style": {
70 | "enablePullDownRefresh": false,
71 | "onReachBottomDistance": 100,
72 | "navigationStyle": "custom"
73 | },
74 | "description": "引导页"
75 | },
76 | {
77 | "path": "views/webview/index",
78 | "description": "webview页(传递一个`url`参数)"
79 | },
80 | {
81 | "path": "views/dev/index",
82 | "style": {
83 | "navigationStyle": "custom"
84 | },
85 | "description": "开发页面"
86 | },
87 | {
88 | "path": "views/login/index",
89 | "style": {
90 | "navigationStyle": "custom"
91 | },
92 | "description": "登录页面"
93 | },
94 | {
95 | "path": "views/filter/index",
96 | "style": {
97 | "navigationBarTitleText": "筛选"
98 | },
99 | "description": "搜索参数"
100 | },
101 | {
102 | "path": "views/blogs/index",
103 | "style": {
104 | "navigationStyle": "custom"
105 | },
106 | "description": "涨姿势"
107 | }
108 | ],
109 | "tabBar": {
110 | "blurEffect":"extralight",
111 | "color": "#7A7E83",
112 | "selectedColor": "#d4237a",
113 | "borderStyle": "black",
114 | "backgroundColor": "rgba(255, 255, 255, .4)",
115 | "list": [
116 | {
117 | "pagePath": "views/index/index",
118 | "text": "首页",
119 | "iconPath": "static/menu/index.png",
120 | "selectedIconPath": "static/menu/index_selected.png"
121 | },
122 | {
123 | "pagePath": "views/theme/index",
124 | "text": "主题",
125 | "iconPath": "static/menu/theme.png",
126 | "selectedIconPath": "static/menu/theme_selected.png"
127 | },
128 | {
129 | "pagePath": "views/home/index",
130 | "text": "我的",
131 | "iconPath": "static/menu/me.png",
132 | "selectedIconPath": "static/menu/me_selected.png"
133 | },
134 | {
135 | "pagePath": "views/settings/index",
136 | "text": "设置",
137 | "iconPath": "static/menu/settings.png",
138 | "selectedIconPath": "static/menu/settings_selected.png"
139 | }
140 | ]
141 | },
142 | "globalStyle": {
143 | "navigationBarTextStyle": "black",
144 | "navigationBarTitleText": "uni-app",
145 | "navigationBarBackgroundColor": "#F8F8F8",
146 | "backgroundColor": "#F8F8F8"
147 | },
148 | "condition": {
149 | "current": 0,
150 | "list": [
151 | {
152 | "name": "涨姿势",
153 | "path": "views/blogs/index"
154 | },
155 | {
156 | "name": "登录页",
157 | "path": "views/login/index"
158 | },
159 | {
160 | "name": "搜索参数筛选",
161 | "path": "views/filter/index"
162 | },
163 | {
164 | "name": "引导页",
165 | "path": "views/guide/index"
166 | },
167 | {
168 | "name": "首页",
169 | "path":"views/index/index"
170 | },
171 | {
172 | "name": "详情",
173 | "path": "views/detail/index",
174 | "query": "id=1"
175 | },
176 | {
177 | "name": "阅读器",
178 | "path": "views/reader/index",
179 | "query": "id=195582"
180 | },
181 | {
182 | "name": "分类",
183 | "path": "views/theme/index"
184 | },
185 | {
186 | "name": "搜索",
187 | "path": "views/search/index"
188 | },
189 | {
190 | "name": "我的",
191 | "path": "views/home/index"
192 | },
193 | {
194 | "name": "web-view",
195 | "path": "views/webview/index"
196 | },
197 | {
198 | "name":"首页切换流",
199 | "path":"views/switch/flow"
200 | }
201 | ]
202 | }
203 | }
204 |
--------------------------------------------------------------------------------
/src/interface/index.ts:
--------------------------------------------------------------------------------
1 | import { colorItemInterface } from './tool';
2 | import { readerPageNumberEnum } from './enum';
3 |
4 | /**
5 | * 首页 `modal`
6 | */
7 | export interface shareIndexModal {
8 | /**
9 | * 标题
10 | */
11 | title: string
12 | /**
13 | * html标签
14 | */
15 | body: string
16 | }
17 |
18 | /**
19 | * 首页数据
20 | */
21 | export interface shareIndexData {
22 | modal: shareIndexModal
23 | lists: shareIndexComicData[]
24 | }
25 |
26 | /**
27 | * `card` 用到的数据
28 | */
29 | export interface shareIndexComicData {
30 | /**
31 | * 标题
32 | */
33 | title: string
34 | /**
35 | * 列表
36 | */
37 | lists: shareComicFace[]
38 | }
39 |
40 | /**
41 | * 主题列表 `item`
42 | */
43 | export interface themeListInterface {
44 | /**
45 | * 搜索的 `url`
46 | */
47 | url: string
48 | /**
49 | * 标题文本
50 | */
51 | text: string
52 | /**
53 | * 背景颜色
54 | */
55 | bg?: colorItemInterface
56 | }
57 |
58 | /**
59 | * 主题
60 | */
61 | export interface themeInterface {
62 | /**
63 | * 标题
64 | */
65 | title: string
66 | /**
67 | * 几列, 默认是 `3` 列
68 | */
69 | col: number
70 | lists: themeListInterface[]
71 | }
72 |
73 | export interface episodeInterface {
74 | id: string | number
75 | /**
76 | * eq
77 | */
78 | ep: string
79 | /**
80 | * ep标题
81 | */
82 | ep_title: string
83 | /**
84 | * ep时间
85 | */
86 | ep_date: string
87 | }
88 |
89 | /**
90 | * 漫画公共的接口
91 | */
92 | export interface shareComicFace {
93 | /**
94 | * TODO
95 | * 该id是否存在
96 | */
97 | isExist?: boolean
98 | /**
99 | * 设备id
100 | */
101 | id: string | number
102 | /**
103 | * 封面
104 | */
105 | cover: string
106 | /**
107 | * 标题
108 | */
109 | title: string
110 | /**
111 | * 标签
112 | */
113 | tags: string[]
114 | /**
115 | * 作者
116 | */
117 | authors: string[]
118 | /**
119 | * 介绍
120 | */
121 | desc?: string
122 | /**
123 | * 页数
124 | */
125 | page_count?: string | number
126 | /**
127 | * 点赞数
128 | */
129 | like_count?: string | number
130 | /**
131 | * 类型(汉化 | 日文)
132 | */
133 | sub_text?: string
134 | /**
135 | * 创建时间
136 | */
137 | date?: string
138 | /**
139 | * 浏览量
140 | */
141 | review?: number | string
142 | /**
143 | * 评论数
144 | */
145 | comment_count?: number | string
146 | /**
147 | * 预览图片, 数组
148 | */
149 | previews?: string[]
150 | /**
151 | * 选集
152 | */
153 | episode?: episodeInterface[]
154 | /**
155 | * 推荐
156 | */
157 | recommends?: shareComicFace[]
158 | /**
159 | * 历史阅读的时间
160 | */
161 | reader_time?: number | string | Date
162 | /**
163 | * 历史阅读生成的时间
164 | */
165 | reader_time_text?: string
166 | }
167 |
168 | /**
169 | * 留言话题接口
170 | */
171 | export interface topicResponseInterface {
172 | /**
173 | * 总数
174 | */
175 | count: number | string
176 | /**
177 | * 消息体
178 | */
179 | message: string[] // topicResponseMessageInterface[]
180 | /**
181 | * 消息
182 | */
183 | msg: string
184 | /**
185 | * 回复消息
186 | */
187 | reply_message: string
188 | }
189 |
190 | /**
191 | * 留言话题返回的数据类型
192 | */
193 | export interface topicItemInterface {
194 | /**
195 | * 头像
196 | */
197 | avatar: string
198 | /**
199 | * 内容
200 | */
201 | content: string
202 | /**
203 | * 时间
204 | */
205 | date: string
206 | /**
207 | * 作品id
208 | */
209 | id: string
210 | /**
211 | * 点赞数
212 | */
213 | like_count: string | number
214 | /**
215 | * 昵称
216 | */
217 | nickname: string
218 | /**
219 | * 作品的标题
220 | */
221 | title: string
222 | }
223 |
224 | /**
225 | * 阅读器当前类型
226 | */
227 | export interface readerItemInterface {
228 | /**
229 | * 当前页数类型
230 | */
231 | pageType: readerPageNumberEnum
232 | /**
233 | * 下一话(500页限制)
234 | */
235 | nextPage: number | string | null
236 | /**
237 | * 上一话(500页限制)
238 | */
239 | prevPage: number | string | null
240 | /**
241 | * 当前 `page`
242 | */
243 | currPage: number | string | null
244 | /**
245 | * 图片
246 | */
247 | pics: string[]
248 | }
249 |
250 | /**
251 | * 老婆...
252 | */
253 | export interface waifuItem {
254 | /**
255 | * 排名
256 | */
257 | scrope: string
258 | /**
259 | * 图片
260 | */
261 | pic: string
262 | /**
263 | * 名称
264 | */
265 | name: string
266 | }
267 |
268 | /**
269 | * 博客单个`item`
270 | */
271 | export interface blogItemInterface {
272 | /**
273 | * id, 直接拿到是一个拼接的, 例如: `/blog/2333`
274 | */
275 | id: string
276 | /**
277 | * 时间
278 | */
279 | time: string
280 | /**
281 | * 标题
282 | */
283 | title: string
284 | /**
285 | * 背景
286 | */
287 | bg: string
288 | /**
289 | * 内容
290 | */
291 | content: string
292 | }
293 |
294 | /**
295 | * `blog` 返回数据
296 | */
297 | export interface blogResInterface {
298 | /**
299 | * 是否有下一页
300 | */
301 | isNext: boolean
302 | /**
303 | * 数据
304 | */
305 | lists: blogItemInterface[]
306 | }
--------------------------------------------------------------------------------
/src/components/topbar.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
183 |
184 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "18comic",
3 | "version": "0.1.0",
4 | "versionCode": "v20200901",
5 | "private": true,
6 | "scripts": {
7 | "status": "tokei",
8 | "open": "open -a 'Google Chrome' --args --disable-web-security --user-data-dir='~/Desktop/chromeTemp'",
9 | "dev": "yarn serve",
10 | "serve": "npm run dev:h5",
11 | "build": "npm run build:h5",
12 | "build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build",
13 | "build:custom": "cross-env NODE_ENV=production uniapp-cli custom",
14 | "build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build",
15 | "build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build",
16 | "build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build",
17 | "build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build",
18 | "build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build",
19 | "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build",
20 | "build:quickapp-native": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-native vue-cli-service uni-build",
21 | "build:quickapp-webview": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview vue-cli-service uni-build",
22 | "dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch",
23 | "dev:custom": "cross-env NODE_ENV=development uniapp-cli custom",
24 | "dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve",
25 | "dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch",
26 | "dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch",
27 | "dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch",
28 | "dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch",
29 | "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch",
30 | "dev:quickapp-native": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-native vue-cli-service uni-build --watch",
31 | "dev:quickapp-webview": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview vue-cli-service uni-build --watch",
32 | "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js",
33 | "serve:quickapp-native": "node node_modules/@dcloudio/uni-quickapp-native/bin/serve.js",
34 | "test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i",
35 | "test:h5": "cross-env UNI_PLATFORM=h5 jest -i",
36 | "test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i",
37 | "test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i",
38 | "test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i"
39 | },
40 | "dependencies": {
41 | "@dcloudio/uni-app-plus": "^2.0.0-28220200724002",
42 | "@dcloudio/uni-h5": "^2.0.0-28220200724002",
43 | "@dcloudio/uni-helper-json": "*",
44 | "@dcloudio/uni-mp-alipay": "^2.0.0-28220200724002",
45 | "@dcloudio/uni-mp-baidu": "^2.0.0-28220200724002",
46 | "@dcloudio/uni-mp-qq": "^2.0.0-28220200724002",
47 | "@dcloudio/uni-mp-toutiao": "^2.0.0-28220200724002",
48 | "@dcloudio/uni-mp-weixin": "^2.0.0-28220200724002",
49 | "@dcloudio/uni-quickapp-native": "^2.0.0-28220200724002",
50 | "@dcloudio/uni-quickapp-webview": "^2.0.0-28220200724002",
51 | "@dcloudio/uni-stat": "^2.0.0-28220200724002",
52 | "cheerio": "^1.0.0-rc.3",
53 | "core-js": "^3.6.4",
54 | "dayjs": "^1.8.27",
55 | "flyio": "^0.6.2",
56 | "github-to-cdn": "^0.0.2",
57 | "regenerator-runtime": "^0.12.1",
58 | "url-parse": "^1.4.7",
59 | "vue": "^2.6.11",
60 | "vue-class-component": "^6.3.2",
61 | "vue-property-decorator": "^8.0.0",
62 | "vuex": "^3.2.0",
63 | "vuex-persistedstate": "^3.0.1"
64 | },
65 | "devDependencies": {
66 | "@babel/plugin-syntax-typescript": "^7.10.4",
67 | "@dcloudio/types": "*",
68 | "@dcloudio/uni-automator": "^2.0.0-28220200724002",
69 | "@dcloudio/uni-cli-shared": "^2.0.0-28220200724002",
70 | "@dcloudio/uni-migration": "^2.0.0-28220200724002",
71 | "@dcloudio/uni-template-compiler": "^2.0.0-28220200724002",
72 | "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.0-28220200724002",
73 | "@dcloudio/vue-cli-plugin-uni": "^2.0.0-28220200724002",
74 | "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.0-28220200724002",
75 | "@dcloudio/webpack-uni-mp-loader": "^2.0.0-28220200724002",
76 | "@dcloudio/webpack-uni-pages-loader": "^2.0.0-28220200724002",
77 | "@types/cheerio": "^0.22.18",
78 | "@types/marked": "^0.7.4",
79 | "@types/url-parse": "^1.4.3",
80 | "@vue/cli-plugin-babel": "^4.3.0",
81 | "@vue/cli-plugin-typescript": "*",
82 | "@vue/cli-service": "^4.3.0",
83 | "babel-plugin-import": "^1.11.0",
84 | "colorui": "^1.0.0",
85 | "cross-env": "^7.0.2",
86 | "csstype": "^2.6.10",
87 | "jest": "^25.4.0",
88 | "marked": "^1.1.1",
89 | "mini-types": "*",
90 | "miniprogram-api-typings": "*",
91 | "postcss-comment": "^2.0.0",
92 | "typescript": "^3.0.0",
93 | "vue-template-compiler": "^2.6.11"
94 | },
95 | "browserslist": [
96 | "Android >= 4",
97 | "ios >= 8"
98 | ],
99 | "uni-app": {
100 | "scripts": {}
101 | }
102 | }
--------------------------------------------------------------------------------
/src/interface/pages.ts:
--------------------------------------------------------------------------------
1 | import css from 'csstype'
2 | import { shareComicFace, themeInterface, themeListInterface, topicItemInterface, readerItemInterface, blogItemInterface } from '.';
3 | import { searchOptions, themeMenuItemInterface, mirrorItemInterface } from './tool';
4 | import { searchOptionTimeEnum, searchOptionTypeEnum } from './enum';
5 | import { sayWordInterface } from '@/api/share';
6 |
7 | // flag: 旧的流列表数据
8 | interface flowDataArrayFace {
9 | text: string
10 | url: string
11 | }
12 |
13 | /**
14 | * flow页面数据
15 | */
16 | export interface flowDataFace {
17 | flowBg: string // 背景
18 | flowBgBlur: number // 模糊尺寸
19 | flowBgDark: boolean // 背景是否黑白, 用于判断是否有网络
20 | flows: mirrorItemInterface[] // 流列表
21 | setup: number // 步骤
22 | logoText: string // logo文字
23 | /**
24 | * 加载状态
25 | */
26 | isLoading: boolean
27 | /**
28 | * 测试接口状态
29 | */
30 | isTestLoading: boolean
31 | /**
32 | * 测试是否连接成功
33 | */
34 | testStatus: boolean
35 | /**
36 | * 当前镜像
37 | */
38 | current_mirror: null | mirrorItemInterface
39 | /**
40 | * 当前镜像索引
41 | */
42 | current_mirror_index: null | number
43 | }
44 |
45 | /**
46 | * 首页接口数据
47 | */
48 | export interface indexDataFace {
49 | footerButtonStyle: css.Properties
50 | model: any
51 | dialogButtons: any[]
52 | swiperList: any[]
53 | dotStyle: boolean
54 | lists: any[]
55 | cover?: string
56 | body?: string
57 | isLoading: boolean
58 | }
59 |
60 | /**
61 | * 阅读器接口数据
62 | */
63 | export interface readerDataFace {
64 |
65 | /**
66 | * 漫画内容
67 | */
68 | comicData: readerItemInterface
69 |
70 | /**
71 | * 漫画 `id`
72 | */
73 | currentComicID: string
74 |
75 | /**
76 | * 图片(已废弃)
77 | */
78 | imgs?: string[]
79 |
80 | /**
81 | * 是否在加载中
82 | */
83 | isLoading: boolean
84 |
85 | /**
86 | * 该字段主要是用来判断 `scroll-view` 的高度的
87 | */
88 | scrollTop: number
89 |
90 | /**
91 | * 点击后的高亮效果 `x`
92 | */
93 | effectX: number
94 |
95 | /**
96 | * 点击后的高亮效果 `y`
97 | */
98 | effectY: number
99 |
100 | /**
101 | * 高亮显示 `flag`
102 | */
103 | effectDisplay: boolean
104 |
105 | /**
106 | * `box` 宽度
107 | */
108 | effectW: number
109 |
110 | /**
111 | * `box` 高度
112 | */
113 | effectH: number
114 |
115 | }
116 |
117 | /**
118 | * 搜索页面`data`
119 | */
120 | export interface searchPageInterface {
121 | /**
122 | * 数据列表
123 | */
124 | lists: shareComicFace[]
125 | /**
126 | * 是否有下一页
127 | */
128 | isNext: boolean
129 | /**
130 | * loading状态
131 | */
132 | isLoading: boolean
133 | /**
134 | * 是否显示 `loading` 动画
135 | */
136 | showLoading: boolean
137 | /**
138 | * 当前页数
139 | */
140 | current_page: string | number
141 | /**
142 | * 总页数
143 | */
144 | total_page: string | number
145 | /**
146 | * 不重要!(只是用来判断是否是双击)
147 | * https://blog.csdn.net/qq_45515863/article/details/104361322
148 | */
149 | touchStartTime: number
150 | /**
151 | * 返回顶部的标识
152 | */
153 | back2topFlag: boolean
154 | /**
155 | * 搜索界面数据为空时的文字
156 | */
157 | search_empty_text: string
158 | }
159 |
160 | export interface themePageDataInterface {
161 | /**
162 | * 搜索框提示文本
163 | */
164 | placeholder: string
165 | /**
166 | * goto id-input
167 | */
168 | goto_placeholder: string
169 | /**
170 | * 列表数据
171 | */
172 | data: themeInterface[]
173 | /**
174 | * 最热主题
175 | */
176 | popularThemes: themeListInterface[]
177 | /**
178 | * 默认毛玻璃背景图片
179 | */
180 | blur_default_url: string
181 | /**
182 | * 搜索的文本
183 | */
184 | searchVal: string
185 | /**
186 | * go-to 文本
187 | */
188 | goto_text: string
189 | /**
190 | * go-to input
191 | */
192 | gotoInputVal: string
193 | /**
194 | * go-to 模态框flag
195 | */
196 | gotoModal: boolean
197 | /**
198 | * 是否加载中
199 | */
200 | isLoading: boolean
201 | }
202 |
203 | export interface topicDataInterface {
204 | /**
205 | * 消息体
206 | */
207 | messages: topicItemInterface[]
208 | /**
209 | * 作为分页
210 | */
211 | page: number
212 | /**
213 | * 是否结束
214 | */
215 | isEnd: boolean
216 | /**
217 | * 是否加载中
218 | */
219 | isLoading: boolean
220 | }
221 |
222 | export interface blogDataInterface {
223 | /**
224 | * 消息体
225 | */
226 | lists: blogItemInterface[]
227 | /**
228 | * 作为分页
229 | */
230 | page: number
231 | /**
232 | * 是否结束
233 | */
234 | isNext: boolean
235 | /**
236 | * 是否加载中
237 | */
238 | isLoading: boolean
239 | }
240 |
241 | export interface settingsDataInterface {
242 | /**
243 | * 点击次数
244 | */
245 | count: number
246 | /**
247 | * 检测更新 `flag`
248 | */
249 | checkUpdateIsLoading: boolean
250 | }
251 |
252 | export interface detailDataInterface {
253 |
254 | /**
255 | * 本地拿到的 `id`
256 | */
257 | id: string | number
258 |
259 | /**
260 | * 数据
261 | */
262 | data: shareComicFace
263 |
264 | /**
265 | * 加载状态
266 | */
267 | isLoading: boolean
268 |
269 | /**
270 | * 是否显示漫画完整信息
271 | */
272 | showComicInfoBox: boolean
273 |
274 | }
275 |
276 | /**
277 | * `filter` page data interface
278 | */
279 | export interface filterDataInterface {
280 | /**
281 | * 时间
282 | */
283 | time?: null | searchOptionTimeEnum
284 | /**
285 | * 类型
286 | */
287 | type?: null | searchOptionTypeEnum
288 | }
289 |
290 | export interface homePageInterface {
291 |
292 | /**
293 | * 一句话
294 | */
295 | sayWord: sayWordInterface
296 |
297 | /**
298 | * 随机背景图
299 | */
300 | bgImg: string
301 |
302 | }
--------------------------------------------------------------------------------
/src/components/card-preview.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 |
12 | {{ data.title }}
15 |
16 |
19 |
20 |
21 |
22 | {{ item }}
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | {{ item }}
36 |
37 |
38 |
39 |
40 |
41 |
42 |
180 |
181 |
--------------------------------------------------------------------------------
/src/views/login/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
13 |
14 |
15 |
16 |
17 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | 账号:
30 |
31 |
32 |
33 | * 填写错误
34 |
35 |
36 | 密码:
37 |
38 |
39 |
40 | * 填写错误
41 |
42 |
43 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | 登录中...
54 |
55 |
56 |
57 |
58 |
59 |
146 |
147 |
--------------------------------------------------------------------------------
/src/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "18comic",
3 | "appid" : "__UNI__4D582C0",
4 | "description" : "",
5 | "versionName" : "1.0.0",
6 | "versionCode" : "100",
7 | "transformPx" : false,
8 | "app-plus" : {
9 | /* 5+App特有相关 */
10 | "modules" : {},
11 | /* 模块配置 */
12 | "distribute" : {
13 | /* 应用发布信息 */
14 | "android" : {
15 | /* android打包配置 */
16 | "permissions" : [
17 | "",
18 | "",
19 | "",
20 | "",
21 | "",
22 | "",
23 | "",
24 | "",
25 | "",
26 | "",
27 | "",
28 | "",
29 | "",
30 | "",
31 | "",
32 | "",
33 | "",
34 | "",
35 | "",
36 | "",
37 | "",
38 | ""
39 | ]
40 | },
41 | "ios" : {
42 | "UIUserInterfaceStyle" : "Automatic"
43 | },
44 | /* ios打包配置 */
45 | "sdkConfigs" : {
46 | "ad" : {}
47 | },
48 | "icons" : {
49 | "android" : {
50 | "hdpi" : "unpackage/res/icons/72x72.png",
51 | "xhdpi" : "unpackage/res/icons/96x96.png",
52 | "xxhdpi" : "unpackage/res/icons/144x144.png",
53 | "xxxhdpi" : "unpackage/res/icons/192x192.png"
54 | },
55 | "ios" : {
56 | "appstore" : "unpackage/res/icons/1024x1024.png",
57 | "ipad" : {
58 | "app" : "unpackage/res/icons/76x76.png",
59 | "app@2x" : "unpackage/res/icons/152x152.png",
60 | "notification" : "unpackage/res/icons/20x20.png",
61 | "notification@2x" : "unpackage/res/icons/40x40.png",
62 | "proapp@2x" : "unpackage/res/icons/167x167.png",
63 | "settings" : "unpackage/res/icons/29x29.png",
64 | "settings@2x" : "unpackage/res/icons/58x58.png",
65 | "spotlight" : "unpackage/res/icons/40x40.png",
66 | "spotlight@2x" : "unpackage/res/icons/80x80.png"
67 | },
68 | "iphone" : {
69 | "app@2x" : "unpackage/res/icons/120x120.png",
70 | "app@3x" : "unpackage/res/icons/180x180.png",
71 | "notification@2x" : "unpackage/res/icons/40x40.png",
72 | "notification@3x" : "unpackage/res/icons/60x60.png",
73 | "settings@2x" : "unpackage/res/icons/58x58.png",
74 | "settings@3x" : "unpackage/res/icons/87x87.png",
75 | "spotlight@2x" : "unpackage/res/icons/80x80.png",
76 | "spotlight@3x" : "unpackage/res/icons/120x120.png"
77 | }
78 | }
79 | }
80 | },
81 | /* SDK配置 */
82 | "usingComponents" : true,
83 | "splashscreen" : {
84 | "alwaysShowBeforeRender" : true,
85 | "waiting" : true,
86 | "autoclose" : true,
87 | "delay" : 0
88 | },
89 | "networkTimeout" : {
90 | "request" : 30000
91 | },
92 | "compatible" : {
93 | "ignoreVersion" : true
94 | }
95 | },
96 | "quickapp" : {},
97 | /* 快应用特有相关 */
98 | "mp-weixin" : {
99 | /* 小程序特有相关 */
100 | "usingComponents" : true,
101 | "appid" : "wx8a0f33010a52d157",
102 | "setting" : {
103 | "urlCheck" : true
104 | }
105 | },
106 | "mp-alipay" : {
107 | "usingComponents" : true
108 | },
109 | "mp-baidu" : {
110 | "usingComponents" : true
111 | },
112 | "mp-toutiao" : {
113 | "usingComponents" : true
114 | },
115 | "mp-qq" : {
116 | "usingComponents" : true
117 | }
118 | }
119 |
--------------------------------------------------------------------------------
/src/views/home/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ '我的' }}
5 |
6 |
7 |
8 |
9 |
10 |
11 | {{ word.hitokoto }}
12 |
13 |
14 | - {{ word.from }}
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 | {{ row.title }}
29 |
30 |
31 | {{ row.data.length }}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | {{ row.title }}
41 |
42 |
43 | {{ row.data.length }}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
159 |
160 |
--------------------------------------------------------------------------------
/src/const/index.ts:
--------------------------------------------------------------------------------
1 | import { colorItemInterface, themeMenuItemInterface, devInsDataInterface, guideDataItemInterface, mirrorItemInterface } from '@/interface/tool'
2 | import { createStaticByCDN } from '@/utils/map'
3 |
4 | const injection = require('@/plugins/injection')
5 |
6 | /********
7 | > TODO 将所有的公共 `key` 移植到 `key.ts` 中
8 | *******/
9 |
10 | /**
11 | * 滤镜默认背景
12 | */
13 | export let blur_default_url = "https://i.loli.net/2020/05/25/ynGRv1z5s7OCtw9.png"
14 |
15 | blur_default_url = createStaticByCDN('resources/tiny_blur.png')
16 |
17 | export let empty_default_url = "https://i.loli.net/2020/06/09/LnB24yeIwxs8p1g.png"
18 |
19 | empty_default_url = createStaticByCDN('resources/empty.png')
20 |
21 | /**
22 | * `18comic` logo
23 | * raw url: https://18comic.vip/static/resources/images/Cover/%E5%A4%A9%E5%A0%82.jpg
24 | */
25 | export const ng18comicLogo = createStaticByCDN('resources/18comic.jpg')
26 |
27 | /**
28 | * 主题默认列
29 | */
30 | export const theme_default_col = 3
31 |
32 | /**
33 | * 主题默认的最大文字(将会变为 `2` 列)
34 | */
35 | export const theme_item_max_word = 8
36 |
37 | /**
38 | * 设置里的开发者相关默认最大点击次数
39 | * 才会打开开发者相关功能
40 | */
41 | export const settings_click_max_count = 8
42 |
43 |
44 | /**
45 | * 默认背景
46 | */
47 | export const bg_default_url = "http://www.dmoe.cc/random.php"
48 |
49 | /**
50 | * 搜索界面数据为空时的文字
51 | */
52 | export const search_empty_text = "没有数据哦"
53 |
54 | /**
55 | * 主题搜索区 `placeholder`
56 | */
57 | export const theme_search_main_placeholder = 'bilibili干杯🍻, 请搜索'
58 |
59 | /**
60 | * goto id-input
61 | */
62 | export const theme_search_goto_placeholder = '请输入id'
63 |
64 | export const theme_search_goto_text = '如果你知道某个作品的id话....'
65 |
66 | /**
67 | * 历史记录的最大长度
68 | * 20200715 修改为 `240`..
69 | */
70 | export const history_views_max_length = 240
71 |
72 | /**
73 | * 我的邮箱
74 | */
75 | export let my_email = ""
76 | try {
77 | my_email = atob(`Y2hlbmhvbnpob3VAZ21haWwuY29t`)
78 | } catch (err) {
79 | console.error("base64解码失败: ", err)
80 | }
81 |
82 | /**
83 | * 官方的 `trello` 的 `id`
84 | */
85 | export const trello_board_id = 'McDZAm8C'
86 |
87 | /**
88 | * 颜色列表
89 | */
90 | export const colors: colorItemInterface[] = [
91 | {
92 | title: "嫣红",
93 | name: "red",
94 | color: "#e54d42"
95 | },
96 | {
97 | title: "桔橙",
98 | name: "orange",
99 | color: "#f37b1d"
100 | },
101 | {
102 | title: "明黄",
103 | name: "yellow",
104 | color: "#fbbd08"
105 | },
106 | {
107 | title: "橄榄",
108 | name: "olive",
109 | color: "#8dc63f"
110 | },
111 | {
112 | title: "森绿",
113 | name: "green",
114 | color: "#39b54a"
115 | },
116 | {
117 | title: "天青",
118 | name: "cyan",
119 | color: "#1cbbb4"
120 | },
121 | {
122 | title: "海蓝",
123 | name: "blue",
124 | color: "#0081ff"
125 | },
126 | {
127 | title: "姹紫",
128 | name: "purple",
129 | color: "#6739b6"
130 | },
131 | {
132 | title: "木槿",
133 | name: "mauve",
134 | color: "#9c26b0"
135 | },
136 | {
137 | title: "桃粉",
138 | name: "pink",
139 | color: "#e03997"
140 | },
141 | {
142 | title: "棕褐",
143 | name: "brown",
144 | color: "#a5673f"
145 | },
146 | {
147 | title: "玄灰",
148 | name: "grey",
149 | color: "#8799a3"
150 | },
151 | {
152 | title: "草灰",
153 | name: "gray",
154 | color: "#aaaaaa"
155 | },
156 | {
157 | title: "墨黑",
158 | name: "black",
159 | color: "#333333"
160 | },
161 | {
162 | title: "雅白",
163 | name: "white",
164 | color: "#ffffff"
165 | }
166 | ]
167 |
168 | /**
169 | * 主题菜单
170 | */
171 | export const theme_menus: themeMenuItemInterface[] = [
172 | {
173 | title: "GOTO",
174 | link: 'detail/index',
175 | key: 'goto',
176 | },
177 | {
178 | title: "随机看",
179 | link: 'detail/index',
180 | key: 'random_comic',
181 | },
182 | {
183 | title: "留言板",
184 | link: 'topic/index',
185 | key: 'bbs',
186 | },
187 | {
188 | title: "涨姿势",
189 | link: 'blogs/index',
190 | key: 'blogs'
191 | },
192 | // TODO 2020-08-28
193 | // 我陈某就是死, 从这里跳下去, 我也不会做这个功能(flag已立)
194 | // {
195 | // title: '插件开发',
196 | // link: 'webview/index',
197 | // key: 'plugin_development'
198 | // }
199 | ]
200 |
201 | /**
202 | * 创建提示性`文字`
203 | */
204 | const createSpanTips = (ctx: string): string=> {
205 | return `\`${ ctx }\``
206 | }
207 |
208 | export const guideDatas: guideDataItemInterface[] = [
209 | {
210 | title: '作者寄语🔞',
211 | content: `完全免费! 代码开源, 没有多余套路. 所有数据均来自网络, 侵权必删, ${ createSpanTips('仅供学习参考') }, 如果一直访问不了, 请尝试切换镜像站`,
212 | },
213 | {
214 | title: '警告🔞',
215 | content: `前方高能!!!\n部分内容可能对您的生理及心理造成难以恢复的伤害。本应用作者不会对由本应用造成的任何后果负责。\n\n未成年人应在监护人指导下使用本应用。`,
216 | isEnd: true
217 | },
218 | ]
219 |
220 | /**
221 | * QQ群
222 | */
223 | export const joinQQGroup = "https://jq.qq.com/?_wv=1027&k=KaVypDjS"
224 |
225 | /**
226 | * 注入的 `pages.json` 文件
227 | */
228 | export const devInsData: devInsDataInterface = injection.pagejson
229 |
230 | /**
231 | * 2020-08-27 更新
232 | * 网址发布页: http://jmcomic.xyz
233 | */
234 |
235 | /*
236 |
237 | JM主站
238 | https://18comic.vip
239 |
240 | 海外分流
241 | https://18comic.org
242 |
243 | 中國用戶 〈有新網址會隨時更新〉
244 |
245 | JM中國主站
246 | https://18comic1.biz
247 |
248 | 分流1
249 | https://18comic2.biz
250 |
251 | 分流2
252 | https://18comic3.biz
253 |
254 | */
255 | export const defaultMirrorArr: mirrorItemInterface[] = [
256 | {
257 | title: 'JM主站',
258 | ext: 'vip',
259 | full_url: 'https://18comic.vip'
260 | },
261 | {
262 | title: '海外分流',
263 | ext: 'org',
264 | full_url: 'https://18comic.org'
265 | },
266 | {
267 | title: 'JM中國主站',
268 | ext: 'fun',
269 | full_url: 'https://18comic1.biz'
270 | },
271 | {
272 | title: "分流1",
273 | ext: "biz",
274 | full_url: "https://18comic2.biz"
275 | },
276 | {
277 | title: "分流2",
278 | ext: "biz",
279 | full_url: "https://18comic3.biz"
280 | }
281 | ]
282 |
283 | /**
284 | * 更新版本是最新版本
285 | */
286 | export const updateIsLastVersion = `已经是最新版本了`
287 |
288 | /**
289 | * 更新版本网络连接错误
290 | */
291 | export const updateVersionNetWorkError = `更新版本失败, 可能是网络问题(需要翻墙)`
292 |
293 | /**
294 | * 重新加载按钮的文字
295 | */
296 | export const reloadButtonText = `刷新(*╹▽╹*)`
297 |
298 | /**
299 | * 详情id不存在
300 | */
301 | export const detailIDNotExist = `该漫画不存在`
302 |
303 | /**
304 | * 开源地址
305 | */
306 | export const openSourceRepo = `https://github.com/waifu-project/18comic`
--------------------------------------------------------------------------------
/src/views/filter/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | 页数
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | 时间
21 |
22 |
23 |
24 |
25 |
26 |
27 |
32 | {{ item | display('time', index) }}
33 |
34 |
35 |
36 |
37 |
38 |
39 | 类型
40 |
41 |
42 |
43 |
44 |
45 |
46 |
51 | {{ item | display('type', index) }}
52 |
53 |
54 |
55 |
56 |
66 |
67 |
68 |
69 |
70 |
225 |
226 |
--------------------------------------------------------------------------------
/src/views/reader/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ leftTitle }}
5 | {{ title }}
6 |
7 |
8 |
9 | {{ '下一话' }}
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | {{ '加载中...' }}
19 |
20 |
21 |
22 |
23 |
24 |
28 |
29 |
30 |
31 |
32 |
218 |
219 |
--------------------------------------------------------------------------------
/src/views/switch/flow.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
11 |
15 |
16 |
17 |
18 |
19 | {{ '请选择分流' }}
20 | {{ flows[current_mirror_index]['full_url'] }}
21 | {{ '墙裂建议开启`vpn`之后在使用该应用' }}
22 |
23 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
40 |
41 | {{ logoText }}
42 |
43 |
44 | {{ current_mirror && current_mirror.title }}
45 | {{ loadingTitle }}
46 |
47 |
48 |
49 |
50 | {{ version }}
51 |
52 |
53 |
54 |
55 |
56 |
60 |
61 |
62 |
63 |
64 |
65 |
181 |
182 |
--------------------------------------------------------------------------------
/src/views/search/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {{ barTitle }}
7 |
8 |
9 |
10 |
15 |
16 |
17 | {{ '参数' }}
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
35 |
36 |
37 |
38 | {{ search_empty_text }}
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | {{ barRightText }}
50 |
51 |
52 |
53 |
54 |
55 |
231 |
232 |
--------------------------------------------------------------------------------
/src/views/theme/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | {{ '最热主题' }}
22 |
23 |
24 |
25 |
30 |
31 | {{ item.text }}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 | {{ '快上车' }}
40 |
41 |
42 |
43 |
44 |
48 |
53 | {{ item.title }}
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | {{ item.title }}
64 |
65 |
66 |
67 |
68 |
74 | {{ subItem.text }}
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | {{ goto_text }}
88 |
89 |
90 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
271 |
272 |
--------------------------------------------------------------------------------
/src/views/settings/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ '设置' }}
5 |
6 |
7 |
8 |
9 |
10 |
11 | {{ '阅读设置' }}
12 |
13 |
14 |
15 |
43 |
44 |
45 |
46 |
47 | {{ '其他设置' }}
48 |
49 |
50 |
51 |
107 |
108 |
109 |
110 |
111 |
112 |
113 | {{ '开发者相关' }}
114 |
115 |
116 |
117 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
316 |
317 |
--------------------------------------------------------------------------------