面向读者、编辑和运营人员的应用 三个 Next.js 应用、一个 Flutter 客户端以及它们发送的邮件,各自面向不同的用户。
面向读者的网站 apps/web-storefront 读者访问的网站,以出版社自己的品牌对外发布。包括浏览、搜索、排行榜、关注、登录,以及翻页阅读的阅读器。
publisher.example
作品目录 最上方是租户主推的作品,下方是组成页面其余部分的书架:本周排行榜、最新章节、今日更新,以及租户希望推荐的品牌和作者。控制台置顶的公告会显示在每个页面顶部,直到读者将其关闭;所有内容都使用出版社的品牌,而不是 Publira 的。 publisher.example
题材 每个题材以其中排名靠前的系列封面或编辑上传的插图展示,并附上系列数量。打开题材后,上方是本周阅读最多的系列,下方是该题材的全部系列,排序和筛选方式与完整列表相同。题材由租户自行设定,并非固定列表。 publisher.example
排行榜 日榜和周榜,每一行都标出该系列与上一期相比的名次变化。名次根据读者行为 (打开和回应章节) 由批处理任务汇总得出,而非人工排列;R15 和 R18 作品另有独立的排行榜,只有有权查看的读者才能打开。 publisher.example
系列 所有已发布的系列,可以按题材、连载状态排序和筛选,也可以只显示含免费章节的系列。有年龄分级的作品在所有列表中都有标示,在读者确认可以查看之前保持隐藏。 publisher.example
系列详情 封面、简介、品牌、题材和标签,按署名角色列出的所有作者,以及旁边的关注和分享按钮。下方按阅读顺序列出章节,并标明免费或付费,无需登录就能知道现在能读哪些。 publisher.example
章节阅读器 页面绘制在 canvas 上,从编辑设定的跨页起始页开始,从右向左按跨页翻动。工具栏的滑块每次移动一个跨页;读到最后一页后,读者可以回应本章并前往下一章。阅读器就是发布在 npm 上的那个软件包,因此翻页、跨页和阅读方向都由该库实现。 publisher.example
搜索 输入一个关键词,即可找到匹配的系列、作者和品牌,每组结果都可以展开为单独的列表。只能搜索到租户已发布的内容,仍在编辑队列中的内容不会出现在这里。 publisher.example
作者 在该租户发布作品的作者及其系列数量,以及每位作者的页面:头像、简介、关注按钮和署名该作者的全部系列。作者是由编辑控制台管理的档案,因此同一个名字在其署名的所有系列中都指向同一位作者。 publisher.example
登录 登录和注册表单都可以使用邮箱地址和密码,或读者已有的 Apple 和 Google 账户;登记过通行密钥的读者还可以用通行密钥登录。这些登录服务由租户自行设置,在控制台登记凭据后才会显示。如果租户指定了使用条款,读者需要同意,条款修订后还需要再次同意。 publisher.example
读者的个人页面 读者关注的系列和作者的最新动态、已购买的章节及各自的可阅读期限,以及新章节的通知方式:邮件或浏览器通知。
租户控制台 apps/web-admin 编辑的工作台:作品目录和发布队列、支付和登录服务、公开网站的主题和页面、读者的咨询、读者的购买与退款、应付给每位作者的款项,以及对上述所有内容的变更记录。
admin.publisher.example
仪表盘 已发布的系列、草稿章节和预约发布的数量,下方是所有待处理事项的队列。队列汇总了草稿和预约发布及其发布时间,编辑打开控制台就能看到有哪些内容在等待处理,无需自己查找。 admin.publisher.example
系列 标题、品牌、发布日期、阅读期限、年龄分级和状态汇总在一张表中,可以按连载状态或分级筛选。打开系列可以查看详情:为租户提供的每种语言填写标题和简介,为每位作者设定署名角色和销售分成,输入分成时会同时算出出版社所得的剩余部分。这些署名会作为新章节的初始设置。 admin.publisher.example
章节 一个系列的所有章节按阅读顺序排列,通过拖动 (或方向键) 调整位置,无需手动重新编号。章节可以按租户所在时区预约发布时间;页面可以上传图片、ZIP 或 EPUB,同样可以调整顺序,即使章节已发布,也可以逐页替换或删除。 admin.publisher.example
作者 可以重命名该租户署名作者时使用的角色,并调整署名的显示顺序;每位作者也有自己的页面。租户管理员可以在作者页面关联作者本人的读者账户,这样作者无需购买即可阅读自己的章节,但不能为其评分。 admin.publisher.example
支付 该租户网页结账使用的支付服务 (Stripe 或 PAY.JP) 及其密钥,以及应用内销售使用的 App Store 和 Google Play 凭据。密钥只能写入,再次打开时只能看到设置状态和掩码,无法查看密钥本身。 admin.publisher.example
登录和应用链接 该租户的读者可用于登录的 Apple 和 Google 账户,以及用来打开租户链接的 Android 和 iOS 应用。两者都按租户分别设置,因此同一部署中的每家出版社都能以自己的名义让读者登录,并用自己的应用打开链接。 admin.publisher.example
主题 品牌色、显示在品牌色上的文字颜色、读者首先看到的字体,以及公开网站使用的标志和图标,都在这里设置,并可在由公开网站同一套组件构建的预览中确认。预览会随每次编辑实时更新,而公开网站在保存前保持当前配色,因此主题保存之前,读者不会看到任何变化。 admin.publisher.example
页面和公告 租户自己的页面用 Markdown 撰写,可为每种语言准备译文,所有已发布的版本都会保留,便于比较和回滚。公告会向所有访问网站的人发布,其中一条可以作为横幅置顶在每个页面顶部。 admin.publisher.example
咨询 读者通过网站咨询表单发来的消息,附有回复地址、负责的工作人员和处理状态。在咨询页面写下的回复会通过邮件发给读者,并保留在该咨询下方。收到新咨询时也会发邮件通知工作人员,因此无需一直开着控制台。 admin.publisher.example
报告和版税 每个章节读完的会员人数,以及当月的销售额、退款和应付给每位作者的款项,月份按租户所在时区划分。结算后,该月会生成之后的销售不再影响的版税明细,并可下载为 CSV;结算后才记录的退款,会作为调整项计入下一份明细。 admin.publisher.example
审计日志 记录谁在何时做了什么、结果如何,以及操作者和每次操作涉及的记录。可按时间段、操作或操作者筛选,日期按租户所在时区 (而非服务器时区) 的日历日计算。
平台控制台 apps/web-platform 位于各租户之上,供运营部署的人员使用:部署尚需完成的设置、租户状态、跨租户事件、所有租户的读者,以及从对象存储到安全策略等所有租户共享的设置。
platform.publira.example
仪表盘 部署尚需完成的设置及各项设置的入口,下方是租户数量和最近的跨租户事件:新建的租户、授予的角色、新增的账户。运营人员打开控制台,首先就能看到部署是否已准备就绪。 platform.publira.example
租户 所有已登记的租户及其状态和创建日期,可按名称或 ID 搜索,每个租户还有资料、域名和成员页面。这个控制台只管理租户的状态和管理员,不涉及作品目录;作品目录由各租户在自己的控制台中管理。 platform.publira.example
用户 所有租户的读者汇总在一份列表中,附有所属租户、注册日期和状态。运营人员可以在这里停用或删除账户,而这些读者能阅读哪些作品,仍由发布作品的租户决定。 platform.publira.example
部署设置 所有租户上传内容共用的 S3 兼容存储桶、部署发送邮件所用的 SMTP 中继、保护登录和邮件的频率限制,以及 Web Push 签名用的密钥对。保存的变更无需重启,即可应用到所有正在运行的服务器。
移动应用 mobile 在手机上浏览同一份作品目录,用一套 Flutter 代码同时支持 Android 和 iOS,并使用租户自己的名称和主题。应用直接调用公开 API,不经过网站;读者可以用邮箱地址、通行密钥、Apple 或 Google 登录,通过应用商店或网站结账购买章节,打开过或保存过的章节会保留在设备上。
目录 应用栏显示租户的名称和主题,下方依次是控制台置顶的公告、读者读到一半的章节、题材和本周排行榜。除阅读器外,在任何界面都可以通过底部导航栏前往首页、搜索、书架、通知和账户。 题材和搜索 题材以封面拼成的卡片展示,打开后可以用与网站相同的排序和筛选浏览系列;输入一个关键词即可找到匹配的系列、作者和品牌。所有列表都来自网站所用的同一个公开 API,因此只能找到租户已发布的内容。 系列和作者 封面、按租户定义的角色列出的署名、品牌、题材和标签,关注系列和每位作者的按钮,以及分享网站链接的按钮。作者页面同样可以关注,读者关注的作者发布新章节时会收到推送通知,点击即可直接在阅读器中打开。 章节阅读器 与网站相同的章节,按编辑设定的跨页和阅读方向排版,可以用滑块在页面间移动。付费章节按租户的选择,通过应用商店的购买界面或网站结账购买;读者截屏时,会显示租户关于页面使用方式的提示。 书架和通知 继续阅读、关注、保存在设备上的章节和推荐各自独立成列表,另有已购章节及各自的可阅读期限,以及读者收到的通知。保存的页面使用设备自行生成的密钥加密存储,离线阅读的记录会在网络恢复后上传。 账户 头像、名称、邮箱地址、密码、已关联的 Apple 和 Google 账户、邮件通知、租户自己的页面、向租户咨询以及注销账户,读者都无需离开应用即可完成;登录时除了邮箱地址,在 Android 上还可以选择 Google,在 iOS 上还可以选择 Apple。
系统发送的邮件 apps/email-renderer 账户相关邮件和工作人员收到的通知,由独立的渲染器根据 React 组件生成 HTML,并附带纯文本部分一起发送。发给租户读者和工作人员的邮件使用租户名称而非 Publira,并以租户的语言撰写;日语、韩语和中文里不同文字之间的间距,与网站一样交由邮件客户端的文字渲染处理。
验证邮箱地址 新读者收到的第一封邮件:用于验证邮箱地址的按钮、链接的有效期,以及为无法显示按钮的邮件客户端附上的完整链接。 重置密码 用于设置新密码的链接,发送一天后失效,版式与租户的其他邮件相同。 发给工作人员的咨询通知 读者通过咨询表单发送的内容,附有回复地址和发送时登录的账户。工作人员可以在控制台的咨询页面回复,也可以直接用自己的邮件客户端回复。