增加必填校验 提升casbin版本 (#1170)
* 添加rule检测 * 调整初始化顺序,防止在数据库创建错误的时候,修改了配置文件。 * (feat):自动生产代码新增校验 * 增加校验功能 升级casbin Co-authored-by: bypanghu <bypanghu@163.com>
This commit is contained in:
committed by
GitHub
co-authored by
bypanghu
parent
14de145c02
commit
f0d31fd48d
+7
-4
@@ -12,9 +12,12 @@ module.exports = {
|
||||
es6: true
|
||||
},
|
||||
extends: ['plugin:vue/recommended', 'eslint:recommended'],
|
||||
|
||||
// add your custom rules here
|
||||
// it is base on https://github.com/vuejs/eslint-config-vue
|
||||
globals: {
|
||||
defineProps: "readonly",
|
||||
defineEmits: "readonly",
|
||||
defineExpose: "readonly",
|
||||
withDefaults: "readonly",
|
||||
},
|
||||
rules: {
|
||||
'vue/no-v-model-argument':'off',
|
||||
'vue/max-attributes-per-line': [
|
||||
@@ -174,7 +177,7 @@ module.exports = {
|
||||
'no-this-before-super': 2,
|
||||
'no-throw-literal': 2,
|
||||
'no-trailing-spaces': 2,
|
||||
'no-undef': 2,
|
||||
'no-undef': 'off',
|
||||
'no-undef-init': 2,
|
||||
'no-unexpected-multiline': 2,
|
||||
'no-unmodified-loop-condition': 2,
|
||||
|
||||
+1
-1
@@ -49,4 +49,4 @@
|
||||
"vite-plugin-banner": "^0.1.3",
|
||||
"vite-plugin-importer": "^0.2.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+13
-13
@@ -2,6 +2,7 @@ import { useUserStore } from '@/pinia/modules/user'
|
||||
import { useRouterStore } from '@/pinia/modules/router'
|
||||
import getPageTitle from '@/utils/page'
|
||||
import router from '@/router'
|
||||
import { ElProgress } from 'element-plus'
|
||||
|
||||
let asyncRouterFlag = 0
|
||||
|
||||
@@ -36,7 +37,7 @@ async function handleKeepAlive(to) {
|
||||
}
|
||||
}
|
||||
|
||||
router.beforeEach(async(to, from, next) => {
|
||||
router.beforeEach(async(to, from) => {
|
||||
const userStore = useUserStore()
|
||||
to.meta.matched = [...to.matched]
|
||||
handleKeepAlive(to)
|
||||
@@ -51,20 +52,19 @@ router.beforeEach(async(to, from, next) => {
|
||||
}
|
||||
// token 可以解析但是却是不存在的用户 id 或角色 id 会导致无限调用
|
||||
if (userStore.userInfo?.authority?.defaultRouter != null) {
|
||||
next({ name: userStore.userInfo.authority.defaultRouter })
|
||||
return { name: userStore.userInfo.authority.defaultRouter }
|
||||
} else {
|
||||
// 强制退出账号
|
||||
userStore.ClearStorage()
|
||||
next({
|
||||
return {
|
||||
name: 'Login',
|
||||
query: {
|
||||
redirect: document.location.hash
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
} else {
|
||||
next()
|
||||
return true
|
||||
}
|
||||
} else {
|
||||
// 不在白名单中并且已经登录的时候
|
||||
@@ -74,29 +74,29 @@ router.beforeEach(async(to, from, next) => {
|
||||
asyncRouterFlag++
|
||||
await getRouter(userStore)
|
||||
if (userStore.token) {
|
||||
next({ ...to, replace: true })
|
||||
return { ...to, replace: true }
|
||||
} else {
|
||||
next({
|
||||
return {
|
||||
name: 'Login',
|
||||
query: { redirect: to.href }
|
||||
})
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (to.matched.length) {
|
||||
next()
|
||||
return true
|
||||
} else {
|
||||
next({ path: '/layout/404' })
|
||||
return { path: '/layout/404' }
|
||||
}
|
||||
}
|
||||
}
|
||||
// 不在白名单中并且未登录的时候
|
||||
if (!token) {
|
||||
next({
|
||||
return {
|
||||
name: 'Login',
|
||||
query: {
|
||||
redirect: document.location.hash
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -76,7 +76,7 @@ const showNext = () => {
|
||||
}
|
||||
|
||||
const goDoc = () => {
|
||||
window.open('https://www.gin-vue-admin.com/docs/first_master#3-init')
|
||||
window.open('https://www.gin-vue-admin.com/guide/start-quickly/env.html')
|
||||
}
|
||||
|
||||
const out = ref(false)
|
||||
|
||||
@@ -78,7 +78,12 @@
|
||||
<HistoryComponent ref="layoutHistoryComponent" />
|
||||
</div>
|
||||
</transition>
|
||||
<router-view v-if="reloadFlag" v-slot="{ Component }" v-loading="loadingFlag" element-loading-text="正在加载中" class="admin-box">
|
||||
<router-view
|
||||
v-if="reloadFlag"
|
||||
v-slot="{ Component }"
|
||||
v-loading="loadingFlag"
|
||||
element-loading-text="正在加载中"
|
||||
class="admin-box">
|
||||
<div>
|
||||
<transition mode="out-in" name="el-fade-in-linear">
|
||||
<keep-alive :include="routerStore.keepAliveRouters">
|
||||
|
||||
@@ -5,12 +5,15 @@
|
||||
ref="fieldDialogFrom"
|
||||
:model="middleDate"
|
||||
label-width="120px"
|
||||
label-position="left"
|
||||
label-position="right"
|
||||
:rules="rules"
|
||||
class="grid-form"
|
||||
>
|
||||
<el-form-item label="Field名称" prop="fieldName">
|
||||
<el-input v-model="middleDate.fieldName" autocomplete="off" style="width:80%" />
|
||||
<el-button size="small" style="width:18%;margin-left:2%" @click="autoFill">自动填充</el-button>
|
||||
<el-button size="small" style="width:18%;margin-left:2%" @click="autoFill">
|
||||
<span style="font-size: 12px">自动填充</span>
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
<el-form-item label="Field中文名" prop="fieldDesc">
|
||||
<el-input v-model="middleDate.fieldDesc" autocomplete="off" />
|
||||
@@ -59,7 +62,6 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="关联字典" prop="dictType">
|
||||
<el-select
|
||||
v-model="middleDate.dictType"
|
||||
@@ -76,16 +78,21 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="前端表单验证">
|
||||
<el-switch v-model="middleDate.fontRuleKey" />
|
||||
</el-form-item>
|
||||
<el-form-item v-if="middleDate.fontRuleKey" label="验证规则">
|
||||
<div class="click-text" @click="handleOpenDialogVisible">点击设置前端表单验证</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
import { toLowerCase, toSQLLine } from '@/utils/stringFun'
|
||||
import { getSysDictionaryList } from '@/api/sysDictionary'
|
||||
import WarningBar from '@/components/warningBar/warningBar.vue'
|
||||
import { ref } from 'vue'
|
||||
import { reactive, ref } from 'vue'
|
||||
|
||||
const props = defineProps({
|
||||
dialogMiddle: {
|
||||
@@ -98,6 +105,7 @@ const props = defineProps({
|
||||
|
||||
const middleDate = ref({})
|
||||
const dictOptions = ref([])
|
||||
const ruleDialog = ref()
|
||||
const typeSearchOptions = ref([
|
||||
{
|
||||
label: '=',
|
||||
@@ -195,3 +203,15 @@ export default {
|
||||
name: 'FieldDialog'
|
||||
}
|
||||
</script>
|
||||
<style scoped>
|
||||
.grid-form{
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
}
|
||||
.click-text{
|
||||
color: #0d84ff;
|
||||
font-size: 13px;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
</div>
|
||||
<div class="gva-search-box">
|
||||
<!-- 初始版本自动化代码工具 -->
|
||||
<el-form ref="autoCodeForm" :rules="rules" :model="form" label-width="120px" :inline="true">
|
||||
<el-form ref="autoCodeForm" :rules="rules" :model="form" size="small" label-width="120px" :inline="true">
|
||||
<el-form-item label="Struct名称" prop="structName">
|
||||
<el-input v-model="form.structName" placeholder="首字母自动转换大写" />
|
||||
</el-form-item>
|
||||
@@ -95,17 +95,20 @@
|
||||
<el-button size="small" type="primary" @click="editAndAddField()">新增Field</el-button>
|
||||
</div>
|
||||
<el-table :data="form.fields">
|
||||
<el-table-column align="left" type="index" label="序列" width="100" />
|
||||
<el-table-column align="left" type="index" label="序列" width="60" />
|
||||
<el-table-column align="left" prop="fieldName" label="Field名" />
|
||||
<el-table-column align="left" prop="fieldDesc" label="中文名" />
|
||||
<el-table-column align="left" prop="fieldJson" label="FieldJson" />
|
||||
<el-table-column align="left" prop="fieldDesc" label="是否必填">
|
||||
<template #default="{row}">{{row.require?"是":"否"}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="left" prop="fieldJson" min-width="120px" label="FieldJson" />
|
||||
<el-table-column align="left" prop="fieldType" label="Field数据类型" width="130" />
|
||||
<el-table-column align="left" prop="dataTypeLong" label="数据库字段长度" width="130" />
|
||||
<el-table-column align="left" prop="columnName" label="数据库字段" width="130" />
|
||||
<el-table-column align="left" prop="comment" label="数据库字段描述" width="130" />
|
||||
<el-table-column align="left" prop="fieldSearchType" label="搜索条件" width="130" />
|
||||
<el-table-column align="left" prop="dictType" label="字典" width="130" />
|
||||
<el-table-column align="left" label="操作" width="300">
|
||||
<el-table-column align="left" label="操作" width="300" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
size="small"
|
||||
@@ -148,7 +151,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<!-- 组件弹窗 -->
|
||||
<el-dialog v-model="dialogFlag" title="组件内容">
|
||||
<el-dialog v-model="dialogFlag" width="70%" title="组件内容">
|
||||
<FieldDialog v-if="dialogFlag" ref="fieldDialogNode" :dialog-middle="dialogMiddle" />
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
@@ -187,6 +190,9 @@ const fieldTemplate = {
|
||||
columnName: '',
|
||||
dataTypeLong: '',
|
||||
comment: '',
|
||||
require:false,
|
||||
errorText:"",
|
||||
clearable:true,
|
||||
fieldSearchType: '',
|
||||
dictType: ''
|
||||
}
|
||||
@@ -435,6 +441,9 @@ const getColumnFunc = async() => {
|
||||
dataTypeLong: item.dataTypeLong && item.dataTypeLong.split(',')[0],
|
||||
columnName: item.columnName,
|
||||
comment: item.columnComment,
|
||||
require:false,
|
||||
errorText:"",
|
||||
clearable:true,
|
||||
fieldSearchType: '',
|
||||
dictType: ''
|
||||
})
|
||||
@@ -517,4 +526,5 @@ export default {
|
||||
color: #666;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user