1. 新增软删除功能

2. Form组件新增设置单个值功能
This commit is contained in:
ktianc 2022-10-18 19:53:35 +08:00
parent cbfd2e4074
commit 49d9ca7652
5 changed files with 33 additions and 14 deletions

View File

@ -3,6 +3,7 @@ import { ElForm } from 'element-plus'
export interface FormExpose { export interface FormExpose {
setValues: (data: Recordable) => void setValues: (data: Recordable) => void
setValue: (key: string, value: any) => void
setProps: (props: Recordable) => void setProps: (props: Recordable) => void
delSchema: (field: string) => void delSchema: (field: string) => void
addSchema: (formSchema: FormSchema, index?: number) => void addSchema: (formSchema: FormSchema, index?: number) => void

View File

@ -75,6 +75,11 @@ export default defineComponent({
formModel.value = Object.assign(unref(formModel), data) formModel.value = Object.assign(unref(formModel), data)
} }
//
const setValue = (key: string, value: any) => {
formModel.value[key] = value
}
const setProps = (props: FormProps = {}) => { const setProps = (props: FormProps = {}) => {
mergeProps.value = Object.assign(unref(mergeProps), props) mergeProps.value = Object.assign(unref(mergeProps), props)
outsideProps.value = props outsideProps.value = props
@ -115,6 +120,7 @@ export default defineComponent({
expose({ expose({
setValues, setValues,
setValue,
formModel, formModel,
setProps, setProps,
delSchema, delSchema,

View File

@ -32,6 +32,7 @@ export const useForm = (props?: FormProps) => {
const methods: { const methods: {
setProps: (props: Recordable) => void setProps: (props: Recordable) => void
setValues: (data: Recordable) => void setValues: (data: Recordable) => void
setValue: (key: string, value: any) => void
getFormData: <T = Recordable | undefined>() => Promise<T> getFormData: <T = Recordable | undefined>() => Promise<T>
setSchema: (schemaProps: FormSetPropsType[]) => void setSchema: (schemaProps: FormSetPropsType[]) => void
addSchema: (formSchema: FormSchema, index?: number) => void addSchema: (formSchema: FormSchema, index?: number) => void
@ -46,13 +47,15 @@ export const useForm = (props?: FormProps) => {
const form = await getForm() const form = await getForm()
form?.setValues(data) form?.setValues(data)
}, },
setValue: async (key: string, value: any) => {
const form = await getForm()
form?.setValue(key, value)
},
/** /**
* @param schemaProps schemaProps * @param schemaProps schemaProps
*/ */
setSchema: async (schemaProps: FormSetPropsType[]) => { setSchema: async (schemaProps: FormSetPropsType[]) => {
const form = await getForm() const form = await getForm()
console.log(1111111111, schemaProps)
console.log(222222, form)
form?.setSchema(schemaProps) form?.setSchema(schemaProps)
}, },

View File

@ -7,16 +7,17 @@
# @desc : 数据库 增删改查操作 # @desc : 数据库 增删改查操作
# sqlalchemy 查询操作https://segmentfault.com/a/1190000016767008 # sqlalchemy 查询操作https://segmentfault.com/a/1190000016767008
# sqlalchemy 增删改操作https://www.osgeo.cn/sqlalchemy/tutorial/orm_data_manipulation.html#updating-orm-objects
# SQLAlchemy lazy load和eager load: https://www.jianshu.com/p/dfad7c08c57a # SQLAlchemy lazy load和eager load: https://www.jianshu.com/p/dfad7c08c57a
# Mysql中内连接,左连接和右连接的区别总结:https://www.cnblogs.com/restartyang/articles/9080993.html # Mysql中内连接,左连接和右连接的区别总结:https://www.cnblogs.com/restartyang/articles/9080993.html
# SQLAlchemy join 内连接 # SQLAlchemy join 内连接
# 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
from typing import List 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, and_ from sqlalchemy import func, delete, update
from sqlalchemy.future import select from sqlalchemy.future import select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload from sqlalchemy.orm import selectinload
@ -61,11 +62,11 @@ class DalBase:
if key != "order" and key != "return_none" and value and getattr(self.model, key, None): if key != "order" and key != "return_none" and 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))
if data_id or kwargs_exist or keys_exist: if data_id or kwargs_exist or keys_exist:
sql = select(self.model).where(self.model.id == data_id) if data_id else select(self.model) if 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)
else:
sql = select(self.model)
if order and order == "desc": if order and order == "desc":
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)
@ -97,7 +98,9 @@ class DalBase:
order_field = kwargs.get("order_field", None) order_field = kwargs.get("order_field", None)
return_objs = kwargs.get("return_objs", False) return_objs = kwargs.get("return_objs", False)
start_sql = kwargs.get("start_sql", None) start_sql = kwargs.get("start_sql", None)
sql = self.add_filter_condition(start_sql if isinstance(start_sql, Select) else select(self.model), keys, options, **kwargs) if not isinstance(start_sql, Select):
start_sql = select(self.model).where(self.model.delete_datetime.is_(None))
sql = self.add_filter_condition(start_sql, keys, options, **kwargs)
if order_field and order == "desc": if order_field and order == "desc":
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:
@ -115,7 +118,7 @@ class DalBase:
async def get_count(self, keys: dict = None, **kwargs): async def get_count(self, keys: dict = None, **kwargs):
"""获取数据总数""" """获取数据总数"""
sql = select(func.count(self.model.id).label('total')) sql = select(func.count(self.model.id).label('total')).where(self.model.delete_datetime.is_(None))
sql = self.add_filter_condition(sql, keys, **kwargs) sql = self.add_filter_condition(sql, keys, **kwargs)
queryset = await self.db.execute(sql) queryset = await self.db.execute(sql)
return queryset.one()['total'] return queryset.one()['total']
@ -153,12 +156,17 @@ class DalBase:
return schema.from_orm(obj).dict() return schema.from_orm(obj).dict()
return self.out_dict(obj) return self.out_dict(obj)
async def delete_datas(self, ids: List[int]): async def delete_datas(self, ids: List[int], soft: bool = False):
""" """
删除多个数据 删除多条数据
:param ids: 数据集
:param soft: 是否执行软删除
""" """
for data_id in ids: if soft:
await self.db.execute(delete(self.model).where(self.model.id == data_id)) await self.db.execute(update(self.model).where(self.model.id.in_(ids)).
values(delete_datetime=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
else:
await self.db.execute(delete(self.model).where(self.model.id.in_(ids)))
def add_filter_condition(self, sql: select, keys: dict = None, options: list = None, **kwargs) -> select: def add_filter_condition(self, sql: select, keys: dict = None, options: list = None, **kwargs) -> select:
""" """

View File

@ -21,3 +21,4 @@ class BaseModel(Model):
id = Column(Integer, primary_key=True, unique=True, comment='主键ID', index=True) id = Column(Integer, primary_key=True, unique=True, comment='主键ID', index=True)
create_datetime = Column(DateTime, server_default=func.now(), comment='创建时间') create_datetime = Column(DateTime, server_default=func.now(), comment='创建时间')
update_datetime = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment='更新时间') update_datetime = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment='更新时间')
delete_datetime = Column(DateTime, nullable=True, comment='删除时间')