FLAG:user页面修改密码/清空密码功能暂时禁用,搜 edit1111
Yann authored at 2025-08-01 23:26:56
17.19 KiB
cube-front
<template>
  <div class="cube-container">
    <el-card class="box-card">
      <template #header>
        <div class="card-header">
          <h3>魔方设置</h3>
          <el-button type="primary" @click="handleSave">保存设置</el-button>
        </div>
      </template>

      <el-form ref="formRef" :model="form" label-width="140px" v-loading="loading">
        <el-tabs v-model="activeTab">
          <!-- 基本设置 -->
          <el-tab-pane label="基本设置" name="basic">
            <el-form-item label="调试模式" prop="debug">
              <el-switch v-model="form.debug" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="显示运行时间" prop="showRunTime">
              <el-switch v-model="form.showRunTime" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="头像目录" prop="avatarPath">
              <el-input v-model="form.avatarPath" placeholder="设定后下载远程头像到本地,默认Avatars子目录" />
            </el-form-item>
            <el-form-item label="上传目录" prop="uploadPath">
              <el-input v-model="form.uploadPath" placeholder="默认Uploads" />
            </el-form-item>
            <el-form-item label="静态资源目录" prop="webRootPath">
              <el-input v-model="form.webRootPath" placeholder="默认wwwroot" />
            </el-form-item>
            <el-form-item label="资源地址" prop="resourceUrl">
              <el-input v-model="form.resourceUrl" placeholder="指向CDN,留空表示使用本地" />
            </el-form-item>
          </el-tab-pane>

          <!-- 安全设置 -->
          <el-tab-pane label="安全设置" name="security">
            <el-form-item label="跨域来源" prop="corsOrigins">
              <el-input v-model="form.corsOrigins" placeholder="允许其它源访问当前域,*表示任意域" />
            </el-form-item>
            <el-form-item label="iframe展示" prop="xFrameOptions">
              <el-select v-model="form.xFrameOptions" placeholder="请选择iframe展示方式">
                <el-option label="只允许相同域名(默认)" value="" />
                <el-option label="允许相同域名和端口" value="SAMEORIGIN" />
                <el-option label="允许任何域名" value="ALLOWALL" />
              </el-select>
            </el-form-item>
            <el-form-item label="Cookie模式" prop="sameSiteMode">
              <el-select v-model="form.sameSiteMode" placeholder="请选择Cookie模式">
                <el-option label="Unspecified" :value="-1" />
                <el-option label="None" :value="0" />
                <el-option label="Lax" :value="1" />
                <el-option label="Strict" :value="2" />
              </el-select>
            </el-form-item>
            <el-form-item label="Cookie域名" prop="cookieDomain">
              <el-input v-model="form.cookieDomain" placeholder="可用于把Cookie写到顶级域名" />
            </el-form-item>
            <el-form-item label="机器人错误码" prop="robotError">
              <el-input-number v-model="form.robotError" :min="0" :max="599" placeholder="设置后拦截各种爬虫,0不拦截" />
            </el-form-item>
            <el-form-item label="强制跳转" prop="forceRedirect">
              <el-input v-model="form.forceRedirect" placeholder="如https://*:8081" />
            </el-form-item>
          </el-tab-pane>

          <!-- 用户设置 -->
          <el-tab-pane label="用户设置" name="user">
            <el-form-item label="默认角色" prop="defaultRole">
              <el-input v-model="form.defaultRole" placeholder="默认普通用户" />
            </el-form-item>
            <el-form-item label="允许密码登录" prop="allowLogin">
              <el-switch v-model="form.allowLogin" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="允许注册" prop="allowRegister">
              <el-switch v-model="form.allowRegister" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="自动注册" prop="autoRegister">
              <el-switch v-model="form.autoRegister" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="密码强度" prop="paswordStrength">
              <el-input v-model="form.paswordStrength" placeholder="*表示无限制,默认8位起" />
            </el-form-item>
            <el-form-item label="登录失败次数" prop="maxLoginError">
              <el-input-number v-model="form.maxLoginError" :min="1" placeholder="默认5次" />
            </el-form-item>
            <el-form-item label="登录封禁时间" prop="loginForbiddenTime">
              <el-input-number v-model="form.loginForbiddenTime" :min="1" placeholder="默认300秒" />
            </el-form-item>
          </el-tab-pane>

          <!-- SSO设置 -->
          <el-tab-pane label="SSO设置" name="sso">
            <el-form-item label="强行绑定用户名" prop="forceBindUser">
              <el-switch v-model="form.forceBindUser" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="绑定用户代码" prop="forceBindUserCode">
              <el-switch v-model="form.forceBindUserCode" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="绑定用户手机" prop="forceBindUserMobile">
              <el-switch v-model="form.forceBindUserMobile" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="绑定用户邮箱" prop="forceBindUserMail">
              <el-switch v-model="form.forceBindUserMail" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="绑定用户昵称" prop="forceBindNickName">
              <el-switch v-model="form.forceBindNickName" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="使用SSO角色" prop="useSsoRole">
              <el-switch v-model="form.useSsoRole" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="使用SSO部门" prop="useSsoDepartment">
              <el-switch v-model="form.useSsoDepartment" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="注销所有系统" prop="logoutAll">
              <el-switch v-model="form.logoutAll" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="会话超时" prop="sessionTimeout">
              <el-input-number v-model="form.sessionTimeout" :min="0" placeholder="单位秒,0表示不超时" />
            </el-form-item>
            <el-form-item label="刷新用户周期" prop="refreshUserPeriod">
              <el-input-number v-model="form.refreshUserPeriod" :min="0" placeholder="默认600秒" />
            </el-form-item>
          </el-tab-pane>

          <!-- JWT设置 -->
          <el-tab-pane label="JWT设置" name="jwt">
            <el-form-item label="JWT密钥" prop="jwtSecret">
              <el-input v-model="form.jwtSecret" placeholder="如HS256:ABCD1234" />
            </el-form-item>
            <el-form-item label="令牌有效期" prop="tokenExpire">
              <el-input-number v-model="form.tokenExpire" :min="1" placeholder="默认7200秒" />
            </el-form-item>
            <el-form-item label="Cookie存储令牌" prop="tokenCookie">
              <el-switch v-model="form.tokenCookie" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="分享有效期" prop="shareExpire">
              <el-input-number v-model="form.shareExpire" :min="1" placeholder="默认7200秒" />
            </el-form-item>
          </el-tab-pane>

          <!-- 界面设置 -->
          <el-tab-pane label="界面设置" name="ui">
            <el-form-item label="工作台页面" prop="startPage">
              <el-input v-model="form.startPage" placeholder="进入后台的第一个内容页" />
            </el-form-item>
            <el-form-item label="主题样式" prop="theme">
              <el-select v-model="form.theme" placeholder="请选择主题样式">
                <el-option label="ACE" value="ACE" />
                <el-option label="layui" value="layui" />
              </el-select>
            </el-form-item>
            <el-form-item label="首页皮肤" prop="skin">
              <el-select v-model="form.skin" placeholder="请选择首页皮肤">
                <el-option label="ACE" value="ACE" />
                <el-option label="layui" value="layui" />
              </el-select>
            </el-form-item>
            <el-form-item label="登录提示" prop="loginTip">
              <el-input v-model="form.loginTip" type="textarea" placeholder="留空表示不显示登录提示信息" />
            </el-form-item>
            <el-form-item label="表单组样式" prop="formGroupClass">
              <el-input v-model="form.formGroupClass" placeholder="form-group col-xs-12 col-sm-6 col-lg-4" />
            </el-form-item>
            <el-form-item label="下拉选择框" prop="bootstrapSelect">
              <el-switch v-model="form.bootstrapSelect" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="最大下拉个数" prop="maxDropDownList">
              <el-input-number v-model="form.maxDropDownList" :min="1" placeholder="默认50" />
            </el-form-item>
            <el-form-item label="启用新UI" prop="enableNewUI">
              <el-switch v-model="form.enableNewUI" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="ECharts主题" prop="eChartsTheme">
              <el-input v-model="form.eChartsTheme" placeholder="图表样式主题" />
            </el-form-item>
            <el-form-item label="标题后缀" prop="titlePrefix">
              <el-switch v-model="form.titlePrefix" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="双击事件启用" prop="enableTableDoubleClick">
              <el-switch v-model="form.enableTableDoubleClick" :active-value="true" :inactive-value="false" />
            </el-form-item>
          </el-tab-pane>

          <!-- 其他设置 -->
          <el-tab-pane label="其他设置" name="others">
            <el-form-item label="版权信息" prop="copyright">
              <el-input v-model="form.copyright" placeholder="留空表示不显示版权信息" />
            </el-form-item>
            <el-form-item label="备案号" prop="registration">
              <el-input v-model="form.registration" placeholder="留空表示不显示备案信息" />
            </el-form-item>
            <el-form-item label="星尘Web" prop="starWeb">
              <el-input v-model="form.starWeb" placeholder="星尘控制台地址" />
            </el-form-item>
            <el-form-item label="OAuth服务" prop="enableOAuthServer">
              <el-switch v-model="form.enableOAuthServer" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="多租户" prop="enableTenant">
              <el-switch v-model="form.enableTenant" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="用户在线" prop="enableUserOnline">
              <el-select v-model="form.enableUserOnline" placeholder="请选择用户在线记录方式">
                <el-option label="不记录" :value="0" />
                <el-option label="仅记录已登录用户" :value="1" />
                <el-option label="记录所有访客" :value="2" />
              </el-select>
            </el-form-item>
            <el-form-item label="用户统计" prop="enableUserStat">
              <el-switch v-model="form.enableUserStat" :active-value="true" :inactive-value="false" />
            </el-form-item>
            <el-form-item label="数据保留时间" prop="dataRetention">
              <el-input-number v-model="form.dataRetention" :min="1" placeholder="审计日志与OAuth日志保留天数,默认30天" />
            </el-form-item>
            <el-form-item label="文件保留时间" prop="fileRetention">
              <el-input-number v-model="form.fileRetention" :min="1" placeholder="备份文件保留天数,默认15天" />
            </el-form-item>
            <el-form-item label="保留文件大小" prop="fileRetentionSize">
              <el-input-number v-model="form.fileRetentionSize" :min="1" placeholder="单位K字节,默认1024K" />
            </el-form-item>
            <el-form-item label="最大导出行数" prop="maxExport">
              <el-input-number v-model="form.maxExport" :min="1" placeholder="默认10,000,000" />
            </el-form-item>
            <el-form-item label="最大备份行数" prop="maxBackup">
              <el-input-number v-model="form.maxBackup" :min="1" placeholder="默认10,000,000" />
            </el-form-item>
          </el-tab-pane>
        </el-tabs>
      </el-form>
    </el-card>
  </div>
</template>

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

// 定义魔方配置类型接口
interface CubeSetting {
  isNew: boolean;
  debug: boolean;
  showRunTime: boolean;
  avatarPath: string;
  uploadPath: string;
  webRootPath: string;
  resourceUrl: string;
  corsOrigins: string;
  xFrameOptions: string;
  sameSiteMode: number;
  cookieDomain: string;
  shareExpire: number;
  robotError: number;
  forceRedirect: string;
  defaultRole: string;
  allowLogin: boolean;
  allowRegister: boolean;
  autoRegister: boolean;
  paswordStrength: string;
  maxLoginError: number;
  loginForbiddenTime: number;
  forceBindUser: boolean;
  forceBindUserCode: boolean;
  forceBindUserMobile: boolean;
  forceBindUserMail: boolean;
  forceBindNickName: boolean;
  useSsoRole: boolean;
  useSsoDepartment: boolean;
  logoutAll: boolean;
  sessionTimeout: number;
  refreshUserPeriod: number;
  jwtSecret: string;
  tokenExpire: number;
  tokenCookie: boolean;
  startPage: string;
  theme: string;
  skin: string;
  loginTip: string;
  formGroupClass: string;
  bootstrapSelect: boolean;
  maxDropDownList: number;
  copyright: string;
  registration: string;
  enableNewUI: boolean;
  eChartsTheme: string;
  titlePrefix: boolean;
  enableTableDoubleClick: boolean;
  starWeb: string;
  enableOAuthServer: boolean;
  enableTenant: boolean;
  enableUserOnline: number;
  enableUserStat: boolean;
  dataRetention: number;
  fileRetention: number;
  fileRetentionSize: number;
  maxExport: number;
  maxBackup: number;
}

const loading = ref(false);
const activeTab = ref('basic');
const formRef = ref<FormInstance | null>(null);

// 表单数据
const form = reactive<CubeSetting>({
  isNew: false,
  debug: false,
  showRunTime: false,
  avatarPath: '',
  uploadPath: '',
  webRootPath: '',
  resourceUrl: '',
  corsOrigins: '',
  xFrameOptions: '',
  sameSiteMode: -1,
  cookieDomain: '',
  shareExpire: 7200,
  robotError: 0,
  forceRedirect: '',
  defaultRole: '',
  allowLogin: true,
  allowRegister: false,
  autoRegister: true,
  paswordStrength: '',
  maxLoginError: 5,
  loginForbiddenTime: 300,
  forceBindUser: false,
  forceBindUserCode: false,
  forceBindUserMobile: false,
  forceBindUserMail: false,
  forceBindNickName: false,
  useSsoRole: true,
  useSsoDepartment: true,
  logoutAll: true,
  sessionTimeout: 0,
  refreshUserPeriod: 600,
  jwtSecret: '',
  tokenExpire: 7200,
  tokenCookie: false,
  startPage: '',
  theme: '',
  skin: '',
  loginTip: '',
  formGroupClass: '',
  bootstrapSelect: false,
  maxDropDownList: 50,
  copyright: '',
  registration: '',
  enableNewUI: false,
  eChartsTheme: '',
  titlePrefix: true,
  enableTableDoubleClick: true,
  starWeb: '',
  enableOAuthServer: false,
  enableTenant: false,
  enableUserOnline: 2,
  enableUserStat: true,
  dataRetention: 30,
  fileRetention: 15,
  fileRetentionSize: 1024,
  maxExport: 10000000,
  maxBackup: 10000000,
});

// 加载配置数据
const loadData = async () => {
  loading.value = true;
  try {
    const response = await request.get('/Admin/Cube');

    if (response && response.data) {
      const data = response.data.data || response.data;
      Object.assign(form, data);
    }
  } catch (error) {
    ElMessage.error('加载配置失败');
    console.error('加载配置失败:', error);
  } finally {
    loading.value = false;
  }
};

// 保存配置
const handleSave = async () => {
  try {
    loading.value = true;
    await request.put('/Admin/Cube', form);
    ElMessage.success('保存配置成功');
  } catch (error) {
    ElMessage.error('保存配置失败');
    console.error('保存配置失败:', error);
  } finally {
    loading.value = false;
  }
};

// 初始化加载数据
onMounted(() => {
  loadData();
});
</script>

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

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