Skip to content

升级指南

v1.1.0-beta

  • 升级Eslint9

    1. 删除 .eslintignore、.eslintrc.cjs,切换Eslint配置为eslint.config.js

    2. 遵循Eslint和TypeScript最佳实践,避免使用namespace,切换至type。

    3. 切换目录/api/interface/api/types

    下面以/api/interface/captcha.ts为例:

    ts
    // 登录模块
    export namespace ICaptcha {
      export interface Info {
        bigImageBase64: string;
        bigWidth: number;
        bigHeight: number;
        smallImageBase64: string;
        smallWidth: number;
        smallHeight: number;
        requestId: string;
        posY: number;
        secretKey: string;
      }
      export interface VerifyImageParams {
        requestId: string;
        moveEncrypted: string;
      }
    }
    ts
    // 登录模块
    export type CaptchaInfo = {
      bigImageBase64: string;
      bigWidth: number;
      bigHeight: number;
      smallImageBase64: string;
      smallWidth: number;
      smallHeight: number;
      requestId: string;
      posY: number;
      secretKey: string;
    };
    export type CaptchaVerifyImageParams = {
      requestId: string;
      moveEncrypted: string;
    }
  • 新增useDictOptionshook,用于简化optionsStore.getDictOptions('dynamic_user_options')写法

    ts
    import { useOptionsStore } from '@/stores/modules/options';
    import { useDictOptions } from "@/hooks/useDictOptions";
    // 先声明store
    const optionsStore = useOptionsStore();
    // 使用时
    // 表格配置项
    const columns: ColumnProps<SysTempFileRow>[] = [
      { type: 'selection', width: 80 },
      { prop: 'id', label: '模板标识', width: 120 },
      { prop: 'tempName', label: '模版名' },
      { prop: 'url', label: '文件', width: 120 },
      { prop: 'remark', label: '备注' },
      { prop: 'history', label: '历史' },
      {
        prop: 'createId',
        label: '创建人',
        tag: true,
        enum: optionsStore.getDictOptions('dynamic_user_options'),
        enum: useDictOptions('dynamic_user_options'),
        fieldNames: {
          label: 'codeName',
          value: 'id',
          tagType: 'callbackShowStyle'
        }
      },
      { prop: 'createTime', label: '创建时间' },
      {
        prop: 'updateId',
        label: '更新人',
        tag: true,
        enum: optionsStore.getDictOptions('dynamic_user_options'),
        enum: useDictOptions('dynamic_user_options'),
        fieldNames: {
          label: 'codeName',
          value: 'id',
          tagType: 'callbackShowStyle'
        }
      },
      { prop: 'updateTime', label: '更新时间' },
      { prop: 'operation', label: '操作', width: 250, fixed: 'right' }
    ]
    ts
    <template>
      <el-dialog v-model="visible" :title="`${paramsProps.title}`" :destroy-on-close="true" width="580px" draggable>
        <el-form
          ref="ruleFormRef"
          label-width="140px"
          label-suffix=" :"
          :rules="rules"
          :model="paramsProps.row"
          @submit.enter.prevent="handleSubmit"
        >
        
    		...
            
          <el-form-item label="讲师区分类型" prop="teacherCommonType">
            <el-select v-model="paramsProps.row.teacherCommonType" clearable placeholder="请选择讲师区分类型">
              <el-option
                v-for="item in optionsStore.getDictOptions('account_status')"
                v-for="item in accountStatusOption"
                :key="item.id"
                :label="item.codeName"
                :value="Number(item.id)"
              />
            </el-select>
          </el-form-item>
    		
    		...
    		
        </el-form>
        <template #footer>
          <el-button @click="visible = false"> 取消 </el-button>
          <el-button type="primary" @click="handleSubmit"> 确定 </el-button>
        </template>
      </el-dialog>
    </template>
    
    <script setup lang="ts">
    import { ref, reactive } from 'vue';
    import { type ElForm, ElMessage } from 'element-plus';
    import { useDictOptions } from '@/hooks/useDictOptions';
    
    defineOptions({
      name: 'TeacherStatisticsForm'
    });
    
    const optionsStore = useOptionsStore();
    const accountStatusOption = useDictOptions('account_status');
    
    ...
    
    defineExpose({
      acceptParams
    });
    </script>
    
    <style scoped lang="scss"></style>
  • (sass)官方已经不推荐使用 @import 规则来导入 SCSS 文件,而是提倡使用新的 @use 规则

    vue
    <style scoped lang="scss">
    @import './index.scss';  // [!code --]
    @use './index'; // [!code ++]
    </style>
  • 升级sa-token 1.40.0 至 1.41.0,官方更换了sa-session的序列化对象结构,因此对redis序列化可能失效,导致账户登录失败。

    解决方案:清空redis中的Authorizationkey下的缓存对象,重新登陆即可!