Procházet zdrojové kódy

第一版管理端

mqk před 3 měsíci
rodič
revize
f0406768e4

+ 0 - 21
LICENSE

@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2024 shaw-lee
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.

+ 4 - 1
readme.md

@@ -101,7 +101,10 @@ pip3 install -r ./bin/requirements.txt
 
 ```cmd
 # 启动服务
-python ruoyi_admin/app.py
+  ruoyi_admin/config/app-dev.yml 中配置数据库信息
+下载包:
+pip install -r requirements.txt
+ python -m ruoyi_admin.app   
 ```
 
 ### 前端快速启动(开发环境:windows)

binární
requirements.txt


+ 51 - 0
ruoyi-ui/src/api/system/moduleConf/compoConf.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+
+
+
+// 查询套餐配置表列表
+export function listCompoConf(query) {
+  return request({
+    url: '/system/moduleConf/compoConf/list',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+// 查询套餐配置表详细
+export function getCompoConf(confId) {
+  return request({
+    url: '/system/moduleConf/compoConf/' +confId,
+    method: 'get'
+  })
+}
+
+// 新增套餐配置表
+export function addCompoConf(data) {
+  return request({
+    url: '/system/moduleConf/compoConf',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改套餐配置表
+export function updateCompoConf(data) {
+  return request({
+    // 后端 Flask 控制器使用的是不带主键的 PUT '' 路径,这里保持一致
+    url: '/system/moduleConf/compoConf',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除套餐配置表
+export function delCompoConf(confId) {
+  return request({
+    url: '/system/moduleConf/compoConf/' +confId,
+    method: 'delete'
+  })
+}
+

+ 47 - 0
ruoyi-ui/src/api/system/moduleConf/productConf.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+
+// 查询单品配置表列表
+export function listProductConf(query) {
+  return request({
+    url: '/system/moduleConf/productConf/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询单品配置表详细
+export function getProductConf(confId) {
+  return request({
+    url: '/system/moduleConf/productConf/' +confId,
+    method: 'get'
+  })
+}
+
+// 新增单品配置表
+export function addProductConf(data) {
+  return request({
+    url: '/system/moduleConf/productConf',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改单品配置表
+export function updateProductConf(data) {
+  return request({
+    // 后端 Flask 控制器使用的是不带主键的 PUT '' 路径,这里保持一致
+    url: '/system/moduleConf/productConf',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除单品配置表
+export function delProductConf(confId) {
+  return request({
+    url: '/system/moduleConf/productConf/' +confId,
+    method: 'delete'
+  })
+}
+

+ 524 - 0
ruoyi-ui/src/views/system/moduleConf/compoConf/index.vue

@@ -0,0 +1,524 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="分类索引" prop="moduleIndex">
+        <el-input
+          v-model="queryParams.moduleIndex"
+          placeholder="2位"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="子类路径" prop="category">
+        <el-input
+          v-model="queryParams.category"
+          placeholder="正式为树结构选择"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="属性列表" prop="attributes">
+        <el-input
+          v-model="queryParams.attributes"
+          placeholder="请输入属性列表"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['moduleConf:compoConf:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['moduleConf:compoConf:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['moduleConf:compoConf:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['moduleConf:compoConf:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-upload2"
+          size="mini"
+          @click="handleImport"
+          v-hasPermi="['moduleConf:compoConf:import']"
+        >导入</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+    </el-row>
+
+    <el-table :loading="loading" :data="sysList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="conf_id" :show-overflow-tooltip="true" v-if="columns[0].visible" prop="confId" />-->
+      <el-table-column label="分类索引" align="center" :show-overflow-tooltip="true" v-if="columns[1].visible" prop="moduleIndex" />
+      <el-table-column label="子类路径" align="center" :show-overflow-tooltip="true" v-if="columns[2].visible" prop="category" />
+      <el-table-column label="属性列表" align="center" :show-overflow-tooltip="true" v-if="columns[3].visible" prop="attributes" />
+      <el-table-column label="版本号" align="center" :show-overflow-tooltip="true" v-if="columns[4].visible" prop="version" />
+      <el-table-column label="删除标记" align="center" :show-overflow-tooltip="true" v-if="columns[5].visible" prop="deleteFlag">
+        <template slot-scope="scope">
+          <span v-if="scope.row.deleteFlag === 0">未删除</span>
+          <span v-else-if="scope.row.deleteFlag === 1">已删除</span>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" :show-overflow-tooltip="true" v-if="columns[6].visible" prop="status">
+        <template slot-scope="scope">
+          <span v-if="scope.row.status === 0">禁用</span>
+          <span v-else-if="scope.row.status === 1">启用</span>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['moduleConf:compoConf:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['moduleConf:compoConf:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改套餐配置表对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+<!--        <el-form-item label="conf_id" prop="confId">-->
+<!--          <el-input v-model="form.confId" placeholder="请输入conf_id" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="分类索引" prop="moduleIndex">
+          <el-input v-model="form.moduleIndex" placeholder="请输入分类索引" />
+        </el-form-item>
+        <el-form-item label="子类路径" prop="category">
+          <el-input v-model="form.category" placeholder="请输入子类路径" />
+        </el-form-item>
+        <el-form-item label="版本号" prop="version">
+          <el-input-number v-model="form.version" :min="0" placeholder="请输入版本号" style="width: 100%" />
+        </el-form-item>
+        <el-form-item label="删除标记" prop="deleteFlag">
+          <el-radio-group v-model="form.deleteFlag">
+            <el-radio :label="0">未删除</el-radio>
+            <el-radio :label="1">已删除</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio :label="0">禁用</el-radio>
+            <el-radio :label="1">启用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="属性设置" prop="attributes">
+          <div style="width: 100%;">
+            <el-table :data="attrList" border style="width: 100%" size="small" max-height="400">
+              <el-table-column label="属性名" width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.attrName" placeholder="请输入属性名" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="属性标识" width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.attr" placeholder="请输入属性标识" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="类型" width="280">
+                <template slot-scope="scope">
+                  <el-radio-group v-model="scope.row.type" size="small">
+                  <el-radio-button label="int">整数</el-radio-button>
+                    <el-radio-button label="double">小数</el-radio-button>
+                    <el-radio-button label="string">字符串</el-radio-button>
+                    <el-radio-button label="datatime">日期</el-radio-button>
+                  </el-radio-group>
+                </template>
+              </el-table-column>
+              <el-table-column label="描述" min-width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.description" placeholder="请输入描述" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="100" align="center" fixed="right">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    icon="el-icon-delete"
+                    @click="removeAttrRow(scope.$index)"
+                  >删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <div style="margin-top: 10px;">
+              <el-button type="primary" size="small" icon="el-icon-plus" @click="addAttrRow">添加属性</el-button>
+            </div>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 导入对话框 -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <div class="el-upload__tip text-center" slot="tip">
+          <div class="el-upload__tip" slot="tip">
+            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的套餐配置表数据
+          </div>
+          <span>仅允许导入xls、xlsx格式文件。</span>
+          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+
+import { listCompoConf, getCompoConf, delCompoConf, addCompoConf, updateCompoConf } from "@/api/system/moduleConf/compoConf";
+import { getToken } from "@/utils/auth";
+
+export default {
+  name: "CompoConf",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 套餐配置表表格数据
+      sysList: [],
+      // 表格列信息
+      columns: [
+        { key: 0, label: 'conf_id', visible: false },
+        { key: 1, label: '分类索引', visible: true },
+        { key: 2, label: '子类路径', visible: true },
+        { key: 3, label: '属性列表', visible: true },
+        { key: 4, label: '版本号', visible: true },
+        { key: 5, label: '删除标记', visible: true },
+        { key: 6, label: '状态', visible: true }
+      ],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        // confId: null,
+        moduleIndex: null,
+        category: null,
+        attributes: null
+      },
+      // 表单参数
+      form: {},
+      // 属性列表数据
+      attrList: [],
+      // 导入参数
+      upload: {
+        // 是否显示弹出层(导入)
+        open: false,
+        // 弹出层标题(导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的套餐配置表数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/test/sys/importData"
+      },
+      // 表单校验
+      rules: {
+        // confId: [
+        //   { required: true, message: "conf_id不能为空", trigger: "blur" }
+        // ],
+        category: [
+          { required: true, message: "子类路径不能为空", trigger: "blur" }
+        ],
+        attributes: [
+          { required: false, message: "请设置属性", trigger: "change" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询套餐配置表列表 */
+    getList() {
+      this.loading = true;
+      listCompoConf(this.queryParams).then(response => {
+        this.sysList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        moduleIndex: null,
+        category: null,
+        attributes: null,
+        version: null,
+        deleteFlag: 0,
+        status: 1
+      };
+      this.attrList = [];
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.confId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      // 新增时添加一个默认空行
+      this.addAttrRow();
+      this.open = true;
+      this.title = "添加套餐配置表";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const confId = row.confId || this.ids
+      getCompoConf(confId).then(response => {
+        this.form = response.data;
+        // 解析attributes JSON字符串为attrList
+        if (this.form.attributes) {
+          try {
+            this.attrList = JSON.parse(this.form.attributes);
+            // 确保是数组格式
+            if (!Array.isArray(this.attrList)) {
+              this.attrList = [];
+            }
+          } catch (e) {
+            console.error("解析attributes失败:", e);
+            this.attrList = [];
+          }
+        } else {
+          this.attrList = [];
+        }
+        this.open = true;
+        this.title = "修改套餐配置表";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          const submitData = this.buildSubmitData();
+          if (submitData.confId != null) {
+            updateCompoConf(submitData).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addCompoConf(submitData).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const sysIds = row.confId || this.ids;
+      this.$modal.confirm('是否确认删除套餐配置表编号为"' + sysIds + '"的数据项?').then(function() {
+        return delCompoConf(sysIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('test/sys/export', {
+        ...this.queryParams
+      }, `sys_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "套餐配置表导入";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      this.download(
+        "test/sys/importTemplate",
+        {},
+        "sys_template_" + new Date().getTime() + ".xlsx"
+      );
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
+      this.$modal.closeLoading()
+      this.getList();
+    },
+    buildSubmitData() {
+      // 只保留实体类中定义的字段,过滤掉其他字段
+      const data = {};
+      // 只添加存在的字段,避免提交 undefined 或空字符串
+      if (this.form.moduleIndex !== undefined && this.form.moduleIndex !== null && this.form.moduleIndex !== "") {
+        data.moduleIndex = this.form.moduleIndex;
+      }
+      if (this.form.category !== undefined && this.form.category !== null && this.form.category !== "") {
+        data.category = this.form.category;
+      }
+      if (this.form.version !== undefined && this.form.version !== null) {
+        data.version = this.form.version;
+      }
+      if (this.form.deleteFlag !== undefined && this.form.deleteFlag !== null) {
+        data.deleteFlag = this.form.deleteFlag;
+      }
+      if (this.form.status !== undefined && this.form.status !== null) {
+        data.status = this.form.status;
+      }
+      // 将attrList序列化为JSON字符串
+      if (this.attrList && this.attrList.length > 0) {
+        data.attributes = JSON.stringify(this.attrList);
+      } else {
+        data.attributes = null;
+      }
+      // 如果是修改操作,需要包含 confId
+      if (this.form.confId !== null && this.form.confId !== undefined && this.form.confId !== "") {
+        data.confId = this.form.confId;
+      }
+      return data;
+    },
+    // 添加属性行
+    addAttrRow() {
+      this.attrList.push({
+        attrName: "",
+        attr: "",
+        type: "字符串",
+        description: ""
+      });
+    },
+    // 删除属性行
+    removeAttrRow(index) {
+      this.attrList.splice(index, 1);
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$modal.loading("导入中请稍后")
+      this.$refs.upload.submit();
+    }
+  }
+};
+</script>
+

+ 479 - 0
ruoyi-ui/src/views/system/moduleConf/priceConf/index.vue

@@ -0,0 +1,479 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="分类索引" prop="moduleIndex">
+        <el-input
+          v-model="queryParams.moduleIndex"
+          placeholder="2位"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="子类路径" prop="category">
+        <el-input
+          v-model="queryParams.category"
+          placeholder="正式为树结构选择"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="属性列表" prop="attributes">
+        <el-input
+          v-model="queryParams.attributes"
+          placeholder="请输入属性列表"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['moduleConf:priceConf:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['moduleConf:priceConf:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['moduleConf:priceConf:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['moduleConf:priceConf:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-upload2"
+          size="mini"
+          @click="handleImport"
+          v-hasPermi="['moduleConf:priceConf:import']"
+        >导入</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+    </el-row>
+
+    <el-table :loading="loading" :data="sysList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="conf_id" :show-overflow-tooltip="true" v-if="columns[0].visible" prop="confId" />-->
+      <el-table-column label="分类索引" align="center" :show-overflow-tooltip="true" v-if="columns[1].visible" prop="moduleIndex" />
+      <el-table-column label="子类路径" align="center" :show-overflow-tooltip="true" v-if="columns[2].visible" prop="category" />
+      <el-table-column label="属性列表" align="center" :show-overflow-tooltip="true" v-if="columns[3].visible" prop="attributes" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['moduleConf:priceConf:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['moduleConf:priceConf:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改价目配置表对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+<!--        <el-form-item label="conf_id" prop="confId">-->
+<!--          <el-input v-model="form.confId" placeholder="请输入conf_id" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="分类索引" prop="moduleIndex">
+          <el-input v-model="form.moduleIndex" placeholder="请输入分类索引" />
+        </el-form-item>
+        <el-form-item label="子类路径" prop="category">
+          <el-input v-model="form.category" placeholder="请输入子类路径" />
+        </el-form-item>
+        <el-form-item label="属性设置" prop="attributes">
+          <div style="width: 100%;">
+            <el-table :data="attrList" border style="width: 100%" size="small" max-height="400">
+              <el-table-column label="属性名" width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.attrName" placeholder="请输入属性名" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="属性标识" width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.attr" placeholder="请输入属性标识" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="类型" width="280">
+                <template slot-scope="scope">
+                  <el-radio-group v-model="scope.row.type" size="small">
+                   <el-radio-button label="int">整数</el-radio-button>
+                    <el-radio-button label="double">小数</el-radio-button>
+                    <el-radio-button label="string">字符串</el-radio-button>
+                    <el-radio-button label="datatime">日期</el-radio-button>
+                  </el-radio-group>
+                </template>
+              </el-table-column>
+              <el-table-column label="描述" min-width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.description" placeholder="请输入描述" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="100" align="center" fixed="right">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    icon="el-icon-delete"
+                    @click="removeAttrRow(scope.$index)"
+                  >删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <div style="margin-top: 10px;">
+              <el-button type="primary" size="small" icon="el-icon-plus" @click="addAttrRow">添加属性</el-button>
+            </div>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 导入对话框 -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <div class="el-upload__tip text-center" slot="tip">
+          <div class="el-upload__tip" slot="tip">
+            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的价目配置表数据
+          </div>
+          <span>仅允许导入xls、xlsx格式文件。</span>
+          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+
+import { listPriceConf, getPriceConf, delPriceConf, addPriceConf, updatePriceConf } from "@/api/system/moduleConf/priceConf";
+import { getToken } from "@/utils/auth";
+
+export default {
+  name: "PriceConf",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 价目配置表表格数据
+      sysList: [],
+      // 表格列信息
+      columns: [
+        { key: 0, label: 'conf_id', visible: false },
+        { key: 1, label: '分类索引', visible: true },
+        { key: 2, label: '子类路径', visible: true },
+        { key: 3, label: '属性列表', visible: true }
+      ],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        // confId: null,
+        moduleIndex: null,
+        category: null,
+        attributes: null
+      },
+      // 表单参数
+      form: {},
+      // 属性列表数据
+      attrList: [],
+      // 导入参数
+      upload: {
+        // 是否显示弹出层(导入)
+        open: false,
+        // 弹出层标题(导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的价目配置表数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/test/sys/importData"
+      },
+      // 表单校验
+      rules: {
+        // confId: [
+        //   { required: true, message: "conf_id不能为空", trigger: "blur" }
+        // ],
+        category: [
+          { required: true, message: "子类路径不能为空", trigger: "blur" }
+        ],
+        attributes: [
+          { required: false, message: "请设置属性", trigger: "change" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询价目配置表列表 */
+    getList() {
+      this.loading = true;
+      listPriceConf(this.queryParams).then(response => {
+        this.sysList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        moduleIndex: null,
+        category: null,
+        attributes: null
+      };
+      this.attrList = [];
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.confId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      // 新增时添加一个默认空行
+      this.addAttrRow();
+      this.open = true;
+      this.title = "添加价目配置表";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const confId = row.confId || this.ids
+      getPriceConf(confId).then(response => {
+        this.form = response.data;
+        // 解析attributes JSON字符串为attrList
+        if (this.form.attributes) {
+          try {
+            this.attrList = JSON.parse(this.form.attributes);
+            // 确保是数组格式
+            if (!Array.isArray(this.attrList)) {
+              this.attrList = [];
+            }
+          } catch (e) {
+            console.error("解析attributes失败:", e);
+            this.attrList = [];
+          }
+        } else {
+          this.attrList = [];
+        }
+        this.open = true;
+        this.title = "修改价目配置表";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          const submitData = this.buildSubmitData();
+          if (submitData.confId != null) {
+            updatePriceConf(submitData).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addPriceConf(submitData).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const sysIds = row.confId || this.ids;
+      this.$modal.confirm('是否确认删除价目配置表编号为"' + sysIds + '"的数据项?').then(function() {
+        return delPriceConf(sysIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('test/sys/export', {
+        ...this.queryParams
+      }, `sys_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "价目配置表导入";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      this.download(
+        "test/sys/importTemplate",
+        {},
+        "sys_template_" + new Date().getTime() + ".xlsx"
+      );
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
+      this.$modal.closeLoading()
+      this.getList();
+    },
+    buildSubmitData() {
+      // 只保留实体类中定义的字段,过滤掉其他字段
+      const data = {};
+      // 只添加存在的字段,避免提交 undefined 或空字符串
+      if (this.form.moduleIndex !== undefined && this.form.moduleIndex !== null && this.form.moduleIndex !== "") {
+        data.moduleIndex = this.form.moduleIndex;
+      }
+      if (this.form.category !== undefined && this.form.category !== null && this.form.category !== "") {
+        data.category = this.form.category;
+      }
+      // 将attrList序列化为JSON字符串
+      if (this.attrList && this.attrList.length > 0) {
+        data.attributes = JSON.stringify(this.attrList);
+      } else {
+        data.attributes = null;
+      }
+      // 如果是修改操作,需要包含 confId
+      if (this.form.confId !== null && this.form.confId !== undefined && this.form.confId !== "") {
+        data.confId = parseInt(this.form.confId, 10);
+      }
+      return data;
+    },
+    // 添加属性行
+    addAttrRow() {
+      this.attrList.push({
+        attrName: "",
+        attr: "",
+        type: "字符串",
+        description: ""
+      });
+    },
+    // 删除属性行
+    removeAttrRow(index) {
+      this.attrList.splice(index, 1);
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$modal.loading("导入中请稍后")
+      this.$refs.upload.submit();
+    }
+  }
+};
+</script>
+

+ 524 - 0
ruoyi-ui/src/views/system/moduleConf/productConf/index.vue

@@ -0,0 +1,524 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="分类索引" prop="moduleIndex">
+        <el-input
+          v-model="queryParams.moduleIndex"
+          placeholder="2位"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="子类路径" prop="category">
+        <el-input
+          v-model="queryParams.category"
+          placeholder="正式为树结构选择"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="属性列表" prop="attributes">
+        <el-input
+          v-model="queryParams.attributes"
+          placeholder="请输入属性列表"
+          clearable
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['moduleConf:productConf:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['moduleConf:productConf:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['moduleConf:productConf:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['moduleConf:productConf:export']"
+        >导出</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="info"
+          plain
+          icon="el-icon-upload2"
+          size="mini"
+          @click="handleImport"
+          v-hasPermi="['moduleConf:productConf:import']"
+        >导入</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
+    </el-row>
+
+    <el-table :loading="loading" :data="sysList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="conf_id" :show-overflow-tooltip="true" v-if="columns[0].visible" prop="confId" />-->
+      <el-table-column label="分类索引" align="center" :show-overflow-tooltip="true" v-if="columns[1].visible" prop="moduleIndex" />
+      <el-table-column label="子类路径" align="center" :show-overflow-tooltip="true" v-if="columns[2].visible" prop="category" />
+      <el-table-column label="属性列表" align="center" :show-overflow-tooltip="true" v-if="columns[3].visible" prop="attributes" />
+      <el-table-column label="版本号" align="center" :show-overflow-tooltip="true" v-if="columns[4].visible" prop="version" />
+      <el-table-column label="删除标记" align="center" :show-overflow-tooltip="true" v-if="columns[5].visible" prop="deleteFlag">
+        <template slot-scope="scope">
+          <span v-if="scope.row.deleteFlag === 0">未删除</span>
+          <span v-else-if="scope.row.deleteFlag === 1">已删除</span>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" :show-overflow-tooltip="true" v-if="columns[6].visible" prop="status">
+        <template slot-scope="scope">
+          <span v-if="scope.row.status === 0">禁用</span>
+          <span v-else-if="scope.row.status === 1">启用</span>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['moduleConf:productConf:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['moduleConf:productConf:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改单品配置表对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+<!--        <el-form-item label="conf_id" prop="confId">-->
+<!--          <el-input v-model="form.confId" placeholder="请输入conf_id" />-->
+<!--        </el-form-item>-->
+        <el-form-item label="分类索引" prop="moduleIndex">
+          <el-input v-model="form.moduleIndex" placeholder="请输入分类索引" />
+        </el-form-item>
+        <el-form-item label="子类路径" prop="category">
+          <el-input v-model="form.category" placeholder="请输入子类路径" />
+        </el-form-item>
+        <el-form-item label="版本号" prop="version">
+          <el-input-number v-model="form.version" :min="0" placeholder="请输入版本号" style="width: 100%" />
+        </el-form-item>
+        <el-form-item label="删除标记" prop="deleteFlag">
+          <el-radio-group v-model="form.deleteFlag">
+            <el-radio :label="0">未删除</el-radio>
+            <el-radio :label="1">已删除</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio :label="0">禁用</el-radio>
+            <el-radio :label="1">启用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="属性设置" prop="attributes">
+          <div style="width: 100%;">
+            <el-table :data="attrList" border style="width: 100%" size="small" max-height="400">
+              <el-table-column label="属性名" width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.attrName" placeholder="请输入属性名" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="属性标识" width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.attr" placeholder="请输入属性标识" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="类型" width="280">
+                <template slot-scope="scope">
+                  <el-radio-group v-model="scope.row.type" size="small">
+                   <el-radio-button label="int">整数</el-radio-button>
+                    <el-radio-button label="double">小数</el-radio-button>
+                    <el-radio-button label="string">字符串</el-radio-button>
+                    <el-radio-button label="datatime">日期</el-radio-button>
+                  </el-radio-group>
+                </template>
+              </el-table-column>
+              <el-table-column label="描述" min-width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.description" placeholder="请输入描述" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="100" align="center" fixed="right">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    icon="el-icon-delete"
+                    @click="removeAttrRow(scope.$index)"
+                  >删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <div style="margin-top: 10px;">
+              <el-button type="primary" size="small" icon="el-icon-plus" @click="addAttrRow">添加属性</el-button>
+            </div>
+          </div>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 导入对话框 -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url + '?updateSupport=' + upload.updateSupport"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        drag
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+        <div class="el-upload__tip text-center" slot="tip">
+          <div class="el-upload__tip" slot="tip">
+            <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的单品配置表数据
+          </div>
+          <span>仅允许导入xls、xlsx格式文件。</span>
+          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link>
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="upload.open = false">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+
+import { listProductConf, getProductConf, delProductConf, addProductConf, updateProductConf } from "@/api/system/moduleConf/productConf";
+import { getToken } from "@/utils/auth";
+
+export default {
+  name: "ProductConf",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 单品配置表表格数据
+      sysList: [],
+      // 表格列信息
+      columns: [
+        { key: 0, label: 'conf_id', visible: false },
+        { key: 1, label: '分类索引', visible: true },
+        { key: 2, label: '子类路径', visible: true },
+        { key: 3, label: '属性列表', visible: true },
+        { key: 4, label: '版本号', visible: true },
+        { key: 5, label: '删除标记', visible: true },
+        { key: 6, label: '状态', visible: true }
+      ],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        // confId: null,
+        moduleIndex: null,
+        category: null,
+        attributes: null
+      },
+      // 表单参数
+      form: {},
+      // 属性列表数据
+      attrList: [],
+      // 导入参数
+      upload: {
+        // 是否显示弹出层(导入)
+        open: false,
+        // 弹出层标题(导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的单品配置表数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/test/sys/importData"
+      },
+      // 表单校验
+      rules: {
+        // confId: [
+        //   { required: true, message: "conf_id不能为空", trigger: "blur" }
+        // ],
+        category: [
+          { required: true, message: "子类路径不能为空", trigger: "blur" }
+        ],
+        attributes: [
+          { required: false, message: "请设置属性", trigger: "change" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询单品配置表列表 */
+    getList() {
+      this.loading = true;
+      listProductConf(this.queryParams).then(response => {
+        this.sysList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        moduleIndex: null,
+        category: null,
+        attributes: null,
+        version: null,
+        deleteFlag: 0,
+        status: 1
+      };
+      this.attrList = [];
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.confId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      // 新增时添加一个默认空行
+      this.addAttrRow();
+      this.open = true;
+      this.title = "添加单品配置表";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const confId = row.confId || this.ids
+      getProductConf(confId).then(response => {
+        this.form = response.data;
+        // 解析attributes JSON字符串为attrList
+        if (this.form.attributes) {
+          try {
+            this.attrList = JSON.parse(this.form.attributes);
+            // 确保是数组格式
+            if (!Array.isArray(this.attrList)) {
+              this.attrList = [];
+            }
+          } catch (e) {
+            console.error("解析attributes失败:", e);
+            this.attrList = [];
+          }
+        } else {
+          this.attrList = [];
+        }
+        this.open = true;
+        this.title = "修改单品配置表";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          const submitData = this.buildSubmitData();
+          if (submitData.confId != null) {
+            updateProductConf(submitData).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addProductConf(submitData).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const sysIds = row.confId || this.ids;
+      this.$modal.confirm('是否确认删除单品配置表编号为"' + sysIds + '"的数据项?').then(function() {
+        return delProductConf(sysIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('test/sys/export', {
+        ...this.queryParams
+      }, `sys_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "单品配置表导入";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      this.download(
+        "test/sys/importTemplate",
+        {},
+        "sys_template_" + new Date().getTime() + ".xlsx"
+      );
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
+      this.$modal.closeLoading()
+      this.getList();
+    },
+    buildSubmitData() {
+      // 只保留实体类中定义的字段,过滤掉其他字段
+      const data = {};
+      // 只添加存在的字段,避免提交 undefined 或空字符串
+      if (this.form.moduleIndex !== undefined && this.form.moduleIndex !== null && this.form.moduleIndex !== "") {
+        data.moduleIndex = this.form.moduleIndex;
+      }
+      if (this.form.category !== undefined && this.form.category !== null && this.form.category !== "") {
+        data.category = this.form.category;
+      }
+      if (this.form.version !== undefined && this.form.version !== null) {
+        data.version = this.form.version;
+      }
+      if (this.form.deleteFlag !== undefined && this.form.deleteFlag !== null) {
+        data.deleteFlag = this.form.deleteFlag;
+      }
+      if (this.form.status !== undefined && this.form.status !== null) {
+        data.status = this.form.status;
+      }
+      // 将attrList序列化为JSON字符串
+      if (this.attrList && this.attrList.length > 0) {
+        data.attributes = JSON.stringify(this.attrList);
+      } else {
+        data.attributes = null;
+      }
+      // 如果是修改操作,需要包含 confId
+      if (this.form.confId !== null && this.form.confId !== undefined && this.form.confId !== "") {
+        data.confId = this.form.confId;
+      }
+      return data;
+    },
+    // 添加属性行
+    addAttrRow() {
+      this.attrList.push({
+        attrName: "",
+        attr: "",
+        type: "字符串",
+        description: ""
+      });
+    },
+    // 删除属性行
+    removeAttrRow(index) {
+      this.attrList.splice(index, 1);
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$modal.loading("导入中请稍后")
+      this.$refs.upload.submit();
+    }
+  }
+};
+</script>
+

+ 102 - 12
ruoyi-ui/src/views/system/moduleConf/stuffInfoConf/index.vue

@@ -17,9 +17,9 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="属性列表" prop="Attributes">
+      <el-form-item label="属性列表" prop="attributes">
         <el-input
-          v-model="queryParams.Attributes"
+          v-model="queryParams.attributes"
           placeholder="请输入属性列表"
           clearable
           @keyup.enter.native="handleQuery"
@@ -92,7 +92,7 @@
 <!--      <el-table-column label="conf_id" :show-overflow-tooltip="true" v-if="columns[0].visible" prop="confId" />-->
       <el-table-column label="分类索引" align="center" :show-overflow-tooltip="true" v-if="columns[1].visible" prop="moduleIndex" />
       <el-table-column label="子类路径" align="center" :show-overflow-tooltip="true" v-if="columns[2].visible" prop="category" />
-      <el-table-column label="属性列表" align="center" :show-overflow-tooltip="true" v-if="columns[3].visible" prop="Attributes" />
+      <el-table-column label="属性列表" align="center" :show-overflow-tooltip="true" v-if="columns[3].visible" prop="attributes" />
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope">
           <el-button
@@ -122,7 +122,7 @@
     />
 
     <!-- 添加或修改员工配置表对话框 -->
-    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+    <el-dialog :title="title" :visible.sync="open" width="900px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
 <!--        <el-form-item label="conf_id" prop="confId">-->
 <!--          <el-input v-model="form.confId" placeholder="请输入conf_id" />-->
@@ -133,8 +133,49 @@
         <el-form-item label="子类路径" prop="category">
           <el-input v-model="form.category" placeholder="请输入子类路径" />
         </el-form-item>
-        <el-form-item label="属性列表" prop="Attributes">
-          <el-input type="textarea" :rows="17"  v-model="form.Attributes" placeholder="请输入属性列表" />
+        <el-form-item label="属性设置" prop="attributes">
+          <div style="width: 100%;">
+            <el-table :data="attrList" border style="width: 100%" size="small" max-height="400">
+              <el-table-column label="属性名" width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.attrName" placeholder="请输入属性名" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="属性标识" width="150">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.attr" placeholder="请输入属性标识" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="类型" width="280">
+                <template slot-scope="scope">
+                  <el-radio-group v-model="scope.row.type" size="small">
+                    <el-radio-button label="int">整数</el-radio-button>
+                    <el-radio-button label="double">小数</el-radio-button>
+                    <el-radio-button label="string">字符串</el-radio-button>
+                    <el-radio-button label="datatime">日期</el-radio-button>
+                  </el-radio-group>
+                </template>
+              </el-table-column>
+              <el-table-column label="描述" min-width="200">
+                <template slot-scope="scope">
+                  <el-input v-model="scope.row.description" placeholder="请输入描述" size="small" />
+                </template>
+              </el-table-column>
+              <el-table-column label="操作" width="100" align="center" fixed="right">
+                <template slot-scope="scope">
+                  <el-button
+                    size="mini"
+                    type="danger"
+                    icon="el-icon-delete"
+                    @click="removeAttrRow(scope.$index)"
+                  >删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <div style="margin-top: 10px;">
+              <el-button type="primary" size="small" icon="el-icon-plus" @click="addAttrRow">添加属性</el-button>
+            </div>
+          </div>
         </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -217,10 +258,12 @@ export default {
         // confId: null,
         moduleIndex: null,
         category: null,
-        Attributes: null
+        attributes: null
       },
       // 表单参数
       form: {},
+      // 属性列表数据
+      attrList: [],
       // 导入参数
       upload: {
         // 是否显示弹出层(导入)
@@ -243,6 +286,9 @@ export default {
         // ],
         category: [
           { required: true, message: "子类路径不能为空", trigger: "blur" }
+        ],
+        attributes: [
+          { required: false, message: "请设置属性", trigger: "change" }
         ]
       }
     };
@@ -270,8 +316,9 @@ export default {
       this.form = {
         moduleIndex: null,
         category: null,
-        Attributes: null
+        attributes: null
       };
+      this.attrList = [];
       this.resetForm("form");
     },
     /** 搜索按钮操作 */
@@ -293,6 +340,8 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      // 新增时添加一个默认空行
+      this.addAttrRow();
       this.open = true;
       this.title = "添加员工配置表";
     },
@@ -302,6 +351,21 @@ export default {
       const confId = row.confId || this.ids
       getStuffInfoConf(confId).then(response => {
         this.form = response.data;
+        // 解析attributes JSON字符串为attrList
+        if (this.form.attributes) {
+          try {
+            this.attrList = JSON.parse(this.form.attributes);
+            // 确保是数组格式
+            if (!Array.isArray(this.attrList)) {
+              this.attrList = [];
+            }
+          } catch (e) {
+            console.error("解析attributes失败:", e);
+            this.attrList = [];
+          }
+        } else {
+          this.attrList = [];
+        }
         this.open = true;
         this.title = "修改员工配置表";
       });
@@ -370,14 +434,40 @@ export default {
       this.getList();
     },
     buildSubmitData() {
-      const data = { ...this.form };
-      if (data.confId !== null && data.confId !== undefined && data.confId !== "") {
-        data.confId = parseInt(data.confId, 10);
+      // 只保留实体类中定义的字段,过滤掉其他字段
+      const data = {};
+      // 只添加存在的字段,避免提交 undefined 或空字符串
+      if (this.form.moduleIndex !== undefined && this.form.moduleIndex !== null && this.form.moduleIndex !== "") {
+        data.moduleIndex = this.form.moduleIndex;
+      }
+      if (this.form.category !== undefined && this.form.category !== null && this.form.category !== "") {
+        data.category = this.form.category;
+      }
+      // 将attrList序列化为JSON字符串
+      if (this.attrList && this.attrList.length > 0) {
+        data.attributes = JSON.stringify(this.attrList);
       } else {
-        data.confId = null;
+        data.attributes = null;
+      }
+      // 如果是修改操作,需要包含 confId
+      if (this.form.confId !== null && this.form.confId !== undefined && this.form.confId !== "") {
+        data.confId = parseInt(this.form.confId, 10);
       }
       return data;
     },
+    // 添加属性行
+    addAttrRow() {
+      this.attrList.push({
+        attrName: "",
+        attr: "",
+        type: "字符串",
+        description: ""
+      });
+    },
+    // 删除属性行
+    removeAttrRow(index) {
+      this.attrList.splice(index, 1);
+    },
     // 提交上传文件
     submitFileForm() {
       this.$modal.loading("导入中请稍后")

+ 3 - 2
ruoyi_admin/config/app-dev.yml

@@ -3,7 +3,7 @@ flask:
   debug: false
   testing: true
   CORS_ORIGINS: '*'
-  SQLALCHEMY_DATABASE_URI: 'mysql+pymysql://root:123456@127.0.0.1:3307/alieny'
+  SQLALCHEMY_DATABASE_URI: 'mysql+pymysql://root:123456@127.0.0.1:3306/alieny'
 #  SQLALCHEMY_DATABASE_URI: 'mysql+pymysql://root:yy0908..@127.0.0.1:3307/yczj'
   SQLALCHEMY_TRACK_MODIFICATIONS: true
   SQLALCHEMY_ECHO: false
@@ -18,4 +18,5 @@ log:
   filesize: 100MB
   filenum: 10
   formatter:
-    fmt: '%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'
+    fmt: '%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s'
+

+ 98 - 0
ruoyi_admin/controller/system/sys_compo_conf.py

@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+
+from ruoyi_common.constant import UserConstants
+from ruoyi_common.base.model import AjaxResponse, TableResponse
+# from ruoyi_common.domain.entity import SysCompoConf
+from ruoyi_common.domain.entity import SysCompoConf
+from ruoyi_common.domain.enum import BusinessType
+from ruoyi_common.descriptor.serializer import JsonSerializer
+from ruoyi_common.descriptor.validator import BodyValidator, QueryValidator,PathValidator
+from ruoyi_common.utils import security_util as SecurityUtil
+from ruoyi_system.service.module_conf.compo_info_conf import SysModuleCompoinfoConfService
+from ruoyi_framework.descriptor.log import Log
+from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
+from ... import reg
+
+
+@reg.api.route("/system/moduleConf/compoConf/list", methods=["GET"])
+@QueryValidator(is_page=True)
+# @PreAuthorize(HasPerm("moduleConf:compoConf:list"))
+@JsonSerializer()
+def system_compoinfo_conf_list(dto:SysCompoConf):
+    '''
+        获取套餐配置列表
+    '''
+    rows = SysModuleCompoinfoConfService.select_compoinfo_conf_list(dto)
+    table_response = TableResponse(rows=rows)
+    return table_response
+
+
+
+@reg.api.route("/system/moduleConf/compoConf/<string:id>", methods=["GET"])
+@PathValidator()
+@PreAuthorize(HasPerm("moduleConf:compoConf:query"))
+@JsonSerializer()
+def module_compoinfo_conf(id:str):
+    '''
+        获取套餐配置详情
+    '''
+    # 注意:如果需要数据权限控制,需要实现 check_compoinfo_conf_data_scope 方法
+    # SysModuleCompoinfoConfService.check_compoinfo_conf_data_scope(id)
+    compoinfoConf = SysModuleCompoinfoConfService.select_compoinfo_conf_by_id(id)
+    ajax_response = AjaxResponse.from_success(data=compoinfoConf)
+    return ajax_response
+
+
+@reg.api.route("/system/moduleConf/compoConf", methods=["POST"])
+@BodyValidator()
+@PreAuthorize(HasPerm("moduleConf:compoConf:add"))
+@Log(title="套餐配置管理",business_type=BusinessType.INSERT)
+@JsonSerializer()
+def system_compoinfo_conf_create(dto:SysCompoConf):
+    '''
+        新增套餐配置
+    '''
+    # if UserConstants.NOT_UNIQUE == SysModuleCompoinfoConfService.check_compoinfo_conf_name_unique(dto):
+    #     ajax_response = AjaxResponse.from_error("套餐配置名称已存在")
+    #     return ajax_response
+    # 注意:SysCompoConf 不继承 AuditEntity,没有 create_by 等字段,所以不需要调用 create_by_user
+    SysModuleCompoinfoConfService.insert_conf(dto)
+    ajax_response = AjaxResponse.from_success()
+    return ajax_response
+
+
+@reg.api.route("/system/moduleConf/compoConf", methods=["PUT"])
+@BodyValidator()
+@PreAuthorize(HasPerm("moduleConf:compoConf:edit"))
+@Log(title="套餐配置管理",business_type=BusinessType.UPDATE)
+@JsonSerializer()
+def system_compoinfo_conf_update(dto:SysCompoConf):
+    '''
+        修改套餐配置
+    '''
+    # SysModuleCompoinfoConfService.check_compoinfo_conf_data_scope(dto.compoinfoConf_id)
+    # if UserConstants.UNIQUE != SysModuleCompoinfoConfService.check_compoinfo_conf_name_unique(dto):
+    #     return AjaxResponse.from_error("套餐配置名称已存在")
+    # 注意:SysCompoConf 不继承 AuditEntity,没有 update_by 等字段,所以不需要调用 update_by_user
+    flag = SysModuleCompoinfoConfService.update_conf(dto)
+    return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
+
+
+@reg.api.route("/system/moduleConf/compoConf/<string:id>", methods=["DELETE"])
+@PathValidator()
+@PreAuthorize(HasPerm("moduleConf:compoConf:remove"))
+@Log(title="套餐配置管理",business_type=BusinessType.DELETE)
+@JsonSerializer()
+def system_compoinfo_conf_delete(id:str):
+    '''
+        删除套餐配置
+    '''
+    # if SysModuleCompoinfoConfService.has_child_by_compoinfo_conf_id(id):
+    #     return AjaxResponse.from_error("该套餐配置存在下级套餐配置,不允许删除")
+    # if SysModuleCompoinfoConfService.check_compoinfo_conf_exist_user(id):
+    #     return AjaxResponse.from_error("该套餐配置存在用户,不允许删除")
+    # SysModuleCompoinfoConfService.check_compoinfo_conf_data_scope(id)
+    flag = SysModuleCompoinfoConfService.delete_compoinfo_conf_by_id(id)
+    return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
+

+ 98 - 0
ruoyi_admin/controller/system/sys_price_conf.py

@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+
+from ruoyi_common.constant import UserConstants
+from ruoyi_common.base.model import AjaxResponse, TableResponse
+# from ruoyi_common.domain.entity import SysPriceConf
+from ruoyi_common.domain.entity import SysPriceConf
+from ruoyi_common.domain.enum import BusinessType
+from ruoyi_common.descriptor.serializer import JsonSerializer
+from ruoyi_common.descriptor.validator import BodyValidator, QueryValidator,PathValidator
+from ruoyi_common.utils import security_util as SecurityUtil
+from ruoyi_system.service.module_conf.price_info_conf import SysModulePriceinfoConfService
+from ruoyi_framework.descriptor.log import Log
+from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
+from ... import reg
+
+
+@reg.api.route("/system/moduleConf/priceConf/list", methods=["GET"])
+@QueryValidator(is_page=True)
+# @PreAuthorize(HasPerm("moduleConf:priceConf:list"))
+@JsonSerializer()
+def system_priceinfo_conf_list(dto:SysPriceConf):
+    '''
+        获取价目配置列表
+    '''
+    rows = SysModulePriceinfoConfService.select_priceinfo_conf_list(dto)
+    table_response = TableResponse(rows=rows)
+    return table_response
+
+
+
+@reg.api.route("/system/moduleConf/priceConf/<int:id>", methods=["GET"])
+@PathValidator()
+@PreAuthorize(HasPerm("moduleConf:priceConf:query"))
+@JsonSerializer()
+def module_priceinfo_conf(id:int):
+    '''
+        获取价目配置详情
+    '''
+    # 注意:如果需要数据权限控制,需要实现 check_priceinfo_conf_data_scope 方法
+    # SysModulePriceinfoConfService.check_priceinfo_conf_data_scope(id)
+    priceinfoConf = SysModulePriceinfoConfService.select_priceinfo_conf_by_id(id)
+    ajax_response = AjaxResponse.from_success(data=priceinfoConf)
+    return ajax_response
+
+
+@reg.api.route("/system/moduleConf/priceConf", methods=["POST"])
+@BodyValidator()
+@PreAuthorize(HasPerm("moduleConf:priceConf:add"))
+@Log(title="价目配置管理",business_type=BusinessType.INSERT)
+@JsonSerializer()
+def system_priceinfo_conf_create(dto:SysPriceConf):
+    '''
+        新增价目配置
+    '''
+    # if UserConstants.NOT_UNIQUE == SysModulePriceinfoConfService.check_priceinfo_conf_name_unique(dto):
+    #     ajax_response = AjaxResponse.from_error("价目配置名称已存在")
+    #     return ajax_response
+    # 注意:SysPriceConf 不继承 AuditEntity,没有 create_by 等字段,所以不需要调用 create_by_user
+    SysModulePriceinfoConfService.insert_conf(dto)
+    ajax_response = AjaxResponse.from_success()
+    return ajax_response
+
+
+@reg.api.route("/system/moduleConf/priceConf", methods=["PUT"])
+@BodyValidator()
+@PreAuthorize(HasPerm("moduleConf:priceConf:edit"))
+@Log(title="价目配置管理",business_type=BusinessType.UPDATE)
+@JsonSerializer()
+def system_priceinfo_conf_update(dto:SysPriceConf):
+    '''
+        修改价目配置
+    '''
+    # SysModulePriceinfoConfService.check_priceinfo_conf_data_scope(dto.priceinfoConf_id)
+    # if UserConstants.UNIQUE != SysModulePriceinfoConfService.check_priceinfo_conf_name_unique(dto):
+    #     return AjaxResponse.from_error("价目配置名称已存在")
+    # 注意:SysPriceConf 不继承 AuditEntity,没有 update_by 等字段,所以不需要调用 update_by_user
+    flag = SysModulePriceinfoConfService.update_conf(dto)
+    return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
+
+
+@reg.api.route("/system/moduleConf/priceConf/<int:id>", methods=["DELETE"])
+@PathValidator()
+@PreAuthorize(HasPerm("moduleConf:priceConf:remove"))
+@Log(title="价目配置管理",business_type=BusinessType.DELETE)
+@JsonSerializer()
+def system_priceinfo_conf_delete(id:int):
+    '''
+        删除价目配置
+    '''
+    # if SysModulePriceinfoConfService.has_child_by_priceinfo_conf_id(id):
+    #     return AjaxResponse.from_error("该价目配置存在下级价目配置,不允许删除")
+    # if SysModulePriceinfoConfService.check_priceinfo_conf_exist_user(id):
+    #     return AjaxResponse.from_error("该价目配置存在用户,不允许删除")
+    # SysModulePriceinfoConfService.check_priceinfo_conf_data_scope(id)
+    flag = SysModulePriceinfoConfService.delete_priceinfo_conf_by_id(id)
+    return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
+

+ 98 - 0
ruoyi_admin/controller/system/sys_product_conf.py

@@ -0,0 +1,98 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+
+from ruoyi_common.constant import UserConstants
+from ruoyi_common.base.model import AjaxResponse, TableResponse
+# from ruoyi_common.domain.entity import SysProductConf
+from ruoyi_common.domain.entity import SysProductConf
+from ruoyi_common.domain.enum import BusinessType
+from ruoyi_common.descriptor.serializer import JsonSerializer
+from ruoyi_common.descriptor.validator import BodyValidator, QueryValidator,PathValidator
+from ruoyi_common.utils import security_util as SecurityUtil
+from ruoyi_system.service.module_conf.product_info_conf import SysModuleProductinfoConfService
+from ruoyi_framework.descriptor.log import Log
+from ruoyi_framework.descriptor.permission import HasPerm, PreAuthorize
+from ... import reg
+
+
+@reg.api.route("/system/moduleConf/productConf/list", methods=["GET"])
+@QueryValidator(is_page=True)
+# @PreAuthorize(HasPerm("moduleConf:productConf:list"))
+@JsonSerializer()
+def system_productinfo_conf_list(dto:SysProductConf):
+    '''
+        获取单品配置列表
+    '''
+    rows = SysModuleProductinfoConfService.select_productinfo_conf_list(dto)
+    table_response = TableResponse(rows=rows)
+    return table_response
+
+
+
+@reg.api.route("/system/moduleConf/productConf/<string:id>", methods=["GET"])
+@PathValidator()
+@PreAuthorize(HasPerm("moduleConf:productConf:query"))
+@JsonSerializer()
+def module_productinfo_conf(id:str):
+    '''
+        获取单品配置详情
+    '''
+    # 注意:如果需要数据权限控制,需要实现 check_productinfo_conf_data_scope 方法
+    # SysModuleProductinfoConfService.check_productinfo_conf_data_scope(id)
+    productinfoConf = SysModuleProductinfoConfService.select_productinfo_conf_by_id(id)
+    ajax_response = AjaxResponse.from_success(data=productinfoConf)
+    return ajax_response
+
+
+@reg.api.route("/system/moduleConf/productConf", methods=["POST"])
+@BodyValidator()
+@PreAuthorize(HasPerm("moduleConf:productConf:add"))
+@Log(title="单品配置管理",business_type=BusinessType.INSERT)
+@JsonSerializer()
+def system_productinfo_conf_create(dto:SysProductConf):
+    '''
+        新增单品配置
+    '''
+    # if UserConstants.NOT_UNIQUE == SysModuleProductinfoConfService.check_productinfo_conf_name_unique(dto):
+    #     ajax_response = AjaxResponse.from_error("单品配置名称已存在")
+    #     return ajax_response
+    # 注意:SysProductConf 不继承 AuditEntity,没有 create_by 等字段,所以不需要调用 create_by_user
+    SysModuleProductinfoConfService.insert_conf(dto)
+    ajax_response = AjaxResponse.from_success()
+    return ajax_response
+
+
+@reg.api.route("/system/moduleConf/productConf", methods=["PUT"])
+@BodyValidator()
+@PreAuthorize(HasPerm("moduleConf:productConf:edit"))
+@Log(title="单品配置管理",business_type=BusinessType.UPDATE)
+@JsonSerializer()
+def system_productinfo_conf_update(dto:SysProductConf):
+    '''
+        修改单品配置
+    '''
+    # SysModuleProductinfoConfService.check_productinfo_conf_data_scope(dto.productinfoConf_id)
+    # if UserConstants.UNIQUE != SysModuleProductinfoConfService.check_productinfo_conf_name_unique(dto):
+    #     return AjaxResponse.from_error("单品配置名称已存在")
+    # 注意:SysProductConf 不继承 AuditEntity,没有 update_by 等字段,所以不需要调用 update_by_user
+    flag = SysModuleProductinfoConfService.update_conf(dto)
+    return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
+
+
+@reg.api.route("/system/moduleConf/productConf/<string:id>", methods=["DELETE"])
+@PathValidator()
+@PreAuthorize(HasPerm("moduleConf:productConf:remove"))
+@Log(title="单品配置管理",business_type=BusinessType.DELETE)
+@JsonSerializer()
+def system_productinfo_conf_delete(id:str):
+    '''
+        删除单品配置
+    '''
+    # if SysModuleProductinfoConfService.has_child_by_productinfo_conf_id(id):
+    #     return AjaxResponse.from_error("该单品配置存在下级单品配置,不允许删除")
+    # if SysModuleProductinfoConfService.check_productinfo_conf_exist_user(id):
+    #     return AjaxResponse.from_error("该单品配置存在用户,不允许删除")
+    # SysModuleProductinfoConfService.check_productinfo_conf_data_scope(id)
+    flag = SysModuleProductinfoConfService.delete_productinfo_conf_by_id(id)
+    return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
+

+ 8 - 8
ruoyi_admin/controller/system/sys_stuff_info_conf.py

@@ -2,7 +2,7 @@
 # @Author  : YY
 
 from ruoyi_common.constant import UserConstants
-from ruoyi_common.base.model import AjaxResponse
+from ruoyi_common.base.model import AjaxResponse, TableResponse
 # from ruoyi_common.domain.entity import SysStuffInfoConf
 from ruoyi_common.domain.entity import SysStuffInfoConf
 from ruoyi_common.domain.enum import BusinessType
@@ -16,7 +16,7 @@ from ... import reg
 
 
 @reg.api.route("/system/moduleConf/stuffInfoConf/list", methods=["GET"])
-@QueryValidator()
+@QueryValidator(is_page=True)
 # @PreAuthorize(HasPerm("moduleConf:stuffInfoConf:list"))
 @JsonSerializer()
 def system_stuffinfo_conf_list(dto:SysStuffInfoConf):
@@ -24,9 +24,8 @@ def system_stuffinfo_conf_list(dto:SysStuffInfoConf):
         获取员工配置列表
     '''
     rows = SysModuleStuffinfoConfService.select_stuffinfo_conf_list(dto)
-    ajax_response = AjaxResponse.from_success(data=rows)
-    return ajax_response
-
+    table_response = TableResponse(rows=rows)
+    return table_response
 
 
 @reg.api.route("/system/moduleConf/stuffInfoConf/<int:id>", methods=["GET"])
@@ -37,7 +36,8 @@ def module_stuffinfo_conf(id:int):
     '''
         获取员工配置详情
     '''
-    SysModuleStuffinfoConfService.check_stuffinfo_conf_data_scope(id)
+    # 注意:如果需要数据权限控制,需要实现 check_stuffinfo_conf_data_scope 方法
+    # SysModuleStuffinfoConfService.check_stuffinfo_conf_data_scope(id)
     stuffinfoConf = SysModuleStuffinfoConfService.select_stuffinfo_conf_by_id(id)
     ajax_response = AjaxResponse.from_success(data=stuffinfoConf)
     return ajax_response
@@ -55,7 +55,7 @@ def system_stuffinfo_conf_create(dto:SysStuffInfoConf):
     # if UserConstants.NOT_UNIQUE == SysModuleStuffinfoConfService.check_stuffinfo_conf_name_unique(dto):
     #     ajax_response = AjaxResponse.from_error("员工配置名称已存在")
     #     return ajax_response
-    dto.create_by_user(SecurityUtil.get_username())
+    # 注意:SysStuffInfoConf 不继承 AuditEntity,没有 create_by 等字段,所以不需要调用 create_by_user
     SysModuleStuffinfoConfService.insert_conf(dto)
     ajax_response = AjaxResponse.from_success()
     return ajax_response
@@ -73,7 +73,7 @@ def system_stuffinfo_conf_update(dto:SysStuffInfoConf):
     # SysModuleStuffinfoConfService.check_stuffinfo_conf_data_scope(dto.stuffinfoConf_id)
     # if UserConstants.UNIQUE != SysModuleStuffinfoConfService.check_stuffinfo_conf_name_unique(dto):
     #     return AjaxResponse.from_error("员工配置名称已存在")
-    dto.update_by_user(SecurityUtil.get_username())
+    # 注意:SysStuffInfoConf 不继承 AuditEntity,没有 update_by 等字段,所以不需要调用 update_by_user
     flag = SysModuleStuffinfoConfService.update_conf(dto)
     return AjaxResponse.from_success() if flag else AjaxResponse.from_error()
 

+ 112 - 0
ruoyi_common/domain/entity.py

@@ -499,4 +499,116 @@ class SysPriceConf(BaseEntity):
         Field(default=None, description="属性列表"),
         VoField(query=True),
         ExcelField(name="属性列表")
+    ]
+
+
+# 单品配置表
+class SysProductConf(BaseEntity):
+    """
+    单品配置表对象
+    """
+    # conf_id
+    conf_id: Annotated[
+        Optional[str],
+        Field(default=None, description="conf_id"),
+        VoField(query=True),
+        ExcelField(name="conf_id")
+    ]
+    # 分类索引
+    module_index: Annotated[
+        Optional[str],
+        Field(default=None, description="分类索引"),
+        VoField(query=True),
+        ExcelField(name="分类索引")
+    ]
+    # 子类路径
+    category: Annotated[
+        Optional[str],
+        Field(default=None, description="子类路径"),
+        VoField(query=True),
+        ExcelField(name="子类路径")
+    ]
+    # 属性列表
+    attributes: Annotated[
+        Optional[str],
+        Field(default=None, description="属性列表"),
+        VoField(query=True),
+        ExcelField(name="属性列表")
+    ]
+    # 版本号
+    version: Annotated[
+        Optional[int],
+        Field(default=None, description="版本号"),
+        VoField(query=True),
+        ExcelField(name="版本号")
+    ]
+    # 删除标记
+    delete_flag: Annotated[
+        Optional[int],
+        Field(default=None, description="删除标记 0:未删除 1:删除"),
+        VoField(query=True),
+        ExcelField(name="删除标记")
+    ]
+    # 状态
+    status: Annotated[
+        Optional[int],
+        Field(default=None, description="状态 0:禁用, 1:启用"),
+        VoField(query=True),
+        ExcelField(name="状态")
+    ]
+
+
+# 套餐配置表
+class SysCompoConf(BaseEntity):
+    """
+    套餐配置表对象
+    """
+    # conf_id
+    conf_id: Annotated[
+        Optional[str],
+        Field(default=None, description="conf_id"),
+        VoField(query=True),
+        ExcelField(name="conf_id")
+    ]
+    # 分类索引
+    module_index: Annotated[
+        Optional[str],
+        Field(default=None, description="分类索引"),
+        VoField(query=True),
+        ExcelField(name="分类索引")
+    ]
+    # 子类路径
+    category: Annotated[
+        Optional[str],
+        Field(default=None, description="子类路径"),
+        VoField(query=True),
+        ExcelField(name="子类路径")
+    ]
+    # 属性列表
+    attributes: Annotated[
+        Optional[str],
+        Field(default=None, description="属性列表"),
+        VoField(query=True),
+        ExcelField(name="属性列表")
+    ]
+    # 版本号
+    version: Annotated[
+        Optional[int],
+        Field(default=None, description="版本号"),
+        VoField(query=True),
+        ExcelField(name="版本号")
+    ]
+    # 删除标记
+    delete_flag: Annotated[
+        Optional[int],
+        Field(default=None, description="删除标记 0:未删除 1:删除"),
+        VoField(query=True),
+        ExcelField(name="删除标记")
+    ]
+    # 状态
+    status: Annotated[
+        Optional[int],
+        Field(default=None, description="状态 0:禁用, 1:启用"),
+        VoField(query=True),
+        ExcelField(name="状态")
     ]

+ 102 - 0
ruoyi_system/domain/po.py

@@ -318,4 +318,106 @@ class SysPriceConfPo(db.Model):
         String,
         nullable=True,
         comment='属性列表'
+    )
+
+
+class SysProductConfPo(db.Model):
+    """
+    单品配置表PO对象
+    """
+    __tablename__ = 'sys_product_conf'
+    __table_args__ = {'comment': '单品配置表'}
+    conf_id: Mapped[str] = mapped_column(
+        'conf_id',
+        String(20),
+        primary_key=True,
+        nullable=False,
+        comment='conf_id'
+    )
+    module_index: Mapped[Optional[str]] = mapped_column(
+        'module_index',
+        String(4),
+        nullable=True,
+        comment='分类索引'
+    )
+    category: Mapped[Optional[str]] = mapped_column(
+        'category',
+        String(16),
+        nullable=False,
+        comment='子类路径'
+    )
+    attributes: Mapped[Optional[str]] = mapped_column(
+        'attributes',
+        String,
+        nullable=True,
+        comment='属性列表'
+    )
+    version: Mapped[Optional[int]] = mapped_column(
+        'version',
+        INTEGER,
+        nullable=True,
+        comment='版本号'
+    )
+    delete_flag: Mapped[Optional[int]] = mapped_column(
+        'delete_flag',
+        INTEGER,
+        nullable=True,
+        comment='删除标记 0:未删除 1:删除'
+    )
+    status: Mapped[Optional[int]] = mapped_column(
+        'status',
+        INTEGER,
+        nullable=True,
+        comment='状态 0:禁用, 1:启用'
+    )
+
+
+class SysCompoConfPo(db.Model):
+    """
+    套餐配置表PO对象
+    """
+    __tablename__ = 'sys_compo_conf'
+    __table_args__ = {'comment': '套餐配置表'}
+    conf_id: Mapped[str] = mapped_column(
+        'conf_id',
+        String(20),
+        primary_key=True,
+        nullable=False,
+        comment='conf_id'
+    )
+    module_index: Mapped[Optional[str]] = mapped_column(
+        'module_index',
+        String(4),
+        nullable=True,
+        comment='分类索引'
+    )
+    category: Mapped[Optional[str]] = mapped_column(
+        'category',
+        String(16),
+        nullable=False,
+        comment='子类路径'
+    )
+    attributes: Mapped[Optional[str]] = mapped_column(
+        'attributes',
+        String,
+        nullable=True,
+        comment='属性列表'
+    )
+    version: Mapped[Optional[int]] = mapped_column(
+        'version',
+        INTEGER,
+        nullable=True,
+        comment='版本号'
+    )
+    delete_flag: Mapped[Optional[int]] = mapped_column(
+        'delete_flag',
+        INTEGER,
+        nullable=True,
+        comment='删除标记 0:未删除 1:删除'
+    )
+    status: Mapped[Optional[int]] = mapped_column(
+        'status',
+        INTEGER,
+        nullable=True,
+        comment='状态 0:禁用, 1:启用'
     )

+ 175 - 0
ruoyi_system/mapper/sys_compo_conf_mapper.py

@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+# @FileName: sys_compo_conf_mapper.py
+# @Time    : 2025-12-22 04:49:51
+
+from typing import List
+from datetime import datetime
+
+from flask import g
+from sqlalchemy import select, update, delete, func
+
+from ruoyi_admin.ext import db
+from ruoyi_common.domain.entity import SysCompoConf
+from ruoyi_system.domain.po import SysCompoConfPo
+from ruoyi_common.utils.base import Seq
+
+
+class SysCompoInfoConfMapper:
+    """套餐配置表Mapper"""
+
+    @staticmethod
+    def select_compoinfo_conf_list(sys: SysCompoConf) -> List[SysCompoConf]:
+        """
+        查询套餐配置表列表
+
+        Args:
+            sys (sys_compo_info_conf): 套餐配置表对象
+
+        Returns:
+            List[sys_compo_info_conf]: 套餐配置表列表
+        """
+        try:
+            # 构建查询条件
+            stmt = select(SysCompoConfPo)
+
+
+            if sys.conf_id is not None:
+                stmt = stmt.where(SysCompoConfPo.conf_id == sys.conf_id)
+
+
+
+            if sys.module_index is not None:
+                stmt = stmt.where(SysCompoConfPo.module_index == sys.module_index)
+
+
+
+            if sys.category is not None:
+                stmt = stmt.where(SysCompoConfPo.category == sys.category)
+
+
+
+            if sys.attributes is not None:
+                stmt = stmt.where(SysCompoConfPo.attributes == sys.attributes)
+
+
+            if "criterian_meta" in g and g.criterian_meta.page:
+                g.criterian_meta.page.stmt = stmt
+
+            result = db.session.execute(stmt).scalars().all()
+            return [SysCompoConf.model_validate(item) for item in result] if result else []
+        except Exception as e:
+            print(f"查询套餐配置表列表出错: {e}")
+            return []
+
+
+    @staticmethod
+    def select_sys_compo_info_conf_by_id(conf_id: str) -> SysCompoConf:
+        """
+        根据ID查询套餐配置表
+
+        Args:
+            conf_id (str): conf_id
+
+        Returns:
+            sys_compo_info_conf: 套餐配置表对象
+        """
+        try:
+            result = db.session.get(SysCompoConfPo, conf_id)
+            return SysCompoConf.model_validate(result) if result else None
+        except Exception as e:
+            print(f"根据ID查询套餐配置表出错: {e}")
+            return None
+
+
+    @staticmethod
+    def insert_sys_compo_info_conf(sys: SysCompoConf) -> int:
+        """
+        新增套餐配置表
+
+        Args:
+            sys (sys_compo_info_conf): 套餐配置表对象
+
+        Returns:
+            int: 插入的记录数
+        """
+        try:
+            now = datetime.now()
+            new_po = SysCompoConfPo()
+            
+            # 如果 conf_id 为空,需要生成新的主键值(varchar类型,使用序列号生成)
+            if sys.conf_id is None or sys.conf_id == "":
+                # 使用序列号生成器生成字符串ID
+                new_po.conf_id = Seq.get_seq_id("common")
+            else:
+                new_po.conf_id = sys.conf_id
+            
+            new_po.module_index = sys.module_index
+            new_po.category = sys.category
+            new_po.attributes = sys.attributes
+            new_po.version = sys.version
+            new_po.delete_flag = sys.delete_flag
+            new_po.status = sys.status
+            db.session.add(new_po)
+            db.session.commit()
+            sys.conf_id = new_po.conf_id
+            return 1
+        except Exception as e:
+            db.session.rollback()
+            print(f"新增套餐配置表出错: {e}")
+            return 0
+
+
+    @staticmethod
+    def update_sys_compo_info_conf(sys: SysCompoConf) -> int:
+        """
+        修改套餐配置表
+
+        Args:
+            sys (sys_compo_info_conf): 套餐配置表对象
+
+        Returns:
+            int: 更新的记录数
+        """
+        try:
+
+            existing = db.session.get(SysCompoConfPo, sys.conf_id)
+            if not existing:
+                return 0
+            now = datetime.now()
+            # 主键不参与更新
+            existing.module_index = sys.module_index
+            existing.category = sys.category
+            existing.attributes = sys.attributes
+            existing.version = sys.version
+            existing.delete_flag = sys.delete_flag
+            existing.status = sys.status
+            db.session.commit()
+            return 1
+
+        except Exception as e:
+            db.session.rollback()
+            print(f"修改套餐配置表出错: {e}")
+            return 0
+
+    @staticmethod
+    def delete_sys_compo_info_conf_by_ids(ids: List[str]) -> int:
+        """
+        批量删除套餐配置表
+
+        Args:
+            ids (List[str]): ID列表
+
+        Returns:
+            int: 删除的记录数
+        """
+        try:
+            stmt = delete(SysCompoConfPo).where(SysCompoConfPo.conf_id.in_(ids))
+            result = db.session.execute(stmt)
+            db.session.commit()
+            return result.rowcount
+        except Exception as e:
+            db.session.rollback()
+            print(f"批量删除套餐配置表出错: {e}")
+            return 0
+

+ 171 - 0
ruoyi_system/mapper/sys_priceinfo_conf_mapper.py

@@ -0,0 +1,171 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+# @FileName: sys_price_info_conf_mapper.py
+# @Time    : 2025-12-22 04:49:51
+
+from typing import List
+from datetime import datetime
+
+from flask import g
+from sqlalchemy import select, update, delete, func
+
+from ruoyi_admin.ext import db
+from ruoyi_common.domain.entity import SysPriceConf
+from ruoyi_system.domain.po import SysPriceConfPo
+
+
+class SysPriceInfoConfMapper:
+    """价目配置表Mapper"""
+
+    @staticmethod
+    def select_priceinfo_conf_list(sys: SysPriceConf) -> List[SysPriceConf]:
+        """
+        查询价目配置表列表
+
+        Args:
+            sys (sys_price_info_conf): 价目配置表对象
+
+        Returns:
+            List[sys_price_info_conf]: 价目配置表列表
+        """
+        try:
+            # 构建查询条件
+            stmt = select(SysPriceConfPo)
+
+
+            if sys.conf_id is not None:
+                stmt = stmt.where(SysPriceConfPo.conf_id == sys.conf_id)
+
+
+
+            if sys.module_index is not None:
+                stmt = stmt.where(SysPriceConfPo.module_index == sys.module_index)
+
+
+
+            if sys.category is not None:
+                stmt = stmt.where(SysPriceConfPo.category == sys.category)
+
+
+
+            if sys.attributes is not None:
+                stmt = stmt.where(SysPriceConfPo.attributes == sys.attributes)
+
+
+            if "criterian_meta" in g and g.criterian_meta.page:
+                g.criterian_meta.page.stmt = stmt
+
+            result = db.session.execute(stmt).scalars().all()
+            return [SysPriceConf.model_validate(item) for item in result] if result else []
+        except Exception as e:
+            print(f"查询价目配置表列表出错: {e}")
+            return []
+
+
+    @staticmethod
+    def select_sys_price_info_conf_by_id(conf_id: int) -> SysPriceConf:
+        """
+        根据ID查询价目配置表
+
+        Args:
+            conf_id (int): conf_id
+
+        Returns:
+            sys_price_info_conf: 价目配置表对象
+        """
+        try:
+            result = db.session.get(SysPriceConfPo, conf_id)
+            return SysPriceConf.model_validate(result) if result else None
+        except Exception as e:
+            print(f"根据ID查询价目配置表出错: {e}")
+            return None
+
+
+    @staticmethod
+    def insert_sys_price_info_conf(sys: SysPriceConf) -> int:
+        """
+        新增价目配置表
+
+        Args:
+            sys (sys_price_info_conf): 价目配置表对象
+
+        Returns:
+            int: 插入的记录数
+        """
+        try:
+            now = datetime.now()
+            new_po = SysPriceConfPo()
+            
+            # 如果 conf_id 为空,需要生成新的主键值
+            if sys.conf_id is None:
+                # 查询当前最大 conf_id 值
+                max_id_stmt = select(func.max(SysPriceConfPo.conf_id))
+                max_id_result = db.session.execute(max_id_stmt).scalar()
+                # 如果表中没有数据,从1开始;否则最大值+1
+                new_po.conf_id = (max_id_result + 1) if max_id_result is not None else 1
+            else:
+                new_po.conf_id = sys.conf_id
+            
+            new_po.module_index = sys.module_index
+            new_po.category = sys.category
+            new_po.attributes = sys.attributes
+            db.session.add(new_po)
+            db.session.commit()
+            sys.conf_id = new_po.conf_id
+            return 1
+        except Exception as e:
+            db.session.rollback()
+            print(f"新增价目配置表出错: {e}")
+            return 0
+
+
+    @staticmethod
+    def update_sys_price_info_conf(sys: SysPriceConf) -> int:
+        """
+        修改价目配置表
+
+        Args:
+            sys (sys_price_info_conf): 价目配置表对象
+
+        Returns:
+            int: 更新的记录数
+        """
+        try:
+
+            existing = db.session.get(SysPriceConfPo, sys.conf_id)
+            if not existing:
+                return 0
+            now = datetime.now()
+            # 主键不参与更新
+            existing.module_index = sys.module_index
+            existing.category = sys.category
+            existing.attributes = sys.attributes
+            db.session.commit()
+            return 1
+
+        except Exception as e:
+            db.session.rollback()
+            print(f"修改价目配置表出错: {e}")
+            return 0
+
+    @staticmethod
+    def delete_sys_price_info_conf_by_ids(ids: List[int]) -> int:
+        """
+        批量删除价目配置表
+
+        Args:
+            ids (List[int]): ID列表
+
+        Returns:
+            int: 删除的记录数
+        """
+        try:
+            stmt = delete(SysPriceConfPo).where(SysPriceConfPo.conf_id.in_(ids))
+            result = db.session.execute(stmt)
+            db.session.commit()
+            return result.rowcount
+        except Exception as e:
+            db.session.rollback()
+            print(f"批量删除价目配置表出错: {e}")
+            return 0
+

+ 175 - 0
ruoyi_system/mapper/sys_productinfo_conf_mapper.py

@@ -0,0 +1,175 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+# @FileName: sys_product_info_conf_mapper.py
+# @Time    : 2025-12-22 04:49:51
+
+from typing import List
+from datetime import datetime
+
+from flask import g
+from sqlalchemy import select, update, delete, func
+
+from ruoyi_admin.ext import db
+from ruoyi_common.domain.entity import SysProductConf
+from ruoyi_system.domain.po import SysProductConfPo
+from ruoyi_common.utils.base import Seq
+
+
+class SysProductInfoConfMapper:
+    """单品配置表Mapper"""
+
+    @staticmethod
+    def select_productinfo_conf_list(sys: SysProductConf) -> List[SysProductConf]:
+        """
+        查询单品配置表列表
+
+        Args:
+            sys (sys_product_info_conf): 单品配置表对象
+
+        Returns:
+            List[sys_product_info_conf]: 单品配置表列表
+        """
+        try:
+            # 构建查询条件
+            stmt = select(SysProductConfPo)
+
+
+            if sys.conf_id is not None:
+                stmt = stmt.where(SysProductConfPo.conf_id == sys.conf_id)
+
+
+
+            if sys.module_index is not None:
+                stmt = stmt.where(SysProductConfPo.module_index == sys.module_index)
+
+
+
+            if sys.category is not None:
+                stmt = stmt.where(SysProductConfPo.category == sys.category)
+
+
+
+            if sys.attributes is not None:
+                stmt = stmt.where(SysProductConfPo.attributes == sys.attributes)
+
+
+            if "criterian_meta" in g and g.criterian_meta.page:
+                g.criterian_meta.page.stmt = stmt
+
+            result = db.session.execute(stmt).scalars().all()
+            return [SysProductConf.model_validate(item) for item in result] if result else []
+        except Exception as e:
+            print(f"查询单品配置表列表出错: {e}")
+            return []
+
+
+    @staticmethod
+    def select_sys_product_info_conf_by_id(conf_id: str) -> SysProductConf:
+        """
+        根据ID查询单品配置表
+
+        Args:
+            conf_id (str): conf_id
+
+        Returns:
+            sys_product_info_conf: 单品配置表对象
+        """
+        try:
+            result = db.session.get(SysProductConfPo, conf_id)
+            return SysProductConf.model_validate(result) if result else None
+        except Exception as e:
+            print(f"根据ID查询单品配置表出错: {e}")
+            return None
+
+
+    @staticmethod
+    def insert_sys_product_info_conf(sys: SysProductConf) -> int:
+        """
+        新增单品配置表
+
+        Args:
+            sys (sys_product_info_conf): 单品配置表对象
+
+        Returns:
+            int: 插入的记录数
+        """
+        try:
+            now = datetime.now()
+            new_po = SysProductConfPo()
+            
+            # 如果 conf_id 为空,需要生成新的主键值(varchar类型,使用序列号生成)
+            if sys.conf_id is None or sys.conf_id == "":
+                # 使用序列号生成器生成字符串ID
+                new_po.conf_id = Seq.get_seq_id("common")
+            else:
+                new_po.conf_id = sys.conf_id
+            
+            new_po.module_index = sys.module_index
+            new_po.category = sys.category
+            new_po.attributes = sys.attributes
+            new_po.version = sys.version
+            new_po.delete_flag = sys.delete_flag
+            new_po.status = sys.status
+            db.session.add(new_po)
+            db.session.commit()
+            sys.conf_id = new_po.conf_id
+            return 1
+        except Exception as e:
+            db.session.rollback()
+            print(f"新增单品配置表出错: {e}")
+            return 0
+
+
+    @staticmethod
+    def update_sys_product_info_conf(sys: SysProductConf) -> int:
+        """
+        修改单品配置表
+
+        Args:
+            sys (sys_product_info_conf): 单品配置表对象
+
+        Returns:
+            int: 更新的记录数
+        """
+        try:
+
+            existing = db.session.get(SysProductConfPo, sys.conf_id)
+            if not existing:
+                return 0
+            now = datetime.now()
+            # 主键不参与更新
+            existing.module_index = sys.module_index
+            existing.category = sys.category
+            existing.attributes = sys.attributes
+            existing.version = sys.version
+            existing.delete_flag = sys.delete_flag
+            existing.status = sys.status
+            db.session.commit()
+            return 1
+
+        except Exception as e:
+            db.session.rollback()
+            print(f"修改单品配置表出错: {e}")
+            return 0
+
+    @staticmethod
+    def delete_sys_product_info_conf_by_ids(ids: List[str]) -> int:
+        """
+        批量删除单品配置表
+
+        Args:
+            ids (List[str]): ID列表
+
+        Returns:
+            int: 删除的记录数
+        """
+        try:
+            stmt = delete(SysProductConfPo).where(SysProductConfPo.conf_id.in_(ids))
+            result = db.session.execute(stmt)
+            db.session.commit()
+            return result.rowcount
+        except Exception as e:
+            db.session.rollback()
+            print(f"批量删除单品配置表出错: {e}")
+            return 0
+

+ 12 - 2
ruoyi_system/mapper/sys_stuffinfo_conf_mapper.py

@@ -7,7 +7,7 @@ from typing import List
 from datetime import datetime
 
 from flask import g
-from sqlalchemy import select, update, delete
+from sqlalchemy import select, update, delete, func
 
 from ruoyi_admin.ext import db
 from ruoyi_common.domain.entity import SysStuffInfoConf
@@ -95,7 +95,17 @@ class SysStuffInfoConfMapper:
         try:
             now = datetime.now()
             new_po = SysStuffInfoConfPo()
-            new_po.conf_id = sys.conf_id
+            
+            # 如果 conf_id 为空,需要生成新的主键值
+            if sys.conf_id is None:
+                # 查询当前最大 conf_id 值
+                max_id_stmt = select(func.max(SysStuffInfoConfPo.conf_id))
+                max_id_result = db.session.execute(max_id_stmt).scalar()
+                # 如果表中没有数据,从1开始;否则最大值+1
+                new_po.conf_id = (max_id_result + 1) if max_id_result is not None else 1
+            else:
+                new_po.conf_id = sys.conf_id
+            
             new_po.module_index = sys.module_index
             new_po.category = sys.category
             new_po.attributes = sys.attributes

+ 89 - 0
ruoyi_system/service/module_conf/compo_info_conf.py

@@ -0,0 +1,89 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+
+from types import NoneType
+from typing import List
+
+from ruoyi_admin.ext import db
+from ruoyi_common.domain.entity import SysCompoConf
+from ruoyi_common.sqlalchemy.transaction import Transactional
+from ruoyi_system.mapper.sys_compo_conf_mapper import SysCompoInfoConfMapper
+
+
+class SysModuleCompoinfoConfService:
+
+    @classmethod
+    def select_compoinfo_conf_list(cls, dept:SysCompoConf) -> List[SysCompoConf]:
+        """
+        查询套餐配置列表
+
+        Args:
+            dept (SysCompoConf): 包含查询条件的传输对象
+
+        Returns:
+            List[SysCompoConf]: 套餐配置列表
+        """
+        return SysCompoInfoConfMapper.select_compoinfo_conf_list(dept or SysCompoConf())
+
+    @classmethod
+    def select_compoinfo_conf_by_id(cls, dept_id:str) -> SysCompoConf|NoneType:
+        """
+        根据套餐配置ID,查询套餐配置信息
+
+        Args:
+            dept_id (str): 套餐配置ID
+
+        Returns:
+            SysCompoConf|NoneType: 套餐配置信息
+        """
+        return SysCompoInfoConfMapper.select_sys_compo_info_conf_by_id(dept_id)
+
+
+
+
+    @classmethod
+    def insert_conf(cls, conf:SysCompoConf) -> int:
+        """
+        新增套餐配置信息
+
+        Args:
+            conf (SysCompoConf): 套餐配置信息
+
+        Returns:
+            int: 套餐配置ID
+        """
+        return SysCompoInfoConfMapper.insert_sys_compo_info_conf(conf)
+
+    @classmethod
+    @Transactional(db.session)
+    def update_conf(cls, dept:SysCompoConf) -> int:
+        """
+        修改套餐配置信息
+
+        Args:
+            dept (SysCompoConf): 套餐配置信息
+
+        Returns:
+            int: 数量
+        """
+        num = SysCompoInfoConfMapper.update_sys_compo_info_conf(dept)
+        return num
+
+    @classmethod
+    def delete_compoinfo_conf_by_id(cls, dept_id) -> int:
+        """
+        删除套餐配置管理信息
+
+        Args:
+            dept_id (str): 套餐配置ID
+
+        Returns:
+            int: 数量
+        """
+        # 将单个ID转换为列表
+        if isinstance(dept_id, (list, tuple)):
+            ids = list(dept_id)
+        else:
+            ids = [dept_id]
+        return SysCompoInfoConfMapper.delete_sys_compo_info_conf_by_ids(ids)
+

+ 92 - 0
ruoyi_system/service/module_conf/price_info_conf.py

@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+
+from types import NoneType
+from typing import List
+
+# from ruoyi_common.domain.entity import SysPriceConf,  TreeSelect
+# from ruoyi_system.mapper import SysPriceInfoConfMapper
+# from ruoyi_system.mapper import SysPriceInfoConfMapper, SysRoleMapper
+from ruoyi_admin.ext import db
+from ruoyi_common.domain.entity import SysPriceConf
+from ruoyi_common.sqlalchemy.transaction import Transactional
+from ruoyi_system.mapper.sys_priceinfo_conf_mapper import SysPriceInfoConfMapper
+
+
+class SysModulePriceinfoConfService:
+
+    @classmethod
+    def select_priceinfo_conf_list(cls, dept:SysPriceConf) -> List[SysPriceConf]:
+        """
+        查询价目配置列表
+
+        Args:
+            dept (SysPriceConf): 包含查询条件的传输对象
+
+        Returns:
+            List[SysPriceConf]: 价目配置列表
+        """
+        return SysPriceInfoConfMapper.select_priceinfo_conf_list(dept or SysPriceConf())
+
+    @classmethod
+    def select_priceinfo_conf_by_id(cls, dept_id:int) -> SysPriceConf|NoneType:
+        """
+        根据价目配置ID,查询价目配置信息
+
+        Args:
+            dept_id (int): 价目配置ID
+
+        Returns:
+            SysPriceConf|NoneType: 价目配置信息
+        """
+        return SysPriceInfoConfMapper.select_sys_price_info_conf_by_id(dept_id)
+
+
+
+
+    @classmethod
+    def insert_conf(cls, conf:SysPriceConf) -> int:
+        """
+        新增价目配置信息
+
+        Args:
+            conf (SysPriceConf): 价目配置信息
+
+        Returns:
+            int: 价目配置ID
+        """
+        return SysPriceInfoConfMapper.insert_sys_price_info_conf(conf)
+
+    @classmethod
+    @Transactional(db.session)
+    def update_conf(cls, dept:SysPriceConf) -> int:
+        """
+        修改价目配置信息
+
+        Args:
+            dept (SysPriceConf): 价目配置信息
+
+        Returns:
+            int: 数量
+        """
+        num = SysPriceInfoConfMapper.update_sys_price_info_conf(dept)
+        return num
+
+    @classmethod
+    def delete_priceinfo_conf_by_id(cls, dept_id) -> int:
+        """
+        删除价目配置管理信息
+
+        Args:
+            dept_id (int): 价目配置ID
+
+        Returns:
+            int: 数量
+        """
+        # 将单个ID转换为列表
+        if isinstance(dept_id, (list, tuple)):
+            ids = list(dept_id)
+        else:
+            ids = [dept_id]
+        return SysPriceInfoConfMapper.delete_sys_price_info_conf_by_ids(ids)
+

+ 92 - 0
ruoyi_system/service/module_conf/product_info_conf.py

@@ -0,0 +1,92 @@
+# -*- coding: utf-8 -*-
+# @Author  : YY
+
+from types import NoneType
+from typing import List
+
+# from ruoyi_common.domain.entity import SysProductConf,  TreeSelect
+# from ruoyi_system.mapper import SysProductInfoConfMapper
+# from ruoyi_system.mapper import SysProductInfoConfMapper, SysRoleMapper
+from ruoyi_admin.ext import db
+from ruoyi_common.domain.entity import SysProductConf
+from ruoyi_common.sqlalchemy.transaction import Transactional
+from ruoyi_system.mapper.sys_productinfo_conf_mapper import SysProductInfoConfMapper
+
+
+class SysModuleProductinfoConfService:
+
+    @classmethod
+    def select_productinfo_conf_list(cls, dept:SysProductConf) -> List[SysProductConf]:
+        """
+        查询单品配置列表
+
+        Args:
+            dept (SysProductConf): 包含查询条件的传输对象
+
+        Returns:
+            List[SysProductConf]: 单品配置列表
+        """
+        return SysProductInfoConfMapper.select_productinfo_conf_list(dept or SysProductConf())
+
+    @classmethod
+    def select_productinfo_conf_by_id(cls, dept_id:str) -> SysProductConf|NoneType:
+        """
+        根据单品配置ID,查询单品配置信息
+
+        Args:
+            dept_id (str): 单品配置ID
+
+        Returns:
+            SysProductConf|NoneType: 单品配置信息
+        """
+        return SysProductInfoConfMapper.select_sys_product_info_conf_by_id(dept_id)
+
+
+
+
+    @classmethod
+    def insert_conf(cls, conf:SysProductConf) -> int:
+        """
+        新增单品配置信息
+
+        Args:
+            conf (SysProductConf): 单品配置信息
+
+        Returns:
+            int: 单品配置ID
+        """
+        return SysProductInfoConfMapper.insert_sys_product_info_conf(conf)
+
+    @classmethod
+    @Transactional(db.session)
+    def update_conf(cls, dept:SysProductConf) -> int:
+        """
+        修改单品配置信息
+
+        Args:
+            dept (SysProductConf): 单品配置信息
+
+        Returns:
+            int: 数量
+        """
+        num = SysProductInfoConfMapper.update_sys_product_info_conf(dept)
+        return num
+
+    @classmethod
+    def delete_productinfo_conf_by_id(cls, dept_id) -> int:
+        """
+        删除单品配置管理信息
+
+        Args:
+            dept_id (str): 单品配置ID
+
+        Returns:
+            int: 数量
+        """
+        # 将单个ID转换为列表
+        if isinstance(dept_id, (list, tuple)):
+            ids = list(dept_id)
+        else:
+            ids = [dept_id]
+        return SysProductInfoConfMapper.delete_sys_product_info_conf_by_ids(ids)
+

+ 9 - 4
ruoyi_system/service/module_conf/stuff_info_conf.py

@@ -39,7 +39,7 @@ class SysModuleStuffinfoConfService:
         Returns:
             SysStuffInfoConf|NoneType: 员工配置信息
         """
-        return SysStuffInfoConfMapper.select_stuffinfo_conf_by_id(dept_id)
+        return SysStuffInfoConfMapper.select_sys_stuff_info_conf_by_id(dept_id)
 
 
 
@@ -55,7 +55,7 @@ class SysModuleStuffinfoConfService:
         Returns:
             int: 员工配置ID
         """
-        return SysStuffInfoConfMapper.insert_dept(conf)
+        return SysStuffInfoConfMapper.insert_sys_stuff_info_conf(conf)
 
     @classmethod
     @Transactional(db.session)
@@ -69,7 +69,7 @@ class SysModuleStuffinfoConfService:
         Returns:
             int: 数量
         """
-        num = SysStuffInfoConfMapper.update_dept(dept)
+        num = SysStuffInfoConfMapper.update_sys_stuff_info_conf(dept)
         return num
 
     @classmethod
@@ -83,5 +83,10 @@ class SysModuleStuffinfoConfService:
         Returns:
             int: 数量
         """
-        return SysStuffInfoConfMapper.delete_stuffinfo_conf_by_id(dept_id)
+        # 将单个ID转换为列表
+        if isinstance(dept_id, (list, tuple)):
+            ids = list(dept_id)
+        else:
+            ids = [dept_id]
+        return SysStuffInfoConfMapper.delete_sys_stuff_info_conf_by_ids(ids)
 

+ 918 - 0
sql/alieny.sql

@@ -0,0 +1,918 @@
+/*
+ Navicat Premium Dump SQL
+
+ Source Server         : 本机
+ Source Server Type    : MySQL
+ Source Server Version : 80043 (8.0.43)
+ Source Host           : localhost:3306
+ Source Schema         : alieny
+
+ Target Server Type    : MySQL
+ Target Server Version : 80043 (8.0.43)
+ File Encoding         : 65001
+
+ Date: 24/12/2025 15:46:40
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for gen_table
+-- ----------------------------
+DROP TABLE IF EXISTS `gen_table`;
+CREATE TABLE `gen_table`  (
+  `table_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
+  `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '表名称',
+  `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '表描述',
+  `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '关联子表的表名',
+  `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '子表关联的外键名',
+  `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '实体类名称',
+  `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'crud' COMMENT '使用的模板',
+  `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成包路径',
+  `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成模块名',
+  `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成业务名',
+  `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成功能名',
+  `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '生成功能作者',
+  `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)',
+  `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)',
+  `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '其它生成选项',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`table_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 84 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '代码生成业务表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of gen_table
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for gen_table_column
+-- ----------------------------
+DROP TABLE IF EXISTS `gen_table_column`;
+CREATE TABLE `gen_table_column`  (
+  `column_id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
+  `table_id` bigint NULL DEFAULT NULL COMMENT '归属表编号',
+  `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列名称',
+  `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列描述',
+  `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '列类型',
+  `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JAVA类型',
+  `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'JAVA字段名',
+  `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否主键(1是)',
+  `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否自增(1是)',
+  `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否必填(1是)',
+  `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否为插入字段(1是)',
+  `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否编辑字段(1是)',
+  `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否列表字段(1是)',
+  `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '是否查询字段(1是)',
+  `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)',
+  `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+  `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型',
+  `sort` int NULL DEFAULT NULL COMMENT '排序',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`column_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1219 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '代码生成业务表字段' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of gen_table_column
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_compo_conf
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_compo_conf`;
+CREATE TABLE `sys_compo_conf`  (
+  `conf_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+  `module_index` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分类索引',
+  `category` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '子类路径',
+  `attributes` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '属性列表',
+  `version` int NULL DEFAULT NULL COMMENT '版本号',
+  `delete_flag` int NULL DEFAULT NULL COMMENT '删除标记 0:未删除 1:删除',
+  `status` int NULL DEFAULT NULL COMMENT '状态 0:禁用, 1:启用',
+  PRIMARY KEY (`conf_id`) USING BTREE,
+  UNIQUE INDEX `sys_stuff_info_conf_unique`(`category` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '套餐配置表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_compo_conf
+-- ----------------------------
+INSERT INTO `sys_compo_conf` VALUES ('20251224153816A002', '01', '01165165', '[{\"attrName\":\"56353\",\"attr\":\"563563\",\"type\":\"字符串\",\"description\":\"563563\"}]', 0, 0, 1);
+INSERT INTO `sys_compo_conf` VALUES ('20251224154123A003', '01', '452345254', '[{\"attrName\":\"014532\",\"attr\":\"452452\",\"type\":\"datatime\",\"description\":\"452452\"}]', 1, 1, 1);
+
+-- ----------------------------
+-- Table structure for sys_config
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_config`;
+CREATE TABLE `sys_config`  (
+  `config_id` int NOT NULL AUTO_INCREMENT COMMENT '参数主键',
+  `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数名称',
+  `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数键名',
+  `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '参数键值',
+  `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`config_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 102 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '参数配置表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_config
+-- ----------------------------
+INSERT INTO `sys_config` VALUES (1, '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 'admin', '2025-10-22 23:23:11', 'admin', '2025-11-18 16:15:20', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow');
+INSERT INTO `sys_config` VALUES (2, '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 'admin', '2025-10-22 23:23:11', 'admin', '2025-11-18 16:14:08', '321');
+INSERT INTO `sys_config` VALUES (3, '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 'admin', '2025-10-22 23:23:11', '', NULL, '深色主题theme-dark,浅色主题theme-light');
+INSERT INTO `sys_config` VALUES (4, '账号自助-验证码开关', 'sys.account.captchaOnOff', 'false', 'Y', 'admin', '2025-10-22 23:23:11', 'admin', '2025-11-20 18:17:08', '是否开启验证码功能(true开启,false关闭)');
+INSERT INTO `sys_config` VALUES (5, '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 'admin', '2025-10-22 23:23:11', '', NULL, '是否开启注册用户功能(true开启,false关闭)');
+INSERT INTO `sys_config` VALUES (6, '用户登录-黑名单列表', 'sys.login.blackIPList', '', 'Y', 'admin', '2025-10-22 23:23:11', '', NULL, '设置登录IP黑名单限制,多个匹配项以;分隔,支持匹配(*通配、网段)');
+
+-- ----------------------------
+-- Table structure for sys_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dept`;
+CREATE TABLE `sys_dept`  (
+  `dept_id` bigint NOT NULL AUTO_INCREMENT COMMENT '部门id',
+  `parent_id` bigint NULL DEFAULT 0 COMMENT '父部门id',
+  `ancestors` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '祖级列表',
+  `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部门名称',
+  `order_num` int NULL DEFAULT 0 COMMENT '显示顺序',
+  `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '负责人',
+  `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系电话',
+  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邮箱',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  PRIMARY KEY (`dept_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 201 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '部门表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_dept
+-- ----------------------------
+INSERT INTO `sys_dept` VALUES (100, 0, '0', '若依科技', 0, '若依11', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (103, 101, '0,100,101', '研发部门', 1, '若依1', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-10-22 23:22:58', '', NULL);
+INSERT INTO `sys_dept` VALUES (200, 101, '0,100,101', '111', 1, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-11 17:33:21', '', NULL);
+
+-- ----------------------------
+-- Table structure for sys_dict_data
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dict_data`;
+CREATE TABLE `sys_dict_data`  (
+  `dict_code` bigint NOT NULL AUTO_INCREMENT COMMENT '字典编码',
+  `dict_sort` int NULL DEFAULT 0 COMMENT '字典排序',
+  `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典标签',
+  `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典键值',
+  `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型',
+  `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)',
+  `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '表格回显样式',
+  `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`dict_code`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典数据表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_dict_data
+-- ----------------------------
+INSERT INTO `sys_dict_data` VALUES (1, 0, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2025-10-22 23:23:09', 'admin', '2025-11-21 15:20:57', '1');
+INSERT INTO `sys_dict_data` VALUES (2, 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '性别女');
+INSERT INTO `sys_dict_data` VALUES (3, 0, '未知', '2', 'sys_user_sex', '', 'primary', 'N', '0', 'admin', '2025-10-22 23:23:09', 'admin', '2025-11-21 15:21:07', '性别未知');
+INSERT INTO `sys_dict_data` VALUES (4, 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '显示菜单');
+INSERT INTO `sys_dict_data` VALUES (5, 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '隐藏菜单');
+INSERT INTO `sys_dict_data` VALUES (6, 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '停用状态');
+INSERT INTO `sys_dict_data` VALUES (8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '停用状态');
+INSERT INTO `sys_dict_data` VALUES (10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '默认分组');
+INSERT INTO `sys_dict_data` VALUES (11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '系统分组');
+INSERT INTO `sys_dict_data` VALUES (12, 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '系统默认是');
+INSERT INTO `sys_dict_data` VALUES (13, 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '系统默认否');
+INSERT INTO `sys_dict_data` VALUES (14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '通知');
+INSERT INTO `sys_dict_data` VALUES (15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '公告');
+INSERT INTO `sys_dict_data` VALUES (16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '关闭状态');
+INSERT INTO `sys_dict_data` VALUES (18, 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '其他操作');
+INSERT INTO `sys_dict_data` VALUES (19, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '新增操作');
+INSERT INTO `sys_dict_data` VALUES (20, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '修改操作');
+INSERT INTO `sys_dict_data` VALUES (21, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '删除操作');
+INSERT INTO `sys_dict_data` VALUES (22, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '授权操作');
+INSERT INTO `sys_dict_data` VALUES (23, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '导出操作');
+INSERT INTO `sys_dict_data` VALUES (24, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '导入操作');
+INSERT INTO `sys_dict_data` VALUES (25, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '强退操作');
+INSERT INTO `sys_dict_data` VALUES (26, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '生成操作');
+INSERT INTO `sys_dict_data` VALUES (27, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '清空操作');
+INSERT INTO `sys_dict_data` VALUES (28, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (29, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2025-10-22 23:23:10', '', NULL, '停用状态');
+
+-- ----------------------------
+-- Table structure for sys_dict_type
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dict_type`;
+CREATE TABLE `sys_dict_type`  (
+  `dict_id` bigint NOT NULL AUTO_INCREMENT COMMENT '字典主键',
+  `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典名称',
+  `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '字典类型',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`dict_id`) USING BTREE,
+  UNIQUE INDEX `dict_type`(`dict_type` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 100 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '字典类型表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_dict_type
+-- ----------------------------
+INSERT INTO `sys_dict_type` VALUES (1, '用户性别', 'sys_user_sex', '0', 'admin', '2025-10-22 23:23:09', 'admin', '2025-11-21 16:12:33', '性别');
+INSERT INTO `sys_dict_type` VALUES (2, '菜单状态', 'sys_show_hide', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '菜单状态列表');
+INSERT INTO `sys_dict_type` VALUES (3, '系统开关', 'sys_normal_disable', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '系统开关列表');
+INSERT INTO `sys_dict_type` VALUES (4, '任务状态', 'sys_job_status', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '任务状态列表');
+INSERT INTO `sys_dict_type` VALUES (5, '任务分组', 'sys_job_group', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '任务分组列表');
+INSERT INTO `sys_dict_type` VALUES (6, '系统是否', 'sys_yes_no', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '系统是否列表');
+INSERT INTO `sys_dict_type` VALUES (7, '通知类型', 'sys_notice_type', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '通知类型列表');
+INSERT INTO `sys_dict_type` VALUES (8, '通知状态', 'sys_notice_status', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '通知状态列表');
+INSERT INTO `sys_dict_type` VALUES (9, '操作类型', 'sys_oper_type', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '操作类型列表');
+INSERT INTO `sys_dict_type` VALUES (10, '系统状态', 'sys_common_status', '0', 'admin', '2025-10-22 23:23:09', '', NULL, '登录状态列表');
+
+-- ----------------------------
+-- Table structure for sys_job
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_job`;
+CREATE TABLE `sys_job`  (
+  `job_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID',
+  `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '任务名称',
+  `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT 'DEFAULT' COMMENT '任务组名',
+  `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调用目标字符串',
+  `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT 'cron执行表达式',
+  `misfire_policy` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '3' COMMENT '计划执行错误策略(1立即执行 2执行一次 3放弃执行)',
+  `concurrent` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '是否并发执行(0允许 1禁止)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '状态(0正常 1暂停)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注信息',
+  PRIMARY KEY (`job_id`, `job_name`, `job_group`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 102 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '定时任务调度表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_job
+-- ----------------------------
+INSERT INTO `sys_job` VALUES (1, '系统默认(无参)', 'DEFAULT', 'ruoyi_apscheduler.task.ruoyi_task.no_args()', '0/1 * * * * ?', '3', '1', '1', 'admin', '2025-10-22 23:23:12', 'admin', '2025-11-20 18:40:50', '');
+INSERT INTO `sys_job` VALUES (2, '系统默认(有参)', 'DEFAULT', 'ruoyi_apscheduler.task.ruoyi_task.one_args(\'1\')', '0/15 * * * * ?', '3', '1', '1', 'admin', '2025-10-22 23:23:12', '', NULL, '');
+INSERT INTO `sys_job` VALUES (3, '系统默认(多参)', 'DEFAULT', 'ruoyi_apscheduler.task.ruoyi_task.multiply_args(\'1\',\'2\')', '0/20 * * * * ?', '3', '1', '1', 'admin', '2025-10-22 23:23:12', '', NULL, '');
+
+-- ----------------------------
+-- Table structure for sys_job_log
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_job_log`;
+CREATE TABLE `sys_job_log`  (
+  `job_log_id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务日志ID',
+  `job_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务名称',
+  `job_group` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '任务组名',
+  `invoke_target` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '调用目标字符串',
+  `job_message` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '日志信息',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '执行状态(0正常 1失败)',
+  `exception_info` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '异常信息',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  PRIMARY KEY (`job_log_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 255 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '定时任务调度日志表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_job_log
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_logininfor
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_logininfor`;
+CREATE TABLE `sys_logininfor`  (
+  `info_id` bigint NOT NULL AUTO_INCREMENT COMMENT '访问ID',
+  `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '用户账号',
+  `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录IP地址',
+  `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '登录地点',
+  `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '浏览器类型',
+  `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作系统',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)',
+  `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '提示消息',
+  `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间',
+  PRIMARY KEY (`info_id`) USING BTREE,
+  INDEX `idx_sys_logininfor_s`(`status` ASC) USING BTREE,
+  INDEX `idx_sys_logininfor_lt`(`login_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 224 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '系统访问记录' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_logininfor
+-- ----------------------------
+INSERT INTO `sys_logininfor` VALUES (209, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-22 17:54:16');
+INSERT INTO `sys_logininfor` VALUES (210, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-22 18:20:10');
+INSERT INTO `sys_logininfor` VALUES (211, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-23 09:25:19');
+INSERT INTO `sys_logininfor` VALUES (212, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-23 11:01:27');
+INSERT INTO `sys_logininfor` VALUES (213, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', '退出成功', '2025-12-23 11:03:58');
+INSERT INTO `sys_logininfor` VALUES (214, 'admin', '127.0.0.1', '内网IP', 'Safari', '', '0', 'user.login.success', '2025-12-23 11:04:03');
+INSERT INTO `sys_logininfor` VALUES (215, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-23 17:24:09');
+INSERT INTO `sys_logininfor` VALUES (216, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-23 18:02:14');
+INSERT INTO `sys_logininfor` VALUES (217, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-24 09:21:05');
+INSERT INTO `sys_logininfor` VALUES (218, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-24 11:51:47');
+INSERT INTO `sys_logininfor` VALUES (219, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-24 13:25:04');
+INSERT INTO `sys_logininfor` VALUES (220, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-24 14:26:15');
+INSERT INTO `sys_logininfor` VALUES (221, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', '退出成功', '2025-12-24 14:47:44');
+INSERT INTO `sys_logininfor` VALUES (222, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-24 14:47:45');
+INSERT INTO `sys_logininfor` VALUES (223, 'admin', '127.0.0.1', '内网IP', 'Chrome', 'Windows', '0', 'user.login.success', '2025-12-24 15:25:26');
+
+-- ----------------------------
+-- Table structure for sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_menu`;
+CREATE TABLE `sys_menu`  (
+  `menu_id` bigint NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
+  `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '菜单名称',
+  `parent_id` bigint NULL DEFAULT 0 COMMENT '父菜单ID',
+  `order_num` int NULL DEFAULT 0 COMMENT '显示顺序',
+  `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '路由地址',
+  `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '组件路径',
+  `query` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '路由参数',
+  `is_frame` int NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)',
+  `is_cache` int NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)',
+  `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
+  `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '菜单状态(0显示 1隐藏)',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
+  `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '权限标识',
+  `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '#' COMMENT '菜单图标',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '备注',
+  PRIMARY KEY (`menu_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 2052 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '菜单权限表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_menu
+-- ----------------------------
+INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 1, 'system', NULL, '', 1, 0, 'M', '0', '0', '', 'system', 'admin', '2025-10-22 23:22:59', 'admin', '2025-11-18 16:08:25', '系统管理目录');
+INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 2, 'monitor', NULL, '', 1, 0, 'M', '0', '0', '', 'monitor', 'admin', '2025-10-22 23:22:59', '', NULL, '系统监控目录');
+INSERT INTO `sys_menu` VALUES (3, '系统工具', 0, 3, 'tool', NULL, '', 1, 0, 'M', '0', '0', '', 'tool', 'admin', '2025-10-22 23:22:59', '', NULL, '系统工具目录');
+INSERT INTO `sys_menu` VALUES (4, '若依官网', 0, 4, 'http://ruoyi.vip', NULL, '', 0, 0, 'M', '0', '0', '', 'guide', 'admin', '2025-10-22 23:22:59', '', NULL, '若依官网地址');
+INSERT INTO `sys_menu` VALUES (100, '用户管理', 1, 1, 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 'admin', '2025-10-22 23:22:59', '', NULL, '用户管理菜单');
+INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 'admin', '2025-10-22 23:22:59', '', NULL, '角色管理菜单');
+INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 'admin', '2025-10-22 23:22:59', '', NULL, '菜单管理菜单');
+INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 'admin', '2025-10-22 23:22:59', '', NULL, '部门管理菜单');
+INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 'admin', '2025-10-22 23:23:00', '', NULL, '岗位管理菜单');
+INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 'admin', '2025-10-22 23:23:00', '', NULL, '字典管理菜单');
+INSERT INTO `sys_menu` VALUES (106, '参数设置', 1, 7, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 'admin', '2025-10-22 23:23:00', '', NULL, '参数设置菜单');
+INSERT INTO `sys_menu` VALUES (107, '通知公告', 1, 8, 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 'admin', '2025-10-22 23:23:00', '', NULL, '通知公告菜单');
+INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 'admin', '2025-10-22 23:23:00', '', NULL, '日志管理菜单');
+INSERT INTO `sys_menu` VALUES (109, '在线用户', 2, 1, 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 'admin', '2025-10-22 23:23:00', '', NULL, '在线用户菜单');
+INSERT INTO `sys_menu` VALUES (110, '定时任务', 2, 2, 'job', 'monitor/job/index', '', 1, 0, 'C', '0', '0', 'monitor:job:list', 'job', 'admin', '2025-10-22 23:23:00', '', NULL, '定时任务菜单');
+INSERT INTO `sys_menu` VALUES (111, '数据监控', 2, 3, 'druid', 'monitor/druid/index', '', 1, 0, 'C', '1', '1', 'monitor:druid:list', 'druid', 'admin', '2025-10-22 23:23:00', '', NULL, '数据监控菜单');
+INSERT INTO `sys_menu` VALUES (112, '服务监控', 2, 4, 'server', 'monitor/server/index', '', 1, 0, 'C', '1', '1', 'monitor:server:list', 'server', 'admin', '2025-10-22 23:23:00', '', NULL, '服务监控菜单');
+INSERT INTO `sys_menu` VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 'admin', '2025-10-22 23:23:00', '', NULL, '缓存监控菜单');
+INSERT INTO `sys_menu` VALUES (114, '缓存列表', 2, 6, 'cacheList', 'monitor/cache/list', '', 1, 0, 'C', '1', '1', 'monitor:cache:list', 'redis-list', 'admin', '2025-10-22 23:23:00', 'admin', '2025-11-20 17:49:22', '缓存列表菜单');
+INSERT INTO `sys_menu` VALUES (115, '表单构建', 3, 1, 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 'admin', '2025-10-22 23:23:00', '', NULL, '表单构建菜单');
+INSERT INTO `sys_menu` VALUES (116, '代码生成', 3, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 'admin', '2025-10-22 23:23:00', '', NULL, '代码生成菜单');
+INSERT INTO `sys_menu` VALUES (117, '系统接口', 3, 3, 'swagger', 'tool/swagger/index', '', 1, 0, 'C', '1', '1', 'tool:swagger:list', 'swagger', 'admin', '2025-10-22 23:23:00', 'admin', '2025-11-20 17:49:10', '系统接口菜单');
+INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 'admin', '2025-10-22 23:23:00', '', NULL, '操作日志菜单');
+INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 'admin', '2025-10-22 23:23:00', '', NULL, '登录日志菜单');
+INSERT INTO `sys_menu` VALUES (1000, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1001, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1002, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1003, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1004, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1005, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1006, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1007, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1008, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1009, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1010, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1011, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1012, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1013, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1014, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1015, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 'admin', '2025-10-22 23:23:01', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1016, '部门查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1017, '部门新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1018, '部门修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1019, '部门删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1020, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1021, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1022, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1023, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1024, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1025, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1026, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1027, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1028, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1029, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1030, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1031, '参数新增', 106, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 'admin', '2025-10-22 23:23:02', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1032, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1033, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1034, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1035, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1036, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1037, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1038, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1039, '操作查询', 500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1040, '操作删除', 500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1041, '日志导出', 500, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1042, '登录查询', 501, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1043, '登录删除', 501, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1044, '日志导出', 501, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1045, '账户解锁', 501, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 'admin', '2025-10-22 23:23:03', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1049, '任务查询', 110, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:query', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1050, '任务新增', 110, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:add', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1051, '任务修改', 110, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:edit', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1052, '任务删除', 110, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:remove', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1053, '状态修改', 110, 5, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:changeStatus', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1054, '任务导出', 110, 6, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:job:export', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1055, '生成查询', 116, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1056, '生成修改', 116, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1057, '生成删除', 116, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1058, '导入代码', 116, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1059, '预览代码', 116, 5, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (1060, '生成代码', 116, 6, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', '2025-10-22 23:23:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2025, '分类配置', 1, 4, 'cateconf', '', NULL, 1, 0, 'M', '0', '0', '', 'log', 'admin', '2025-12-21 23:45:43', 'admin', '2025-12-22 05:25:31', '');
+INSERT INTO `sys_menu` VALUES (2026, '员工信息配置', 2025, 1, 'stuffInfoConf', 'system/moduleConf/stuffInfoConf/index', NULL, 1, 0, 'C', '0', '0', 'system:stuffInfoConf:index', 'github', 'admin', '2025-12-21 23:56:35', 'admin', '2025-12-22 05:23:54', '');
+INSERT INTO `sys_menu` VALUES (2027, '价目表配置', 2025, 2, 'priceConf', 'system/moduleConf/priceConf/index', NULL, 1, 0, 'C', '0', '0', 'system:priceConf:index', 'money', 'admin', '2025-12-21 23:57:57', 'admin', '2025-12-22 05:24:07', '');
+INSERT INTO `sys_menu` VALUES (2028, '员工配置表查询', 2026, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:stuffInfoConf:query', '#', 'admin', '2025-12-22 05:07:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2029, '员工配置表新增', 2026, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:stuffInfoConf:add', '#', 'admin', '2025-12-22 05:07:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2030, '员工配置表修改', 2026, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:stuffInfoConf:edit', '#', 'admin', '2025-12-22 05:07:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2031, '员工配置表删除', 2026, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:stuffInfoConf:remove', '#', 'admin', '2025-12-22 05:07:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2032, '员工配置表导出', 2026, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:stuffInfoConf:export', '#', 'admin', '2025-12-22 05:07:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2033, '员工配置表导入', 2026, 6, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:stuffInfoConf:import', '#', 'admin', '2025-12-22 05:07:04', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2034, '价目配置表查询', 2027, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:priceConf:query', '#', 'admin', '2025-12-22 05:16:45', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2035, '价目配置表新增', 2027, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:priceConf:add', '#', 'admin', '2025-12-22 05:16:45', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2036, '价目配置表修改', 2027, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:priceConf:edit', '#', 'admin', '2025-12-22 05:16:45', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2037, '价目配置表删除', 2027, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:priceConf:remove', '#', 'admin', '2025-12-22 05:16:45', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2038, '价目配置表导出', 2027, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:priceConf:export', '#', 'admin', '2025-12-22 05:16:45', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2039, '价目配置表导入', 2027, 6, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:priceConf:import', '#', 'admin', '2025-12-22 05:16:45', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2040, '产品配置', 2025, 3, 'productConf', 'system/moduleConf/productConf/index', NULL, 1, 0, 'C', '0', '0', 'moduleConf:productConf:index', 'table', 'admin', '2025-12-24 14:56:56', '', NULL, '产品配置菜单');
+INSERT INTO `sys_menu` VALUES (2041, '产品配置查询', 2040, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:productConf:query', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2042, '产品配置新增', 2040, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:productConf:add', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2043, '产品配置修改', 2040, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:productConf:edit', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2044, '产品配置删除', 2040, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:productConf:remove', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2045, '产品配置导出', 2040, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:productConf:export', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2046, '套餐配置', 2025, 4, 'compoConf', 'system/moduleConf/compoConf/index', NULL, 1, 0, 'C', '0', '0', 'moduleConf:compoConf:index', 'table', 'admin', '2025-12-24 14:56:56', '', NULL, '套餐配置菜单');
+INSERT INTO `sys_menu` VALUES (2047, '套餐配置查询', 2046, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:compoConf:query', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2048, '套餐配置新增', 2046, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:compoConf:add', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2049, '套餐配置修改', 2046, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:compoConf:edit', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2050, '套餐配置删除', 2046, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:compoConf:remove', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+INSERT INTO `sys_menu` VALUES (2051, '套餐配置导出', 2046, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'moduleConf:compoConf:export', '#', 'admin', '2025-12-24 14:56:56', '', NULL, '');
+
+-- ----------------------------
+-- Table structure for sys_notice
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_notice`;
+CREATE TABLE `sys_notice`  (
+  `notice_id` int NOT NULL AUTO_INCREMENT COMMENT '公告ID',
+  `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告标题',
+  `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告类型(1通知 2公告)',
+  `notice_content` longblob NULL COMMENT '公告内容',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`notice_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '通知公告表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_notice
+-- ----------------------------
+INSERT INTO `sys_notice` VALUES (1, '温馨提醒:2018-07-01 若依新版本发布啦', '2', 0x3C703E31E696B0E78988E69CACE58685E5AEB93C2F703E, '0', 'admin', '2025-10-22 23:23:11', 'admin', '2025-11-11 17:34:03', '管理员');
+INSERT INTO `sys_notice` VALUES (2, '维护通知:2018-07-01 若依系统凌晨维护', '1', 0xE7BBB4E68AA4E58685E5AEB9, '0', 'admin', '2025-10-22 23:23:11', '', NULL, '管理员');
+
+-- ----------------------------
+-- Table structure for sys_oper_log
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_oper_log`;
+CREATE TABLE `sys_oper_log`  (
+  `oper_id` bigint NOT NULL AUTO_INCREMENT COMMENT '日志主键',
+  `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '模块标题',
+  `business_type` int NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)',
+  `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '方法名称',
+  `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求方式',
+  `operator_type` int NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)',
+  `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作人员',
+  `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '部门名称',
+  `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求URL',
+  `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '主机地址',
+  `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '操作地点',
+  `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '请求参数',
+  `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '返回参数',
+  `status` int NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)',
+  `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '错误消息',
+  `oper_time` datetime NULL DEFAULT NULL COMMENT '操作时间',
+  `cost_time` bigint NULL DEFAULT 0 COMMENT '消耗时间',
+  PRIMARY KEY (`oper_id`) USING BTREE,
+  INDEX `idx_sys_oper_log_bt`(`business_type` ASC) USING BTREE,
+  INDEX `idx_sys_oper_log_s`(`status` ASC) USING BTREE,
+  INDEX `idx_sys_oper_log_ot`(`oper_time` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 368 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '操作日志记录' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_oper_log
+-- ----------------------------
+INSERT INTO `sys_oper_log` VALUES (300, '操作日志', 9, 'ruoyi_admin.controller.monitor.operlog.monitor_operlog_clean', 'DELETE', 1, 'admin', '研发部门', '/monitor/operlog/clean', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-11-21 16:07:56', 0);
+INSERT INTO `sys_oper_log` VALUES (301, '登录日志', 9, 'ruoyi_admin.controller.monitor.logininfo.monitor_logininfo_clean', 'DELETE', 1, 'admin', '研发部门', '/monitor/logininfor/clean', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-11-21 16:08:00', 0);
+INSERT INTO `sys_oper_log` VALUES (302, '定时任务', 2, 'ruoyi_apscheduler.controller.job.common_job_edit', 'PUT', 1, 'admin', '研发部门', '/monitor/job', '127.0.0.1', '内网IP', '{\"createBy\":\"admin\",\"createTime\":\"2025-11-21 14:56:56\",\"updateBy\":null,\"updateTime\":null,\"remark\":\"\",\"jobId\":101,\"jobName\":\"测试\",\"jobGroup\":\"DEFAULT\",\"invokeTarget\":\"ruoyi_apscheduler.task.ruoyi_task.no_args()\",\"cronExpression\":\"0/10 * * * * ?\",\"misfirePolicy\":\"3\",\"concurrent\":\"1\",\"status\":\"1\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-11-21 16:08:24', 0);
+INSERT INTO `sys_oper_log` VALUES (303, '定时任务', 3, 'ruoyi_apscheduler.controller.job.common_job_remove', 'DELETE', 1, 'admin', '研发部门', '/monitor/job/101', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-11-21 16:11:48', 0);
+INSERT INTO `sys_oper_log` VALUES (304, '字典类型', 2, 'ruoyi_admin.controller.system.dict_type.system_dict_type_update', 'PUT', 1, 'admin', '研发部门', '/system/dict/type', '127.0.0.1', '内网IP', '{\"createBy\":\"admin\",\"createTime\":\"2025-10-22 23:23:09\",\"updateBy\":\"admin\",\"updateTime\":\"2025-11-21 15:20:16\",\"remark\":\"性别\",\"dictId\":1,\"dictName\":\"用户性别\",\"dictType\":\"sys_user_sex\",\"status\":\"0\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-11-21 16:12:33', 0);
+INSERT INTO `sys_oper_log` VALUES (305, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0100000500000008\",\"attributes\":\"asdasd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-22 19:00:47', 0);
+INSERT INTO `sys_oper_log` VALUES (306, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0100000600000008\",\"attributes\":\"asd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-22 19:02:23', 0);
+INSERT INTO `sys_oper_log` VALUES (307, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0100000500000008\",\"attributes\":\"asdasd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-22 19:04:41', 0);
+INSERT INTO `sys_oper_log` VALUES (308, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112345612345678\",\"attributes\":\"asd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-22 19:07:24', 0);
+INSERT INTO `sys_oper_log` VALUES (309, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112345612345678\",\"attributes\":\"asd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-22 19:10:30', 0);
+INSERT INTO `sys_oper_log` VALUES (310, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112345612345678\",\"attributes\":\"asd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-22 19:11:41', 0);
+INSERT INTO `sys_oper_log` VALUES (311, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112345612345678\",\"attributes\":\"asd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-22 19:12:52', 0);
+INSERT INTO `sys_oper_log` VALUES (312, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112345612345678\",\"attributes\":\"asd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-22 19:22:03', 0);
+INSERT INTO `sys_oper_log` VALUES (313, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/1', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 09:46:12', 0);
+INSERT INTO `sys_oper_log` VALUES (314, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112345612345678\",\"attributes\":\"list\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 09:46:43', 0);
+INSERT INTO `sys_oper_log` VALUES (315, '员工配置管理', 2, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_update', 'PUT', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"confId\":1,\"moduleIndex\":\"01\",\"category\":\"0112345612345678\",\"attributes\":\"asdasdas\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:02:58', 0);
+INSERT INTO `sys_oper_log` VALUES (316, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0123\",\"attributes\":\"asdasdasd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:05:58', 0);
+INSERT INTO `sys_oper_log` VALUES (317, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"012\",\"attributes\":\"04120452\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:06:04', 0);
+INSERT INTO `sys_oper_log` VALUES (318, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"02\",\"category\":\"4504\",\"attributes\":\"450450\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:06:08', 0);
+INSERT INTO `sys_oper_log` VALUES (319, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"120\",\"category\":\"45045\",\"attributes\":\"40450\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:06:12', 0);
+INSERT INTO `sys_oper_log` VALUES (320, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"452\",\"category\":\"45245\",\"attributes\":\"542452452\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:06:15', 0);
+INSERT INTO `sys_oper_log` VALUES (321, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"045\",\"category\":\"4524\",\"attributes\":\"450475054\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:06:21', 0);
+INSERT INTO `sys_oper_log` VALUES (322, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"05\",\"category\":\"04545\",\"attributes\":\"452452\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:06:57', 0);
+INSERT INTO `sys_oper_log` VALUES (323, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"06\",\"category\":\"05254\",\"attributes\":\"452452\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:07:02', 0);
+INSERT INTO `sys_oper_log` VALUES (324, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"07\",\"category\":\"0454\",\"attributes\":\"045242\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:07:06', 0);
+INSERT INTO `sys_oper_log` VALUES (325, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0452\",\"attributes\":\"045243453453\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:07:11', 0);
+INSERT INTO `sys_oper_log` VALUES (326, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"04\",\"category\":\"04123\",\"attributes\":\"04532453\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:07:19', 0);
+INSERT INTO `sys_oper_log` VALUES (327, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"4532\",\"attributes\":\"7452452\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:07:24', 0);
+INSERT INTO `sys_oper_log` VALUES (328, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"04\",\"category\":\"04532453\",\"attributes\":\"345423\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:07:30', 0);
+INSERT INTO `sys_oper_log` VALUES (329, '价目配置管理', 1, 'ruoyi_admin.controller.system.sys_price_conf.system_price_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/priceConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112\",\"attributes\":\"asd\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 10:31:28', 0);
+INSERT INTO `sys_oper_log` VALUES (330, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112345612345678\",\"attributes\":\"[{\\\"attrName\\\":\\\"age\\\",\\\"attr\\\":\\\"asd\\\",\\\"type\\\":\\\"int\\\",\\\"description\\\":\\\"年龄\\\"}]\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 17:30:08', 0);
+INSERT INTO `sys_oper_log` VALUES (331, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"012222201\",\"attributes\":\"[{\\\"attrName\\\":\\\"age\\\",\\\"attr\\\":\\\"a\\\",\\\"type\\\":\\\"int\\\",\\\"description\\\":\\\"年龄\\\"}]\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 17:42:13', 0);
+INSERT INTO `sys_oper_log` VALUES (332, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0116816\",\"attributes\":\"[{\\\"attrName\\\":\\\"age\\\",\\\"attr\\\":\\\"a\\\",\\\"type\\\":\\\"int\\\",\\\"description\\\":\\\"年龄\\\"},{\\\"attrName\\\":\\\"name\\\",\\\"attr\\\":\\\"n\\\",\\\"type\\\":\\\"varchar\\\",\\\"description\\\":\\\"姓名\\\"}]\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 17:43:17', 0);
+INSERT INTO `sys_oper_log` VALUES (333, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0186161\",\"attributes\":\"[{\\\"attrName\\\":\\\"age\\\",\\\"attr\\\":\\\"a\\\",\\\"type\\\":\\\"int\\\",\\\"description\\\":\\\"a\\\"},{\\\"attrName\\\":\\\"a\\\",\\\"attr\\\":\\\"a\\\",\\\"type\\\":\\\"float\\\",\\\"description\\\":\\\"a\\\"}]\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 17:57:46', 0);
+INSERT INTO `sys_oper_log` VALUES (334, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"01156165165\",\"attributes\":\"[{\\\"attrName\\\":\\\"age\\\",\\\"attr\\\":\\\"a\\\",\\\"type\\\":\\\"int\\\",\\\"description\\\":\\\"年龄\\\"},{\\\"attrName\\\":\\\"name \\\",\\\"attr\\\":\\\"n\\\",\\\"type\\\":\\\"str\\\",\\\"description\\\":\\\"姓名\\\"}]\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 18:00:00', 0);
+INSERT INTO `sys_oper_log` VALUES (335, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/1', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 18:02:21', 0);
+INSERT INTO `sys_oper_log` VALUES (336, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/2', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-23 18:02:23', 0);
+INSERT INTO `sys_oper_log` VALUES (337, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuff_info_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/3,4', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"成功删除 True 条记录\",\"data\":\"\"}', 0, '', '2025-12-23 18:25:19', 0);
+INSERT INTO `sys_oper_log` VALUES (338, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuff_info_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/5,6,7,8,9,10,11', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"成功删除 True 条记录\",\"data\":\"\"}', 0, '', '2025-12-23 18:25:30', 0);
+INSERT INTO `sys_oper_log` VALUES (339, '价目配置管理', 1, 'ruoyi_admin.controller.system.sys_price_conf.system_price_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/priceConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0112345685522\",\"attributes\":\"[{\\\"attrName\\\":\\\"是否套餐\\\",\\\"attr\\\":\\\"t\\\",\\\"type\\\":\\\"int\\\",\\\"description\\\":\\\"是否套餐\\\"}]\",\"confId\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 09:21:48', 0);
+INSERT INTO `sys_oper_log` VALUES (340, '价目配置管理', 3, 'ruoyi_admin.controller.system.sys_price_conf.system_price_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/priceConf/1', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 09:22:00', 0);
+INSERT INTO `sys_oper_log` VALUES (341, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"01515\",\"attributes\":\"asdasd\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 11:59:26', 0);
+INSERT INTO `sys_oper_log` VALUES (342, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"05165165156\",\"attributes\":\"asdasd\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 11:59:54', 0);
+INSERT INTO `sys_oper_log` VALUES (343, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"45245\",\"attributes\":\"3453453\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 12:01:14', 0);
+INSERT INTO `sys_oper_log` VALUES (344, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/16', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 12:04:02', 0);
+INSERT INTO `sys_oper_log` VALUES (345, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"asdasd\",\"attributes\":\"整数\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 12:04:16', 0);
+INSERT INTO `sys_oper_log` VALUES (346, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"asfasf\",\"attributes\":\"[{\\\"attrName\\\":\\\"age\\\",\\\"attr\\\":\\\"a\\\",\\\"type\\\":\\\"整数\\\",\\\"description\\\":\\\"年龄\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 12:07:36', 0);
+INSERT INTO `sys_oper_log` VALUES (347, '价目配置管理', 1, 'ruoyi_admin.controller.system.sys_price_conf.system_priceinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/priceConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"asdas\",\"attributes\":\"[{\\\"attrName\\\":\\\"asd\\\",\\\"attr\\\":\\\"asd\\\",\\\"type\\\":\\\"小数\\\",\\\"description\\\":\\\"asdasd\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:44:43', 0);
+INSERT INTO `sys_oper_log` VALUES (348, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/12', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:46:52', 0);
+INSERT INTO `sys_oper_log` VALUES (349, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/13', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:46:53', 0);
+INSERT INTO `sys_oper_log` VALUES (350, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/16', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:46:55', 0);
+INSERT INTO `sys_oper_log` VALUES (351, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/14', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:46:56', 0);
+INSERT INTO `sys_oper_log` VALUES (352, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/15', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:46:57', 0);
+INSERT INTO `sys_oper_log` VALUES (353, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/17', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:46:58', 0);
+INSERT INTO `sys_oper_log` VALUES (354, '员工配置管理', 1, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"0154242\",\"attributes\":\"[{\\\"attrName\\\":\\\"452\\\",\\\"attr\\\":\\\"452452\\\",\\\"type\\\":\\\"整数\\\",\\\"description\\\":\\\"452452\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:47:06', 0);
+INSERT INTO `sys_oper_log` VALUES (355, '员工配置管理', 3, 'ruoyi_admin.controller.system.sys_stuff_info_conf.system_stuffinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/stuffInfoConf/1', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:47:12', 0);
+INSERT INTO `sys_oper_log` VALUES (356, '价目配置管理', 3, 'ruoyi_admin.controller.system.sys_price_conf.system_priceinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/priceConf/2', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:47:16', 0);
+INSERT INTO `sys_oper_log` VALUES (357, '价目配置管理', 3, 'ruoyi_admin.controller.system.sys_price_conf.system_priceinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/priceConf/3', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:47:17', 0);
+INSERT INTO `sys_oper_log` VALUES (358, '价目配置管理', 1, 'ruoyi_admin.controller.system.sys_price_conf.system_priceinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/priceConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"34\",\"category\":\"535463\",\"attributes\":\"[{\\\"attrName\\\":\\\"453453\\\",\\\"attr\\\":\\\"453\\\",\\\"type\\\":\\\"整数\\\",\\\"description\\\":\\\"453453\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:47:23', 0);
+INSERT INTO `sys_oper_log` VALUES (359, '价目配置管理', 3, 'ruoyi_admin.controller.system.sys_price_conf.system_priceinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/priceConf/1', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 14:47:25', 0);
+INSERT INTO `sys_oper_log` VALUES (360, '价目配置管理', 1, 'ruoyi_admin.controller.system.sys_price_conf.system_priceinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/priceConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"01515\",\"attributes\":\"[{\\\"attrName\\\":\\\"132\\\",\\\"attr\\\":\\\"123\\\",\\\"type\\\":\\\"整数\\\",\\\"description\\\":\\\"123\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 15:13:04', 0);
+INSERT INTO `sys_oper_log` VALUES (361, '套餐配置管理', 1, 'ruoyi_admin.controller.system.sys_compo_conf.system_compoinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/compoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"045452\",\"attributes\":\"[{\\\"attrName\\\":\\\"452\\\",\\\"attr\\\":\\\"452\\\",\\\"type\\\":\\\"小数\\\",\\\"description\\\":\\\"452452\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 15:17:48', 0);
+INSERT INTO `sys_oper_log` VALUES (362, '套餐配置管理', 3, 'ruoyi_admin.controller.system.sys_compo_conf.system_compoinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/compoConf/20251224151748A002', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 15:17:51', 0);
+INSERT INTO `sys_oper_log` VALUES (363, '套餐配置管理', 1, 'ruoyi_admin.controller.system.sys_compo_conf.system_compoinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/compoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"452452\",\"attributes\":\"[{\\\"attrName\\\":\\\"452452\\\",\\\"attr\\\":\\\"45245\\\",\\\"type\\\":\\\"整数\\\",\\\"description\\\":\\\"452452\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 15:17:57', 0);
+INSERT INTO `sys_oper_log` VALUES (364, '套餐配置管理', 2, 'ruoyi_admin.controller.system.sys_compo_conf.system_compoinfo_conf_update', 'PUT', 1, 'admin', '研发部门', '/system/moduleConf/compoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"452455254\",\"attributes\":\"[{\\\"attrName\\\":\\\"4524522452\\\",\\\"attr\\\":\\\"45245452245\\\",\\\"type\\\":\\\"小数\\\",\\\"description\\\":\\\"452452\\\"}]\",\"confId\":\"20251224151757A003\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 15:18:04', 0);
+INSERT INTO `sys_oper_log` VALUES (365, '套餐配置管理', 3, 'ruoyi_admin.controller.system.sys_compo_conf.system_compoinfo_conf_delete', 'DELETE', 1, 'admin', '研发部门', '/system/moduleConf/compoConf/20251224151757A003', '127.0.0.1', '内网IP', '', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 15:38:02', 0);
+INSERT INTO `sys_oper_log` VALUES (366, '套餐配置管理', 1, 'ruoyi_admin.controller.system.sys_compo_conf.system_compoinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/compoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"01165165\",\"version\":0,\"deleteFlag\":0,\"status\":1,\"attributes\":\"[{\\\"attrName\\\":\\\"56353\\\",\\\"attr\\\":\\\"563563\\\",\\\"type\\\":\\\"字符串\\\",\\\"description\\\":\\\"563563\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 15:38:16', 0);
+INSERT INTO `sys_oper_log` VALUES (367, '套餐配置管理', 1, 'ruoyi_admin.controller.system.sys_compo_conf.system_compoinfo_conf_create', 'POST', 1, 'admin', '研发部门', '/system/moduleConf/compoConf', '127.0.0.1', '内网IP', '{\"moduleIndex\":\"01\",\"category\":\"452345254\",\"version\":1,\"deleteFlag\":1,\"status\":1,\"attributes\":\"[{\\\"attrName\\\":\\\"014532\\\",\\\"attr\\\":\\\"452452\\\",\\\"type\\\":\\\"datatime\\\",\\\"description\\\":\\\"452452\\\"}]\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":\"\"}', 0, '', '2025-12-24 15:41:23', 0);
+
+-- ----------------------------
+-- Table structure for sys_post
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_post`;
+CREATE TABLE `sys_post`  (
+  `post_id` bigint NOT NULL AUTO_INCREMENT COMMENT '岗位ID',
+  `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '岗位编码',
+  `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '岗位名称',
+  `post_sort` int NOT NULL COMMENT '显示顺序',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '状态(0正常 1停用)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`post_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '岗位信息表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_post
+-- ----------------------------
+INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, '0', 'admin', '2025-10-22 23:22:59', 'admin', '2025-11-20 17:43:33', '1321');
+INSERT INTO `sys_post` VALUES (2, 'se', '项目经理', 2, '0', 'admin', '2025-10-22 23:22:59', 'admin', '2025-11-09 18:13:45', '1');
+INSERT INTO `sys_post` VALUES (3, 'hr', '人力资源', 3, '0', 'admin', '2025-10-22 23:22:59', '', NULL, '');
+INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, '0', 'admin', '2025-10-22 23:22:59', 'admin', '2025-11-09 18:13:49', '213');
+
+-- ----------------------------
+-- Table structure for sys_price_conf
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_price_conf`;
+CREATE TABLE `sys_price_conf`  (
+  `conf_id` bigint NOT NULL COMMENT 'conf_id',
+  `module_index` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分类索引',
+  `category` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '子类路径',
+  `Attributes` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '属性列表',
+  PRIMARY KEY (`conf_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '价目表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_price_conf
+-- ----------------------------
+INSERT INTO `sys_price_conf` VALUES (1, '01', '01515', '[{\"attrName\":\"132\",\"attr\":\"123\",\"type\":\"整数\",\"description\":\"123\"}]');
+
+-- ----------------------------
+-- Table structure for sys_product_conf
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_product_conf`;
+CREATE TABLE `sys_product_conf`  (
+  `conf_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
+  `module_index` varchar(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分类索引',
+  `category` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '子类路径',
+  `attributes` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '属性列表',
+  `version` int NULL DEFAULT NULL COMMENT '版本号',
+  `delete_flag` int NULL DEFAULT NULL COMMENT '删除标记 0:未删除 1:删除',
+  `status` int NULL DEFAULT NULL COMMENT '状态 0:禁用, 1:启用',
+  PRIMARY KEY (`conf_id`) USING BTREE,
+  UNIQUE INDEX `sys_stuff_info_conf_unique`(`category` ASC) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '单品配置表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_product_conf
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role`;
+CREATE TABLE `sys_role`  (
+  `role_id` bigint NOT NULL AUTO_INCREMENT COMMENT '角色ID',
+  `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色名称',
+  `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色权限字符串',
+  `role_sort` int NOT NULL COMMENT '显示顺序',
+  `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
+  `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示',
+  `dept_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '角色状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`role_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 102 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色信息表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_role
+-- ----------------------------
+INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, '1', 1, 1, '0', '0', 'admin', '2025-10-22 23:22:59', '', NULL, '超级管理员');
+INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, '2', 1, 1, '0', '0', 'admin', '2025-10-22 23:22:59', '', NULL, '普通角色');
+INSERT INTO `sys_role` VALUES (100, 'test', 'test', 10, '2', 1, 1, '0', '2', 'admin', '2025-11-12 16:34:09', 'admin', '2025-11-21 15:56:29', NULL);
+INSERT INTO `sys_role` VALUES (101, 't', 't', 0, '1', 1, 1, '0', '2', 'admin', '2025-11-18 16:43:27', '', NULL, NULL);
+
+-- ----------------------------
+-- Table structure for sys_role_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_dept`;
+CREATE TABLE `sys_role_dept`  (
+  `role_id` bigint NOT NULL COMMENT '角色ID',
+  `dept_id` bigint NOT NULL COMMENT '部门ID',
+  PRIMARY KEY (`role_id`, `dept_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色和部门关联表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_role_dept
+-- ----------------------------
+INSERT INTO `sys_role_dept` VALUES (2, 100);
+INSERT INTO `sys_role_dept` VALUES (2, 101);
+INSERT INTO `sys_role_dept` VALUES (2, 105);
+
+-- ----------------------------
+-- Table structure for sys_role_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_menu`;
+CREATE TABLE `sys_role_menu`  (
+  `role_id` bigint NOT NULL COMMENT '角色ID',
+  `menu_id` bigint NOT NULL COMMENT '菜单ID',
+  PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_role_menu
+-- ----------------------------
+INSERT INTO `sys_role_menu` VALUES (2, 1);
+INSERT INTO `sys_role_menu` VALUES (2, 2);
+INSERT INTO `sys_role_menu` VALUES (2, 3);
+INSERT INTO `sys_role_menu` VALUES (2, 4);
+INSERT INTO `sys_role_menu` VALUES (2, 100);
+INSERT INTO `sys_role_menu` VALUES (2, 101);
+INSERT INTO `sys_role_menu` VALUES (2, 102);
+INSERT INTO `sys_role_menu` VALUES (2, 103);
+INSERT INTO `sys_role_menu` VALUES (2, 104);
+INSERT INTO `sys_role_menu` VALUES (2, 105);
+INSERT INTO `sys_role_menu` VALUES (2, 106);
+INSERT INTO `sys_role_menu` VALUES (2, 107);
+INSERT INTO `sys_role_menu` VALUES (2, 108);
+INSERT INTO `sys_role_menu` VALUES (2, 109);
+INSERT INTO `sys_role_menu` VALUES (2, 110);
+INSERT INTO `sys_role_menu` VALUES (2, 111);
+INSERT INTO `sys_role_menu` VALUES (2, 112);
+INSERT INTO `sys_role_menu` VALUES (2, 113);
+INSERT INTO `sys_role_menu` VALUES (2, 114);
+INSERT INTO `sys_role_menu` VALUES (2, 115);
+INSERT INTO `sys_role_menu` VALUES (2, 116);
+INSERT INTO `sys_role_menu` VALUES (2, 117);
+INSERT INTO `sys_role_menu` VALUES (2, 500);
+INSERT INTO `sys_role_menu` VALUES (2, 501);
+INSERT INTO `sys_role_menu` VALUES (2, 1000);
+INSERT INTO `sys_role_menu` VALUES (2, 1001);
+INSERT INTO `sys_role_menu` VALUES (2, 1002);
+INSERT INTO `sys_role_menu` VALUES (2, 1003);
+INSERT INTO `sys_role_menu` VALUES (2, 1004);
+INSERT INTO `sys_role_menu` VALUES (2, 1005);
+INSERT INTO `sys_role_menu` VALUES (2, 1006);
+INSERT INTO `sys_role_menu` VALUES (2, 1007);
+INSERT INTO `sys_role_menu` VALUES (2, 1008);
+INSERT INTO `sys_role_menu` VALUES (2, 1009);
+INSERT INTO `sys_role_menu` VALUES (2, 1010);
+INSERT INTO `sys_role_menu` VALUES (2, 1011);
+INSERT INTO `sys_role_menu` VALUES (2, 1012);
+INSERT INTO `sys_role_menu` VALUES (2, 1013);
+INSERT INTO `sys_role_menu` VALUES (2, 1014);
+INSERT INTO `sys_role_menu` VALUES (2, 1015);
+INSERT INTO `sys_role_menu` VALUES (2, 1016);
+INSERT INTO `sys_role_menu` VALUES (2, 1017);
+INSERT INTO `sys_role_menu` VALUES (2, 1018);
+INSERT INTO `sys_role_menu` VALUES (2, 1019);
+INSERT INTO `sys_role_menu` VALUES (2, 1020);
+INSERT INTO `sys_role_menu` VALUES (2, 1021);
+INSERT INTO `sys_role_menu` VALUES (2, 1022);
+INSERT INTO `sys_role_menu` VALUES (2, 1023);
+INSERT INTO `sys_role_menu` VALUES (2, 1024);
+INSERT INTO `sys_role_menu` VALUES (2, 1025);
+INSERT INTO `sys_role_menu` VALUES (2, 1026);
+INSERT INTO `sys_role_menu` VALUES (2, 1027);
+INSERT INTO `sys_role_menu` VALUES (2, 1028);
+INSERT INTO `sys_role_menu` VALUES (2, 1029);
+INSERT INTO `sys_role_menu` VALUES (2, 1030);
+INSERT INTO `sys_role_menu` VALUES (2, 1031);
+INSERT INTO `sys_role_menu` VALUES (2, 1032);
+INSERT INTO `sys_role_menu` VALUES (2, 1033);
+INSERT INTO `sys_role_menu` VALUES (2, 1034);
+INSERT INTO `sys_role_menu` VALUES (2, 1035);
+INSERT INTO `sys_role_menu` VALUES (2, 1036);
+INSERT INTO `sys_role_menu` VALUES (2, 1037);
+INSERT INTO `sys_role_menu` VALUES (2, 1038);
+INSERT INTO `sys_role_menu` VALUES (2, 1039);
+INSERT INTO `sys_role_menu` VALUES (2, 1040);
+INSERT INTO `sys_role_menu` VALUES (2, 1041);
+INSERT INTO `sys_role_menu` VALUES (2, 1042);
+INSERT INTO `sys_role_menu` VALUES (2, 1043);
+INSERT INTO `sys_role_menu` VALUES (2, 1044);
+INSERT INTO `sys_role_menu` VALUES (2, 1045);
+INSERT INTO `sys_role_menu` VALUES (2, 1046);
+INSERT INTO `sys_role_menu` VALUES (2, 1047);
+INSERT INTO `sys_role_menu` VALUES (2, 1048);
+INSERT INTO `sys_role_menu` VALUES (2, 1049);
+INSERT INTO `sys_role_menu` VALUES (2, 1050);
+INSERT INTO `sys_role_menu` VALUES (2, 1051);
+INSERT INTO `sys_role_menu` VALUES (2, 1052);
+INSERT INTO `sys_role_menu` VALUES (2, 1053);
+INSERT INTO `sys_role_menu` VALUES (2, 1054);
+INSERT INTO `sys_role_menu` VALUES (2, 1055);
+INSERT INTO `sys_role_menu` VALUES (2, 1056);
+INSERT INTO `sys_role_menu` VALUES (2, 1057);
+INSERT INTO `sys_role_menu` VALUES (2, 1058);
+INSERT INTO `sys_role_menu` VALUES (2, 1059);
+INSERT INTO `sys_role_menu` VALUES (2, 1060);
+
+-- ----------------------------
+-- Table structure for sys_stuff_info_conf
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_stuff_info_conf`;
+CREATE TABLE `sys_stuff_info_conf`  (
+  `conf_id` bigint NOT NULL AUTO_INCREMENT,
+  `module_index` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '分类索引',
+  `category` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '子类路径',
+  `Attributes` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '属性列表',
+  PRIMARY KEY (`conf_id`) USING BTREE,
+  UNIQUE INDEX `sys_stuff_info_conf_unique`(`category` ASC) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '员工信息配置表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_stuff_info_conf
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_user
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user`  (
+  `user_id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
+  `dept_id` bigint NULL DEFAULT NULL COMMENT '部门ID',
+  `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户账号',
+  `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '用户昵称',
+  `user_type` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '00' COMMENT '用户类型(00系统用户)',
+  `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '用户邮箱',
+  `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '手机号码',
+  `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
+  `avatar` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '头像地址',
+  `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '密码',
+  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
+  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+  `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '最后登录IP',
+  `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间',
+  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
+  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
+  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
+  PRIMARY KEY (`user_id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 115 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户信息表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_user
+-- ----------------------------
+INSERT INTO `sys_user` VALUES (1, 103, 'admin', '若依', '00', 'ry@163.com', '15888888888', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2025-12-24 15:25:26', 'admin', '2025-10-22 23:22:58', '', '2025-12-24 15:25:26', '管理员');
+INSERT INTO `sys_user` VALUES (2, 105, 'ry', '若依', '00', 'ry@qq.com', '15666666666', '1', '', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', '2025-10-22 23:22:58', 'admin', '2025-10-22 23:22:58', '', NULL, '测试员');
+INSERT INTO `sys_user` VALUES (100, 101, '321', '321', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, '', NULL, NULL);
+INSERT INTO `sys_user` VALUES (101, NULL, 'test', 'test', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, '', NULL, NULL);
+INSERT INTO `sys_user` VALUES (102, NULL, 'test1', 'test1', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, '', NULL, NULL);
+INSERT INTO `sys_user` VALUES (103, NULL, 'test2', 'test2', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, '', NULL, NULL);
+INSERT INTO `sys_user` VALUES (104, 108, 'test01', '1', '00', '', '18585595238', '0', '', '', '1', '2', '', NULL, 'admin', NULL, 'admin', '2025-11-20 18:56:35', '312');
+INSERT INTO `sys_user` VALUES (105, 103, 'test22', 'test22', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, 'admin', NULL, NULL);
+INSERT INTO `sys_user` VALUES (106, NULL, 'test333', 'test333', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, '', NULL, NULL);
+INSERT INTO `sys_user` VALUES (107, NULL, 'test44', 'test44', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, '', NULL, NULL);
+INSERT INTO `sys_user` VALUES (108, 109, 'test1118', 'test1118', '00', '', '', '0', '', '', '0', '2', '127.0.0.1', '2025-11-18 15:28:51', 'admin', NULL, 'admin', '2025-11-18 15:58:42', '312');
+INSERT INTO `sys_user` VALUES (109, 109, 'test11182', 'test11182', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, '', NULL, NULL);
+INSERT INTO `sys_user` VALUES (110, 109, 'test11183', 'test11183', '00', '', '', '0', '', '$2b$12$0.p8CcPThWgK8h1wZhDJYeuGsBtawErRLJ2dhpo8f0jjsBKvvMZYC', '0', '2', '127.0.0.1', '2025-11-18 15:44:24', 'admin', NULL, 'admin', NULL, NULL);
+INSERT INTO `sys_user` VALUES (111, 105, 'test11184', 'test11184', '00', '3217778348@qq.com', '18585595248', '0', '', '$2b$12$vNKe3DfPHtTDFiEczZUtaOtULNzNyX3ClEfoOY9lUHfwLl7zPNW.C', '0', '2', '127.0.0.1', '2025-11-21 15:57:12', 'admin', NULL, 'admin', '2025-11-21 15:57:12', NULL);
+INSERT INTO `sys_user` VALUES (112, 100, 'test11185', 'test11185', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, 'admin', '2025-11-18 15:58:50', NULL);
+INSERT INTO `sys_user` VALUES (113, 108, 'test11186', 'test11186', '00', '', '', '0', '', '', '0', '2', '', NULL, 'admin', NULL, 'admin', '2025-11-18 15:53:16', '321312');
+INSERT INTO `sys_user` VALUES (114, NULL, 'test11187', 'test11187', '00', '', '', '0', '', '$2b$12$MSDYq9cm.xMR2uzJUSCS0uCqBUETV0Sz5bedPrldyIz21TiDOjuTW', '0', '2', '', NULL, 'admin', '2025-11-18 15:53:39', '', NULL, NULL);
+
+-- ----------------------------
+-- Table structure for sys_user_post
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_post`;
+CREATE TABLE `sys_user_post`  (
+  `user_id` bigint NOT NULL COMMENT '用户ID',
+  `post_id` bigint NOT NULL COMMENT '岗位ID',
+  PRIMARY KEY (`user_id`, `post_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_user_post
+-- ----------------------------
+INSERT INTO `sys_user_post` VALUES (2, 2);
+
+-- ----------------------------
+-- Table structure for sys_user_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_role`;
+CREATE TABLE `sys_user_role`  (
+  `user_id` bigint NOT NULL COMMENT '用户ID',
+  `role_id` bigint NOT NULL COMMENT '角色ID',
+  PRIMARY KEY (`user_id`, `role_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '用户和角色关联表' ROW_FORMAT = DYNAMIC;
+
+-- ----------------------------
+-- Records of sys_user_role
+-- ----------------------------
+INSERT INTO `sys_user_role` VALUES (2, 2);
+
+SET FOREIGN_KEY_CHECKS = 1;