Skip to content

Commit

Permalink
Merge pull request #49 from zy7y/25-todo
Browse files Browse the repository at this point in the history
25 todo
  • Loading branch information
zy7y authored May 1, 2024
2 parents 09539f3 + a0e7be1 commit cc9c76b
Show file tree
Hide file tree
Showing 7 changed files with 226 additions and 20 deletions.
2 changes: 1 addition & 1 deletion dfs_generate/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "0.2.1"
__version__ = "0.2.2"
34 changes: 33 additions & 1 deletion dfs_generate/conversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
TORTOISE_MAIN,
TORTOISE_ROUTER,
SQLMODEL_DB,
VUE_API_TS,
VUE_INDEX_VUE,
VUE_CRUD_TS,
)
from tools import to_pascal, tran, to_snake

Expand All @@ -29,6 +32,13 @@ def _pydantic_field(column, imports):
return field


def _fast_crud_column(column):
name = column["COLUMN_NAME"]
title = column["COLUMN_COMMENT"] or name
fmt = f"{name}: {{ title: '{title}', type: 'text', search: {{ show: true }}}}"
return fmt


class Conversion:
def __init__(self, table_name, columns, uri):
self.table_name = table_name
Expand Down Expand Up @@ -82,13 +92,28 @@ def router(self):
def main(self):
pass

def vue_api_ts(self):
return VUE_API_TS % self.table

def vue_crud_ts(self):
columns = (
"{" + ",".join(_fast_crud_column(column) for column in self.columns) + "}"
)
return VUE_CRUD_TS % columns

def vue_index_vue(self):
return VUE_INDEX_VUE % self.table

def gencode(self):
return {
"model.py": self.model(),
"dao.py": self.dao(),
"router.py": self.router(),
"schema.py": self.schema(),
"main.py": self.main(),
"api.ts": self.vue_api_ts(),
"crud.ts": self.vue_crud_ts(),
"index.vue": self.vue_index_vue(),
}


Expand Down Expand Up @@ -250,7 +275,14 @@ def model(self):
field = _tortoise_field_repr(column)
if " " + field not in fields:
fields.append(" " + field)
return "\n".join(imports) + "\n\n" + head + "\n" + "\n".join(fields) + f"\n{' ' * 4}class Meta:\n{' ' * 8}table='{self.table_name}'"
return (
"\n".join(imports)
+ "\n\n"
+ head
+ "\n"
+ "\n".join(fields)
+ f"\n{' ' * 4}class Meta:\n{' ' * 8}table='{self.table_name}'"
)

def dao(self):
imports = {"from typing import List, Optional", "import model", "import schema"}
Expand Down
11 changes: 7 additions & 4 deletions dfs_generate/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,12 @@ def index():
@app.post("/conf")
def connect():
payload = bottle.request.json
if payload:
try:
conf = MySQLConf(**payload)
CACHE["connect"] = MySQLHelper(conf)
return {"code": 20000, "msg": "ok", "data": None}
except Exception as e:
return {"code": 40000, "msg": str(e), "data": None}


@app.get("/tables")
Expand All @@ -66,7 +68,7 @@ def tables():
if like in table
]
return {"code": 20000, "msg": "ok", "data": data}
return []
return {"code": 40000, "msg": "error", "data": None}


@app.get("/codegen")
Expand All @@ -85,8 +87,9 @@ def codegen():
).gencode()

for k, v in data.items():
_code = FormatCode(v, style_config="pep8")[0]
v = isort.code(_code)
if k.endswith("py"):
_code = FormatCode(v, style_config="pep8")[0]
v = isort.code(_code)
results.append({"name": k, "code": v, "key": k})
return {"code": 20000, "msg": "ok", "data": results}

Expand Down
153 changes: 147 additions & 6 deletions dfs_generate/templates.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
DOC_DESC ='''
DOC_DESC = """
[![](https://img.shields.io/github/stars/zy7y/dfs-generate)](https://github.com/zy7y/dfs-generate)
[![](https://img.shields.io/github/forks/zy7y/dfs-generate)](https://github.com/zy7y/dfs-generate)
[![](https://img.shields.io/github/repo-size/zy7y/dfs-generate?style=social)](https://github.com/zy7y/dfs-generate)
Expand All @@ -7,7 +7,7 @@
支持ORM:[SQLModel](https://sqlmodel.tiangolo.com/)、[Tortoise ORM](https://tortoise.github.io/)
支持前端: [Vue](https://cn.vuejs.org/)
'''
"""

RESPONSE_SCHEMA = """
from typing import Generic, TypeVar, List, Optional
Expand Down Expand Up @@ -129,22 +129,34 @@ def delete_${router_name}_by_id(id: int) -> schema.Result[schema.$table]:
engine = create_engine(db_uri)
"""

SQLMODEL_MAIN = """
SQLMODEL_MAIN = (
"""
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
from router import {router_name}
app = FastAPI(title="DFS - FastAPI SQLModel CRUD",
description='''%s''')
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router({router_name})
if __name__ == '__main__':
import uvicorn
uvicorn.run("main:app", reload=True, port=5000)
""" % DOC_DESC
"""
% DOC_DESC
)


# Tortoise ORM
Expand Down Expand Up @@ -215,8 +227,10 @@ async def delete_${router_name}_by_id(id: int) -> schema.Result[schema.$table]:
"""


TORTOISE_MAIN = """
TORTOISE_MAIN = (
"""
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware
from tortoise.contrib.fastapi import register_tortoise
from router import $router_name
Expand All @@ -233,10 +247,137 @@ async def delete_${router_name}_by_id(id: int) -> schema.Result[schema.$table]:
add_exception_handlers=True,
)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router($router_name)
if __name__ == '__main__':
import uvicorn
uvicorn.run("main:app", reload=True, port=5000)
""" % DOC_DESC
"""
% DOC_DESC
)

# Vue
VUE_CRUD_TS = """
/**
* dfs-generate 生成FastAPI Tortoise ORM / SQLModel、Vue3 CRUD代码
* dfs-generate Github: https://github.com/zy7y/dfs-generate
* Vue CRUD代码基于fast-crud,更多用法请查看其官方文档 http://fast-crud.docmirror.cn/
*/
import { CreateCrudOptionsProps, CreateCrudOptionsRet, dict } from "@fast-crud/fast-crud";
import { addRequest, delRequest, editRequest, pageRequest } from "./api";
export default function ({ crudExpose, context }: CreateCrudOptionsProps<any>): CreateCrudOptionsRet<any> {
return {
crudOptions: {
request: {
pageRequest,
addRequest,
editRequest,
delRequest
},
columns: %s
}
};
}
"""

VUE_API_TS = """
/**
* dfs-generate 生成FastAPI Tortoise ORM / SQLModel、Vue3 CRUD代码
* dfs-generate Github: https://github.com/zy7y/dfs-generate
* Vue CRUD代码基于fast-crud,更多用法请查看其官方文档 http://fast-crud.docmirror.cn/
*/
import { AddReq, DelReq, EditReq, UserPageQuery, UserPageRes } from "@fast-crud/fast-crud";
import axios from "axios";
const url = "http://127.0.1:5000/%s";
export const pageRequest = async (query: UserPageQuery): Promise<UserPageRes> => {
const { limit, offset } = query.page;
const pageNumber = offset / limit + 1;
const pageSize = limit;
const res = await axios.get(url, {
params: {
pageNumber,
pageSize,
...query.query
}
});
return {
records: res.data.data,
...query.page,
total: res.data.total
};
};
export const editRequest = async ({ form, row }: EditReq) => {
const res = await axios.patch(url + "/" + row.id, {
data: form,
headers: {
"Content-Type": "application/json"
}
});
return res.data.data;
};
export const delRequest = async ({ row }: DelReq) => {
const res = await axios.delete(url + "/" + row.id);
return res.data.data;
};
export const addRequest = async ({ form }: AddReq) => {
const res = await axios.post(url, {
data: form,
headers: {
"Content-Type": "application/json"
}
});
return res.data.data;
};
"""

VUE_INDEX_VUE = """
<!--
dfs-generate 生成FastAPI Tortoise ORM / SQLModel、Vue3 CRUD代码
dfs-generate Github: https://github.com/zy7y/dfs-generate
Vue CRUD代码基于fast-crud,更多用法请查看其官方文档 http://fast-crud.docmirror.cn/
-->
<template>
<fs-page>
<fs-crud ref="crudRef" v-bind="crudBinding" />
</fs-page>
</template>
<script lang="ts">
import { defineComponent, onMounted } from "vue";
import { useFs, OnExposeContext } from "@fast-crud/fast-crud";
import createCrudOptions from "./curd";
//此处为组件定义
export default defineComponent({
name: "FsCrud%s",
setup(props: any, ctx: any) {
const context: any = { props, ctx }; // 自定义变量, 将会传递给createCrudOptions, 比如直接把props,和ctx直接传过去使用
function onExpose(e: OnExposeContext) {} //将在createOptions之前触发,可以获取到crudExpose,和context
const { crudRef, crudBinding, crudExpose } = useFs<any>({ createCrudOptions, onExpose, context });
// 页面打开后获取列表数据
onMounted(() => {
crudExpose.doRefresh();
});
return {
crudBinding,
crudRef
};
}
});
</script>
"""
6 changes: 6 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
# Change Log
## Release v0.2.2 (2024-05-01)
- #28 基于[fast-crud](http://fast-crud.docmirror.cn/)生成`Vue`代码完整管理页面操作
- #41 使用create-dmg完成macos安装包制作
- #42 客户端打包时机CI调整为发版时
- #47 生成模型指向实际表名,防止找不到表的错误

## Release v0.2.1 (2024-04-28)
- #35 修复Windows桌面端运行报错
- #34 增加源码运行说明
Expand Down
20 changes: 16 additions & 4 deletions docs/sqlmodel/main.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
from fastapi import FastAPI
from router import sys_menu
from starlette.middleware.cors import CORSMiddleware

app = FastAPI(title="DFS - FastAPI SQLModel CRUD",
description='''
app = FastAPI(
title="DFS - FastAPI SQLModel CRUD",
description="""
[![](https://img.shields.io/github/stars/zy7y/dfs-generate)](https://github.com/zy7y/dfs-generate)
[![](https://img.shields.io/github/forks/zy7y/dfs-generate)](https://github.com/zy7y/dfs-generate)
[![](https://img.shields.io/github/repo-size/zy7y/dfs-generate?style=social)](https://github.com/zy7y/dfs-generate)
Expand All @@ -11,10 +13,20 @@
支持ORM:[SQLModel](https://sqlmodel.tiangolo.com/)、[Tortoise ORM](https://tortoise.github.io/)
支持前端: [Vue](https://cn.vuejs.org/)
''')
""",
)

app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)

app.include_router(sys_menu)

if __name__ == '__main__':
if __name__ == "__main__":
import uvicorn

uvicorn.run("main:app", reload=True, port=5000)
Loading

0 comments on commit cc9c76b

Please sign in to comment.