├── .browserslistrc
├── .gitignore
├── .prettierrc
├── LICENSE
├── README.md
├── babel.config.js
├── package-lock.json
├── package.json
├── postcss.config.js
├── public
└── index.html
├── src
├── App.vue
├── api
│ ├── category.js
│ ├── checkin.js
│ ├── checkout.js
│ ├── employee.js
│ ├── finance.js
│ ├── login.js
│ ├── position.js
│ ├── room.js
│ ├── roomtype.js
│ ├── service.js
│ └── uploadFile.js
├── assets
│ ├── css
│ │ ├── color-dark.css
│ │ ├── icon.css
│ │ ├── main.css
│ │ └── theme-green
│ │ │ ├── color-green.css
│ │ │ ├── fonts
│ │ │ ├── element-icons.ttf
│ │ │ └── element-icons.woff
│ │ │ └── index.css
│ ├── img
│ │ ├── 280.jpg
│ │ ├── img.jpg
│ │ ├── login-bg.jpg
│ │ └── login.jpg
│ └── logo.png
├── components
│ ├── Pagenation
│ │ └── index.vue
│ ├── common
│ │ ├── Header.vue
│ │ ├── Home.vue
│ │ ├── Sidebar.vue
│ │ ├── Tags.vue
│ │ ├── bus.js
│ │ └── directives.js
│ └── page
│ │ ├── Cropper.vue
│ │ ├── Dashboard.vue
│ │ ├── Login.vue
│ │ ├── Permission.vue
│ │ └── updatePwd.vue
├── main.js
├── pub
│ ├── checkin
│ │ ├── addCheckin.vue
│ │ ├── checkout.vue
│ │ ├── details.vue
│ │ ├── index.vue
│ │ ├── updateDialog.vue
│ │ └── updateroom.vue
│ ├── checkout
│ │ ├── details.vue
│ │ └── index.vue
│ ├── employee
│ │ ├── addEmp.vue
│ │ ├── addPosition.vue
│ │ ├── employee.vue
│ │ ├── index.vue
│ │ ├── position.vue
│ │ └── update.vue
│ ├── finance
│ │ └── index.vue
│ ├── room
│ │ ├── addRoomType.vue
│ │ ├── addroom.vue
│ │ ├── index.vue
│ │ ├── room.vue
│ │ └── roomtype.vue
│ ├── roomservice
│ │ ├── addService.vue
│ │ ├── historyService.vue
│ │ └── index.vue
│ └── searchroom
│ │ └── index.vue
├── router
│ └── index.js
├── store
│ ├── getters.js
│ ├── index.js
│ └── modules
│ │ ├── app.js
│ │ ├── menu.js
│ │ ├── permission.js
│ │ └── user.js
├── styles
│ └── index.less
└── utils
│ ├── formateDate.js
│ └── request.js
└── vue.config.js
/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | not ie <= 8
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | /dist
4 | example.html
5 | favicon.ico
6 | # local env files
7 | .env.local
8 | .env.*.local
9 |
10 | # Log files
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 |
15 | # Editor directories and files
16 | .idea
17 | .vscode
18 | *.suo
19 | *.ntvs*
20 | *.njsproj
21 | *.sln
22 | *.sw*
23 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "tabWidth": 4,
3 | "singleQuote": true,
4 | "trailingComma": "none",
5 | "printWidth": 140
6 | }
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019-2020 HotelManagement
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # hotelManegement
2 |
3 | 基于 Vue + Element UI 的酒店管理系统解决方案。前端仓库地址(https://github.com/mynameisly/HotelManagement.git)
4 |
5 | > fontend-manage(Vue + Element UI) + backend (springboot) 的版本正在开发中,仓库地址:[hotelManagement](http://120.24.186.190/XXX)
6 |
7 | ## 前言
8 |
9 | 酒店管理系统,基于 vue.js,使用 vue-cli3 脚手架,引用 Element UI 组件库,方便开发快速简洁好看的组件。分离颜色样式,支持手动切换主题色,而且很方便使用自定义主题色。
10 |
11 | ## 功能模块
12 |
13 | - [x] 登录/注销
14 | - [x] 员工管理
15 | - [x] 客房信息
16 | - [x] 入住信息
17 | - [x] 退房办理
18 | - [x] 客房服务
19 | - [x] 富文本编辑器
20 | - [x] 财务管理
21 |
22 | ## 安装步骤
23 |
24 | ```
25 | git clone https://github.com/mynameisly/HotelManagement.git or download zip // 把模板下载到本地
26 | cd hotelManagement // 进入模板目录
27 | npm install // 安装项目依赖,等待安装完成之后,安装失败可用 cnpm 或 yarn
28 |
29 | // 开启服务器,浏览器访问 http://localhost:8080
30 | npm run serve
31 |
32 | // 执行构建命令,生成的dist文件夹放在服务器下即可访问
33 | npm run build
34 | ```
35 |
36 | ## 其他注意事项
37 |
38 | ### 一、如何切换主题色呢?
39 |
40 | 第一步:打开 src/main.js 文件,找到引入 element 样式的地方,换成浅绿色主题。
41 |
42 | ```javascript
43 | import 'element-ui/lib/theme-default/index.css'; // 默认主题
44 | // import './assets/css/theme-green/index.css'; // 浅绿色主题
45 | ```
46 |
47 | 第二步:打开 src/App.vue 文件,找到 style 标签引入样式的地方,切换成浅绿色主题。
48 |
49 | ```javascript
50 | @import "./assets/css/main.css";
51 | @import "./assets/css/color-dark.css"; /*深色主题*/
52 | /*@import "./assets/css/theme-green/color-green.css"; !*浅绿色主题*!*/
53 | ```
54 |
55 | 第三步:打开 src/components/common/Sidebar.vue 文件,找到 el-menu 标签,把 background-color/text-color/active-text-color 属性去掉即可。
56 |
57 |
--------------------------------------------------------------------------------
/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/app'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-manage-system",
3 | "version": "4.2.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "npm run serve",
7 | "serve": "vue-cli-service serve",
8 | "build": "vue-cli-service build"
9 | },
10 | "dependencies": {
11 | "axios": "^0.18.0",
12 | "babel-polyfill": "^6.26.0",
13 | "element-ui": "^2.11.0",
14 | "less": "^3.11.1",
15 | "vue": "^2.6.10",
16 | "vue-cropperjs": "^3.0.0",
17 | "vue-router": "^3.0.3",
18 | "vue-schart": "^2.0.0",
19 | "vuex": "^3.1.2"
20 | },
21 | "devDependencies": {
22 | "@vue/cli-plugin-babel": "^3.9.0",
23 | "@vue/cli-service": "^3.9.0",
24 | "less-loader": "^5.0.0",
25 | "vue-template-compiler": "^2.6.10"
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | autoprefixer: {}
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 酒店管理系统
11 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/src/api/category.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | // 查询分类列表
4 | export const getCategoryList = params => { return request({ url: '/HotelManagement/json/category/list', method: 'get', params: params }) }
5 |
6 | // 新增分类
7 | export const addCategory = params => { return request({ url: '/HotelManagement/json/category/add', method: 'post', params: params }) }
8 |
9 | // 修改分类
10 | export const updateCategory = params => { return request({ url: '/HotelManagement/json/category/update', method: 'put', params: params }) }
11 |
12 | // 删除分类
13 | export const delCategory = categoryId => { return request({ url: '/HotelManagement/json/category/delete?categoryId=' + categoryId, method: 'delete', params: categoryId }) }
14 |
--------------------------------------------------------------------------------
/src/api/checkin.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | // 查询入住列表
4 | export const getCheckinList = params => { return request({ url: '/HotelManagement/json/checkin/list', method: 'get', params: params }) }
5 |
6 | // 新增入住列表
7 | export const addCheckin = (params,headers) => { return request({ url: '/HotelManagement/json/checkin/add', method: 'post', data: params, headers: headers }) }
8 |
9 | // 根据ID查询入住列表
10 | export const getCheckinById = CheckinId => { return request({ url: '/HotelManagement/json/checkin/getCheckinById?checkinId=' + CheckinId, method: 'get', params: CheckinId }) }
11 |
12 | // 修改入住天数
13 | export const updateCheckin = params => { return request({ url: '/HotelManagement/json/checkin/update', method: 'put', params: params }) }
14 |
15 | // 换房
16 | export const updateRoom = params => { return request({ url: '/HotelManagement/json/checkin/updateRoom', method: 'put', params: params }) }
--------------------------------------------------------------------------------
/src/api/checkout.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | // 查询退房记录列表
4 | export const getCheckoutList = params => { return request({ url: '/HotelManagement/json/checkout/list', method: 'get', params: params }) }
5 |
6 | // 根据ID查询退房记录
7 | export const getCheckoutById = checkoutId => { return request({ url: '/HotelManagement/json/checkout/getCheckoutById?checkoutId=' + checkoutId, method: 'get', params: checkoutId }) }
8 |
9 | // 退房
10 | export const addCheckout = params => { return request({ url: '/HotelManagement/json/checkout/add', method: 'post', params: params }) }
--------------------------------------------------------------------------------
/src/api/employee.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 | // 员工查询
3 | export const getempList = params => { return request({ url: '/HotelManagement/json/employee/list', method: 'get', params: params }) }
4 |
5 | // 新增员工
6 | export const addemp = params => { return request({ url: '/HotelManagement/json/employee/add', method: 'post', params: params }) }
7 |
8 | // 根据员工ID查询员工信息
9 | export const getEmployeeById = employeeId => { return request({ url: '/HotelManagement/json/employee/getEmployeeById?employeeId=' + employeeId , method: 'get', params: employeeId }) }
10 |
11 | // 修改员工信息
12 | export const update = params => { return request({ url: '/HotelManagement/json/employee/update', method: 'put', params: params }) }
13 |
14 | // 重置密码
15 | export const resetPassword = employeeId => { return request({ url: '/HotelManagement/json/employee/resetPassword?employeeId=' + employeeId, method: 'put', params: employeeId }) }
16 |
17 | // 修改密码
18 | export const updatePassword = params => { return request({ url: '/HotelManagement/json/employee/updatePassword', method: 'put', params: params }) }
19 |
20 | // 删除员工
21 | export const delemp = employeeId => { return request({ url: '/HotelManagement/json/employee/delete?employeeId=' + employeeId, method: 'delete', params: employeeId }) }
22 |
--------------------------------------------------------------------------------
/src/api/finance.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | // 财务核算
4 | export const getfinList = params => { return request({ url: '/HotelManagement/json/finance/check', method: 'get', params: params }) }
5 |
--------------------------------------------------------------------------------
/src/api/login.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 | // 登录
3 | export const login = params => { return request({ url: '/HotelManagement/json/login/direct', method: 'get', params: params }) }
4 | // 退出登录
5 | export const loginout = params => { return request({ url: '/HotelManagement/json/login/out', method: 'get', params: params }) }
6 | // 获取当前登录用户的信息
7 | export const getLoginEmployee = params => { return request({ url: '/HotelManagement/json/login/getLoginEmployee', method: 'get', params: params }) }
--------------------------------------------------------------------------------
/src/api/position.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 | // 职位查询
3 | export const getPositionList = params => { return request({ url: '/HotelManagement/json/position/list', method: 'get', params: params }) }
4 |
5 | // 职位新增
6 | export const addPosition = params => { return request({ url: '/HotelManagement/json/position/add', method: 'post', params: params }) }
7 |
8 | // 职位修改
9 | export const updatePosition = params => { return request({ url: '/HotelManagement/json/position/update', method: 'put', params: params }) }
10 |
11 | // 职位删除
12 | export const deletePosition = positionId => { return request({ url: '/HotelManagement/json/position/delete?positionId=' + positionId, method: 'delete', params: positionId }) }
--------------------------------------------------------------------------------
/src/api/room.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | // 查询客房列表
4 | export const getroomList = params => { return request({ url: '/HotelManagement/json/room/list', method: 'get', params: params }) }
5 |
6 | // 新增客房列表
7 | export const addroom = params => { return request({ url: '/HotelManagement/json/room/add', method: 'post', params: params }) }
8 |
9 | // 根据ID查询客房列表
10 | export const getroomById = roomId => { return request({ url: '/HotelManagement/json/room/getRoomById?roomId=' + roomId, method: 'get', params: roomId }) }
11 |
12 | // 修改客房列表
13 | export const updateroom = params => { return request({ url: '/HotelManagement/json/room/update', method: 'put', params: params }) }
14 |
15 | // 删除客房列表
16 | export const delroom = roomId => { return request({ url: '/HotelManagement/json/room/delete?roomId=' + roomId, method: 'delete', params: roomId }) }
--------------------------------------------------------------------------------
/src/api/roomtype.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 | // 查询客房类型列表
3 | export const getRoomTypeList = params => { return request({ url: '/HotelManagement/json/roomType/list', method: 'get', params: params }) }
4 |
5 | // 新增客房类型列表
6 | export const addRoomType = params => { return request({ url: '/HotelManagement/json/roomType/add', method: 'post', params: params }) }
7 |
8 | // 根据ID查询客房类型列表
9 | export const getRoomTypeById = roomTypeId => { return request({ url: '/HotelManagement/json/roomType/getRoomTypeById?roomTypeId=' + roomTypeId, method: 'get', params: roomTypeId }) }
10 |
11 | // 查询所有客房类型简要信息列表
12 | export const getAllRoomTypeList = params => { return request({ url: '/HotelManagement/json/roomType/listAll', method: 'get', params: params }) }
13 |
14 | // 修改客房类型列表
15 | export const updateRoomType = params => { return request({ url: '/HotelManagement/json/roomType/update', method: 'put', params: params }) }
16 |
17 | // 删除客房类型列表
18 | export const delRoomType = roomTypeId => { return request({ url: '/HotelManagement/json/roomType/delete?roomTypeId=' + roomTypeId, method: 'delete', params: roomTypeId }) }
--------------------------------------------------------------------------------
/src/api/service.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 |
3 | // 查询正在进行的客房服务列表
4 | export const getServiceList = params => { return request({ url: '/HotelManagement/json/customerService/list', method: 'get', params: params }) }
5 |
6 | // 查询客房服务历史记录列表
7 | export const getServiceHistoryList = params => { return request({ url: '/HotelManagement/json/customerService/listHistory', method: 'get', params: params }) }
8 |
9 | // 新增客房服务列表
10 | export const addService = params => { return request({ url: '/HotelManagement/json/customerService/add', method: 'post', params: params }) }
11 |
12 | // 完成客房服务
13 | export const finishService = id => { return request({ url: '/HotelManagement/json/customerService/finishService?id=' + id, method: 'put', params: id }) }
14 |
15 | // 修改客房服务列表
16 | export const updateService = params => { return request({ url: '/HotelManagement/json/customerService/update', method: 'put', params: params }) }
17 |
18 | // 删除客房服务列表
19 | export const delService = customerServiceId => { return request({ url: '/HotelManagement/json/customerService/delete?customerServiceId=' + customerServiceId, method: 'delete', params: customerServiceId }) }
--------------------------------------------------------------------------------
/src/api/uploadFile.js:
--------------------------------------------------------------------------------
1 | import request from '@/utils/request'
2 | // 查询客房列表
3 | export const uploadFile = (params,headers) => { return request({ url: '/HotelManagement/json/file/add', method: 'post', data: params, headers:headers }) }
--------------------------------------------------------------------------------
/src/assets/css/color-dark.css:
--------------------------------------------------------------------------------
1 | .header{
2 | background-color: #242f42;
3 | }
4 | .login-wrap{
5 | background: #324157;
6 | }
7 | .plugins-tips{
8 | background: #eef1f6;
9 | }
10 | .plugins-tips a{
11 | color: #20a0ff;
12 | }
13 | .el-upload--text em {
14 | color: #20a0ff;
15 | }
16 | .pure-button{
17 | background: #20a0ff;
18 | }
19 | .tags-li.active {
20 | border: 1px solid #409EFF;
21 | background-color: #409EFF;
22 | }
23 | .message-title{
24 | color: #20a0ff;
25 | }
26 | .collapse-btn:hover{
27 | background: rgb(40,52,70);
28 | }
--------------------------------------------------------------------------------
/src/assets/css/icon.css:
--------------------------------------------------------------------------------
1 |
2 | [class*=" el-icon-lx"], [class^=el-icon-lx] {
3 | font-family: lx-iconfont!important;
4 | }
--------------------------------------------------------------------------------
/src/assets/css/main.css:
--------------------------------------------------------------------------------
1 | * {
2 | margin: 0;
3 | padding: 0;
4 | }
5 |
6 | html,
7 | body,
8 | #app,
9 | .wrapper {
10 | width: 100%;
11 | height: 100%;
12 | overflow: hidden;
13 | }
14 |
15 | body {
16 | font-family: 'PingFang SC', "Helvetica Neue", Helvetica, "microsoft yahei", arial, STHeiTi, sans-serif;
17 | }
18 |
19 | a {
20 | text-decoration: none
21 | }
22 |
23 |
24 | .content-box {
25 | position: absolute;
26 | left: 250px;
27 | right: 0;
28 | top: 70px;
29 | bottom: 0;
30 | padding-bottom: 30px;
31 | -webkit-transition: left .3s ease-in-out;
32 | transition: left .3s ease-in-out;
33 | background: #f0f0f0;
34 | }
35 |
36 | .content {
37 | width: auto;
38 | height: 100%;
39 | padding: 10px;
40 | overflow-y: scroll;
41 | box-sizing: border-box;
42 | }
43 |
44 | .content-collapse {
45 | left: 65px;
46 | }
47 |
48 | .container {
49 | padding: 30px;
50 | background: #fff;
51 | border: 1px solid #ddd;
52 | border-radius: 5px;
53 | }
54 |
55 | .crumbs {
56 | margin: 10px 0;
57 | }
58 |
59 | .el-table th {
60 | background-color: #f5f7fa !important;
61 | }
62 |
63 | .pagination {
64 | margin: 20px 0;
65 | text-align: right;
66 | }
67 |
68 | .plugins-tips {
69 | padding: 20px 10px;
70 | margin-bottom: 20px;
71 | }
72 |
73 | .el-button+.el-tooltip {
74 | margin-left: 10px;
75 | }
76 |
77 | .el-table tr:hover {
78 | background: #f6faff;
79 | }
80 |
81 | .mgb20 {
82 | margin-bottom: 20px;
83 | }
84 |
85 | .move-enter-active,
86 | .move-leave-active {
87 | transition: opacity .5s;
88 | }
89 |
90 | .move-enter,
91 | .move-leave {
92 | opacity: 0;
93 | }
94 |
95 | /*BaseForm*/
96 |
97 | .form-box {
98 | width: 600px;
99 | }
100 |
101 | .form-box .line {
102 | text-align: center;
103 | }
104 |
105 | .el-time-panel__content::after,
106 | .el-time-panel__content::before {
107 | margin-top: -7px;
108 | }
109 |
110 | .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) {
111 | padding-bottom: 0;
112 | }
113 |
114 | /*Upload*/
115 |
116 | .pure-button {
117 | width: 150px;
118 | height: 40px;
119 | line-height: 40px;
120 | text-align: center;
121 | color: #fff;
122 | border-radius: 3px;
123 | }
124 |
125 | .g-core-image-corp-container .info-aside {
126 | height: 45px;
127 | }
128 |
129 | .el-upload--text {
130 | background-color: #fff;
131 | border: 1px dashed #d9d9d9;
132 | border-radius: 6px;
133 | box-sizing: border-box;
134 | width: 360px;
135 | height: 180px;
136 | text-align: center;
137 | cursor: pointer;
138 | position: relative;
139 | overflow: hidden;
140 | }
141 |
142 | .el-upload--text .el-icon-upload {
143 | font-size: 67px;
144 | color: #97a8be;
145 | margin: 40px 0 16px;
146 | line-height: 50px;
147 | }
148 |
149 | .el-upload--text {
150 | color: #97a8be;
151 | font-size: 14px;
152 | text-align: center;
153 | }
154 |
155 | .el-upload--text em {
156 | font-style: normal;
157 | }
158 |
159 | /*VueEditor*/
160 |
161 | .ql-container {
162 | min-height: 400px;
163 | }
164 |
165 | .ql-snow .ql-tooltip {
166 | transform: translateX(117.5px) translateY(10px) !important;
167 | }
168 |
169 | .editor-btn {
170 | margin-top: 20px;
171 | }
172 |
173 | /*markdown*/
174 |
175 | .v-note-wrapper .v-note-panel {
176 | min-height: 500px;
177 | }
--------------------------------------------------------------------------------
/src/assets/css/theme-green/color-green.css:
--------------------------------------------------------------------------------
1 | .header{
2 | background-color: #07c4a8;
3 | }
4 | .login-wrap{
5 | background: rgba(56, 157, 170, 0.82);;
6 | }
7 | .plugins-tips{
8 | background: #f2f2f2;
9 | }
10 | .plugins-tips a{
11 | color: #00d1b2;
12 | }
13 | .el-upload--text em {
14 | color: #00d1b2;
15 | }
16 | .pure-button{
17 | background: #00d1b2;
18 | }
19 | .pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus, .pagination > .active > span, .pagination > .active > span:hover, .pagination > .active > span:focus {
20 | background-color: #00d1b2 !important;
21 | border-color: #00d1b2 !important;
22 | }
23 | .tags-li.active {
24 | border: 1px solid #00d1b2;
25 | background-color: #00d1b2;
26 | }
27 | .collapse-btn:hover{
28 | background: #00d1b2;
29 | }
--------------------------------------------------------------------------------
/src/assets/css/theme-green/fonts/element-icons.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mynameisly/HotelManagement/a2c2179d7dcb06e8f83e523aabd9eba14d70bcce/src/assets/css/theme-green/fonts/element-icons.ttf
--------------------------------------------------------------------------------
/src/assets/css/theme-green/fonts/element-icons.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mynameisly/HotelManagement/a2c2179d7dcb06e8f83e523aabd9eba14d70bcce/src/assets/css/theme-green/fonts/element-icons.woff
--------------------------------------------------------------------------------
/src/assets/img/280.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mynameisly/HotelManagement/a2c2179d7dcb06e8f83e523aabd9eba14d70bcce/src/assets/img/280.jpg
--------------------------------------------------------------------------------
/src/assets/img/img.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mynameisly/HotelManagement/a2c2179d7dcb06e8f83e523aabd9eba14d70bcce/src/assets/img/img.jpg
--------------------------------------------------------------------------------
/src/assets/img/login-bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mynameisly/HotelManagement/a2c2179d7dcb06e8f83e523aabd9eba14d70bcce/src/assets/img/login-bg.jpg
--------------------------------------------------------------------------------
/src/assets/img/login.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mynameisly/HotelManagement/a2c2179d7dcb06e8f83e523aabd9eba14d70bcce/src/assets/img/login.jpg
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mynameisly/HotelManagement/a2c2179d7dcb06e8f83e523aabd9eba14d70bcce/src/assets/logo.png
--------------------------------------------------------------------------------
/src/components/Pagenation/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
13 |
14 |
15 |
16 |
40 |
46 |
47 |
--------------------------------------------------------------------------------
/src/components/common/Header.vue:
--------------------------------------------------------------------------------
1 |
2 |
39 |
40 |
142 |
143 |
206 |
--------------------------------------------------------------------------------
/src/components/common/Home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
52 |
53 |
--------------------------------------------------------------------------------
/src/components/common/Sidebar.vue:
--------------------------------------------------------------------------------
1 |
2 |
50 |
51 |
52 |
178 |
179 |
198 |
--------------------------------------------------------------------------------
/src/components/common/Tags.vue:
--------------------------------------------------------------------------------
1 |
2 |
23 |
24 |
25 |
113 |
114 |
115 |
187 |
--------------------------------------------------------------------------------
/src/components/common/bus.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | // 使用 Event Bus
4 | const bus = new Vue();
5 |
6 | export default bus;
--------------------------------------------------------------------------------
/src/components/common/directives.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | // v-dialogDrag: 弹窗拖拽属性
4 | Vue.directive('dialogDrag', {
5 | bind(el, binding, vnode, oldVnode) {
6 | const dialogHeaderEl = el.querySelector('.el-dialog__header');
7 | const dragDom = el.querySelector('.el-dialog');
8 |
9 | dialogHeaderEl.style.cssText += ';cursor:move;'
10 | dragDom.style.cssText += ';top:0px;'
11 |
12 | // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
13 | const sty = (() => {
14 | if (window.document.currentStyle) {
15 | return (dom, attr) => dom.currentStyle[attr];
16 | } else {
17 | return (dom, attr) => getComputedStyle(dom, false)[attr];
18 | }
19 | })()
20 |
21 | dialogHeaderEl.onmousedown = (e) => {
22 | // 鼠标按下,计算当前元素距离可视区的距离
23 | const disX = e.clientX - dialogHeaderEl.offsetLeft;
24 | const disY = e.clientY - dialogHeaderEl.offsetTop;
25 |
26 | const screenWidth = document.body.clientWidth; // body当前宽度
27 | const screenHeight = document.documentElement.clientHeight; // 可见区域高度(应为body高度,可某些环境下无法获取)
28 |
29 | const dragDomWidth = dragDom.offsetWidth; // 对话框宽度
30 | const dragDomheight = dragDom.offsetHeight; // 对话框高度
31 |
32 | const minDragDomLeft = dragDom.offsetLeft;
33 | const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;
34 |
35 | const minDragDomTop = dragDom.offsetTop;
36 | const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;
37 |
38 |
39 | // 获取到的值带px 正则匹配替换
40 | let styL = sty(dragDom, 'left');
41 | let styT = sty(dragDom, 'top');
42 |
43 | // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
44 | if (styL.includes('%')) {
45 | styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100);
46 | styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100);
47 | } else {
48 | styL = +styL.replace(/\px/g, '');
49 | styT = +styT.replace(/\px/g, '');
50 | };
51 |
52 | document.onmousemove = function (e) {
53 | // 通过事件委托,计算移动的距离
54 | let left = e.clientX - disX;
55 | let top = e.clientY - disY;
56 |
57 | // 边界处理
58 | if (-(left) > minDragDomLeft) {
59 | left = -(minDragDomLeft);
60 | } else if (left > maxDragDomLeft) {
61 | left = maxDragDomLeft;
62 | }
63 |
64 | if (-(top) > minDragDomTop) {
65 | top = -(minDragDomTop);
66 | } else if (top > maxDragDomTop) {
67 | top = maxDragDomTop;
68 | }
69 |
70 | // 移动当前元素
71 | dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;
72 | };
73 |
74 | document.onmouseup = function (e) {
75 | document.onmousemove = null;
76 | document.onmouseup = null;
77 | };
78 | }
79 | }
80 | })
81 |
--------------------------------------------------------------------------------
/src/components/page/Cropper.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
![]()
6 |
选择图片
7 |
8 |
9 |
10 |
11 |
12 |
13 |
17 |
18 |
19 |
20 |
21 |
22 |
81 |
82 |
--------------------------------------------------------------------------------
/src/components/page/Dashboard.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |

8 |
9 |
{{item.number}}
10 |
{{item.position.positionName}}
11 |
12 |
13 |
14 | 创建时间:
15 | {{item.createTime}}
16 |
17 |
18 | 姓名:
19 | {{item.readName}}
20 |
21 |
22 | 联系方式:
23 | {{item.telPhone}}
24 |
25 |
26 | 出生日期:
27 | {{item.birthday}}
28 |
29 |
30 | QQ:
31 | {{item.qq}}
32 |
33 |
34 | 微信:
35 | {{item.weiXin}}
36 |
37 |
38 | 邮箱:
39 | {{item.email}}
40 |
41 |
42 | 个人简介:
43 | {{item.introduce}}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
93 |
94 |
95 |
205 |
--------------------------------------------------------------------------------
/src/components/page/Login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
酒店管理系统
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
18 |
19 |
20 |
21 |
22 | 登录
23 |
24 |
25 |
26 |
27 |
28 |
29 |
119 |
120 |
--------------------------------------------------------------------------------
/src/components/page/Permission.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 权限测试
6 |
7 |
8 |
9 |
管理员权限页面
10 |
只有用 admin 账号登录的才拥有管理员权限,才能进到这个页面,其他账号想进来都会跳到403页面,重新用管理员账号登录才有权限。
11 |
想尝试一下,请退出登录,随便输入个账号名,再进来试试看。
12 |
13 |
14 |
15 |
16 |
17 |
24 |
25 |
--------------------------------------------------------------------------------
/src/components/page/updatePwd.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
8 |
9 |
10 |
11 |
15 |
16 |
17 |
18 | 修 改 密 码
23 |
24 |
25 |
26 |
27 |
28 | 返回首页
29 |
30 |
31 |
32 | 返回上一页
33 |
34 |
35 |
36 |
37 |
38 |
92 |
93 |
112 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import App from './App.vue';
3 | import router from './router';
4 | import ElementUI from 'element-ui';
5 | import '@/styles/index.less' // global css
6 | import 'element-ui/lib/theme-chalk/index.css'; // 默认主题
7 | // import './assets/css/theme-green/index.css'; // 浅绿色主题
8 | import './assets/css/icon.css';
9 | import './components/common/directives';
10 | import 'babel-polyfill';
11 | import store from './store'
12 |
13 | Vue.config.productionTip = false;
14 | Vue.use(ElementUI, {
15 | size: 'small'
16 | });
17 |
18 | //使用钩子函数对路由进行权限跳转
19 | // router.beforeEach((to, from, next) => {
20 | // document.title = `${to.meta.title} | HotelManagement`;
21 | // const role = localStorage.getItem('ms_username');
22 | // if (!role && to.path !== '/login') {
23 | // next('/login');
24 | // } else if (to.meta.permission) {
25 | // // 如果是管理员权限则可进入,这里只是简单的模拟管理员权限而已
26 | // role === 'admin' ? next() : next('/403');
27 | // } else {
28 | // // 简单的判断IE10及以下不进入富文本编辑器,该组件不兼容
29 | // if (navigator.userAgent.indexOf('MSIE') > -1 && to.path === '/editor') {
30 | // Vue.prototype.$alert('vue-quill-editor组件不兼容IE10及以下浏览器,请使用更高版本的浏览器查看', '浏览器不兼容通知', {
31 | // confirmButtonText: '确定'
32 | // });
33 | // } else {
34 | // next();
35 | // }
36 | // }
37 | // });
38 |
39 | new Vue({
40 | router,
41 | store,
42 | render: h => h(App)
43 | }).$mount('#app');
44 |
--------------------------------------------------------------------------------
/src/pub/checkin/addCheckin.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 | 男
47 | 女
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 | 男
77 | 女
78 |
79 |
80 |
81 | 删除
82 |
83 |
84 |
85 |
86 | 添加房客
87 |
88 |
89 |
90 | 取消
91 | 提交
92 |
93 |
94 |
95 |
96 |
97 |
248 |
249 |
252 |
--------------------------------------------------------------------------------
/src/pub/checkin/checkout.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 如果实际退房时间与预期退房时间出现偏差,可适当调整房费
7 |
8 |
9 |
10 |
11 |
12 |
13 | 取消
14 | 提交
15 |
16 |
17 |
18 |
19 |
20 |
60 |
61 |
64 |
--------------------------------------------------------------------------------
/src/pub/checkin/details.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
73 |
74 |
75 |
76 |
77 |
78 |
79 | 取消
80 |
81 |
82 |
83 |
84 |
85 |
136 |
137 |
140 |
--------------------------------------------------------------------------------
/src/pub/checkin/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
48 |
49 |
50 |
51 |
52 |
53 | -
54 |
55 |
56 |
57 |
58 |
59 | 查询
60 | 新增
61 |
62 |
63 |
64 |
65 |
73 |
74 |
75 |
76 | {{ (page.currentPage - 1) * page.pageSize + scope.$index + 1 }}
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 | 查看详情
91 | 换房
97 | 修改
103 | 退房
109 |
110 |
111 |
112 |
addcheckin(item)"/>
113 | checkout(item)"/>
114 |
115 | updateCheckin(item)"/>
116 | updateRoom(item)"/>
117 | handlePageChange(item)" />
118 |
119 |
120 |
121 |
333 |
334 |
337 |
--------------------------------------------------------------------------------
/src/pub/checkin/updateDialog.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 取消
11 | 提交
12 |
13 |
14 |
15 |
16 |
17 |
67 |
68 |
71 |
--------------------------------------------------------------------------------
/src/pub/checkin/updateroom.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
14 |
15 |
16 |
17 | 取消
18 | 提交
19 |
20 |
21 |
22 |
23 |
24 |
95 |
96 |
99 |
--------------------------------------------------------------------------------
/src/pub/checkout/details.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 | 取消
84 |
85 |
86 |
87 |
88 |
89 |
131 |
132 |
135 |
--------------------------------------------------------------------------------
/src/pub/checkout/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
33 |
34 |
35 |
36 |
42 |
43 |
44 |
45 |
46 |
47 | 查询
48 |
49 |
50 |
51 |
52 |
60 |
61 |
62 |
63 | {{ (page.currentPage - 1) * page.pageSize + scope.$index + 1 }}
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | 查看详情
79 |
80 |
81 |
82 |
handlePageChange(item)" />
83 |
84 |
85 |
86 |
87 |
208 |
209 |
212 |
--------------------------------------------------------------------------------
/src/pub/employee/addEmp.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
16 |
17 |
18 | 男
19 | 女
20 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
43 |
44 |
45 |
46 |
47 |
48 | 新增员工后,初始密码为123abc
49 |
50 |
51 |
52 | 取消
53 | 提交
54 |
55 |
56 |
57 |
58 |
59 |
205 |
206 | //
239 |
240 |
265 |
--------------------------------------------------------------------------------
/src/pub/employee/addPosition.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | 取消
14 | 提交
15 |
16 |
17 |
18 |
19 |
20 |
73 |
74 |
77 |
--------------------------------------------------------------------------------
/src/pub/employee/employee.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | 查询
26 | 新增
27 |
28 |
29 |
30 |
31 |
32 |
40 |
41 |
42 |
43 | {{ (page.currentPage - 1) * page.pageSize + scope.$index + 1 }}
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | 修改
68 | 重置密码
73 | 删除
79 |
80 |
81 |
82 |
addemp(item)"/>
83 | update(item)"/>
84 | handlePageChange(item)" />
85 |
86 |
87 |
88 |
247 |
248 |
251 |
--------------------------------------------------------------------------------
/src/pub/employee/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
42 |
--------------------------------------------------------------------------------
/src/pub/employee/position.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | 查询
18 | 新增
19 |
20 |
21 |
22 |
23 |
24 |
32 |
33 |
34 |
35 |
36 | {{ (page.currentPage - 1) * page.pageSize + scope.$index + 1 }}
37 |
38 |
39 |
40 |
41 |
42 |
43 | 修改
48 | 删除
54 |
55 |
56 |
57 |
addPosition(item)"/>
58 | updatePosition(item)"/>
59 | handlePageChange(item)" />
60 |
61 |
62 |
63 |
177 |
178 |
181 |
--------------------------------------------------------------------------------
/src/pub/employee/update.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 | 男
14 | 女
15 |
16 |
17 |
18 |
19 |
20 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 | 取消
60 | 提交
61 |
62 |
63 |
64 |
65 |
66 |
220 |
221 |
254 |
--------------------------------------------------------------------------------
/src/pub/finance/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
14 |
15 |
16 |
17 |
18 | 查询
19 |
20 |
21 |
22 |
23 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
152 |
153 |
159 |
--------------------------------------------------------------------------------
/src/pub/room/addRoomType.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
27 |
28 |
29 |
30 |
31 |
32 | 有窗
33 | 无窗
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
58 | 点击上传
59 | 只能上传jpg/png文件,且不超过500kb
60 |
61 |
62 |
63 |
64 | 取消
65 | 提交
66 |
67 |
68 |
69 |
70 |
71 |
194 |
195 |
198 |
--------------------------------------------------------------------------------
/src/pub/room/addroom.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 | 有窗
57 | 无窗
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
76 | 点击上传
77 | 只能上传jpg/png文件,且不超过500kb
78 |
79 |
80 |
81 |
82 | 取消
83 | 提交
84 |
85 |
86 |
87 |
88 |
89 |
244 |
245 |
248 |
--------------------------------------------------------------------------------
/src/pub/room/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
42 |
--------------------------------------------------------------------------------
/src/pub/room/roomtype.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | -
37 |
38 |
39 |
40 |
41 | 查询
42 | 新增
43 |
44 |
45 |
46 |
54 |
55 |
56 |
57 | {{ (page.currentPage - 1) * page.pageSize + scope.$index + 1 }}
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | 查看详情
79 | 查看图片
85 | 删除
91 |
92 |
93 |
99 |
100 |
![图片暂时无法找到]()
101 |
102 |
103 |
104 |
141 |
addroomtype(item,fileList)"/>
142 | updateroomtype(item,fileList)"/>
143 | handlePageChange(item)" />
144 |
145 |
146 |
147 |
287 |
288 |
313 |
--------------------------------------------------------------------------------
/src/pub/roomservice/addService.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
15 |
16 |
17 |
18 |
19 |
20 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | 取消
34 | 提交
35 |
36 |
37 |
38 |
39 |
40 |
136 |
137 |
140 |
--------------------------------------------------------------------------------
/src/pub/roomservice/historyService.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
33 |
34 |
35 |
36 | 查询
37 |
38 |
39 |
40 |
41 |
42 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 | handlePageChange(item)" />
58 |
59 | 取消
60 |
61 |
62 |
63 |
64 |
65 |
155 |
156 |
159 |
--------------------------------------------------------------------------------
/src/pub/roomservice/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
37 |
38 |
39 |
40 |
41 |
42 | 查询
43 |
44 |
45 |
46 |
47 |
48 |
49 | 新增
50 | 查询历史服务
51 |
52 |
53 |
54 |
55 |
56 |
64 |
65 |
66 | {{ (page.currentPage - 1) * page.pageSize + scope.$index + 1 }}
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 | 修改
81 | 服务完成
86 | 删除
92 |
93 |
94 |
95 |
addservice(item)"/>
96 | updateservice(item)"/>
97 |
98 | handlePageChange(item)" />
99 |
100 |
101 |
102 |
278 |
279 |
282 |
--------------------------------------------------------------------------------
/src/pub/searchroom/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 | -
59 |
60 |
61 |
62 |
63 |
64 | 查询
65 |
66 |
67 |
68 |
69 |
77 |
78 |
79 | {{ (page.currentPage - 1) * page.pageSize + scope.$index + 1 }}
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | 查看图片
101 |
102 |
103 |
109 |
110 |
![]()
111 |
112 |
113 |
114 |
handlePageChange(item)" />
115 |
116 |
117 |
118 |
209 |
210 |
226 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Router from 'vue-router';
3 |
4 | Vue.use(Router);
5 |
6 | export default new Router({
7 | routes: [
8 | {
9 | path: '/',
10 | redirect: '/login'
11 | },
12 | {
13 | path: '/',
14 | component: () => import(/* webpackChunkName: "home" */ '../components/common/Home.vue'),
15 | meta: { title: 'Home' },
16 | children: [
17 | {
18 | path: '/dashboard',
19 | component: () => import(/* webpackChunkName: "dashboard" */ '../components/page/Dashboard.vue'),
20 | meta: { title: '系统首页' }
21 | },
22 | {
23 | path: '/checkin',
24 | component: () => import(/* webpackChunkName: "icon" */ '../pub/checkin/index'),
25 | meta: { title: '入住信息' }
26 | },
27 | {
28 | path: '/employee',
29 | component: () => import(/* webpackChunkName: "table" */ '../pub/employee/index'),
30 | meta: { title: '员工管理' }
31 | },
32 | {
33 | path: '/roomservice',
34 | component: () => import(/* webpackChunkName: "tabs" */ '../pub/roomservice/index'),
35 | meta: { title: '客户服务' }
36 | },
37 | {
38 | path: '/room',
39 | component: () => import(/* webpackChunkName: "form" */ '../pub/room/index'),
40 | meta: { title: '客房管理' }
41 | },
42 | {
43 | path: '/searchroom',
44 | component: () => import(/* webpackChunkName: "form" */ '../pub/searchroom/index'),
45 | meta: { title: '客房查询' }
46 | },
47 | {
48 | path: '/cropper',
49 | component: () => import(/* webpackChunkName: "upload" */ '../components/page/Cropper.vue'),
50 | meta: { title: '文件上传(可裁剪)' }
51 | },
52 | {
53 | path: '/checkout',
54 | component: () => import(/* webpackChunkName: "i18n" */ '../pub/checkout/index'),
55 | meta: { title: '退房记录' }
56 | },,
57 | {
58 | path: '/finance',
59 | component: () => import(/* webpackChunkName: "donate" */ '../pub/finance/index.vue'),
60 | meta: { title: '财务管理' }
61 | },
62 | {
63 | path: '/updatePwd',
64 | component: () => import(/* webpackChunkName: "donate" */ '../components/page/updatePwd.vue'),
65 | meta: { title: '修改密码' }
66 | }
67 | ]
68 | },
69 | {
70 | path: '/login',
71 | component: () => import(/* webpackChunkName: "login" */ '../components/page/Login.vue'),
72 | meta: { title: '登录' }
73 | },
74 | {
75 | path: '*',
76 | redirect: '/404'
77 | }
78 | ]
79 | });
80 |
--------------------------------------------------------------------------------
/src/store/getters.js:
--------------------------------------------------------------------------------
1 | const getters = {
2 | // sidebar: state => state.app.sidebar,
3 | // themeColor: state => state.app.themeColor,
4 | // token: state => state.user.token,
5 | employeeId: state => state.user.employeeId,
6 | number: state => state.user.number,
7 | // usertype: state => state.user.usertype,
8 | headImg: state => state.user.headImg,
9 | // roles: state => state.user.roles,
10 | // 当前用户具有的权限路由列表
11 | // permisstion_routes: state => state.permission.routes,
12 |
13 | // 菜单信息
14 | // menuType: state => state.menu.menuType,
15 | // typeList: state => state.menu.typeList,
16 | // menuList: state => state.menu.menuList
17 | }
18 | export default getters
19 |
--------------------------------------------------------------------------------
/src/store/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Vuex from 'vuex'
3 | import getters from './getters'
4 | import app from './modules/app'
5 | import user from './modules/user'
6 | import menu from './modules/menu'
7 | import permission from './modules/permission'
8 |
9 | Vue.use(Vuex)
10 |
11 | const store = new Vuex.Store({
12 | modules: {
13 | app,
14 | user,
15 | menu,
16 | permission
17 | },
18 | getters
19 | })
20 |
21 | export default store
22 |
--------------------------------------------------------------------------------
/src/store/modules/app.js:
--------------------------------------------------------------------------------
1 |
2 | // const state = {
3 | // sidebar: {
4 | // opened: true
5 | // },
6 | // themeColor: '#33a0bb'
7 | // }
8 |
9 | // const mutations = {
10 | // // sidebar切换
11 | // TOGGLE_SIDEBAR: state => {
12 | // state.sidebar.opened = !state.sidebar.opened
13 | // },
14 | // CLOSE_SIDEBAR: (state) => {
15 | // state.sidebar.opened = false
16 | // },
17 | // OPEN_SIDEBAR: (state) => {
18 | // state.sidebar.opened = true
19 | // },
20 | // // 主题切换
21 | // TOGGLE_COLOR: (state, color) => {
22 | // state.themeColor = color;
23 | // // 动态修改homeicon颜色
24 | // const homeicon = document.getElementById("homeIcon");
25 | // homeicon.style.color = state.themeColor;
26 | // const homespan = document.querySelector("#homeIcon+span");
27 | // homespan.style.color = state.themeColor;
28 | // }
29 | // }
30 |
31 | // const actions = {
32 | // toggleSideBar({ commit }) {
33 | // commit('TOGGLE_SIDEBAR')
34 | // },
35 | // closeSideBar({ commit }) {
36 | // commit('CLOSE_SIDEBAR')
37 | // },
38 | // openSideBar({ commit }) {
39 | // commit('OPEN_SIDEBAR')
40 | // },
41 | // toggleColor({ commit }, color) {
42 | // commit('TOGGLE_COLOR', color)
43 | // }
44 | // }
45 |
46 | // export default {
47 | // namespaced: true,
48 | // state,
49 | // mutations,
50 | // actions
51 | // }
52 |
--------------------------------------------------------------------------------
/src/store/modules/menu.js:
--------------------------------------------------------------------------------
1 | const state = {
2 | menuType: '',
3 | typeList: '',
4 | menuList: ''
5 | }
6 |
7 | const mutations = {
8 | MENU_MUTATION: (state, menudata) => {
9 | state.menuType = menudata.menuType;
10 | state.typeList = menudata.typeList;
11 | state.menuList = menudata.menuList
12 | }
13 | }
14 |
15 | const actions = {
16 | setMenu({ commit }, menudata) {
17 | commit("MENU_MUTATION", menudata)
18 | }
19 | }
20 |
21 | export default {
22 | namespaced: true,
23 | state,
24 | mutations,
25 | actions
26 | }
27 |
--------------------------------------------------------------------------------
/src/store/modules/permission.js:
--------------------------------------------------------------------------------
1 | // import { asyncRoutes, constantRoutes } from '../../router'
2 |
3 | // const state = {
4 | // routes: [],
5 | // addRoutes: []
6 | // }
7 |
8 | // const mutations = {
9 | // SET_ROUTES: (state, routes) => {
10 | // state.addRoutes = routes;
11 | // state.routes = constantRoutes.concat(routes)
12 | // }
13 | // }
14 |
15 | // const actions = {
16 | // generateRoutes({ commit }, roles) {
17 | // return new Promise(resolve => {
18 | // let accessedRoutes
19 | // // 如果角色为管理员,所有动态路由都可以查看
20 | // if (roles.includes('admin')) {
21 | // accessedRoutes = asyncRoutes || []
22 | // } else {
23 | // // 否则根据角色获取动态路由
24 | // accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
25 | // }
26 | // commit('SET_ROUTES', accessedRoutes)
27 | // resolve(accessedRoutes)
28 | // })
29 | // }
30 | // }
31 |
32 | // // 使用meta.roles确定当前角色是否具有权限
33 | // function hasPermission(roles, route) {
34 | // if (route.meta && route.meta.roles) {
35 | // return roles.some(role => route.meta.roles.includes(role))
36 | // } else {
37 | // return true
38 | // }
39 | // }
40 |
41 | // // 通过递归过滤动态路由
42 | // export function filterAsyncRoutes(routes, roles) {
43 | // const res = [];
44 | // routes.forEach(route => {
45 | // const temp = { ...route };
46 | // if (hasPermission(roles, temp)) {
47 | // if (temp.children) {
48 | // temp.children = filterAsyncRoutes(temp.children, roles)
49 | // }
50 | // res.push(temp)
51 | // }
52 | // })
53 | // return res
54 | // }
55 |
56 | // export default {
57 | // namespaced: true,
58 | // state,
59 | // mutations,
60 | // actions
61 | // }
62 |
--------------------------------------------------------------------------------
/src/store/modules/user.js:
--------------------------------------------------------------------------------
1 | // import { setToken, getToken, removeToken } from '../../utils/token'
2 | const state = {
3 | // token: getToken(),
4 | employeeId: '',
5 | number: '',
6 | // usertype: '',
7 | headImg: '',
8 | // roles: [],
9 | data: {},
10 | // isLogin: 0 // 初始时候给 isLogin=0表示未登录
11 | }
12 |
13 | const mutations = {
14 | // 改变登录状态, 为1表示已登录
15 | // CHANGE_LOGIN (state) {
16 | // state.isLogin = 1
17 | // },
18 | USER_MUTATION: (state, userdata) => {
19 | // setToken(userdata.token)
20 | // state.token = userdata.token;
21 | state.data = userdata;
22 | state.employeeId = userdata.employeeId;
23 | state.number = userdata.number;
24 | // state.usertype = userdata.utype;
25 | state.headImg = userdata.headImg;
26 | // state.roles = userdata.roles;
27 | }
28 | }
29 |
30 | const actions = {
31 | // changeLogin ({ commit }) {
32 | // commit('CHANGE_LOGIN')
33 | // },
34 | setUserdata({ commit }, userdata) {
35 | commit('USER_MUTATION', userdata);
36 | },
37 | getInfo({ commit, state }) {
38 | const data = state.data;
39 | state.employeeId = data.employeeId;
40 | state.number = data.number;
41 | // state.usertype = data.utype;
42 | state.headImg = data.headImg;
43 | // state.roles = data.roles;
44 | },
45 | // remove Token
46 | resetToken({ commit, state }) {
47 | return new Promise(resolve => {
48 | commit('USER_MUTATION', '')
49 | // state.roles = []
50 | // removeToken()
51 | resolve()
52 | })
53 | }
54 | }
55 |
56 | export default {
57 | namespaced: true,
58 | state,
59 | mutations,
60 | actions
61 | }
62 |
--------------------------------------------------------------------------------
/src/styles/index.less:
--------------------------------------------------------------------------------
1 | // 设置elementUI的样式
2 | .el-form {
3 | background-color: #fff;
4 | }
--------------------------------------------------------------------------------
/src/utils/formateDate.js:
--------------------------------------------------------------------------------
1 | export const formateDate = function (date) {
2 | let theDate = new Date(date)
3 | let year = theDate.getFullYear()
4 | let month = theDate.getMonth() + 1
5 | let day = theDate.getDate()
6 | // let hour = theDate.getHours()
7 | // let minute = theDate.getMinutes()
8 | // let second = theDate.getSeconds()
9 | return year + '-' + formatTen(month) + '-' + formatTen(day)
10 | // return year + '-' + this.formatTen(month) + '-' + this.formatTen(day) + ' ' + this.formatTen(hour) + ':' + this.formatTen(minute) + ':' + this.formatTen(second)
11 | }
12 | const formatTen = function (num) {
13 | return num > 9 ? (num + '') : ('0' + num)
14 | }
--------------------------------------------------------------------------------
/src/utils/request.js:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 |
3 | // const service = axios.create({
4 | // // process.env.NODE_ENV === 'development' 来判断是否开发环境
5 | // // easy-mock服务挂了,暂时不使用了
6 | // // baseURL: 'https://www.easy-mock.com/mock/592501a391470c0ac1fab128',
7 | // baseURL: 'http://120.24.186.190:8080',
8 | // timeout: 5000
9 | // });
10 |
11 | const service = axios.create({
12 | baseURL: '',
13 | // baseURL: process.env.VUE_APP_BASE_URL,
14 | withCredentials: false,
15 | timeout: 5000,
16 | headers: {
17 | 'Access-Control-Allow-Origin': '*',
18 | 'Access-Control-Allow-Headers': 'X-Requested-With,Content-Type',
19 | 'Access-Control-Allow-Methods': 'PUT,POST,GET,DELETE,OPTIONS',
20 | 'Content-Type': 'application/json'
21 | }
22 | })
23 |
24 | // service.interceptors.request.use(
25 | // config => {
26 | // return config;
27 | // },
28 | // error => {
29 | // console.log(error);
30 | // return Promise.reject();
31 | // }
32 | // );
33 |
34 | // service.interceptors.response.use(
35 | // response => {
36 | // if (response.status === 200) {
37 | // return response.data;
38 | // } else {
39 | // Promise.reject();
40 | // }
41 | // },
42 | // error => {
43 | // console.log(error);
44 | // return Promise.reject();
45 | // }
46 | // );
47 |
48 | export default service;
49 |
--------------------------------------------------------------------------------
/vue.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | baseUrl: './',
3 | assetsDir: 'static',
4 | outputDir: 'dist',
5 | publicPath: './',
6 | productionSourceMap: false,
7 | devServer: {
8 | proxy: {
9 | '/HotelManagement':{
10 | target:'http://120.24.186.190:8080',
11 | changeOrigin:true,
12 | pathRewrite:{
13 | '^/HotelManagement':'/HotelManagement'
14 | }
15 | }
16 | }
17 | }
18 | }
--------------------------------------------------------------------------------