PubliraGitHub

面向讀者、編輯和營運人員的應用程式

三個 Next.js 應用程式、一個 Flutter 用戶端以及它們寄出的郵件,各自面向不同的使用者。

面向讀者的網站

apps/web-storefront

讀者造訪的網站,以出版社自己的品牌對外發布。包括瀏覽、搜尋、排行榜、追蹤、登入,以及翻頁閱讀的閱讀器。

作品目錄最上方是租戶主打的作品,下方是構成頁面其餘部分的各個區塊:本週排行榜、最新章節、今日更新,以及租戶想推薦的品牌和作者。主控台置頂的公告會顯示在每個頁面頂端,直到讀者將其關閉;所有內容都使用出版社的品牌,而不是 Publira 的。
類型每個類型以其中排名靠前的系列封面或編輯上傳的插圖呈現,並附上系列數。開啟類型後,上方是本週閱讀最多的系列,下方是該類型的所有系列,排序和篩選方式與完整列表相同。類型由租戶自行設定,並非固定的列表。
排行榜日榜和週榜,每一列都標示該系列與上一期相比的名次變動。名次依讀者的行為 (開啟和回應章節) 由批次作業彙總而成,而非人工排列;R15 和 R18 作品另有獨立的排行榜,只有有權觀看的讀者才能開啟。
系列所有已發布的系列,可依類型、連載狀態排序和篩選,也可以只顯示含免費章節的系列。有年齡分級的作品在所有列表中都會標示,在讀者確認可以觀看之前保持隱藏。
系列詳情封面、簡介、品牌、類型和標籤,依署名角色列出的所有作者,以及旁邊的追蹤和分享按鈕。下方依閱讀順序列出章節,並標明免費或付費,不必登入就能知道現在可以讀哪些。
章節閱讀器頁面繪製在 canvas 上,從編輯設定的跨頁起始頁開始,由右向左以跨頁翻動。工具列的滑桿一次移動一個跨頁;讀到最後一頁後,讀者可以回應本章並前往下一章。閱讀器就是發布在 npm 上的那個套件,因此翻頁、跨頁和閱讀方向都由該函式庫實作。
搜尋輸入一個關鍵字,就能找到符合的系列、作者和品牌,每組結果都能展開為獨立的列表。只搜尋得到租戶已發布的內容,仍在編輯佇列中的內容不會出現在這裡。
作者在該租戶發布作品的作者及其系列數,以及每位作者的頁面:頭像、簡介、追蹤按鈕和署名該作者的所有系列。作者是由編輯主控台管理的檔案,因此同一個名字在其署名的所有系列中都指向同一位作者。
登入登入和註冊表單都可以使用電子郵件地址和密碼,或讀者已有的 Apple 和 Google 帳號;設定過通行金鑰的讀者還可以用通行金鑰登入。這些登入服務由租戶自行設定,在主控台設定憑證後才會顯示。若租戶指定了使用條款,讀者需要同意,條款修訂後也需要再次同意。
讀者的個人頁面讀者追蹤的系列和作者的最新動態、已購買的章節及各自的可閱讀期限,以及新章節的通知方式:郵件或瀏覽器通知。

租戶主控台

apps/web-admin

編輯的工作台:作品目錄和發布佇列、金流和登入服務、公開網站的主題和頁面、讀者的諮詢、讀者的購買與退款、應支付給每位作者的款項,以及對上述所有內容的變更記錄。

儀表板已發布的系列、草稿章節和預約發布的數量,下方是所有待處理事項的佇列。佇列彙整了草稿和預約發布及其發布時間,編輯開啟主控台就能看到有哪些內容在等待處理,不必自己尋找。
系列標題、品牌、發布日期、閱讀期限、年齡分級和狀態集中在一張表中,可以依連載狀態或分級篩選。開啟系列即可查看詳細資料:為租戶提供的每種語言填寫標題和簡介,為每位作者設定署名角色和銷售分潤,輸入分潤時會同時算出出版社所得的剩餘部分。這些署名是新章節的範本。
章節一個系列的所有章節依閱讀順序排列,透過拖曳 (或方向鍵) 調整位置,不必手動重新編號。章節可以依租戶所在時區預約發布時間;頁面可以上傳圖片、ZIP 或 EPUB,同樣能調整順序,即使章節已發布,也可以逐頁替換或刪除。
作者可以重新命名該租戶署名作者時使用的角色,並調整署名的顯示順序;每位作者也有自己的頁面。租戶管理員可以在作者頁面連結作者本人的讀者帳號,這樣作者不必購買就能閱讀自己的章節,但不能為其評分。
金流該租戶網頁結帳使用的金流服務 (Stripe 或 PAY.JP) 及其金鑰,以及應用程式內販售使用的 App Store 和 Google Play 憑證。密鑰為唯寫:再次開啟時只能看到設定狀態和遮罩,無法查看實際的值。
登入和應用程式連結該租戶的讀者可用來登入的 Apple 和 Google 帳號,以及用來開啟租戶連結的 Android 和 iOS 應用程式。兩者都依租戶分別設定,因此同一部署中的每家出版社都能以自己的名義讓讀者登入,並用自己的應用程式開啟連結。
主題品牌色、顯示在品牌色上的文字顏色、讀者最先看到的字體,以及公開網站使用的標誌和圖示,都在這裡設定,並可在以公開網站同一套元件建構的預覽中確認。預覽會隨每次編輯即時更新,而公開網站在儲存前維持目前的配色,因此主題儲存之前,讀者不會看到任何變化。
頁面和公告租戶自己的頁面用 Markdown 撰寫,可為每種語言準備譯文,所有已發布的版本都會保留,方便比較和還原。公告會發送給所有造訪網站的人,其中一則可以作為橫幅置頂在每個頁面頂端。
諮詢讀者透過網站諮詢表單寄來的訊息,附有回覆地址、負責的工作人員和處理狀態。在諮詢頁面寫下的回覆會以郵件寄給讀者,並保留在該諮詢下方。收到新諮詢時也會寄郵件通知工作人員,因此不必一直開著主控台。
報表和版稅每個章節讀完的會員人數,以及當月的銷售額、退款和應支付給每位作者的款項,月份依租戶所在時區劃分。結算後,該月會產生不再受之後銷售影響的版稅明細,並可下載為 CSV;結算後才記錄的退款,會作為調整項目計入下一份明細。
稽核記錄記錄誰在何時做了什麼、結果如何,以及操作者和每次操作涉及的記錄。可依時間範圍、操作或操作者篩選,日期以租戶所在時區 (而非伺服器時區) 的日曆日計算。

平台主控台

apps/web-platform

位於各租戶之上,供營運部署的人員使用:部署尚需完成的設定、租戶狀態、跨租戶事件、所有租戶的讀者,以及從物件儲存到安全性政策等所有租戶共用的設定。

儀表板部署尚需完成的設定及各項設定的入口,下方是租戶數量和最近的跨租戶事件:建立的租戶、授予的角色、新增的帳號。營運人員開啟主控台,首先就能看到部署是否已準備就緒。
租戶所有已建立的租戶及其狀態和建立日期,可依名稱或 ID 搜尋,每個租戶還有基本資料、網域和成員頁面。這個主控台只管理租戶的狀態和管理員,不涉及作品目錄;作品目錄由各租戶在自己的主控台中管理。
使用者所有租戶的讀者彙整在一份列表中,附有所屬租戶、註冊日期和狀態。營運人員可以在這裡停用或刪除帳號,而這些讀者能閱讀哪些作品,仍由發布作品的租戶決定。
部署設定所有租戶上傳內容共用的 S3 相容儲存貯體、部署寄送郵件所用的 SMTP 中繼、保護登入和郵件的頻率限制,以及 Web Push 簽章用的金鑰組。儲存的變更不必重新啟動,就會套用到所有執行中的伺服器。

行動應用程式

mobile

在手機上瀏覽同一份作品目錄,用一套 Flutter 程式碼同時支援 Android 和 iOS,並使用租戶自己的名稱和主題。應用程式直接呼叫公開 API,不經過網站;讀者可以用電子郵件地址、通行金鑰、Apple 或 Google 登入,透過應用程式商店或網站結帳購買章節,開啟過或儲存過的章節會保留在裝置上。

目錄應用程式列顯示租戶的名稱和主題,下方依序是主控台置頂的公告、讀者讀到一半的章節、類型和本週排行榜。除了閱讀器以外,在任何畫面都可以透過底部導覽列前往首頁、搜尋、書架、通知和帳號。
類型和搜尋類型以封面拼成的方塊呈現,開啟後可以用與網站相同的排序和篩選瀏覽系列;輸入一個關鍵字就能找到符合的系列、作者和品牌。所有列表都來自網站使用的同一個公開 API,因此只找得到租戶已發布的內容。
系列和作者封面、依租戶定義的角色列出的署名、品牌、類型和標籤,追蹤系列和每位作者的按鈕,以及分享網站連結的按鈕。作者頁面同樣可以追蹤,讀者追蹤的作者發布新章節時會收到推播通知,點選即可直接在閱讀器中開啟。
章節閱讀器與網站相同的章節,依編輯設定的跨頁和閱讀方向排版,可以用滑桿在頁面間移動。付費章節依租戶的選擇,透過應用程式商店的購買畫面或網站結帳購買;讀者擷取螢幕畫面時,會顯示租戶關於頁面使用方式的提醒。
書架和通知繼續閱讀、追蹤、儲存在裝置上的章節和推薦各自是獨立的列表,另有已購買的章節及各自的可閱讀期限,以及讀者收到的通知。儲存的頁面以裝置自行產生的金鑰加密保存,離線時的閱讀記錄會在網路恢復後上傳。
帳號頭像、名稱、電子郵件地址、密碼、已連結的 Apple 和 Google 帳號、郵件通知、租戶自己的頁面、向租戶諮詢以及刪除帳號,讀者都不必離開應用程式就能完成;登入時除了電子郵件地址,在 Android 上還可以選擇 Google,在 iOS 上還可以選擇 Apple。

系統寄出的郵件

apps/email-renderer

帳號相關郵件和工作人員收到的通知,由獨立的轉譯器根據 React 元件產生 HTML,並附上純文字版本一起寄出。寄給租戶讀者和工作人員的郵件使用租戶名稱而不是 Publira,並以租戶的語言撰寫;日文、韓文和中文裡不同文字之間的間距,與網站一樣交由郵件用戶端的文字排版處理。

驗證電子郵件地址新讀者收到的第一封郵件:用於驗證電子郵件地址的按鈕、連結的有效期限,以及為無法顯示按鈕的郵件用戶端附上的完整連結。
重設密碼用於設定新密碼的連結,寄出一天後失效,版面與租戶的其他郵件相同。
寄給工作人員的諮詢通知讀者透過諮詢表單寄出的內容,附有回覆地址和寄出時登入的帳號。工作人員可以在主控台的諮詢頁面回覆,也可以直接用自己的郵件用戶端回覆。