1. 取消百度统计动态配置
2. 新增表格默认排序,动态更新排序信息 3. 将前端框架更新到最新版本(1.8.6)
This commit is contained in:
parent
fc22349bf4
commit
a8d32b0c61
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "vue-element-plus-admin",
|
"name": "vue-element-plus-admin",
|
||||||
"version": "1.8.5",
|
"version": "1.8.6",
|
||||||
"description": "一套基于vue3、element-plus、typesScript、vite3的后台集成方案。",
|
"description": "一套基于vue3、element-plus、typesScript、vite3的后台集成方案。",
|
||||||
"author": "Archer <502431556@qq.com>",
|
"author": "Archer <502431556@qq.com>",
|
||||||
"private": false,
|
"private": false,
|
||||||
|
@ -13,7 +13,7 @@ const prefixCls = getPrefixCls('app')
|
|||||||
|
|
||||||
const appStore = useAppStore()
|
const appStore = useAppStore()
|
||||||
|
|
||||||
// 手动添加mate标签
|
// 添加mate标签
|
||||||
const addMeta = (name: string, content: string) => {
|
const addMeta = (name: string, content: string) => {
|
||||||
const meta = document.createElement('meta')
|
const meta = document.createElement('meta')
|
||||||
meta.content = content
|
meta.content = content
|
||||||
@ -34,10 +34,6 @@ const setSystemConfig = async () => {
|
|||||||
res.data.web_basic.web_desc ||
|
res.data.web_basic.web_desc ||
|
||||||
'Kinit 是一套开箱即用的中后台解决方案,可以作为新项目的启动模版。'
|
'Kinit 是一套开箱即用的中后台解决方案,可以作为新项目的启动模版。'
|
||||||
)
|
)
|
||||||
// 接入百度统计
|
|
||||||
if (res.data.web_baidu.web_baidu) {
|
|
||||||
eval(res.data.web_baidu.web_baidu)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,7 +38,11 @@ const props = defineProps({
|
|||||||
expand: propTypes.bool.def(false),
|
expand: propTypes.bool.def(false),
|
||||||
// 伸缩的界限字段
|
// 伸缩的界限字段
|
||||||
expandField: propTypes.string.def(''),
|
expandField: propTypes.string.def(''),
|
||||||
inline: propTypes.bool.def(true)
|
inline: propTypes.bool.def(true),
|
||||||
|
model: {
|
||||||
|
type: Object as PropType<Recordable>,
|
||||||
|
default: () => ({})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['search', 'reset'])
|
const emit = defineEmits(['search', 'reset'])
|
||||||
@ -74,7 +78,9 @@ const newSchema = computed(() => {
|
|||||||
return schema
|
return schema
|
||||||
})
|
})
|
||||||
|
|
||||||
const { register, elFormRef, methods } = useForm()
|
const { register, elFormRef, methods } = useForm({
|
||||||
|
model: props.model || {}
|
||||||
|
})
|
||||||
|
|
||||||
const search = async () => {
|
const search = async () => {
|
||||||
await unref(elFormRef)?.validate(async (isValid) => {
|
await unref(elFormRef)?.validate(async (isValid) => {
|
||||||
|
@ -10,7 +10,6 @@ import { TableColumn, TableSlotDefault, Pagination, TableSetPropsType } from '..
|
|||||||
import { useAppStore } from '@/store/modules/app'
|
import { useAppStore } from '@/store/modules/app'
|
||||||
|
|
||||||
const appStore = useAppStore()
|
const appStore = useAppStore()
|
||||||
const mobile = appStore.getMobile
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'Table',
|
name: 'Table',
|
||||||
@ -116,10 +115,10 @@ export default defineComponent({
|
|||||||
small: false,
|
small: false,
|
||||||
background: false,
|
background: false,
|
||||||
pagerCount: 7,
|
pagerCount: 7,
|
||||||
layout: mobile
|
layout: appStore.getMobile
|
||||||
? 'prev, pager, next, ->, total'
|
? 'prev, pager, next, ->, total'
|
||||||
: 'sizes, prev, pager, next, jumper, ->, total',
|
: 'sizes, prev, pager, next, jumper, ->, total',
|
||||||
limits: [10, 20, 30, 40, 50, 100],
|
pageSizes: [10, 20, 30, 40, 50, 100],
|
||||||
disabled: false,
|
disabled: false,
|
||||||
hideOnSinglePage: false,
|
hideOnSinglePage: false,
|
||||||
total: 10
|
total: 10
|
||||||
|
@ -42,6 +42,9 @@ export const useForm = (props?: FormProps) => {
|
|||||||
setProps: async (props: FormProps = {}) => {
|
setProps: async (props: FormProps = {}) => {
|
||||||
const form = await getForm()
|
const form = await getForm()
|
||||||
form?.setProps(props)
|
form?.setProps(props)
|
||||||
|
if (props.model) {
|
||||||
|
form?.setValues(props.model)
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setValues: async (data: Recordable) => {
|
setValues: async (data: Recordable) => {
|
||||||
|
@ -5,7 +5,6 @@ import { get } from 'lodash-es'
|
|||||||
import type { TableProps } from '@/components/Table/src/types'
|
import type { TableProps } from '@/components/Table/src/types'
|
||||||
import { useI18n } from '@/hooks/web/useI18n'
|
import { useI18n } from '@/hooks/web/useI18n'
|
||||||
import { TableSetPropsType } from '@/types/table'
|
import { TableSetPropsType } from '@/types/table'
|
||||||
import { columns } from 'element-plus/es/components/table-v2/src/common'
|
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
@ -23,6 +22,8 @@ interface UseTableConfig<T = any> {
|
|||||||
data: string
|
data: string
|
||||||
count?: string
|
count?: string
|
||||||
}
|
}
|
||||||
|
// 默认传递的参数
|
||||||
|
defaultParams?: Recordable
|
||||||
props?: TableProps
|
props?: TableProps
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,6 +37,12 @@ interface TableObject<T = any> {
|
|||||||
currentRow: Nullable<T>
|
currentRow: Nullable<T>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TableOrderChange = {
|
||||||
|
column: Recordable
|
||||||
|
prop: string
|
||||||
|
order: string | null
|
||||||
|
}
|
||||||
|
|
||||||
export const useTable = <T = any>(config?: UseTableConfig<T>) => {
|
export const useTable = <T = any>(config?: UseTableConfig<T>) => {
|
||||||
const tableObject = reactive<TableObject<T>>({
|
const tableObject = reactive<TableObject<T>>({
|
||||||
// 页数
|
// 页数
|
||||||
@ -47,7 +54,9 @@ export const useTable = <T = any>(config?: UseTableConfig<T>) => {
|
|||||||
// 表格数据
|
// 表格数据
|
||||||
tableData: [],
|
tableData: [],
|
||||||
// AxiosConfig 配置
|
// AxiosConfig 配置
|
||||||
params: {},
|
params: {
|
||||||
|
...(config?.defaultParams || {})
|
||||||
|
},
|
||||||
// 加载中
|
// 加载中
|
||||||
loading: true,
|
loading: true,
|
||||||
// 当前行的数据
|
// 当前行的数据
|
||||||
@ -137,6 +146,15 @@ export const useTable = <T = any>(config?: UseTableConfig<T>) => {
|
|||||||
const table = await getTable()
|
const table = await getTable()
|
||||||
return (table?.selections || []) as T[]
|
return (table?.selections || []) as T[]
|
||||||
},
|
},
|
||||||
|
// 设置表格排序
|
||||||
|
setOrderParams: (data: TableOrderChange) => {
|
||||||
|
tableObject.page = 1
|
||||||
|
tableObject.params = Object.assign(tableObject.params, {
|
||||||
|
v_order: data.order,
|
||||||
|
v_order_field: data.prop
|
||||||
|
})
|
||||||
|
methods.getList()
|
||||||
|
},
|
||||||
// 与Search组件结合
|
// 与Search组件结合
|
||||||
setSearchParams: (data: Recordable) => {
|
setSearchParams: (data: Recordable) => {
|
||||||
tableObject.page = 1
|
tableObject.page = 1
|
||||||
|
@ -35,9 +35,6 @@ const { register, elTableRef, tableObject, methods } = useTable({
|
|||||||
delListApi: delMenuListApi,
|
delListApi: delMenuListApi,
|
||||||
response: {
|
response: {
|
||||||
data: 'data'
|
data: 'data'
|
||||||
},
|
|
||||||
props: {
|
|
||||||
columns
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -149,6 +146,7 @@ watch(
|
|||||||
:data="tableObject.tableData"
|
:data="tableObject.tableData"
|
||||||
:loading="tableObject.loading"
|
:loading="tableObject.loading"
|
||||||
:selection="false"
|
:selection="false"
|
||||||
|
:columns="columns"
|
||||||
:border="true"
|
:border="true"
|
||||||
:size="tableSize"
|
:size="tableSize"
|
||||||
row-key="id"
|
row-key="id"
|
||||||
|
@ -26,9 +26,6 @@ const { register, elTableRef, tableObject, methods } = useTable({
|
|||||||
response: {
|
response: {
|
||||||
data: 'data',
|
data: 'data',
|
||||||
count: 'count'
|
count: 'count'
|
||||||
},
|
|
||||||
props: {
|
|
||||||
columns
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -136,6 +133,7 @@ watch(
|
|||||||
v-model:page="tableObject.page"
|
v-model:page="tableObject.page"
|
||||||
:data="tableObject.tableData"
|
:data="tableObject.tableData"
|
||||||
:loading="tableObject.loading"
|
:loading="tableObject.loading"
|
||||||
|
:columns="columns"
|
||||||
:size="tableSize"
|
:size="tableSize"
|
||||||
:border="true"
|
:border="true"
|
||||||
:selection="false"
|
:selection="false"
|
||||||
|
@ -206,7 +206,6 @@ export const searchSchema = reactive<FormSchema[]>([
|
|||||||
value: false
|
value: false
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
value: true
|
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
@ -62,8 +62,8 @@ const { register, elTableRef, tableObject, methods } = useTable({
|
|||||||
data: 'data',
|
data: 'data',
|
||||||
count: 'count'
|
count: 'count'
|
||||||
},
|
},
|
||||||
props: {
|
defaultParams: {
|
||||||
columns
|
is_active: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -199,16 +199,16 @@ const handleCommand = (command: string) => {
|
|||||||
delDatas(null, true)
|
delDatas(null, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 表格排序
|
|
||||||
const tableSortChange = async (data: any) => {
|
|
||||||
console.log(data)
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<ContentWrap>
|
<ContentWrap>
|
||||||
<Search :schema="searchSchema" @search="setSearchParams" @reset="setSearchParams" />
|
<Search
|
||||||
|
:model="{ is_active: true }"
|
||||||
|
:schema="searchSchema"
|
||||||
|
@search="setSearchParams"
|
||||||
|
@reset="setSearchParams"
|
||||||
|
/>
|
||||||
|
|
||||||
<div class="mb-8px flex justify-between">
|
<div class="mb-8px flex justify-between">
|
||||||
<ElRow :gutter="10">
|
<ElRow :gutter="10">
|
||||||
@ -262,6 +262,7 @@ const tableSortChange = async (data: any) => {
|
|||||||
v-model:page="tableObject.page"
|
v-model:page="tableObject.page"
|
||||||
:data="tableObject.tableData"
|
:data="tableObject.tableData"
|
||||||
:loading="tableObject.loading"
|
:loading="tableObject.loading"
|
||||||
|
:columns="columns"
|
||||||
:selection="true"
|
:selection="true"
|
||||||
:size="tableSize"
|
:size="tableSize"
|
||||||
:border="true"
|
:border="true"
|
||||||
@ -269,7 +270,6 @@ const tableSortChange = async (data: any) => {
|
|||||||
total: tableObject.count
|
total: tableObject.count
|
||||||
}"
|
}"
|
||||||
@register="register"
|
@register="register"
|
||||||
@sort-change="tableSortChange"
|
|
||||||
>
|
>
|
||||||
<template #action="{ row }">
|
<template #action="{ row }">
|
||||||
<ElButton
|
<ElButton
|
||||||
|
@ -54,9 +54,6 @@ const { register, elTableRef, tableObject, methods } = useTable({
|
|||||||
response: {
|
response: {
|
||||||
data: 'data',
|
data: 'data',
|
||||||
count: 'count'
|
count: 'count'
|
||||||
},
|
|
||||||
props: {
|
|
||||||
columns
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
tableObject.params = { dict_type_id: dictType }
|
tableObject.params = { dict_type_id: dictType }
|
||||||
@ -164,6 +161,7 @@ watch(
|
|||||||
v-model:page="tableObject.page"
|
v-model:page="tableObject.page"
|
||||||
:data="tableObject.tableData"
|
:data="tableObject.tableData"
|
||||||
:loading="tableObject.loading"
|
:loading="tableObject.loading"
|
||||||
|
:columns="columns"
|
||||||
:selection="false"
|
:selection="false"
|
||||||
:pagination="{
|
:pagination="{
|
||||||
total: tableObject.count
|
total: tableObject.count
|
||||||
|
@ -29,9 +29,6 @@ const { register, elTableRef, tableObject, methods } = useTable({
|
|||||||
response: {
|
response: {
|
||||||
data: 'data',
|
data: 'data',
|
||||||
count: 'count'
|
count: 'count'
|
||||||
},
|
|
||||||
props: {
|
|
||||||
columns
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -135,6 +132,7 @@ watch(
|
|||||||
<Table
|
<Table
|
||||||
v-model:limit="tableObject.limit"
|
v-model:limit="tableObject.limit"
|
||||||
v-model:page="tableObject.page"
|
v-model:page="tableObject.page"
|
||||||
|
:columns="columns"
|
||||||
:data="tableObject.tableData"
|
:data="tableObject.tableData"
|
||||||
:loading="tableObject.loading"
|
:loading="tableObject.loading"
|
||||||
:selection="false"
|
:selection="false"
|
||||||
|
@ -79,7 +79,8 @@ export const columns = reactive<TableColumn[]>([
|
|||||||
field: 'create_datetime',
|
field: 'create_datetime',
|
||||||
label: '创建时间',
|
label: '创建时间',
|
||||||
show: true,
|
show: true,
|
||||||
span: 24
|
span: 24,
|
||||||
|
sortable: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
field: 'action',
|
field: 'action',
|
||||||
|
@ -17,8 +17,9 @@ const { register, elTableRef, tableObject, methods } = useTable({
|
|||||||
data: 'data',
|
data: 'data',
|
||||||
count: 'count'
|
count: 'count'
|
||||||
},
|
},
|
||||||
props: {
|
defaultParams: {
|
||||||
columns
|
v_order: 'descending',
|
||||||
|
v_order_field: 'create_datetime'
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -31,9 +32,7 @@ const view = (row: any) => {
|
|||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
}
|
}
|
||||||
|
|
||||||
const { getList, setSearchParams } = methods
|
const { getList, setSearchParams, setOrderParams } = methods
|
||||||
|
|
||||||
getList()
|
|
||||||
|
|
||||||
const tableSize = ref('default')
|
const tableSize = ref('default')
|
||||||
|
|
||||||
@ -51,6 +50,8 @@ watch(
|
|||||||
deep: true
|
deep: true
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
getList()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@ -65,6 +66,8 @@ watch(
|
|||||||
<Table
|
<Table
|
||||||
v-model:limit="tableObject.limit"
|
v-model:limit="tableObject.limit"
|
||||||
v-model:page="tableObject.page"
|
v-model:page="tableObject.page"
|
||||||
|
:defaultSort="{ prop: 'create_datetime', order: 'descending' }"
|
||||||
|
:columns="columns"
|
||||||
:data="tableObject.tableData"
|
:data="tableObject.tableData"
|
||||||
:loading="tableObject.loading"
|
:loading="tableObject.loading"
|
||||||
:selection="false"
|
:selection="false"
|
||||||
@ -74,6 +77,7 @@ watch(
|
|||||||
total: tableObject.count
|
total: tableObject.count
|
||||||
}"
|
}"
|
||||||
@register="register"
|
@register="register"
|
||||||
|
@sort-change="setOrderParams"
|
||||||
>
|
>
|
||||||
<template #action="{ row }">
|
<template #action="{ row }">
|
||||||
<ElButton type="primary" link size="small" @click="view(row)"> 详情 </ElButton>
|
<ElButton type="primary" link size="small" @click="view(row)"> 详情 </ElButton>
|
||||||
|
@ -16,9 +16,6 @@ const { register, elTableRef, tableObject, methods } = useTable({
|
|||||||
response: {
|
response: {
|
||||||
data: 'data',
|
data: 'data',
|
||||||
count: 'count'
|
count: 'count'
|
||||||
},
|
|
||||||
props: {
|
|
||||||
columns
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -65,6 +62,7 @@ watch(
|
|||||||
<Table
|
<Table
|
||||||
v-model:limit="tableObject.limit"
|
v-model:limit="tableObject.limit"
|
||||||
v-model:page="tableObject.page"
|
v-model:page="tableObject.page"
|
||||||
|
:columns="columns"
|
||||||
:data="tableObject.tableData"
|
:data="tableObject.tableData"
|
||||||
:loading="tableObject.loading"
|
:loading="tableObject.loading"
|
||||||
:selection="false"
|
:selection="false"
|
||||||
|
@ -45,7 +45,7 @@ class UserDal(DalBase):
|
|||||||
"""
|
"""
|
||||||
创建用户
|
创建用户
|
||||||
"""
|
"""
|
||||||
unique = await self.get_data(telephone=data.telephone, return_none=True)
|
unique = await self.get_data(telephone=data.telephone, v_return_none=True)
|
||||||
if unique:
|
if unique:
|
||||||
raise ValueError("手机号已存在!")
|
raise ValueError("手机号已存在!")
|
||||||
password = data.telephone[5:12] if settings.DEFAULT_PASSWORD == "0" else settings.DEFAULT_PASSWORD
|
password = data.telephone[5:12] if settings.DEFAULT_PASSWORD == "0" else settings.DEFAULT_PASSWORD
|
||||||
@ -96,7 +96,7 @@ class UserDal(DalBase):
|
|||||||
"""
|
"""
|
||||||
导出用户查询列表为excel
|
导出用户查询列表为excel
|
||||||
"""
|
"""
|
||||||
datas = await self.get_datas(**params.dict(), return_objs=True)
|
datas = await self.get_datas(**params.dict(), v_return_objs=True)
|
||||||
# 获取表头
|
# 获取表头
|
||||||
row = list(map(lambda i: i.get("label"), header))
|
row = list(map(lambda i: i.get("label"), header))
|
||||||
rows = []
|
rows = []
|
||||||
@ -126,7 +126,7 @@ class UserDal(DalBase):
|
|||||||
补全表头数据选项
|
补全表头数据选项
|
||||||
"""
|
"""
|
||||||
# 角色选择项
|
# 角色选择项
|
||||||
roles = await RoleDal(self.db).get_datas(limit=0, return_objs=True, disabled=False, is_admin=False)
|
roles = await RoleDal(self.db).get_datas(limit=0, v_return_objs=True, disabled=False, is_admin=False)
|
||||||
role_options = self.import_headers[4]
|
role_options = self.import_headers[4]
|
||||||
assert isinstance(role_options, dict)
|
assert isinstance(role_options, dict)
|
||||||
role_options["options"] = [{"label": role.name, "value": role.id} for role in roles]
|
role_options["options"] = [{"label": role.name, "value": role.id} for role in roles]
|
||||||
@ -178,7 +178,7 @@ class UserDal(DalBase):
|
|||||||
初始化所选用户密码并发送通知短信
|
初始化所选用户密码并发送通知短信
|
||||||
将用户密码改为系统默认密码,并将初始化密码状态改为false
|
将用户密码改为系统默认密码,并将初始化密码状态改为false
|
||||||
"""
|
"""
|
||||||
users = await self.get_datas(limit=0, id=("in", ids), return_objs=True)
|
users = await self.get_datas(limit=0, id=("in", ids), v_return_objs=True)
|
||||||
result = []
|
result = []
|
||||||
for user in users:
|
for user in users:
|
||||||
# 重置密码
|
# 重置密码
|
||||||
|
@ -9,16 +9,16 @@
|
|||||||
"""
|
"""
|
||||||
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
||||||
"""
|
"""
|
||||||
|
from fastapi import Depends
|
||||||
from core.dependencies import Paging
|
from core.dependencies import Paging, QueryParams
|
||||||
|
|
||||||
|
|
||||||
class RoleParams(Paging):
|
class RoleParams(QueryParams):
|
||||||
"""
|
"""
|
||||||
列表分页
|
列表分页
|
||||||
"""
|
"""
|
||||||
def __init__(self, name: str = None, role_key: str = None, disabled: bool = None, page: int = 1, limit: int = 10):
|
def __init__(self, name: str = None, role_key: str = None, disabled: bool = None, params: Paging = Depends()):
|
||||||
super(RoleParams, self).__init__(page, limit)
|
super().__init__(params)
|
||||||
self.name = ("like", name)
|
self.name = ("like", name)
|
||||||
self.role_key = ("like", role_key)
|
self.role_key = ("like", role_key)
|
||||||
self.disabled = disabled
|
self.disabled = disabled
|
||||||
|
@ -9,16 +9,19 @@
|
|||||||
"""
|
"""
|
||||||
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
||||||
"""
|
"""
|
||||||
|
from fastapi import Depends
|
||||||
from core.dependencies import Paging
|
from core.dependencies import Paging, QueryParams
|
||||||
|
|
||||||
|
|
||||||
class UserParams(Paging):
|
class UserParams(QueryParams):
|
||||||
"""
|
"""
|
||||||
列表分页
|
列表分页
|
||||||
"""
|
"""
|
||||||
def __init__(self, name: str = None, telephone: str = None, is_active: bool = None, page: int = 1, limit: int = 10):
|
|
||||||
super(UserParams, self).__init__(page, limit)
|
def __init__(self, name: str = None, telephone: str = None, is_active: bool = None, params: Paging = Depends()):
|
||||||
|
super().__init__(params)
|
||||||
self.name = ("like", name)
|
self.name = ("like", name)
|
||||||
self.telephone = ("like", telephone)
|
self.telephone = ("like", telephone)
|
||||||
self.is_active = is_active
|
self.is_active = is_active
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@ async def login_auth(telephone: str, db: AsyncSession):
|
|||||||
|
|
||||||
如果令牌无效,立即返回一个 HTTP 错误。
|
如果令牌无效,立即返回一个 HTTP 错误。
|
||||||
"""
|
"""
|
||||||
return await crud.UserDal(db).get_data(telephone=telephone, return_none=True)
|
return await crud.UserDal(db).get_data(telephone=telephone, v_return_none=True)
|
||||||
|
|
||||||
|
|
||||||
@AuthValidation
|
@AuthValidation
|
||||||
@ -46,5 +46,5 @@ async def full_admin(telephone: str, db: AsyncSession):
|
|||||||
如果令牌无效,立即返回一个 HTTP 错误。
|
如果令牌无效,立即返回一个 HTTP 错误。
|
||||||
"""
|
"""
|
||||||
options = [models.VadminUser.roles, "roles.menus"]
|
options = [models.VadminUser.roles, "roles.menus"]
|
||||||
return await crud.UserDal(db).get_data(telephone=telephone, return_none=True, options=options)
|
return await crud.UserDal(db).get_data(telephone=telephone, v_return_none=True, options=options)
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ class LoginValidation:
|
|||||||
async def __call__(self, data: LoginForm, db: AsyncSession, request: Request) -> LoginResult:
|
async def __call__(self, data: LoginForm, db: AsyncSession, request: Request) -> LoginResult:
|
||||||
self.result = LoginResult()
|
self.result = LoginResult()
|
||||||
options = [models.VadminUser.roles, "roles.menus"]
|
options = [models.VadminUser.roles, "roles.menus"]
|
||||||
user = await crud.UserDal(db).get_data(telephone=data.telephone, return_none=True, options=options)
|
user = await crud.UserDal(db).get_data(telephone=data.telephone, v_return_none=True, options=options)
|
||||||
if not user:
|
if not user:
|
||||||
self.result.msg = "该手机号不存在!"
|
self.result.msg = "该手机号不存在!"
|
||||||
return self.result
|
return self.result
|
||||||
|
@ -9,19 +9,18 @@
|
|||||||
"""
|
"""
|
||||||
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
||||||
"""
|
"""
|
||||||
|
from fastapi import Depends
|
||||||
from core.dependencies import Paging
|
from core.dependencies import Paging, QueryParams
|
||||||
|
|
||||||
|
|
||||||
class LoginParams(Paging):
|
class LoginParams(QueryParams):
|
||||||
"""
|
"""
|
||||||
列表分页
|
列表分页
|
||||||
"""
|
"""
|
||||||
def __init__(self, ip: str = None, address: str = None, telephone: str = None, status: bool = None, page: int = 1,
|
def __init__(self, ip: str = None, address: str = None, telephone: str = None, status: bool = None,
|
||||||
limit: int = 10):
|
params: Paging = Depends()):
|
||||||
super(LoginParams, self).__init__(page, limit)
|
super().__init__(params)
|
||||||
self.ip = ("like", ip)
|
self.ip = ("like", ip)
|
||||||
self.telephone = ("like", telephone)
|
self.telephone = ("like", telephone)
|
||||||
self.address = ("like", address)
|
self.address = ("like", address)
|
||||||
self.status = status
|
self.status = status
|
||||||
self.order = "desc"
|
|
||||||
|
@ -9,17 +9,17 @@
|
|||||||
"""
|
"""
|
||||||
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
||||||
"""
|
"""
|
||||||
|
from fastapi import Depends
|
||||||
from core.dependencies import Paging
|
from core.dependencies import Paging, QueryParams
|
||||||
|
|
||||||
|
|
||||||
class OperationParams(Paging):
|
class OperationParams(QueryParams):
|
||||||
"""
|
"""
|
||||||
列表分页
|
列表分页
|
||||||
"""
|
"""
|
||||||
def __init__(self, summary: str = None, telephone: str = None, request_method: str = None, page: int = 1,
|
def __init__(self, summary: str = None, telephone: str = None, request_method: str = None,
|
||||||
limit: int = 10):
|
params: Paging = Depends()):
|
||||||
super(OperationParams, self).__init__(page, limit)
|
super().__init__(params)
|
||||||
self.summary = ("like", summary)
|
self.summary = ("like", summary)
|
||||||
self.telephone = ("like", telephone)
|
self.telephone = ("like", telephone)
|
||||||
self.request_method = request_method
|
self.request_method = request_method
|
||||||
|
@ -9,15 +9,14 @@
|
|||||||
"""
|
"""
|
||||||
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
||||||
"""
|
"""
|
||||||
|
from fastapi import Depends
|
||||||
from core.dependencies import Paging
|
from core.dependencies import Paging, QueryParams
|
||||||
|
|
||||||
|
|
||||||
class SMSParams(Paging):
|
class SMSParams(QueryParams):
|
||||||
"""
|
"""
|
||||||
列表分页
|
列表分页
|
||||||
"""
|
"""
|
||||||
def __init__(self, telephone: str = None, page: int = 1, limit: int = 10):
|
def __init__(self, telephone: str = None, params: Paging = Depends()):
|
||||||
super(SMSParams, self).__init__(page, limit)
|
super().__init__(params)
|
||||||
self.telephone = ("like", telephone)
|
self.telephone = ("like", telephone)
|
||||||
self.order = "desc"
|
|
||||||
|
@ -30,7 +30,7 @@ class DictTypeDal(DalBase):
|
|||||||
data = {}
|
data = {}
|
||||||
for dict_type in dict_types:
|
for dict_type in dict_types:
|
||||||
dict_data = await DictTypeDal(self.db).\
|
dict_data = await DictTypeDal(self.db).\
|
||||||
get_data(dict_type=dict_type, return_none=True, options=[self.model.details])
|
get_data(dict_type=dict_type, v_return_none=True, options=[self.model.details])
|
||||||
if not dict_data:
|
if not dict_data:
|
||||||
data[dict_type] = []
|
data[dict_type] = []
|
||||||
continue
|
continue
|
||||||
@ -60,10 +60,11 @@ class SettingsDal(DalBase):
|
|||||||
"""
|
"""
|
||||||
获取系统配置标签下的信息
|
获取系统配置标签下的信息
|
||||||
"""
|
"""
|
||||||
datas = await self.get_datas(limit=0, tab_id=tab_id, return_objs=True)
|
datas = await self.get_datas(limit=0, tab_id=tab_id, v_return_objs=True)
|
||||||
result = {}
|
result = {}
|
||||||
for data in datas:
|
for data in datas:
|
||||||
result[data.config_key] = data.config_value
|
if not data.disabled:
|
||||||
|
result[data.config_key] = data.config_value
|
||||||
return result
|
return result
|
||||||
|
|
||||||
async def update_datas(self, datas: dict):
|
async def update_datas(self, datas: dict):
|
||||||
@ -97,12 +98,13 @@ class SettingsTabDal(DalBase):
|
|||||||
model = models.VadminSystemSettingsTab
|
model = models.VadminSystemSettingsTab
|
||||||
options = [model.settings]
|
options = [model.settings]
|
||||||
datas = await self.get_datas(limit=0, options=options, classify=("in", classify), disabled=False,
|
datas = await self.get_datas(limit=0, options=options, classify=("in", classify), disabled=False,
|
||||||
return_objs=True, hidden=hidden)
|
v_return_objs=True, hidden=hidden)
|
||||||
result = {}
|
result = {}
|
||||||
for tab in datas:
|
for tab in datas:
|
||||||
tabs = {}
|
tabs = {}
|
||||||
for item in tab.settings:
|
for item in tab.settings:
|
||||||
tabs[item.config_key] = item.config_value
|
if not item.disabled:
|
||||||
|
tabs[item.config_key] = item.config_value
|
||||||
result[tab.tab_name] = tabs
|
result[tab.tab_name] = tabs
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@ -6,9 +6,8 @@
|
|||||||
# @IDE : PyCharm
|
# @IDE : PyCharm
|
||||||
# @desc : 系统字典模型
|
# @desc : 系统字典模型
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from db.db_base import BaseModel
|
from db.db_base import BaseModel
|
||||||
from sqlalchemy import Column, String, TEXT, Integer, ForeignKey
|
from sqlalchemy import Column, String, TEXT, Integer, ForeignKey, Boolean
|
||||||
|
|
||||||
|
|
||||||
class VadminSystemSettings(BaseModel):
|
class VadminSystemSettings(BaseModel):
|
||||||
@ -19,6 +18,7 @@ class VadminSystemSettings(BaseModel):
|
|||||||
config_key = Column(String(255), index=True, nullable=False, unique=True, comment="配置表键")
|
config_key = Column(String(255), index=True, nullable=False, unique=True, comment="配置表键")
|
||||||
config_value = Column(TEXT, comment="配置表内容")
|
config_value = Column(TEXT, comment="配置表内容")
|
||||||
remark = Column(String(255), comment="备注信息")
|
remark = Column(String(255), comment="备注信息")
|
||||||
|
disabled = Column(Boolean, default=False, comment="是否禁用")
|
||||||
|
|
||||||
tab_id = Column(Integer, ForeignKey("vadmin_system_settings_tab.id", ondelete='CASCADE'), comment="关联tab标签")
|
tab_id = Column(Integer, ForeignKey("vadmin_system_settings_tab.id", ondelete='CASCADE'), comment="关联tab标签")
|
||||||
tab = relationship("VadminSystemSettingsTab", foreign_keys=tab_id, back_populates="settings")
|
tab = relationship("VadminSystemSettingsTab", foreign_keys=tab_id, back_populates="settings")
|
||||||
|
@ -9,15 +9,15 @@
|
|||||||
"""
|
"""
|
||||||
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
||||||
"""
|
"""
|
||||||
|
from fastapi import Depends
|
||||||
from core.dependencies import Paging
|
from core.dependencies import Paging, QueryParams
|
||||||
|
|
||||||
|
|
||||||
class DictDetailParams(Paging):
|
class DictDetailParams(QueryParams):
|
||||||
"""
|
"""
|
||||||
列表分页
|
列表分页
|
||||||
"""
|
"""
|
||||||
def __init__(self, dict_type_id: int = None, label: str = None, page: int = 1, limit: int = 10):
|
def __init__(self, dict_type_id: int = None, label: str = None, params: Paging = Depends()):
|
||||||
super(DictDetailParams, self).__init__(page, limit)
|
super().__init__(params)
|
||||||
self.dict_type_id = dict_type_id
|
self.dict_type_id = dict_type_id
|
||||||
self.label = ("like", label)
|
self.label = ("like", label)
|
||||||
|
@ -9,14 +9,14 @@
|
|||||||
"""
|
"""
|
||||||
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
类依赖项-官方文档:https://fastapi.tiangolo.com/zh/tutorial/dependencies/classes-as-dependencies/
|
||||||
"""
|
"""
|
||||||
|
from fastapi import Depends
|
||||||
from core.dependencies import Paging
|
from core.dependencies import Paging, QueryParams
|
||||||
|
|
||||||
|
|
||||||
class DictTypeParams(Paging):
|
class DictTypeParams(QueryParams):
|
||||||
"""
|
"""
|
||||||
列表分页
|
列表分页
|
||||||
"""
|
"""
|
||||||
def __init__(self, dict_name: str = None, page: int = 1, limit: int = 10):
|
def __init__(self, dict_name: str = None, params: Paging = Depends()):
|
||||||
super(DictTypeParams, self).__init__(page, limit)
|
super().__init__(params)
|
||||||
self.dict_name = ("like", dict_name)
|
self.dict_name = ("like", dict_name)
|
||||||
|
@ -19,6 +19,7 @@ class Settings(BaseModel):
|
|||||||
config_key: str
|
config_key: str
|
||||||
config_value: Optional[str] = None
|
config_value: Optional[str] = None
|
||||||
remark: Optional[str] = None
|
remark: Optional[str] = None
|
||||||
|
disabled: Optional[bool] = None
|
||||||
tab_id: int
|
tab_id: int
|
||||||
|
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
473
kinit-api/bak/2022-11-22.sql
Normal file
473
kinit-api/bak/2022-11-22.sql
Normal file
File diff suppressed because one or more lines are too long
@ -14,7 +14,7 @@
|
|||||||
# selectinload 官方文档:
|
# selectinload 官方文档:
|
||||||
# https://www.osgeo.cn/sqlalchemy/orm/loading_relationships.html?highlight=selectinload#sqlalchemy.orm.selectinload
|
# https://www.osgeo.cn/sqlalchemy/orm/loading_relationships.html?highlight=selectinload#sqlalchemy.orm.selectinload
|
||||||
import datetime
|
import datetime
|
||||||
from typing import List, Union
|
from typing import List
|
||||||
from fastapi import HTTPException
|
from fastapi import HTTPException
|
||||||
from fastapi.encoders import jsonable_encoder
|
from fastapi.encoders import jsonable_encoder
|
||||||
from sqlalchemy import func, delete, update, or_
|
from sqlalchemy import func, delete, update, or_
|
||||||
@ -24,7 +24,6 @@ from sqlalchemy.orm import selectinload
|
|||||||
from starlette import status
|
from starlette import status
|
||||||
from core.logger import logger
|
from core.logger import logger
|
||||||
from sqlalchemy.sql.selectable import Select
|
from sqlalchemy.sql.selectable import Select
|
||||||
from pydantic import BaseModel
|
|
||||||
|
|
||||||
|
|
||||||
class DalBase:
|
class DalBase:
|
||||||
@ -44,11 +43,11 @@ class DalBase:
|
|||||||
@param options: 指示应使用select在预加载中加载给定的属性。
|
@param options: 指示应使用select在预加载中加载给定的属性。
|
||||||
@param schema: 指定使用的序列化对象
|
@param schema: 指定使用的序列化对象
|
||||||
@param kwargs: 关键词参数,
|
@param kwargs: 关键词参数,
|
||||||
@param kwargs: order,排序,默认正序,为 desc 是倒叙
|
@param kwargs: v_order,排序,默认正序,为 desc 是倒叙
|
||||||
@param kwargs: return_none,是否返回空 None,否认 抛出异常,默认抛出异常
|
@param kwargs: v_return_none,是否返回空 None,否认 抛出异常,默认抛出异常
|
||||||
"""
|
"""
|
||||||
order = kwargs.get("order", None)
|
order = kwargs.pop("v_order", None)
|
||||||
return_none = kwargs.get("return_none", False)
|
return_none = kwargs.pop("v_return_none", False)
|
||||||
keys_exist = False
|
keys_exist = False
|
||||||
if keys:
|
if keys:
|
||||||
for key, value in keys.items():
|
for key, value in keys.items():
|
||||||
@ -60,7 +59,7 @@ class DalBase:
|
|||||||
kwargs_exist = False
|
kwargs_exist = False
|
||||||
if kwargs:
|
if kwargs:
|
||||||
for key, value in kwargs.items():
|
for key, value in kwargs.items():
|
||||||
if key != "order" and key != "return_none" and value and getattr(self.model, key, None):
|
if value and getattr(self.model, key, None):
|
||||||
kwargs_exist = True
|
kwargs_exist = True
|
||||||
break
|
break
|
||||||
sql = select(self.model).where(self.model.delete_datetime.is_(None))
|
sql = select(self.model).where(self.model.delete_datetime.is_(None))
|
||||||
@ -68,7 +67,7 @@ class DalBase:
|
|||||||
if data_id:
|
if data_id:
|
||||||
sql = sql.where(self.model.id == data_id)
|
sql = sql.where(self.model.id == data_id)
|
||||||
sql = self.add_filter_condition(sql, keys, options, **kwargs)
|
sql = self.add_filter_condition(sql, keys, options, **kwargs)
|
||||||
if order and order == "desc":
|
if order and (order == "desc" or order == "descending"):
|
||||||
sql = sql.order_by(self.model.create_datetime.desc())
|
sql = sql.order_by(self.model.create_datetime.desc())
|
||||||
queryset = await self.db.execute(sql)
|
queryset = await self.db.execute(sql)
|
||||||
data = queryset.scalars().first()
|
data = queryset.scalars().first()
|
||||||
@ -90,23 +89,23 @@ class DalBase:
|
|||||||
@param keys: 外键字段查询
|
@param keys: 外键字段查询
|
||||||
@param options: 指示应使用select在预加载中加载给定的属性。
|
@param options: 指示应使用select在预加载中加载给定的属性。
|
||||||
@param schema: 指定使用的序列化对象
|
@param schema: 指定使用的序列化对象
|
||||||
@param kwargs: order,排序,默认正序,为 desc 是倒叙
|
@param kwargs: v_order,排序,默认正序,为 desc 是倒叙
|
||||||
@param kwargs: order_field,排序字段
|
@param kwargs: v_order_field,排序字段
|
||||||
@param kwargs: return_objs,是否返回对象
|
@param kwargs: v_return_objs,是否返回对象
|
||||||
@param kwargs: start_sql,初始 sql
|
@param kwargs: v_start_sql,初始 sql
|
||||||
"""
|
"""
|
||||||
order = kwargs.get("order", None)
|
order = kwargs.pop("v_order", None)
|
||||||
order_field = kwargs.get("order_field", None)
|
order_field = kwargs.pop("v_order_field", None)
|
||||||
return_objs = kwargs.get("return_objs", False)
|
return_objs = kwargs.pop("v_return_objs", False)
|
||||||
start_sql = kwargs.get("start_sql", None)
|
start_sql = kwargs.pop("v_start_sql", None)
|
||||||
if not isinstance(start_sql, Select):
|
if not isinstance(start_sql, Select):
|
||||||
start_sql = select(self.model).where(self.model.delete_datetime.is_(None))
|
start_sql = select(self.model).where(self.model.delete_datetime.is_(None))
|
||||||
sql = self.add_filter_condition(start_sql, keys, options, **kwargs)
|
sql = self.add_filter_condition(start_sql, keys, options, **kwargs)
|
||||||
if order_field and order == "desc":
|
if order_field and (order == "desc" or order == "descending"):
|
||||||
sql = sql.order_by(getattr(self.model, order_field).desc(), self.model.id.desc())
|
sql = sql.order_by(getattr(self.model, order_field).desc(), self.model.id.desc())
|
||||||
elif order_field:
|
elif order_field:
|
||||||
sql = sql.order_by(getattr(self.model, order_field), self.model.id)
|
sql = sql.order_by(getattr(self.model, order_field), self.model.id)
|
||||||
elif order == "desc":
|
elif order == "desc" or order == "descending":
|
||||||
sql = sql.order_by(self.model.id.desc())
|
sql = sql.order_by(self.model.id.desc())
|
||||||
if limit != 0:
|
if limit != 0:
|
||||||
sql = sql.offset((page - 1) * limit).limit(limit)
|
sql = sql.offset((page - 1) * limit).limit(limit)
|
||||||
|
@ -15,26 +15,39 @@ from fastapi import Body
|
|||||||
import copy
|
import copy
|
||||||
|
|
||||||
|
|
||||||
class Paging:
|
class QueryParams:
|
||||||
"""
|
|
||||||
列表分页
|
|
||||||
"""
|
|
||||||
def __init__(self, page: int = 1, limit: int = 10):
|
|
||||||
self.page = page
|
|
||||||
self.limit = limit
|
|
||||||
self.order = None
|
|
||||||
|
|
||||||
def dict(self):
|
def __init__(self, params=None):
|
||||||
|
if params:
|
||||||
|
self.page = params.page
|
||||||
|
self.limit = params.limit
|
||||||
|
self.v_order = params.v_order
|
||||||
|
self.v_order_field = params.v_order_field
|
||||||
|
|
||||||
|
def dict(self) -> dict:
|
||||||
return self.__dict__
|
return self.__dict__
|
||||||
|
|
||||||
def to_count(self):
|
def to_count(self) -> dict:
|
||||||
params = copy.deepcopy(self.__dict__)
|
params = copy.deepcopy(self.__dict__)
|
||||||
del params["page"]
|
del params["page"]
|
||||||
del params["limit"]
|
del params["limit"]
|
||||||
del params["order"]
|
del params["v_order"]
|
||||||
|
del params["v_order_field"]
|
||||||
return params
|
return params
|
||||||
|
|
||||||
|
|
||||||
|
class Paging(QueryParams):
|
||||||
|
"""
|
||||||
|
列表分页
|
||||||
|
"""
|
||||||
|
def __init__(self, page: int = 1, limit: int = 10, v_order_field: str = "id", v_order: str = None):
|
||||||
|
super().__init__()
|
||||||
|
self.page = page
|
||||||
|
self.limit = limit
|
||||||
|
self.v_order = v_order
|
||||||
|
self.v_order_field = v_order_field
|
||||||
|
|
||||||
|
|
||||||
class IdList:
|
class IdList:
|
||||||
"""
|
"""
|
||||||
id 列表
|
id 列表
|
||||||
|
@ -30,11 +30,16 @@ class MongoManage(DatabaseManage):
|
|||||||
async def create_data(self, collection: str, data: dict) -> InsertOneResult:
|
async def create_data(self, collection: str, data: dict) -> InsertOneResult:
|
||||||
return await self.db[collection].insert_one(data)
|
return await self.db[collection].insert_one(data)
|
||||||
|
|
||||||
async def get_datas(self, collection: str, page: int = 1, limit: int = 10, schema: BaseModel = None, **kwargs):
|
async def get_datas(self, collection: str, schema: BaseModel = None, **kwargs):
|
||||||
"""
|
"""
|
||||||
使用 find() 要查询的一组文档。 find() 没有I / O,也不需要 await 表达式。它只是创建一个 AsyncIOMotorCursor 实例
|
使用 find() 要查询的一组文档。 find() 没有I / O,也不需要 await 表达式。它只是创建一个 AsyncIOMotorCursor 实例
|
||||||
当您调用 to_list() 或为循环执行异步时 (async for) ,查询实际上是在服务器上执行的。
|
当您调用 to_list() 或为循环执行异步时 (async for) ,查询实际上是在服务器上执行的。
|
||||||
"""
|
"""
|
||||||
|
page = kwargs.pop("page", 1)
|
||||||
|
limit = kwargs.pop("limit", 10)
|
||||||
|
order = kwargs.pop("v_order", None)
|
||||||
|
order_field = kwargs.pop("v_order_field", None)
|
||||||
|
|
||||||
params = self.filter_condition(**kwargs)
|
params = self.filter_condition(**kwargs)
|
||||||
cursor = self.db[collection].find(params)
|
cursor = self.db[collection].find(params)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user