├── src
├── js
│ ├── login.js
│ ├── router.js
│ └── admin.js
├── img
│ ├── 1.png
│ ├── 2.png
│ ├── 3.png
│ └── 4.png
├── config.js
├── css
│ ├── login.css
│ └── admin.css
├── common.js
├── login.html
├── admin.html
└── components
│ ├── setting.vue
│ ├── progress.vue
│ ├── log.vue
│ ├── home.vue
│ ├── server.vue
│ └── user.vue
├── .gitignore
├── webpack.dev.js
├── webpack.build.js
├── readme.md
├── package.json
└── webpack.config.js
/src/js/login.js:
--------------------------------------------------------------------------------
1 | require('./../css/login.css');
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 | package-lock.json
--------------------------------------------------------------------------------
/src/img/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodFrm/radius-php-template/master/src/img/1.png
--------------------------------------------------------------------------------
/src/img/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodFrm/radius-php-template/master/src/img/2.png
--------------------------------------------------------------------------------
/src/img/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodFrm/radius-php-template/master/src/img/3.png
--------------------------------------------------------------------------------
/src/img/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/CodFrm/radius-php-template/master/src/img/4.png
--------------------------------------------------------------------------------
/src/config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | url:'http://127.0.3.1',
3 | aapi:'/admin/api/'
4 | };
5 |
--------------------------------------------------------------------------------
/webpack.dev.js:
--------------------------------------------------------------------------------
1 | const merge = require('webpack-merge');
2 | const common = require('./webpack.config.js');
3 |
4 | module.exports = merge(common, {
5 | devtool: 'inline-source-map'
6 | })
--------------------------------------------------------------------------------
/webpack.build.js:
--------------------------------------------------------------------------------
1 | const merge = require('webpack-merge');
2 | const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
3 | const common = require('./webpack.config.js');
4 |
5 | module.exports = merge(common, {
6 | plugins: [
7 | new UglifyJSPlugin()
8 | ]
9 | })
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | ## php-radius使用的模板
2 | > 使用vue做的单页面应用,自适应PC和手机,使用前后端分离架构和restful api
3 |
4 | php-radius项目地址:[php-radius](https://github.com/CodFrm/php-radius)
5 |
6 | 
7 |
8 | 
9 |
10 | 
11 |
12 | 
13 |
--------------------------------------------------------------------------------
/src/js/router.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 | import home from './../components/home.vue'
4 | import user from './../components/user.vue'
5 | import log from './../components/log.vue'
6 | import server from './../components/server.vue'
7 | import setting from './../components/setting.vue'
8 | Vue.use(Router);
9 |
10 | export default new Router({
11 | routes: [{
12 | path: '/',
13 | name: 'home',
14 | component: home
15 | },
16 | {
17 | path: '/user',
18 | name: 'user',
19 | component: user
20 | }, {
21 | path: '/server',
22 | name: 'server',
23 | component: server
24 | }, {
25 | path: '/log',
26 | name: 'log',
27 | component: log
28 | }, {
29 | path: '/setting',
30 | name: 'setting',
31 | component: setting
32 | },
33 | { path: '*', redirect: '/' }
34 | ]
35 | })
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "php-radius-admin",
3 | "version": "1.0.0",
4 | "description": "php-radius的后台管理页面",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "build": "webpack --mode production --config webpack.build.js",
9 | "dev": "webpack --watch --mode development --config webpack.dev.js"
10 | },
11 | "author": "CodFrm",
12 | "license": "MIT",
13 | "devDependencies": {
14 | "css-loader": "^0.28.11",
15 | "extract-text-webpack-plugin": "^4.0.0-beta.0",
16 | "file-loader": "^1.1.11",
17 | "html-webpack-plugin": "^3.2.0",
18 | "style-loader": "^0.21.0",
19 | "url-loader": "^1.0.1",
20 | "vue-loader": "^15.2.4",
21 | "vue-template-compiler": "^2.5.16",
22 | "webpack": "^4.12.1",
23 | "webpack-cli": "^3.0.8",
24 | "webpack-merge": "^4.1.3"
25 | },
26 | "dependencies": {
27 | "less": "^3.8.1",
28 | "less-loader": "^4.1.0",
29 | "vue": "^2.5.16",
30 | "vue-datepicker-local": "^1.0.14",
31 | "vue-easytable": "^1.7.1",
32 | "vue-router": "^3.0.1",
33 | "vue2-slot-calendar": "^2.1.4"
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/src/css/login.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | background: #343842;
4 | }
5 |
6 | .logo {
7 | color: #fff;
8 | font-size: 20px;
9 | margin: 4px;
10 | font-weight: bold;
11 | font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
12 | }
13 |
14 | .middle-login {
15 | position: absolute;
16 | left: 50%;
17 | top: 50%;
18 | transform: translate(-50%, -50%);
19 | }
20 |
21 | .top-title {
22 | text-align: center;
23 | display: block;
24 | font-size: 24px;
25 | margin-bottom: 16px;
26 | }
27 |
28 | .form-post {
29 | width: 300px;
30 | padding: 20px 20px 8px 20px;
31 | background: #fff;
32 | border-radius: 8px;
33 | }
34 |
35 | .form-post label {
36 | display: block;
37 | margin-bottom: 4px;
38 | }
39 |
40 | .form-post label,
41 | .form-post .input {
42 | width: 100%;
43 | }
44 |
45 | .input {
46 | outline: none;
47 | padding: 2px 4px;
48 | height: 40px;
49 | line-height: 32px;
50 | border: 1px solid #d0d0d0;
51 | box-shadow: 0px 0px 2px #d0d0d0;
52 | box-sizing: border-box;
53 | font-size: 14px;
54 | border-radius: 4px;
55 | }
56 |
57 | .input:focus {
58 | box-shadow: 0px 0px 2px #00b5ff;
59 | }
60 |
61 | .input-group:not(:first-of-type) {
62 | margin-top: 16px;
63 | }
64 |
65 | .btn-submit {
66 | border: 0;
67 | width: 100%;
68 | font-size: 18px;
69 | color: #fff;
70 | background: #00b6ff;
71 | opacity: .8;
72 | cursor: pointer;
73 | }
74 |
75 | .btn-submit:hover{
76 | opacity: 1;
77 | }
78 |
79 |
80 | .link{
81 | text-decoration: none;
82 | color: #00b5ff;
83 | font-size: 12px;
84 | }
--------------------------------------------------------------------------------
/src/common.js:
--------------------------------------------------------------------------------
1 | export function formatDate(timestamp) {
2 | var date = new Date(timestamp * 1000); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
3 | var Y = date.getFullYear() + '-';
4 | var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
5 | var D = date.getDate() + ' ';
6 | var h = date.getHours() + ':';
7 | var m = date.getMinutes() + ':';
8 | var s = date.getSeconds();
9 | return Y + M + D + h + m + s;
10 | }
11 | export function formatTime(s) {
12 | var ret = '', tmp = parseInt(s / 60), y = s % 60;
13 | if (tmp < 1) {
14 | ret = s + "秒";
15 | } else {
16 | ret = y + "秒";
17 | y = tmp % 60;
18 | tmp = parseInt(tmp / 60);
19 | if (tmp < 1) {
20 | ret = y + "分 " + ret;
21 | } else {
22 | ret = tmp + "时 " + y + "分 " + ret;
23 | }
24 | }
25 |
26 | return ret;
27 | }
28 | export function formatByte(byte) {
29 | var mb = parseInt(byte / (1048576)), tmp = mb / 1024;
30 | var ret = '';
31 | if (tmp < 1) {
32 | ret = mb + "MB";
33 | } else {
34 | ret = parseInt(tmp) + "GB " + (mb % 1024) + "MB";
35 | }
36 | return ret;
37 | }
38 | export function get(url) {
39 | return fetch(url, {
40 | credentials: "include"
41 | });
42 | }
43 |
44 | export function req_json(url, method, data) {
45 | var opts = {
46 | method: method,
47 | body: data,
48 | credentials: "include",
49 | headers: {
50 | 'Accept': 'application/json',
51 | 'Content-Type': 'application/json'
52 | },
53 | };
54 | return fetch(url, opts);
55 | }
--------------------------------------------------------------------------------
/src/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | PHPRadius
9 |
10 |
11 |
12 |
13 |
14 | PHP-Radius
15 |
16 |
17 |
用户登录
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 | 233333333333333333333333
38 |
39 |
40 |
48 |
49 |
--------------------------------------------------------------------------------
/src/admin.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | PHPRadius
9 |
10 |
11 |
12 |
13 |
14 |
25 |
26 |
27 |
28 | 首页
29 |
30 |
31 | 用户管理
32 |
33 |
34 | 服务器管理
35 |
36 |
37 | 日志管理
38 |
39 |
40 | 设置
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/webpack.config.js:
--------------------------------------------------------------------------------
1 | var htmlWebpackPlugin = require('html-webpack-plugin');
2 | var ExtractTextPlugin = require('extract-text-webpack-plugin');
3 | var VueLoaderPlugin = require('vue-loader/lib/plugin');
4 |
5 | module.exports = {
6 | entry: {
7 | admin: __dirname + '/src/js/admin.js',
8 | login: __dirname + '/src/js/login.js'
9 | },
10 | output: {
11 | path: __dirname + '/dist/js',
12 | filename: '[name].js'
13 | },
14 | module: {
15 | rules: [{
16 | test: /\.css$/,
17 | use: ["style-loader", "css-loader"]
18 | },
19 | {
20 | test: /\.vue$/,
21 | use: [{
22 | loader: 'vue-loader',
23 | options: {
24 | extractCSS: true
25 | }
26 | }]
27 | }, {
28 | test: /\.(eot|woff|woff2|ttf|svg)(\?\S*)?$/,
29 | use: [{
30 | loader: 'url-loader',
31 | options: {
32 | limit: 5000,
33 | name: 'font/[name]-[hash:8].[ext]'
34 | }
35 | }]
36 |
37 | }, {
38 | test: /\.less$/,
39 | use: ["style-loader", "css-loader", "less-loader"]
40 | }
41 | ]
42 | },
43 | resolve: {
44 | alias: {
45 | vue: 'vue/dist/vue.common.js',
46 | 'vue-router': 'vue-router/dist/vue-router.common.js'
47 | }
48 | },
49 | plugins: [
50 | new htmlWebpackPlugin({
51 | filename: __dirname + '/dist/admin.html',
52 | template: __dirname + '/src/admin.html',
53 | inject: 'body',
54 | title: '后台管理页面',
55 | minify: {
56 | removeComments: true,
57 | collapseWhitespace: true
58 | },
59 | chunks: ['admin', 'vendors', 'manifest']
60 | }),
61 | new htmlWebpackPlugin({
62 | filename: __dirname + '/dist/login.html',
63 | template: __dirname + '/src/login.html',
64 | inject: 'body',
65 | title: '登录页面',
66 | minify: {
67 | removeComments: true,
68 | collapseWhitespace: true
69 | },
70 | chunksSortMode: 'dependency',
71 | chunks: ['admin', 'login', 'vendors', 'manifest']
72 | }),
73 | new VueLoaderPlugin()
74 | ]
75 | }
--------------------------------------------------------------------------------
/src/components/setting.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
6 | /
7 |
8 | 系统设置
9 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
--------------------------------------------------------------------------------
/src/components/progress.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
9 |
10 | {{ percent }}%
11 |
12 |
13 |
14 |
15 |
16 |
17 |
99 |
100 |
--------------------------------------------------------------------------------
/src/js/admin.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import router from './router'
3 | import 'vue-easytable/libs/themes-base/index.css'
4 | import {
5 | VTable,
6 | VPagination
7 | } from 'vue-easytable'
8 | import config from "./../config";
9 | Vue.component(VTable.name, VTable)
10 | Vue.component(VPagination.name, VPagination)
11 | require('./../css/admin.css');
12 |
13 | var vue = new Vue({
14 | router,
15 | data() {
16 | return {
17 | group: [],
18 | ws: null
19 | };
20 | },
21 | created() {
22 | fetch(config.url + config.aapi + 'usergroup', {
23 | credentials: "include"
24 | }).then(function(response) {
25 | return response.json();
26 | })
27 | .then(function(json) {
28 | vue.group = json["rows"];
29 | });
30 | },
31 | }).$mount('#app');
32 |
33 | $(function() {
34 | $('.nav-left>.nav-item>.nav-ic').click(function() {
35 | //改变箭头指向
36 | if ($(this).parent().children('.sub-nav').css('display') == 'block') {
37 | $(this).children('.arrow').removeClass('icon-down');
38 | $(this).children('.arrow').addClass('icon-up');
39 | } else {
40 | $(this).children('.arrow').addClass('icon-down');
41 | $(this).children('.arrow').removeClass('icon-up');
42 | }
43 | $(this).parent().children('.sub-nav').slideToggle().end();
44 | });
45 | $('.mobile-menu').click(function() {
46 | $('.nav-left').slideToggle().end();
47 | });
48 | $(document).on('click', function(e) {
49 | if (!($(document).width() < 720 && $('.nav-left').css('display') == 'block')) {
50 | return;
51 | }
52 | var e = e || window.event;
53 | var elem = e.target || e.srcElement;
54 | while (elem) {
55 | if (elem.className && elem.className.indexOf('mobile-menu') >= 0) {
56 | return;
57 | }
58 | elem = elem.parentNode;
59 | }
60 | $('.nav-left').slideToggle().end();
61 | });
62 | })
63 |
64 | window.popWind = function popWind() {
65 | this.prompt = function(content, icon, color) {
66 | color = color || '#000';
67 | var pop = $('');
68 | pop.html('' + content + '');
69 | $('body').append(pop);
70 | setTimeout(function() {
71 | pop.css('z-index', -1);
72 | pop.css('opacity', 0);
73 | setTimeout(function() {
74 | pop.remove();
75 | }, 500);
76 | }, 3000);
77 | setTimeout(function() {
78 | pop.css('z-index', 1000);
79 | pop.css('opacity', 1);
80 | }, 200);
81 | }
82 | return this;
83 | }
84 |
85 | window.show_box = function(id) {
86 | document.getElementById(id).style.opacity = "1";
87 | document.getElementById(id).style.height = "auto";
88 | document.getElementById(id).style.zIndex = "100";
89 | document.getElementById(id).style.pointerEvents = "all";
90 | };
91 |
92 | window.close_box = function(id) {
93 | document.getElementById(id).style.opacity = "0";
94 | setTimeout(function() {
95 | document.getElementById(id).style.height = "0px";
96 | document.getElementById(id).style.zIndex = "-1";
97 | document.getElementById(id).style.pointerEvents = "none";
98 | }, 500);
99 | };
--------------------------------------------------------------------------------
/src/components/log.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
6 | /
7 |
8 | 日志记录
9 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
30 |
31 |
32 |
33 |
34 |
35 |
44 |
155 |
--------------------------------------------------------------------------------
/src/components/home.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
6 |
7 |
8 |
9 |
10 |
13 |
14 |
15 |
用户
16 |
17 |
{{ server_msg.user }} 人
18 |
19 |
20 | 管理
21 |
22 |
23 |
24 |
25 |
26 |
服务器
27 |
28 |
{{ server_msg.server }} 台
29 |
30 |
31 | 管理
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
47 |
48 |
49 | 系统负载
50 |
51 | {{ runStatus() }}
52 |
53 |
54 | CPU使用率
55 |
56 | {{ sys_msg.cpu.num }}核
57 |
58 |
59 | 内存使用
60 |
61 | {{ kb2big(sys_msg.mem.use) }}/{{ kb2big(sys_msg.mem.total) }}
62 |
63 |
64 | 磁盘空间
65 |
66 | {{ kb2big(sys_msg.disk.use/1024) }}/{{ kb2big(sys_msg.disk.total/1024) }}
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
--------------------------------------------------------------------------------
/src/components/server.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
6 | /
7 |
8 | 服务器管理
9 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
25 |
26 |
27 |
30 |
31 |
32 |
33 |
34 |
55 |
56 |
57 |
66 |
324 |
--------------------------------------------------------------------------------
/src/css/admin.css:
--------------------------------------------------------------------------------
1 | body {
2 | background: #f4f4fb;
3 | margin: 0;
4 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
5 | overflow: hidden;
6 | }
7 |
8 | .header {
9 | position: absolute;
10 | top: 0;
11 | padding: 0 8px;
12 | height: 50px;
13 | line-height: 50px;
14 | background: #fff;
15 | left: 0;
16 | right: 0;
17 | }
18 |
19 | .mobile-menu {
20 | display: none;
21 | }
22 |
23 | .nav-left {
24 | position: absolute;
25 | left: 0;
26 | width: 200px;
27 | top: 50px;
28 | bottom: 0;
29 | background: #343842;
30 | }
31 |
32 | .content {
33 | font-size: 0;
34 | position: absolute;
35 | left: 200px;
36 | top: 50px;
37 | bottom: 0;
38 | right: 0;
39 | padding: 10px;
40 | overflow: auto;
41 | }
42 |
43 | .header>div {
44 | float: left;
45 | }
46 |
47 | .logo {
48 | height: 100%;
49 | }
50 |
51 | .logo .logo-text {
52 | color: #000;
53 | display: inline-block;
54 | height: 100%;
55 | font-size: 20px;
56 | font-weight: bold;
57 | text-decoration: none;
58 | margin-left: 16px;
59 | }
60 |
61 | .top-user {
62 | font-size: 14px;
63 | margin-left: 20px;
64 | }
65 |
66 | .top-user .nav-user {
67 | color: #1396ff;
68 | cursor: pointer;
69 | }
70 |
71 | .nav-user .icon-down {
72 | margin-left: 2px;
73 | font-size: 12px;
74 | }
75 |
76 | .nav-left {
77 | font-size: 0;
78 | padding-top: 14px;
79 | }
80 |
81 | .nav-left .nav-item {
82 | font-size: 14px;
83 | color: #fff;
84 | line-height: 45px;
85 | cursor: pointer;
86 | width: 100%;
87 | box-sizing: border-box;
88 | display: inline-block;
89 | }
90 |
91 | .active>.nav-ic {
92 | background: #ff7267;
93 | }
94 |
95 | .nav-item.br {
96 | height: 0;
97 | width: calc(100% - 20px);
98 | border-top: 1px solid #5d5d5d;
99 | margin-left: 20px;
100 | }
101 |
102 | .nav-item>.nav-ic {
103 | padding-left: 20px;
104 | }
105 |
106 | .nav-item .nav-item {
107 | padding-left: 20px;
108 | }
109 |
110 | .nav-left .nav-item>.nav-ic:hover {
111 | transition: .4s;
112 | background: #545965;
113 | }
114 |
115 | .nav-left .nav-item.active>.nav-ic:hover {
116 | background: #ff7267;
117 | }
118 |
119 | .nav-item .icon-down,
120 | .nav-item .icon-up {
121 | margin-right: 18px;
122 | float: right;
123 | }
124 |
125 | .test-wh {
126 | width: 400px;
127 | height: 200px;
128 | }
129 |
130 | .card {
131 | font-size: 14px;
132 | display: inline-block;
133 | box-sizing: border-box;
134 | }
135 |
136 | .card:not(:first-child) {
137 | margin-top: 10px;
138 | }
139 |
140 | .card-content {
141 | background: #fff;
142 | width: 100%;
143 | height: 100%;
144 | }
145 |
146 | .card .card-header {
147 | overflow: hidden;
148 | line-height: 27px;
149 | padding: 8px 6px;
150 | font-size: 16px;
151 | height: auto;
152 | color: #666;
153 | border-bottom: 1px solid #eee;
154 | }
155 |
156 | .card .card-text {
157 | padding: 4px 8px;
158 | }
159 |
160 | .card.card-half {
161 | width: 50%;
162 | }
163 |
164 | .nav-bar {
165 | font-size: 12px;
166 | background: #fff;
167 | width: 100%;
168 | margin-bottom: 10px;
169 | padding: 4px 6px;
170 | }
171 |
172 | a.nav-item {
173 | text-decoration: none;
174 | }
175 |
176 | .nav-bar>.nav-item {
177 | color: #484848;
178 | }
179 |
180 | .nav-item>.sub-nav {
181 | display: none;
182 | }
183 |
184 | .nav-item.active>.sub-nav {
185 | display: block;
186 | }
187 |
188 | #user-table {
189 | position: relative;
190 | padding: 8px 0;
191 | }
192 |
193 | #pop-wind {
194 | width: 500px;
195 | }
196 |
197 | .system-msg-box {
198 | display: inline-block;
199 | height: 140px;
200 | }
201 |
202 | .system-msg-box:not(:first-child) {
203 | margin-left: 80px;
204 | }
205 |
206 | .system-msg-box .msg {
207 | display: block;
208 | text-align: center;
209 | }
210 |
211 | .system-msg-box .msg:first-child {
212 | margin-bottom: 8px;
213 | }
214 |
215 | .system-msg-box .msg:last-child {
216 | margin-top: 8px;
217 | }
218 |
219 | @media screen and (max-width: 720px) {
220 | .system-msg-box:not(:first-child) {
221 | margin-left: 0;
222 | }
223 | .system-msg-box:nth-child(odd) {
224 | margin-left: 20px;
225 | }
226 | .system-msg-box:nth-child(even) {
227 | float: right;
228 | margin-right: 20px;
229 | }
230 | .card.card-half {
231 | width: 100%;
232 | }
233 | .header {
234 | background: #545965;
235 | color: #fff;
236 | }
237 | .logo>.logo-text {
238 | color: #fff;
239 | }
240 | .top-user {
241 | position: absolute;
242 | right: 10px;
243 | }
244 | .nav-bar {
245 | display: none;
246 | }
247 | .top-user .nav-user {
248 | color: #fff;
249 | }
250 | .mobile-menu {
251 | display: block;
252 | }
253 | .nav-left {
254 | background: #545965;
255 | display: none;
256 | bottom: auto;
257 | z-index: 10;
258 | padding-top: 0;
259 | }
260 | .content {
261 | left: 0;
262 | right: 0;
263 | padding: 0;
264 | }
265 | #pop-wind {
266 | width: 300px;
267 | }
268 | .datepicker {
269 | width: 120px;
270 | }
271 | .form>.ipt-group>.tag,
272 | .form>.ipt-group>.ipt-text {
273 | width: 100%;
274 | max-width: 100%;
275 | }
276 | .box-content.form>.ipt-group {
277 | width: 90%;
278 | }
279 | .min-card {
280 | width: 100%;
281 | margin-bottom: 4px;
282 | }
283 | .min-card .card-content {
284 | width: calc(100% - 60px) !important;
285 | }
286 | }
287 |
288 | .pop-wid {
289 | padding: 2px 8px;
290 | position: absolute;
291 | left: 50%;
292 | top: 50%;
293 | transform: translate(-50%, -50%);
294 | background: #fff;
295 | border: 1px solid #cecece;
296 | border-radius: 4px;
297 | transition: .4s;
298 | opacity: 0;
299 | display: block;
300 | z-index: -1;
301 | }
302 |
303 | .pop-wid.prompt {
304 | height: 30px;
305 | min-width: 150px;
306 | line-height: 30px;
307 | text-align: center;
308 | cursor: default;
309 | }
310 |
311 | .tools-bar {
312 | margin-top: 8px;
313 | text-align: right;
314 | }
315 |
316 | .pop-box {
317 | transition: opacity .5s;
318 | opacity: 0;
319 | position: fixed;
320 | left: 50%;
321 | top: 50%;
322 | transform: translate(-50%, -50%);
323 | border-radius: 2px;
324 | box-shadow: 0px 0px 4px #484848;
325 | z-index: -1;
326 | pointer-events: none;
327 | }
328 |
329 | .pop-box>div {
330 | padding: 6px;
331 | }
332 |
333 | .pop-box>.box-header,
334 | .box-footer {
335 | line-height: 30px;
336 | padding: 10px 6px;
337 | background: #f3f3f3;
338 | font-size: 15px;
339 | font-weight: 400;
340 | font-family: Arial, Helvetica, sans-serif;
341 | }
342 |
343 | .pop-box>.box-header {
344 | border-bottom: 1px solid #eee;
345 | }
346 |
347 | .pop-box>.box-footer {
348 | border-top: 1px solid #eee;
349 | }
350 |
351 | #pop {
352 | position: fixed;
353 | left: 0;
354 | top: 0;
355 | bottom: 0;
356 | right: 0;
357 | z-index: 10;
358 | background: #8e8e8eab;
359 | }
360 |
361 | .btn.pop-close {
362 | background: #00000000;
363 | float: right;
364 | font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
365 | font-weight: 100;
366 | font-size: 14px;
367 | }
368 |
369 | .btn.pop-close:hover {
370 | color: #ff0000;
371 | }
372 |
373 | .spk-box.box {
374 | padding: 10px;
375 | border: 1px solid #eaeaea;
376 | border-left: 4px solid #eaeaea;
377 | }
378 |
379 | .pop-box .spk-box {
380 | font-size: 14px;
381 | }
382 |
383 | .btn {
384 | border-radius: 2px;
385 | display: inline-block;
386 | min-width: 60px;
387 | font-size: 12px;
388 | border: 0;
389 | padding: 5px;
390 | cursor: pointer;
391 | outline: none;
392 | font-weight: bold;
393 | font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
394 | box-sizing: border-box;
395 | text-decoration: none !important;
396 | }
397 |
398 | .btn.btn-min {
399 | min-width: auto;
400 | }
401 |
402 | .box-content {
403 | padding: 8px !important;
404 | background: #fff;
405 | }
406 |
407 | .box-content .ipt-group {
408 | width: 400px;
409 | }
410 |
411 | .form .ipt-group {
412 | margin: 0 5%;
413 | margin-bottom: 6px;
414 | width: 40%;
415 | }
416 |
417 | .form .tag {
418 | min-width: 100px;
419 | display: inline-block;
420 | width: 25%;
421 | font-size: 16px;
422 | padding-right: 6px;
423 | }
424 |
425 | .form>.ipt-group>.tag {
426 | margin-bottom: 6px;
427 | }
428 |
429 | .min-card {
430 | display: inline-block;
431 | height: 100px;
432 | box-sizing: unset;
433 | cursor: pointer;
434 | transition: .25s;
435 | }
436 |
437 | .min-card:hover {
438 | box-shadow: 0px 0px 2px 0px #0094ffc9;
439 | }
440 |
441 | .min-card .card-content,
442 | .min-card .card-title {
443 | padding: 6px;
444 | height: 100px;
445 | display: inline-block;
446 | text-align: center;
447 | }
448 |
449 | .card .card-select {
450 | width: 180px;
451 | float: right;
452 | line-height: 20px
453 | }
454 |
455 | .min-card .card-title {
456 | width: 60px;
457 | float: left;
458 | background: #40a7f1;
459 | font-size: 16px;
460 | line-height: 92px;
461 | color: #fff;
462 | }
463 |
464 | .min-card .card-action {
465 | line-height: 30px;
466 | }
467 |
468 | .card-action a {
469 | text-decoration: none;
470 | color: #40a7f1;
471 | }
472 |
473 | .bigp {
474 | font-size: 30px;
475 | color: #666;
476 | margin: 0;
477 | }
478 |
479 | .min-card .card-content {
480 | border: 1px solid #eee;
481 | border-left: 0;
482 | width: auto;
483 | line-height: 60px;
484 | min-width: 200px;
485 | }
486 |
487 | .form .ipt-text {
488 | width: 75%;
489 | display: inline-block;
490 | font-size: 14px;
491 | height: 30px;
492 | }
493 |
494 | .box-content>p {
495 | font-size: 14px;
496 | }
497 |
498 | .ipt-text {
499 | width: 100%;
500 | padding: 4px 6px;
501 | box-sizing: border-box;
502 | border: 1px solid #D4D4D4;
503 | outline: none;
504 | }
505 |
506 | .ipt-select.ipt-text {
507 | width: 30%;
508 | }
509 |
510 | .ipt-text:hover,
511 | .ipt-text:focus {
512 | border: 1px solid #00a5e0;
513 | }
514 |
515 | div.group {
516 | margin-top: 4px;
517 | line-height: 34px;
518 | }
519 |
520 | div.group .ipt-select.ipt-text {
521 | height: 34px;
522 | }
523 |
524 | .tools-bar .ipt-text {
525 | width: 120px;
526 | line-height: 18px;
527 | }
528 |
529 | .card-text .inline {
530 | width: auto;
531 | display: inline-block;
532 | }
--------------------------------------------------------------------------------
/src/components/user.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | 首页
6 | /
7 |
8 | 用户管理
9 |
10 |
11 |
12 |
13 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
27 |
28 |
29 |
32 |
33 |
34 |
35 |
36 |
97 |
98 |
99 |
108 |
458 |
--------------------------------------------------------------------------------