v2.8.2
2026-10-12 · 7天前
更新與更新紀錄頁面以瀏覽者的語言顯示
修正內容
- •更新程式錯誤:檔案與
version.json 寫入失敗、不支援修補與變更預覽、無法存取儲存庫以及連線成功。
- •更新頁面:伺服器回應錯誤、「N 個檔案變更 · N 次提交」、完成、套用中、工作已登記、逾時與還原完成。
- •工作登記提示:更新、修補或還原工作已登記的訊息。
- •權限工作程序(cron)留下的進度訊息以及完成、失敗通知,現在也使用正確的語言。
更新紀錄頁面(`/changelog`)
- •「5 months ago」這類相對時間原本只有韓文和英文兩種,現在支援 13 種語言。
空清單提示、「AI 翻譯」標示、「沒有翻譯 — 以 KO 顯示」提示與「僅顯示最新 N 筆」也一併翻譯。
- •頁面語言現在採用網站實際使用的語言,而不只是工作階段的值(
?lang=、工作階段、Cookie、預設語言)。
以前首次造訪會退回韓文,導致日文與英文網站中混入韓文標示。
- •過長的識別字與路徑(不含空格的文字)不再溢出卡片,也不會被壓到右側安裝提示按鈕的下方。
需要了解
- •權限工作程序沒有登入的使用者,因此沒有語言。它以網站的預設語言留下訊息。
(以前它沒有啟動翻譯系統,所以 updater.write_failed 這類翻譯鍵可能會原樣顯示出來。現在工作程序會啟動翻譯。)
- •伺服器記錄(
error_log)與開發用除錯記錄是由維運人員閱讀的,因此維持原樣。
- •對於已安裝的網站,執行更新的是已經安裝的舊版更新程式,所以這些改進要在升級到 2.8.2 之後的更新才會生效。
多語言
- •「加入主畫面」與安裝提示中的應用程式名稱與說明以瀏覽者的語言顯示。以前直接顯示設定值(例如日文)。
翻譯放在 rzx_translations 中類似 pwa.front.name 的鍵下。manifest.php 現在只負責轉交給正式的輸出。
- •結構化資料(JSON-LD):優先查看設定值的翻譯。修正了導覽路徑第二項還帶有網站名稱的問題,以及「Home」在所有語言中都顯示為英文的問題。
- •統計元件:數字與單位(
suffix)也像標籤一樣接受各語言的值。單一值的行為與以前完全相同。
- •離線頁面與 Service Worker 的最後提示文字提供韓文、日文、英文三種語言。
Service Worker 的快取版本從 v5 升到 v6,已安裝的裝置也會收到新頁面。
- •訊息搜尋中寫死為韓文的「沒有搜尋結果」,現在支援 13 種語言。
搜尋引擎與 AI
- •輸出
<meta property="og:locale"> 與備用語言(og:locale:alternate)。在社群媒體分享時,可以傳達該頁面的語言。
- •由程式碼繪製的公開系統頁面也會收錄到
sitemap.xml(之前遺漏了)。
- •
llms.txt 的第一行(網站說明)以瀏覽者的語言顯示。
- •每個頁面的 robots 設定(管理頁面有輸入欄位,但沒有任何地方讀取)現在真正生效。
修正的問題
- •
?lang= 的值只有在與支援的語言清單核對後才會被接受。以前不支援的值會在 Cookie 中保留一年,
之後開啟該語言時,可能違背瀏覽者本人的意願而跳轉到該頁面。語言選擇器也遵循相同的規則。
- •元件建置器:頁面上沒有輸入欄位的語言,其翻譯在每次儲存時都會被刪除的問題。
- •社群訊息搜尋:姓名以加密方式儲存,導致輸入任何姓名都是 0 筆結果的問題。現在先解密再比對。
更新時保護網站自行修改的核心檔案
- •在
storage/custom/update-preserve.txt 中每行寫一個路徑(# 為註解,也可以寫資料夾),更新就不會覆蓋這些檔案。
用於保護直接寫入核心檔案的內容,例如網站專用的登入規則。不接受絕對路徑與 ..,
即使讀取不到該檔案,更新也不會中斷,而是依預設保留清單繼續進行。
- •需要了解:執行更新的一方必須已具備這項功能才有效。它從升級到 2.8.1 之後的更新開始生效。
有什麼改變
支付模組原本每個服務商就有各自的檔案,但「有哪些服務商」被寫在程式碼的多個地方。
要加入新的服務商,必須同時修改支付管理程式碼、設定頁面與 Webhook。
- •把資料夾(
gateway.json 加實作檔案)放進 rzxlib/Modules/Payment/Gateways/,核心會自動辨識。
管理設定頁面中的服務商選擇、金鑰輸入欄位與 Webhook 位址,都由該規格檔產生。
- •網站仍然在設定頁面中選擇一個服務商(與以前相同)。這不是同時使用多個服務商的功能。
- •新增方法整理在
docs/PAYMENT_GATEWAYS.md 中。
Square
- •支援信用卡付款、退款、查詢、已儲存的信用卡(用於定期扣款)與 Webhook(含簽章驗證)。
- •信用卡輸入表單會進行持卡人驗證(SCA),失敗時在頁面上說明原因。支援 13 種語言。
- •管理設定頁面新增了「連線測試」按鈕。在測試模式下執行小額付款 → 查詢 → 退款,
用來確認金鑰設定是否正確。不會有實際金流,在正式(live)模式下也不會執行。
- •在選擇 Square 之前,對任何網站都沒有影響。
既有服務商(PAY.JP·Stripe)維持不變
- •這兩個服務商的實作檔案沒有更動。舊設定(單一金鑰、v2、v3)仍然照常讀取。
- •即使發生無法讀取規格檔的情況,也設有保護機制,讓 PAY.JP 與 Stripe 以原來的方式建立。
- •我們用營運網站的實際設定與多種形式的合成設定,比對了舊程式碼與新程式碼,確認它們選擇相同的服務商、相同的模式、相同的金鑰
(scripts/test-payment-parity.php)。
依網站讀取支付設定
當同一個資料庫中為每個網站分別儲存了支付設定時,支付模組現在讀取自己網站的設定。
以前並未規定會選中哪個網站的設定。若該網站沒有自己的設定,則與以前一樣運作。
需要了解
- •新增了共用的 Webhook 位址(
/api/webhook-payment.php?gateway=…)。既有 PAY.JP 與 Stripe 的 Webhook 位址不變。
- •設定頁面的服務商清單維持原本的順序,透過規格檔加入的服務商排在後面。
v2.7.17
2026-09-21 · 28天前
外掛內容現在能被搜尋與 AI 引擎看到
問題是什麼
網站地圖(sitemap.xml)與 AI 說明檔(llms.txt)只收錄了核心已知的內容。
外掛要加入自己的頁面,只能直接修改核心檔案,而這種修改
每次更新都會消失。此外,核心是靠猜測來讀取外掛清單的,所以有些地方悄悄地出現了偏差。
- •房產資訊只在獨立的位址(
/properties-sitemap.xml)輸出,如果沒有任何地方指向該位址,
搜尋引擎就找不到它。
- •市集商品因為查詢語句去找一個根本不存在的欄位,從來沒有出現在網站地圖中。
錯誤被直接吞掉,所以沒有人發現。
- •有些網站把店家位址寫成了錯誤的形式,導致搜尋引擎收錄了打開後根本沒有頁面的位址。
外掛自己輸出自己的頁面
- •在外掛的
plugin.json 中寫上 seo,核心就會讀取並合併進網站地圖與 AI 說明檔。
方式與元件、版面配置和內部網路模組相同,位址衝突時以核心為準。
- •多語言位址與語言標記由核心自動加上。外掛只需要提供位址。
- •某個外掛出錯也不會讓整個網站地圖失效,只會少掉那個外掛的部分。
- •已停用外掛的位址會自動被排除——停用外掛的頁面本來就打不開。
中文備用位址被忽略的問題
網站地圖把語言標記寫成了 zh_CN,而標準寫法是 zh-CN,所以 Google 整行忽略了它。
頁面本身寫得是正確的,因此同一個網站在兩個地方說著不一樣的話。
現在簡體與繁體中文的備用位址都能被正確辨識。
依語言提供 AI 說明檔
- •
llms.txt 以前只有預設語言一份。現在可以輸出 ?lang=en 這樣的語言版本。
商品名稱與說明會以該語言輸出,說明檔的開頭會註明是哪個語言版本。
- •在多語言網站上,AI 回答引擎就能向各語言地區的使用者介紹這個網站。
員工可以查看自己的人事卡(內部網路)
- •原本只有人事負責人才能看的人事卡,現在本人也可以檢視。從上方的個人資料選單進入。
- •只能檢視。若有需要修改的內容,申請後由人事負責人核准的流程正在準備中。
- •評價對本人不可見。獎懲也一樣。附件文件只顯示清單。
- •無法透過修改網址列來開啟別人的卡片——是誰的卡片只由登入資訊決定。
- •本人也可以查看是誰檢視過自己的人事資訊。
v2.7.16
2026-09-21 · 28天前
討論區連結基準位址與外掛版面配置
讓討論區頁面能在其他外殼中使用
討論區頁面中的所有連結都由同一個值($boardUrl)產生,但核心總是無條件覆蓋這個值。
因此像內部網路這樣在管理頁面內使用討論區的一方,不得不對已經繪製好的頁面逐字進行替換。
只要核心稍微改動連結的形式,就會悄悄出現偏差。
- •如果呼叫端事先指定了基準位址,就使用該值。如果沒有指定,則與以前完全一樣。
- •齒輪(討論區設定)連結也在一處統一決定。以前列表、FAQ、問答與連結外觀這四處各自產生。
版面配置可以放在外掛裡
- •查找版面配置時先找核心的
skins/layouts/,沒有再找外掛的 plugins/{id}/skins/layouts/。
規則與元件和內部網路模組相同,同名時以核心為準。
- •管理頁面的版面配置選擇器中也會同時顯示外掛版面配置。
- •到目前為止,外掛專用的版面配置必須放在核心資料夾裡。更新不會刪除它,
但之後如果核心推出同名版面配置就會被覆蓋,而且把外掛搬到其他網站時還得手動帶上這個資料夾。
v2.7.15
2026-09-21 · 28天前
外掛宣告內部網路模組 · 日期輸入支援日本年號
外掛自己宣告內部網路模組
內部網路頁面(左側選單與入口路徑)的清單,以前只存在於核心的一個設定檔中。
外掛要加入自己的模組,必須修改核心檔案,而更新後這些內容就會消失。
- •在外掛的
plugin.json 中寫上 intranet_module,核心就會讀取並合併。方式與選單和系統頁面相同。
- •值可以直接寫陣列,也可以像
"data/intranet-module.php" 這樣寫檔案路徑。
- •同名時以核心為準。外掛無法劫持核心模組來改變其預設行為。
- •核心中讀取這個清單的 5 個位置全部改成了新方式。即使更新覆蓋了設定檔,外掛模組也會保留。
日期輸入支援日本年號(和曆)
- •在日文頁面的日期輸入欄中,選擇年號(令和、平成、昭和、大正、明治)並輸入年數,西元年份會自動填入。
像出生日期這樣習慣用年號記憶的值,不必每次都換算。
討論區版面配置設定沒有反映到頁面的問題
- •在管理頁面中為每個討論區選擇了版面配置,頁面上顯示的卻是網站的預設版面配置。
儲存的位置與讀取的位置不一致。
既有的討論區在重新儲存之前外觀維持不變(外觀不會突然改變)。
v2.7.14
2026-09-20 · 29天前
討論區發文與搜尋恢復正常
發文後沒有儲存的問題
- •儲存貼文時漏掉了標題欄位,所以在仍保留該欄位的網站上儲存會失敗。
畫面上只顯示「Unexpected end of JSON input」。
- •修正:如果該欄位仍存在,也會同時填寫它。已刪除該欄位的網站與以前一樣運作。
討論區搜尋
- •搜尋在查找舊欄位,所以在已刪除該欄位的網站上,一輸入搜尋詞,整個列表就打不開了。
- •保留該欄位的網站也有問題。修改貼文後該欄位不會更新,所以只能搜到修改前的內容。
- •修正:改為在翻譯表中搜尋。現在可以搜到目前瀏覽的語言以及已翻譯的內容。
列表、元件與個人頁面中看不到貼文的問題
- •業務領域分頁元件與討論區格狀元件一直顯示空列表(錯誤在內部被吞掉了)。
- •個人頁面的「我的留言」中完全缺少討論區留言。
- •連結討論區外觀的標題始終為空。
- •修正:全部改為從翻譯表讀取標題與內文。縮圖也會重新從內文中找出來。
AI 翻譯與全新安裝
- •修正了貼文 AI 翻譯在讀取原文時失敗、導致翻譯工作全部失敗的問題。
- •修正了全新安裝時加入的範例貼文原始語言的標題與內文沒有寫入翻譯表,導致標題看起來為空的問題。
其他
- •修正了討論區排序設為「依推薦」時列表打不開的問題(引用了不存在的欄位)。
v2.7.13
2026-09-20 · 29天前
管理提示視窗更安全 · 多語言
提示視窗直接嵌入他人輸入的文字
管理畫面的共用提示視窗(結果彈窗)會把選單名稱、外觀名稱、伺服器回傳的文案原樣貼到頁面上。
只要在名稱裡寫入 <script> 之類的內容,其他管理員開啟該畫面時就可能被執行(儲存型 XSS)。
- •修正:提示視窗中的所有文案(標題、內文、按鈕、確認語)先轉換為純文字顯示再插入。
- •資料庫連線失敗時的提示語也改用譯文,並經過同樣的轉換。
提示視窗按鈕在任何語言下都顯示韓文
- •「確認」「取消」被寫死在 JavaScript 中。現在依目前瀏覽的語言顯示。
由伺服器提供目前語言的文案,指令碼讀取該值。
管理畫面文案支援 13 種語言
將設計(外觀)、選單、頁面設定畫面中寫死的韓文提示改為翻譯鍵,並補齊 13 種語言。
- •外觀:重新命名、複製、刪除的結果;「外觀檔案與設定將被永久刪除」確認語;圖片上傳結果
- •選單:系統頁面僅從選單移除的說明;「連結的頁面(佈告欄)也會一併刪除」確認語
- •頁面設定:檔案格式、儲存失敗、URL 重複的提示
v2.7.12
2026-09-19 · 1個月前
私密文章保護 · 首屏顯示提速
私密文章在列表中外洩
設為私密的文章,列表仍然顯示標題、封面圖與摘要,被隱藏的只有內文。
- •修正:列表中也只有作者、管理員或輸入密碼的人才能看到標題與預覽。
- •同時堵住了透過附件網址窺看內容的缺口,附件採用相同判斷。
- •閱讀頁面的上一篇・下一篇標題也會隱藏。
- •讀取列表的小工具(佈告欄卡片、格狀、頁籤等)在查詢時就排除私密文章。
首屏遲遲不顯示
手機上第一個字出現得很慢,原因是字型。
- •字型 CSS(Google Fonts 152KB + Pretendard 29KB)擋住了繪製。
現在先以系統字型繪製,網頁字型下載完成後再替換。
- •Pretendard 只在韓文畫面載入。 日文畫面優先使用日文字型,先前只下載片段後丟棄。
- •兩個小樣式表(文字大小、佈告欄內文)改為直接寫入頁面,不再另外請求檔案。
- •首次造訪時因頁面快取(Service Worker)重複讀取文件的問題已消除。
- •橫向捲動選單的寬度計算延到頁面載入完成後(先前會卡住 0.5 秒)。
讓搜尋機器人與 AI 能追蹤各語言頁面
- •語言切換連結改為實際網址(
?lang=…)。先前是 JavaScript 連結,機器人無法追蹤。
管理畫面
- •頁面清單中同一頁面依語言數量重複多列,現已合併為一列。
- •僅修改選單標題時其他語言譯文被清除的問題已修正。只有更換連結頁面時才會整理。
- •部落格預約發布填入過去時間時會照樣儲存,現在會顯示提示並維持原狀態(13 種語言)。
通知與文案
- •社群私訊通知的標題固定為韓文,現依收件者的語言發送。
- •Cookie 提示列的連結文字過暗,已調亮。
內部整理
- •刪除誤複製成兩份的管理畫面資料夾(
admin/site/site、admin/components/components)。
實際使用的是原資料夾。發行版建置也會排除這些資料夾。
v2.7.11
2026-09-13 · 1個月前
網站地圖排除私人佈告欄 · 提升郵件送達率
網站地圖收錄了私人佈告欄
連只有管理員才能看到的佈告欄(如諮詢受理箱等)的網址,也被收錄進網站地圖。
搜尋引擎機器人在這些網址只會得到 403(禁止存取),私人佈告欄的存在也因此曝光。
- •修正:只收錄非會員可以瀏覽的佈告欄。以列表與文章閱讀權限設為「全部」的佈告欄為準。
- •秘密文章,以及在佈告欄設定中設為不被搜尋收錄(noindex)的佈告欄,也會排除。
- •與佈告欄同名的頁面以佈告欄為準判斷,因為網址會先被佈告欄佔用。
- •多語系頁面也會收錄到網站地圖。
- •不希望在某個網站收錄的頁面,可寫在設定
sitemap_exclude 中。llms.txt 也依循同一設定。
寄出的郵件被歸為垃圾郵件或遭退回
- •郵件中缺少寄件時間(Date)與郵件唯一編號(Message-ID),因此收件端很容易將其判定為垃圾郵件。
現在兩者都會加上,內文以 base64 寄送。同時也避免長行被截斷,以及行首的「.」造成內文中斷的問題。
- •收件地址與寄件地址屬於同一網域時(例如寄到公司信箱的副本),該網域的信箱會視為冒名而拒收。
僅在這種情況下,改由 SMTP 帳號的地址寄出,回覆仍會寄到原本的地址。
強化 SEO 與 AI 搜尋設定
- •在管理後台的 SEO 設定中新增營運者資訊(結構化資料 Organization)輸入欄。沒有填寫的項目不會輸出。
- •實際採用各頁面的 SEO 設定;同一內容可由多個網址瀏覽時,會決定一個標準網址(canonical)。
- •新增 Bing 網站驗證碼輸入欄。ChatGPT 的搜尋使用 Bing 的索引。
- •說明文字會依搜尋結果的顯示寬度擷取,並在句末而非句子中間截斷。
整理語言顯示
- •404 頁面一直以韓文顯示。現在會以正在瀏覽的語言顯示(日文、韓文或英文,其他語言顯示英文)。
- •修正通知鈴中寫死為韓文的「剛剛」。
- •日文頁面優先使用日文字型。依語言選擇字型的輔助函式會一律載入,因此不經過版面配置的頁面(如分享頁面)也不會再因字型而中斷。
- •整理了「我的頁面」中「偏好語言」連沒有文案的語言也一併列出的問題。
- •註冊會員時,會將當時瀏覽畫面的語言儲存為偏好語言(先前一直是空白)。重設密碼的郵件也會以該語言寄出。
輸入與登入
- •出生日期等日期改以年、月、日 3 個欄位輸入。先前顯示方式會隨瀏覽器語言而不同。
- •修正部分佈景主題在登入與找回密碼時漏掉 reCAPTCHA 驗證的問題。
付款
- •依金流服務商(PG)分別保存測試金鑰與正式金鑰。測試模式只要選擇即可,切換時不會再遺失金鑰。
小工具
- •主視覺(hero)小工具的按鈕現在可以在新視窗開啟。
- •小工具建構器中的重複項目也可以依語言分別填寫(地球儀按鈕)。
建置
- •設定檔(.env)及其備份,無論名稱為何,都不會放進發行版。
- •編輯時留下的備份檔(
.bak,包括名稱後面加上日期的)也不會放進去。
- •僅供總部營運使用的腳本(網站同步、主機代管、郵件伺服器、條款更新等),以及只有發行版中沒有的外掛才會用到的排程(cron),已從發行版中移除。客戶網站需要的更新、安裝、翻譯工作程式等腳本仍會包含在內。
- •產生 zip 之後會再檢查一次,若其中含有設定檔或備份檔,就停止發佈。
- •測試用腳本不再把密碼寫在檔案中,而是從設定讀取。
v2.7.10
2026-08-23 · 2個月前
更新後版本名稱仍是舊的問題
更新後版本名稱和發佈日期沒有改變
只有編號升上去了,標題仍然是上一個版本的。
管理畫面裡顯示成「2.7.9 · 日語字型 · 合約續約提醒…」這樣,編號和名稱對不上。
光看畫面,無法知道收到的到底是什麼。
- •原因:
version.json 是為了保護每位客戶各自的設定而 特意不覆寫 的檔案。
所以由更新程式自己來填寫,但它 只換了編號和時間,標題和發佈日期原樣保留。
- •修復:新版本的標題和發佈日期現在 從收到的安裝包中讀取,一併寫入。
對沒有安裝包的部分更新,則從發行清單(manifest.json)中讀取。
每位客戶各自的設定(github 等)保持不變。
注意 — 即使升級到這個版本,畫面上顯示的可能仍是舊名稱。 因為執行更新的是
目前已安裝 版本的更新程式。從收到 2.7.10 之後的下一個版本起才會正確顯示。
建置檢查
2.7.8 中建構器失靈的問題(在 2.7.9 修復)原樣通過了迴歸測試。
因為原有的檢查只看「檔案是否存在 · 是否包含某個字串」。
- •現在會對放入建構器的腳本 真正產生並做語法檢查(
node --check)。
- •如果有程式碼把多行檔案原樣放進 JS 字串,會 指出行號 並阻止建置。
- •我們用重現 2.7.8 的檔案做了試驗,確認該檢查確實能攔截。
v2.7.9
2026-08-23 · 2個月前
小工具建構器失靈的問題(2.7.8 的迴歸)
症狀
- •面板中 一個小工具都看不到
- •已經放置的小工具 沒有繪製到畫布上 — 放入的影片、圖片等看起來像是消失了
- •無法儲存
原因
2.7.8 中我們把字型宣告集中到了 partials/fonts.php 這一處。但產生建構器預覽的位置
位於 JS 字串的一行之內, 33 行的字型宣告被原樣塞了進去。
一換行,字串就被截斷,整個建構器腳本在被讀取之前就當掉了。
由於是整個檔案當掉的類型,表現不是「部分功能異常」,而是 建構器什麼都不做。
2.7.5 及以下版本沒有這個問題。
修復方法
字型定義仍然保持在 fonts.php 這一處,只在放進建構器時把輸出折成一行並處理引號。
需要修改字型的位置依然只有一個。
v2.7.8
2026-08-22 · 2個月前
日語字型 · 合約續約提醒 · 3-D 安全驗證
預設字型改為以日語為基準
此前預設字型以韓語為基準。主要使用者在日本, 畫面卻顯得彆扭,
而且切換語言字型也不變,日語文章被排成了韓語字型。
- •預設值改為 標題用明朝體,本文用 Pretendard JP。
- •在語言設定畫面可以 為每種語言單獨指定字型。 不指定時,會套用適合該語言的預設值。
- •管理員、會員、前台的全部畫面以及所有外觀(default、modern、minimal、shop)都適用同一規則。
合約續約與免費期結束提醒
過去有時 過期之後 才發現合約到期。現在臨近續約日時會提前通知。
- •將在 日期到來之前 以通知形式提示即將續約和免費期結束。
- •透過一行 cron(
cron.d-voscms-contract-notice)執行,安裝說明中已加入註冊方法。
信用卡付款
通過日本發卡機構驗證(3-D 安全驗證)的付款,出現了 驗證通過但扣款被拒絕 的問題。
- •PAY.jp 會阻止直接使用為驗證而產生的權杖。驗證通過後,伺服器必須再發起一次收尾呼叫,
之後才能用於扣款,而這一步被漏掉了。
- •我們還開通了 事先確認 客戶資料是否仍保留在支付公司一側的途徑 — 防止用已被刪除的客戶去嘗試扣款而失敗。
通知鈴與退款規定文案多語言化
- •頁首通知鈴中「沒有通知」「幾分鐘前」等 寫死為韓語的文案,現已改為依語言顯示。
- •整理了退款規定說明中殘留的固定文案。
會計
日本法人的帳簿中 混入了韓元交易,導致合計對不上。
- •與帳簿幣別(日圓)不同幣別的憑證 不產生分錄。 紀錄會保留,但不會進入帳簿。
發行版整理
- •編輯過程中產生的 備份檔被帶進了發行版(形如
檔名.php.bak.數字)。
排除規則只過濾了 .bak,漏掉了帶數字的名稱。現已連同 .bak.、.orig、*~ 一併攔截。
- •將 THEVOS AI 服務的 銷售資料(價目表、套餐計算、付款對帳 cron)從發行版中移除。
讀取它們的一側早已全部移除,所以在發行版中是沒有人使用的檔案。
v2.7.7
2026-08-10 · 2個月前
全新安裝時出現的兩個警告
「需要 DB 遷移」
039_ai_knowledge_base 用於建立 NaitoWork X 店家諮詢 AI 的資料表,
卻原封不動地隨發行版發佈了。而且該檔案的 最後一行 是
ALTER TABLE rzx_shop_inquiries ADD COLUMN IF NOT EXISTS ai_meta ...
rzx_shop_inquiries 是 由 vos-store 外掛建立的資料表。
發行版中沒有 vos-store — 核心試圖修改一個並不存在的外掛的資料表。
於是每個新安裝都是:建立了 4 張資料表,在最後一行失敗 → 沒有執行到最後,
所以不會記錄為「已套用」 → 橫幅永久顯示,點擊後又在同一個地方失敗。
現已把 AI 諮詢(RAG)從發行版中整體移除:
039 · rzxlib/Core/AI/{Knowledge,Embedding,Generate} ·
scripts/{ai-kb-ingest,ai-rag-test,cron-ai-consult,hanesbot-ingest}.php
AI 翻譯(rzxlib/Core/AI/Translation)予以保留。 它是付費外掛 vos-ai 的
引擎,與會計、託管一樣,遵循「引擎放在核心,功能由外掛開啟」的規則。
「1 個外掛未認證(vos
核心持有一份 「無需授權即可使用的隨附外掛」 清單,而這份清單已經過時。
程式碼以為的隨附 | vos-autoinstall · vos-marketplace |
實際發佈的隨附 | vos-autoinstall · vos-community |
vos-marketplace 已從發行版中移除,由 vos-community 取而代之,
但 只有這份清單沒有改。 明明隨附了,卻不知道是隨附的,於是跳出警告。
防止再次發生
原因在於 隨附清單寫在兩個地方 —
建置腳本的排除清單和 LicenseStatus::BUNDLE_PLUGINS。
我們在建置中加入了 核對步驟。 兩者不一致時不產生 zip,直接停止。
這不應該靠人去記。
v2.7.6
2026-08-10 · 2個月前
留言板發文按鈕 · 多語言標題 · 安裝時的遷移
留言板上看不到發文按鈕
在 Q&A 和 FAQ 中,連有權發文的人也沒有按鈕。 原因有兩個。
- •管理員被擋住了 — 檢查發文權限時,先判斷是不是會員,之後才看管理員。
管理員不在 users 中,所以在第一道關卡就被攔下。現在調整了順序,讓管理員先通過。
- •一篇文章都沒有時,按鈕也跟著消失 — 按鈕位於列表內部,
一旦頁面切換到「尚無文章」的畫面,按鈕也一起不見了。第一個發文的人反而沒辦法發文。
現已把按鈕移到列表之外。
- •FAQ 甚至直接查看
admin_id — 無視了留言板設定中的發文權限。
留言板的標題和副標題以其他語言顯示
中文介面裡只有副標題顯示成日語的問題。
- •根本沒有讀取翻譯。 標題和副標題在外觀設定中以 單一字串 儲存,
而翻譯另外存放在 rzx_translations 中。畫面只是原樣輸出儲存的字串。
- •沒有區分留言板。 翻譯鍵是
skin_config.subtitle_text,所以 Q&A 和 FAQ
共用同一個位置。 改了其中一個,另一個也跟著變。
現已拆分為 board.{留言板編號}.{項目}。
- •在語言確定之前就渲染了本文。 核心先產生本文,再附上頁首,
而語言是在頁首中確定的。現已改為在本文這一側先確定。
安裝時漏掉了核心遷移
install-core.php 完全沒有查看 database/migrations。
新安裝的網站從一開始就缺少幾張資料表,之後啟用相應功能時就會當機。
遷移被悄悄略過的問題(接 2.7.4)
2.7.4 處理了單行註解(--),但 多行註解(/ /)仍然存在。
該區塊中的分號使檔案被合成一整塊,一行也沒有執行,
卻被記錄為「已套用」。我們確認了實際損失 — 有的安裝缺少整整 9 張資料表。
字串中的 -- 或 /* 不是註解。現在一邊計算引號一邊移除註解。
其他
- •購物頁首 — 在分類下拉選單的最上方加入了「全部分類」。
想進去逛一逛的人原本無處可去。
- •小工具建構器 — 將重複項目(
repeater)的編輯拆分到獨立的檔案。
- •內部網路側邊欄 — 會計文案在三條分支(沙龍、購物商城、一般企業)中都會查找。
以前只看其中一個,所以使用其他會計時選單會直接顯示原始鍵名。
- •我的頁面 — 整理了儀表板。
- •付費外掛回報 — 授權檢查時會一併傳送 已啟用的付費外掛。
只安裝、沒有啟用的不會傳送 — 費用只與啟用的外掛掛鉤。
v2.7.5
2026-08-05 · 3個月前
從發行版中移除總部專用的系統頁面
總部專用的頁面被帶進了發行版
config/system-pages.php 被整個放進了發行版,導致客戶安裝的管理員「系統頁面」中,
出現了六個可以點擊卻什麼都沒有的選單。
📥 downloads | 發行版下載 — 只有總部發布 |
📋 changelog | 這是總部的產品歷程 |
📧 contact | 客戶用元件自己製作(它不是系統頁面) |
💼 recruit · 💃 casts | 僅限夜間業務入口網站(NaitoWork X)使用 |
🎟 coupons | 由應用程式市集的外掛提供 |
- •新增了建置步驟
[4e/8](strip-system-pages.php)。刪除之後用 php -l 檢查語法 —
如果這個檔案損壞,整個管理頁面就會癱瘓。
- •發行版中保留的系統頁面有八個:home · terms · privacy · data-policy ·
refund-policy · hosting-terms · tokushoho · funds-settlement
外掛系統頁面
- •在 13 種語言中加入了
site.pages.blog 文案。
即使外掛註冊了系統頁面,如果核心中沒有對應文案,畫面上就會原樣顯示 site.pages.blog。
- •(對
vos-blog 自身 plugin.json 的修改透過應用程式市集發布 — 這是一個不在發行版中的外掛)
已經安裝的網站
如果管理員「系統頁面」中出現不使用的項目,把 config/system-pages.php 中對應的區塊刪除即可。
頁面內容(rzx_page_contents)不會被刪除 — 只是從清單中消失。
v2.7.4
2026-08-05 · 3個月前
遷移被悄悄略過的問題
① 以註解開頭的遷移被整個略過
- •
DatabaseMigrator::splitSql() 的註解寫著「去除註解後再分割」,但
實際上只是依分號分割。
- •如果 SQL 檔案的第一行是
-- 說明,整個檔案就成了一個片段,
被執行部分的 str_starts_with($stmt, '--') 攔住,一條陳述式也沒有執行。
- •執行為 0 筆,錯誤也是 0 筆,所以被當作
success 處理,並記錄為已套用。
一旦有記錄就不會再次執行,所以資料表會一直缺失、永久固定下來。
- •受影響的範圍是所有以
-- 開頭的檔案。實測:9 個中有 6 個執行了 0 筆,2 個只執行了一部分。
- •現在會先去除
--、# 行註解與 / / 區塊,然後再分割。
字串裡的 -- 不會動(如果 'a -- b' 這樣的值被截斷,資料就會損壞)。
② 全新安裝根本沒有執行增量遷移
- •安裝腳本只執行了
migrations/core 與 migrations/migrations,
漏掉了最上層的 database/migrations/*.sql。 而更新程式恰恰相反,只追蹤最上層。
- •因此全新安裝時 034~042 從一開始就不存在,直到下一個版本到來之前都是空的。
- •現在安裝時也會執行最上層,並記錄為已套用(避免第一次更新又把同樣的內容再執行一遍)。
已經安裝的網站
請在管理員 → 設定 → 更新中點擊一次執行遷移。
被錯誤記錄的內容不會再次執行,所以如果資料表是空的,可以用下面的方式確認。
SELECT migration FROM rzx_migrations; -- 紀錄
SHOW TABLES LIKE 'rzx_home_notices'; -- 實際
v2.7.3
2026-08-05 · 3個月前
發行版外掛整理 · 購物頁首 · 個人頁面餘額
從發行版中拿掉的內容
- •
vos-cp(服務控制面板)與 vos-shopping(網路商城)一直夾帶在發行版裡。
這兩個都是新做的外掛,只是還沒有列入排除名單而已。
- •
vos-cp 是 THEVOS 自家服務使用的面板。沒有理由出現在客戶的安裝中
- •
vos-shopping 仍在開發中(v0.1.0),而且原則是外掛要在應用程式市集購買
- •
vos-review 也拿掉了 — 理由相同(店主的指示)。
- •發行版中包含的外掛只有兩個:
vos-community、vos-autoinstall。
其餘全部從應用程式市集取得。
加入核心的內容
- •商城兩層頁首(
skins/layouts/shop) — 全部分類下拉選單、搜尋、購物車預覽、
登入後的大頭貼選單。在分類下拉選單的最上方放了「全部分類」,讓人有路可以返回
- •在個人頁面顯示點數、儲值金與會員等級。名稱直接使用所設定的值
- •支援外掛元件 — 外掛只要放了
widgets/,核心建置器就會自動辨識
- •郵遞區號地址搜尋共用元件 — 訂單頁與會員資訊使用同一個元件
- •管理員頂端列的通知鈴鐺
- •整理了管理主控台選單群組(
config/intranet-modules.php)
- •支援元件建置器的重複欄位(repeater)
修正的內容
- •多語言輸入欄位覆蓋原始資料的問題
- •儲值金帳本記錄的錯誤
- •發行版更新會讓代管頁面變成 404 的問題
在已安裝的版本上需要確認的事
對於用舊發行版安裝、之後只接收更新的網站,會留下不使用的外掛資料夾
(更新不會刪除外掛資料夾)。在管理員 → 外掛中顯示為未安裝的,
可以連同資料夾一起從 plugins/ 中刪除。
v2.7.2
2026-07-26 · 3個月前
服務申請路由整理(核心重新建置)
Changed
- •服務申請 URL 的統一路由 —
/service/hosting、/service/mail、/service/domain → 以 302 連接到 /service/order(在專用申請頁面準備好之前,引導到整合申請頁面,之後可以替換為專用頁面)。
Notes
- •2.7.1 的核心修正(多語言 hreflang、防止更新程式靜默失敗、把價格
/pricing 合併到 /service/order)已經正常包含在 2.7.1 的套件中。2.7.2 是在此基礎上增加服務申請路由整理的重新建置。
- •發行版原則上只包含純核心(排除付費與垂直產業外掛)。總部網站(voscms.com、thevos.jp)不是發行版自動更新的對象,而是透過原始碼/git 部署。
SEO
- •多語言 hreflang — 每個頁面自我參照 canonical + 自動產生所支援語言的 hreflang,透過
?lang=xx 依語言建立索引,把預設語言的 ?lang 以 301 正規化為不帶參數的 URL,並擴充了 sitemap。
Fixed
- •修正更新程式的靜默失敗 — 把核心檔案或 version.json 的寫入失敗當作例外處理。因權限不足等原因導致套用失敗時,不再誤報「SUCCESS」,而是給出明確的錯誤並自動還原。
- •防止了價格頁面中多語言欄位以陣列形式傳給 htmlspecialchars 而導致 500 當機的問題。
Changed
- •擴充了 reCAPTCHA v3 依表單設定的開關(blog_comment 等)。
- •設定中的「店主主控台通知」分頁僅在 vos-store 啟用時顯示。
- •把價格頁面
/pricing 合併到 /service/order(301),「系統無限」方案僅限管理員。
v2.7.0
2026-06-27 · 4個月前
發行版核心精簡化 + 元件與設定大幅強化
發行構成
- •發行版精簡為純核心 — 只附帶 3 個核心外掛(
vos-autoinstall、vos-community、vos-review)。垂直產業(夜間業務/沙龍/POS)的外掛、元件與外觀(story)全部排除。年齡驗證、Cookie 橫幅等通用功能屬於核心(rzxlib),因此包含在內。
Added/Changed (核心元件)
- •location-map — 支援無金鑰嵌入(
map_embed),消除了對 API 金鑰的依賴,並使地圖語言與地區設定連動
- •practice-tabs(業務領域分頁) — 新的內建元件
- •全域頁面寬度設定(
widget_page_width) — 統一元件/文件頁面的寬度
未內建(bundled:false)的網站專用元件(hero-slideshow、overlap-cards、office-intro、page-hero、content-head、consult-cta、board-grid、clients-logos、board 的個人檔案外觀)不包含在核心發行版中。
Removed
- •預付元件(
prepaid-charge、prepaid-pass、prepaid-purchase) — 由於 vos-prepaid 未內建,從發行版中排除
Added (設定與核心)
- •把年齡驗證關卡提升為核心的一般設定
- •Cookie 同意橫幅的背景透明度調整
- •依語言設定的標誌圖片
- •在企業資訊中加入銀行帳戶資訊 + 銀行轉帳說明
- •付款頁面的「可使用的信用卡」說明(品牌圖示) + 管理員設定
Fixed
- •頁面標題與副標題的多語言在地化(page-scoped db_trans),並修正 content_width 未生效的問題
- •修正了元件/管理頁面/頁面中的大量錯誤,並補充了 13 種語言
v2.6.24
2026-06-02 · 5個月前
更新時自動清理 orphan(已刪除的來源檔案)
Added
- •自動清理 obsolete 檔案 — 用完整套件 zip 覆蓋的更新無法刪除來源中已移除的檔案,因此發行版中留下了殘留檔案(orphan)(例如在重構中被拆分並刪除的整體式
settings.php 仍留在舊的安裝中)。我們新增了一個基於明確清單的機制來清理它們。
- •
config/obsolete-files.php — 待刪除路徑的累積清單(跳過了多個版本的安裝也能一次性清理)。
- •在更新程式的
applyUpdate() 之後,cleanupObsoleteFiles() 會安全地 unlink 清單中的檔案。絕不會觸碰保留對象(.env、storage 等)、路徑逃逸與目錄。
- •首次登錄:
resources/views/admin/settings.php。
v2.6.23
2026-06-02 · 5個月前
更正儀表板「系統設定」連結
Fixed
- •儀表板「系統設定」連結 — 快速動作中的連結指向已被拆分並刪除的舊路徑
/settings,導致跳轉到錯誤的(備援)頁面。現已更正為設定的預設入口 /settings/general。(2.6.22 建置之後遺漏的部分)
v2.6.22
2026-06-02 · 5個月前
修正執行遷移時的 CSRF 與記錄錯誤
Fixed
- •儀表板「需要 DB 遷移」橫幅 — CSRF token invalid — 重試按鈕沒有向
/update-api.php(run_migrations)傳送 CSRF 權杖,因此被以 419 拒絕。現已確保 $_SESSION['csrf_token'] 存在,並透過標頭與本文傳送。
- •執行遷移後橫幅依然不消失 —
DatabaseMigrator::recordMigration 假定存在 batch 欄位與 patch_ 前綴,導致在安裝型結構(migration/version/executed_at)上記錄 INSERT 失敗,而且前綴還使檔名比對出現偏差。現已改為依實際欄位、原樣記錄檔名。(這是 2.6.20 更新時遷移只留下「OK」紀錄卻沒有套用的原因)
Fixed
- •管理員權限管理等核心頁面側邊欄的原始鍵 — 由於僅憑
config/intranet-modules.php 的 route_prefixes 就啟用內部網路 layout,在沒有對應外掛的網站(例如未安裝 vos-salon)上,核心頁面 /staff/admins 會以 salon 內部網路側邊欄渲染,導致 salon.intranet.、salon.section. 鍵以原始文字暴露。現已修正。
- •新增共用輔助函式
resolve_intranet_module() — 只有模組的 lang 資源(外掛)確實已安裝時才啟用內部網路,未安裝時備援到核心的 admin-sidebar。
- •把
_head.php / admin-sidebar.php 中重複的偵測邏輯統一到輔助函式中。已安裝外掛的網站(salon、store 等)行為不變。
v2.6.20
2026-06-02 · 5個月前
點數/等級/群組結構一致化(解決等級儲存錯誤)
Fixed
- •點數等級儲存錯誤 — 修正了在管理員點數模組中儲存等級時因
Unknown column 'group_id' 錯誤而失敗的問題。原因是 core/004 與 migrations/019(v190) 在 point_levels/member_points 結構上的衝突(019 中的 CREATE TABLE IF NOT EXISTS 無法替既有的資料表新增欄位)。
- •migration
034_point_system_schema_reconcile(最上層,更新時自動套用):
- •
point_levels — 新增 group_id,為 name 設定預設值,為 level 建立唯一索引(使 upsert 生效)。
- •
member_points — 新增 point/balance/total_accumulated/level。
- •全部為 additive(無資料遺失),不影響既有的欄位與使用方(vos-prepaid 等)。
Added
- •3 個購買元件 — 整合型(
prepaid-purchase,可選擇顯示全部/僅儲值/僅次卡) + 僅儲值(prepaid-charge) + 僅次卡(prepaid-pass)。用一個共用元件 purchase-widget.php 驅動 3 個元件(零重複),透過 $ppOnly 篩選器分支。
- •商品背景圖片 — 在管理員的商品新增/編輯彈窗中加入拖放上傳(同時支援點擊上傳),並把背景套用到個人頁面與元件卡片。migration 003
image_url。
- •商品名稱多語言輸入 + AI 翻譯 — 重複使用共用的
multilang-modal(地球按鈕),以 rzx_translations 為基礎儲存,並透過 prepaid_name() 以瀏覽者的語言顯示。AI 翻譯重複使用核心的 /api/translations 端點。
- •在付款表單中新增持卡人姓名輸入欄(傳給 PAY.jp 的
createToken)。
- •手動儲值時選擇客戶 — 從直接輸入 user_id 改為依姓名/電話/電子郵件搜尋的自動完成(
customer_search 動作)。客戶狀況清單也顯示客戶姓名 + 電子郵件,而不是 user_id 雜湊。
- •啟用開關 — 把商品啟用核取方塊改為開關。
Changed
- •購買框改為 4 欄 — 商品卡片格狀改為 2→3→4 響應式(
lg:grid-cols-4),並移除元件寬度 max-w-3xl 的固定值 → 配合放置容器的寬度。
Fixed
- •元件建置器調色盤·大型選單高度 — 把建置器的列高確定為
calc(100vh - 88px),使左側分類與彈出選單自動占滿螢幕高度,並解決了大型選單項目重疊的問題。
v2.6.18
2026-05-31 · 5個月前
公告發送表單的 URL 驗證 + 友善的輸入體驗
Added
- •
api/broadcast.php 的 link 驗證 — 缺少協定時自動在前面補上 https://(example.com → https://example.com),如果未通過 filter_var FILTER_VALIDATE_URL,就回傳 400 + field: 'link' 錯誤,超過 500 個字元則拒絕。
- •用戶端即時驗證 —
type="url"、inputmode="url",輸入時立即:
- •缺少協定 → emerald 外框 + ✓ + 「發送時將自動補全:…」提示
- •主機中沒有點(.)或格式不對 → red 外框 + ⚠ + 「不是正確的 URL 格式」
- •正常 → emerald 外框 + ✓ + 「是有效的 URL」
- •用戶端也會先補全再發送 → 保證預覽與實際發送的內文一致。
Added
- •區塊標題:✉ 撰寫訊息 / 📡 發送頻道 — 視覺分組 + 說明文字。
- •字數計數器(標題
0/255,內文 0/2000) — 達到 70% 以上自動變為 amber,達到 90% 以上變為 red。
- •訊息預覽框(點線邊框) — 即時呈現標題、內文與連結合在一起後在 LINE 中的顯示效果 + 總字數
n/5000 計數器(超過 4500 變為 red)。
- •每個欄位的 helper text:
- •標題:「會同時顯示在會員訊息匣與 LINE 通知中」
- •內文:「在內文中寫入 URL,會自動縮短並進行點擊追蹤」
- •連結:「會空一行自動新增到內文末尾。如果內文中也寫了,會顯示兩次,請注意」
- •連結輸入框右側的狀態圖示(
absolute) — 立即顯示 ✓ / ⚠。
Added
🔗 URL 驗證規則(新增第 5 個區塊):
- •需要以
http:// / https:// 開頭 → 轉換為點擊追蹤權杖
- •缺少協定時自動補全
- •拒絕主機中沒有點或格式不對的情況
- •500 個字元的限制
- •範例框:
✓ https://voscms.com/event / ✓ example.com/page → 自動補全 / ✗ asdfasdf (主機中沒有點)
Notes
- •正式站(
voscms-com)與 salon 已同步完成。API/UI/i18n 全部立即生效。
- •13 種語言 i18n:
community.broadcast.guide_url_、section_message、section_channels*、subject_hint、body_hint、link_hint、link_{invalid,autofixed,valid}、preview_{title,empty}。
v2.6.17
2026-05-30 · 5個月前
在公告發送頁面右側加入預約發送指南框
Added
- •
/theadmin/community/broadcast 版面變更 — 把原來的單張卡片拆分為 lg:grid-cols-3。主發送表單占左側 2 欄(lg:col-span-2),右側 1 欄新增指南框(<aside>、sticky top-4)。
- •6 個部分的指南內容:
1. 📅 什麼是預約發送? — 在未來的時間自動發送,可用於夜間/週末/活動
2. 🛠 使用方法 — 4 個步驟(選擇對象 → 勾選 LINE → 勾選預約 → 發送),帶編號徽章的 UI
3. ⏱ 發送精度 — 5 分鐘間隔 cron 的說明 + 範例框(10:00 → 10:00~10:05)
4. 🆚 立即發送與預約發送的比較 — 以卡片形式呈現兩種模式的行為差異
5. 📋 查看佇列等待 — 指向 /history?status=queued 的捷徑按鈕
6. ⚠ 注意事項 — 必須是 30 秒以上的未來時間、應用程式內/推播不能預約、沒有 cron 的代管環境無法運作、暫不支援在 UI 中取消
- •靛藍漸層背景(
from-indigo-50 to-blue-50) — 指南框在視覺上與主卡片區分開,同時柔和地融為一體。
- •13 種語言 i18n — 約 20 個
community.broadcast.guide_* 鍵(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
Added
- •在
/mypage/settings 中新增「偏好語言」卡片 — 14 個選項的 select(自動/13 種語言)。儲存時 UPDATE rzx_users.locale,並立即套用到 $_SESSION['locale']。
- •Auth::loginUser hook — 登入時如果存在
$user['locale'] 且工作階段 locale 為空,就自動填入。如果使用者在工作階段期間手動更改過,則優先保留該值。
- •13 種語言 i18n —
auth.settings.language.{title,description,label,auto,hint,save,success,error_invalid,error_save}(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
- •更改後,從下一個頁面開始 UI 就以會員的語言顯示;如果管理員在自動發送規則中設定了
messages_by_locale,就會透過 LINE 向該會員發送相符的內文。
Added
在 /theadmin/community/broadcast/history 頂部新增 3 張卡片(排在原有的 4 張卡片之後):
1. 整體點擊率(CTR) — SUM(rzx_broadcast_clicks.click_count) / SUM(rzx_line_broadcasts.recipient_count WHERE status='sent') × 100。大號字體的 emerald。
2. A/B 測試(最近 30 天) — 對 variant IS NOT NULL 的發送,依 variant 彙總接收、點擊與 CTR。CTR 較高的 variant 用 emerald 強調顯示。
3. 依 locale 的分布(最近 30 天) — 僅限 source='auto_rule' AND messages_by_locale IS NOT NULL 的發送,透過比較規則的 messages_by_locale JSON 的鍵與 broadcast 內文的前 30 個字元來比對 locale → 依 locale 彙總接收/點擊/CTR。用 ksort 排序。
- •13 種語言 i18n:
community.broadcast.stat_{ctr_title,ctr_breakdown,variant_title,variant_hint,locale_title,locale_hint,empty}。
Notes
- •
voscms-com 與 salon 的目錄樹已同步完成。沒有新增資料庫欄位(都已包含在 Step 4 的 migration 008/009/010 中)。
- •locale 比對邏輯比較內文的前 30 個字元 — 變數取代後的內文一致,就計入同一個 locale 群組。如果內文太短,或者完全由變數取代填滿,比對率可能會下降(將來可以直接在 broadcast 列中新增 locale 欄位)。
Added
- •migration 010 —
rzx_auto_broadcast_rules.messages_by_locale JSON NULL + rzx_users.locale VARCHAR(10) NULL + idx_locale 索引。
- •AutoBroadcaster::lineUserIdsWithLocale — 查詢 LINE userId 與會員 locale 的配對。沒有
users.locale 欄位的環境會備援到 lineUserIds。
- •AutoBroadcaster::pickLocaleMessage — 優先順序:會員的 user.locale → 網站預設 locale(rzx_settings.locale) → JSON 的第一個鍵(全部未命中則為 null → 備援到 A 內文)。
- •AutoBroadcaster::fire — 如果有
messages_by_locale,就為每個會員使用與 locale 相符的內文;沒有則使用 A/B variant;再沒有則使用單一的 A。當 locale、variant 與 default 得到相同的內文時,會合併為同一組進行 multicast(提高效率)。
- •管理員規則彈窗 — 透過
<details> 展開「啟用多語言路由」與直接輸入 JSON。以 pretty-print 方式顯示。invalid_locale_json 驗證。
- •13 種語言 i18n —
community.automation.locale_{toggle,placeholder,hint} + fields.messages_by_locale + error.invalid_locale_json(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
Notes
- •Step 1~4 的 LINE 發送基礎建設已完成(2.6.9~2.6.15):
1. Step 1 — CTA · utility stack · 手動發送 · 依等級的 audience · 多選(7872c4b, 7c94a55, c4a3325)
2. Step 2 — 會員群組自動分類(b24979c)
3. Step 3 — 事件自動發送規則(60d47cd)+ 預約發送 cron(8cf02ad)
4. Step 4 — 點擊追蹤(79c99a84)+ A/B 測試(86e19b0b)+ 多語言路由(本次)
- •正式站(
voscms.com)已套用 migration 010。users.locale 是新增的欄位 — 所有既有會員為 NULL(使用網站預設 locale → 與以前行為相同)。
- •讓會員在個人頁面直接設定自己偏好 locale 的 UI 是下一個里程碑。
- •建議登錄的 cron:
/5 /usr/bin/php8.3 /var/www/voscms-com/scripts/process-scheduled-broadcasts.php、0 3 /usr/bin/php8.3 /var/www/voscms-com/scripts/recalculate-member-grades.php。
v2.6.14
2026-05-30 · 5個月前
A/B 測試(Step 4-B)
Added
- •migration 009 —
rzx_auto_broadcast_rules.message_template_b TEXT NULL、rzx_line_broadcasts.variant CHAR(1) NULL、rzx_broadcast_clicks.variant CHAR(1) NULL + 索引 (source_rule_id, variant)。
- •AutoBroadcaster::fire — 如果
message_template_b 不為空,就用 crc32 mod 2 把 LINE userId 依 50:50 分成 A/B。依 variant 預先 INSERT 發送歷程(logQueued) → 權杖 wrap → multicast → finalize。同一使用者在重複發送時始終收到同一個 variant(雜湊一致性)。
- •管理員規則彈窗 — 透過
<details> 展開「啟用 A/B 測試」選項與 variant B 輸入。預設是簡單的單一發送,A/B 需要明確選擇開啟。
- •ClickTracker — 傳遞 variant 中繼資訊。如果存在 broadcast_clicks.variant 欄位,就在 INSERT 時填入。沒有則備援(相容尚未套用 migration 009 的環境)。
- •logQueued 備援 — 在沒有 variant 欄位的環境(未套用 migration 009 時)也能運作。
- •13 種語言 i18n —
community.automation.ab_{toggle,placeholder,hint}(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
Notes
- •在正式站(
voscms.com)上分開執行了 migration 009 的 3 個 ALTER。既有規則的 message_template_b=NULL(維持單一發送的行為)。
- •編輯規則 → 在「啟用 A/B 測試」展開區輸入 variant B → 只要儲存,從下一次觸發開始就會自動進行 A/B 分配。
v2.6.13
2026-05-30 · 5個月前
發送 URL 點擊追蹤 (Step 4-A)
新增
- •migration 008(
rzx_broadcast_clicks) — token(8 字元 base62,UNIQUE)、broadcast_id、source_rule_id、original_url(2048)、click_count、last_clicked_at、last_user_agent。相同的(broadcast_id, original_url)組合會重複使用同一個權杖。
- •
ClickTracker 類別 — wrap($pdo, $siteId, $body, $meta) 以正規表示式擷取內文中的 http/https URL → INSERT or 重複使用 後替換為 /t/{token}。consume($pdo, $token, $ua) 權杖 → 回傳原始 URL 並增加 click_count。
- •路由
/t/{token}(index.php:330)— 進入正規表示式路由器。ClickTracker::consume → 以 302 重新導向至原始 URL,找不到則回傳 404。驗證 URL 權杖([A-Za-z0-9]{4,16})。
- •整合自動發送規則 —
AutoBroadcaster::fire() 在發送前依序執行 logQueued → 取得 broadcast_id → ClickTracker::wrap → multicast → finalizeBroadcast。確保權杖與 broadcast_id 的對應關係。
- •整合手動發送 — 在
api/broadcast.php 組合即時發送文字後立即 wrap。在 scripts/process-scheduled-broadcasts.php 的佇列發送前 wrap(通知 broadcast_id)。
- •追蹤網域設定 — 優先使用
rzx_settings.click_track_domain,沒有則使用 APP_URL。可使用短網域(例:s.voscms.com)。
備註
- •正式環境(
voscms.com)已套用 migration 008。
- •wrap/consume 整合測試:內文 2 個 URL → INSERT 2 個 8 字元權杖 → 呼叫 consume 時回傳原始 URL,click_count 正常增加。
Added
- •migration 007(
rzx_line_broadcasts):新增 scheduled_at DATETIME NULL、processed_at DATETIME NULL 兩欄 + (status, scheduled_at) 索引。scheduled_at NULL = 立即發送(與以前相同),未來的時間 = 進入佇列。
- •
scripts/process-scheduled-broadcasts.php — cron 入口。取出 50 筆符合 status='queued' AND scheduled_at <= NOW() AND processed_at IS NULL 的項目 → 用 processed_at = NOW() 立即加鎖(交易) → 解析 audience(all / grade_N,與 broadcast.php 相同) → LineMessenger 以 500 人為單位 multicast → 依結果更新 status。建議的 cron 週期:/5 *。
- •broadcast.php UI:
[預約發送] 核取方塊 + datetime-local 輸入。勾選後預設值為目前時間 + 1 小時(使用者本地時間)。未勾選/留空則與以前一樣立即發送。只有 LINE 頻道可以預約(應用程式內與推播仍維持立即發送)。
- •api/broadcast.php:處理
scheduled_at POST 參數。對於未來的時間(> NOW + 30s)且 send_line 的情況,不呼叫 LINE API,只 INSERT rzx_line_broadcasts (status='queued', scheduled_at),並在回應中回傳 scheduled: true, scheduled_at。
- •13 種語言 i18n:
community.broadcast.schedule_{label,enable,hint,success}(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。
Fixed
- •依
rzx_line_broadcasts 的實際結構(title、body、audience varchar(20)、recipient_count、status enum(queued|sent|failed))更正了 INSERT 的欄位。此前使用了並不存在的欄位名稱(message_text、recipients_count、sent_count、failed_count、audience_value、partial)來嘗試 INSERT,連備援也失敗,導致自動發送的歷程缺失。
Notes
- •正式站(
voscms.com)已套用遷移 007。透過 dry-run 確認 pickup 為 0 筆。
- •正式站(
voscms-com)與 salon 的目錄樹已同步完成。已排除 .env。
- •cron 的登錄由代管維運方決定(如有需要,
/5 * /usr/bin/php8.3 /var/www/voscms-com/scripts/process-scheduled-broadcasts.php)。
Added
- •自動發送規則表(
rzx_auto_broadcast_rules) — migration 005_auto_broadcast_rules.sql。規則依 site_id 隔離,包含 trigger_type / trigger_filter(JSON)/ audience(all|grade_X|custom)/ message_template / is_enabled / fired_count / last_fired_at 各欄位。
- •AutoBroadcaster 調度器(
rzxlib/Core/Notification/AutoBroadcaster.php) — 靜態入口 AutoBroadcaster::fire($triggerType, $ctx)。比對已啟用的規則 → 替換範本變數({{title}}, {{url}}, {{author}}, {{board_name}}, {{site_name}}) → 解析 audience(與 broadcast.php 邏輯相同,is_default 等級會自動包含 NULL 會員) → 透過 rzx_user_social_accounts 查詢 LINE userId → 以 500 人為單位 multicast → 在 rzx_line_broadcasts 中記錄歷程 → 更新規則統計。
- •討論區新文章自動發送 hook(api-posts.php:184) — 文章 INSERT 之後立即(不含私密文章)呼叫
AutoBroadcaster::fire('board_post', [post_id, board_id, title, url, author, board_name])。即使發送失敗,也不影響文章的回應。
- •管理員規則管理頁面(
/theadmin/community/automation) — 卡片格狀 UI。規則的 CRUD + 開/關切換 + 依觸發器區分的顏色徽章(board_post=blue, review_created=amber, reservation_created=green)。在彈窗中編輯觸發器 / 篩選條件(JSON)/ 目標等級 / 訊息範本。
- •rzx_line_broadcasts 的來源追蹤欄位 — migration
006_line_broadcasts_add_source.sql。source('manual' | 'auto_rule')+ source_rule_id(INT)+ 索引。自動發送的歷程可以與手動發送在同一張資料表中區分開。
- •plugin.json 路由與遷移登錄 —
community/automation 路由,並在 003 之後寫明 004/005/006 遷移。
- •13 種語言 i18n — 全部
community.automation.* 鍵(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW)。觸發器標籤、欄位、提示、成功/錯誤訊息、預設範本。
Notes
- •正式站(
voscms.com)已套用 005/006 遷移。規則處於未登錄狀態。
- •正式站(
voscms-com)與 salon 的目錄樹已同步完成。已排除 .env。
- •Step 3-B(預約發送
scheduled_at + cron)是下一個里程碑。
Added
- •註冊時自動指派 default 等級(
rzxlib/Core/Auth/Auth.php::register()) — 會員註冊後立即在 rzx_member_grades 中查詢 is_default=1 的等級,並立刻填入新會員的 grade_id。在沒有 member_grades 資料表的網站(舊版或未設定)上,透過 try-catch 靜默略過。既有的 NULL 會員由單獨的重新計算腳本或按鈕來填入。
- •CLI 等級重新計算腳本(
scripts/recalculate-member-grades.php) — 以 rzx_payments 的付款合計 + rzx_reservations 的預約數(僅當資料表存在時)為依據,依 sort_order DESC 依序走訪,比對能夠滿足的最高等級。未設定規則的等級(min_spent=0 AND min_reservations=0)會自動略過 — 只有設定了明確規則的等級才是晉級候選。不符合條件的會員回退到 default。
- •選項:
--dry-run(不實際 UPDATE,僅模擬)、--user-id=UUID(僅限特定會員)。
- •cron 範例:
0 3 * /usr/bin/php8.3 /var/www/voscms/scripts/recalculate-member-grades.php
- •管理員「立即重新計算」按鈕(
/theadmin/members/groups) — 在操作列中新增翡翠綠色調的按鈕。點擊後依序為確認彈窗 → AJAX action=recalculate_grades → 結果(對象/晉級/降級/新增)通知 → 自動重新整理。由於內嵌了與腳本相同的邏輯,在沒有 PHP CLI 權限的環境中也能運作。
- •13 種語言 i18n — 新增
members.groups.recalculate* 鍵(ko/en/ja/de/es/fr/id/mn/ru/tr/vi/zh_CN/zh_TW):recalculate、recalculate_hint、confirm_recalculate、recalculate_stat.{total,upgraded,downgraded,fallback}、success.recalculated、error.{no_grades,no_default_grade}。
Notes
- •在正式站(
voscms.com)上驗證了 --dry-run → 實際執行 → 補充規則後重新執行。grade_id NULL 的 5 名會員全部被正確指派為 Normal(default)。VIP/Gold/Silver 因未設定規則,在新增規則之前維持 0 人(符合預期)。
- •正式站(
voscms-com)與 salon 的目錄樹已同步完成。已排除 .env。
Added
- •面向會員的 LINE 加入好友 CTA 元件(
resources/views/components/line-friend-cta.php) — 5 種 variant(card / button / bar / side-tab / bubble)× 6 個 position(bottom-right/bottom-left/bottom-center/top-right/middle-right/middle-left)× 3 種 size,自訂顏色、顯示延遲,以及 24 小時「記住已關閉」(localStorage)。
- •可變更的設定 UI — 在
/theadmin/settings/message-api 的 LINE 頻道卡片下方新增「LINE 加入好友 CTA」區塊。包括 Basic ID、啟用開關、variant 單選、position 下拉、size、色彩選擇器與 delay 輸入。
- •自動顯示在 5 個版面配置中 — 從
skins/layouts/{default,modern,minimal,modern-copy-260413}/footer.php 自動 include。在付款、服務申請與安裝流程頁面會自動略過。
Added
- •新增元件
resources/views/components/utility-floating-stack.php — 採用 thevos.jp 的 cameron_plugin 設計模式(右側邊緣 80×80 方形 stack + 1px 間隔 + 每個圖示各自的強調色)。位置、大小與顏色可由營運者調整。
- •兩種模式並存 —
utility_stack_mode = separate(預設,各個 CTA 單獨顯示) / unified(PWA + LINE 合併為一個 stack 顯示)。在整合模式下,LINE CTA 5 種 variant 的自動顯示被停用,PWA 安裝彈窗的自動觸發(setTimeout/DOMContentLoaded 橫幅)也被停用,只有點擊 stack 中的 PWA 圖示才會開啟彈窗。
- •未來的自然擴充 — 藉由項目註冊模式,其他內容(Kakao 頻道、WhatsApp、訂閱電子報、深色模式切換等)只需新增設定鍵就能加入 stack。
- •保證自動換行 — 內嵌 CSS
word-break: break-all; overflow-wrap: anywhere; max-width: 72px 繞過 Tailwind flex 子元素的寬度限制。CJK 標籤也能在框內自然換行。
- •13 種語言 i18n — 在
resources/lang/{13 locale}/messaging.php 中加入 line_cta. 群組(22 個鍵)與 utility_stack. 群組(12 個鍵)。日文與中文用語意單位的空格(如「アプリとして インストール」)保證自然換行位置。
Added
- •
LineMessenger::broadcast(messages) + broadcastText(text) — 向全部好友批次發送(最多 5 個訊息物件,LINE 發送額度依接收人數 × 訊息數扣除)。
- •
LineMessenger::multicast(userIds[], messages) — 向指定的最多 500 個 userId 發送(依群組發送的基礎建設)。
- •
/theadmin/community/broadcast UI 加強 — 新增「同時發送給 LINE 好友」核取方塊(綠色橫幅)。獨立於推播發送,自動對 LINE 好友進行 multicast/broadcast 發送。
- •依會員等級發送 — 動態載入
rzx_member_grades,自動顯示每個等級的單選項(顏色圓點 + slug + 即時計數)。audience 的格式為 grade_<id>。
- •
is_default=1 等級自動包含 grade_id IS NULL 的會員 — 即使在註冊時不會自動指派等級的網站上,default 等級的計數與發送中也自然包含 NULL 會員。
- •
rzx_line_broadcasts 發送紀錄表 — site_id 隔離、method(broadcast/multicast)、audience、title/body、recipient_count、line_request_id、api_status/error、status。發送時自動 INSERT。
- •
audience=all 時自動選擇 broadcast,其他情況選擇 multicast — 收集目標使用者中 user_social_accounts.line_friend=1 的 LINE userId,以每次 500 個為一組分批發送。
- •統一寬度 — broadcast.php 的
max-w-3xl → max-w-7xl(與其他管理頁面一致)。
- •13 種語言 i18n — 新增
send_line_label/desc、audience_grade_group 鍵。
Changed
- •
resources/views/admin/dashboard.php — 頁首註解 / pageTitle 備援 / RezlyX v... 更新通知橫幅全部更正為「VosCMS」。
- •
resources/views/admin/partials/admin-topbar.php — 更正頁首註解。
Fixed
- •
storage/.update_cache 保留著舊的 current: "2.6.4" 快取,導致更新到 v2.6.8 之後,儀表板仍顯示「有新更新」的橫幅 — 刪除快取後,會在下一次請求時自動重新計算。
- •dev → 正式站累積的變更沒有同步 — 除了本次工作階段之外,install-core.php(#1~#7 缺陷修補)與 version.json 等大量檔案也都沒有同步到正式站的遺留問題。透過 rsync 把 dev 一次性同步到正式站(342 個檔案變更 + 196 個新增,6.3MB,不含使用者資料、
.env、storage/、uploads/、vendor/、.git/)。
Documentation
- •
docs/LINE_FRIEND_CTA_DESIGN_GUIDE.md — 新增 Part 3(整合 Utility Floating Stack 的實際實作)、Part 4(Phase 1 發送營運的實際實作)、Part 5(外部使用者情境 — 多選發送的價值分析)、Part 6(Phase 2~4 後續路線圖)。從約 631 行增加到 920 行。
Regression Test
- •驗證
utility-floating-stack.php 與 5 個 line-friend-cta variant partial 檔案是否存在。
- •驗證
LineMessenger::broadcast/multicast 方法是否存在。
- •驗證
plugins/vos-community/migrations/004_line_broadcasts.sql 遷移檔案是否存在。
- •驗證 13 種語言的
messaging.utility_stack. + community.broadcast.send_line_ 鍵是否存在。
- •自動驗證 dashboard.php / admin-topbar.php 中沒有 RezlyX 殘留。
Fixed
- •vos-market 授權表整合 — 6 個 API 檔案查詢了錯誤的
{$pfx}vos_licenses 表,導致每次付款都出現 500 "Server error"。所有授權驗證現在都路由到單一主表 vcs_licenses(由 vos-license-server 管理)。
- •
sync.php 刪除未驗證主表註冊的安全漏洞 — 先前的程式碼在不驗證 vos_key 的情況下 UPSERT 到 vos_licenses,允許任何人透過簡單的 POST 自動將任意授權金鑰註冊到主表。追蹤現在由現有的 rzx_mkt_sync_reports(按項目)處理。
- •
migrations/007 棄用 — 設計錯誤的遷移現在是 no-op (SELECT 1),原因和變更歷史記錄在註解中。
Added
- •4 個統計卡片 — 已追蹤網站 / 需注意的網站 / 多網域授權 / 未同步 30+ 天。
- •違規分頁(項目層級顯示) — 一目瞭然地查看哪個付費小工具在哪個網域上未授權安裝。顯示價格、版本、vos_key 和上次見過的時間。
- •多網域分頁 — 單個授權金鑰從多個網域回報的情況。
- •未同步分頁 — 30+ 天沒有同步訊號的網站。
- •精細化的違規定義 — 排除
unknown_product 和免費項目。僅市場註冊的付費項目處於未授權狀態的才算違規。
- •擁有者網域白名單 — 儲存在
settings.mkt_owner_domains JSON 陣列中的營運商自有網域自動從計數中排除。
- •13 種語言 i18n — 側邊欄、卡片、分頁和說明文字均已正式翻譯。
Changed
- •
settings/system/updates — 已安裝版本和最新版本卡片更正為 "VosCMS vX.Y.Z"。
- •
updates/ajax.php — 資料庫名稱回退和 User-Agent 已更正。
Regression Test
- •自動驗證 vos-market 6 個檔案中沒有
vos_licenses SQL 殘留
- •偵測
sync.php 中 INSERT 安全漏洞的迴歸
- •驗證
migrations/007 的 no-op 狀態得到維護
- •自動驗證更新畫面 3 個檔案中沒有 RezlyX 殘留
v2.6.7
2026-05-29 · 5個月前
install 精靈安全化與引入自動回歸測試
Fixed
- •自動寫入
site_url — install 精靈只把使用者輸入的 siteUrl 寫入了 .env 的 APP_URL,沒有寫入資料庫的 rzx_settings.site_url,導致新安裝網站中所有依賴 site_url 的功能(自動安裝、SEO、郵件連結等)失效。現已在 install-core.php 的 $settings 陣列中加入 site_url 解決。
- •自動登錄
rzx_site_domains — install 精靈沒有把目前安裝的網域自動新增到 site_domains 資料表,導致 SiteRouter 無法辨識該網域。現在會把安裝的網域作為 site_id=1 的 primary 自動 INSERT。
- •自動寫入
.env 中的 MARKET_API_URL — 全新安裝時 .env 中沒有應用程式市集 API 位址,InstallerService 找不到呼叫目標。現在會自動寫入預設值 https://market.voscms.com/api/market(授權單一主庫營運)。
- •應用程式市集 install API 的資料表名稱拼寫錯誤 —
vos-market/views/api/item/install.php 在驗證授權時查詢了不存在的 rzx_vos_licenses 資料表,導致所有自動安裝都回傳「Server error」的 500 回應。已改為真實的資料表 vcs_licenses(授權主庫,固定不帶前綴)。
- •自動設定 widgets/plugins/themes 目錄權限 — install 之後 PHP-FPM 使用者無法寫入這些目錄,自動安裝悄無聲息地失敗。現在 install 精靈會自動授予 setgid 與群組寫入權限(自動偵測 PHP 執行群組,以適應各種外部環境)。
- •
install-handler.php 的多重備援 — 在多網站環境中,site_url 的查詢沒有 site_id 篩選、只用 LIMIT 1,結果不穩定。現在透過 SiteRouter → site_id=1 備援 → $_SERVER['HTTP_HOST'] 這三級備援,保證在任何環境下都能辨識網域。
Added
- •
InstallerService::installTheme() — 讀取 type=theme 商品的 theme.json,遞迴安裝 requires 中的 plugin/widget/skin。保證 13 種語言驗證與冪等性(已安裝的項目會略過)。
- •
runPostInstall — 佈景主題安裝完成後立即自動執行 post_install/settings.json / boards.json / pages.json 的種子資料,頁面 + 元件配置 + 預設設定一次性全部自動設定完成。
- •強制 13 種語言(
REQUIRED_LOCALES) — 多語言物件(name、description、頁面 title、元件 config.title 等)必須包含全部 13 個鍵才能正式通過。缺少的語言會給出警告。
- •統一
vcs_licenses 主庫 — 所有授權的簽發與驗證都透過正式的應用程式市集(market.voscms.com)管理。dev/test 環境也使用同一個主庫。
Added
- •自動驗證這 6 個缺陷 — 共 13 項,包括 install 精靈的種子邏輯 + 目錄權限 + 應用程式市集 API + 授權伺服器可達性 + InstallerService 的 theme 分支 + install-handler 的多重備援等。
- •build-voscms.sh 自動執行掛鉤 — 建置結束時自動呼叫。只要出現 1 個 FAIL,結束碼就不為 0,阻止發布。即使同樣的缺陷在之後的建置中再次出現,也會被立即發現。
Documentation
- •
docs/theme-package/THEME_PACKAGE_SPEC.md — 定義了 VosCMS 佈景主題套件標準(theme.json)。寫明了沙龍整合佈景主題範例 + post_install 詳細結構 + 13 種語言規則。
v2.6.6
2026-05-27 · 5個月前
防止更新備份重複
Fixed
- •更新備份每個版本只保留一份 —
Backup::createFull() 現在會在建立備份之前先刪除同一版本的既有備份。解決了在同一版本上反覆更新或還原時,備份清單中堆積同一版本重複項的問題(只保留更新前的最新狀態)。
Fixed
- •恢復發行版中缺失的
update-api.php — 建置腳本把更新後端 update-api.php 誤判為「dev 檔案」,從發行版中刪除了它。結果所有已安裝發行版的更新分頁都無法使用,顯示「File not found」。現已從建置排除項中移除,發行版正常包含它。
- •修正登入工作階段無法辨識(Unauthorized) —
update-api.php 原本查看預設的工作階段儲存路徑(/var/lib/php/sessions),現已改為與 index.php 相同的 storage/sessions。解決了以管理員身分登入後仍出現 Unauthorized 的問題。
Changed
- •Core 更新只使用自有發行 manifest 這一個入口 — 移除了
update-api.php 中 GitHub 標籤/權杖/診斷的殘留程式碼(阻斷了 check 用 GitHub 標籤覆蓋 manifest 結果的路徑)。應用程式市集中沒有 Core(僅限外掛)。
- •強化安全性 — 為
update-api.php 加入了 CSRF 驗證與主帳號(擁有者)權限檢查。
- •整理更新保留清單 — 把
skins 與 config 從保留清單中移除。由於 applyUpdate 只做複製,發行 zip 中的核心外觀與 config 會被更新,而 zip 中沒有的客戶自訂檔案會被保留。
Changed
- •移除了重複的「檢查更新」按鈕 — 進入頁面時自動檢查最新版本。
- •修正了暫時出錯時備份清單消失的問題 → 保留該區塊並顯示為空狀態。
- •出錯時不再顯示
Unauthorized 之類的原始訊息,而是顯示「目前使用的已是最新版本」的提示。
Added
- •新增 13 種語言的
um 區塊 — vos-community/lang/{locale}.php 全部語言 (ko·en·ja·de·es·fr·id·mn·ru·tr·vi·zh_CN·zh_TW):follow·following·message·block·unblock·report·report_about·report_reason/detail/placeholder·reason_spam/harassment/inappropriate/other·report_submit/sent/failed·msg_title/placeholder/send/sent/failed·block/unblock_confirm·block/unblock_done·cancel·failed·network_error
- •
user-mention-menu.php 全面 i18n — PHP HTML 中硬編碼的韓文全部替換為 __('community.um.*');JS 執行階段字串透過 UM_LANG = <?= json_encode(...) ?> 以 PHP 物件形式輸出,並由 umT(key, name) 輔助函式替換 :name 佔位符
- •允許未登入使用者使用提及選單 — 重構
community-overlays.php 的守衛結構:管理員/API 路徑全面攔截,而 user-mention-menu 即使未登入也包含(追蹤·檢舉引導登入);頁面操作與 username 守衛仍僅限登入使用者
Changed
- •新增
boardPreloadUsers(array $rows) 函式 (board/_init.php) — 以單次 IN 查詢批次載入 user_id 清單,透過 $GLOBALS['_boardUserCache'] 共用快取
- •擴充
boardAuthorMention() — 新增 data-user-username·data-user-avatar 屬性(精確關聯故事 URL /story/{username},顯示頭像圖片)。優先命中預載快取,未命中時進行 lazy 單筆查詢
- •
board/list.php·board/read.php·skins/board/qna/_list-full.php — 渲染前呼叫 boardPreloadUsers() 以防止 N+1 查詢
Fixed
- •擴充顯示解析器 (
resources/views/system/changelog/index.php) — 新增對程式碼柵欄 (``)、表格 (|...|)、markdown 連結 (text)、#### 小標題與水平線 (---`) 的渲染。解決了使用此語法的早期版本 (2.4.1·2.3.8·2.3.7 等) 以原始 markdown 顯示的問題
- •依版本的 locale 回退 — 由以單一語言一次取整份清單改為依版本 (
目前 locale → en → ko)。現在任何語言都能完整顯示所有版本,尚未翻譯的版本會顯示回退語言徽章
- •區塊邊界對齊 (
rzxlib/Core/Changelog/ChangelogParser.php) — 透過在每個 ## [ 處分割區塊,防止無日期的 ## [Unreleased] 標題被併入前一版本(如 1.5.0)
v2.6.3
2026-05-25 · 5個月前
發行版下載統計·英雄元件拆分·拖放建構器
Added
- •遷移 056
dist_downloads 資料表 (site_id·version·ip·user_agent·referrer·utm_*·is_bot·created_at)
- •下載端點
api/dist-download.php — 不再使用靜態 /download/*.zip 直連,而是經由此端點統計各版本/每日/來源(referrer·UTM)後再 302 轉址。機器人 UA 分開統計;版本白名單(防路徑穿越)
- •管理員統計頁
resources/views/admin/dist-downloads.php (僅限主管理員,13 種語言) — 摘要卡片(總計/今日/7天/30天)·各版本長條圖·每日趨勢(30天)·來源 Top10·UTM。自帶 SVG/CSS 圖表(無外部函式庫)
- •將
download-hero 元件的下載連結改為計數端點
- •新增「下載統計」管理選單 (config/admin-menu.php,僅限主管理員)
Added
- •
hero-cta-text — 上方文字(打字)區域。預設值與線上 hero-cta2 內容一致(13 種語言),使用者設定優先
- •
hero-cta-button — 下載按鈕(自動偵測最新版本+統計下載次數,免設定) + 選用的市集按鈕(留空則只有一個按鈕)
- •設定表單的標籤與預設值支援13 種語言(建構器
getLabel 物件支援)
- •下載按鈕的顏色/背景與 hero-cta2 統一(#2563eb)
Added
- •將面板卡片拖曳到畫布即可新增元件(SortableJS
pull:'clone' 群組 + 畫布 onAdd 中替換為實際區塊)。與原有的點擊新增、↑↓/把手排序並存
- •拖曳時浮層保持開啟 + 畫布放置區高亮(
wb-drop-active)
Changed
- •移除元件之間的頁面包裝間距(
type-widget.php py-2 → 0)
- •穩定留言 AI 翻譯的同步處理 — nginx
fastcgi_read_timeout 150s(討論區 vhost)·PHP-FPM request_terminate_timeout 150·set_time_limit 150,OllamaProvider keep_alive 30 分鐘(模型常駐,消除冷載入)
- •在訊息 API 與社群登入分頁新增 Webhook URL、Redirect URI 的複製按鈕(13 種語言,含非安全情境回退)
v2.6.2
2026-05-14 · 5個月前
結算稅務自動化、註冊表單分支與系統頁面 SSOT
Added
- •遷移 036 — 在
partner_earnings / payouts 新增 withholding_tax · consumption_tax · tax_basis 欄位
- •遷移 037 — 在
payouts 新增 fx_rate · fx_amount · fx_currency 欄位(記錄換算為 USD 的匯款資訊)
- •遷移 038 — 新增
vcs_developers.paypal_email 欄位
- •Helper
rzxlib/Core/Helpers/MarketTax::calculate() — 日本標準扣稅模型
· 售價含稅(税込);平台直接向 NTA 繳納消費稅
· freelance → 扣除 10.21% 預扣稅 / invoice_eligible → 進項稅抵扣 / no_invoice → 不繳消費稅
· 未分類或未填寫 → 強制設為 freelance(保守策略:少付可退,多付難追)
- •補填腳本
scripts/market-tax-backfill.php — 重新計算現有 earnings/payouts(保護 status='paid',支援 --dry-run)
- •五部分結算顯示:收入 → 手續費 → 消費稅扣除 → 預扣稅(freelance)→ 實付金額
- •
rzx_mkt_settings 新增鍵值:min_payout_amount · consumption_tax_rate · default_commission_rate(全域優先使用 settings,移除硬編碼 fallback)
Added
- •
/theadmin/market/partners/payouts 結算彈窗 — prompt() × 2 + alert() → 統一彈窗
· JOIN vcs_developers 自動預填銀行/分行/戶主/帳號/企業類型/T號(prefill;PII enc:自動解密)
· 自動計算五部分 + 日本法律依據標籤(freelance_withholding 等)+ 條文引用(§204,發票制度)
· 頁內 toast 通知;關閉彈窗後自動重新載入
· Frankfurter API 自動匯率(storage 快取 TTL 24 小時)+ 管理員手動覆寫(銀行 TTS)
· 自動選取 method=paypal
· 境外開發者:隱藏銀行帳戶卡片,顯示 PayPal 電子郵件卡片(bank_country == site_country)
- •開發者自行指定結算金額(
/mypage/developer/earnings)
· 全額餘額 → 金額輸入框 + 全額按鈕 + 最低金額驗證
· 銷售記錄五欄顯示,結算說明框(依企業類型顯示適用稅法)
- •付款記錄中顯示 USD 換算與匯率輔助資訊(管理員及開發者兩端均顯示)
- •銷售趨勢圖改為 SVG 長條圖(解決 div 長條在部分環境中幾乎不可見的問題)
Added
- •基於
tax_review_status 的鎖定策略(開發者資料)
· not_submitted / rejected → 可編輯
· pending / approved → 編輯鎖定(掛鎖 + 說明)
· rejected → 可編輯 + 提示「儲存後將進入重新審核佇列」
· 伺服器端防護:HTTP 423 Locked(阻止繞過介面操作)
- •
update.php 部分更新安全化 — 僅對已提交欄位執行動態 UPDATE(舊邏輯:全量覆寫,未提交欄位有被置 NULL 的風險)
- •官方驗證網站連結(管理員驗證頁面 + 開發者資料)
· 🇯🇵 NTA 法人番号公表サイト(https://www.houjin-bangou.nta.go.jp/)
· 🇯🇵 NTA 適格發票發行人公示網站(https://www.invoice-kohyo.nta.go.jp/regno-search/)
· 🇰🇷 韓國 Hometax 企業登記狀態查詢
· 企業編號/T號旁新增一鍵複製按鈕
Added
- •新註冊(
/mypage/developer)— 國籍選擇移至表單最頂部,提供與營運國的對比說明
· country == site_country → 🏠 本國表單(企業類型 / 銀行帳戶)
· country != site_country → 🌐 境外表單(自動 freelance + PayPal 電子郵件必填)
· Alpine.js isDomestic getter,全域常數 OPERATING_COUNTRY
- •資料編輯(
/mypage/developer/profile)— 相同結構([feedback_admin_user_parity] 規則)
· 境外開發者:隱藏企業資訊區塊;結算資訊僅保留 PayPal 電子郵件
· 國籍欄位鎖定(如需變更請聯繫管理員),頂部顯示模式標籤
- •註冊 API 伺服器端強制驗證 — 境外開發者必須填寫 PayPal 電子郵件,強制設為 freelance,企業/帳戶輸入值一律忽略
Added
- •
page.php Token 自動替換 — 統一套用於所有系統頁面
· {{COMPANY_NAME}} {{COMPANY_ADDRESS}} {{COMPANY_PHONE}} {{COMPANY_EMAIL}} {{COMPANY_REG_NUMBER}} {{COMPANY_REPRESENTATIVE}}
· {{SITE_NAME}} {{SITE_URL}} {{DOMAIN}}
· 自動映射管理後台 business_ 或 site_ settings 值
· 自訂 page_title / page_subtitle 同樣經過 Token 替換
- •
{{DOMAIN}} 優先順序 — official_domain(條款/政策專用官方網域)→ site_url 的 host
· 即便在開發伺服器 vos.21ces.com 上,條款正文中依然顯示 voscms.com
Added
- •
rzx_page_contents 中 terms / privacy(各 13 行)全面替換 — RezlyX 預約平台條款 → VosCMS 免費軟體條款
- •服務條款 18 條:目的 · 定義 · 公告與修訂 · 補充規則 · 合約成立 · 隱私 · 通知 · 公司義務 · 使用者義務 · 服務提供 · 變更 · 使用限制 · 授權(免費使用授權)· 資料所有權與保留 · 貼文著作權 · 免責聲明(AS-IS)· 損害賠償 · 爭議解決
- •隱私權政策 10 條:處理目的 · 類別 · 保留期限 · 向第三方提供與委託 · 資料主體權利 · 安全措施 · Cookie · 保護負責人 · 侵權救濟(PPC)· 變更
- •適用日本法律 + 福岡地方裁判所專屬管轄,引用 APPI §33·§34·§35
- •公司資訊使用 Token → 在管理後台修改一次,條款與政策自動同步
- •以日文版為正本,13 種語言均使用各自母語進行正式翻譯
- •公司資訊卡片 — 僅含 3 項:法定名稱、地址及電話(刪除代表人/姓名,避免因登記變更引發條款修訂)
- •儲存腳本:
scripts/voscms-terms-update.php · scripts/voscms-privacy-update.php
Fixed
- •
/theadmin/site/menus 中的 menus-api.php 落後 vos 99 行,導致儲存/編輯選單時遺漏驗證與翻譯
- •將 menus-api.php 從 vos 同步至 market:
· mn_link_target_exists() — 捷徑(連結)選單只有在目標頁面(系統頁面 · rzx_page_contents)確認存在後才允許儲存
· 防止選單 ID 重用 — 新 ID 的舊 rzx_translations.menu_item.{id}.* 自動清理
· 翻譯 INSERT 方式:INSERT IGNORE → INSERT … ON DUPLICATE KEY UPDATE(允許覆寫)
· 修改 title·url 時:清除舊翻譯 + 與系統頁面匹配(config/system-pages.php)時自動重新登錄翻譯
- •在
sync-to-market.sh 的 INCLUDES 中新增 4 個 admin/site/menus*.php 檔案
Fixed
- •
rzx_contact_messages 資料表缺失 → 新增遷移 041_create_contact_messages.sql(IF NOT EXISTS,對已有的 vos 無影響)
- •
contact-messages.php 雙重版面問題 — _head.php 已輸出 sidebar+topbar,但 view 再次直接 include,導致 <body> 重複與 main 巢狀。依 vos 模式整理(頭部 = _head 1 次,尾部 = _foot 1 次)
Added
- •遷移 040
040_create_developer_platform.sql — 批次建立 7 張資料表:vcs_developers + vcs_developer_earnings/payouts/activity/notes + vcs_review_queue + rzx_mp_items(IF NOT EXISTS,套用 ALTER 030~038 後的最終資料表結構)
· vos.21ces.com 的 vcs_developers 僅存在於 dump 中,無 CREATE TABLE 遷移 — 修正後續站點 ALTER 030 失敗的問題
- •同步
mypage/profile-sidebar.php — 舊 rzx_mkt_partners 查詢 → 新 vcs_developers 查詢(在個人頁面中整合開發者活動)
- •market
index.php 路由修補(手動,避免全量同步):
· /developer/ → /mypage/developer/ 301 重新導向(login/dashboard/my-items/submit/earnings/profile/logout 映射)
· mypage/developer/{register|items|items/new|earnings|profile} + mypage/developer/items/{N} + mypage/developer/items/{N}/edit 路由
- •在
sync-to-market.sh 的 INCLUDES 中新增遷移 040 + profile-sidebar.php
- •套用遷移 040 前自動備份 market DB(
storage/backups/market-YYYYMMDD-HHMMSS/market_vos.sql)
Added
- •market.21ces.com 條款採用第三方營運市集模式,與 VosCMS 免費軟體條款分別制定
- •18 條條款(反映市集營運規則):
· 第 8 條:買賣合約在買家與開發者之間成立;公司作為支付與交付中介
· 第 9 條:數位商品退款的 4 種例外(下載前 · 說明不符 7 日 · 惡意軟體確認 · 系統錯誤)— 符合日本《特定商取引法》§15-2 的揭露要求
· 第 10 條:不明示佣金比例(引用「另行公告的費率」,可在無需修訂條款的情況下調整比率)
· 第 10 條:依《所得稅法》§204 預扣稅 10.21%;持有 T 號者的消費稅由平台直接繳納給 NTA;營運國以外帳戶 → 以 USD 透過 PayPal 匯款
· 第 14 條:開發者個人條款優先適用 — 平台營運事項(支付、結算、退款流程)除外
· 第 17 條:損害賠償上限:前 6 個月手續費/結算款總額
· 第 18 條:適用日本法律 + 福岡地方裁判所專屬管轄
· 資料類別 — 通用 / 買家 / 開發者(通用)/ 日本居民 / 海外居民 / 配送:共 6 類
· 保留期限 — 會員 1 年 · 交易 7 年 · 結算/預扣稅 7 年 · 身份核驗 5 年 · 日誌 6 個月 · 諮詢 3 年
· 資料處理受託方 — 明確列出 Stripe · KOMOJU · PayPal · Frankfurter · SendGrid · NTA
· 境外傳輸 — 明確列出美國(PayPal/Stripe/SendGrid)· 歐盟(匯率)· 其他國家(當地支付閘道/銀行)
- •腳本:
scripts/market-terms-update.php · scripts/market-privacy-update.php(UPSERT — 先 UPDATE;無記錄則 INSERT)
- •market DB 已更新(terms/privacy,rzx_page_contents 各 13 行),page-i18n 多語系標題與副標題同步套用
Added
- •修正 skin 設定值(
page_title · page_subtitle)映射缺失 — 設定頁面輸入的值未在頁面中顯示
- •新建缺失的
_page-title-bg.php partial(解決 nginx error log 中的 include 警告)
- •在
title_bg_type 中新增 color 選項 + title_bg_color 欄位 — 圖片/影片為空時自動 fallback 為純色
- •移除
content_bg=transparent 時的白色卡片 fallback(修正 max-w-5xl 內容在卡片內顯得過窄的問題)
- •自動輸出
--page-content-width CSS 變數 — 「關於本頁面」操作列(vos-community)等外部自動 include 的元件將與頁面 content_width 保持相同寬度
Fixed
- •結算頁面 PDOException — 移除對
rzx_mkt_partners 中不存在的 p.currency 欄位的參照
- •銷售趨勢圖不顯示 — div 長條的百分比高度在部分環境中幾乎為 0px → 替換為基於 SVG viewBox 的圖表(保證最低 4px 可見高度)
Added
- •開發者我的頁面項目詳情介面(
/mypage/developer/items/{id})— 統計數據、發布歷史、下載趨勢
- •開發者項目編輯介面(
/mypage/developer/items/{id}/edit)— 與 items-new 相同的3頁籤 UI,自動填入現有值,新 ZIP 上傳採用獨立流程
- •新 API:
/api/developer/item-update — 更新 name(JSON)、short/desc(JSON)、tags(JSON)、price、license、repo/demo URL、相依性、最低版本、icon、screenshots
- •新 API:
/api/developer/request-payout — 申請結算
- •新 API:
/api/developer/update-bank — 更新本人結算帳戶
- •新 API:
/api/developer/issue-reply — 發布 Q&A 回覆(開發者自己的回覆管道)
- •管理員開發者詳情介面(
/theadmin/developers/show)— 企業/帳戶/文件卡片 + 文件審核(核准/拒絕)模式
- •註冊與登入的電子郵件驗證(
/verify-email)增強 + Auth::register 中儲存 company 欄位
- •新增13種語言正式翻譯鍵(
show_edit_btn、items_edit_*、items_back_detail、api_updated 等)
Added
- •在小工具中直接展示評論、問題和 Q&A 提交表單(無需跳轉獨立頁面)
- •僅購買者可提交 — 未購買者可看到表單,但提交時會收到提示訊息
- •Q&A 回覆支援巢狀(對回覆的回覆)— DB 遷移 035(
parent_reply_id)
- •新 API:
/plugins/vos-market/views/api/item/post-issue.php、post-reply.php、post-review.php
- •核心
rzxlib/Core/Helpers/Notifications.php — 通知輔助函式(與 DB 遷移 034 配套)
Added
- •對所有介面全面套用13種語言支援:
/theadmin/market/licenses、sync、orders、settings、submissions、partners/payouts、items
- •市場設定介面 — 「合作夥伴」標籤統一改為「開發者」(僅顯示文字;變數名稱為相容性保留不變)
- •市場項目名稱輸入使用公用多語言輸入彈窗 —
name_json 可同時以13種語言編輯
- •
plugins/vos-market/lang/* — 外掛級新語言資源池
- •
resources/lang/*/marketplace.php — 13種語言全部以本國語言翻譯(符合多語言完整翻譯規則)
Added
- •
033_developer_notes_activity.sql — 依開發者記錄的備註和活動日誌
- •
034_notifications.sql — rzx_notifications 資料表(使用者通知)
- •
035_issue_reply_thread.sql — 新增 rzx_mkt_issue_replies.parent_reply_id 欄位(巢狀回覆)
Fixed
- •
/Market?item={slug} 缺少 slug — 在 items-show 中透過專用單欄查詢進行修正
- •項目更新 API 中的
icon_url 欄位名修正為實際欄位名 icon
- •市場設定頁面空白 — 套用
rzx_mkt_settings 缺失的遷移 005
Added
- •VARCHAR(12)
users.username + UsernameValidator(至少 6 個字元,特殊字元限制)
- •登入後首次進入時顯示門控彈窗(AJAX
/api/username-set)
- •13 種語言的正式翻譯(移除英語 fallback)
Added
- •
/profile/{uuid} → /story/{username} 301 跳轉
- •右鍵選單標籤從「查看個人頁面」改為「查看動態」
Added
- •從核心分離的 vos-story 外掛 — 專屬
/story/{username}
- •Facebook 風格頁首 + 5 個固定分頁(全部 / 簡介 / 照片 / 粉絲 / 追蹤中)
- •文章 CRUD + SNS 動態(
vos_story_posts,body_format = text/html)
- •TEXT/EDIT 切換 + Summernote 整合
- •圖片附件(多張)+ 照片分頁格線
- •按讚 + 留言系統
- •Story 佈景主題系統(
skins/story/default)+ 使用者獨立令牌(/mypage/story)
- •管理員運營政策頁面(
/admin/vos-story/policy)
- •頁面操作列:i18n + 位置(主內容末尾)+ 內容寬度令牌
- •2:1 格線(僅內容區域)— 右側:廣告 + 好友(粉絲/追蹤中分頁)
- •頁首操作按鈕 — 純圖示([我的 Story 設定] / [編輯個人資料] / [追蹤])
Added
- •D-1:4 選單側邊欄(儀表板 / 動態 / 帳戶資訊 / 訊息)
- •D-2-A:新儀表板 — 8 個狀態卡片 + 8 分頁導覽 + 帳戶資訊分頁
- •D-2-B:收藏夾 / 收件匣 / 好友分頁(各含「查看全部」連結)
- •D-2-C:已儲存 / 我的文章 / 我的留言分頁(板塊 + Story + 頁面統一)
- •D-2-D:自動登入(remember tokens)管理
Added
- •公用輔助函式
rzx_mirror_external_images() — cURL + SSRF 防護 + GD 圖片縮放
- •E-1:收藏快照截取 + 外部圖片吸收
- •E-2:發布 Story 時吸收(story_attachments source 欄)
- •E-3:發布板塊文章時吸收
- •E-4:建立頁面內容時吸收
- •圖片標記:
data-source-original、data-source-mirrored
Added
- •託管管理側邊欄末尾的 [設定] — 進入服務申請頁面的 4 個分頁(general/domain/hosting/addons)
- •退款政策 → 系統設定 → 一般 → 獨立卡片 分離(與稅務設定隔離)
- •
rzx_settings.refund_policy 單鍵儲存
- •13 種語言的
settings.refund.* 鍵
Added
- •遷移 009:
page_contents.created_by / updated_by 欄
- •在所有頁面編輯介面(admin/customer/system)自動記錄
Added
- •文章計數 — 識別板塊文章的獨立
rzx_translations 結構(board_post.{id}.title)
Added
- •管理員設定中支援按託管配置儲存配額 / 警告閾值 / 政策(block/notify/none)
- •我的頁面使用量甜甜圈圖表
- •
scripts/db-quota-monitor.php 背景監控程式
Added
- •VosCMS 重新安裝按鈕 — 管理員託管分頁
- •託管 [狀態] 變更操作 + 日誌
- •刪除「伺服器連線資訊設定」編輯表單(防止不必要的資訊暴露)
Fixed
- •收藏
add_scrap 網路錯誤 — vos-story API 檔案 require 衝突
- •收藏卡片 — 輪廓 + 刪除/編輯圖示(垃圾桶)
- •文章計數與列表不一致(缺少狀態篩選條件)
- •移除 nick_name 比對(防止將 user_id 為 NULL 的種子資料誤識別)
- •我的頁面 Story 選單位置 — top → main(外掛自動識別)
- •Story 選單圖示使用核心格式(完整
<path> 標籤)
- •附加服務分頁 settings SELECT 缺少 key 欄(導致兩個區塊隱藏)
- •hosting_status 操作 500 — 輔助函式定義位置
- •頁面操作列 — 內容寬度令牌已套用
- •發布新文章時現有文章消失的 bug(動態即時重新整理)
Added
- •主機代管詳情 → 網域選項卡 →
+ 新增網域 按鈕 → 彈窗
- •選項:免費子網域 / 新註冊 / 連接現有網域
- •WHOIS查詢(
/api/domain-check.php 複用)+ 按TLD顯示價格
- •付款:已儲存的卡(複用主機代管PAY.JP客戶)或新卡(PAY.JP Elements)
- •自動分離10%消費稅(小計 / 稅額 / 合計)
- •付款完成時附加至主機代管sub的
metadata.added_domains[](不另建sub)
- •自動退款安全網 — DB處理失敗時PAY.JP扣款自動退還
Added
- •開始日期~到期日期 + 檢查按鈕(DNS A/CNAME → 匹配我們的區域或Cloudflare IP段)
- •自動續期開關 + 續期申請按鈕(按網域)
- •registrar_pending / manual_attach_pending時檢查按鈕 → "處理中"徽章
- •"附加網域"紫色徽章
Added
- •主機代管管理側邊欄:新增第2項
- •統一清單:type='domain' sub + 主機代管sub.added_domains[] 全部按時間順序顯示
- •統計卡片(全部/處理中/已完成)+ 篩選(狀態/選項/搜尋)
- •操作:[標記為已註冊] / [處理取消](取消時:PAY.JP退款 + INSERT退款列)
- •使用者名稱自動解密
Added
- •主機代管管理側邊欄:新增第3項
- •基於
rzx_payments 的交易帳本 — 收入/退款/淨收入/稅額統計卡片
- •日本消費稅申報用金額自動計算(含稅價格 → 本體 = total × 100/110,稅額 = total × 10/110)
- •近12個月走勢表 + 交易帳本表格 + 篩選/分頁
Added
- •我的頁面附加服務選項卡:"可申請"區塊(商務郵件自動排除)
- •按價格的操作:
- •免費(安裝支援):管理員通知 + order_logs
- •報價(客製化開發):"申請報價"
- •固定定期價格(1年技術支援):卡片付款彈窗(
_addon-pay-modal.php)
- •付款完成時自動建立addon sub + payments憑證
- •已啟用sub標籤符合時申請按鈕自動停用
- •install_info列右側:[前往管理後台 / 前往首頁] 按鈕
Added
- •DB架構:
uk_payment_order UNIQUE移除 → uk_payment_key(charge_id)UNIQUE替代
- •允許一個訂單有多列付款記錄(主機代管+網域+附加服務累積)
- •退款時:paid列不變,單獨INSERT退款列(status='refund',會計完整性)
- •滿足日本7年保存義務 + PAY.JP商戶爭議處理標準
Added
- •composer require minishlink/web-push
- •基於VAPID的admin/supervisor推送發送助手
- •已過期endpoint自動清理 + rzx_push_messages自動記錄
- •呼叫點:pay_domain(網域付款完成)、service-order(網域註冊申請)、request_addon
Added
- •我們區域的子網域自動匹配(識別wildcard CNAME)
- •Cloudflare IPv4 15個CIDR段匹配(代理回應時)
- •"already_refunded"回應視為成功處理(PAY.JP已退款時)
Added
- •子查詢彙總
rzx_payments 合計(paid − refunded)
- •主機代管基礎付款 + 網域新增 + 附加服務付款累積顯示
Added
- •
admin_cancel_addon — sub status='cancelled' + PG退款 + INSERT退款列
- •PG路由:基於付款列的
gateway 欄位(PG變更後也安全)
Removed
- •根據日本7年保存義務 + PAY.JP爭議處理政策,管理員UI中的所有「刪除」按鈕已全部移除
- •垃圾桶圖示 + adminDeleteAddon JS + admin_delete_addon API + 13種語言4個標籤全部移除
- •僅使用「取消」 — 資料列絕不執行DELETE
Fixed
- •Translator佔位符冒號前綴衝突 —
[':count' => N] → ['count' => N] 批量修正
- •PayjpGateway::refund()的
metadata[refund_reason] 被PAY.JP拒絕 → 更改為 refund_reason
- •service-manage.php管理員權限檢查 —
role === 'admin' → role IN ('admin','supervisor') 5個操作統一修正
- •服務訂單網域選項卡:退款後會計卡片顯示負數 → SQL邏輯修正(status='paid' / 'refund'分離彙總)
Added
- •ssh.21ces.com Cloudflare Tunnel註冊(Public Hostname: SSH → localhost:22)
- •外部電腦:
cloudflared access ssh --hostname ssh.21ces.com 或~/.ssh/config中的ProxyCommand
- •伺服器端:PermitRootLogin no,thevos金鑰已註冊
Added
HostingProvisioner.php installVoscms() 在 zip 部署後依序呼叫 install-core.php step 3 → step 4(先前僅 step 2):
- •新增
runInstallCoreSteps() — 利用 _db POST 回退繞過 Session + 驗證 .installed 標記
- •新增
callInstallCore() — HTTP loopback(埠 80,借助 Cloudflare edge SSL;限速時處理 origin 憑證缺失)
- •新增
appendHostingEnv() — install-core.php 覆寫 .env 後重新注入 HOSTING_* 變數
- •安裝完成後自動刪除 welcome.html(使 VosCMS index.php 優先載入)
- •付款流程 service-order.php:567-576 — 安裝成功時自動將
install_completed_at、install_admin_url 寫入 addon 中繼資料(觸發我的頁面分頁顯示)
Added
admin/service-orders/detail.php:175-260 + partials/addon.php:
- •附加服務分頁的「安裝支援」addon 中新增兩個按鈕:
- •安裝 VosCMS(紫色)— 有
install_info 且尚無 install_completed_at 時顯示
- •管理員頁面(綠色)— 安裝完成後在新視窗開啟 admin URL
- •API 操作
admin_run_voscms_install — 直接呼叫 HostingProvisioner.installVoscms(),DB 憑證從 metadata.server.db 或客戶 .env 回退
- •成功時:寫入 addon 中繼資料 +
voscms_installed order_log 記錄
Added
customer/mypage/service-partials/hosting.php:
- •🟢 網站備份按鈕 —
service-manage.php?action=request_backup(新增)
- •mysqldump → DB 匯出 + zip 封裝(public_html、.env、sql)
- •簽署下載 URL(HMAC,10 分鐘有效)— api/backup-download.php 新增
- •自動清理 7 天前的舊備份
- •🟣 開啟 phpMyAdmin —
https://pma.voscms.com/?lang=<user_locale> 新視窗
- •nginx vhost:pma.voscms.com.conf 新增(透過 Cloudflare Tunnel
*.voscms.com 萬用字元自動路由)
- •使用使用者自己的 DB 憑證登入
- •顯示 DB 連線資訊(主機 / 資料庫名稱 / 使用者 / 密碼切換)
- •13 種語言 i18n:
btn_site_backup、btn_open_phpmyadmin、confirm_site_backup、backup_in_progress、backup_ready、f_password、password_notice、f_protocol
Added
customer/mypage/service-partials/_setup-monitor.php:
- •分離步驟:托管設定 → VosCMS 自動安裝
- •
system_imported 訂單(管理員自行登錄的系統托管,如 vos.21ces.com)立即啟用 — 不顯示監控框
- •新增 13 種語言 i18n:
setup_step_voscms_install
Changed
rsync 排除項新增:
- •5 個內部外掛(不應部署至托管客戶網站):
- •
vos-developer、vos-hosting、vos-license-server、vos-market、vos-salon
- •7 個 reservation 遷移 SQL(托管客戶不安裝預約系統):
- •
001_create_reservation_tables.sql、011_seed_service_translations.sql、012_seed_service_translations_p2.sql、013_add_source_to_reservations.sql、014_add_payment_status_to_reservations.sql、015_create_reservation_core.sql(新增)、016_alter_reservation_services.sql、024_reservations_bundle_columns.sql
dev 檔案刪除新增:
- •
admin/ 目錄(offline.html 殘留)— 空目錄導致 nginx 目錄索引 403,僅 root /offline.html 被 sw.js 引用
- •基礎編碼 →
obfuscate.php(舊版 ionCube EVAL 執行時掛起;僅在 USE_IONCUBE=1 時使用 ionCube)
Changed
將 001_create_base_tables.sql 原本在單一檔案中同時建立 base 和 reservation 資料表的結構拆分:
- •已修改:
001_create_base_tables.sql — 僅包含 5 個核心資料表(rzx_admins、rzx_users、rzx_member_grades、rzx_settings、rzx_migrations)+ 核心種子資料(member_grades 預設值、settings 預設值)
- •新增:
015_create_reservation_core.sql — 9 個預約資料表(rzx_categories、rzx_services、rzx_service_options、rzx_reservations、rzx_payments、rzx_point_transactions、rzx_business_hours、rzx_holidays、rzx_staff_positions、rzx_staff)+ 預約種子資料(business_hours、point_*)
托管發行版建置時排除 015 → 不建立 rzx_reservations → admin/dashboard.php:25-27 中 $hasReservations = false → 行事曆不自動顯示。
使用預約系統的網站(voscms.com、RezlyX 等)同時套用兩個 SQL 檔案 → 無變化。
Changed
config/templates/nginx-vhost.conf.tpl + HostingProvisioner addHttpsToVhost():
- •原來:80 埠(HTTPS 重新導向)+ 443 埠(實際內容)→ Cloudflare Tunnel + 80→443 重新導向形成無限迴圈
- •現在:80/443 統一單一 server 區塊,提供相同內容,無重新導向
- •
fastcgi_read_timeout 60s → 300s(防止大量 INSERT 時 nginx 逾時)
Changed
- •
provision-hosting.php(CLI 回填工具):自動更新托管訂閱中繼資料(hosting_provisioned、server.{ftp,db,env})— 以前僅執行 service-order.php 的 _autoProvisionHosting
- •自動刪除 5 個內部外掛 + admin/ 目錄
Added
新增 scripts/install-cli.php:
- •托管設定後自動呼叫 install-core.php 的回填
- •DB 憑證:優先使用 subscription 中繼資料,若無則回退至客戶 docroot 的
.env
- •用法:
sudo -u www-data php scripts/install-cli.php --order=<ORDER>
- •成功時:自動將
install_completed_at 寫入 addon 中繼資料 + 在 order_logs 中記錄 voscms_installed 操作
Fixed
- •信用卡付款分支缺少
_autoProvisionHosting() 呼叫 — 已補充
- •付款中繼資料中
install_info.admin_pw 明文暴露 → 統一我的頁面和管理員兩側的切換(👁)顯示模式
Migration Notes
- •外部托管客戶:無需額外操作。
voscms-2.4.3.zip 建置使用乾淨的 zip。
- •本站(voscms.com):無變化(兩個 reservation SQL 檔案均已套用)。
- •現有托管客戶(dwhahn 等):建議 deprovision + reprovision 進行乾淨重裝(拆分後套用新 zip)。
- •手動清理:
/etc/nginx/sites-available/pma.voscms.com.conf 已新增 — 直接部署至本站系統(rsync 之外)。
v2.4.2
2026-04-29 · 6個月前
託管自動化付款 Hook + 活動記錄 i18n
Added
在 service-order.php 中付款完成後立即呼叫:
- •新函式
_autoProvisionHosting($pdo, $prefix, $orderId, $orderNumber) — 在付款事務外部執行(DB 完整性隔離;即使失敗也不影響訂單本身)
- •僅
domain_option = 'free' 立即完成設定(Cloudflare 子網域 — DNS 自動註冊已完成,可立即使用)
- •
new(購買網域後等待 NS 變更)/ existing(現有網域等待 NS 變更)處於 deferred 狀態 — 管理員在網域啟用時單獨觸發
- •如果 'install' 外掛有
install_info,則部署 voscms 檔案並自動生成 .env(install-core.php 的逐步工作階段流程(步驟 2–5)自動化需要重新設計整個 voscms 安裝流水線,工程量大,推遲至第 5 階段;使用者付款完成後前往 https://<網域>/install.php → 按精靈操作,DB 資訊已預先注入 .env)
- •ftp/db/env 資訊自動儲存至託管訂閱的
metadata.server → 在我的頁面託管標籤頁中自動顯示(無需 UI 修改)
- •order_logs 操作:
hosting_provisioned / hosting_provision_skipped / hosting_provision_deferred / hosting_provision_failed
呼叫順序:付款提交 → _autoProvisionHosting() → _autoProvisionMailDomain()
Added
管理員服務訂單詳情頁面(detail.php:498-528)的 $actionLabels 從 8 個擴展至 31 個。修復了活動記錄中直接顯示原始代碼(如 mail_account_added)的問題。
新增的操作映射:
- •郵件:
mail_account_added/deleted、mail_address_changed、mail_provisioned/_skipped/_failed、mail_domain_migrated/activated、bizmail_upgrade_request
- •託管:
hosting_provisioned、hosting_provision_skipped/deferred/failed、hosting_deprovisioned
- •附加服務:
admin_add_storage_addon、admin_delete_addon、storage_addon_paid/requested
- •系統:
customer_notified、setup_email_sent、server_info_updated、bulk_extended、manual_capacity_period_fix
各操作顏色含義:green(完成/正向)、amber(待處理/警告)、red(失敗/刪除)、blue(資訊/通知)、violet(管理員/特殊)、zinc(中性)。
23 個 i18n 鍵 — services.admin_orders.act_* — 已為 ko/ja/en 三種語言新增(運營頁面)。其餘 10 種語言回退至英文。
Changed
託管自動 Provisioning 時,VosCMS 自動安裝僅執行檔案部署 + .env 自動生成。install-core.php 的逐步工作階段流程(步驟 2–5)自動化需要重新設計整個 voscms 安裝流水線,工程量大,推遲至第 5 階段。使用者付款完成後前往 https://<網域>/install.php → 按精靈操作(DB 資訊已預先注入 .env)。
installVoscms() 回傳值已變更 — 現在回傳 install_url + note 提示訊息。
v2.4.1
2026-04-29 · 6個月前
主機代管虛擬化自動佈建(第1–3階段)
Added
HostingProvisioner.php — 主機代管訂購時自動設定的主類別。9步驟交易(失敗時按逆序回滾):
- •Linux使用者建立(
vos_<order_number>,在32字元限制內,保留大小寫)
- •目錄結構:
/var/www/customers/<order>/{public_html,logs,tmp}(chmod 750/2775/750/1770)
- •磁碟配額(
setquota -u <user> <soft> <hard>,hard = soft × 1.1)
- •目錄衝突偵測:與現有nginx vhost /
reserved_subdomains 衝突時拒絕
- •1.9TB SSD
/var/www 掛載(ext4 + noatime + usrquota,grpquota)
- •集中sudoers(
/etc/sudoers.d/voscms-hosting-provisioner)— www-data以NOPASSWD執行root指令(useradd/setquota/nginx等)
- •每指令限制引數模式(
vos_、/var/www/customers/、*.conf)— 通過visudo驗證
CLI工具 scripts/provision-hosting.php:
php provision-hosting.php SVC260428AE7476 hotel.com 1GB
php provision-hosting.php --order SVC260428AE7476 # 自動DB查詢
php provision-hosting.php --deprovision SVC260428AE7476 hotel.com
php provision-hosting.php --install-voscms <order> <domain> <capacity>
範本 config/templates/:
- •
nginx-vhost.conf.tpl — HTTP + ACME挑戰位置 + 每使用者FPM socket
- •
welcome.html.tpl — 啟用歡迎頁面
Added
每個主機代管在自己的使用者權限下執行PHP(防止跨站攻擊)+ 即使在Cloudflare代理後面也能自動簽發SSL。
config/templates/php-fpm-pool.conf.tpl:
- •
user = vos_<order> / group = www-data — UID隔離
- •
listen = /var/run/php/<order>.sock — 每使用者socket
- •
pm = ondemand — 低流量主機代管的記憶體效率
- •
php_admin_value[open_basedir] — 存取限制為網站目錄 + /tmp + /usr/share/php
- •
disable_functions — exec, passthru, shell_exec, system, proc_open, popen, pcntl_exec
- •
session.save_path / upload_tmp_dir — 隔離至使用者目錄
- •env: HOSTING_ORDER / HOSTING_USER / HOSTING_DOMAIN
Let's Encrypt SSL — Cloudflare DNS-01挑戰:
- •
python3-certbot-dns-cloudflare 外掛
- •
/etc/letsencrypt/cloudflare/credentials.ini(root 0600,.env中的CLOUDFLARE_API_TOKEN)
- •無論Cloudflare代理 / 外部可達性均可簽發
- •HTTPS伺服器區塊自動新增(TLS 1.2/1.3,強密碼,HSTS,X-Frame-Options,X-Content-Type-Options)
- •HTTP → HTTPS 301自動重新導向
- •
certbot.timer 每天自動更新兩次(已啟用)
Added
每個主機代管訂單的DB + 使用者隔離。
- •
hosting_admin MySQL帳戶(建立一次,ALL PRIVILEGES + GRANT OPTION)— 僅用於DB管理
- •DB名稱/使用者 =
vos_<order>(與Linux使用者名稱相同)
- •密碼:32位hex隨機(
bin2hex(random_bytes(16)))
- •
GRANT ALL PRIVILEGES ON vos_<order>.* TO vos_<order>@localhost — 僅存取自己的DB
- •隔離驗證:存取其他主機代管DB / voscms_prod返回Access denied 1044
VosCMS自動安裝(installVoscms() — 由--install-voscms或addon有install_info時觸發):
- •解壓最新
voscms-dist/voscms-X.Y.Z.zip → public_html
- •自動產生
.env:APP_KEY=base64:<32位元組> / DB資訊 / HOSTING_ORDER注入
- •權限:vos_:www-data,.env chmod 640
- •無介面呼叫
install-core.php(目前存在301重新導向問題,將在第4階段解決)
Verified
provision DEMO260429FULL demo07.21ces.com 1GB --install-voscms:
- •✅ 使用者
vos_DEMO260429FULL(UID隔離,www-data群組)
- •✅ 磁碟配額1GB soft / 1.05GB hard
- •✅ PHP-FPM pool 獨立socket
- •✅ nginx vhost(HTTP + HTTPS,HSTS)
- •✅ Let's Encrypt SSL(
/etc/letsencrypt/live/demo07.21ces.com/)
- •✅ MySQL DB
vos_DEMO260429FULL + 使用者(隔離已驗證)
- •✅ VosCMS 2.3.9檔案 + .env已部署
deprovision:所有資源已清除(使用者/home/DB/FPM pool/nginx/SSL)。
Added
不再使用業界標準的週年紀念計費方式(從註冊日起至一年後的同一天),改為按日曆月末截止(從次月1日到到期月最後一天)。同月註冊的使用者到期日相同,簡化了 cron 批次處理和會計結帳。遵循日本主機標準(月末締め翌月1日請求)模式。
- •資料庫:新增
rzx_subscriptions.billing_start DATETIME NULL 欄位(正常計費開始日)
- •Helper 函式:
_proratedFirstAmount(月單價 ÷ 30 × 剩餘天數)、_calendarBillingStart(次月1日)、_calendarExpires(最後一天 23:59:59)
- •訂單表單:自動在主機付款項目中新增
hosting_prorated(例如:4/2 註冊 12 個月 ¥1,000/月 → 首月 ¥967 + 正常 12 個月 ¥12,000 = ¥12,967)
- •網域保持週年紀念計費(1 年註冊週期);主機、郵件、維護和附加服務使用日曆計費
- •service-order.php 中的
-1 second → -1 day 處理也統一
- •附加服務(額外 web 儲存空間)同樣使用相同的按天計費 + 正常 N 個月合計,自動與主機到期日同步
Added
在 ConoHa VPS (133.117.72.149) 上部署 Postfix + Dovecot + Rspamd + Roundcube + OpenDKIM + Let's Encrypt。mail-tester 10/10,FCRDNS 已驗證。下單時自動設定網域。
- •自動 DNS 註冊(
CloudflareDns.php)— A / MX / SPF / DKIM / DMARC 5 種記錄一次性新增
- •DKIM 金鑰生成 — mx1 SSH
rspamadm dkim_keygen(專用 ed25519 金鑰 storage/keys/mailsync_ed25519,www-data 所有,0700)
- •3 模式佈建(
MailDomainProvisioner.php):free(子網域即時)/ new(購買網域,管理員啟用)/ existing(NS 變更指南)。狀態機:existing_pending / new_pending / active
- •密碼:SHA512-CRYPT(
{SHA512-CRYPT}$6$...)— Dovecot 相容的單向雜湊。舊 enc:(encrypt 函式)密碼遷移腳本:scripts/migrate-mail-passwords.php
- •mx1 同步 cron(
scripts/mail-sync-to-mx1.php)— voscms_prod → mx1 mail_lookup virtual_users 每 5 分鐘同步一次。郵件操作後立即觸發後台同步的即時觸發器(triggerMailSyncToMx1())也已新增
- •cron 自動註冊:
/etc/cron.d/voscms-mail-sync
- •通知:管理員(需要佈建)/ 客戶(郵件可用)HTML 郵件範本(
MailNotifier.php)
Added
基礎郵件 / 商務郵件與主機捆綁管理。修復了相同地址同時儲存在郵件訂閱與主機中繼資料中導致介面重複顯示的問題(單一資料來源:郵件訂閱)。
- •網頁郵件按鈕 — Roundcube
?_user=地址 GET 參數自動填充使用者名稱,target="_blank"。URL 優先順序:metadata.mail_server.webmail_url → WEBMAIL_URL env → 預設 https://mail.voscms.com/
- •電子郵件變更按鈕 — 用於更正打字錯誤。網域固定,僅更改本機部分。同一訂單的所有郵件 + 主機中繼資料均同步
- •去重邏輯(
mail.php)— _seenAddresses 每個地址只顯示一次,郵件訂閱優先
- •service-detail.php 中的虛擬 hosting → mail 轉換僅在沒有真實郵件訂閱時生效(舊資料相容)
- •service-order.php 新註冊時不再儲存 hosting metadata.mail_accounts(郵件訂閱為唯一來源)
Added
在個人中心附加服務標籤頁購買額外主機儲存空間。PAY.JP 客戶註冊 + chargeCustomer。
- •彈窗:選擇容量(1 GB / 3 GB / 5 GB)+ 輸入卡片資訊(payjp.js v2 Elements)
- •註冊卡片 / 用其他卡片付款 / 返回已註冊卡片 — 切換
- •自動偵測過期/被拒絕的卡片(
expired_card、card_declined、invalid_* 等 PAY.JP 錯誤代碼)→ 卡片表單自動展開 + 提示橫幅
- •新增持卡人姓名輸入欄位(
addon-card-holder)— 存為客戶中繼資料,不傳入 token(PAY.JP v2 Elements 不支援 name 選項)
- •Portal 模式:
document.body.appendChild() 脫離帶 transform 的容器,覆蓋整個 viewport(z-[9999])
- •建立新客戶後扣款失敗時:自動退款 + 刪除客戶(防止孤兒記錄)
- •hosting metadata.extra_storage[] 累積,主機標籤頁儲存指示器顯示合計值
Added
參考 StarServer 等日本主機服務商的標準條款,構建 14 個條款(定義、申請、費用、自動續費、取消、服務、備份、禁止行為、暫停、維護、隱私、免責、變更、管轄)。明確載明按日曆計費方式 + 首月按日計算 + 取消時退還未使用月份費用的政策。
- •系統頁面註冊:
config/system-pages.php hosting-terms slug,🖥️ 靛藍
- •頁面編輯器對應:
pages-document.php — pageMetaMap['hosting-terms']
- •資料庫填充:ja(主)/ ko / en — 3 種語言(rzx_page_contents)
- •i18n:
site.pages.hosting_terms + hosting_terms_edit(editor_title/desc)
Added
- •4 個標籤頁始終可見(detail.php)— hosting/domain/mail/addon。無資料時顯示空狀態訊息(empty_*)
- •附加服務標籤頁 —
+ 新增儲存空間 按鈕(管理員免費授予彈窗,選擇容量後立即建立 active addon subscription,billing_amount=0,expires=主機到期日)+ 各項目的垃圾桶/刪除按鈕(軟刪除 status=cancelled,從 hosting metadata.extra_storage[] 中移除)
- •清單 — 申請人顯示改善(index.php)—
supervisor/admin 角色的系統管理員訂單顯示為 user.name + 紫色副標題 超級管理員: [email protected] 格式(繞過舊加密 applicant_name 如 FKzGx9SE7xG/2 的解密失敗)
- •建立訂單按鈕(
+ New Order)— 僅 UI,功能待實作
- •i18n 13 種語言:
role_supervisor、role_admin、btn_create_order、empty_、btn_add_storage_addon、btn_delete_addon、modal_add_storage_、confirm_、alert_ 等 20 餘個鍵
Added
- •
subdomain-check.php — DB(reserved_subdomains)優先 + Cloudflare API 降級。JS checkSubdomain() 呼叫伺服器並反映結果
- •service-order.php 在付款前進行伺服器端再驗證 — 防止客戶端繞過
- •
reserved_subdomains 自動匯入 — Cloudflare 區域中的 11 條現有記錄(vos/bestatech/bt/dev/ec430/ec431/salon/ssh/test/thevos/ai.21ces.com)
- •選單 INSERT IGNORE 錯誤修復(menus-api.php):
- •
add_menu_item:INSERT 後立即清理過時翻譯 + 用 INSERT ... ON DUPLICATE KEY UPDATE 覆寫
- •
update_menu_item:偵測到 title/url 變更時刪除全部 13 條舊翻譯 + 若為系統頁面則重新註冊
- •
rename_menu_item:標題變更時清理舊翻譯
- •修復舊選單(id=38,「VosCMS 介紹」)的多語言翻譯指向新主機服務條款選單的回歸問題
Added
完整流程建構:服務申請 → 付款完成 → 自動郵件網域佈建 → 客戶通知。
- •在 service-order.php 中新增
_autoProvisionMailDomain() 呼叫 — 在付款交易之外執行(隔離資料庫完整性)
- •資料庫:
rzx_reserved_subdomains(zone、subdomain、record_type、reserved_by、reason)— 可用性快取
- •DKIM 金鑰自動生成,以 mode/origin/domain/zone/subdomain/provisioned_at 格式儲存至 metadata.mail_provision
- •依佈建模式分支 UI(service-detail.php):
pending / new_pending / existing_pending — 隱藏標籤頁,僅顯示監控(_setup-monitor.php);僅在 active 狀態時顯示標籤頁
Fixed
PHP 的 $arr['key'] ?? [] 回傳暫時值,因此 &$ref 不影響原始陣列。change_mail_password / change_mail_address 回傳了成功回應,但 metadata UPDATE 無效 — 密碼和地址變更均靜默失敗。
- •改為基於索引的直接更新模式:
foreach ($arr as $i => $item) { $arr[$i]['k'] = ... }
- •service-order.php 中新郵件密碼儲存也從
encrypt()(雙向)改為 mail_password_hash()(SHA512-CRYPT)
Fixed
- •付款摘要螢光亮綠色 → 更清晰的顏色:
text-green-400 → text-green-600 dark:text-green-400(7 處)
- •子網域可用性回應訊息缺少 i18n 鍵(
order.php 中 PHP→JS i18n 對應 + :fqdn 佔位符統一)
- •到期日計算精確化:
+N months -1 second(同一天)→ +N months -1 day(恰好提前 1 天)→ 最終統一為日曆方式
Database
- •新增
rzx_subscriptions.billing_start DATETIME NULL(dev + prod)
- •
rzx_reserved_subdomains 表(Cloudflare 區域衝突快取)
- •
rzx_page_contents 填充 hosting-terms(ja/ko/en)
v2.3.9
2026-04-27 · 6個月前
服務訂單多語言化 + 三區域選單系統
Added
網域、主機、附加項、申請人、付款、摘要共6個區域及付款完成頁面的所有文字已翻譯成13種語言。客戶端的 alert/modal 文字透過 PHP 以 var I18N = {...} + t(key, replace) 模式注入。
- •位置:plugins/vos-hosting/lang/{13 locales}/services.php —
services.order.* 200+個鍵
- •我的頁面服務詳情:
services.detail.* 70+個鍵,service-detail.php
- •管理員訂單管理:
services.admin_orders.* 115+個鍵,admin/service-orders/
- •儲存在 DB 中的韓語標籤(主機方案、維護、附加項)透過
_localizeLabel($sub) 閉包依設定 ID 映射後套用 db_trans() → 我的頁面和管理端處理一致
Added
點擊付款按鈕時,驗證訂單詳情(網域/方案/附加項/申請人/條款)後顯示摘要彈窗 → 使用者確認 → 進行付款。防止註冊空子網域等誤操作。
- •order.js —
showOrderConfirmModal(), closeOrderConfirmModal(), confirmAndPay()
- •加強付款完成後殘留彈窗層的移除(DOM 刪除 + body/documentElement overflow 重置)
Added
在附加項中勾選「安裝支援」(_id='install')時,顯示管理員 ID/信箱/密碼/站點名稱輸入表單。密碼帶遮罩 + 眼睛圖示切換 + 「安裝後請更改」提示。輸入值以 install_info 儲存在訂閱元資料中,在我的頁面和管理端均可查看。
- •輸入:_addons.php
- •顯示:我的頁面/管理端 partials/addon.php(藍色背景框 + 密碼切換)
Added
附加項標籤頁中的備註已改為訂單(rzx_orders.admin_notes)層級。無論附加項是否存在,始終在右側活動記錄上方以7行文字框形式顯示。新增 AJAX update_order_memo 操作。
Added
引入 section 欄位(top/main/bottom,預設 main),用於在視覺上區分核心選單和外掛選單。區域之間自動插入分隔線;若某區域無可顯示選單,則包括分隔線在內整體略過。
管理員側邊欄:
- •top:控制台 / 會員管理 / 站點管理 / 自動安裝(
vos-autoinstall)
- •main:VosCMS 授權(
vos-license-manager)/ 主機管理(vos-hosting)
- •bottom:外掛 / 設定
- •變更:config/admin-menu.php, admin-sidebar.php
我的頁面側邊欄:
- •top:控制台 / 個人資料 / 訊息
- •main:服務(
vos-hosting 自動新增)— 其他外掛新增條目時自動累積
- •bottom:設定 / 密碼 / 登出帳號 / 登出
- •變更:config/mypage-menu.php, mypage-sidebar.php
外掛選單註冊:plugin.json 的 menus.admin / menus.mypage 條目中的 section + position 欄位指定區域。services 選單已從核心 mypage-menu.php → vos-hosting/plugin.json 遷移(自動註冊)。
Added
授權驗證 API 和開發者入口 API 位於核心中,部署到所有 voscms 站點時將對外暴露。兩個 API 已分離為新的僅限總部使用的外掛。
- •
vos-license-server(scope: hq_only):遷移7個授權端點(check, register, verify, stats, updates, register-plugin, _init)
- •
vos-developer(scope: hq_only):遷移7個開發者入口端點(register, login, submit, my-items, earnings, update-version, _init)
- •
api/_plugin_dispatch.php — 核心封裝器在 dispatch 前檢查 rzx_plugins.is_active,未啟用時回傳 404
- •核心
/api/license/.php、/api/developer/.php 僅保留封裝器(維持外部相容性)
- •
/api/notices.php 新增 HQ_HOSTS env 白名單(僅從總部 voscms.com 網域回應)
- •建置腳本(
build-voscms.sh)已排除 api/license、api/developer、api/notices.php、vos-license-manager
Fixed
- •主機合約到期日 +1 天 bug(
+12 months → +12 months -1 second)— 套用於4處:subscription/free/paid/bank
- •企業信箱無法新增2個及以上(選取器誤捕獲了 X 按鈕)
- •訂單摘要中附加儲存未彙總(storage select 缺少
name 屬性)
- •主機方案標籤未多語言化 — 透過
service_hosting_plans._id 與 db_trans() 比對解決
v2.3.8
2026-04-25 · 6個月前
版板多語言完善 + FAQ/Q&A 佈景
Added
_init.php 現在直接從 rzx_translations 查詢 board.{id}.{title|description|header_content|footer_content|seo_keywords|seo_description}(當前語言 → en → 來源語言)。在 list/read/write/settings 任意頁面,$board[$field] 均自動填入翻譯值。版板設定頁面的「← 返回」按鈕也透過相同機制自動翻譯。
為問題回報版板(id=6)的 title + header_content 提供 13 語言種子資料——保留 HTML 結構,僅翻譯文字,處理階段徽章也各語言顯示。種子腳本:scripts/seed_issue_i18n.php + scripts/seed_issue_i18n_data.php。
Added
將 rzx_board_extra_vars 的定義(標籤/描述/選項/預設值)翻譯為 13 種語言。4 個欄位 × 13 = 52 列。
- •
ExtraVarRenderer::renderAll($vars, $values, $mode, $boardId) — 新增 boardId 參數,applyDefTranslations() 單次查詢批次載入所有變數翻譯。
- •
ExtraVarRenderer::getOptionLabel($boardId, $varName, $value) — 清單檢視用單一選項翻譯標籤查詢(靜態快取)。
- •
renderStatusBadge($value, $size, $displayLabel = null) — 顏色保留來源(ko)映射,僅翻譯文字 → 各語言顏色一致(已接收=玫瑰色,已解決=翠綠色)。
- •select/radio/checkbox:
value=來源值 / label=翻譯 模式。儲存文章時始終儲存來源值,確保資料相容性。
- •呼叫方更新:
read.php、write.php、_list-row.php、預設佈景的 _list-card/_list-webzine/_list-gallery。
問題版板 status 擴充變數 13 語言種子:scripts/seed_ev_status_i18n.php。
Added
extra_var_get API 透過 db_trans() 以 localized 物件形式回傳當前語言的翻譯值。JS 強制回應視窗優先顯示 localized.title || ev.title → 日語模式下開啟視窗時自動顯示「処理ステージ」。
extra_var_update 依語言分支:
- •來源語言(ko)→ 更新整個來源列(現有行為)
- •非來源語言(ja/en/…)→ 僅將中繼資料(
var_type/權限/3 個核取方塊)儲存至來源列;4 個翻譯欄位(title/description/options/default_value)以當前語言儲存至 rzx_translations → 來源資料完整性保證
擴充變數清單的顯示名稱也應用 db_trans('board_ev.{boardId}.{varName}.title')。
Added
擴充變數編輯強制回應視窗中的「編輯權限」區域(標籤/下拉選項/說明文字)拆分為 13 語言 lang 檔案。新鍵:site.boards.ev_permission、ev_perm_all、ev_perm_member、ev_perm_admin、ev_permission_help。
Added
擴充變數編輯強制回應視窗中「選項」欄位的雙向正規化:
- •強制回應視窗載入:將 DB JSON 陣列(
["a","b","c"])轉換為換行格式顯示在 textarea 中(與說明一致)
- •儲存 API:
ev_normalize_options() 輔助函式同時接受換行或 JSON 輸入,並統一以 JSON 陣列儲存。修復換行輸入此前被存為 NULL 的問題。
Added
兩款針對問題/公告以外新內容模式的佈景。
FAQ (skins/board/faq/) — 文章=問題,內文=答案。包含搜尋列、分類篩選和分頁。標題區顯示切換、標題/副標題多語言、背景(圖片/影片/無)支援、遮罩透明度調節。v1.0.1。
Q&A (skins/board/qna/) — 文章=問題(標題+內文),留言=答案。未回覆徽章,第一個項目自動展開,樹狀排序(parent_id/depth)留言顯示。回覆的回覆縮排 + "↳ 回覆"標籤(最上層為 "A.")。內嵌編輯/回覆表單(僅作者/管理員可編輯,perm_comment 權限者可回覆)。v1.0.0。
兩款佈景共同特性:管理員設定齒輪圖示置於搜尋列右下方(與標題區分離)。boardSkinFile() 以 _list-full.php 優先執行。
Added
api-comments.php 新增 update 操作。僅 comment.user_id == 當前使用者 或管理員可編輯。字元數驗證後更新 content + updated_at。
Added
版面設定 copyright 欄位中的 {year} 標記在渲染時自動替換為當前年份。DB 保留原始內容(含 {year}),無需每年手動更新。適用於:default/minimal/modern/base-footer.php。4 個 layout.json 的版權說明擴充至 13 種語言,並以各自母語顯示 {year} 使用說明。
同時修復 default/minimal 頁尾忽略 $_lc['copyright'] 的問題——版面設定值現在真正被渲染。
Added
menu_item.38.title 13 語言種子(VosCMS 介紹 / About VosCMS / VosCMSについて / Über VosCMS / Acerca de VosCMS / À propos de VosCMS / Tentang VosCMS / VosCMS-ийн тухай / О VosCMS / VosCMS Hakkında / Giới thiệu VosCMS / 关于 VosCMS / 關於 VosCMS)。
Added
每個處理階段各一個樣本 + 1 個已解決的現有樣本 = 共 4 個。每篇文章的標題/內容翻譯為 13 種語言(104 列)。
| 階段 | 標題(ko) | 狀態 |
|---|
| 已接收 | [Bug] 行動版漢堡選單 X 按鈕無法點擊 | 新增 |
| 確認中 | [功能請求] 留言時向文章作者傳送郵件通知 | 新增 |
| 進行中 | [效能] 改善市場詳情頁首次載入速度 | 新增 |
| 已解決 | 版板中附加的圖片插入至內文… | 現有 |
刪除現有 post 34(積累 Tailwind 內聯樣式的測試文章)。
Fixed
customer/board/list.php 在第 167 行 require 了 rzx_admin_icons 輔助函式,但第 161 行的佈景檔案 include 透過 return 提前離開——導致 FAQ/Q&A 佈景中呼叫 rzx_admin_icons() 時出現 500 錯誤。已將 require_once 移至佈景 include 之前。
Changed
刪除殘留的舊名稱 /marketplace 引用。修復搜尋表單透過GET提交到 /marketplace 導致跳轉至儀表板的問題(搜尋/排序/篩選變更時頁面離開)。將 browse.php、item-detail.php、item-submit.php、purchases.php、assets/js/marketplace.js 全部統一到 /autoinstall。
Added
在 install.php 第4步管理員路徑輸入框下方新增黃色提示 + URL即時預覽 + 可展開的「為什麼需要更改?」說明。以一般人能理解的語言提供3個理由:自動化入侵嘗試(暴力破解)、漏洞掃描、強密碼的限制。已套用至全部13種語言。
Added
在 install.php 安裝完成步驟中,自動註冊並啟用 vos-autoinstall 外掛(直接呼叫 PluginManager::install())。使用者進入管理員介面後無需單獨安裝即可立即使用市場。
Added
為 market.21ces.com/api/market/catalog 和 /item 新增 ?locale=xx 參數支援。name、description、short_description、cat_name 的多語言JSON由伺服器端以單一字串返回(回退:請求的locale → en → 第一個值)。刪除VosCMS端所有重複的 json_decode + locale回退 邏輯(browse.php、item-detail.php、_components/item-card.php)。
Added
將檔案快取市場API回應的TTL統一整合至PluginManager設定中管理。硬編碼30分鐘 → 預設5分鐘,提供1/5/10/30/60分鐘選項。https://vos.21ces.com/theadmin/settings/general 市場快取區域與 /theadmin/autoinstall/settings 讀寫同一設定,自動同步。在自動安裝頁面右上角和通用設定頁面均新增立即重新整理快取按鈕。更改TTL時自動使現有快取失效。
Added
在頁首之後立即顯示與市場管理員相同的資料類型 / 簡介 / Slug / Product Key / 最低VosCMS和PHP版本 / 合作夥伴 / 價格 / 授權表格。將內容區域左:右比例從2:1調整為3:1以擴大內容區域。
Added
在詳情頁面評論分頁右上角新增「撰寫評論」按鈕。星級/暱稱/內文輸入強制回應視窗 → VosCMS API → 轉發至市場 POST /api/market/item/review。自動附上VosCMS授權金鑰 + 網域,同一網域僅限提交一次,購買者自動設定 is_verified=1。評論以 status='pending' 狀態儲存至市場資料庫(rzx_mkt_reviews),運營者審核後公開。新建 GET /api/market/item/reviews?slug=... 端點僅返回已審核的評論。網域進行部分遮蔽顯示(mys***.com)。
Added
將原來的 僅免費 核取方塊 → 擴展為 全部 / 免費 / 付費 三向切換。向市場目錄API新增 paid=1 參數(i.price>0)。從搜尋列分離並移至檢視切換區域前方,與排序下拉框一起整合為標題工具列。
Changed
搜尋輸入框邊框 border-2 border-emerald-300,左側搜尋圖示新增綠色背景框,搜尋按鈕 bg-emerald-500。僅保留關鍵字輸入,將排序和篩選功能移至內容標題區,簡化搜尋列。
Changed
| 狀態 | 顯示 |
|---|
| 免費 | 安裝 + 下載 |
| 付費(未購買) | 購買(市場PAY.JP付款強制回應視窗) |
| 付費(已購買) | 安裝 + 下載 |
| 已安裝 | "已安裝" |
相同分支套用於列表頁面的4種檢視(清單/雜誌/卡片/格狀)。進入頁面時一次性查詢已購買的slug集合並重複使用。付款由市場 POST /api/market/item/purchase 處理,執行PAY.JP扣款 + 授權發行。
Changed
- •檢視樣式切換:移除文字標籤 → 僅圖示 +
title / aria-label(保持可及性)
- •類型徽章:
bg-<color>-100 淺色背景 → bg-zinc-900/85 backdrop-blur-sm 深色半透明 + 彩色文字(提升圖片上的可讀性)
- •截圖區域:從標頭後立即顯示 → 移至分頁內容下方,如市場般顯示
(數量) 計數
- •詳情頁
dark:prose-invert 無效 → 在CDN Tailwind中新增typography外掛
- •詳情頁描述區域:採用與市場管理員相同的方式,僅移除
<script>/<iframe>/<style>/onXX 等危險元素,HTML標記原樣渲染
Fixed
- •PAY.JP卡片表單無法輸入:在隱藏狀態下提前掛載導致iframe以0px渲染。透過懶加載初始化 +
requestAnimationFrame 掛載解決
- •小工具縮圖缺失:市場資料庫已註冊28個小工具,但
/var/www/market/widgets/ 中僅複製了12個免費小工具。同步了14個缺失的小工具。在catalog/item API中為 screenshots 新增絕對URL轉換 + 不存在檔案的自動過濾
- •Bundle外掛未授權警告:
vos-autoinstall 被識別為 unauthorizedPlugins。向 LicenseStatus.php 新增 BUNDLE_PLUGINS = ['vos-autoinstall', 'vos-marketplace'] 常數,在 active()/fromCache()/canUsePlugin() 全部套用過濾。授權伺服器 verify.php 也進行了相同處理
- •小工具可能重複新增:
install.php 的seeding只使用了 INSERT IGNORE,但 rzx_page_widgets 沒有UNIQUE約束,因此可能出現重複。改為在INSERT前執行 DELETE FROM page_widgets WHERE page_slug='home'(由於存在版塊小工具等需要故意重複的情況,不新增DB UNIQUE約束)
Migration Notes
- •
vos-autoinstall 外掛的選單/路由/遷移在全新安裝時自動啟用(現有安裝需在管理員面板手動啟用一次)
- •市場API快取預設TTL:30分鐘 → 5分鐘(使價格/內容變更更快生效)
- •
vos-autoinstall.cache_ttl 外掛設定為新增
v2.3.6
2026-04-21 · 6個月前
市場 API 即時串接
Changed
- •
browse.php:從本地 DB 查詢切換為呼叫 market.21ces.com/api/market/catalog 即時 API
- •
item-detail.php:從本地 DB 切換為呼叫 /api/market/item 和 /api/market/item/versions API
- •
CatalogClient.php:API 基礎 URL 從 /api/v1 → /api/market,回應欄位 items[] → data[] 對齊
Fixed
問題: market.21ces.com/index.php 中版面套用區塊未處理 $__noLayout = true 情況,導致所有外掛 API 路由(api/market/*)回傳 HTTP 200 + 空回應。
修正: 在 index.php 末尾新增 elseif ($__pageFile && $__noLayout) { include $__pageFile; }。api/market/catalog、api/market/item、api/market/updates/check 等已恢復正常。
Added
為 plugins/vos-market/views/api/catalog.php 新增 sort、free、featured 參數,並擴充回應欄位(sale_price、rating_avg、is_featured 等)。
Added
mpApiFetch() 輔助函式:透過 30 分鐘 TTL 檔案快取將對市場伺服器的請求降至最低。API 回應失敗時顯示錯誤提示橫幅。
v2.3.5
2026-04-21 · 6個月前
自動授權憑證註冊邏輯完成
Fixed
問題: 在 AdminRouter 中,建立 $licenseClient = new LicenseClient() 實例並嘗試自動註冊後,$_ENV['LICENSE_KEY'] 的更新未反映到實例內部的 $this->licenseKey 中——導致同一請求中呼叫 check() 時仍回傳 unregistered。
Changed
- •進入
check() 時,若 $this->licenseKey 為空,立即呼叫 /api/license/register
- •成功時:更新
$this->licenseKey + 更新 $_ENV['LICENSE_KEY'] + 儲存 .env 檔案,然後繼續 verify 步驟
- •僅在失敗時(伺服器無回應)回傳
unregistered
- •新增
saveKeyToEnv() 方法:將空的 LICENSE_KEY= 列(install.php 失敗情形)替換為實際金鑰;若已存在有效金鑰則略過
效果
- •未經 install.php 手動安裝的使用者 → 首次進入管理後台時自動註冊授權憑證
- •從舊版本升級的使用者(無 LICENSE_KEY)→ 升級後首次進入管理後台時自動註冊
- •儀表板的「授權憑證未註冊」提示現在僅在授權憑證伺服器本身無法連線時才顯示
v2.3.4
2026-04-20 · 6個月前
內容污染清理 + 卡片式 CSS 移除
Fixed
database/seeds/legal_pages.php 種子檔案中,Tailwind CSS 變數(--tw-scale-x、--tw-pan-x 等,400 餘個)被內嵌在每個 <h1>/<h2>/<p> 標籤的 style="" 屬性中。每次安裝都將這些污染傳播到資料庫,導致 terms 和 privacy 頁面急劇膨脹(尤其是 privacy/ko 達到 128KB,正常應為 2KB)。
- •
database/seeds/legal_pages.php:442KB → 131KB(減少 70%,語法有效)
- •清理開發資料庫中已污染的 26 行:1.04MB → 56KB(移除 988KB,−95%)
- •新增
scripts/clean-inline-styles.php — style="... --tw-* ..." 批次清理工具(如問題再發可重複使用)
Changed
.board-content CSS 包含將每個文件頁面強制轉換的規則,將「h2 視為卡片標題,h2+p 視為卡片內容」。這破壞了直接以 Tailwind 設計的頁面(如 Brand)的 hero 結構。
- •刪除 103 行卡片式區塊規則(149 → 45 行)
- •保留的規則:基礎排版(p/h·/blockquote/code/ul/ol/table)、OG 連結卡片、深色模式文字覆蓋
- •結果:
Brand 頁面原始設計恢復(左側藍線 h2、置中 hero 等)
- •法律文件(terms/privacy 等)使用標準
<h1><h2><p> 排版已足夠 — 卡片樣式是過度裝飾
v2.3.3
2026-04-20 · 6個月前
頁面翻譯結構回滾(回歸單一資料表)
Changed
決策背景:2.3.1 中將頁面內容拆分為韓語原文的 rzx_page_contents 和非韓語的 rzx_translations,2.3.2 中在編輯器新增了獨立儲存路徑。然而,重新審視設計後發現兩個資料表的實際結構完全相同(slug/key + locale + content),卻帶來了以下額外成本:
- •韓語原文在兩個資料表中重複儲存(用於 db_trans fallback 鏈鏡像)
- •編輯器儲存邏輯需要對 ko vs. 非 ko 進行分支處理
- •在頁面管理介面顯示 locale 狀態時需要對兩個資料表進行 JOIN
- •最初的理由(「AI 翻譯流水線統一佇列」)實際價值有限——長頁面本文 HTML(10KB)與短 UI 字串(20 位元組)需要不同的工作流程(分片切割、標籤保留等),整合意義不大
還原的結構:單一 rzx_page_contents 資料表,每個 locale 一列(原始設計)
Migration
- •
rzx_translations.page.{slug}.title/content × 7 個 slug × 12 個非 ko locale(168 列)→ 還原至 rzx_page_contents
- •從
rzx_translations 中刪除所有 page.* 鍵(234 列)
- •對象:Brand、terms、privacy、refund-policy、tokushoho、funds-settlement、data-policy
- •同時套用至開發資料庫和正式環境資料庫
Changed
- •
resources/views/admin/site/pages-edit-content.php — 移除 ko/非ko 分支,改為簡單 UPSERT
- •
resources/views/admin/site/pages-document.php — 同上
- •
resources/views/customer/page.php — 移除 db_trans('page.*.title/content'),直接讀取 page_contents(保留 fallback 鏈 locale → en → ko)
- •
resources/views/admin/site/pages.php — 頁面清單標題也直接從 page_contents.title 讀取
Kept
rzx_translations 本身保留 — 繼續用於以下用途:
- •討論板(
board_post.{id}.title/content)
- •UI 字串(
menu.*、設定標籤)
- •頁面 SEO 中繼資料(
page.{slug}.browser_title|meta_keywords|meta_description)— 字串較短,存放此處合適
原則:短 UI/中繼資料字串 → rzx_translations;長頁面本文內容 → rzx_page_contents,根據資料特性分開儲存。
v2.3.2
2026-04-20 · 6個月前
頁面編輯器翻譯 DB 儲存邏輯對齊
Changed
2.3.1 將頁面內容儲存結構遷移至原始 ko(rzx_page_contents)+ 翻譯 DB(rzx_translations)之後,管理員編輯器仍僅向 rzx_page_contents 進行 INSERT/UPDATE——導致與遷移格式不一致,渲染端 db_trans() 查詢失敗。本版本修復此問題。
分支規則(來源語言環境 = $_ENV['DEFAULT_LOCALE'] ?? 'ko'):
| locale | 儲存路徑 |
|---|
ko(來源) | rzx_page_contents + 鏡像至 rzx_translations(db_trans() 備援用) |
en/ja/zh_CN/... | 僅 rzx_translations(page.{slug}.title、page.{slug}.content) |
儲存非來源語言環境時,若 rzx_page_contents 中無來源列,自動建立 stub 列(保留選單/設定連結)。is_active 統一套用至來源列。
Changed
開啟非來源語言環境編輯頁面時:
1. 先從 rzx_translations 查詢 page.{slug}.title/content + locale
2. 未找到則退回至舊版 rzx_page_contents 列(相容遷移遺漏的頁面)
來源語言環境仍與以往相同,只用 rzx_page_contents。
Changed
- •頁面刪除:同時刪除
rzx_translations WHERE lang_key LIKE 'page.{slug}.%'
- •slug 變更:批次 UPDATE
rzx_translations.lang_key 中 page.{old_slug}. → page.{new_slug}.
Changed
以往在 rzx_page_contents 中按 locale 分別儲存完整內容列的方式,已統一為 原始 ko + 翻譯資料庫(rzx_translations) 方案。與版塊(board_post.*)的儲存結構保持一致。
目標7個頁面:Brand, terms, privacy, refund-policy, tokushoho, funds-settlement, data-policy
Before:
rzx_page_contents
├── Brand / ko (完整內容)
├── Brand / en (完整內容)
├── ... (13個 locale 列)
After:
rzx_page_contents
└── Brand / ko (原始 1 列)
rzx_translations
├── page.Brand.title × 13 locale (含 ko)
└── page.Brand.content × 13 locale
遷移結果:
- •
rzx_page_contents:7個slug × 12條非ko列 = 84列已刪除
- •
rzx_translations:7個slug × 13個locale × (title + content) = 182列已遷移
- •已套用至開發與正式資料庫,渲染驗證通過(ko/en等各locale均正常顯示)
Changed
- •移除「新建頁面」標頭按鈕 — 原本是無效的佔位符。頁面由選單管理建立,是唯一的資料來源。
- •移除垃圾桶🗑圖示 + AJAX處理程式 +
deleteUserPage() JS — 刪除選單時會一起清理頁面,因此不需要獨立的頁面刪除路徑。防止因誤刪導致選單損壞。
- •保留:設定 ⚙ · 編輯 ✏ · 預覽 👁 圖示
Fixed
- •
設定 > 網站 > Logo圖片 上傳失敗:因缺少 storage/logos/ 子目錄導致 move_uploaded_file() 靜默失敗。在上傳處理器中新增子目錄自動建立,並在開發與正式伺服器上建立目錄(www-data:www-data,775)。
- •恢復版面配置Logo優先順序:曾短暫改為「網站設定優先」,後根據「各版面配置使用專屬Logo」的需求恢復為 版面配置 > 網站回退。版面配置未設定Logo時自動使用網站Logo。
- •涉及:
skins/layouts/{default, minimal, modern, modern-copy-260413}/header.php 及 footer.php
Fixed
- •保留
bi-guide / logo-guide slug 重複列中最早建立的一筆(id=186, 187),刪除重複的 id=193, 194
- •已套用於開發與正式環境。選單API的重複INSERT問題已在v2.3.0中修復
Added
在 /var/www/_upload/ 建立了Logo資產 — 按需上傳至正式環境:
圖示(僅標誌)
- •
voscms-logo-color-{256,512,1024}.png · 彩色(deep·ocean·sky·ocean + 中心deep)
- •
voscms-logo-mono-{256,512,1024}.png · sky純色 + 透明度 1/0.7/0.48/0.7 漸層
橫向字標(用於頁首)— 820×256 比例
- •
voscms-wordmark-{128h,256h,512h}.png · 淺色(Vos deep + CMS灰色)
- •
voscms-wordmark-dark-{128h,256h,512h}.png · 深色(Vos sky + CMS slate-300)
縱向字標(用於應用程式圖示 / OG圖片)— 360×420 比例
- •
voscms-stacked-light-{256h,512h,1024h}.png
- •
voscms-stacked-dark-{256h,512h,1024h}.png
所有SVG原始檔均已保留。已安裝 librsvg2-bin,提供 rsvg-convert CLI。OKLCH顏色支援問題透過十六進位轉換版(voscms-logo-mono-hex.svg)解決。
v2.3.0
2026-04-20 · 6個月前
頁面設定分頁重構 + Changelog 系統
Added
- •DB 資料表
rzx_changelog 新增 — 按版本 × locale 獨立儲存記錄,追蹤 translation_source(original/ai/manual)+ source_hash
- •解析器
RzxLib\Core\Changelog\ChangelogParser — Keep a Changelog 標準 + 內部區塊白名單(Infrastructure/Internal/Refactor/Chore/Docs/Test 為私有)
- •匯入器
ChangelogImporter — 冪等合併,保護手動翻譯,透過 content_hash 僅偵測變更
- •CLI 指令碼
scripts/import-changelog.php — --file --locale --dry-run --silent 選項,支援 SemVer 預發布版本(2.1.1-hotfix)
- •翻譯介面
RzxLib\Core\Translate\{TranslatorInterface, NullTranslator, TranslatorFactory} — Gemma 4(ai.21ces.com)GPU 就緒後,只需修改 config/translator.php 的 driver 即可啟用
- •系統頁面
/changelog 已註冊(config/system-pages.php),前端檢視 resources/views/system/changelog/index.php
- •專屬佈景主題
skins/page/changelog/skin.json — 卡片樣式(filled/outlined/flat)、按區塊配色、版本徽章、日期格式、相對時間顯示、內部區塊可見性開關
- •編輯頁面
/changelog/edit 獨立拆分 — MD 上傳預覽、多語言覆蓋矩陣、按版本切換/刪除、AI 翻譯按鈕(即將推出)
- •部署自動化 —
deploy-voscms.sh 新增 1.5/5 Changelog import 步驟:自動偵測並合併 ko + 12 個 locale 的 .md 檔案
- •翻譯鍵
site.pages.changelog 已為 13 個 locale 新增
Changed
- •分頁順序調整:
[基本資訊] [權限] [進階設定] [佈景主題] — 系統頁面可在末尾追加自己的分頁
- •引入
settings_tabs 架構(config/system-pages.php)— 系統頁面宣告頂層分頁陣列,各條目透過 key/label/icon/view 動態渲染。移除原有 settings_view 底部 include 遺留程式碼
- •原則確立:設定 = 外觀 + 功能 / 編輯 = 資料 — 上傳、版本、翻譯等資料管理介面統一遷至
/changelog/edit
- •MERGE 儲存策略 —
save_settings 處理器與現有設定合併,即使分頁拆分也不會清除其他分頁的資料
- •
saveSettings() JS — 僅提交 DOM 中存在的欄位,在部分欄位未渲染的分離分頁環境中安全可靠
- •版面/佈景主題卡片位置 — 回歸基本資訊分頁(依據使用者回饋),佈景主題分頁專屬負責 skin.json 變數
- •去除頁面寬度重複 — 基本資訊分頁中刪除
page_width 欄位(合併至佈景主題的 content_width)
- •service/order 二級子分頁平鋪 —
config/service-settings-tabs.php 中的 general/domain/hosting/addons 遷移至 settings_tabs,提升為頂層分頁
Changed
- •
/{slug}/settings 和 /{slug}/edit 現已識別 config/system-pages.php — 此前僅查詢 rzx_page_contents DB,導致系統頁面回傳 404。現按 DB → config 順序查詢
- •新增
edit_view 欄位 — 直接指定系統頁面專屬編輯檢視的檔案路徑。點擊 /{slug}/edit 時直接 include 對應檢視(移除管理員重新導向跳轉)
- •pages-settings.php 回退機制 — 無 DB 記錄的系統頁面也從 config 建構
$pageData,防止跳轉至頁面管理列表
- •管理員圖示 URL 統一 —
/{slug}/settings、/{slug}/edit 使用前端標準 URL
Fixed
- •
menus-api.php:修復 external 頁面類型 INSERT 前缺少重複檢查 — 防止選單儲存兩次時 rzx_page_contents 產生重複列
- •修復刪除選單時 external 類型 + widget 的
page_contents 清理遺漏 — 防止產生孤立記錄
Fixed
- •標題背景(
title_bg_type、title_bg_image、title_bg_video、title_bg_overlay、title_text_color)、show_title、show_breadcrumb、custom_css、custom_header_html、custom_footer_html — 所有標準頁面佈景主題變數現已反映至公開檢視
- •
_page-title-bg.php partial 現接受 $_contentWidth 變數 — 標題區域跟隨內容寬度
- •管理員圖示與標題分離 — 獨立置於內容區域右上角;即使
show_title=0 也始終顯示
- •標題區域上方新增 20px 間距(背景版面均衡)
Added
- •
site.pages.contact 翻譯鍵已為 13 個 locale 新增(ko/en/ja/zh_CN/zh_TW/de/es/fr/id/mn/ru/tr/vi)— 解決原先遺漏
- •頁面管理系統指南
docs/PAGE_ADMIN_GUIDE.md 新增 — 整理分頁結構、架構、路由、權限及擴充方式
v2.2.2
2026-04-19 · 6個月前
統計小工具改進 + 管理員頂欄修復
Added
- •每個項目的數字、後綴、標籤(多語言)、圖示和顏色欄位
- •管理員小工具建構器支援項目的新增/編輯/刪除(新增
stat_items 類型編輯介面)
- •16 種圖示(users, chart, star, heart, check-circle, clock, calendar, globe, shield, lightning, trophy, cart, dollar, building, chat)+ 10 種顏色選項
- •進入視口時的數字滾動動畫 — IntersectionObserver + easeOutCubic 1.4s
- •僅對數值進行計數(
24/7 等字串原樣顯示),保留逗號格式和小數點
- •
widget.json v1.1.0 → v1.2.0
Fixed
- •修復
admin_name 以 enc: 前綴儲存且未解密直接顯示的問題
- •修復頭像查詢錯誤地 LEFT JOIN 不存在的
staff 資料表的問題 — 現根據 admin_id = users.id 統一結構直接查詢 rzx_users.profile_image
- •自動為相對路徑頭像添加 baseUrl 前綴
v2.2.1
2026-04-19 · 6個月前
URL 截圖(縮圖 / 全頁截圖)
Added
- •所有板塊的每個
<input type="url"> 欄位(包括延伸變數 url 類型)旁自動插入 [取得縮圖] [取得截圖] 按鈕
- •縮圖:原生渲染 1280×960 → 800×600 輸出(首屏視口)
- •截圖:原生渲染 1280×全頁 → 800×縮放 輸出(完整捲動頁面,使用實際頁面高度)
- •逐步進度條介面 —
連線伺服器 → 載入頁面 → 擷取畫面 → 產生圖片 → 儲存檔案 → 等待回應
- •自動將擷取的縮圖設為封面圖 — 標記為
board_files.is_primary=1,board-showcase 小工具優先使用
- •新路由
/board/api/url-capture?type={thumbnail|screenshot}&url=... + api-url-capture.php 代理
- •向
/board/api/files 新增 set_primary 操作 — 將現有附件之一指定為封面圖
Changed
- •附件圖片查詢
ORDER BY is_primary DESC, id ASC — 擷取的縮圖優先顯示
- •建立文章時透過
primary_file_pos 參數向伺服器傳遞封面檔案索引
v2.2.0
2026-04-18 · 6個月前
Marketplace 分離
Changed
- •Marketplace 產品分離:
plugins/vos-marketplace/ 外掛原本共用的功能已拆分為獨立產品 → github.com/THEVOSjp/Marketplace 新儲存庫,在 market.21ces.com 獨立部署
- •外掛僅保留「面向客戶的 UI(瀏覽、購買、安裝、授權)」——資料、賣家與結算由 marketplace 伺服器專責處理
- •Core 側 API 整合端點已更新
Added
- •選擇語言後顯示模態視窗 — 提示需要備份
.env + 資料庫 + storage/uploads/,以及 APP_KEY 遺失後將無法解密的警告
- •兩步確認:核取方塊 + 確認按鈕(禁止無條件安裝)
- •為所有 13 種語言新增完整翻譯(
backup_title/body/item_env/db/uploads/warn/check/confirm/cancel)
Added
- •
scripts/register-widgets-to-marketplace.php — 將 28 個以檔案為基礎的 widget 批次註冊至 rzx_mp_items
Changed
- •
plugins/vos-marketplace/src/CatalogClient.php — 預設 API URL 改為 https://market.21ces.com/api/v1,fetchItem() 路徑更新,checkUpdates() 查詢格式更新
- •
plugins/vos-marketplace/plugin.json — marketplace_api_url 預設值更新
- •
rzxlib/Core/Modules/WidgetLoader.php — 縮圖 URL 現在包含快取破壞參數 ?v={mtime}(因應 Cloudflare immutable 快取)
Fixed
- •
widgets/feature-tour/widget.json — 欄位整理
- •部分 widget 縮圖已更新(staff、testimonials、feature-tour、shop-map、shop-ranking、stylebook)
Added
- •contact-info (v0.1.0) — 聯絡卡(地址/電話/信箱/營業時間 + 圖片 + 小地圖)
- •location-map (v0.1.0) — 橫向地圖(Google Maps + 下方3欄資訊,可調整寬度)
Added
- •項目提交頁面全面重構 — 3個分頁(基本資訊 / 發布 / 銷售)
- •授權(GPL/LGPL/BSD/MIT/CC/PD/商業)、倉庫URL、演示URL、相依套件、橫幅圖片
- •發布歷史、銷售資訊(公開/付費切換、折扣價/截止日期)、UX改進
Added
- •開發者選單(ID:20)支援13種語言,Hero CTA的description/typing_words補充12種語言
Changed
- •明確小工具名稱區分(地圖 / 聯絡卡),
page.php 新增fullWidthTypes
- •contact-form分類 → 僅標籤(刪除程式碼,小工具設定可編輯)
Fixed
- •board-contents/board-showcase: file_type → mime_type
- •boards-api: 缺少is_shown_in_list + options JSON約束
- •contact-form POST: 完全清空ob緩衝區
- •Hero CTA: typing_words/description的
\n 雙重跳脫
DB Changes
- •rzx_mp_items: 新增license, repo_url, demo_url
- •rzx_board_extra_vars: 新增is_shown_in_list
- •rzx_contact_messages: 新資料表
Added
- •download-hero 小工具 — 軟體下載頁面(即時與 version.json 聯動,內建 4 種語言,主要功能 / 系統需求 / 版本歷史)
- •/downloads 頁面 — widget 類型系統頁面,13 種語言選單翻譯,
is_system=1
- •contact-form 小工具(v0.1.0)— 私密 1:1 諮詢表單小工具(支援訪客提交,分類選擇,蜜罐防垃圾郵件,AJAX 提交)
- •contact-info 小工具 — 聯絡資訊展示小工具
- •location-map 小工具 — 位置地圖小工具
- •rzx_send_mail() 公用輔助函式 — 在
rzxlib/Core/Helpers/mail.php 新增 SMTP 郵件發送函式
- •rzx_contact_messages 表 — 用於儲存諮詢內容的資料庫表
- •/contact 頁面 — widget 類型系統頁面,13 種語言選單翻譯
Fixed
- •系統頁面刪除保護 — 從選單中刪除系統頁面時,保留頁面內容/小工具(僅移除選單項目)
- •
menus-api.php:透過 DB is_system + config/system-pages.php slug 雙重驗證
- •
menus-js.php:刪除系統頁面時顯示「僅從選單中移除」的提示
- •系統頁面選單多語言 — 將系統頁面加入選單時,自動從
site.pages.* 翻譯鍵註冊 13 種語言標籤
- •下載頁面翻譯 — 新增
site.pages.downloads 的 13 種語言翻譯
Changed
- •首頁 Hero — 下載按鈕 → 直接下載
/download/voscms-latest.zip,版本更新至 v2.1.1
- •Auth.php — 優先呼叫公用輔助函式
rzx_send_mail(),保留 sendSmtpMail 作為後備
- •index.php — 新增
mail.php 輔助函式的自動載入
Changed
- •主機代管標籤頁 — 摘要卡片 + 用量進度條 + FTP/資料庫連線資訊表(管理員設定後自動顯示)
- •網域標籤頁 — 網域卡片 + 主要設定 + 名稱伺服器資訊表(管理員設定後自動顯示)
- •郵件標籤頁 — 郵件伺服器資訊(IMAP/SMTP)+ 按帳戶卡片 + 內嵌密碼變更
- •維護標籤頁 — 資訊卡片 + 排程日期 + 工作歷史(管理員記錄後自動顯示)
- •附加服務標籤頁 — 統一卡片版面
- •與管理員 partial 統一為相同的資訊結構(管理員在 metadata 中輸入 → 自動反映至我的頁面)
Changed
- •活動日誌區域從 1/3 縮小至 1/5 比例
- •移除管理員網域標籤頁中 NS 預設值的硬編碼(為 Cloudflare API 整合做準備)
Changed
- •佈建工作流程全面改版:子網域優先 → 購買網域隨後連接
- •佈建 ID 規則:子網域名稱或購買網域的 SLD
- •利用 Cloudflare 萬用字元通道(無需新增子網域 A 記錄)
- •伺服器 2 磁碟配置變更:NVMe 256 GB + SSD 2 TB + HDD 8 TB 三碟體制
Added
- •服務分類體系 — 新增
service_class 欄位(recurring/one_time/free),completed_at 一次性服務完成日期
- •我的頁面服務詳情 —
/mypage/services/{order} 依類型管理分頁(主機/網域/郵件/維護/加值服務)
- •服務管理 API —
api/service-manage.php(自動續期開關、續期申請、主網域設定、郵件密碼修改)
- •管理員訂單管理 —
/admin/service-orders 訂單清單 + 詳情頁,一次性狀態強制回應視窗(已接收/處理中/暫掛/已取消/已完成)
- •管理員選單 — 側邊欄新增「服務訂單」選單(position: 65)
Added
- •phone-display — 電話號碼顯示元件(伺服器端
format_phone() 輔助函式),無 JS 相依
- •format_phone() — PHP 國際電話號碼格式化函式(韓國/日本/美國/中國/英國/法國/德國/澳洲等)
- •免費網域設定 — 在管理員設定中管理免費子網域清單(
service_free_domains),支援多網域選擇
Fixed
- •免費服務訂閱缺失 — 免費訂單未為網域/加值/維護等建立訂閱記錄 → 重構為批次建立所有服務
- •付款區塊條款同意 — 免費訂單時條款核取方塊隨付款區塊一起隱藏 → 分離至區塊外部
- •updateSubmitButton isFree 判斷 —
btn.closest('form') NULL → 以 document.querySelector 修正
- •管理員側邊欄活動指示 —
$adminPath 未定義導致所有選單不活動 → 新增變數宣告
- •我的頁面頭像 — services.php/service-detail.php 中缺少
use Auth + $user = Auth::user()
- •加值服務一次性檢查 — 管理員設定中的
one_time 旗標現在在下單時正確反映到 service_class
- •一次性服務初始狀態 — 改為建立時狀態為
pending(已接收)而非 active
Changed
- •訂單 API 重構 — 將 3 種付款路徑(免費/刷卡/轉帳)的訂閱建立程式碼整合為共用函式
$subscriptionData + _insertSubscriptions()
- •服務清單 UI — 內嵌展開 → 卡片連結 + 獨立詳情頁
- •電話號碼顯示 — 在個人資料/會員清單/員工清單中套用
format_phone()
- •免費網域動態化 —
.21ces.net 硬編碼 → 參照管理員設定值
v2.1.1-hotfix
2026-04-16 · 6個月前
Fixed
- •頁尾選單 404 錯誤 —
rzx_page_contents 表中缺少法律文件頁面資料(terms、privacy、refund-policy、data-policy、tokushoho、funds-settlement)→ 從測試資料庫還原
- •Widget 建構器圖片/影片上傳失敗 — 修復前端包裝器(
page-widget-builder.php)的 FormData POST 未傳遞至 AJAX 處理器的問題(新增檔案上傳條件 + ob_end_clean/exit 處理)
- •上傳目錄權限 — 將
storage/uploads/widgets/ 的擁有者改為 www-data,以授予 PHP-FPM 寫入權限
Added
- •服務申請選單多語言 — 在
rzx_translations 表中新增 menu_item.19.title 的 13 種語言翻譯
- •Hero CTA Widget 多語言 — 為 Dev 頁面 Hero 橫幅的 title、subtitle 和 button text 套用 13 種語言翻譯
- •上傳狀態預覽 — 圖片/影片上傳時新增視覺化回饋:處理中(載入動畫)、成功(打勾)和失敗(錯誤訊息)
Added
- •第0步語言選擇界面 — 安裝開始前從13種語言中選擇;此後整個UI以所選語言顯示
- •安裝翻譯檔案分離 —
resources/lang/install.php(13種語言 × 45個字串)
- •會員等級多語言 — Normal/Silver/Gold/VIP自動生成13種語言翻譯
Added
- •config/admin-menu.php — 核心管理員選單分離到設定檔(Core更新時保留)
- •admin-sidebar.php 重構 — 731行寫死 → ~200行動態渲染器(基於config + plugin.json)
- •vos-shop plugin.json — 寫死選單遷移到
menus.admin 格式
Added
- •側滑選單 — 行動端:頭像+姓名切換列 → 左側滑入遮罩(300ms ease-out)
- •漸隱暗化背景 — 點擊背景或X按鈕關閉;body捲動鎖定
Added
- •force_locale — 強制套用預設語言(
?lang=xx 參數允許使用者更改)
- •default_language — install.php ↔ Translator設定鍵統一
- •URL參數 —
?lang=xx 優先偵測,儲存至工作階段/Cookie
Fixed
- •FAQ佈景主題未套用 — 遷移SQL在install.php之前對預設版塊執行了裸
INSERT,導致INSERT IGNORE被靜默忽略;已修復
- •translations表缺少source_locale — 核心遷移缺少欄位 → db_trans()完全失敗 → 使用者資訊/選單/多語言不顯示;已修復
- •設定標籤側邊欄活動指示 — 新增
route_prefix屬性,使設定選單在所有設定子路由中保持活動狀態
- •安裝工作階段殘留錯誤 — 沒有.env的全新安裝中,殘留的PHP工作階段導致第0步被跳過;已修復
- •nginx 403 — admin/實體目錄與路由的衝突已修復(移除
try_files $uri/)
- •混淆腳本版本寫死 — obfuscate.php現在從version.json動態讀取版本
Changed
- •網格/board-contents小工具多語言檢視 — 新增rzx_translations查詢(目前語言環境 → 英語回退)
- •站點行業分類 — 從15個擴展到26個(新增:企業、購物中心、法律、會計、IT、媒體等;13種語言)
- •網格小工具設定 — grid-section的render.php更改為原生儲存格類型(
board-list);13種語言標題
- •第4步語言選擇 — 從5種擴展到13種語言;以安裝語言預先填入
- •時區選擇 — 擴展到涵蓋13語言使用者地區的12個時區
v1.26.0
2026-04-01 · 7個月前
Added
- •服務選擇頁面頂部以3欄展示套餐(組合)服務 — 用琥珀色主題與單項服務進行視覺區分
- •SET 徽章、活動折扣標籤、包含的服務名稱、套餐價格、原價劃線、折扣率顯示
- •選擇套餐後自動選取所有包含的服務(價格按套餐價計算)
- •套餐中包含的服務不可單獨切換(防止錯誤價格計算)
- •指定模式:透過
rzx_staff_bundles 表依員工篩選套餐
- •將
bundles 參數傳遞至確認頁面
- •多語言支援:已為13種語言新增與套餐相關的自助終端翻譯鍵
Added
- •視圖切換按鈕 — 頂部列的
[月] [週] [日] 切換(啟用狀態:藍色)
- •週視圖 — 左側縱軸 = 星期,頂部橫軸 = 時間軸
- •水平捲動,預約區塊以時間條形式顯示
- •泳道演算法:偵測時間重疊後自動向下排列,列高可變
- •左側邊欄 ↔ 表格垂直捲動同步
- •日視圖 — 橫向 = 時間軸,縱向 = 泳道(與週視圖相同方法)
- •基於營業時間的時間範圍 — 依據
business_hour_start/business_hour_end 設定;範圍外的預約自動擴展
- •點擊空白格傳遞時間 — 在週/日視圖中:點擊 X 座標 → 以15分鐘為單位計算時間 → 自動填入預約彈窗開始時間
- •頂部導覽列固定 — 套用
overflow-x-hidden + sticky;水平捲動時保持在視窗內
Added
- •管理員 > 設定 > 一般 — 新增營業開始/結束時間設定介面
- •
business_hour_start, business_hour_end DB 設定鍵
- •套用於行事曆週/日視圖的預設時間範圍
Fixed
- •POS
add-service 缺失欄位 — 新增 start_time、end_time、staff_id、designation_fee、notes 的傳遞(原先:伺服器端時間硬編碼,員工/備註缺失)
- •防止 end_time 跨越午夜 — 在
ReservationHelper、start-service API 及預約表單 calcEnd() 中均套用 % 24 → min(23:59) 上限
- •POS 使用中判斷的跨午夜處理 —
CustomerBasedAdapter 中將 end_time < start_time 作為跨午夜處理
- •預約套餐驗證 — 修正僅選擇套餐(不選單項服務)時也能建立預約的問題
Changed
- •分頁名稱變更:接待 / 接待名單 / 預約人
- •接待名單:
walk_in、pos、kiosk、admin 來源 — 顯示所有狀態
- •預約人:
phone、online 來源 — 顯示所有狀態
- •排序順序:等待 → 已確認 → 使用中 → 已完成 → 未出現 → 已取消;同一狀態內按時間排序
- •已完成/已取消/未出現列:以
opacity-50 顯示為半透明,顯示未分配徽章
Changed
- •已完成徽章:由灰色改為綠色
- •已新增已取消/未出現徽章(數量為0時隱藏)
Added
- •卡片底部:等待狀態卡片新增未出現按鈕(禁止圖示),取消按鈕改為紅色
- •詳情彈窗:
pending 和 confirmed 狀態均顯示未出現操作按鈕
- •分組批量未出現:新增
POS.noShowAllServices() 函數
Fixed
- •預約詳情返回導覽 —
<a href="/reservations"> → history.back(),返回上一頁
- •多語言:已為13種語言新增日曆視圖切換(月/週/日)、套餐、營業時間相關鍵
v1.25.0
2026-04-01 · 7個月前
Architecture
- •POS 拆分為獨立外掛程式結構
- •
resources/views/admin/reservations/pos-*.php → 移至 resources/views/admin/pos/ 目錄
- •根據
pos/ 目錄是否存在自動啟用/停用 POS 功能(is_dir() 檢測)
- •側邊欄選單:
pos/ 目錄不存在時自動隱藏 POS 選單
- •
index.php 路由:pos/ 目錄不存在時停用 POS 路由
- •
pos/_init.php → 委派給預約共用 _init.php(共享 DB、驗證、多語言)
- •API 端點保留在
reservations/_api.php(向下相容性有保障)
Added
- •統一付款彈窗 — 點數 + 現金 + 刷卡同時使用(複合付款)
- •點數:查詢餘額,手動輸入或全額使用
- •現金:輸入金額
- •刷卡:輸入金額 + 「使用全部餘額」自動填入按鈕
- •分期:一次性付款 / 選擇 2–12 期
- •即時自動計算合計、找零與不足金額
- •Stripe 刷卡付款時,現金/點數僅在刷卡成功後處理(取消時安全)
- •服務詳情彈窗 — 點數顯示
- •會員點數餘額始終顯示於標題區域(即使餘額為 0 也顯示)
- •服務詳情彈窗 — 員工徽章改進
- •已指派/指定徽章顯示於員工姓名前(之前:姓名下方)
- •收據/列印按鈕位置調整
- •移至客戶詳情上方,收據(左)+ 列印(右)配置
- •列印功能改進
- •列印目前服務詳情彈窗內容,而非開啟外部頁面
Changed
- •卡片版面 — 基於 grid → 基於 flex-wrap 的固定尺寸卡片
- •固定卡片尺寸:預設 320×240px(small:260×200,large:380×280)
- •卡片尺寸不隨螢幕寬度變化,自動換行
- •刷卡付款彈窗 — 擴大至寬 1030px、高 800px
Fixed
- •API 跨網域錯誤已解決
- •
$baseUrl 被硬編碼為 .env 中的 APP_URL,導致從其他主機/HTTPS 存取時 fetch 失敗
- •控制台:fetch URL 改為相對路徑(
/update-api.php)
- •預約
_init.php:$baseUrl 改為空字串,使所有 fetch 使用相對路徑
- •徹底解決 Cloudflare HTTPS 代理環境下的混合內容問題
- •DB 遷移執行錯誤 — 解決 "Failed to fetch"(跨網域問題)
- •Stripe 複合付款取消時現金預先扣除 Bug
- •之前:先處理現金 → 取消刷卡時現金已被處理
- •之後:僅在 Stripe 刷卡付款成功後才處理現金/點數
i18n
- •
pos_pay_after_points — 點數扣除後的金額
- •
pos_pay_proceed — 繼續付款
- •
pos_pay_remainder — 使用全部餘額
- •
pos_pay_installment — 分期付款
- •
pos_pay_lump_sum — 一次性付款
- •
pos_pay_months — 期
- •
pos_pay_total_pay — 合計
- •
pos_pay_short — 不足
- •
show_receipt — 收據
- •
show_print — 列印
v1.18.0
2026-03-29 · 7個月前
Added
- •多語言日期格式化函數 —
formatReservationDate($dateString, $locale)
- •支援 13 種語言 (ko, en, ja, zh_CN, zh_TW, de, es, fr, id, mn, ru, tr, vi)
- •在預約詳情頁自動本地化日期和星期
- •回退:不支援的 locale → 英語格式
Changed
- •預約詳情頁多語言處理
- •服務名稱、員工姓名和套餐名稱已本地化(基於 DB 的 translations 表)
- •整合日期格式化函數
- •付款狀態標籤本地化(payment_status 欄位)
- •付款狀態多語言支援
- •向所有語言檔案(11 種語言)新增
payment 部分
- •翻譯項:未付款、已付款、部分付款、已退款
Fixed
- •預約詳情頁:先前未本地化的員工姓名和服務名稱現已正確顯示
- •付款狀態標籤:修正僅以韓語顯示的問題
- •統一為基於
_tr() 函數的多語言處理方式
Layout & UI
- •頁面寬度統一 (max-w-5xl → max-w-7xl)
- •版塊頁面(列表、閱讀、撰寫):max-w-5xl → max-w-7xl
- •外部頁面(page.php):更新預設值及 DB 設定值
- •預約詳情 / 預約查詢 / 員工頁面:更新 DB 設定值
- •結果:所有頁面寬度現與預約頁保持一致
Documentation
- •在 COMPONENT_MANUAL.md 中新增
formatReservationDate() 的詳細文件
- •支援的語言及格式表
- •使用範例和內部結構
- •注意事項及相關函數
v1.16.0
2026-03-23 · 7個月前
Added
- •行動端底部選單列 — 員工 / 預約 / 首頁 / 登入(或我的)/ 註冊 / 更多,目前頁面高亮顯示
- •行動端「更多」面板 — 主選單 + 我的頁面 / 登出
- •版面/佈景主題設定實際生效 — site_layout、site_page_skin、site_board_skin、site_member_skin → 反映至渲染
- •no_layout 參數 — 無版面純內容模式(用於預覽)
- •新增翻譯鍵 — common.nav.staff、common.nav.more(13種語言)
Fixed
- •將版面套用至會員頁面(login/register/forgot/reset):透過擷取佈景主題
<main> 消除重複的頁首
- •修復會員佈景主題中 ImageCropper/ProfilePhotoCropper 重複宣告的錯誤
- •修復選單載入器 include_once 問題:在佈景主題 closure 中優先載入時 base-header 選單遺失的問題
- •
apple-mobile-web-app-capable 已棄用 → mobile-web-app-capable(8個檔案)
- •在行動端隱藏頁首的登入/註冊按鈕(由底部選單列取代)
- •底部選單列支援 iOS safe-area
Changed
- •將會員頁面從獨立版面合併至預設版面(login/register/forgot/reset)
- •移除頁尾底部外距(行動端選單列使用固定定位)
v1.15.3
2026-03-22 · 7個月前
Added
- •版面詳細設定面板 — 基於 SkinConfigRenderer 的設定表單 AJAX 載入
- •版面選單設定 — layout.json 的 menus 區段 → 自動產生 DB sitemaps 下拉清單
- •SkinConfigRenderer 頁籤支援 — 在 vars 中新增
tab 屬性後自動產生頁籤 UI
- •SkinConfigRenderer 重構 — 統一為
renderVar() 單一方法,分離 renderFormFlat/renderFormWithTabs,renderDependsOnJs 共用
- •layout.json 擴充 — menus(GNB/FNB)、14 個 vars(頁首/Logo/顏色/頁尾/自訂)、13 種語言
- •版面預覽連動 — 選擇「停用」時以 ?no_layout=1 顯示無版面預覽
Fixed
- •版面管理選單查詢:
rzx_menus → rzx_sitemaps 資料表名稱修正
- •中央面板寬度調整 + 操作連結 whitespace-nowrap
Pending
- •將版面/佈景設定值套用至實際頁面渲染(下一個工作階段)
v1.15.2
2026-03-22 · 7個月前
Added
- •版面管理頁面 — 3面板結構:左側預覽+選單、右側佈景主題清單、詳細設定面板
- •每個佈景主題項目:縮圖 + 詳細設定/建立副本/刪除操作連結
- •「停用」/「安裝其他佈景主題」選項
- •4分類儲存:版面、頁面、版塊、會員(
site_layout、site_page_skin、site_board_skin、site_member_skin)
Changed
- •「設計管理」→ 更名為「版面管理」(13種語言:admin.php + site.php)
v1.15.1
2026-03-22 · 7個月前
Changed
- •網站管理的15個頁面 → 套用共用標頭
_head.php
- •論壇: boards, boards-create, boards-edit, boards-trash
- •選單: menus
- •設計: design
- •頁面: pages, pages-settings, pages-edit-content, pages-document, pages-compliance, pages-widget-builder
- •小工具: widgets, widgets-create, widgets-marketplace
- •嵌入模式頁面(boards-edit, pages-settings, pages-edit-content)僅在非嵌入模式下套用
_head.php
- •所有管理員頁面的標頭/版面配置統一工作全部完成
v1.15.0
2026-03-22 · 7個月前
Added
- •系統小工具模組 — 4個小工具:staff(員工介紹)、booking(預約)、lookup(預約查詢)、cta001(預約行動呼籲橫幅)
- •系統頁面 — staff、booking、lookup 註冊至資料庫(is_system=1)+ 路由(
/staff、/booking、/lookup)
- •基於小工具的頁面渲染 — staff/booking/lookup 頁面在放置小工具時渲染小工具,未放置時回退至原有渲染
- •小工具自動註冊至資料庫 — 呼叫
syncToDatabase() 在新增小工具目錄時自動註冊
- •小工具分類
system — 翻譯為13種語言(widgets.categories + widget_builder.cat)
- •頁面清單統一 — 系統頁面迴圈渲染 + 統一的齒輪/編輯/預覽圖示組
- •管理員頁面標題統一 —
$pageSubTitle + $pageSubDesc(透過 _head.php 公共輸出)
- •翻譯鍵新增 — staff.admins、staff.attendance.report/stats、points.description 等
Fixed
- •小工具建構器中
page_slug = 'home' 寫死 → 動態處理 $_GET['slug']
- •小工具建構器 AJAX save/preview 中
home 寫死 → 動態 $pageSlug
- •小工具建構器預覽 URL → 動態
$pageSlug(首頁固定 → 各頁面)
- •修復小工具 preview_widget 中缺少 WidgetLoader require
- •服務卡片檢視圖片路徑(
/storage/ 前綴)
- •自助終端設定寬度
max-w-3xl → 統一為 100%
- •POS 標題「預約管理」→ 改為「POS」
Changed
- •員工管理10個頁面 + 會員管理4個頁面 → 套用公共
_head.php 標題
- •自助終端/套餐頁面套用
_head.php
- •自助終端語言設定 grid → flex-wrap 響應式
- •頁面清單中系統頁面透過資料驅動迴圈渲染
v1.14.1
2026-03-22 · 7個月前
Added
- •頁面佈景主題分頁 — 佈景主題基本資訊 + 擴展變數設定(基於SkinConfigRenderer)
- •佈景主題套用至所有頁面類型 — 佈景主題設定同樣適用於document/widget/external
- •標題背景系統 — 圖片/影片背景 + 疊加層 + 文字顏色(共用局部視圖
_page-title-bg.php)
- •depends_on系統 — 在skin.json中宣告式定義欄位間依賴關係,渲染器自動產生JS(支援checkbox/radio)
- •佈景主題檔案上傳 — 透過multipart上傳圖片/影片(
storage/skins/page/{skin}/)
- •卡片式版面配置/佈景主題選擇器 — 在模組資訊分頁改為縮圖卡片UI
- •SEO系統 — SEO助手、標題範本、OG/Twitter中繼標籤、內容提取
- •OG Image上傳 — URL輸入 + 檔案上傳 + 預覽
- •共用結果強制回應視窗 — 統一的儲存成功/失敗強制回應視窗UI(支援13種語言)
- •服務卡片檢視 — 全背景圖片卡片 + 表格/卡片切換按鈕
- •服務拖放排序 — 在兩種檢視中變更順序並儲存至資料庫
- •預約員工分配/指定 — 預約詳細資訊中有分配/指定2個按鈕
- •預約來源UI — 電話預約/現場到訪/線上選擇
- •電話預約設定 — 在服務基本設定中啟用/停用切換
- •安全標頭 — X-Frame-Options + CSP frame-ancestors
- •PAGE_SYSTEM.md — 頁面系統開發文件
- •PRD_OrderSystem.md — 桌台點餐系統規劃文件
- •PRD_KioskSystem.md — 自助終端系統規劃文件
Fixed
- •套用資料庫中的favicon設定(前端 / 管理員 / 佈景主題版面配置 — 4處)
- •儀表板遷移URL
window.location.origin → $baseUrl(子目錄環境)
- •頁面設定嵌入模式API URL → 直接指定admin路徑
- •結果強制回應視窗i18n:頁面渲染時使用locale訊息,而非API回應
- •佈景主題分頁空白佈景主題值回退(
"" → default)
- •解決
pages-settings.php 中 php://input 重複消費問題
Changed
- •自助終端 / 自助終端設定 / bundle頁面 → 套用共用標頭
_head.php
- •佈景主題設定儲存JSON → FormData(multipart)傳輸(支援檔案上傳)
- •向SkinConfigRenderer新增
$baseUrl 參數(圖片/影片預覽)
- •13種語言佈景主題翻譯(skin.json + site.php + common.php)
v1.13.0
2026-03-21 · 7個月前
Added
- •頁面系統完成 — 從選單建立文件/小工具/外部頁面時自動建立頁面
- •動態頁面渲染器 —
page.php(文件→HTML,小工具→WidgetRenderer,外部→iframe/include)
- •頁面環境設定 — 3個分頁(基本 / 版面配置與佈景主題 / SEO),儲存為
page_config_{slug} JSON
- •頁面內容編輯 — 依語言編輯標題與內容、更改slug、更改類型、刪除
- •動態頁面管理清單 — 從資料庫自動載入使用者頁面,依類型顯示圖示與徽章
- •前端管理員圖示 — 齒輪(設定)+ 編輯(內容)分開顯示
- •外部頁面iframe — 載入失敗時顯示「在新視窗中開啟」提示
- •內部PHP/HTML檔案 — 透過include在RezlyX版面內渲染
Fixed
- •選單捷徑URL
#menu_{id} → 儲存實際選單URL
- •選單編輯顯示與建立時相同的捷徑UI結構
- •選單儲存時反映捷徑URL(
formMenuType → 面板可見性依據)
- •為13種語言新增選單翻譯(12個選單項目 × 13種語言)
- •修正頁面文件編輯器翻譯鍵路徑(
admin.site.pages. → site.pages.)
Changed
- •向DB
rzx_page_contents 新增 page_type 欄位(document/widget/external)
- •刪除選單時同時刪除關聯頁面 + 翻譯資料
v1.12.5
2026-03-21 · 7個月前
Fixed
- •修復選單捷徑 URL — 現在儲存實際選單 URL,而非
#menu_{id}
v1.12.4
2026-03-21 · 7個月前
Fixed
- •外觀設定清單類型未套用 — 修正 localStorage 快取覆蓋外觀設定的問題
- •停用樣式切換時僅使用外觀設定,啟用時以 localStorage 為優先
- •移除 checkbox 隱藏欄位的重複提交(未勾選狀態現在由 JS 處理)
v1.12.3
2026-03-20 · 7個月前
Fixed
- •修復英語/日語缺少的版塊翻譯鍵(source_locale、reply、style、board_settings 等)
- •對分類名稱套用多語言 fallback(locale → en → 原文)
- •版塊列表正文支援多語言(網路雜誌/卡片/圖庫預覽)
v1.12.2
2026-03-20 · 7個月前
Fixed
- •板塊列表內文多語言回退 — 將翻譯內文套用於網誌/卡片/相簿預覽(語言環境 → en → 原文)
- •正式環境皮膚檔案缺失 — 透過 FTP 建立
skins/default/board/ 目錄並上傳 skin.json/縮圖
v1.12.1
2026-03-20 · 7個月前
Fixed
- •正式環境皮膚設定未顯示 — 全檔案同步重新整理
- •CLAUDE.md + BOARD_SYSTEM.md 檔案結構全面更新
v1.12.0
2026-03-20 · 7個月前
Added
- •外觀設定系統完成 — 基於 skin.json 動態產生表單 + 套用至實際版塊
- •分區分組(基本 / 列表 / 連結 / 設計 / 標題背景 / 自訂)
- •新增 radio 和 video 輸入類型
- •圖片/影片檔案上傳(FormData multipart)
- •圖片/影片刪除功能
- •外觀基本資訊表(作者 / URL / 信箱 / 日期 / 版本 / 縮圖)
- •標題背景圖片/影片 — 背景類型、高度、遮罩層透明度及文字顏色設定
- •4 種列表版面樣式 — 列表式 / 網路雜誌式 / 相簿式 / 卡片式;外觀檔案分離 + 支援覆寫
- •相簿式:全圖 cover + 滑鼠懸停時的滑動動畫
- •網路雜誌式:縮圖 + 標題 + 預覽 + 元資訊卡片
- •公告文章分離至頂部列表(_list-notices.php)
- •外觀設定生效 — primary_color, border_radius, posts_per_row, allow_style_switch, show_category, 關聯版塊, Font Awesome, 自訂 CSS/HTML
- •skin.json 預設值自動合併 — 即使未儲存至 DB 也會套用 skin.json 的預設值
Fixed
- •skin_config 未儲存至 DB(boards-api.php 的 update 動作缺少 skin_config)
- •外觀儲存從 URLSearchParams → FormData(multipart)變更,以支援檔案上傳
- •支援自動解析
$_POST['skin_config'] 陣列
v1.11.3
2026-03-20 · 7個月前
Fixed
- •在文章詳情頁的上一篇/下一篇標題套用多語言 fallback(locale → en → 原文)
v1.11.2
2026-03-20 · 7個月前
Fixed
- •板塊列表標題多語言回退 — 跨所有語言環境查詢翻譯(移除僅限韓語的限制),考量來源語言的英語回退
v1.11.1
2026-03-20 · 7個月前
Fixed
- •改善 OG 卡片的獨立 URL 判斷邏輯 — 現在會向上追溯至區塊父元素,確保包裹在
<font> / <span> 等行內標籤內的 URL 也能正確處理
v1.11.0
2026-03-20 · 7個月前
Added
- •URL 自動連結 — 自動偵測版塊文章內文/編輯器中的 URL → 轉換為
<a> 標籤
- •OG 連結預覽卡片 — 自動產生 SNS 橫幅格式(縮圖 + 標題 + 描述 + 網域)的卡片
- •編輯器:輸入/貼上 URL + Enter → 呼叫 OG API → 插入卡片
- •內文:獨立 URL 連結 → 自動轉換為 OG 卡片
- •OgFetcher 模組 — OG/Twitter Card 元數據擷取、favicon、自動處理編碼
- •OG API —
/board/api/og 端點
- •board-autolink.js — 自動連結 + OG 卡片整合 JS(從 base-header 全域載入)
v1.10.2
2026-03-20 · 7個月前
Fixed
- •編輯器/正文圖片對齊 — 覆寫 Tailwind preflight 的
img { display: block }
- •建立
board-content.css 共用 CSS(統一編輯器 + 正文顯示)
- •從
base-header.php 全域載入(所有前端頁面)
- •在
multilang-modal.php 中新增全域編輯器樣式(管理端所有 Summernote 實例)
- •移除版塊正文中的
prose 類;編輯器內聯樣式現可 100% 保留
Changed
- •在 CLAUDE.md 中明確版塊正文樣式規則(
board-content 類為必填項)
v1.10.1
2026-03-20 · 7個月前
Fixed
- •修正新增版塊分類時,多語言彈窗載入上一個分類資料的錯誤(產生唯一的暫時 langKey)
- •在遷移 021 中為
comment_max_depth 新增預設值 3
v1.10.0
2026-03-20 · 7個月前
Added
- •版塊擴充變數 — ExtraVarRenderer 元件模組(15 種類型:依類型渲染 input/display)
- •擴充變數多語言 — 依語言獨立儲存擴充變數值(rzx_translations 整合,降級鏈)
- •版塊文章多語言分離儲存 — 以原文語言編輯時直接儲存到 board_posts;其他語言將翻譯儲存到 rzx_translations
- •版塊文章讀取降級鏈 — 依序顯示標題/內容/擴充變數:當前 locale → en → 原文
- •巢狀回覆 — 支援 3 層深度巢狀留言,遞迴樹狀排序,內嵌回覆表單
- •留言按讚/倒讚 — 每則留言的按讚按鈕 + API
- •版塊設定前端存取 — 管理員齒輪圖示 → /board/{slug}/settings 前端版面
- •版塊管理標題連結 — 在管理員版塊清單中點擊標題導覽至該版塊
Fixed
- •版塊 API 管理員權限檢查:
$currentUser['role'] → $_SESSION['admin_id'](更新 4 個檔案)
- •原文語言提示僅向作者/管理員顯示
- •版塊設定嵌入模式標籤連結支援前端 URL
Changed
- •向資料庫
rzx_board_posts 新增 extra_vars JSON 欄位
- •
comment_max_depth 預設值從 0 → 3
- •統一留言操作列(按讚/倒讚/回覆/刪除圖示)
Added
- •預設版板資料 — 公告板、問答、常見問題、自由討論板遷移(020_default_boards_v193.sql)
Added
- •會員組重置 — 使用預設資料(7個組 + 13種語言翻譯)進行初始化
- •積分設定重置 — 將設定值/等級積分/組關聯還原為預設值(不影響會員餘額)
- •會員組多語言 — 在組名/權益說明中套用
rzx_multilang_input() 共用元件
- •會員組拖放排序 — SortableJS 卡片排序 + 自動儲存
Fixed
- •依語言顯示會員組卡片翻譯(卡片檢視 + 編輯模態視窗)
- •修復會員組多語言翻譯資料亂碼(PHP UTF-8 重新儲存)
- •修正積分模組設定看板欄位名稱(board_name → title)
- •解決積分會員清單排序規則衝突(統一為 utf8mb4_unicode_ci)
- •生產資料庫遷移(019_point_system_v190.sql)
Added
- •積點(餘額)管理系統 — 三標籤結構(基本設定 / 模組設定 / 會員積點列表)
- •積點三欄位結構 — point(活動積點)、balance(付款餘額)、total_accumulated(累計積點,等級計算基準)
- •累計積點加權 — 付款加權 / 活動加權分離,付費用戶優先升級
- •積點兌換 — 積點 → 餘額轉換(比例、單位、最低積點可設定)
- •17個積點授予/扣除項目 — 與 Rhymix 相同結構(刪除時收回、有效期限制、排除公告)
- •模組設定 — 每個板塊 15 個積點項目獨立設定
- •會員積點列表 — 4欄(積點/餘額/累計/等級)、搜尋、單獨編輯
- •等級積點 — 公式計算、最高等級動態調整、連結群組
- •積點系統文件 — POINT_SYSTEM.md 詳細設計文件
- •會員群組拖曳排序 — 使用 SortableJS 變更卡片順序 + 自動儲存
- •會員群組多語言 — 群組名稱/權益說明套用
rzx_multilang_input() 通用元件
- •會員群組種子資料 — 7個群組 × 13種語言的多語言翻譯資料
Changed
- •向 DB
rzx_member_points 新增 balance、total_accumulated 欄位
- •DB
rzx_point_levels.group_id 從 INT 改為 CHAR(36)(相容 UUID)
- •統一
rzx_point_levels、rzx_member_points 定序為 utf8mb4_unicode_ci
- •更新捆綁頁面版面配置(
sidebar-main-content → flex-1 ml-64 儀表板模式)
- •修正捆綁頁面貨幣單位
$config['currency'] → $siteSettings['service_currency']
- •服務時長從 select 改為 input number + datalist
- •在 CLAUDE.md 中明確多語言輸入 UI 規範(強制使用 rzx_multilang_input)
Added
- •套餐詳細管理頁面 — 編輯單個套餐基本資訊、上傳封面圖片、編輯服務組合、關聯員工、切換啟用/停用
- •活動折扣 — 每個套餐的活動價格、時間段(開始/結束)、標籤設定;在時間段內自動啟用
- •套餐清單卡片設計 — 網格卡片版面、圖片標題、活動/折扣徽章、底部固定操作列
- •推薦套餐背景圖片 — 客戶員工詳情頁套餐卡片上的封面圖片背景 + 漸層遮罩
- •服務時長直接輸入 — select → 數字輸入(5–480分鐘,5分鐘為步長)+ datalist 推薦清單
Changed
- •DB
rzx_service_bundles 新增欄位:event_price、event_start、event_end、event_label
- •套餐清單API新增
total_duration 和活動相關欄位
- •翻譯檔案(ko、en、ja):新增套餐詳細管理 + 活動折扣鍵
Added
- •POS設定頁面 — 卡片大小、圖片/價格/電話顯示、透明度、預設標籤、自動重新整理、警示音、員工分配必須、自動分配
- •POS設定已套用 — 卡片大小/圖片/價格/電話/透明度/自動重新整理/預設標籤全部反映至POS
- •員工自動分配 — 在POS設定中啟用時,自助終端報到時自動分配(可提供服務+當日預約最少)
- •POS卡片員工徽章 — 已分配/未分配指示;未分配時停用繼續按鈕
- •POS服務圖片背景 — 服務詳情彈窗的標題+客戶區域顯示代表服務圖片背景
- •員工 is_visible — 控制清單可見性;隱藏員工從預約/POS/自助終端中排除
- •員工卡片橫幅 — 管理員員工卡片上的橫幅圖片+狀態徽章
- •自助終端自動分配 — 以 staff_id=NULL 報到;由管理員在POS中分配
Fixed
- •POS員工分配:分配後立即重新整理服務清單(防止快取)
- •員工分配API參數修正(reservation_id → reservation_ids[])
- •修復正式環境中多個缺失的資料表/欄位(遷移018加強)
- •新增管理員登出路由
- •自助終端前置認證路由位置
Added
- •基礎版面系統 —
layouts/base-header.php + base-footer.php,在 index.php 中自動套用 ob_start,所有客戶頁面共用頁首/頁尾
- •公告板前端 — 列表、詳情、寫作/編輯頁面,Summernote 編輯器,拖放檔案附件
- •公告板短網址 — 無需
/board/ 前綴即可存取 /free、/notice/3 等;自動比對資料庫 slug
- •預約查詢頁面 — 短網址
/lookup,依預約號 / 電子郵件 / 電話搜尋
- •預約詳情頁面 —
/booking/detail/{編號},員工問候氣泡,服務/付款/取消資訊
- •預約取消頁面 —
/booking/cancel/{編號},輸入取消原因
- •個人中心預約詳情 —
/mypage/reservations/{id},側邊欄 + 詳細資訊
- •公告板多語言 —
original_locale(首稿語言)+ source_locale(當前內容語言),回退鏈(source → en → original)
- •員工問候語 —
greeting_before(服務前)+ greeting_after(服務後),多語言,依預約狀態顯示
- •管理員個人資料下拉選單 — 大頭照/首字母 + 姓名 + 首頁/個人中心/登出連結
- •客戶頁首管理員連結 — 以管理員身分登入時,下拉選單顯示管理後台連結
Changed
- •統一所有客戶頁面的版面(移除各自的 HTML 結構,LayoutManager 自動套用)
- •公告板分類顯示條件從
show_category 改為 hide_categories
- •公告板網址從
/board/free 改為短網址 /free(預設)
- •管理員頂部列的「Admin」改為實際登入名稱 + 大頭照
Fixed
- •
rzx_users.role 欄位不存在 → 管理員識別改為基於 $_SESSION['admin_id']
- •
rzx_users.nick_name 欄位不存在 → 使用 name + Encryption 解密
- •
rzx_staff.profile_image → 修正為欄位名稱 avatar
- •Service 模型
category_id int→string 型別轉換
- •預約依電子郵件/電話查詢使用明文搜尋(資料未加密)
Added
- •6 個版板管理分頁 — 基本設定、分類管理、擴充變數、權限設定、附加設定、佈景
- •基本設定分頁整合 — 基本資訊 + SEO + 版面選擇 + 佈景選擇 + 顯示 + 清單 + 進階(可折疊/展開)
- •共用元件 — 8 個
components/board/section-*.php 檔案(basic, seo, layout-select, skin-select, display, list, advanced, js),可在建立/編輯頁面複用
- •多語言輸入元件 —
rzx_multilang_input() 函式,文字/編輯器模式,內嵌地球儀按鈕
- •分類管理強化 — 樹狀結構(parent_id)、編輯強制回應視窗(名稱/字體顏色/說明/允許的群組/展開/預設分類)、SortableJS 拖曳排序、從 DB 動態載入會員等級
- •擴充變數分頁 —
rzx_board_extra_vars 資料表,15 種輸入類型(含 text_multilang、textarea_multilang、textarea_editor),支援多語言,拖曳排序
- •權限設定分頁 — 存取權限(all/member/grade:*/admin_staff/admin)、模組管理員(共用使用者搜尋、大頭照、權限範圍)、通知信件說明
- •附加設定分頁 — 整合版板、文件(歷史/推薦/檢舉)、留言(數量/深度/審核/推薦/檢舉)、WYSIWYG 編輯器(權限矩陣)、檔案(下載群組)、Feed(RSS 公開/著作權)
- •佈景系統 —
skin.json 格式、SkinConfigRenderer、"multilang": true 支援、佈景資訊卡片
- •版面系統 —
layout.json 格式,在基本設定中以卡片方式選擇
- •共用使用者搜尋 —
user-search.php 元件,加密/解密,大頭照,隨處可複用
- •模組管理員 —
rzx_board_admins 資料表,貼文/留言/設定權限,通知訂閱
- •進階設定擴充 — 將管理員排除在匿名之外、Data URL 限制、Unicode 濫用、貼文/留言保護(留言數/回覆數/期限)、超級管理員保護、寄件人電子郵件地址
- •切換開關 UI — 所有是/否項目轉換為切換開關(基本 + 附加設定)
- •翻譯鍵 — 約 300 個鍵,13 種語言
Fixed
- •資源回收筒 SQL 錯誤 —
LIMIT ? 繫結字串 → 整數字面值
- •Summernote 未渲染 — 載入 jQuery/Summernote JS + 強制回應視窗顯示後初始化
- •定序錯誤 — JOIN board_admins 時明確指定 COLLATE utf8mb4_unicode_ci
- •折疊/展開不作用 —
toggleSection 函式先在 <head> 中定義
Changed
- •獨立分頁(清單/進階)→ 合併至基本設定分頁並帶折疊/展開
- •佈景選擇 → 移至基本設定分頁;佈景分頁僅顯示設定
- •管理員信箱 → 改為進階設定中的「寄件人電子郵件地址」
- •模組管理員 → 移至權限設定分頁
- •「在清單中顯示分類」→ 從分類設定中移除,委派給各佈景設定
- •「在清單中顯示分類」→ 從分類設定中移除,委派給各佈景設定
- •允許發文的群組 → 從
rzx_member_grades 資料表動態載入,不再硬編碼
Added
- •多語言回退系統:
db_trans() 函數內建回退鏈(設定語言 → en → 預設語言 → source_locale → 任意翻譯)
- •版塊設定多語言按鈕:在基本設定分頁的6個欄位中新增多語言(地球)按鈕
- •版塊前端檢視多語言回退:在
_init.php 中套用標題、描述、SEO、頁首/頁尾多語言
- •小工具多語言回退:改進
WidgetRenderer::t()、tBtn() 對空字串的處理
- •新增PWA翻譯鍵(13種語言:
admin.pwa.update_available、update、later)
Fixed
- •Features小工具空白卡片問題:
?? 運算子將空字串 "" 視為有效值 → 改用基於 !empty() 的回退
- •正式環境Mixed Content錯誤:
APP_URL http→https 已修復 + JS協議自動修正
Added
- •從 POS 服務記錄中刪除服務的功能(刪除按鈕 + API + 即時更新 DOM)
- •新增 13 種語言的服務刪除相關翻譯鍵
Added
- •自助終端接待系統:服務確認 → 客戶資訊 → 建立預約 → 發放候位號碼
- •員工可用狀態徽章:在自助終端選擇員工時即時顯示忙碌/可用
- •國際電話號碼模組:在自助終端接待表單中套用 phone-input 元件
- •預約範例資料種子:
database/seed_reservations.php(POS/自助終端/線上 共10筆)
- •拆分自助終端共用檔案(
_styles.php、_bg.php、_scripts.php)
- •為13種語言新增11個自助終端翻譯鍵
Changed
- •自助終端服務選擇:依據員工技能的篩選(指定模式)
- •自助終端分類標籤置中對齊
Fixed
- •正式環境管理員無法登入(密碼雜湊損毀——bash 的
$ 變數替換問題)
- •更新系統穩定化:擴充保留清單、健康檢查、資料庫版本同步
- •統一版本單一來源(
version.json → index.php,資料庫自動同步)