项目初次提交
This commit is contained in:
7
apps/vadmin/help/__init__.py
Normal file
7
apps/vadmin/help/__init__.py
Normal file
@ -0,0 +1,7 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2023-02-15 20:03:49
|
||||
# @File : __init__.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 帮助中心
|
37
apps/vadmin/help/crud.py
Normal file
37
apps/vadmin/help/crud.py
Normal file
@ -0,0 +1,37 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2023-02-15 20:03:49
|
||||
# @File : crud.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 帮助中心 - 增删改查
|
||||
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from core.crud import DalBase
|
||||
from . import models, schemas
|
||||
|
||||
|
||||
class IssueDal(DalBase):
|
||||
|
||||
def __init__(self, db: AsyncSession):
|
||||
super(IssueDal, self).__init__()
|
||||
self.db = db
|
||||
self.model = models.VadminIssue
|
||||
self.schema = schemas.IssueSimpleOut
|
||||
|
||||
async def add_view_number(self, data_id: int) -> None:
|
||||
"""
|
||||
更新常见问题查看次数+1
|
||||
"""
|
||||
obj: models.VadminIssue = await self.get_data(data_id)
|
||||
obj.view_number = obj.view_number + 1 if obj.view_number else 1
|
||||
await self.flush(obj)
|
||||
|
||||
|
||||
class IssueCategoryDal(DalBase):
|
||||
|
||||
def __init__(self, db: AsyncSession):
|
||||
super(IssueCategoryDal, self).__init__()
|
||||
self.db = db
|
||||
self.model = models.VadminIssueCategory
|
||||
self.schema = schemas.IssueCategorySimpleOut
|
10
apps/vadmin/help/models/__init__.py
Normal file
10
apps/vadmin/help/models/__init__.py
Normal file
@ -0,0 +1,10 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2023-02-15 20:03:49
|
||||
# @File : __init__.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 初始化文件
|
||||
|
||||
|
||||
from .issue import VadminIssue, VadminIssueCategory
|
54
apps/vadmin/help/models/issue.py
Normal file
54
apps/vadmin/help/models/issue.py
Normal file
@ -0,0 +1,54 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : issue.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 常见问题
|
||||
|
||||
from sqlalchemy.orm import relationship, Mapped, mapped_column
|
||||
from apps.vadmin.auth.models import VadminUser
|
||||
from db.db_base import BaseModel
|
||||
from sqlalchemy import String, Boolean, Integer, ForeignKey, Text
|
||||
|
||||
|
||||
class VadminIssueCategory(BaseModel):
|
||||
__tablename__ = "vadmin_help_issue_category"
|
||||
__table_args__ = ({'comment': '常见问题类别表'})
|
||||
|
||||
name: Mapped[str] = mapped_column(String(50), index=True, nullable=False, comment="类别名称")
|
||||
platform: Mapped[str] = mapped_column(String(8), index=True, nullable=False, comment="展示平台")
|
||||
is_active: Mapped[bool] = mapped_column(Boolean, default=True, comment="是否可见")
|
||||
|
||||
issues: Mapped[list["VadminIssue"]] = relationship(back_populates='category')
|
||||
|
||||
create_user_id: Mapped[int] = mapped_column(
|
||||
Integer,
|
||||
ForeignKey("vadmin_auth_user.id", ondelete='RESTRICT'),
|
||||
comment="创建人"
|
||||
)
|
||||
create_user: Mapped[VadminUser] = relationship(foreign_keys=create_user_id)
|
||||
|
||||
|
||||
class VadminIssue(BaseModel):
|
||||
__tablename__ = "vadmin_help_issue"
|
||||
__table_args__ = ({'comment': '常见问题记录表'})
|
||||
|
||||
category_id: Mapped[int] = mapped_column(
|
||||
Integer,
|
||||
ForeignKey("vadmin_help_issue_category.id", ondelete='CASCADE'),
|
||||
comment="类别"
|
||||
)
|
||||
category: Mapped[list["VadminIssueCategory"]] = relationship(foreign_keys=category_id, back_populates='issues')
|
||||
|
||||
title: Mapped[str] = mapped_column(String(255), index=True, nullable=False, comment="标题")
|
||||
content: Mapped[str] = mapped_column(Text, comment="内容")
|
||||
view_number: Mapped[int] = mapped_column(Integer, default=0, comment="查看次数")
|
||||
is_active: Mapped[bool] = mapped_column(Boolean, default=True, comment="是否可见")
|
||||
|
||||
create_user_id: Mapped[int] = mapped_column(
|
||||
Integer,
|
||||
ForeignKey("vadmin_auth_user.id", ondelete='RESTRICT'),
|
||||
comment="创建人"
|
||||
)
|
||||
create_user: Mapped[VadminUser] = relationship(foreign_keys=create_user_id)
|
10
apps/vadmin/help/params/__init__.py
Normal file
10
apps/vadmin/help/params/__init__.py
Normal file
@ -0,0 +1,10 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2023-02-15 20:03:49
|
||||
# @File : __init__.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 初始化文件
|
||||
|
||||
|
||||
from .issue import IssueParams, IssueCategoryParams
|
51
apps/vadmin/help/params/issue.py
Normal file
51
apps/vadmin/help/params/issue.py
Normal file
@ -0,0 +1,51 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : issue.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 常见问题
|
||||
|
||||
|
||||
from fastapi import Depends
|
||||
from core.dependencies import Paging, QueryParams
|
||||
|
||||
|
||||
class IssueParams(QueryParams):
|
||||
"""
|
||||
列表分页
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
params: Paging = Depends(),
|
||||
is_active: bool = None,
|
||||
title: str = None,
|
||||
category_id: int = None
|
||||
):
|
||||
super().__init__(params)
|
||||
self.v_order = "desc"
|
||||
self.v_order_field = "create_datetime"
|
||||
self.is_active = is_active
|
||||
self.category_id = category_id
|
||||
self.title = ("like", title)
|
||||
|
||||
|
||||
class IssueCategoryParams(QueryParams):
|
||||
"""
|
||||
列表分页
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
params: Paging = Depends(),
|
||||
is_active: bool = None,
|
||||
platform: str = None,
|
||||
name: str = None
|
||||
):
|
||||
super().__init__(params)
|
||||
self.v_order = "desc"
|
||||
self.v_order_field = "create_datetime"
|
||||
self.is_active = is_active
|
||||
self.platform = platform
|
||||
self.name = ("like", name)
|
12
apps/vadmin/help/schemas/__init__.py
Normal file
12
apps/vadmin/help/schemas/__init__.py
Normal file
@ -0,0 +1,12 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2023-02-15 20:03:49
|
||||
# @File : __init__.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 初始化文件
|
||||
|
||||
|
||||
from .issue import Issue, IssueSimpleOut, IssueListOut
|
||||
from .issue_category import IssueCategory, IssueCategorySimpleOut, IssueCategoryListOut, IssueCategoryOptionsOut
|
||||
from .issue_m2m import IssueCategoryPlatformOut
|
38
apps/vadmin/help/schemas/issue.py
Normal file
38
apps/vadmin/help/schemas/issue.py
Normal file
@ -0,0 +1,38 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : issue.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 常见问题
|
||||
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from core.data_types import DatetimeStr
|
||||
from apps.vadmin.auth.schemas import UserSimpleOut
|
||||
from .issue_category import IssueCategorySimpleOut
|
||||
|
||||
|
||||
class Issue(BaseModel):
|
||||
category_id: int | None = None
|
||||
create_user_id: int | None = None
|
||||
|
||||
title: str | None = None
|
||||
content: str | None = None
|
||||
view_number: int | None = None
|
||||
is_active: bool | None = None
|
||||
|
||||
|
||||
class IssueSimpleOut(Issue):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: int
|
||||
update_datetime: DatetimeStr
|
||||
create_datetime: DatetimeStr
|
||||
|
||||
|
||||
class IssueListOut(IssueSimpleOut):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
create_user: UserSimpleOut
|
||||
category: IssueCategorySimpleOut
|
43
apps/vadmin/help/schemas/issue_category.py
Normal file
43
apps/vadmin/help/schemas/issue_category.py
Normal file
@ -0,0 +1,43 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2022/7/7 13:41
|
||||
# @File : issue_category.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 常见问题类别
|
||||
|
||||
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel, Field, ConfigDict
|
||||
from core.data_types import DatetimeStr
|
||||
from apps.vadmin.auth.schemas import UserSimpleOut
|
||||
|
||||
|
||||
class IssueCategory(BaseModel):
|
||||
name: str | None = None
|
||||
platform: str | None = None
|
||||
is_active: bool | None = None
|
||||
|
||||
create_user_id: int | None = None
|
||||
|
||||
|
||||
class IssueCategorySimpleOut(IssueCategory):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
id: int
|
||||
update_datetime: DatetimeStr
|
||||
create_datetime: DatetimeStr
|
||||
|
||||
|
||||
class IssueCategoryListOut(IssueCategorySimpleOut):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
create_user: UserSimpleOut
|
||||
|
||||
|
||||
class IssueCategoryOptionsOut(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
label: str = Field(alias='name')
|
||||
value: int = Field(alias='id')
|
||||
|
27
apps/vadmin/help/schemas/issue_m2m.py
Normal file
27
apps/vadmin/help/schemas/issue_m2m.py
Normal file
@ -0,0 +1,27 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2023/2/17 15:18
|
||||
# @File : issue_m2m.py.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 简要说明
|
||||
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from core.data_types import DatetimeStr
|
||||
from .issue import IssueSimpleOut
|
||||
|
||||
|
||||
class IssueCategoryPlatformOut(BaseModel):
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
name: str | None = None
|
||||
platform: str | None = None
|
||||
is_active: bool | None = None
|
||||
create_user_id: int | None = None
|
||||
|
||||
id: int
|
||||
update_datetime: DatetimeStr
|
||||
create_datetime: DatetimeStr
|
||||
|
||||
issues: list[IssueSimpleOut] = None
|
||||
|
125
apps/vadmin/help/views.py
Normal file
125
apps/vadmin/help/views.py
Normal file
@ -0,0 +1,125 @@
|
||||
#!/usr/bin/python
|
||||
# -*- coding: utf-8 -*-
|
||||
# @version : 1.0
|
||||
# @Create Time : 2023-02-15 20:03:49
|
||||
# @File : views.py
|
||||
# @IDE : PyCharm
|
||||
# @desc : 帮助中心视图
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.orm import joinedload
|
||||
from core.database import db_getter
|
||||
from utils.response import SuccessResponse
|
||||
from . import schemas, crud, params, models
|
||||
from core.dependencies import IdList
|
||||
from apps.vadmin.auth.utils.current import AllUserAuth
|
||||
from apps.vadmin.auth.utils.validation.auth import Auth
|
||||
|
||||
app = APIRouter()
|
||||
|
||||
|
||||
###########################################################
|
||||
# 类别管理
|
||||
###########################################################
|
||||
@app.get("/issue/categorys", summary="获取类别列表")
|
||||
async def get_issue_categorys(p: params.IssueCategoryParams = Depends(), auth: Auth = Depends(AllUserAuth())):
|
||||
model = models.VadminIssueCategory
|
||||
options = [joinedload(model.create_user)]
|
||||
schema = schemas.IssueCategoryListOut
|
||||
datas, count = await crud.IssueCategoryDal(auth.db).get_datas(
|
||||
**p.dict(),
|
||||
v_options=options,
|
||||
v_schema=schema,
|
||||
v_return_count=True
|
||||
)
|
||||
return SuccessResponse(datas, count=count)
|
||||
|
||||
|
||||
@app.get("/issue/categorys/options", summary="获取类别选择项")
|
||||
async def get_issue_categorys_options(auth: Auth = Depends(AllUserAuth())):
|
||||
schema = schemas.IssueCategoryOptionsOut
|
||||
return SuccessResponse(await crud.IssueCategoryDal(auth.db).get_datas(limit=0, is_active=True, v_schema=schema))
|
||||
|
||||
|
||||
@app.post("/issue/categorys", summary="创建类别")
|
||||
async def create_issue_category(data: schemas.IssueCategory, auth: Auth = Depends(AllUserAuth())):
|
||||
data.create_user_id = auth.user.id
|
||||
return SuccessResponse(await crud.IssueCategoryDal(auth.db).create_data(data=data))
|
||||
|
||||
|
||||
@app.delete("/issue/categorys", summary="批量删除类别", description="硬删除")
|
||||
async def delete_issue_categorys(ids: IdList = Depends(), auth: Auth = Depends(AllUserAuth())):
|
||||
await crud.IssueCategoryDal(auth.db).delete_datas(ids=ids.ids, v_soft=False)
|
||||
return SuccessResponse("删除成功")
|
||||
|
||||
|
||||
@app.put("/issue/categorys/{data_id}", summary="更新类别信息")
|
||||
async def put_issue_category(data_id: int, data: schemas.IssueCategory, auth: Auth = Depends(AllUserAuth())):
|
||||
return SuccessResponse(await crud.IssueCategoryDal(auth.db).put_data(data_id, data))
|
||||
|
||||
|
||||
@app.get("/issue/categorys/{data_id}", summary="获取类别信息")
|
||||
async def get_issue_category(data_id: int, auth: Auth = Depends(AllUserAuth())):
|
||||
schema = schemas.IssueCategorySimpleOut
|
||||
return SuccessResponse(await crud.IssueCategoryDal(auth.db).get_data(data_id, v_schema=schema))
|
||||
|
||||
|
||||
@app.get("/issue/categorys/platform/{platform}", summary="获取平台中的常见问题类别列表")
|
||||
async def get_issue_category_platform(platform: str, db: AsyncSession = Depends(db_getter)):
|
||||
model = models.VadminIssueCategory
|
||||
options = [joinedload(model.issues)]
|
||||
schema = schemas.IssueCategoryPlatformOut
|
||||
result = await crud.IssueCategoryDal(db).get_datas(
|
||||
limit=0,
|
||||
platform=platform,
|
||||
is_active=True,
|
||||
v_schema=schema,
|
||||
v_options=options
|
||||
)
|
||||
return SuccessResponse(result)
|
||||
|
||||
|
||||
###########################################################
|
||||
# 问题管理
|
||||
###########################################################
|
||||
@app.get("/issues", summary="获取问题列表")
|
||||
async def get_issues(p: params.IssueParams = Depends(), auth: Auth = Depends(AllUserAuth())):
|
||||
model = models.VadminIssue
|
||||
options = [joinedload(model.create_user), joinedload(model.category)]
|
||||
schema = schemas.IssueListOut
|
||||
datas, count = await crud.IssueDal(auth.db).get_datas(
|
||||
**p.dict(),
|
||||
v_options=options,
|
||||
v_schema=schema,
|
||||
v_return_count=True
|
||||
)
|
||||
return SuccessResponse(datas, count=count)
|
||||
|
||||
|
||||
@app.post("/issues", summary="创建问题")
|
||||
async def create_issue(data: schemas.Issue, auth: Auth = Depends(AllUserAuth())):
|
||||
data.create_user_id = auth.user.id
|
||||
return SuccessResponse(await crud.IssueDal(auth.db).create_data(data=data))
|
||||
|
||||
|
||||
@app.delete("/issues", summary="批量删除问题", description="硬删除")
|
||||
async def delete_issues(ids: IdList = Depends(), auth: Auth = Depends(AllUserAuth())):
|
||||
await crud.IssueDal(auth.db).delete_datas(ids=ids.ids, v_soft=False)
|
||||
return SuccessResponse("删除成功")
|
||||
|
||||
|
||||
@app.put("/issues/{data_id}", summary="更新问题信息")
|
||||
async def put_issue(data_id: int, data: schemas.Issue, auth: Auth = Depends(AllUserAuth())):
|
||||
return SuccessResponse(await crud.IssueDal(auth.db).put_data(data_id, data))
|
||||
|
||||
|
||||
@app.get("/issues/{data_id}", summary="获取问题信息")
|
||||
async def get_issue(data_id: int, db: AsyncSession = Depends(db_getter)):
|
||||
schema = schemas.IssueSimpleOut
|
||||
return SuccessResponse(await crud.IssueDal(db).get_data(data_id, v_schema=schema))
|
||||
|
||||
|
||||
@app.get("/issues/add/view/number/{data_id}", summary="更新常见问题查看次数+1")
|
||||
async def issue_add_view_number(data_id: int, db: AsyncSession = Depends(db_getter)):
|
||||
return SuccessResponse(await crud.IssueDal(db).add_view_number(data_id))
|
Reference in New Issue
Block a user