系统目录

目录

一、金融行业:风控合规与交易场景解决方案

1.1 核心场景:风控合规表单(满足反洗钱要求)

实战代码:个人贷款申请表单

1.2 金融行业核心能力总结

二、医疗行业:数据可视化与权限分级场景

2.1 核心场景:电子病历系统(权限分级 + 数据脱敏)

实战代码:电子病历详情页

2.2 医疗行业核心能力总结

三、政务行业:表单申报与流程场景

3.1 核心场景:政务事项申报系统(分步申报 + 数据暂存)

实战代码:政务事项申报表单


DevUI 针对金融、医疗、政务等高复杂度行业,提供「专属组件 + 场景化解决方案」,解决行业特有的「合规要求高、数据复杂度高、流程严谨」等痛点。本文将通过三个典型行业的实战案例,详细拆解 DevUI (官网:https://devui.design/home)的行业化落地思路与代码实现。

一、金融行业:风控合规与交易场景解决方案

金融行业前端系统需满足「合规性、安全性、高精度」要求,DevUI 提供的「风控表单、敏感数据脱敏、交易确认流程」等方案,可快速适配金融业务场景。

1.1 核心场景:风控合规表单(满足反洗钱要求)

金融开户、贷款申请等场景需填写大量字段,且需满足「字段校验严格、数据格式规范、流程可追溯」要求,DevUI Form 组件的「自定义校验、格式限制、步骤留存」方案可完美适配。

实战代码:个人贷款申请表单
<!-- 贷款申请表单:分步骤+合规校验 -->
<d-stepper [steps]="loanSteps" [(activeIndex)]="activeStep" (activeIndexChange)="onStepChange()">
  <!-- 步骤1:基本信息(身份校验) -->
  <d-step label="基本信息" [formGroup]="basicForm" [required]="true">
    <d-form-item label="姓名" name="realName" required>
      <d-input [(ngModel)]="formData.realName" placeholder="请输入与身份证一致的姓名"></d-input>
      <d-form-validator error="required" message="姓名不能为空"></d-form-validator>
    </d-form-item>

    <d-form-item label="身份证号" name="idCard" required>
      <d-input 
        [(ngModel)]="formData.idCard" 
        placeholder="请输入18位身份证号"
        (input)="formatIdCard($event)"
      ></d-input>
      <d-form-validator error="required" message="身份证号不能为空"></d-form-validator>
      <d-form-validator error="pattern" message="身份证号格式不正确"></d-form-validator>
      <d-form-validator error="async" message="身份证号已被占用"></d-form-validator>
    </d-form-item>

    <d-form-item label="手机号" name="phone" required>
      <d-input 
        [(ngModel)]="formData.phone" 
        placeholder="请输入手机号"
        (input)="formatPhone($event)"
      ></d-input>
      <d-form-validator error="required" message="手机号不能为空"></d-form-validator>
      <d-form-validator error="pattern" message="手机号格式不正确"></d-form-validator>
    </d-form-item>
  </d-step>

  <!-- 步骤2:财务信息(收入校验) -->
  <d-step label="财务信息" [formGroup]="financeForm" [required]="true">
    <d-form-item label="月收入" name="monthlyIncome" required>
      <!-- 金融专属组件:数字输入框(支持千分位、小数位限制) -->
      <d-number-input 
        [(ngModel)]="formData.monthlyIncome" 
        [precision]="2" 
        [thousandsSeparator]="true"
        [min]="0"
        placeholder="请输入月收入金额"
      ></d-number-input>
      <d-form-validator error="required" message="月收入不能为空"></d-form-validator>
      <d-form-validator error="min" message="月收入不能小于0"></d-form-validator>
    </d-form-item>

    <d-form-item label="负债金额" name="debtAmount">
      <d-number-input 
        [(ngModel)]="formData.debtAmount" 
        [precision]="2" 
        [thousandsSeparator]="true"
        [min]="0"
        placeholder="请输入当前负债金额(无则填0)"
      ></d-number-input>
    </d-form-item>
  </d-step>

  <!-- 步骤3:交易确认(合规留存) -->
  <d-step label="确认提交" [formGroup]="confirmForm">
    <div class="risk-warning">
      <d-icon name="warning-o" class="warning-icon"></d-icon>
      <p>风险提示:请确认您填写的信息真实有效,虚假信息将影响您的贷款申请,并承担相应法律责任。</p>
    </div>

    <d-form-item label="同意协议">
      <d-checkbox [(ngModel)]="formData.agreeProtocol" required>
        我已阅读并同意《个人贷款协议》《隐私政策》
      </d-checkbox>
      <d-form-validator error="required" message="请同意相关协议"></d-form-validator>
    </d-form-item>

    <d-form-operation>
      <button d-button type="submit" theme="primary" (click)="submitLoanApplication()">提交申请</button>
    </d-form-operation>
  </d-step>
</d-stepper>
// 组件逻辑:合规校验+数据脱敏+流程留存
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { LoanService } from './loan.service';
import { IdCardValidator } from './validators/id-card.validator'; // 自定义身份证校验器

@Component({
  selector: 'app-loan-application',
  templateUrl: './loan-application.component.html'
})
export class LoanApplicationComponent {
  activeStep = 0;
  formData = {
    realName: '',
    idCard: '',
    phone: '',
    monthlyIncome: 0,
    debtAmount: 0,
    agreeProtocol: false
  };

  // 步骤配置
  loanSteps = [
    { label: '基本信息', icon: 'user-o' },
    { label: '财务信息', icon: 'wallet-o' },
    { label: '确认提交', icon: 'check-circle-o' }
  ];

  // 表单校验组
  basicForm: FormGroup;
  financeForm: FormGroup;
  confirmForm: FormGroup;

  constructor(
    private fb: FormBuilder,
    private loanService: LoanService,
    private idCardValidator: IdCardValidator
  ) {
    // 初始化表单校验
    this.initFormGroups();
  }

  // 初始化表单校验规则
  initFormGroups() {
    this.basicForm = this.fb.group({
      realName: [null, [Validators.required]],
      idCard: [
        null,
        [Validators.required, Validators.pattern(/^\d{17}[\dXx]$/)],
        [this.idCardValidator.validate.bind(this.idCardValidator)] // 异步校验身份证号唯一性
      ],
      phone: [null, [Validators.required, Validators.pattern(/^1[3-9]\d{9}$/)]]
    });

    this.financeForm = this.fb.group({
      monthlyIncome: [null, [Validators.required, Validators.min(0)]],
      debtAmount: [0, [Validators.min(0)]]
    });

    this.confirmForm = this.fb.group({
      agreeProtocol: [false, [Validators.requiredTrue]]
    });
  }

  // 步骤切换时校验当前步骤
  onStepChange() {
    if (this.activeStep === 1 && !this.basicForm.valid) {
      this.basicForm.markAllAsTouched();
      this.activeStep = 0; // 校验不通过,返回上一步
    } else if (this.activeStep === 2 && !this.financeForm.valid) {
      this.financeForm.markAllAsTouched();
      this.activeStep = 1;
    }
  }

  // 格式化身份证号(中间8位脱敏)
  formatIdCard(event: any) {
    const value = event.target.value.replace(/\s/g, '');
    if (value.length > 6 && value.length < 15) {
      this.formData.idCard = value.replace(/(\d{6})(\d+)(\d{4})/, '$1 **** **** $3');
    }
  }

  // 格式化手机号(中间4位脱敏)
  formatPhone(event: any) {
    const value = event.target.value.replace(/\s/g, '');
    if (value.length > 3 && value.length < 11) {
      this.formData.phone = value.replace(/(\d{3})(\d+)(\d{4})/, '$1 **** $3');
    }
  }

  // 提交申请:数据脱敏+流程留存
  submitLoanApplication() {
    if (this.confirmForm.valid) {
      // 数据脱敏:身份证号、手机号仅保留部分字符
      const submitData = {
        realName: this.formData.realName,
        idCard: this.formData.idCard.replace(/\s/g, '').replace(/(\d{6})(\d{8})(\d{4})/, '$1********$3'),
        phone: this.formData.phone.replace(/\s/g, '').replace(/(\d{3})(\d{4})(\d{4})/, '$1****$3'),
        monthlyIncome: this.formData.monthlyIncome,
        debtAmount: this.formData.debtAmount,
        applyTime: new Date().toISOString(),
        stepRecords: [
          { step: 1, completeTime: '2024-01-01T10:00:00Z' },
          { step: 2, completeTime: '2024-01-01T10:05:00Z' },
          { step: 3, completeTime: new Date().toISOString() }
        ] // 步骤留存,用于合规审计
      };

      // 提交申请
      this.loanService.submitApplication(submitData).subscribe({
        next: (res) => {
          alert(`申请提交成功,申请编号:${res.applicationNo}`);
        },
        error: (err) => {
          alert(`申请提交失败:${err.message}`);
        }
      });
    } else {
      this.confirmForm.markAllAsTouched();
    }
  }
}

1.2 金融行业核心能力总结

核心需求 DevUI 解决方案 价值体现
合规校验 自定义校验器、异步校验、步骤留存 满足反洗钱、审计要求
数据格式规范 数字输入框(千分位 / 小数限制)、格式格式化 确保金融数据精度
敏感数据保护 数据脱敏、加密传输 符合数据安全法规
交易确认 分步流程、风险提示、协议确认 降低交易风险

二、医疗行业:数据可视化与权限分级场景

医疗行业前端系统需满足「数据脱敏、权限分级、操作严谨」要求,DevUI 提供的「医疗数据看板、病历表格、权限控制」等方案,可适配电子病历、诊疗系统等场景。

2.1 核心场景:电子病历系统(权限分级 + 数据脱敏)

电子病历系统需支持「医生 / 护士 / 患者角色差异化访问、病历数据可视化、操作留痕」,DevUI 的「权限指令、医疗专属组件、表格扩展能力」可快速实现。

实战代码:电子病历详情页
<!-- 电子病历详情:权限分级+数据脱敏+操作留痕 -->
<d-layout>
  <d-header>
    <div class="logo">电子病历系统</div>
    <div class="user-info">
      <span>当前角色:{{ currentRole }}</span>
      <d-avatar [src]="userAvatar"></d-avatar>
    </div>
  </d-header>

  <d-layout-content>
    <!-- 患者基本信息(所有角色可见,部分字段脱敏) -->
    <div class="patient-info">
      <h3>患者信息</h3>
      <div class="info-row">
        <span class="label">姓名:</span>
        <span>{{ patientName }}</span>
      </div>
      <div class="info-row">
        <span class="label">性别:</span>
        <span>{{ patientGender }}</span>
      </div>
      <div class="info-row">
        <span class="label">年龄:</span>
        <span>{{ patientAge }}岁</span>
      </div>
      <div class="info-row">
        <span class="label">手机号:</span>
        <span>{{ patientPhone |脱敏: 'phone' }}</span> <!-- 手机号脱敏管道 -->
      </div>
      <div class="info-row">
        <span class="label">身份证号:</span>
        <span>{{ patientIdCard |脱敏: 'idCard' }}</span> <!-- 身份证号脱敏管道 -->
      </div>
    </div>

    <!-- 病历表格(支持富文本、图片预览,医生可编辑) -->
    <d-table 
      [data]="medicalRecords" 
      [columns]="recordColumns"
      [rowHeight]="80"
    >
      <!-- 病历内容(富文本渲染) -->
      <ng-template #contentTemplate let-row>
        <div class="record-content" [innerHTML]="row.content"></div>
      </ng-template>

      <!-- 附件预览(图片/文档) -->
      <ng-template #attachmentTemplate let-row>
        <div *ngIf="row.attachments && row.attachments.length > 0" class="attachments">
          <div 
            *ngFor="let file of row.attachments"
            class="attachment-item"
            (click)="previewAttachment(file)"
          >
            <d-icon name="file-o" class="file-icon"></d-icon>
            <span class="file-name">{{ file.name }}</span>
          </div>
        </div>
      </ng-template>

      <!-- 操作列(权限控制:仅医生可编辑/删除) -->
      <ng-template #operationTemplate let-row>
        <button 
          d-button 
          type="text" 
          theme="primary" 
          *dPermission="['doctor']"
          (click)="editRecord(row)"
        >
          编辑
        </button>
        <button 
          d-button 
          type="text" 
          theme="danger" 
          *dPermission="['doctor']"
          (click)="deleteRecord(row)"
        >
          删除
        </button>
        <button 
          d-button 
          type="text" 
          *dPermission="['nurse', 'doctor']"
          (click)="addRecordLog(row)"
        >
          操作留痕
        </button>
      </ng-template>
    </d-table>

    <!-- 医生专属:添加病历记录 -->
    <button 
      d-button 
      theme="primary" 
      class="add-record-btn"
      *dPermission="['doctor']"
      (click)="openAddRecordModal()"
    >
      + 添加病历记录
    </button>
  </d-layout-content>
</d-layout>

// 组件逻辑:权限控制+数据脱敏+操作留痕
import { Component } from '@angular/core';
import { MedicalRecordService } from './medical-record.service';
import { PermissionService } from './permission.service';
import { DesensitizePipe } from './pipes/desensitize.pipe'; // 脱敏管道

@Component({
  selector: 'app-medical-record',
  templateUrl: './medical-record.component.html',
  providers: [DesensitizePipe]
})
export class MedicalRecordComponent {
  currentRole = ''; // 当前用户角色:doctor/nurse/patient
  userAvatar = '';
  patientName = '张三';
  patientGender = '男';
  patientAge = 45;
  patientPhone = '13800138000';
  patientIdCard = '110101199001011234';
  medicalRecords = []; // 病历记录列表

  // 表格列配置
  recordColumns = [
    { label: '记录时间', key: 'createTime' },
    { label: '病历类型', key: 'type' },
    { label: '病历内容', key: 'content', cellTemplate: 'contentTemplate' },
    { label: '附件', key: 'attachments', cellTemplate: 'attachmentTemplate' },
    { label: '操作', key: 'operation', cellTemplate: 'operationTemplate', width: 200 }
  ];

  constructor(
    private medicalRecordService: MedicalRecordService,
    private permissionService: PermissionService,
    private desensitizePipe: DesensitizePipe
  ) {
    // 获取当前用户角色(从权限系统获取)
    this.currentRole = this.permissionService.getCurrentRole();
    this.userAvatar = this.permissionService.getUserAvatar();

    // 加载病历记录(根据角色过滤数据)
    this.loadMedicalRecords();
  }

  // 加载病历记录:不同角色看到的内容不同
  loadMedicalRecords() {
    this.medicalRecordService.getMedicalRecords({
      patientId: '123456',
      role: this.currentRole // 传递角色,后端过滤敏感数据
    }).subscribe(data => {
      this.medicalRecords = data;
    });
  }

  // 预览附件(图片/文档)
  previewAttachment(file: any) {
    if (file.type.startsWith('image/')) {
      // 图片预览
      this.medicalRecordService.previewImage(file.url);
    } else {
      // 文档下载
      window.open(file.url);
    }
  }

  // 编辑病历记录(仅医生可操作)
  editRecord(row: any) {
    // 打开编辑弹窗...
  }

  // 删除病历记录(仅医生可操作,需二次确认)
  deleteRecord(row: any) {
    if (confirm('确定要删除这条病历记录吗?删除后不可恢复!')) {
      this.medicalRecordService.deleteRecord(row.id).subscribe(() => {
        this.loadMedicalRecords();
      });
    }
  }

  // 操作留痕:记录用户操作行为(医生/护士)
  addRecordLog(row: any) {
    this.medicalRecordService.addOperationLog({
      recordId: row.id,
      operatorId: this.permissionService.getUserId(),
      operatorRole: this.currentRole,
      operation: '查看病历',
      operationTime: new Date().toISOString()
    }).subscribe();
  }

  // 打开添加病历记录弹窗(仅医生可操作)
  openAddRecordModal() {
    // 打开添加弹窗...
  }
}

2.2 医疗行业核心能力总结

核心需求 DevUI 解决方案 价值体现
权限分级 *dPermission 指令、角色数据过滤 符合医疗数据访问规范
数据脱敏 脱敏管道、敏感字段隐藏 保护患者隐私
病历可视化 富文本表格、图片预览组件 提升诊疗效率
操作留痕 操作日志组件、步骤记录 满足医疗合规要求

三、政务行业:表单申报与流程场景

政务行业前端系统需满足「多步骤申报、数据暂存、公文格式适配」要求,DevUI 提供的「分步表单、多级联动选择器、附件上传校验」等方案,可适配政务申报、审批等场景。

3.1 核心场景:政务事项申报系统(分步申报 + 数据暂存)

政务申报场景需填写大量字段,且流程复杂,支持「数据暂存、进度查询、公文格式校验」,DevUI 的「分步表单、数据暂存服务、附件上传组件」可快速实现。

实战代码:政务事项申报表单
<!-- 政务事项申报:分步表单+数据暂存+公文校验 -->
<div class="gov-application">
  <!-- 申报进度条 -->
  <d-progress 
    [value]="progress" 
    [steps]="applicationSteps.length"
    [stepLabels]="applicationSteps.map(step => step.label)"
    class="progress-bar"
  ></d-progress>

  <!-- 分步表单 -->
  <d-stepper [steps]="applicationSteps" [(activeIndex)]="activeStep" (activeIndexChange)="onStepChange()">
    <!-- 步骤1:基本信息 -->
    <d-step label="基本信息" [formGroup]="basicForm">
      <d-form-item label="事项名称" name="itemName" required>
        <d-select [(ngModel)]="formData.itemName" [options]="itemOptions" placeholder="请选择申报事项"></d-select>
        <d-form-validator error="required" message="请选择申报事项"></d-form-validator>
      </d-form-item>

      <d-form-item label="申报单位" name="unitName" required>
        <d-input [(ngModel)]="formData.unitName" placeholder="请输入申报单位全称"></d-input>
        <d-form-validator error="required" message="申报单位不能为空"></d-form-validator>
      </d-form-item>

      <d-form-item label="统一社会信用代码" name="creditCode" required>
        <d-input [(ngModel)]="formData.creditCode" placeholder="请输入18位统一社会信用代码"></d-input>
        <d-form-validator error="required" message="统一社会信用代码不能为空"></d-form-validator>
        <d-form-validator error="pattern" message="统一社会信用代码格式不正确"></d-form-validator>
      </d-form-item>
    </d-step>

    <!-- 步骤2:申报信息(多级联动+日期筛选) -->
    <d-step label="申报信息" [formGroup]="detailForm">
      <d-form-item label="所属地区" name="region" required>
        <!-- 政务专属:省市区多级联动选择器 -->
        <d-cascader 
          [(ngModel)]="formData.region" 
          [options]="regionOptions"
          [level]="3"
          placeholder="请选择省/市/区"
        ></d-cascader>
        <d-form-validator error="required" message="请选择所属地区"></d-form-validator>
      </d-form-item>

      <d-form-item label="申报日期" name="applyDate" required>
        <!-- 政务专属:日期范围选择器(支持工作日筛选) -->
        <d-date-picker 
          [(ngModel)]="formData.applyDate" 
          type="daterange"
          [workdayFilter]="true"
          placeholder="请选择申报日期范围"
        ></d-date-picker>
        <d-form-validator error="required" message="请选择申报日期范围"></d-form-validator>
      </d-form-item>

      <d-form-item label="申报内容" name="content" required>
        <d-textarea [(ngModel)]="formData.content" rows="5" placeholder="请详细描述申报内容"></d-textarea>
        <d-form-validator error="required" message="申报内容不能为空"></d-form-validator>
        <d-form-validator error="minlength" message="申报内容不能少于100字"></d-form-validator>
      </d-form-item>
    </d-step>

    <!-- 步骤3:附件上传(公文格式校验) -->
    <d-step label="附件上传" [formGroup]="attachmentForm">
      <d-form-item label="必备附件">
        <div *ngFor="let fileType of requiredFiles">
          <d-upload
            [(ngModel)]="formData.attachments[fileType.key]"
            [accept]="fileType.accept"
            [fileSizeLimit]="10 * 1024 * 1024" // 限制10MB
            [fileNumLimit]="1"
            [uploadApi]="uploadApi"
            [fileValidate]="fileType.validate" // 公文格式校验
            (success)="onFileUploadSuccess($event, fileType.key)"
          >
            <button d-button type="text" theme="primary">
              <d-icon name="upload-o"></d-icon> 上传{{ fileType.name }}({{ fileType.format }})
            </button>
          </d-upload>
          <d-form-validator 
            *ngIf="!formData.attachments[fileType.key]" 
            error="required" 
            message="{{ fileType.name }}为必备附件,请上传"
          ></d-form-validator>
        </div>
      </d-form-item>

      <d-form-item label="可选附件">
        <d-upload
          [(ngModel)]="formData.optionalAttachments"
          [accept]="'.pdf,.doc,.docx,.xls,.xlsx'"
          [fileSizeLimit]="10 * 1024 * 1024"
          [fileNumLimit]="5"
          [uploadApi]="uploadApi"
        >
          <button d-button type="text" theme="default">
            <d-icon name="upload-o"></d-icon> 上传可选附件(最多5个)
          </button>
        </d-upload>
      </d-form-item>
    </d-step>

    <!-- 步骤4:确认提交 -->
    <d-step label="确认提交" [formGroup]="confirmForm">
      <div class="confirm-info">
        <h4>申报信息确认</h4>
        <p>事项名称:{{ formData.itemName }}</p>
        <p>申报单位:{{ formData.unitName }}</p>
        <p>所属地区:{{ formData.region?.join('/') }}</p>
        <p>申报日期:{{ formData.applyDate?.[0] }} 至 {{ formData.applyDate?.[1] }}</p>
      </div>

      <d-form-item label="声明">
        <d-checkbox [(ngModel)]="formData.declaration" required>
          本人声明所提交的申报信息及附件真实、合法、有效,如有虚假,愿意承担相应法律责任。
        </d-checkbox>
        <d-form-validator error="required" message="请勾选声明"></d-form-validator>
      </d-form-item>

      <d-form-operation>
        <button d-button type="button" (click)="saveDraft()">保存草稿</button>
        <button d-button type="submit" theme="primary" (click)="submitApplication()">提交申报</button>
      </d-form-operation>
    </d-step>
  </d-stepper>
</div>
// 组件逻辑:数据暂存+公文校验+进度计算
import { Component } from '@angular/core';
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
import { ApplicationService } from './application.service';
import { DraftService } from './draft.service'; // 草稿保存服务

@Component({
  selector: 'app-gov-application',
  templateUrl: './gov-application.component.html'
})
export class GovApplicationComponent {
  activeStep = 0;
  progress = 25; // 申报进度(4个步骤,初始25%)
  uploadApi = '/api/upload/file'; // 附件上传接口

  // 申报步骤配置
  applicationSteps = [
    { label: '基本信息', icon: 'info-o' },
    { label: '申报信息', icon: 'form-o' },
    { label: '附件上传', icon: 'attachment-o' },
    { label: '确认提交', icon: 'check-o' }
  ];

  // 必备附件配置(含格式校验)
  requiredFiles = [
    {
      key: 'businessLicense',
      name: '营业执照',
      format: 'PDF/JPG',
      accept: '.pdf,.jpg,.jpeg',
      validate: (file: File) => {
        // 公文格式校验:文件名必须包含"营业执照",且格式为PDF/JPG
        return file.name.includes('营业执照') && ['.pdf', '.jpg', '.jpeg'].includes(file.name.split('.').pop() || '');
      }
    },
    {
      key: 'applicationForm',
      name: '申报申请表',
      format: 'PDF/DOCX',
      accept: '.pdf,.docx',
      validate: (file: File) => {
        return file.name.includes('申报申请表') && ['.pdf', '.docx'].includes(file.name.split('.').pop() || '');
      }
    }
  ];

  // 申报数据(初始化时加载草稿)
  formData = {
    itemName: '',
    unitName: '',
    creditCode: '',
    region: [],
    applyDate: [],
    content: '',
    attachments: {},
    optionalAttachments: [],
    declaration: false
  };

  // 表单校验组
  basicForm: FormGroup;
  detailForm: FormGroup;
  attachmentForm: FormGroup;
  confirmForm: FormGroup;

  // 事项选项
  itemOptions = [
    { label: '企业设立登记', value: 'enterpriseRegistration' },
    { label: '经营许可证申请', value: 'businessLicense' },
    { label: '税收优惠申报', value: 'taxPreference' }
  ];

  // 省市区联动数据
  regionOptions = [
    {
      label: '北京市',
      value: '110000',
      children: [
        { label: '北京市', value: '110100', children: [
          { label: '东城区', value: '110101' },
          { label: '西城区', value: '110102' }
        ]}
      ]
    }
    // 其他地区...
  ];

  constructor(
    private fb: FormBuilder,
    private applicationService: ApplicationService,
    private draftService: DraftService
  ) {
    // 初始化表单校验
    this.initFormGroups();

    // 加载草稿数据(如果存在)
    this.loadDraft();
  }

  // 初始化表单校验规则
  initFormGroups() {
    this.basicForm = this.fb.group({
      itemName: [null, [Validators.required]],
      unitName: [null, [Validators.required]],
      creditCode: [null, [Validators.required, Validators.pattern(/^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/)]]
    });

    this.detailForm = this.fb.group({
      region: [null, [Validators.required]],
      applyDate: [null, [Validators.required]],
      content: [null, [Validators.required, Validators.minLength(100)]]
    });

    this.attachmentForm = this.fb.group({
      attachments: [null, [Validators.required]]
    });

    this.confirmForm = this.fb.group({
      declaration: [false, [Validators.requiredTrue]]
    });
  }

  // 加载草稿数据(从本地存储或后端获取)
  loadDraft() {
    this.draftService.getDraft('govApplication').subscribe(draft => {
      if (draft) {
        this.formData = draft.data;
        this.activeStep = draft.step;
        this.calculateProgress(); // 重新计算进度
      }
    });
  }

  // 步骤切换时计算进度
  onStepChange() {
    this.calculateProgress();

    // 保存当前步骤到草稿
    this.saveDraft(true);
  }

  // 计算申报进度
  calculateProgress() {
    this.progress = ((this.activeStep + 1) / this.applicationSteps.length) * 100;
  }

  // 保存草稿(自动保存/手动保存)
  saveDraft(autoSave = false) {
    const draft = {
      data: this.formData,
      step: this.activeStep,
      saveTime: new Date().toISOString()
    };

    this.draftService.saveDraft('govApplication', draft).subscribe(() => {
      if (!autoSave) {
        alert('草稿保存成功!');
      }
    });
  }

  // 附件上传成功回调
  onFileUploadSuccess(res: any, key:

DevUI 的进阶能力核心在于「原生优化 + 生态协同」:

  1. 性能优化:通过虚拟滚动、数据分片、懒加载,解决大数据场景的性能瓶颈;
  2. 自定义组件:基于 DevUI 基础组件封装行业专属组件,确保风格与交互一致性;
  3. 状态管理:与 NgRx 等状态管理库协同,实现复杂场景的组件联动与数据共享。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐