Skip to content

项目目录

server 整体目录结构

shell
├── captcha                     #图片验证码应用
├── common                      # 项目工具类库,包含各种封装方法
├── config.yml                   # 运行配置文件,包含数据库,Redis等配置信息
├── docker-compose-sqlite.yml
├── docker-compose.yml          # docker compose 运行文件
├── Dockerfile                  # 用与构建容器镜像文件
├── LICENSE
├── loadjson                  # 默认的菜单,权限,字段配置
├── locale                    # 国际化配置,支持中文和英语
├── logs                      # 运行日志
├── manage.py
├── message                   # websocket 消息
├── notifications             # 站内信,消息通知推送应用
├── README.md
├── requirements.txt          # Django 运行依赖
├── server                    # 项目主应用
├── settings                  # 项目相关配置应用
└── system                    # 系统应用,包含用户,菜单,日志,角色等

项目配置模板文件config_example.yml

shell
# SECURITY WARNING: keep the secret key used in production secret!
# 加密密钥 生产服必须保证唯一性,你必须保证这个值的安全,否则攻击者可以用它来生成自己的签名值
# $ cat /dev/urandom | tr -dc A-Za-z0-9 | head -c 49;echo
SECRET_KEY:

# Development env open this, when error occur display the full process track, Production disable it
# DEBUG 模式 开启DEBUG后遇到错误时可以看到更多日志,正式服要禁用
# DEBUG: true

# DEBUG, INFO, WARNING, ERROR, CRITICAL can set. See https://docs.djangoproject.com/zh-hans/5.0/topics/logging/
# 日志级别
# LOG_LEVEL: DEBUG

# 用于DEBUG模式下,输出sql日志
# DEBUG_DEV = true

# Database setting, Support sqlite3, mysql, postgres ....
# 数据库设置
# ### 更多数据库配置,参考官方文档:https://docs.djangoproject.com/zh-hans/5.0/ref/databases/
# 创建竖数据库sql
# create database xadmin default character set utf8mb4 COLLATE utf8mb4_bin;
# grant all on xadmin.* to server@'127.0.0.1' identified by 'KGzKjZpWBp4R4RSa';

# SQLite setting:
# 使用单文件sqlite数据库
# DB_ENGINE: sqlite3
# DB_NAME:
# MySQL or postgres setting like:
# DB_ENGINE can set mysql, oracle, postgresql, sqlite3

# 使用 Mariadb 作为数据库
#DB_ENGINE: mysql
#DB_HOST: mysql
#DB_PORT: 3306

# 使用 postgresql 作为数据库[默认数据库]
DB_ENGINE: postgresql
DB_HOST: postgresql
DB_PORT: 5432

DB_USER: server
DB_DATABASE: xadmin
#DB_PASSWORD: KGzKjZpWBp4R4RSa


# Use Redis as broker for celery and web socket
# Redis配置
REDIS_HOST: redis
REDIS_PORT: 6379
#REDIS_PASSWORD: nineven
#DEFAULT_CACHE_ID: 1
#CHANNEL_LAYERS_CACHE_ID: 2
#CELERY_BROKER_CACHE_ID: 3

# When Django start it will bind this host and port
# ./manage.py runserver 127.0.0.1:8896
# 运行时绑定端口
HTTP_BIND_HOST: 0.0.0.0
HTTP_LISTEN_PORT: 8896
GUNICORN_MAX_WORKER: 4

# 需要将创建的应用写到里面
XADMIN_APPS:

client 整体目录结构

shell
├── build
├── build.sh                            # 构建就脚本
├── commitlint.config.js
├── docker-compose.yml                  # docker compose 运行文件
├── Dockerfile                          # 用与构建容器镜像文件
├── eslint.config.js
├── index.html
├── LICENSE
├── locales                             # 国际化
├── mock
├── package.json                        # 环境依赖
├── pnpm-lock.yaml
├── postcss.config.js
├── public
├── src                                 # 主要源码
│   ├── api                 # 接口api
│   ├── App.vue
│   ├── assets
│   ├── components          # 组件库
│       ├── RePlusSearch    # 后端对应搜索组件-重要!!!
│       ├── RePlusPage      # 页面组件-重要!!!
│   ├── config              # 项目配置
│   ├── constants
│   ├── directives
│   ├── layout              # 项目框架
│   ├── main.ts
│   ├── plugins
│   ├── router              # 路由
│   ├── store
│   ├── style
│   ├── utils           
│   └── views               #页面
├── stylelint.config.js
├── tailwind.config.ts
├── tsconfig.json
├── types
└── vite.config.ts

核心代码

前端需要悉知 RePlusSearch 和 RePlusPage 组件

RePlusPage

使用了自封装的RePlusPage组件src/components/RePlusPage/src/utils/types.ts,参数如下

ts
import type {
    PlusColumn,
    PlusDescriptionsProps,
    PlusSearchProps,
    RecordType
} from "plus-pro-components";
import type {
    PaginationProps,
    PureTableProps,
    TableColumnRenderer,
    TableColumns
} from "@pureadmin/table";
import type {BaseApi} from "@/api/base";
import type {formDialogOptions} from "./handle";
import type {OperationProps} from "@/components/RePlusPage";
import type {PureTableBarProps} from "@/components/RePureTableBar";
import type {VNode} from "vue";
import type {Mutable} from "@vueuse/core";
import type {SearchColumnsResult, SearchFieldsResult} from "@/api/types";

interface TableColumn {
    /** 是否隐藏 */
    hide?: boolean | CallableFunction;
    /** 自定义列的内容插槽 */
    slot?: string;
    /** 自定义表头的内容插槽 */
    headerSlot?: string;
    /** 多级表头,内部实现原理:嵌套 `el-table-column` */
    children?: Array<TableColumn>;
    /** 自定义单元格渲染器(`jsx`语法) */
    cellRenderer?: (data: TableColumnRenderer) => VNode | string;
    /** 自定义头部渲染器(`jsx`语法) */
    headerRenderer?: (data: TableColumnRenderer) => VNode | string;
}

interface PageColumn extends PlusColumn, TableColumn {
    // columns: Partial<Mutable<TableColumn> & { _column: object }>[]
    _column: Partial<
        Mutable<SearchFieldsResult["data"][0]> &
        Mutable<SearchColumnsResult["data"][0]>
    >;
}

interface PageColumnList extends TableColumns {
    prop?: string;
    _column: Partial<
        Mutable<SearchFieldsResult["data"][0]> &
        Mutable<SearchColumnsResult["data"][0]>
    >;
}

interface ApiAuthProps {
    list?: string | boolean | null | BaseApi["list"];
    importData?: string | boolean | null | BaseApi["importData"];
    exportData?: string | boolean | null | BaseApi["exportData"];
    create?: string | boolean | null | BaseApi["create"];
    destroy?: string | boolean | null | BaseApi["destroy"];
    update?: string | boolean | null | BaseApi["update"];
    retrieve?: string | boolean | null | BaseApi["retrieve"];
    partialUpdate?: string | boolean | null | BaseApi["partialUpdate"];
    fields?: string | boolean | null | BaseApi["fields"];
    batchDestroy?: string | boolean | null | BaseApi["batchDestroy"];
}

interface RePlusPageProps {
    api: Partial<BaseApi>;
    title?: string;
    auth: Partial<ApiAuthProps>;
    /**
     * 是否有多选框, 一般为第一列
     */
    selection?: boolean;
    /**
     * 加载组件是否同时加载数据
     */
    immediate?: boolean;
    /**
     * 是否有 操作列, 一般为最后一列
     */
    operation?: boolean;
    /**
     * 是否是 树 表格
     */
    isTree?: boolean;
    /**
     * 是否有 工具栏
     */
    tableBar?: boolean;
    /**
     * 国际化,对应 locales 中
     */
    localeName?: string;
    /**
     * PlusSearchProps, 参考文档:https://plus-pro-components.com/components/search.html#search-attributes
     */
    plusSearchProps?: Partial<PlusSearchProps>;
    /**
     * pureTableProps, 参考源码:https://github.com/pure-admin/pure-admin-table
     */
    pureTableProps?: Partial<PureTableProps>;
    /**
     * pureTableBarProps
     */
    pureTableBarProps?: Partial<PureTableBarProps>;
    /**
     * plusDescriptionsProps, 参考文档:https://plus-pro-components.com/components/descriptions.html
     */
    plusDescriptionsProps?: Partial<PlusDescriptionsProps>;
    /**
     * 对通过 request 获取的数据进行处理
     * @param data
     */
    searchResultFormat?: <T = RecordType[]>(data: T[]) => T[];
    /**
     * pure table 的 columns, 并返回
     * @param columns
     */
    listColumnsFormat?: (columns: PageColumnList[]) => PageColumnList[];
    /**
     * plus pro descriptions 的 columns, 并返回
     * @param columns
     */
    detailColumnsFormat?: (columns: PageColumn[]) => PageColumn[];
    /**
     * plus pro search 的 columns, 并返回
     * @param columns
     */
    searchColumnsFormat?: (columns: PageColumn[]) => PageColumn[];
    baseColumnsFormat?: ({
                             listColumns,
                             detailColumns,
                             searchColumns,
                             addOrEditRules,
                             addOrEditColumns,
                             searchDefaultValue,
                             addOrEditDefaultValue
                         }) => void;
    /**
     * 搜索之前进行一些修改
     * @param params
     */
    beforeSearchSubmit?: <T = RecordType>(params: T) => T;
    /**
     * 分页组件
     */
    pagination?: Partial<PaginationProps>;
    /**
     * 默认的添加,更新 方法
     */
    addOrEditOptions?: {
        title?: "";
        props?: Partial<formDialogOptions>;
        form?: undefined;
        apiReq?: (
            formOptions: Partial<formDialogOptions> & { formData: RecordType }
        ) => BaseApi | any;
    };
    /**
     * 操作栏 按钮组方法
     */
    operationButtonsProps?: Partial<OperationProps>;
    /**
     * 工具栏 按钮组方法
     */
    tableBarButtonsProps?: Partial<OperationProps>;
}

export type {ApiAuthProps, RePlusPageProps, PageColumn, PageColumnList};

后端common/core里面的相关代码