收敛激活页临时授权口径
This commit is contained in:
parent
f95c121afc
commit
79de454ac0
@ -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);
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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、清晰表单、明确客户系统名称即可。
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user