├── logs ├── app-err.log └── app-out.log ├── public ├── images │ ├── demo.png │ ├── meta.png │ ├── _meta.png │ ├── cover.jpg │ ├── image4.svg │ ├── image3.svg │ ├── image1.svg │ ├── image2.svg │ └── share.svg ├── icons │ ├── favicon.ico │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── mstile-150x150.png │ ├── apple-touch-icon.png │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── browserconfig.xml │ ├── site.webmanifest │ └── safari-pinned-tab.svg ├── static │ └── locales │ │ ├── cn │ │ ├── header.json │ │ ├── moreFeature.json │ │ ├── mainFeature.json │ │ ├── faq.json │ │ ├── common.json │ │ └── log.json │ │ └── en │ │ ├── header.json │ │ ├── moreFeature.json │ │ ├── mainFeature.json │ │ ├── faq.json │ │ ├── common.json │ │ └── log.json ├── manifest.json └── lib │ ├── aos.js │ └── aos.css ├── index.js ├── configs ├── moreFeature.js ├── faq.js ├── download.js ├── logs.js └── share.js ├── next.config.js ├── i18n.js ├── .gitignore ├── pages ├── _app.js ├── index.js ├── download.js ├── _error.js ├── faq.js ├── support.js ├── _document.js └── log.js ├── README.md ├── package.json ├── pm2.json ├── server.js ├── components ├── footer.js ├── share.js ├── downloadOption.js ├── moreFeature.js ├── headerOption.js ├── ready.js ├── mainFeature.js ├── cover.js └── header.js ├── styles ├── global.css └── reset.css └── nginx.conf /logs/app-err.log: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /logs/app-out.log: -------------------------------------------------------------------------------- 1 | 2020-05-24 09:43:14: > Ready on http://localhost:3000 2 | -------------------------------------------------------------------------------- /public/images/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/images/demo.png -------------------------------------------------------------------------------- /public/images/meta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/images/meta.png -------------------------------------------------------------------------------- /public/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/icons/favicon.ico -------------------------------------------------------------------------------- /public/images/_meta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/images/_meta.png -------------------------------------------------------------------------------- /public/images/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/images/cover.jpg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { setConfig } = require('next/config') 2 | setConfig(require('./next.config')) 3 | 4 | require('./server') 5 | -------------------------------------------------------------------------------- /public/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/icons/favicon-16x16.png -------------------------------------------------------------------------------- /public/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/icons/favicon-32x32.png -------------------------------------------------------------------------------- /public/icons/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/icons/mstile-150x150.png -------------------------------------------------------------------------------- /public/icons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/icons/apple-touch-icon.png -------------------------------------------------------------------------------- /public/icons/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/icons/android-chrome-192x192.png -------------------------------------------------------------------------------- /public/icons/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/daosonit/website-for-koodo-reader/HEAD/public/icons/android-chrome-512x512.png -------------------------------------------------------------------------------- /public/static/locales/cn/header.json: -------------------------------------------------------------------------------- 1 | { 2 | "faq": "帮助", 3 | "log": "更新日志", 4 | "donate": "捐赠", 5 | "lang": "English", 6 | "download": "下载", 7 | "support": "客户支持" 8 | } 9 | -------------------------------------------------------------------------------- /public/static/locales/en/header.json: -------------------------------------------------------------------------------- 1 | { 2 | "faq": "FAQ", 3 | "log": "Changelogs", 4 | "donate": "Donate", 5 | "lang": "简体中文", 6 | "download": "Download", 7 | "support": "Support" 8 | } 9 | -------------------------------------------------------------------------------- /configs/moreFeature.js: -------------------------------------------------------------------------------- 1 | export const moreFeature = [ 2 | { id: 1, icon: "zu9" }, 3 | { id: 2, icon: "zu11" }, 4 | { id: 3, icon: "zu16" }, 5 | { id: 4, icon: "zu12" }, 6 | { id: 5, icon: "zu14" }, 7 | { id: 6, icon: "zu13" }, 8 | ]; 9 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | distDir: "_next", 3 | publicRuntimeConfig: { 4 | localeSubpaths: 5 | typeof process.env.LOCALE_SUBPATHS === "string" 6 | ? process.env.LOCALE_SUBPATHS 7 | : "none", 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /configs/faq.js: -------------------------------------------------------------------------------- 1 | export const aboutInfo = [ 2 | { id: 1, icon: "zu54", color1: "#1D2FFD", color2: "#3282FA" }, 3 | { id: 2, icon: "zu56", color1: "#FE7326", color2: "#FFD547" }, 4 | { id: 3, icon: "sync", color1: "#FF5050", color2: "#D83BE2" }, 5 | { id: 4, icon: "zu57", color1: "#24C4CC", color2: "#4AC22A" }, 6 | ]; 7 | -------------------------------------------------------------------------------- /public/icons/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #da532c 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /i18n.js: -------------------------------------------------------------------------------- 1 | const NextI18Next = require("next-i18next").default; 2 | 3 | module.exports = new NextI18Next({ 4 | defaultLanguage: "cn", 5 | otherLanguages: ["en"], 6 | browserLanguageDetection: true, 7 | detection: { 8 | lookupCookie: "next-i18next", 9 | order: ["cookie", "querystring", "localStorage", "path", "subdomain"], 10 | caches: ["cookie"], 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /public/icons/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/icons/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/icons/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /public/static/locales/cn/moreFeature.json: -------------------------------------------------------------------------------- 1 | { 2 | "title1": "跨平台", 3 | "title2": "搜索功能", 4 | "title3": "书摘功能", 5 | "title4": "书签功能", 6 | "title5": "永久免费", 7 | "title6": "面板模式", 8 | "subtitle1": "Koodo Reader 完美支持跨平台的阅读体验", 9 | "subtitle2": "从上千本书中快速搜索到你寻找的图书", 10 | "subtitle3": "一键将你喜欢的文字添加到书摘中永久保存", 11 | "subtitle4": "使用书签标记你的阅读进度,快速定位到之前的位置", 12 | "subtitle5": "Koodo Reader 将永久免费,并不断添加更多功能", 13 | "subtitle6": "随意缩放软件大小,以节省屏幕空间", 14 | "question": "更多" 15 | } 16 | -------------------------------------------------------------------------------- /public/static/locales/cn/mainFeature.json: -------------------------------------------------------------------------------- 1 | { 2 | "title1": "强大笔记功能", 3 | "title2": "跨平台的阅读体验", 4 | "title3": "备份恢复功能", 5 | "title4": "多端同步功能", 6 | "subtitle1": "简单易用的 EPUB 笔记系统,让你在学习时效率倍增,充分体验电子化学习的乐趣。当然,您还可以导出笔记,存在任何地方,方便日后查阅", 7 | "subtitle2": "Koodo Reader 完美支持Windows,macOS 和 网页版,无论是任何类型的图书,都能完美展现,提供最佳阅读效果", 8 | "subtitle3": "备份自己的图书、笔记、进度,以及所有你能想到的一切!永远不用担心数据丢失,只需打开应用,轻轻一点,继续享受阅读", 9 | "subtitle4": "Koodo Reader 率先在业界实现了主流平台的全面支持,让你无需再在各个软件间来回切换,真正实现了无拘无束,随时随地阅读体验。" 10 | } 11 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-pwa", 3 | "short_name": "next-pwa", 4 | "display": "standalone", 5 | "orientation": "portrait", 6 | "theme_color": "#FFFFFF", 7 | "background_color": "#FFFFFF", 8 | "start_url": "/", 9 | "icons": [ 10 | { 11 | "src": "/icons/android-chrome-192x192.png", 12 | "sizes": "192x192", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "/icons/icon-512x512.png", 17 | "sizes": "512x512", 18 | "type": "image/png" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | /cache/ 15 | /_next/ 16 | # production 17 | #/build 18 | 19 | # misc 20 | .DS_Store 21 | 22 | # debug 23 | npm-debug.log* 24 | yarn-debug.log* 25 | yarn-error.log* 26 | 27 | # local env files 28 | .env.local 29 | .env.development.local 30 | .env.test.local 31 | .env.production.local 32 | 33 | .now -------------------------------------------------------------------------------- /public/static/locales/cn/faq.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "帮助", 3 | "subtitle": "关于 Koodo Reader 您可能关心的东西", 4 | "question1": "Koodo Reader 是什么?", 5 | "answer1": "Koodo Reader 是一个免费开源的 Epub 阅读器,诞生于2020年春,因为当时正在爆发新冠病毒,停工停学,开发者才有时间开发这个软件", 6 | "question2": "Koodo Reader 对系统有什么要求?", 7 | "answer2": "对于 Mac, Koodo Reader 要求 macOS 10.10 (Yosemite) 及以上系统. 对于 Windows, 要求 Windows 7 及以上系统", 8 | "question3": "如何备份和恢复数据?", 9 | "answer3": "点击右上角的 “备份和恢复” 按钮按照提示一步步操作就可以了,备份的文件以 zip 的形式保存,文件名为备份日期。", 10 | "question4": "我要如何联系你?", 11 | "answer4": "对于问题咨询,功能改进和 bug 反馈请前往客户支持页面,您也可以直接通过邮箱的方式与开发者取得联系。" 12 | } 13 | -------------------------------------------------------------------------------- /pages/_app.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import App from "next/app"; 3 | import { appWithTranslation } from "../i18n"; 4 | import Head from "next/head"; 5 | import "../styles/global.css"; 6 | import "../styles/reset.css"; 7 | class MyApp extends App { 8 | render() { 9 | const { Component, pageProps } = this.props; 10 | return ( 11 | <> 12 | 13 | 14 | Koodo Reader - Free Epub Reader for Windows, Mac and Web 15 | 16 | 17 | 18 | 19 | ); 20 | } 21 | } 22 | 23 | export default appWithTranslation(MyApp); 24 | -------------------------------------------------------------------------------- /configs/download.js: -------------------------------------------------------------------------------- 1 | const changeLogs = require("./logs"); 2 | const version = changeLogs[0].version; 3 | const downloadOptions = [ 4 | { 5 | id: 1, 6 | icon: "windows", 7 | title: "Windows", 8 | url: `https://github.com/troyeguo/koodo-reader/releases/download/v${version}/Koodo-Reader-Web-Setup-${version}.exe`, 9 | }, 10 | { 11 | id: 2, 12 | icon: "mac", 13 | title: "macOS", 14 | url: `https://github.com/troyeguo/koodo-reader/releases/download/v${version}/Koodo-Reader-${version}.dmg`, 15 | }, 16 | { 17 | id: 3, 18 | icon: "web", 19 | title: "Web", 20 | url: "https://reader.960960.xyz", 21 | }, 22 | ]; 23 | module.exports = downloadOptions; 24 | -------------------------------------------------------------------------------- /public/static/locales/en/moreFeature.json: -------------------------------------------------------------------------------- 1 | { 2 | "title1": "Cross-platform", 3 | "title2": "Search", 4 | "title3": "Digest", 5 | "title4": "Bookmark", 6 | "title5": "Free Forever", 7 | "title6": "Panel Mode", 8 | "subtitle1": "Koodo Reader works great on all mainstream platform", 9 | "subtitle2": "Lightning fast seach inside thousands of books at once.", 10 | "subtitle3": "Easily save any sentences into digests with one click", 11 | "subtitle4": "Use bookmarks to flag your reading progress", 12 | "subtitle5": "Koodo Reader will always be free to use, with frequent updates.", 13 | "subtitle6": "Resize window to panel size to save screen space.", 14 | "question": "What's more?" 15 | } 16 | -------------------------------------------------------------------------------- /configs/logs.js: -------------------------------------------------------------------------------- 1 | const changeLogs = [ 2 | { 3 | version: "1.1.1", 4 | versionTag: "1-1-1", 5 | date: "13 July, 2020", 6 | fix: 3, 7 | new: 0, 8 | }, 9 | { 10 | version: "1.1.0", 11 | versionTag: "1-1-0", 12 | date: "2 July, 2020", 13 | fix: 0, 14 | new: 3, 15 | }, 16 | { 17 | version: "1.0.9", 18 | versionTag: "1-0-9", 19 | date: "21 June, 2020", 20 | fix: 3, 21 | new: 2, 22 | }, 23 | { 24 | version: "1.0.8", 25 | versionTag: "1-0-8", 26 | date: "8 June, 2020", 27 | fix: 3, 28 | new: 2, 29 | }, 30 | { 31 | version: "1.0.7", 32 | versionTag: "1-0-7", 33 | date: "27 Apr, 2020", 34 | fix: 4, 35 | new: 2, 36 | }, 37 | ]; 38 | module.exports = changeLogs; 39 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Koodo Reader 官网

2 | 3 | ### 预览 4 | 5 | 6 | 7 | 8 | 9 | 10 | ### 技术栈 11 | 12 | 使用 **Next.js** 实现服务端渲染,使用 **Bootstrap** 实现响应式,使用 **next-i18next** 实现国际化,使用 **aos** 实现页面动画 13 | 14 | ### 网站地址 15 | 16 | 网站托管在 **Heroku** 上,由于免费应用的限制,网站需要 10s 左右的启动时间,请耐心等待 17 | 18 | [点我前往](https://koodo.960960.xyz) 19 | 20 | ### 运行源码 21 | 22 | ```bash 23 | git clone https://github.com/troyeguo/website-for-koodo-reader.git 24 | cd website-for-koodo-reader 25 | yarn 26 | yarn dev 27 | ``` 28 | 29 | ### 帮助与反馈 30 | 31 | 您可以在 **issue** 区提问,我会在力所能及的范围内提供帮助 32 | -------------------------------------------------------------------------------- /public/static/locales/en/mainFeature.json: -------------------------------------------------------------------------------- 1 | { 2 | "title1": "Take notes while reading", 3 | "title2": "Reader Books on any devices", 4 | "title3": "Backup and restore your data", 5 | "title4": "Sync data between multiple devices", 6 | "subtitle1": "Add annotations and notes to improve reading efficiency. Export notes and have them anywhere, so you can check them on the go", 7 | "subtitle2": "Powerful parsing engine that perfectly supports ePub2 and ePub3, Koodo Reader support Window, macOS and Web", 8 | "subtitle3": "Export book files, notes, reading progress, and anything to a .zip file! and people could use our icon manager app to import it with one click.", 9 | "subtitle4": "No matter on a browser or a desktop app, we try our best to provide you with refreshing and comfortable reading experience." 10 | } 11 | -------------------------------------------------------------------------------- /public/static/locales/en/faq.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "FAQ", 3 | "subtitle": "What you should know about Koodo Reader?", 4 | "question1": "What is Koodo Reader?", 5 | "answer1": "Koodo Reader is a free and powerful epub reader, born in 2020 spring during the outbreak of Coronavirus COVID-19.", 6 | "question2": "What are the system requirements?", 7 | "answer2": "For Mac, Koodo Reader requires macOS 10.10 (Yosemite) or later. For Windows, Windows 7 and later are supported.", 8 | "question3": "How to backup and restore data?", 9 | "answer3": "To backup and restore data, just click the Backup and Restore button in the top-right corner and follow the instruction", 10 | "question4": "How do I contact you?", 11 | "answer4": "For general inquiries, suggesting new features and improvements, or to report bugs, visit the support page." 12 | } 13 | -------------------------------------------------------------------------------- /public/static/locales/cn/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "ready": "还在等什么?", 3 | "ads": "快使用 Koodo Reader 来管理你的电子书吧!", 4 | "download": "下载", 5 | "preview": "网页版", 6 | "title": "开启全新 Epub 阅读体验", 7 | "subtitle": "Koodo Reader 是一个免费开源的 Epub 阅读器,支持 Windows, Mac和网页版", 8 | "share-title": "分享给更多朋友", 9 | "share-subtitle": "把你对 Koodo Reader 的喜爱分享给更多的人", 10 | "twitter": "推特", 11 | "facebook": "脸书", 12 | "weibo": "微博", 13 | "support": "客户支持", 14 | "support-subtitle": "您可以通过以下方式与开发者取得联系", 15 | "feedback": "反馈", 16 | "feedback-subtitle": "对于问题咨询,功能改进和 bug 反馈,请前往本项目在github上的issue区提交。", 17 | "email": "邮箱", 18 | "email-subtitle": "您也可以直接通过邮箱 guo362429@gmail.com 与开发者取得联系。", 19 | "error": "你来到了没有知识的荒原", 20 | "back": "返回首页", 21 | "privacy": "隐私策略", 22 | "terms": "服务条款", 23 | "download-on-pc": "请在电脑上下载本应用", 24 | "click-me-to-go": "点我前往" 25 | } 26 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "-", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "engines": { 7 | "node": ">=10.13.0" 8 | }, 9 | "scripts": { 10 | "dev": "node index.js", 11 | "build": "next build", 12 | "prestart": "next build", 13 | "export": "next export", 14 | "preexport": "next build", 15 | "start": "cross-env NODE_ENV=production node index.js", 16 | "pm2": "pm2 start pm2.json" 17 | }, 18 | "devDependencies": {}, 19 | "dependencies": { 20 | "compression": "^1.7.4", 21 | "cors": "^2.8.5", 22 | "cross-env": "^7.0.2", 23 | "express": "^4.17.1", 24 | "i18next": "^19.4.4", 25 | "next": "^9.3.6", 26 | "next-i18next": "^4.4.1", 27 | "pm2": "^4.4.0", 28 | "react": "^16.13.1", 29 | "react-device-detect": "^1.12.1", 30 | "react-dom": "^16.13.1" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /configs/share.js: -------------------------------------------------------------------------------- 1 | export const shareOptions = [ 2 | { 3 | id: 1, 4 | icon: "twitter", 5 | url: 6 | "https://twitter.com/intent/tweet?text=Koodo+Reader+-+Free+Epub+Reader+for+Windows%2C+Mac%2Cand+Web+&url=https%3A%2F%2Fkoodo.960960.xyz", 7 | color: "rgba(29, 162, 242, 1)", 8 | }, 9 | { 10 | id: 2, 11 | icon: "facebook", 12 | url: 13 | "https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fkoodo.960960.xyz", 14 | color: "rgba(60, 88, 151, 1)", 15 | }, 16 | { 17 | id: 3, 18 | icon: "weibo", 19 | url: 20 | "https://service.weibo.com/share/share.php?url=https%3A%2F%2Fkoodo.960960.xyz&title=Koodo+Reader+%E4%B8%80%E4%B8%AA%E5%85%8D%E8%B4%B9%E5%BC%BA%E5%A4%A7%E7%9A%84+Epub+%E9%98%85%E8%AF%BB%E5%99%A8%EF%BC%8C%E6%94%AF%E6%8C%81+Windows%2C+Mac%2C+%E5%92%8C+%E7%BD%91%E9%A1%B5%E7%89%88", 21 | color: "rgba(230, 22, 45, 1)", 22 | }, 23 | ]; 24 | -------------------------------------------------------------------------------- /pm2.json: -------------------------------------------------------------------------------- 1 | { 2 | "apps": { 3 | "name": "Koodo Reader", 4 | "script": "index.js", 5 | "cwd": "./", 6 | "args": "", 7 | "interpreter": "", 8 | "interpreter_args": "", 9 | "watch": true, 10 | "ignore_watch": ["node_modules", "logs"], 11 | "exec_mode": "fork", 12 | "instances": 1, 13 | "max_memory_restart": "500M", 14 | "error_file": "./logs/app-err.log", 15 | "out_file": "./logs/app-out.log", 16 | "merge_logs": true, 17 | "log_date_format": "YYYY-MM-DD HH:mm:ss", 18 | "min_uptime": "60s", 19 | "max_restarts": 30, 20 | "autorestart": true, 21 | "cron_restart": "", 22 | "restart_delay": 10, 23 | "env": { 24 | "NODE_ENV": "production", 25 | "REMOTE_ADDR": "" 26 | }, 27 | "env_dev": { 28 | "NODE_ENV": "development", 29 | "REMOTE_ADDR": "" 30 | }, 31 | "env_test": { 32 | "NODE_ENV": "test", 33 | "REMOTE_ADDR": "" 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /pages/index.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import PropTypes from "prop-types"; 3 | 4 | import { withTranslation } from "../i18n"; 5 | 6 | import Header from "../components/header"; 7 | import Footer from "../components/footer"; 8 | import MainFeature from "../components/mainFeature"; 9 | import MoreFeature from "../components/moreFeature"; 10 | import Ready from "../components/ready"; 11 | import Cover from "../components/cover"; 12 | const Homepage = ({ t }) => ( 13 | 14 | 15 |
16 |
17 | 18 | 19 | 20 |