├── 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 | ![pc_1](src/img/1.png) 7 | 8 | ![phone_1](src/img/2.png) 9 | 10 | ![pc_2](src/img/3.png) 11 | 12 | ![phone_2](src/img/4.png) 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 | 15 |
16 |
17 | 用户登录 18 |
19 | 20 |
21 |
22 | 23 |
24 |
25 | 26 |
27 |
28 | 29 |
30 |
31 | 忘记密码? 32 |
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 |
15 |
16 | 19 |
20 | 23 |
24 |
25 |
26 | 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 | 33 | 34 | -------------------------------------------------------------------------------- /src/components/progress.vue: -------------------------------------------------------------------------------- 1 | 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 | 35 | 44 | 155 | -------------------------------------------------------------------------------- /src/components/home.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | -------------------------------------------------------------------------------- /src/components/server.vue: -------------------------------------------------------------------------------- 1 | 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 | 99 | 108 | 458 | --------------------------------------------------------------------------------