741874e85d
1、用户角色枚举、权限枚举、结果记录和密码存储模型 IPermissionService 接口及包含认证、权限检查、密码管理和登出功能的 PermissionService 单例 2、支持层级化角色-权限映射的权限矩阵(SuperAdmin ⊇ Admin ⊇ User) 密码持久化至 passwords.json 文件,并提供工厂默认值回退机制 3、UI 层 LoginDialog — 启动时弹出模态登录对话框,支持密码掩码输入、错误提示以及取消退出功能 RibbonStatusAreaView — 在Ribbon右侧区域始终显示角色标签和“切换用户”按钮 权限感知的CncEditorViewModel — 用户角色无法使用CNC编辑控件 权限感知的CncInspectionModulePipelineViewModel — 用户角色无法进行流程编辑 设置导航可见性 — Admin/User角色隐藏Factory_Settings,User角色隐藏Report_Settings PasswordManagementView — 仅SuperAdmin可访问的修改角色密码对话框 PermissionTooltipHelper — 附加属性,在禁用控件上显示“当前角色无权访问此功能”提示
50 lines
1.9 KiB
C#
50 lines
1.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using Moq;
|
|
using XP.Common.Logging.Interfaces;
|
|
using XP.Hardware.RaySource.Services;
|
|
using XplorePlane.Models;
|
|
using XplorePlane.Services.AppState;
|
|
using XplorePlane.Services.Cnc;
|
|
using XplorePlane.Services.Permission;
|
|
using Xunit;
|
|
|
|
namespace XplorePlane.Tests.Services
|
|
{
|
|
public class CncProgramServiceTests
|
|
{
|
|
[Fact]
|
|
public void SerializeDeserialize_SavePosition_PreservesSaveImage()
|
|
{
|
|
var appState = new Mock<IAppStateService>();
|
|
appState.SetupGet(s => s.MotionState).Returns(MotionState.Default);
|
|
appState.SetupGet(s => s.RaySourceState).Returns(RaySourceState.Default);
|
|
appState.SetupGet(s => s.DetectorState).Returns(DetectorState.Default);
|
|
|
|
var raySource = new Mock<IRaySourceService>();
|
|
var logger = new Mock<ILoggerService>();
|
|
logger.Setup(l => l.ForModule<CncProgramService>()).Returns(logger.Object);
|
|
|
|
var permissionService = new Mock<IPermissionService>();
|
|
permissionService.Setup(p => p.HasPermission(It.IsAny<Permission>())).Returns(true);
|
|
|
|
var service = new CncProgramService(appState.Object, raySource.Object, logger.Object, permissionService.Object);
|
|
var program = new CncProgram(
|
|
Guid.NewGuid(),
|
|
"Program",
|
|
DateTime.UtcNow,
|
|
DateTime.UtcNow,
|
|
new List<CncNode>
|
|
{
|
|
new SavePositionNode(Guid.NewGuid(), 0, "保存位置_0", MotionState.Default, SaveImage: true)
|
|
}.AsReadOnly());
|
|
|
|
var json = service.Serialize(program);
|
|
var deserialized = service.Deserialize(json);
|
|
|
|
var savePosition = Assert.IsType<SavePositionNode>(Assert.Single(deserialized.Nodes));
|
|
Assert.True(savePosition.SaveImage);
|
|
}
|
|
}
|
|
}
|