重命名CubeListPager和CubeListToolbarSearch
Yann authored at 2025-07-28 22:53:20 Yann committed at 2025-07-28 23:04:14
6.84 KiB
cube-front
<template>
  <div class="sso-token-container">
    <el-card class="box-card">
      <template #header>
        <div class="card-header">
          <h3>SSO Token</h3>
          <el-button type="primary" @click="handleGetToken">获取Token</el-button>
        </div>
      </template>

      <el-form :model="tokenForm" :rules="tokenRules" ref="tokenFormRef" label-width="120px">
        <el-form-item label="客户端ID" prop="client_id">
          <el-input v-model="tokenForm.client_id" placeholder="请输入客户端ID" />
        </el-form-item>
        <el-form-item label="客户端密钥" prop="client_secret">
          <el-input v-model="tokenForm.client_secret" type="password" placeholder="请输入客户端密钥" />
        </el-form-item>
        <el-form-item label="用户名" prop="username">
          <el-input v-model="tokenForm.username" placeholder="请输入用户名" />
        </el-form-item>
        <el-form-item label="密码" prop="password">
          <el-input v-model="tokenForm.password" type="password" placeholder="请输入密码" />
        </el-form-item>
        <el-form-item label="刷新令牌" prop="refresh_token">
          <el-input v-model="tokenForm.refresh_token" placeholder="请输入刷新令牌" />
        </el-form-item>
        <el-form-item label="授权类型" prop="grant_type">
          <el-select v-model="tokenForm.grant_type" placeholder="请选择授权类型">
            <el-option label="password" value="password" />
            <el-option label="client_credentials" value="client_credentials" />
            <el-option label="authorization_code" value="authorization_code" />
            <el-option label="refresh_token" value="refresh_token" />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="handleGetToken" :loading="loading">获取Token</el-button>
          <el-button @click="handlePostToken" :loading="loading">POST获取Token</el-button>
          <el-button @click="resetForm">重置</el-button>
        </el-form-item>
      </el-form>

      <div v-if="tokenResult" class="token-result">
        <el-alert
          :title="tokenResult.success ? '获取Token成功' : '获取Token失败'"
          :type="tokenResult.success ? 'success' : 'error'"
          :description="tokenResult.message"
          show-icon
          :closable="false"
        />

        <el-table v-if="tokenResult.data" :data="tokenResult.data" border style="width: 100%; margin-top: 20px;">
          <el-table-column prop="key" label="字段" width="200" />
          <el-table-column prop="value" label="值" />
        </el-table>
      </div>
    </el-card>
  </div>
</template>

<script setup lang="ts">
import { ref, reactive } from 'vue';
import { request } from '@core/utils/request';
import type { FormInstance, FormRules } from 'element-plus';

// 定义Token参数类型
interface SsoTokenParams {
  client_id: string;
  client_secret: string;
  username: string;
  password: string;
  refresh_token: string;
  grant_type: string;
}

// 定义结果类型
interface TokenResult {
  success: boolean;
  message: string;
  data?: Array<{key: string, value: string}>;
}

// 表单引用
const tokenFormRef = ref<FormInstance | null>(null);

// Token表单
const tokenForm = reactive<SsoTokenParams>({
  client_id: '',
  client_secret: '',
  username: '',
  password: '',
  refresh_token: '',
  grant_type: 'password',
});

// 表单验证规则
const tokenRules = reactive<FormRules>({
  client_id: [
    { required: true, message: '请输入客户端ID', trigger: 'blur' }
  ],
  client_secret: [
    { required: true, message: '请输入客户端密钥', trigger: 'blur' }
  ],
  grant_type: [
    { required: true, message: '请选择授权类型', trigger: 'change' }
  ]
});

// 状态
const loading = ref(false);
const tokenResult = ref<TokenResult | null>(null);

// GET方式获取Token
const handleGetToken = async () => {
  if (!tokenFormRef.value) return;

  await tokenFormRef.value.validate(async (valid: boolean) => {
    if (!valid) return;

    loading.value = true;
    tokenResult.value = null;

    try {
      const response = await request.get('/Sso/Token', {
        params: {
          client_id: tokenForm.client_id,
          client_secret: tokenForm.client_secret,
          username: tokenForm.username || undefined,
          password: tokenForm.password || undefined,
          refresh_token: tokenForm.refresh_token || undefined,
          grant_type: tokenForm.grant_type,
        },
      });

      tokenResult.value = {
        success: true,
        message: '获取Token成功',
        data: flattenObject(response),
      };
    } catch (error) {
      tokenResult.value = {
        success: false,
        message: `获取Token失败: ${error}`,
      };
    } finally {
      loading.value = false;
    }
  });
};

// POST方式获取Token
const handlePostToken = async () => {
  if (!tokenFormRef.value) return;

  await tokenFormRef.value.validate(async (valid: boolean) => {
    if (!valid) return;

    loading.value = true;
    tokenResult.value = null;

    try {
      const response = await request.post('/Sso/Token', null, {
        params: {
          client_id: tokenForm.client_id,
          client_secret: tokenForm.client_secret,
          username: tokenForm.username || undefined,
          password: tokenForm.password || undefined,
          refresh_token: tokenForm.refresh_token || undefined,
          grant_type: tokenForm.grant_type,
        },
      });

      tokenResult.value = {
        success: true,
        message: '获取Token成功',
        data: flattenObject(response),
      };
    } catch (error) {
      tokenResult.value = {
        success: false,
        message: `获取Token失败: ${error}`,
      };
    } finally {
      loading.value = false;
    }
  });
};

// 重置表单
const resetForm = () => {
  if (tokenFormRef.value) {
    tokenFormRef.value.resetFields();
  }
  tokenResult.value = null;
};

// 扁平化对象用于表格显示
const flattenObject = (obj: unknown): Array<{key: string, value: string}> => {
  const result: Array<{key: string, value: string}> = [];

  if (!obj || typeof obj !== 'object') {
    return result;
  }

  const flatten = (current: Record<string, unknown>, prefix = '') => {
    Object.keys(current).forEach(key => {
      const value = current[key];
      const newKey = prefix ? `${prefix}.${key}` : key;

      if (value && typeof value === 'object' && !Array.isArray(value)) {
        flatten(value as Record<string, unknown>, newKey);
      } else {
        result.push({
          key: newKey,
          value: String(value),
        });
      }
    });
  };

  flatten(obj as Record<string, unknown>);
  return result;
};
</script>

<style scoped>
.sso-token-container {
  padding: 20px;
}

.card-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.token-result {
  margin-top: 20px;
}
</style>