diff --git a/README.md b/README.md index a7dde1e..c0b6f47 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,30 @@ -# house +一、系统介绍 +本项目前后端分离 -#### 介绍 -{**以下是 Gitee 平台说明,您可以替换此简介** -Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 -无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} +本系统分为管理员、房主、普通用户三种种角色 -#### 软件架构 -软件架构说明 +用户角色包含以下功能: +登录、注册、房屋管理、房屋资讯、个人中心、密码修改 +我的预约看房管理、我的租赁订单管理、我的房租缴纳管理、我的房屋退租管理、我的报修管理 +房主角色包含以下功能: -#### 安装教程 +登录、注册、房屋租赁管理、租赁订单管理、个人中心、密码修改、房屋缴租管理、房屋退租管理、报修信息管理 +管理员角色包含以下功能: -1. xxxx -2. xxxx -3. xxxx +登录、用户管理、房主管理、房源分类管理、房屋租赁管理、预约看房管理、租赁订单管理、房屋缴租管理、房屋退租管理、报修信息管理 +房屋资讯管理、个人中心、密码修改、轮播图管理 +二、所用技术 +后端技术栈: -#### 使用说明 +springboot +mybatis-plus +MySQL 的 +前端技术栈: -1. xxxx -2. xxxx -3. xxxx +vue 系列 +元素 UI +三、环境介绍 +基础环境 :IDEA/eclipse, JDK 1.8, Mysql5.7及以上,Node.js(14),Maven3.6 -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 特技 - -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +所有项目以及源代码本人均调试运行无问题 可支持远程调试运行 \ No newline at end of file diff --git a/ceshi.txt b/ceshi.txt new file mode 100644 index 0000000..e69de29 diff --git a/fount/App.vue b/fount/App.vue new file mode 100644 index 0000000..9b7670f --- /dev/null +++ b/fount/App.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/fount/assets/css/element-variables.scss b/fount/assets/css/element-variables.scss new file mode 100644 index 0000000..e15eb95 --- /dev/null +++ b/fount/assets/css/element-variables.scss @@ -0,0 +1,9 @@ +/* 改变主题色变量 */ +$--color-primary: #00c292 !default; +$--color-success: #67c23a !default; +$--color-warning: #e6a23c !default; +$--color-danger: #f56c6c !default; +$--color-info: #909399 !default; +/* 改变 icon 字体路径变量,必需 */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; +@import "~element-ui/packages/theme-chalk/src/index"; \ No newline at end of file diff --git a/fount/assets/css/style.scss b/fount/assets/css/style.scss new file mode 100644 index 0000000..bc02be5 --- /dev/null +++ b/fount/assets/css/style.scss @@ -0,0 +1,47 @@ +.form-content { +background: #ffffff; +padding: 10px 10px 0 10px; +} +.table-content { +background: #ffffff; +padding: 0 10px; +} +.pagination-content { +margin-top: 10px; +padding-bottom: 10px; +text-align: right; +} +.detail-form-content{ +background: #ffffff; +padding: 10px; +.el-input{ + min-width: 200px; + max-width: 600px; +} +} +.bg { +position: absolute; +top: 0; +left: 0; +height: 100%; +} +.login-form { +position: absolute; +top: 0; +right: 0; +width: 350px; +height: 100%; +background: #ffffff; +padding: 0 60px; +font-size: 18px; +font-weight: bold; +} +.h1 { +margin-top: 80px; +font-size: 20px; +font-weight: bold; +} +.btn-login { +margin-top: 50px; +width: 100%; +} \ No newline at end of file diff --git a/fount/assets/img/404.png b/fount/assets/img/404.png new file mode 100644 index 0000000..c82d175 Binary files /dev/null and b/fount/assets/img/404.png differ diff --git a/fount/assets/img/avator.png b/fount/assets/img/avator.png new file mode 100644 index 0000000..88526ec Binary files /dev/null and b/fount/assets/img/avator.png differ diff --git a/fount/assets/img/bg.jpg b/fount/assets/img/bg.jpg new file mode 100644 index 0000000..ffbc779 Binary files /dev/null and b/fount/assets/img/bg.jpg differ diff --git a/fount/assets/img/captcha.jpg b/fount/assets/img/captcha.jpg new file mode 100644 index 0000000..85d86da Binary files /dev/null and b/fount/assets/img/captcha.jpg differ diff --git a/fount/assets/img/login.png b/fount/assets/img/login.png new file mode 100644 index 0000000..3e02e64 Binary files /dev/null and b/fount/assets/img/login.png differ diff --git a/fount/assets/img/logo.png b/fount/assets/img/logo.png new file mode 100644 index 0000000..220748c Binary files /dev/null and b/fount/assets/img/logo.png differ diff --git a/fount/assets/img/password.png b/fount/assets/img/password.png new file mode 100644 index 0000000..c808506 Binary files /dev/null and b/fount/assets/img/password.png differ diff --git a/fount/assets/img/role.png b/fount/assets/img/role.png new file mode 100644 index 0000000..3dd3d38 Binary files /dev/null and b/fount/assets/img/role.png differ diff --git a/fount/assets/img/test/jianshe.png b/fount/assets/img/test/jianshe.png new file mode 100644 index 0000000..c44f95d Binary files /dev/null and b/fount/assets/img/test/jianshe.png differ diff --git a/fount/assets/img/test/jiaotong.png b/fount/assets/img/test/jiaotong.png new file mode 100644 index 0000000..af49681 Binary files /dev/null and b/fount/assets/img/test/jiaotong.png differ diff --git a/fount/assets/img/test/nongye.png b/fount/assets/img/test/nongye.png new file mode 100644 index 0000000..6c37c96 Binary files /dev/null and b/fount/assets/img/test/nongye.png differ diff --git a/fount/assets/img/test/weixin.png b/fount/assets/img/test/weixin.png new file mode 100644 index 0000000..2c4eea5 Binary files /dev/null and b/fount/assets/img/test/weixin.png differ diff --git a/fount/assets/img/test/zhifubao.png b/fount/assets/img/test/zhifubao.png new file mode 100644 index 0000000..db35462 Binary files /dev/null and b/fount/assets/img/test/zhifubao.png differ diff --git a/fount/assets/img/test/zhongguo.png b/fount/assets/img/test/zhongguo.png new file mode 100644 index 0000000..fdc7f57 Binary files /dev/null and b/fount/assets/img/test/zhongguo.png differ diff --git a/fount/assets/img/username.png b/fount/assets/img/username.png new file mode 100644 index 0000000..2868d62 Binary files /dev/null and b/fount/assets/img/username.png differ diff --git a/fount/components/SvgIcon/index.vue b/fount/components/SvgIcon/index.vue new file mode 100644 index 0000000..41f7a3b --- /dev/null +++ b/fount/components/SvgIcon/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/fount/components/common/BreadCrumbs.vue b/fount/components/common/BreadCrumbs.vue new file mode 100644 index 0000000..615dcdd --- /dev/null +++ b/fount/components/common/BreadCrumbs.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/fount/components/common/BreadCrumbs.vue.bak b/fount/components/common/BreadCrumbs.vue.bak new file mode 100644 index 0000000..8f5386a --- /dev/null +++ b/fount/components/common/BreadCrumbs.vue.bak @@ -0,0 +1,87 @@ + + + + + diff --git a/fount/components/common/Editor.vue b/fount/components/common/Editor.vue new file mode 100644 index 0000000..f311e43 --- /dev/null +++ b/fount/components/common/Editor.vue @@ -0,0 +1,239 @@ + + + + diff --git a/fount/components/common/FileUpload.vue b/fount/components/common/FileUpload.vue new file mode 100644 index 0000000..8397c60 --- /dev/null +++ b/fount/components/common/FileUpload.vue @@ -0,0 +1,139 @@ + + + diff --git a/fount/components/home/HomeCard.vue b/fount/components/home/HomeCard.vue new file mode 100644 index 0000000..bd5493f --- /dev/null +++ b/fount/components/home/HomeCard.vue @@ -0,0 +1,60 @@ + + + diff --git a/fount/components/home/HomeChart.vue b/fount/components/home/HomeChart.vue new file mode 100644 index 0000000..996768a --- /dev/null +++ b/fount/components/home/HomeChart.vue @@ -0,0 +1,126 @@ + + + diff --git a/fount/components/home/HomeComment.vue b/fount/components/home/HomeComment.vue new file mode 100644 index 0000000..40811a3 --- /dev/null +++ b/fount/components/home/HomeComment.vue @@ -0,0 +1,101 @@ + + + diff --git a/fount/components/home/HomeProgress.vue b/fount/components/home/HomeProgress.vue new file mode 100644 index 0000000..23d3a21 --- /dev/null +++ b/fount/components/home/HomeProgress.vue @@ -0,0 +1,55 @@ + + + diff --git a/fount/components/index/IndexAside.vue b/fount/components/index/IndexAside.vue new file mode 100644 index 0000000..7d1c463 --- /dev/null +++ b/fount/components/index/IndexAside.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/fount/components/index/IndexAsideStatic.vue b/fount/components/index/IndexAsideStatic.vue new file mode 100644 index 0000000..6dcfc75 --- /dev/null +++ b/fount/components/index/IndexAsideStatic.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/fount/components/index/IndexAsideStatic.vue.bak b/fount/components/index/IndexAsideStatic.vue.bak new file mode 100644 index 0000000..99c2ad8 --- /dev/null +++ b/fount/components/index/IndexAsideStatic.vue.bak @@ -0,0 +1,76 @@ + + + + + diff --git a/fount/components/index/IndexAsideSub.vue b/fount/components/index/IndexAsideSub.vue new file mode 100644 index 0000000..bc9095b --- /dev/null +++ b/fount/components/index/IndexAsideSub.vue @@ -0,0 +1,56 @@ + + + diff --git a/fount/components/index/IndexHeader.vue b/fount/components/index/IndexHeader.vue new file mode 100644 index 0000000..eb09c4a --- /dev/null +++ b/fount/components/index/IndexHeader.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/fount/components/index/IndexHeader.vue.bak b/fount/components/index/IndexHeader.vue.bak new file mode 100644 index 0000000..736801f --- /dev/null +++ b/fount/components/index/IndexHeader.vue.bak @@ -0,0 +1,99 @@ + + + + + diff --git a/fount/components/index/IndexMain.vue b/fount/components/index/IndexMain.vue new file mode 100644 index 0000000..5caf6fd --- /dev/null +++ b/fount/components/index/IndexMain.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/fount/main.js b/fount/main.js new file mode 100644 index 0000000..c18f7a0 --- /dev/null +++ b/fount/main.js @@ -0,0 +1,131 @@ +// 引入 Vue 核心库 +import Vue from 'vue' + +// 引入根组件 App.vue +import App from '@/App.vue' + +// 引入 Element UI 组件库(完整引入) +import ElementUI from 'element-ui' + +// 引入 Element UI 的自定义样式文件(SCSS) +import '@/assets/css/element-variables.scss' + +// 引入项目自定义全局样式文件 +import '@/assets/css/style.scss' + +// 引入路由配置模块(静态路由) +import router from '@/router/router-static.js' + +// 引入面包屑导航组件,并注册为全局组件 +import BreadCrumbs from '@/components/common/BreadCrumbs' + +// 引入 ECharts 图表库 +import echarts from 'echarts' + +// 引入 ECharts 主题(macarons) +import 'echarts/theme/macarons.js' + +// 引入封装的 HTTP 请求工具 +import http from '@/utils/http.js' + +// 引入基础配置文件(如 base URL) +import base from '@/utils/base' + +// 引入权限验证工具函数 isAuth +import { isAuth } from '@/utils/utils' + +// 引入本地存储封装工具(storage) +import storage from "@/utils/storage" + +// 引入通用文件上传组件 +import FileUpload from "@/components/common/FileUpload" + +// 引入富文本编辑器组件 +import Editor from "@/components/common/Editor" + +// 引入 API 接口统一管理模块 +import api from '@/utils/api' + +// 引入数据校验工具类 +import * as validate from '@/utils/validate.js' + +// 引入高德地图插件支持 +import VueAMap from 'vue-amap' + +// 引入图标资源 +import '@/icons' + +// 引入 Excel 导出组件 +import JsonExcel from 'vue-json-excel' + +// 引入打印功能库 +import printJS from 'print-js' + +// 引入 MD5 加密库 +import md5 from 'js-md5' + +// 使用高德地图插件 +Vue.use(VueAMap) + +// 初始化高德地图 API 加载器,配置 key 和所需插件 +VueAMap.initAMapApiLoader({ + key: 'ca04cee7ac952691aa67a131e6f0cee0', + plugin: [ + 'AMap.Autocomplete', 'AMap.PlaceSearch', 'AMap.Scale', 'AMap.OverView', + 'AMap.ToolBar', 'AMap.MapType', 'AMap.PolyEditor', 'AMap.CircleEditor', 'AMap.Geocoder' + ], + v: '1.4.4' // 高德 SDK 版本号 +}) + +// 将 validate 工具挂载到 Vue 原型链上,方便全局调用 +Vue.prototype.$validate = validate + +// 将 http 挂载到 Vue 原型链上,用于全局发起请求 +Vue.prototype.$http = http + +// 将 echarts 挂载到 Vue 原型链上,用于全局使用图表 +Vue.prototype.$echarts = echarts + +// 获取基础配置对象并挂载到原型链 +Vue.prototype.$base = base.get() + +// 获取项目名称并挂载到原型链 +Vue.prototype.$project = base.getProjectName() + +// 将本地存储工具挂载到原型链 +Vue.prototype.$storage = storage + +// 将 API 接口模块挂载到原型链 +Vue.prototype.$api = api + +// 将权限判断方法挂载到原型链 +Vue.prototype.isAuth = isAuth + +// 使用 Element UI 插件,设置默认尺寸和 z-index +Vue.use(ElementUI, { size: 'medium', zIndex: 3000 }) + +// 关闭 Vue 启动时的生产提示 +Vue.config.productionTip = false + +// 注册全局组件:面包屑导航 +Vue.component('bread-crumbs', BreadCrumbs) + +// 注册全局组件:文件上传组件 +Vue.component('file-upload', FileUpload) + +// 注册全局组件:富文本编辑器 +Vue.component('editor', Editor) + +// 注册 Excel 导出组件 +Vue.component('downloadExcel', JsonExcel) + +// 将 MD5 方法挂载到 Vue 原型链上,用于加密处理 +Vue.prototype.$md5 = md5 + +// 创建 Vue 实例,启动应用 +new Vue({ + // 渲染根组件 App + render: h => h(App), + // 使用路由配置 + router +}).$mount('#app') diff --git a/fount/modules/config/add-or-update.vue b/fount/modules/config/add-or-update.vue new file mode 100644 index 0000000..e07102c --- /dev/null +++ b/fount/modules/config/add-or-update.vue @@ -0,0 +1,356 @@ + + + diff --git a/fount/modules/config/list.vue b/fount/modules/config/list.vue new file mode 100644 index 0000000..5857629 --- /dev/null +++ b/fount/modules/config/list.vue @@ -0,0 +1,519 @@ + + + diff --git a/fount/modules/discussfangwuxinxi/add-or-update.vue b/fount/modules/discussfangwuxinxi/add-or-update.vue new file mode 100644 index 0000000..5b9d1ba --- /dev/null +++ b/fount/modules/discussfangwuxinxi/add-or-update.vue @@ -0,0 +1,445 @@ + + + diff --git a/fount/modules/discussfangwuxinxi/list.vue b/fount/modules/discussfangwuxinxi/list.vue new file mode 100644 index 0000000..78470b2 --- /dev/null +++ b/fount/modules/discussfangwuxinxi/list.vue @@ -0,0 +1,525 @@ + + + diff --git a/fount/modules/discusswoyaodangfangzhu/add-or-update.vue b/fount/modules/discusswoyaodangfangzhu/add-or-update.vue new file mode 100644 index 0000000..2dd529c --- /dev/null +++ b/fount/modules/discusswoyaodangfangzhu/add-or-update.vue @@ -0,0 +1,332 @@ + + + + diff --git a/fount/modules/discusswoyaodangfangzhu/list.vue b/fount/modules/discusswoyaodangfangzhu/list.vue new file mode 100644 index 0000000..160cc89 --- /dev/null +++ b/fount/modules/discusswoyaodangfangzhu/list.vue @@ -0,0 +1,737 @@ + + + + + diff --git a/fount/modules/fangwubaoxiu/add-or-update.vue b/fount/modules/fangwubaoxiu/add-or-update.vue new file mode 100644 index 0000000..27f09b5 --- /dev/null +++ b/fount/modules/fangwubaoxiu/add-or-update.vue @@ -0,0 +1,309 @@ + + + + + diff --git a/fount/modules/fangwubaoxiu/list.vue b/fount/modules/fangwubaoxiu/list.vue new file mode 100644 index 0000000..d62eba4 --- /dev/null +++ b/fount/modules/fangwubaoxiu/list.vue @@ -0,0 +1,769 @@ + + + + \ No newline at end of file diff --git a/fount/modules/fangwupingjia/add-or-update.vue b/fount/modules/fangwupingjia/add-or-update.vue new file mode 100644 index 0000000..4b0677a --- /dev/null +++ b/fount/modules/fangwupingjia/add-or-update.vue @@ -0,0 +1,585 @@ + + + + + diff --git a/fount/modules/fangwupingjia/list.vue b/fount/modules/fangwupingjia/list.vue new file mode 100644 index 0000000..2e27124 --- /dev/null +++ b/fount/modules/fangwupingjia/list.vue @@ -0,0 +1,813 @@ + + + + + \ No newline at end of file diff --git a/fount/router/router-static.js b/fount/router/router-static.js new file mode 100644 index 0000000..6deec5c --- /dev/null +++ b/fount/router/router-static.js @@ -0,0 +1,175 @@ +import Vue from 'vue'; // 引入 Vue 核心库 +// 配置路由 +import VueRouter from 'vue-router'; // 引入 Vue Router 库 +Vue.use(VueRouter); // 使用 Vue Router 插件 + +// 1. 创建组件 +import Index from '@/views/index'; // 导入首页组件 +import Home from '@/views/home'; // 导入主页组件 +import Login from '@/views/login'; // 导入登录页组件 +import NotFound from '@/views/404'; // 导入 404 页面组件 +import UpdatePassword from '@/views/update-password'; // 导入修改密码页面组件 +import pay from '@/views/pay'; // 导入支付页面组件 +import register from '@/views/register'; // 导入注册页面组件 +import center from '@/views/center'; // 导入个人信息页面组件 +import fangwuleixing from '@/views/modules/fangwuleixing/list'; // 导入房屋类型列表页面组件 +import discussfangwuxinxi from '@/views/modules/discussfangwuxinxi/list'; // 导入房屋信息评论列表页面组件 +import news from '@/views/modules/news/list'; // 导入公告信息列表页面组件 +import weixiuchuli from '@/views/modules/weixiuchuli/list'; // 导入维修处理列表页面组件 +import storeup from '@/views/modules/storeup/list'; // 导入我的收藏管理列表页面组件 +import fangwupingjia from '@/views/modules/fangwupingjia/list'; // 导入房屋评价列表页面组件 +import fangwuxinxi from '@/views/modules/fangwuxinxi/list'; // 导入房屋信息列表页面组件 +import yuyuekanfang from '@/views/modules/yuyuekanfang/list'; // 导入预约看房列表页面组件 +import woyaodangfangzhu from '@/views/modules/woyaodangfangzhu/list'; // 导入我要当房主列表页面组件 +import fangzhu from '@/views/modules/fangzhu/list'; // 导入房主列表页面组件 +import yonghu from '@/views/modules/yonghu/list'; // 导入用户列表页面组件 +import discusswoyaodangfangzhu from '@/views/modules/discusswoyaodangfangzhu/list'; // 导入我要当房主评论列表页面组件 +import fangwubaoxiu from '@/views/modules/fangwubaoxiu/list'; // 导入房屋报修列表页面组件 +import hetongxinxi from '@/views/modules/hetongxinxi/list'; // 导入合同信息列表页面组件 +import messages from '@/views/modules/messages/list'; // 导入留言板管理列表页面组件 +import config from '@/views/modules/config/list'; // 导入轮播图管理列表页面组件 + +// 2. 配置路由 注意:名字 +const routes = [ // 定义路由规则数组 + { + path: '/index', // 路由路径 + name: '首页', // 路由名称 + component: Index, // 对应的组件 + children: [ // 子路由 + { + path: '/', // 默认子路径 + name: '首页', // 子路由名称 + component: Home, // 对应的子组件 + meta: { icon: '', title: 'center' } // 元信息,包含图标和标题 + }, + { + path: '/updatePassword', // 修改密码页面路径 + name: '修改密码', // 路由名称 + component: UpdatePassword, // 对应的组件 + meta: { icon: '', title: 'updatePassword' } // 元信息 + }, + { + path: '/pay', // 支付页面路径 + name: '支付', // 路由名称 + component: pay, // 对应的组件 + meta: { icon: '', title: 'pay' } // 元信息 + }, + { + path: '/center', // 个人信息页面路径 + name: '个人信息', // 路由名称 + component: center, // 对应的组件 + meta: { icon: '', title: 'center' } // 元信息 + }, + { + path: '/fangwuleixing', // 房屋类型页面路径 + name: '房屋类型', // 路由名称 + component: fangwuleixing // 对应的组件 + }, + { + path: '/discussfangwuxinxi', // 房屋信息评论页面路径 + name: '房屋信息评论', // 路由名称 + component: discussfangwuxinxi // 对应的组件 + }, + { + path: '/news', // 公告信息页面路径 + name: '公告信息', // 路由名称 + component: news // 对应的组件 + }, + { + path: '/weixiuchuli', // 维修处理页面路径 + name: '维修处理', // 路由名称 + component: weixiuchuli // 对应的组件 + }, + { + path: '/storeup', // 我的收藏管理页面路径 + name: '我的收藏管理', // 路由名称 + component: storeup // 对应的组件 + }, + { + path: '/fangwupingjia', // 房屋评价页面路径 + name: '房屋评价', // 路由名称 + component: fangwupingjia // 对应的组件 + }, + { + path: '/fangwuxinxi', // 房屋信息页面路径 + name: '房屋信息', // 路由名称 + component: fangwuxinxi // 对应的组件 + }, + { + path: '/yuyuekanfang', // 预约看房页面路径 + name: '预约看房', // 路由名称 + component: yuyuekanfang // 对应的组件 + }, + { + path: '/woyaodangfangzhu', // 我要当房主页面路径 + name: '我要当房主', // 路由名称 + component: woyaodangfangzhu // 对应的组件 + }, + { + path: '/fangzhu', // 房主页面路径 + name: '房主', // 路由名称 + component: fangzhu // 对应的组件 + }, + { + path: '/yonghu', // 用户页面路径 + name: '用户', // 路由名称 + component: yonghu // 对应的组件 + }, + { + path: '/discusswoyaodangfangzhu', // 我要当房主评论页面路径 + name: '我要当房主评论', // 路由名称 + component: discusswoyaodangfangzhu // 对应的组件 + }, + { + path: '/fangwubaoxiu', // 房屋报修页面路径 + name: '房屋报修', // 路由名称 + component: fangwubaoxiu // 对应的组件 + }, + { + path: '/hetongxinxi', // 合同信息页面路径 + name: '合同信息', // 路由名称 + component: hetongxinxi // 对应的组件 + }, + { + path: '/messages', // 留言板管理页面路径 + name: '留言板管理', // 路由名称 + component: messages // 对应的组件 + }, + { + path: '/config', // 轮播图管理页面路径 + name: '轮播图管理', // 路由名称 + component: config // 对应的组件 + } + ] + }, + { + path: '/login', // 登录页面路径 + name: 'login', // 路由名称 + component: Login, // 对应的组件 + meta: { icon: '', title: 'login' } // 元信息 + }, + { + path: '/register', // 注册页面路径 + name: 'register', // 路由名称 + component: register, // 对应的组件 + meta: { icon: '', title: 'register' } // 元信息 + }, + { + path: '/', // 默认跳转路径 + name: '首页', // 路由名称 + redirect: '/index' // 重定向到 /index + }, /* 默认跳转路由 */ + { + path: '*', // 匹配所有未定义的路径 + component: NotFound // 对应的组件为 404 页面 + } +]; + +// 3. 实例化 VueRouter 注意:名字 +const router = new VueRouter({ // 创建 VueRouter 实例 + mode: 'hash', // 使用 hash 模式 + /* hash模式改为history */ + routes // 将路由规则传递给 VueRouter +}); + +export default router; // 导出路由实例 diff --git a/fount/store/store.js b/fount/store/store.js new file mode 100644 index 0000000..e69de29 diff --git a/fount/utils/api.js b/fount/utils/api.js new file mode 100644 index 0000000..0ac0f17 --- /dev/null +++ b/fount/utils/api.js @@ -0,0 +1,17 @@ +const api = { // 定义 API 对象,存储后端接口地址 + // 积分订单相关接口 + orderpage: 'orders/page', // 获取积分订单分页数据 + orderdelete: 'orders/delete', // 删除积分订单 + orderinfo: 'orders/info/', // 获取积分订单详情(需拼接 ID) + ordersave: 'orders/save', // 保存新的积分订单 + orderupdate: 'orders/update', // 更新已有积分订单 + + // 配置相关接口 + configpage: 'config/page', // 获取配置分页数据 + configdelete: 'config/delete', // 删除配置项 + configinfo: 'config/info/', // 获取配置项详情(需拼接 ID) + configsave: 'config/save', // 保存新的配置项 + configupdate: 'config/update' // 更新已有配置项 +}; + +export default api; // 导出 API 对象,供其他模块使用 diff --git a/fount/utils/base.js b/fount/utils/base.js new file mode 100644 index 0000000..d1f842e --- /dev/null +++ b/fount/utils/base.js @@ -0,0 +1,16 @@ +const base = { // 定义一个名为 base 的对象,用于存储基础配置方法 + get() { // 定义 get 方法,返回基础配置信息 + return { // 返回一个包含基础配置的对象 + url: "http://localhost:8080/springboot08hr3/", // 后端服务的基础 URL 地址 + name: "springboot08hr3", // 项目的名称或标识符 + // 退出到首页链接 + indexUrl: 'http://localhost:8080/springboot08hr3/front/index.html' // 前端首页的 URL,用于用户退出登录后跳转 + }; + }, + getProjectName() { // 定义 getProjectName 方法,返回项目名称 + return { // 返回一个包含项目名称的对象 + projectName: "房屋租赁系统" // 项目的中文名称 + }; + } +}; +export default base; // 导出 base 对象,供其他模块使用 diff --git a/fount/utils/http.js b/fount/utils/http.js new file mode 100644 index 0000000..7fee3a0 --- /dev/null +++ b/fount/utils/http.js @@ -0,0 +1,38 @@ +import axios from 'axios'; // 引入 axios 库,用于发送 HTTP 请求 +import router from '@/router/router-static'; // 引入路由配置文件 +import storage from '@/utils/storage'; // 引入存储工具,用于操作本地存储 + +const http = axios.create({ // 创建一个自定义的 axios 实例 + timeout: 1000 * 86400, // 设置请求超时时间为 1 天(单位:毫秒) + withCredentials: true, // 跨域请求时是否携带凭证(如 Cookie) + baseURL: '/springboot08hr3', // 设置请求的基础 URL + headers: { // 设置默认请求头 + 'Content-Type': 'application/json; charset=utf-8' // 指定内容类型为 JSON + } +}); + +// 请求拦截器:在请求发送前进行处理 +http.interceptors.request.use( + config => { + config.headers['Token'] = storage.get('Token'); // 从存储中获取 Token 并添加到请求头中 + return config; // 返回配置对象 + }, + error => { + return Promise.reject(error); // 如果发生错误,返回拒绝的 Promise + } +); + +// 响应拦截器:在接收到响应数据后进行处理 +http.interceptors.response.use( + response => { + if (response.data && response.data.code === 401) { // 如果响应数据存在且状态码为 401(Token 失效) + router.push({ name: 'login' }); // 跳转到登录页面 + } + return response; // 返回响应数据 + }, + error => { + return Promise.reject(error); // 如果发生错误,返回拒绝的 Promise + } +); + +export default http; // 导出自定义的 axios 实例,供其他模块使用 diff --git a/fount/utils/i18n.js b/fount/utils/i18n.js new file mode 100644 index 0000000..322fd1a --- /dev/null +++ b/fount/utils/i18n.js @@ -0,0 +1,12 @@ +// translate router.meta.title, be used in breadcrumb sidebar tagsview // 用于翻译路由的 meta.title,适用于面包屑、侧边栏和标签视图 +export function generateTitle(title) { // 导出生成标题的函数,参数为标题名称 + const hasKey = this.$te('route.' + title); // 检查是否存在对应的语言键值,$te 方法来自 vue-i18n + + if (hasKey) { // 如果存在对应的键值 + // $t :this method from vue-i18n, inject in @/lang/index.js // $t 方法来自 vue-i18n,在 @/lang/index.js 中注入 + const translatedTitle = this.$t('route.' + title); // 使用 $t 方法获取翻译后的标题 + + return translatedTitle; // 返回翻译后的标题 + } + return title; // 如果没有找到对应的键值,返回原始标题 +} diff --git a/fount/utils/menu.js b/fount/utils/menu.js new file mode 100644 index 0000000..50ce039 --- /dev/null +++ b/fount/utils/menu.js @@ -0,0 +1,324 @@ +const menu = { // 定义一个 menu 对象,用于存储菜单数据和方法 + list() { // 定义 list 方法,返回菜单数据 + return [ // 返回一个包含角色及其对应菜单的数组 + { // 第一个角色:管理员 + backMenu: [ // 后台菜单列表 + { // 用户管理 + child: [{ // 子菜单 + buttons: ["新增", "查看", "修改", "删除"], // 按钮权限 + menu: "用户", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "yonghu" // 数据表名 + }], + menu: "用户管理" // 父菜单名称 + }, + { // 房主管理 + child: [{ // 子菜单 + buttons: ["新增", "查看", "修改", "删除"], // 按钮权限 + menu: "房主", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangzhu" // 数据表名 + }], + menu: "房主管理" // 父菜单名称 + }, + { // 房屋类型管理 + child: [{ // 子菜单 + buttons: ["新增", "查看", "修改", "删除"], // 按钮权限 + menu: "房屋类型", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwuleixing" // 数据表名 + }], + menu: "房屋类型管理" // 父菜单名称 + }, + { // 房屋信息管理 + child: [{ // 子菜单 + buttons: ["新增", "查看", "修改", "删除", "查看评论"], // 按钮权限 + menu: "房屋信息", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwuxinxi" // 数据表名 + }], + menu: "房屋信息管理" // 父菜单名称 + }, + { // 预约看房管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "删除", "审核", "合同"], // 按钮权限 + menu: "预约看房", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "yuyuekanfang" // 数据表名 + }], + menu: "预约看房管理" // 父菜单名称 + }, + { // 合同信息管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "删除"], // 按钮权限 + menu: "合同信息", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "hetongxinxi" // 数据表名 + }], + menu: "合同信息管理" // 父菜单名称 + }, + { // 房屋报修管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "删除", "审核", "处理"], // 按钮权限 + menu: "房屋报修", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwubaoxiu" // 数据表名 + }], + menu: "房屋报修管理" // 父菜单名称 + }, + { // 维修处理管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "删除"], // 按钮权限 + menu: "维修处理", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "weixiuchuli" // 数据表名 + }], + menu: "维修处理管理" // 父菜单名称 + }, + { // 房屋评价管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "删除", "审核", "报表"], // 按钮权限 + menu: "房屋评价", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwupingjia" // 数据表名 + }], + menu: "房屋评价管理" // 父菜单名称 + }, + { // 我要当房主管理 + child: [{ // 子菜单 + buttons: ["查看", "审核", "删除", "修改"], // 按钮权限 + menu: "我要当房主", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "woyaodangfangzhu" // 数据表名 + }], + menu: "我要当房主管理" // 父菜单名称 + }, + { // 留言板管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "回复", "删除"], // 按钮权限 + menu: "留言板管理", // 菜单名称 + tableName: "messages" // 数据表名 + }], + menu: "留言板管理" // 父菜单名称 + }, + { // 系统管理 + child: [{ // 子菜单 + buttons: ["新增", "查看", "修改", "删除"], // 按钮权限 + menu: "公告信息", // 菜单名称 + tableName: "news" // 数据表名 + }, { + buttons: ["新增", "查看", "修改", "删除"], // 按钮权限 + menu: "轮播图管理", // 菜单名称 + tableName: "config" // 数据表名 + }], + menu: "系统管理" // 父菜单名称 + } + ], + frontMenu: [ // 前台菜单列表 + { // 房屋信息模块 + child: [{ // 子菜单 + buttons: ["查看", "预约"], // 按钮权限 + menu: "房屋信息列表", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwuxinxi" // 数据表名 + }], + menu: "房屋信息模块" // 父菜单名称 + }, + { // 我要当房主模块 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "我要当房主列表", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "woyaodangfangzhu" // 数据表名 + }], + menu: "我要当房主模块" // 父菜单名称 + } + ], + hasBackLogin: "是", // 是否有后台登录功能 + hasBackRegister: "否", // 是否有后台注册功能 + hasFrontLogin: "否", // 是否有前台登录功能 + hasFrontRegister: "否", // 是否有前台注册功能 + roleName: "管理员", // 角色名称 + tableName: "users" // 数据表名 + }, + { // 第二个角色:用户 + backMenu: [ // 后台菜单列表 + { // 预约看房管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "删除"], // 按钮权限 + menu: "预约看房", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "yuyuekanfang" // 数据表名 + }], + menu: "预约看房管理" // 父菜单名称 + }, + { // 合同信息管理 + child: [{ // 子菜单 + buttons: ["查看", "审核", "支付", "报修", "评价"], // 按钮权限 + menu: "合同信息", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "hetongxinxi" // 数据表名 + }], + menu: "合同信息管理" // 父菜单名称 + }, + { // 房屋报修管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "删除", "审核", "处理"], // 按钮权限 + menu: "房屋报修", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwubaoxiu" // 数据表名 + }], + menu: "房屋报修管理" // 父菜单名称 + }, + { // 维修处理管理 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "维修处理", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "weixiuchuli" // 数据表名 + }], + menu: "维修处理管理" // 父菜单名称 + }, + { // 房屋评价管理 + child: [{ // 子菜单 + buttons: ["查看", "修改", "删除"], // 按钮权限 + menu: "房屋评价", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwupingjia" // 数据表名 + }], + menu: "房屋评价管理" // 父菜单名称 + }, + { // 我要当房主管理 + child: [{ // 子菜单 + buttons: ["新增", "查看", "修改", "删除", "审核", "查看评论"], // 按钮权限 + menu: "我要当房主", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "woyaodangfangzhu" // 数据表名 + }], + menu: "我要当房主管理" // 父菜单名称 + }, + { // 我的收藏管理 + child: [{ // 子菜单 + buttons: ["查看", "删除"], // 按钮权限 + menu: "我的收藏管理", // 菜单名称 + tableName: "storeup" // 数据表名 + }], + menu: "我的收藏管理" // 父菜单名称 + } + ], + frontMenu: [ // 前台菜单列表 + { // 房屋信息模块 + child: [{ // 子菜单 + buttons: ["查看", "预约"], // 按钮权限 + menu: "房屋信息列表", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwuxinxi" // 数据表名 + }], + menu: "房屋信息模块" // 父菜单名称 + }, + { // 我要当房主模块 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "我要当房主列表", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "woyaodangfangzhu" // 数据表名 + }], + menu: "我要当房主模块" // 父菜单名称 + } + ], + hasBackLogin: "是", // 是否有后台登录功能 + hasBackRegister: "否", // 是否有后台注册功能 + hasFrontLogin: "是", // 是否有前台登录功能 + hasFrontRegister: "是", // 是否有前台注册功能 + roleName: "用户", // 角色名称 + tableName: "yonghu" // 数据表名 + }, + { // 第三个角色:房主 + backMenu: [ // 后台菜单列表 + { // 房屋信息管理 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "房屋信息", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwuxinxi" // 数据表名 + }], + menu: "房屋信息管理" // 父菜单名称 + }, + { // 预约看房管理 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "预约看房", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "yuyuekanfang" // 数据表名 + }], + menu: "预约看房管理" // 父菜单名称 + }, + { // 合同信息管理 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "合同信息", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "hetongxinxi" // 数据表名 + }], + menu: "合同信息管理" // 父菜单名称 + }, + { // 房屋报修管理 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "房屋报修", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwubaoxiu" // 数据表名 + }], + menu: "房屋报修管理" // 父菜单名称 + }, + { // 维修处理管理 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "维修处理", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "weixiuchuli" // 数据表名 + }], + menu: "维修处理管理" // 父菜单名称 + }, + { // 房屋评价管理 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "房屋评价", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwupingjia" // 数据表名 + }], + menu: "房屋评价管理" // 父菜单名称 + } + ], + frontMenu: [ // 前台菜单列表 + { // 房屋信息模块 + child: [{ // 子菜单 + buttons: ["查看", "预约"], // 按钮权限 + menu: "房屋信息列表", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "fangwuxinxi" // 数据表名 + }], + menu: "房屋信息模块" // 父菜单名称 + }, + { // 我要当房主模块 + child: [{ // 子菜单 + buttons: ["查看"], // 按钮权限 + menu: "我要当房主列表", // 菜单名称 + menuJump: "列表", // 跳转类型 + tableName: "woyaodangfangzhu" // 数据表名 + }], + menu: "我要当房主模块" // 父菜单名称 + } + ], + hasBackLogin: "是", // 是否有后台登录功能 + hasBackRegister: "是", // 是否有后台注册功能 + hasFrontLogin: "否", // 是否有前台登录功能 + hasFrontRegister: "否", // 是否有前台注册功能 + roleName: "房主", // 角色名称 + tableName: "fangzhu" // 数据表名 + } + ]; + } +}; + +export default menu; // 导出 menu 对象,供其他模块使用 diff --git a/fount/utils/storage.js b/fount/utils/storage.js new file mode 100644 index 0000000..754a51e --- /dev/null +++ b/fount/utils/storage.js @@ -0,0 +1,16 @@ +const storage = { // 定义一个名为 storage 的对象,用于操作浏览器的 localStorage + set(key, value) { // 定义 set 方法,用于存储键值对 + localStorage.setItem(key, JSON.stringify(value)); // 将 value 转换为 JSON 字符串后存储到 localStorage 中 + }, + get(key) { // 定义 get 方法,用于获取指定 key 的值 + return localStorage.getItem(key) ? localStorage.getItem(key).replace('"', '').replace('"', '') : ""; // 获取值并移除可能存在的引号,如果不存在则返回空字符串 + }, + getObj(key) { // 定义 getObj 方法,用于获取指定 key 的值并解析为对象 + return localStorage.getItem(key) ? JSON.parse(localStorage.getItem(key)) : null; // 如果存在对应的值,则解析为 JSON 对象,否则返回 null + }, + remove(key) { // 定义 remove 方法,用于删除指定 key 的值 + localStorage.removeItem(key); // 从 localStorage 中移除指定的 key + } +}; + +export default storage; // 导出 storage 对象,供其他模块使用 diff --git a/fount/utils/utils.js b/fount/utils/utils.js new file mode 100644 index 0000000..1e364f8 --- /dev/null +++ b/fount/utils/utils.js @@ -0,0 +1,39 @@ +import storage from './storage'; // 导入 storage 工具模块,用于操作本地存储 +import menu from './menu'; // 导入 menu 工具模块,用于获取菜单数据 + +/** + * 是否有权限 + * @param {*} tableName 表名,用于匹配菜单中的表名 + * @param {*} key 权限按钮名称,用于检查用户是否有该权限 + */ +export function isAuth(tableName, key) { // 定义 isAuth 函数,用于检查用户是否有指定权限 + let role = storage.get("role"); // 从本地存储中获取当前用户角色 + if (!role) { // 如果未获取到角色 + role = '管理员'; // 默认设置为“管理员” + } + let menus = menu.list(); // 获取菜单列表数据 + for (let i = 0; i < menus.length; i++) { // 遍历菜单列表 + if (menus[i].roleName == role) { // 如果当前菜单的角色与用户角色匹配 + for (let j = 0; j < menus[i].backMenu.length; j++) { // 遍历后台菜单 + for (let k = 0; k < menus[i].backMenu[j].child.length; k++) { // 遍历子菜单 + if (tableName == menus[i].backMenu[j].child[k].tableName) { // 如果表名匹配 + let buttons = menus[i].backMenu[j].child[k].buttons.join(','); // 将按钮权限数组转为逗号分隔的字符串 + return buttons.indexOf(key) !== -1 || false; // 检查权限按钮是否存在于按钮权限字符串中,返回布尔值 + } + } + } + } + } + // 注释掉的代码部分:另一种实现方式,逻辑类似 + // for(let i=0;i + +
+ + + + + #foreach($column in $columns) + + + #if($column.type == "日") + + + + + + + #elseif( $column.type == "下" ) + + + + + + + + + #elseif($column.type=="图") + + + + + + #elseif($column.type=="视") + + + + + + #elseif($column.type=="多") + + + #elseif($column.columnName=="sfsh") + + + #elseif($column.towStep=="是") + + + + + + + + + #elseif($column.type=="联" && $column.level==1) + + + + + + + + #elseif($column.type=="联" && $column.level==2) + + + + + + + + #elseif($column.type=="联" && $column.level==3) + + + + + + + + #elseif($column.columnName=='reversetime') + + + + + + + #else + + + + #end + #end + + + #foreach($column in $columns) + #if($column.columnName != $pk.columnName) + #if($column.type=="多") + + + + + #end + #end + #end + + + + 提交 + 取消 + + +
+ + + + + diff --git a/fount/vm/base.js.vm b/fount/vm/base.js.vm new file mode 100644 index 0000000..89d364a --- /dev/null +++ b/fount/vm/base.js.vm @@ -0,0 +1,11 @@ +// 定义 base 对象,用于存储基础配置信息(如 API 地址、模块名称) +const base = { + // url:当前模块的请求基础地址,使用 schemaname 动态替换模块名 + url : "http://localhost:8080/${schemaname}/", + + // name:当前模块的名称,同样由 schemaname 变量动态填充 + name: "${schemaname}" +} + +// 导出 base 对象,供其他组件或模块引用 +export default base diff --git a/fount/vm/http.js.vm b/fount/vm/http.js.vm new file mode 100644 index 0000000..b161939 --- /dev/null +++ b/fount/vm/http.js.vm @@ -0,0 +1,51 @@ +// 引入 axios 库用于发起 HTTP 请求 +import axios from 'axios' + +// 引入静态路由模块,用于在请求失败或 token 失效时跳转到登录页 +import router from '@/router/router-static' + +// 引入本地存储工具模块,用于操作 Token 等信息 +import storage from '@/utils/storage' + +// 创建一个 axios 实例,配置基础参数 +const http = axios.create({ + timeout: 1000 * 86400, // 超时时间设置为一天(单位:毫秒) + withCredentials: true, // 允许携带 cookies + baseURL: '/${schemaname}', // 请求的基础路径,使用 schemaname 动态替换模块名 + headers: { // 默认请求头 + 'Content-Type': 'application/json; charset=utf-8' // 指定内容类型为 JSON + } +}) + +// 请求拦截器:在每次请求发出前做一些处理 +http.interceptors.request.use(config => { + // 在请求头中添加 Token 字段,从 storage 中获取当前用户的 Token + config.headers['Token'] = storage.get('Token') // 请求头带上token + + // 返回修改后的请求配置对象 + return config +}, error => { + // 请求错误时拦截并返回 Promise reject + return Promise.reject(error) +}) + +// 响应拦截器:在每次响应到达前做一些处理 +http.interceptors.response.use(response => { + // 如果响应数据中有 code 且值为 401,表示 Token 失效 + if (response.data && response.data.code === 401) { + // 清除登录信息(该方法未启用,可根据需要实现) + // clearLoginInfo() + + // 跳转到登录页面 + router.push({ name: 'login' }) + } + + // 返回响应结果 + return response +}, error => { + // 响应出错时拦截并返回 Promise reject + return Promise.reject(error) +}) + +// 导出自定义的 axios 实例,供其他组件或模块调用 +export default http diff --git a/fount/vm/list.vue.vm b/fount/vm/list.vue.vm new file mode 100644 index 0000000..5aacfe6 --- /dev/null +++ b/fount/vm/list.vue.vm @@ -0,0 +1,398 @@ + + + + + diff --git a/fount/vm/login.vue.vm b/fount/vm/login.vue.vm new file mode 100644 index 0000000..e1aed0d --- /dev/null +++ b/fount/vm/login.vue.vm @@ -0,0 +1,109 @@ + + + + + diff --git a/fount/vm/menu.js.vm b/fount/vm/menu.js.vm new file mode 100644 index 0000000..8736a98 --- /dev/null +++ b/fount/vm/menu.js.vm @@ -0,0 +1,11 @@ +// 定义一个名为 menu 的对象,用于管理菜单数据 +const menu = { + // list 方法用于返回菜单列表数据 + list() { + // 返回 ${roleMenus},该变量由模板引擎动态替换为不同角色的菜单配置 + return ${roleMenus} + } +} + +// 导出 menu 对象,供其他模块引用 +export default menu diff --git a/fount/vm/router-static.js.vm b/fount/vm/router-static.js.vm new file mode 100644 index 0000000..035e411 --- /dev/null +++ b/fount/vm/router-static.js.vm @@ -0,0 +1,54 @@ +// 引入 Vue 核心库 +import Vue from 'vue'; + +// 配置路由:引入 VueRouter 插件 +import VueRouter from 'vue-router'; +Vue.use(VueRouter); // 安装 VueRouter 插件 + +// 1. 创建组件:导入需要用到的页面组件 +import Index from '@/views/index'; // 主页框架(包含头部、侧边栏等) +import Home from '@/views/home'; // 首页内容组件 +import Login from '@/views/login'; // 登录页组件 +import NotFound from '@/views/404'; // 404 页面组件 + +// 动态导入后台菜单相关的模块列表组件(使用 Velocity 模板循环生成) +#foreach($tableName in $backMenuTables) + import ${tableName} from '@/views/modules/${tableName}/list' +#end + +// 2. 配置路由规则 +const routes = [ + { + path: '/index', name:'index', component: Index, children: [ + // 默认子路由:访问 /index 自动跳转到首页 + { + path: '/', + name: 'home', + component: Home + }, + // 动态生成后台菜单对应的路由(每个表一个路由) + #foreach($tableName in $backMenuTables) + ,{ + path: '/${tableName}', + name: '${tableName}', + component: ${tableName} + } + #end + ] + }, + // 登录页路由 + { path: '/login', name:'login', component: Login }, + // 默认跳转至首页 + { path: '/', redirect: '/index/' }, + // 所有未匹配路径都跳转到 404 页面 + { path: '*', component: NotFound } +]; + +// 3. 实例化 VueRouter 路由对象 +const router = new VueRouter({ + mode: 'hash', /* 使用 hash 模式,也可改为 history 模式 */ + routes /* 简写形式,相当于 routes: routes */ +}) + +// 导出路由实例,供 main.js 使用 +export default router; diff --git a/fount/vm/vue.config.js.vm b/fount/vm/vue.config.js.vm new file mode 100644 index 0000000..8ec2af5 --- /dev/null +++ b/fount/vm/vue.config.js.vm @@ -0,0 +1,65 @@ +// 引入 path 模块,用于处理路径 +const path = require('path') + +// 定义 resolve 函数,用于快速拼接路径,__dirname 表示当前文件所在目录 +function resolve(dir) { + return path.join(__dirname, dir) +} + +// 定义 publicPath 函数,根据环境变量决定资源引用路径 +function publicPath(){ + if (process.env.NODE_ENV == 'production') { + // 生产环境使用相对路径 "././" + return "././"; + } else { + // 开发环境使用绝对路径 "/" + return "/"; + } +} + +// vue.config.js 配置导出对象 +module.exports = { + // 设置项目公共资源的基础路径,调用 publicPath() 动态判断 + publicPath: publicPath(), + + // 国际化配置:如果需要切换语言包,可以取消下面插件的注释,并调整路径 + configureWebpack: { + // plugins: [ + // new webpack.NormalModuleReplacementPlugin( + // /element-ui[\/\\]lib[\/\\]locale[\/\\]lang[\/\\]zh-CN/, + // 'element-ui/lib/locale/lang/en' + // ) + // ] + + // 配置 Webpack 的解析规则 + resolve: { + alias: { + // 设置别名 '@' 指向 src 目录,方便导入模块 + '@': resolve('src') + } + } + }, + + // 开发服务器配置(仅在开发环境生效) + devServer: { + host: "0.0.0.0", // 指定开发服务器监听的 host,默认是 localhost + port: 8081, // 指定开发服务器运行端口为 8081 + hot: true, // 启用热更新功能(修改代码后无需刷新页面) + https: false, // 是否启用 HTTPS 模式(默认不启用) + + // 配置请求代理,解决跨域问题 + proxy: { + // 所有以 '/${schemaname}' 开头的请求都会被代理到目标服务器 + '/${schemaname}': { + target: 'http://localhost:8080/${schemaname}/', // 要代理的目标服务器地址 + changeOrigin: true, // 允许改变请求头中的 origin 字段为目标地址 + secure: false, // 不验证 SSL 证书(适用于自签名 SSL 证书) + + // 请求路径重写:将路径中开头的 '/${schemaname}' 替换为空字符串 + pathRewrite: { + '^/${schemaname}': '' + } + } + } + } +}