一键导入
angular
Angular 21+ 前端开发规范(standalone/Material/signals)。用于 Angular 组件/页面/路由/表单、Material UI、signals 状态、i18n、前端样式与交互相关任务。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Angular 21+ 前端开发规范(standalone/Material/signals)。用于 Angular 组件/页面/路由/表单、Material UI、signals 状态、i18n、前端样式与交互相关任务。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
全栈代码审查规范(质量/性能/安全/架构/风格)。用于 Code Review、PR 审查、质量门禁、安全与性能检查等任务。
"使用 Perigon CLI 进行解决方案脚手架、模块/服务添加、OpenAPI 客户端生成、MCP Server 配置与启动、Studio 面板管理、模块打包与安装。USE FOR: perigon new, perigon add module, perigon add service, perigon generate request, perigon mcp config/start, perigon studio, perigon pack, perigon install.
| name | angular |
| description | Angular 21+ 前端开发规范(standalone/Material/signals)。用于 Angular 组件/页面/路由/表单、Material UI、signals 状态、i18n、前端样式与交互相关任务。 |
本技能适用于使用 Angular 框架进行前端开发的任务。
src/
├── main.ts # 应用入口
├── app/
│ ├── app.config.ts # 应用配置
│ ├── app.routes.ts # 路由配置
│ ├── layout/ # 布局容器
│ ├── pages/ # 页面组件
│ ├── share/
│ │ ├── components/ # 共享组件
│ │ ├── pipe/ # 管道
│ │ ├── auth.guard.ts # 路由守卫
│ │ ├── custom-paginator-intl.ts
│ │ └── i18n-keys.ts # i18n 键定义
│ └── services/ # 服务和 API 客户端
├── assets/
│ └── i18n/*.json # 多语言文件
├── environments/ # 环境配置
├── styles/
│ ├── styles.scss # 全局样式
│ ├── theme.scss # Material 主题
│ └── vars.scss # CSS 变量
└── proxy.conf.json # 开发代理配置
trackBy 函数
generate request或perigon mcp工具,根据后端swagger文件生成前端代码,
outputPath参数为前端项目根目录下的\src\app目录的绝对路径(生成错了要删除)。优先通过使用 MCP 工具生成组件,Perigon提供通过razor 模板生成代码的能力,以获取可参考的代码结构和示例。
特别注意:生成的请求服务代码不要添加或修改,它是与接口保持一致的,包括类型定义,切勿重复定义类型。
npm run build
npm run start # 启动开发服务器,实时查看编译错误
修改代码 → 构建 → 发现错误 → 修复 → 重新构建,直到无错误
enumText管道:用于将枚举值转换为对应的文本显示。toKeyValue管道:用于将枚举类型转换为键值对数组,以便在选项列表中使用。具备良好的交互常识和布局和审美。要考虑排版、边距,文字大小,颜色搭配,组件间距等,优先参考已定义好的theme.scss中的样式变量和组件样式,保持整体风格一致。
组件选择:
样式层级:
styles.scss - 基础样式和重置theme.scss - Material 主题定制vars.scss - 颜色、间距等变量.scss 文件 - 局部样式样式规范(重要):
theme.scss中定义的 Material 主题和组件样式变量,优先使用这些样式。translate 管道进行文本翻译Reactive Forms(推荐):
import { FormControl, FormGroup } from '@angular/forms';
userForm = new FormGroup({
name: new FormControl('', [Validators.required]),
email: new FormControl('', [Validators.required, Validators.email])
});
// 类型安全
get nameControl() {
return this.userForm.get('name') as FormControl;
}
表单规范:
[formControl],不要用 formControlName模板示例:
<!-- ✅ 推荐:使用 [formControl] + getter,避免字符串硬编码 -->
<form [formGroup]="form">
<mat-form-field>
<mat-label>Name</mat-label>
<input matInput [formControl]="name" />
@if (name.errors) {
<mat-error>{{ getValidatorMessage(name) }}</mat-error>
}
</mat-form-field>
</form>
组件示例(通过 getter 访问):
export class UserForm {
form = this.fb.group({
name: ['', [Validators.required, Validators.maxLength(100)]],
email: ['', [Validators.required, Validators.email]]
});
// ✅ 通过 getter 访问控件,避免字符串,便于复用和重构
get name() { return this.form.get('name') as FormControl; }
get email() { return this.form.get('email') as FormControl; }
getValidatorMessage(control: AbstractControl | null): string {
if (!control || !control.errors) { return ''; }
const errors = control.errors;
const key = Object.keys(errors)[0];
const params = errors[key];
return this.translate.instant(`validation.${key.toLowerCase()}`, params);
}
}
app/services/admin-client.ts / 自定义客户端base.service.tsmodels/ 和 services/app/app.routes.tsapp/pages/*app/layout/*认证守卫:
app/share/auth.guard.tsauth.service.ts 使用翻译文件:
assets/i18n/*.jsonapp/share/i18n-keys.tsscripts/i18n-keys.jsJSON 文件:
{
"common": {
"save": "保存",
"cancel": "取消",
"delete": "删除"
},
"user": {
"list": "用户列表",
"detail": "用户详情"
}
}
使用方式:
<button>{{ i18nKeys.common.save | translate }}</button>
注意事项:
@for 循环必须包含 track 表达式*matHeaderRowDef / *matRowDef 保留不变(这些是 Material 特有指令)*ngIf / *ngFor,应该使用 @if / @for 语法