徽标
工单管理
合并请求
里程碑
探索
zc
/
admin_core
代码
工单
合并请求
Actions
软件包
项目
版本发布
百科
动态
设置
文件
使用说明.md
完整使用文档.md
快速开始.md
.gitignore
README.md
babel.config.js
package-lock.json
package.json
postcss.config.js
webpack.config.js
admin_core
/
_doc
/
使用说明.md

张成
463d7921c1
1
1分钟前
18 KiB
Admin Framework 使用说明
一个基于 Vue2 的通用后台管理系统框架，包含完整的系统功能、登录、路由管理、布局等核心功能。

📦 框架特性
✨ 核心功能
✅ 简化的 API - 只需调用 createApp() 即可完成所有初始化
✅ 模块化设计 - 组件、路由、状态管理等功能按模块组织
✅ 完整的系统管理页面 - 用户、角色、菜单、日志等管理
✅ 登录和权限管理 - 完整的登录流程和权限控制
✅ 动态路由管理 - 基于权限菜单的动态路由生成
✅ Vuex 状态管理 - 用户、应用状态管理
✅ 全局组件库 - Tables、Editor、Upload、TreeGrid、FieldRenderer、FloatPanel 等
✅ 工具库 - HTTP、日期、Token、Cookie 等工具
✅ 内置样式 - base.less、animate.css、iconfont 等
✅ 响应式布局 - 支持移动端适配
🎯 内置页面组件
主页组件 (HomePage) - 欢迎页面，显示系统标题
系统管理页面 (SysUser, SysRole, SysLog, SysParamSetup)
高级管理页面 (SysMenu, SysControl, SysTitle)
登录页面 (LoginPage)
错误页面 (Page401, Page404, Page500)
🛠️ 内置工具
HTTP 工具 (http) - 封装了 axios，支持拦截器、文件上传下载
UI 工具 (uiTool) - 删除确认、树形转换、响应式设置、文件下载
通用工具 (tools) - 日期格式化、UUID 生成、Cookie 操作、深拷贝等
文件下载 - 支持 CSV 等格式的文件下载，自动处理换行符
🚀 快速开始
方式一：使用 Demo 项目（推荐）
我们提供了一个完整的 demo 项目，可以直接运行查看效果：

# 1. 进入 demo 项目
cd demo

# 2. 安装依赖
npm install

# 3. 启动开发服务器
npm run dev
浏览器会自动打开 http://localhost:8080，查看：

/login - 登录页面
/home - 主页
/system/user - 用户管理
/ball/games - 业务示例页面
方式二：构建框架
# 1. 安装依赖
npm install

# 2. 构建框架
npm run build

# 3. 产物在 dist/admin-framework.js
🎯 极简使用方式
只需 3 步即可完成集成！
1. 引入框架
import AdminFramework from './admin-framework.js'
2. 创建应用
const app = AdminFramework.createApp({
  title: '我的管理系统',
  apiUrl: 'http://localhost:9098/admin_api/',
  componentMap: {
    'business/product': ProductComponent,
    'business/order': OrderComponent
  }
})
3. 挂载应用
app.$mount('#app')
就这么简单！ 框架会自动完成所有初始化工作。

📖 完整使用指南
1. 项目结构准备
your-project/
├── src/
│   ├── config/
│   │   └── index.js          # 配置文件
│   ├── libs/
│   │   └── admin-framework.js # 框架文件
│   ├── views/
│   │   └── business/         # 业务页面
│   ├── api/
│   │   └── business/         # 业务 API
│   ├── App.vue
│   └── main.js
├── package.json
└── webpack.config.js
2. 安装依赖
npm install vue vue-router vuex view-design axios dayjs js-cookie vuex-persistedstate
3. 创建配置文件
在 src/config/index.js 中：

module.exports = {
  title: '你的系统名称',
  homeName: '首页',
  apiUrl: 'http://localhost:9090/admin_api/',
  uploadUrl: 'http://localhost:9090/admin_api/upload',
  cookieExpires: 7,
  uploadMaxLimitSize: 10,
  oss: {
    region: 'oss-cn-shanghai',
    accessKeyId: 'your-key',
    accessKeySecret: 'your-secret',
    bucket: 'your-bucket',
    url: 'http://your-bucket.oss-cn-shanghai.aliyuncs.com',
    basePath: 'your-path/'
  }
}
4. 创建 main.js（新版本 - 推荐）
import AdminFramework from './libs/admin-framework.js'

// 导入业务组件（根据权限菜单接口的 component 字段）
import GamesComponent from './views/ball/games.vue'
import PayOrdersComponent from './views/order/pay_orders.vue'

// 🎉 只需一行代码！框架自动完成所有初始化
const app = AdminFramework.createApp({
  title: '我的管理系统',
  apiUrl: 'http://localhost:9098/admin_api/',
  componentMap: {
    'ball/games': GamesComponent,
    'order/pay_orders': PayOrdersComponent
    // 添加更多业务组件...
  },
  onReady() {
    console.log('应用已启动!')
    // 应用启动完成后的回调
  }
})

// 挂载应用
app.$mount('#app')
5. 创建 App.vue
<template>
  <div id="app">
    <router-view/>
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>
🔧 API 使用指南
框架实例方法
createApp(config) - 推荐使用
创建应用实例（新版本 API）

const app = AdminFramework.createApp({
  title: '我的管理系统',           // 应用标题（必需）
  apiUrl: 'http://localhost:9098/admin_api/', // API 基础地址（必需）
  uploadUrl: 'http://localhost:9098/admin_api/upload', // 上传地址（可选，默认为 apiUrl + 'upload'）
  componentMap: {                // 业务组件映射（可选）
    'business/product': ProductComponent,
    'business/order': OrderComponent
  },
  onReady() {                    // 应用启动完成回调（可选）
    console.log('应用已启动!')
  }
})
工具库使用
HTTP 工具
// 在组件中使用
export default {
  async mounted() {
    // GET 请求
    const res = await this.$http.get('/api/users', { page: 1 })
    
    // POST 请求
    const result = await this.$http.post('/api/users', { name: 'test' })
    
    // 文件导出
    await this.$http.fileExport('/api/export', { type: 'excel' })
  }
}

// 在非 Vue 组件中使用
import AdminFramework from './libs/admin-framework.js'
const res = await AdminFramework.http.get('/api/users')
UI 工具
// 在组件中使用
export default {
  methods: {
    handleDelete() {
      // 删除确认
      this.$uiTool.delConfirm(() => {
        // 执行删除逻辑
      })
      
      // 设置响应式字体
      this.$uiTool.setRem()
      
      // 树形转换
      const treeData = this.$uiTool.transformTree(flatData)
    }
  }
}
功能工具
// 在组件中使用
export default {
  methods: {
    downloadFile() {
      // 文件下载
      this.$uiTool.downloadFile(response, 'filename.csv')
    }
  }
}
通用工具
// 在组件中使用
export default {
  methods: {
    formatDate() {
      // 日期格式化
      return this.$tools.formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss')
    },
    
    generateId() {
      // UUID 生成
      return this.$tools.generateUUID()
    },
    
    setCookie() {
      // Cookie 操作
      this.$tools.setCookie('name', 'value')
      const value = this.$tools.getCookie('name')
    }
  }
}
Store 模块使用
user 模块
// 登录
await this.$store.dispatch('user/handleLogin', {
  userFrom: { username, password },
  Main: AdminFramework.Main,
  ParentView: AdminFramework.ParentView,
  Page404: AdminFramework.Page404
})

// 登出
this.$store.dispatch('user/handleLogOut')

// 设置权限菜单
this.$store.dispatch('user/setAuthorityMenus', {
  Main: AdminFramework.Main,
  ParentView: AdminFramework.ParentView,
  Page404: AdminFramework.Page404
})

// 获取用户信息
const userName = this.$store.getters['user/userName']
const token = this.$store.state.user.token
app 模块
// 设置面包屑
this.$store.commit('app/setBreadCrumb', route)

// 获取系统标题
this.$store.dispatch('app/getSysTitle', {
  defaultTitle: '系统名称',
  defaultLogo: '/logo.png'
})

// 获取系统配置
const sysFormModel = this.$store.getters['app/sysFormModel']
🗂️ 组件映射配置
业务组件映射
当后端权限菜单接口返回组件路径时，需要配置映射表：

// 1. 导入业务组件
import GamesComponent from './views/ball/games.vue'
import PayOrdersComponent from './views/order/pay_orders.vue'

// 2. 配置映射
const componentMap = {
  'ball/games': GamesComponent,
  'ball/games.vue': GamesComponent,  // 支持带 .vue 后缀
  'order/pay_orders': PayOrdersComponent,
  'order/pay_orders.vue': PayOrdersComponent
}

// 3. 在 Vue.use 时传入
Vue.use(AdminFramework, {
  config,
  ViewUI,
  VueRouter,
  Vuex,
  createPersistedState,
  componentMap  // 传入组件映射表
})
框架已自动映射的系统组件
以下组件无需配置，框架已自动映射：

✅ home/index - 主页
✅ system/sys_user - 用户管理
✅ system/sys_role - 角色管理
✅ system/sys_log - 日志管理
✅ system/sys_param_setup - 参数设置
✅ system/sys_menu - 菜单管理
✅ system/sys_control - 控制器管理
✅ system/sys_title - 系统标题设置
🌐 全局访问
window.framework
框架实例会自动暴露到全局，可以在任何地方访问：

// 在非 Vue 组件中使用
const http = window.framework.http
const uiTool = window.framework.uiTool
const config = window.framework.config

// HTTP 请求
const res = await window.framework.http.get('/api/users')

// UI 工具
window.framework.uiTool.delConfirm(() => {
  // 删除逻辑
})
Vue 原型方法
在 Vue 组件中可以直接使用：

export default {
  methods: {
    async loadData() {
      // 直接使用 this.$xxx
      const res = await this.$http.get('/api/users')
      this.$uiTool.delConfirm(() => {})
      this.$tools.formatDate(new Date())
      this.$uiTool.downloadFile(response, 'file.csv')
    }
  }
}
📁 文件下载功能
使用 downloadFile 方法
框架提供了便捷的文件下载功能，支持 CSV 等格式：

// 在 Vue 组件中使用
export default {
  methods: {
    // 导出数据
    exportData() {
      // 调用 API 获取数据
      this.$http.fileExport('/api/export', params).then(res => {
        // 使用 downloadFile 下载
        this.$uiTool.downloadFile(res, '数据导出.csv')
        this.$Message.success('导出成功！')
      }).catch(error => {
        this.$Message.error('导出失败：' + error.message)
      })
    }
  }
}
支持的数据格式
CSV 格式：自动处理换行符，保持表格格式
Blob 对象：支持二进制文件下载
文本数据：支持纯文本文件下载
自动处理特性
✅ 换行符保持：CSV 文件的换行符会被正确保持
✅ 文件名处理：自动清理文件名中的特殊字符
✅ 浏览器兼容：支持所有现代浏览器
✅ 内存管理：自动清理临时 URL 对象
🎨 全局组件使用
FloatPanel - 浮动面板组件
FloatPanel 是一个浮动在父窗体上的面板组件，类似于抽屉效果，常用于详情展示、表单编辑等场景。

基本使用：

<template>
  <div>
    <Button @click="showPanel">打开浮动面板</Button>
    
    <FloatPanel
      ref="floatPanel"
      title="详情面板"
      position="right"
      :show-back="true"
      back-text="返回"
      @back="handleBack"
    >
      <div>这里是面板内容</div>
    </FloatPanel>
  </div>
</template>

<script>
export default {
  methods: {
    showPanel() {
      // 通过 ref 调用 show 方法显示面板
      this.$refs.floatPanel.show()
    },
    hidePanel() {
      // 通过 ref 调用 hide 方法隐藏面板
      this.$refs.floatPanel.hide()
    },
    handleBack() {
      console.log('返回按钮被点击')
      this.hidePanel()
    }
  }
}
</script>
属性说明：

属性	类型	默认值	说明
title	String	''	面板标题
width	String/Number	'100%'	面板宽度（字符串或数字），默认占满父容器
height	String/Number	'100%'	面板高度（字符串或数字），默认占满父容器
position	String	'right'	面板位置：left、right、top、bottom、center
showBack	Boolean	true	是否显示返回按钮
showClose	Boolean	false	是否显示关闭按钮
backText	String	'返回'	返回按钮文字
closeOnClickBackdrop	Boolean	false	点击遮罩是否关闭
mask	Boolean	false	是否显示遮罩（默认不显示）
zIndex	Number	1000	层级
方法：

方法	说明	参数
show(callback)	显示面板	callback: 可选的回调函数
hide()	隐藏面板	-
事件：

事件	说明	参数
back	点击返回按钮时触发	-
插槽：

插槽	说明
default	面板主体内容
header-right	头部右侧内容（可用于添加自定义按钮）
位置说明：

left: 从左侧滑入
right: 从右侧滑入（默认）
top: 从顶部滑入
bottom: 从底部滑入
center: 居中显示，带缩放动画
完整示例：

<template>
  <div>
    <Button @click="openDetailPanel">查看详情</Button>
    
    <FloatPanel
      ref="detailPanel"
      title="用户详情"
      position="right"
      :show-back="true"
      :show-close="true"
      back-text="返回"
      @back="handleBack"
    >
      <template #header-right>
        <Button type="primary" @click="handleSave">保存</Button>
      </template>
      
      <div class="detail-content">
        <Form :model="formData" :label-width="100">
          <FormItem label="用户名">
            <Input v-model="formData.username" />
          </FormItem>
          <FormItem label="邮箱">
            <Input v-model="formData.email" />
          </FormItem>
        </Form>
      </div>
    </FloatPanel>
  </div>
</template>

<script>
export default {
  data() {
    return {
      formData: {
        username: '',
        email: ''
      }
    }
  },
  methods: {
    openDetailPanel() {
      this.$refs.detailPanel.show()
    },
    handleBack() {
      this.$refs.detailPanel.hide()
    },
    handleSave() {
      // 保存逻辑
      console.log('保存数据', this.formData)
      this.$Message.success('保存成功')
      this.$refs.detailPanel.hide()
    }
  }
}
</script>
特性说明：

✅ 基于父元素定位，不会遮挡菜单
✅ 宽度和高度默认 100%，占满父容器
✅ 无遮罩背景，完全浮在父页面上
✅ 路由切换或组件销毁时自动关闭
✅ 支持多种位置和动画效果
✅ 支持自定义头部右侧内容
📝 业务开发示例
创建业务页面
<!-- src/views/business/product.vue -->
<template>
  <div>
    <h1>产品管理</h1>
    <Button @click="loadData">加载数据</Button>
    <Tables :columns="columns" :data="list" />
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [],
      columns: [
        { title: 'ID', key: 'id' },
        { title: '名称', key: 'name' },
        { title: '价格', key: 'price' }
      ]
    }
  },
  async mounted() {
    await this.loadData()
  },
  methods: {
    async loadData() {
      // 使用框架提供的 http 工具
      const res = await this.$http.get('/product/list', { page: 1 })
      this.list = res.data
    },
    
    async handleDelete(id) {
      // 使用框架提供的 UI 工具
      this.$uiTool.delConfirm(async () => {
        await this.$http.post('/product/delete', { id })
        this.$Message.success('删除成功')
        await this.loadData()
      })
    }
  }
}
</script>
创建业务 API
// src/api/business/productServer.js
// 注意：不需要 import http，直接使用 http

class ProductServer {
  async getList(params) {
    return await http.get('/product/list', params)
  }
  
  async save(data) {
    return await http.post('/product/save', data)
  }
  
  async delete(id) {
    return await http.post('/product/delete', { id })
  }
  
  async exportCsv(params) {
    return await http.fileExport('/product/export', params)
  }
}

export default new ProductServer()
❓ 常见问题
Q1: 打包后文件太大怎么办？
A: 框架已经将 Vue、VueRouter、Vuex、ViewUI、Axios 设置为外部依赖，不会打包进去。确保在项目中单独安装这些依赖。

Q2: 如何只使用部分功能？
A: 可以按需导入：

import { http, uiTool, tools } from './libs/admin-framework.js'
Q3: 权限菜单中的业务页面显示 404 怎么办？
A: 需要配置组件映射表：

Vue.use(AdminFramework, {
  // ... 其他配置
  componentMap: {
    'ball/games': GamesComponent,
    'order/pay_orders': PayOrdersComponent
  }
})
Q4: 如何自定义配置？
A: 修改 config/index.js 文件：

module.exports = {
  title: '你的系统名称',
  apiUrl: 'http://your-api-url/',
  // ... 其他配置
}
Q5: 如何使用登录功能？
A: 在组件中：

export default {
  methods: {
    async login() {
      await this.$store.dispatch('user/handleLogin', {
        userFrom: { username: 'admin', password: '123456' },
        Main: AdminFramework.Main,
        ParentView: AdminFramework.ParentView,
        Page404: AdminFramework.Page404
      })
      this.$router.push({ name: 'home' })
    }
  }
}
Q6: 需要单独引入样式文件吗？
A: 不需要！ 框架已内置所有样式：

✅ base.less - 基础样式
✅ animate.css - 动画样式
✅ ivewExpand.less - ViewUI 扩展样式
✅ iconfont.css - 字体图标样式
只需引入框架即可：

import AdminFramework from './libs/admin-framework.js'
Vue.use(AdminFramework, { ... })
📦 技术栈
Vue 2.6+
Vue Router 3.x
Vuex 3.x
View Design (iView) 4.x
Axios
Less
Webpack 5
📄 许可证
MIT License

👨‍💻 作者
light

祝开发愉快！ 🎉

如有问题，请查看 Demo 项目示例或联系开发团队。

Powered by Gitea
当前版本:
1.24.6
页面:
273ms
模板:
13ms
许可证
API