收敛激活页临时授权口径

This commit is contained in:
WuYongJie 2026-05-28 21:49:16 +08:00
parent f95c121afc
commit 79de454ac0
3 changed files with 36 additions and 36 deletions

View File

@ -3,7 +3,7 @@
*/
/**
* 激活页面测试
* 测试许可证激活和自助试用功能
* 测试许可证激活和临时授权申请功能
*/
import { render, screen, fireEvent, waitFor, act } from '@testing-library/react';
import ActivatePage from '../page';
@ -83,12 +83,12 @@ describe('ActivatePage', () => {
expect(screen.getByText('请输入交付给您的许可证密钥')).toBeInTheDocument();
expect(screen.getByPlaceholderText('XXXX-XXXX-XXXX-XXXX')).toBeInTheDocument();
expect(screen.getByText('激活许可证')).toBeInTheDocument();
expect(screen.queryByText('自助试用')).not.toBeInTheDocument();
expect(screen.queryByRole('heading', { name: '申请临时授权' })).not.toBeInTheDocument();
});
it('默认不显示自助试用说明', async () => {
it('默认不显示临时授权说明', async () => {
await renderPage();
expect(screen.queryByText('自助试用会按当前授权服务规则生成受限许可证')).not.toBeInTheDocument();
expect(screen.queryByText('临时授权会按当前授权服务规则生成受限许可证')).not.toBeInTheDocument();
});
it('应该显示联系信息', async () => {
@ -294,20 +294,20 @@ describe('ActivatePage', () => {
});
});
describe('自助试用(显式开关开启时)', () => {
describe('临时授权申请(显式开关开启时)', () => {
beforeEach(() => {
process.env.NEXT_PUBLIC_ENABLE_FREE_TRIAL_ACTIVATION = 'true';
});
it('点击自助试用按钮应该显示交付单位输入弹窗', async () => {
it('点击临时授权按钮应该显示交付单位输入弹窗', async () => {
await renderPage();
const button = screen.getByText('自助试用');
const button = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(button);
});
expect(screen.getByText('申请自助试用')).toBeInTheDocument();
expect(screen.getByRole('heading', { name: '申请临时授权' })).toBeInTheDocument();
expect(screen.getByPlaceholderText('请输入单位或团队名称')).toBeInTheDocument();
expect(screen.getByText('确认申请')).toBeInTheDocument();
expect(screen.getByText('取消')).toBeInTheDocument();
@ -315,7 +315,7 @@ describe('ActivatePage', () => {
it('未输入客户名称时确认申请按钮应该禁用', async () => {
await renderPage();
const freeTrialButton = screen.getByText('自助试用');
const freeTrialButton = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(freeTrialButton);
@ -327,7 +327,7 @@ describe('ActivatePage', () => {
it('只输入客户名称未输入联系方式时确认申请按钮应该禁用', async () => {
await renderPage();
const freeTrialButton = screen.getByText('自助试用');
const freeTrialButton = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(freeTrialButton);
@ -342,7 +342,7 @@ describe('ActivatePage', () => {
it('输入客户名称和联系方式后确认申请按钮应该启用', async () => {
await renderPage();
const freeTrialButton = screen.getByText('自助试用');
const freeTrialButton = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(freeTrialButton);
@ -359,23 +359,23 @@ describe('ActivatePage', () => {
it('点击取消按钮应该关闭弹窗', async () => {
await renderPage();
const freeTrialButton = screen.getByText('自助试用');
const freeTrialButton = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(freeTrialButton);
});
expect(screen.getByText('申请自助试用')).toBeInTheDocument();
expect(screen.getByRole('heading', { name: '申请临时授权' })).toBeInTheDocument();
const cancelButton = screen.getByText('取消');
await act(async () => {
fireEvent.click(cancelButton);
});
expect(screen.queryByText('申请自助试用')).not.toBeInTheDocument();
expect(screen.queryByRole('heading', { name: '申请临时授权' })).not.toBeInTheDocument();
});
it('自助试用成功后应该显示成功页面', async () => {
it('临时授权申请成功后应该显示成功页面', async () => {
mockFetchRoutes({
'/api/license/check': createJsonResponse({ activated: false }),
'/api/license/activate-free': createJsonResponse({
@ -391,8 +391,8 @@ describe('ActivatePage', () => {
await renderPage();
// 点击自助试用按钮打开弹窗
const freeTrialButton = screen.getByText('自助试用');
// 点击临时授权按钮打开弹窗
const freeTrialButton = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(freeTrialButton);
});
@ -421,16 +421,16 @@ describe('ActivatePage', () => {
});
});
it('自助试用失败应该显示错误信息', async () => {
it('临时授权申请失败应该显示错误信息', async () => {
mockFetchRoutes({
'/api/license/check': createJsonResponse({ activated: false }),
'/api/license/activate-free': createJsonResponse({ success: false, error: '试用已过期' }),
'/api/license/activate-free': createJsonResponse({ success: false, error: '临时授权已过期' }),
});
await renderPage();
// 点击自助试用按钮打开弹窗
const freeTrialButton = screen.getByText('自助试用');
// 点击临时授权按钮打开弹窗
const freeTrialButton = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(freeTrialButton);
});
@ -448,7 +448,7 @@ describe('ActivatePage', () => {
});
await waitFor(() => {
expect(screen.getByText('试用已过期')).toBeInTheDocument();
expect(screen.getByText('临时授权已过期')).toBeInTheDocument();
});
});
@ -460,8 +460,8 @@ describe('ActivatePage', () => {
await renderPage();
// 点击自助试用按钮打开弹窗
const freeTrialButton = screen.getByText('自助试用');
// 点击临时授权按钮打开弹窗
const freeTrialButton = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(freeTrialButton);
});
@ -485,7 +485,7 @@ describe('ActivatePage', () => {
it('应该显示联系方式输入框', async () => {
await renderPage();
const freeTrialButton = screen.getByText('自助试用');
const freeTrialButton = screen.getByText('申请临时授权');
await act(async () => {
fireEvent.click(freeTrialButton);

View File

@ -147,10 +147,10 @@ export default function ActivatePage() {
}
};
// 打开自助试用弹窗
// 打开临时授权申请弹窗
const openFreeTrialModal = () => {
if (!freeTrialActivationEnabled) {
setError('当前部署未开放自助试用,请使用许可证密钥或联系系统交付人员');
setError('当前部署未开放临时授权申请,请使用许可证密钥或联系系统交付人员');
return;
}
setCustomerName('');
@ -158,10 +158,10 @@ export default function ActivatePage() {
setShowFreeTrialModal(true);
};
// 自助试用
// 临时授权申请
const handleFreeTrial = async () => {
if (!freeTrialActivationEnabled) {
setError('当前部署未开放自助试用,请使用许可证密钥或联系系统交付人员');
setError('当前部署未开放临时授权申请,请使用许可证密钥或联系系统交付人员');
setShowFreeTrialModal(false);
return;
}
@ -366,18 +366,18 @@ export default function ActivatePage() {
<div className="flex-1 border-t border-slate-200 dark:border-slate-700"></div>
</div>
{/* 自助试用 */}
{/* 临时授权 */}
<button
onClick={openFreeTrialModal}
disabled={loading}
className="w-full py-3 border border-slate-300 dark:border-slate-700 text-slate-700 dark:text-slate-300 rounded-lg font-medium hover:bg-slate-50 dark:hover:bg-slate-800 disabled:cursor-not-allowed transition-colors"
>
自助试用
申请临时授权
</button>
{/* 免费版说明 */}
<p className="mt-4 text-center text-xs text-slate-400">
自助试用会按当前授权服务规则生成受限许可证
临时授权会按当前授权服务规则生成受限许可证
</p>
</>
)}
@ -389,7 +389,7 @@ export default function ActivatePage() {
</p>
</div>
{/* 自助试用弹窗 */}
{/* 临时授权弹窗 */}
{freeTrialActivationEnabled && showFreeTrialModal && (
<div className="fixed inset-0 bg-black/40 flex items-center justify-center z-50">
<form
@ -399,7 +399,7 @@ export default function ActivatePage() {
handleFreeTrial();
}}
>
<h3 className="text-lg font-semibold text-slate-900 dark:text-white mb-4">申请自助试用</h3>
<h3 className="text-lg font-semibold text-slate-900 dark:text-white mb-4">申请临时授权</h3>
<div className="mb-4">
<label className="block text-sm font-medium text-slate-700 dark:text-slate-300 mb-2">
交付单位名称 <span className="text-red-500">*</span>

View File

@ -1169,14 +1169,14 @@ NAS 私有化系统可能在平板或窄屏浏览器里使用。模板编辑器
- `app/complete-profile/page.tsx:25`:完善资料页已改为和登录页一致的浅灰背景。
- `app/complete-profile/page.tsx:205`:完善资料页已增加默认 Logo 兜底。
- `app/complete-profile/page.tsx`:完善资料页表单、Logo、提示框和钉钉账号信息卡已从 `rounded-xl` 收为 `rounded-lg`,与登录/注册入口保持一致。
- `app/activate/page.tsx`:激活页已完成第二轮收口,默认只展示许可证密钥激活,并跟随系统名称和登录 Logo;“免费试用/购买许可证”入口已改为显式环境开关下的“自助试用”,客户默认安装现场不再露出公网获客口径。
- `app/activate/page.tsx`:激活页已完成第二轮收口,默认只展示许可证密钥激活,并跟随系统名称和登录 Logo;“免费试用/购买许可证”入口已改为显式环境开关下的“申请临时授权”,客户默认安装现场不再露出公网获客口径。
- `app/dingtalk-callback/page.tsx`:钉钉回调页已完成第一轮收口,蓝色渐变整屏背景改为浅灰背景,`rounded-2xl shadow-xl` 大卡片改为 `rounded-lg border shadow-sm` 普通状态卡片,加载/成功/失败状态复用同一个中性外壳。
- 代码复扫:`app/dingtalk-callback/page.tsx` 已无 `bg-gradient`、`rounded-2xl`、`shadow-xl`、大尺寸状态图标等命中。
- 验证限制:本轮尝试用 Codex 内置浏览器打开钉钉回调页时返回“没有可用活动面板”,因此该页暂未补截图;已完成 `npm run type-check` 和 `npm run lint` 验证。
建议动作:
- 登录、激活、回调、完善资料页统一成同一套私有化安装/访问风格;登录/注册/激活/完善资料页已完成第一轮圆角、口径和系统名称/Logo 对齐,邀请注册链路已修复;钉钉回调页已完成第一轮视觉收口,激活页公网试用/购买口径已进一步隐藏。
- 登录、激活、回调、完善资料页统一成同一套私有化安装/访问风格;登录/注册/激活/完善资料页已完成第一轮圆角、口径和系统名称/Logo 对齐,邀请注册链路已修复;钉钉回调页已完成第一轮视觉收口,激活页公网获客/购买口径已进一步隐藏。
- 背景用纯色或轻灰,不用大面积渐变。
- 登录页可以保留品牌感,但减少泛 SaaS 视觉:小 Logo、清晰表单、明确客户系统名称即可。