增加必填校验 提升casbin版本 (#1170)

* 添加rule检测

* 调整初始化顺序,防止在数据库创建错误的时候,修改了配置文件。

* (feat):自动生产代码新增校验

* 增加校验功能 升级casbin

Co-authored-by: bypanghu <bypanghu@163.com>
This commit is contained in:
奇淼(piexlmax
2022-07-14 16:20:34 +08:00
committed by GitHub
co-authored by bypanghu
parent 14de145c02
commit f0d31fd48d
17 changed files with 604 additions and 347 deletions
+13 -13
View File
@@ -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
}
})
}
}
}
})
+1 -1
View File
@@ -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)
+6 -1
View File
@@ -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>
+15 -5
View File
@@ -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>