diff --git a/gofaster/app/dist/renderer/js/index.js b/gofaster/app/dist/renderer/js/index.js index 9c14819..6ce3e12 100644 --- a/gofaster/app/dist/renderer/js/index.js +++ b/gofaster/app/dist/renderer/js/index.js @@ -2151,92 +2151,16 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_assets_common_styles_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! -!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../assets/common-styles.css */ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./src/renderer/assets/common-styles.css"); // Imports + var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); +___CSS_LOADER_EXPORT___.i(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_assets_common_styles_css__WEBPACK_IMPORTED_MODULE_2__["default"]); // Module ___CSS_LOADER_EXPORT___.push([module.id, ` -.role-management[data-v-03643bfa] { - padding: 20px; - padding-top: 10px; -} -.search-bar[data-v-03643bfa] { - display: flex; - gap: 20px; - margin-bottom: 6px; - margin-top: 0; - align-items: center; - flex-wrap: wrap; - justify-content: space-between; -} -.search-input[data-v-03643bfa] { - position: relative; - flex: 0 0 280px; - min-width: 200px; - max-width: 350px; -} - -/* 响应式设计 */ -@media (max-width: 768px) { -.search-bar[data-v-03643bfa] { - flex-direction: column; - align-items: stretch; - gap: 15px; - justify-content: flex-start; -} -.search-input[data-v-03643bfa] { - flex: 1; - min-width: auto; - max-width: none; -} -.filters[data-v-03643bfa] { - justify-content: space-between; - flex: none; -} -} - -/* 中等屏幕优化 */ -@media (max-width: 1024px) and (min-width: 769px) { -.search-input[data-v-03643bfa] { - flex: 0 0 250px; - min-width: 200px; - max-width: 300px; -} -} -.search-input i[data-v-03643bfa] { - position: absolute; - left: 12px; - top: 50%; - transform: translateY(-50%); - color: var(--text-muted); - font-size: 12px; -} -.search-input input[data-v-03643bfa] { - width: 100%; - padding: 8px 10px 8px 35px; - border: 1px solid var(--input-border); - border-radius: 6px; - font-size: 12px; - background-color: var(--input-bg); - color: var(--input-text); -} -.filters[data-v-03643bfa] { - display: flex; - gap: 15px; - flex-wrap: wrap; - flex: 1; - justify-content: flex-end; - align-items: center; - min-width: 0; -} -.role-table[data-v-03643bfa] { - background: var(--card-bg); - border-radius: 8px; - box-shadow: 0 2px 8px var(--shadow-color); - overflow: hidden; - margin-bottom: 20px; -} +/* 角色管理特定样式 */ .loading[data-v-03643bfa] { display: flex; flex-direction: column; @@ -2267,180 +2191,22 @@ ___CSS_LOADER_EXPORT___.push([module.id, ` font-size: 18px; color: var(--text-muted); } -table[data-v-03643bfa] { - width: 100%; - border-collapse: collapse; -} -th[data-v-03643bfa], td[data-v-03643bfa] { - padding: 8px; - text-align: left; - border-bottom: 1px solid var(--border-color); - font-size: 12px; -} -th[data-v-03643bfa] { - background: var(--bg-secondary); - font-weight: normal; - color: var(--text-primary); - font-size: 14px; -} -.actions[data-v-03643bfa] { - display: flex; - gap: 8px; -} -.btn[data-v-03643bfa] { - padding: 8px 16px; - border: none; - border-radius: 4px; - cursor: pointer; +.role-description[data-v-03643bfa] { + color: var(--text-secondary); font-size: 12px; - display: inline-flex; - align-items: center; - gap: 6px; - transition: all 0.2s; -} -.btn-primary[data-v-03643bfa] { - background: #1976d2; - color: white; -} -.btn-primary[data-v-03643bfa]:hover { - background: #1565c0; -} -.btn-info[data-v-03643bfa] { - background: #0288d1; - color: white; -} -.btn-danger[data-v-03643bfa] { - background: #d32f2f; - color: white; -} -.btn-secondary[data-v-03643bfa] { - background: #757575; - color: white; -} -.btn-sm[data-v-03643bfa] { - padding: 6px 12px; - font-size: 10px; -} - -/* 表格操作按钮样式优化 */ -.actions .btn-sm[data-v-03643bfa] { - background: none; - border: none; - padding: 6px 10px; - margin: 0 -2px; - color: var(--text-primary); - transition: all 0.2s; -} -.actions .btn-sm i[data-v-03643bfa] { - font-size: 14px; -} -.actions .btn-sm[data-v-03643bfa]:hover { - background: var(--bg-secondary); - color: var(--accent-color); - transform: scale(1.1); -} -.actions .btn-sm.btn-info[data-v-03643bfa]:hover { - color: #2196f3; + margin-top: 4px; } -.actions .btn-sm.btn-primary[data-v-03643bfa]:hover { +.permission-count[data-v-03643bfa] { + background: #e3f2fd; color: #1976d2; -} -.actions .btn-sm.btn-danger[data-v-03643bfa]:hover { - color: #d32f2f; -} -.btn[data-v-03643bfa]:hover { - opacity: 0.9; -} -.btn[data-v-03643bfa]:disabled { - opacity: 0.5; - cursor: not-allowed; -} -.pagination[data-v-03643bfa] { - display: flex; - justify-content: center; - align-items: center; - gap: 20px; -} -.page-info[data-v-03643bfa] { - color: #666; - font-size: 14px; -} -.modal-overlay[data-v-03643bfa] { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0,0,0,0.5); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; -} -.modal[data-v-03643bfa] { - background: var(--card-bg); - border-radius: 8px; - width: 90%; - max-width: 500px; - max-height: 90vh; - overflow-y: auto; - box-sizing: border-box; -} -.modal-header[data-v-03643bfa] { - display: flex; - justify-content: space-between; - align-items: center; - padding: 20px; - border-bottom: 1px solid var(--border-color); -} -.modal-header h3[data-v-03643bfa] { - margin: 0; - font-size: 14px; - font-weight: normal; -} -.close-btn[data-v-03643bfa] { - background: none; - border: none; - font-size: 14px; - cursor: pointer; - color: #999; -} -.modal-body[data-v-03643bfa] { - padding: 20px; - box-sizing: border-box; -} -.form-group[data-v-03643bfa] { - margin-bottom: 20px; -} -.form-group label[data-v-03643bfa] { - display: block; - margin-bottom: 8px; - font-weight: normal; - color: #333; - font-size: 14px; -} -.form-group input[data-v-03643bfa], -.form-group textarea[data-v-03643bfa] { - width: 100%; - padding: 10px; - border: 1px solid #ddd; + padding: 2px 6px; border-radius: 4px; - font-size: 14px; - box-sizing: border-box; + font-size: 12px; } .form-group textarea[data-v-03643bfa] { resize: vertical; min-height: 80px; } -.form-actions[data-v-03643bfa] { - display: flex; - gap: 12px; - justify-content: flex-end; - margin-top: 30px; -} -.icon[data-v-03643bfa] { - font-size: 14px; -} `, ""]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); @@ -2463,77 +2229,30 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_assets_common_styles_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! -!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../assets/common-styles.css */ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./src/renderer/assets/common-styles.css"); // Imports + var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); +___CSS_LOADER_EXPORT___.i(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_assets_common_styles_css__WEBPACK_IMPORTED_MODULE_2__["default"]); // Module ___CSS_LOADER_EXPORT___.push([module.id, ` -.settings[data-v-69b5cd1d] { - padding: 20px; - /* 移除强制高度和滚动条设置,让内容自然流动 */ -} -.page-header[data-v-69b5cd1d] { - margin-bottom: 30px; -} -.page-header h2[data-v-69b5cd1d] { - margin: 0; - color: var(--text-primary); - font-size: 24px; -} +/* 系统设置特定样式 */ .settings-content[data-v-69b5cd1d] { max-width: 800px; } -.settings-section[data-v-69b5cd1d] { - background: var(--card-bg); - border-radius: 8px; - padding: 24px; - margin-bottom: 24px; - box-shadow: 0 2px 8px var(--shadow-color); -} -.settings-section h3[data-v-69b5cd1d] { - margin: 0 0 20px 0; - color: var(--text-primary); - font-size: 18px; - border-bottom: 2px solid var(--border-color); - padding-bottom: 8px; -} -.setting-item[data-v-69b5cd1d] { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 20px; - padding: 16px 0; - border-bottom: 1px solid #f5f5f5; -} -.setting-item[data-v-69b5cd1d]:last-child { - border-bottom: none; - margin-bottom: 0; -} -.setting-item label[data-v-69b5cd1d] { - font-weight: 500; - color: var(--text-primary); - min-width: 200px; -} -.setting-item input[type="text"][data-v-69b5cd1d], -.setting-item input[type="number"][data-v-69b5cd1d], -.setting-item select[data-v-69b5cd1d] { - padding: 8px 12px; - border: 1px solid var(--input-border); - border-radius: 4px; - font-size: 14px; - min-width: 200px; - background-color: var(--input-bg); - color: var(--input-text); -} -.setting-item input[type="text"][data-v-69b5cd1d]:focus, -.setting-item input[type="number"][data-v-69b5cd1d]:focus, -.setting-item select[data-v-69b5cd1d]:focus { - outline: none; - border-color: var(--accent-color); - box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.2); + +/* 设置标题图标样式 */ +.page-header h2 i[data-v-69b5cd1d], +.settings-section h3 i[data-v-69b5cd1d] { + margin-right: 8px; + color: var(--accent-color); + font-size: 0.9em; } + + /* 开关样式 */ .toggle-switch[data-v-69b5cd1d] { position: relative; @@ -2588,22 +2307,6 @@ ___CSS_LOADER_EXPORT___.push([module.id, ` justify-content: flex-end; margin-top: 30px; } -.btn[data-v-69b5cd1d] { - padding: 12px 24px; - border: none; - border-radius: 6px; - cursor: pointer; - font-size: 14px; - font-weight: 500; - transition: all 0.2s; -} -.btn-primary[data-v-69b5cd1d] { - background: #1976d2; - color: white; -} -.btn-primary[data-v-69b5cd1d]:hover { - background: #1565c0; -} .btn-secondary[data-v-69b5cd1d] { background: #757575; color: white; @@ -3315,10 +3018,173 @@ ___CSS_LOADER_EXPORT___.push([module.id, ` /***/ }), -/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/renderer/modules/user-management/views/UserManagement.vue?vue&type=style&index=0&id=7889d364&scoped=true&lang=css": -/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/renderer/modules/user-management/views/UserManagement.vue?vue&type=style&index=0&id=7889d364&scoped=true&lang=css ***! - \******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/renderer/modules/user-management/views/UserManagement.vue?vue&type=style&index=0&id=7889d364&scoped=true&lang=css": +/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/renderer/modules/user-management/views/UserManagement.vue?vue&type=style&index=0&id=7889d364&scoped=true&lang=css ***! + \******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ ((module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ "./node_modules/css-loader/dist/runtime/noSourceMaps.js"); +/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); +/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_assets_common_styles_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! -!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../assets/common-styles.css */ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./src/renderer/assets/common-styles.css"); +// Imports + + + +var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); +___CSS_LOADER_EXPORT___.i(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_assets_common_styles_css__WEBPACK_IMPORTED_MODULE_2__["default"]); +// Module +___CSS_LOADER_EXPORT___.push([module.id, ` +/* 用户管理特定样式 */ +.role-checkboxes[data-v-7889d364] { + display: flex; + flex-direction: column; + gap: 8px; +} +.checkbox-item[data-v-7889d364] { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; +} +.checkbox-item input[type="checkbox"][data-v-7889d364] { + width: auto; +} +.icon[data-v-7889d364] { + font-size: 14px; +} +`, ""]); +// Exports +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); + + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/renderer/modules/user-management/views/UserProfile.vue?vue&type=style&index=0&id=8301bb50&scoped=true&lang=css": +/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/renderer/modules/user-management/views/UserProfile.vue?vue&type=style&index=0&id=8301bb50&scoped=true&lang=css ***! + \***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ ((module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) +/* harmony export */ }); +/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ "./node_modules/css-loader/dist/runtime/noSourceMaps.js"); +/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); +/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_assets_common_styles_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! -!../../../../../node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!../../../../../node_modules/vue-loader/dist/stylePostLoader.js!../../../../../node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!../../../assets/common-styles.css */ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./src/renderer/assets/common-styles.css"); +// Imports + + + +var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); +___CSS_LOADER_EXPORT___.i(_node_modules_css_loader_dist_cjs_js_clonedRuleSet_12_use_1_node_modules_vue_loader_dist_stylePostLoader_js_node_modules_postcss_loader_dist_cjs_js_clonedRuleSet_12_use_2_assets_common_styles_css__WEBPACK_IMPORTED_MODULE_2__["default"]); +// Module +___CSS_LOADER_EXPORT___.push([module.id, ` +/* 个人资料特定样式 */ +.loading-container[data-v-8301bb50] { + text-align: center; + padding: 60px 20px; +} +.loading-spinner[data-v-8301bb50] { + width: 50px; + height: 50px; + border: 4px solid #f3f3f3; + border-top: 4px solid #3498db; + border-radius: 50%; + animation: spin-8301bb50 1s linear infinite; + margin: 0 auto 20px; +} +@keyframes spin-8301bb50 { +0% { transform: rotate(0deg); +} +100% { transform: rotate(360deg); +} +} +.error-container[data-v-8301bb50] { + text-align: center; + padding: 60px 20px; + background: #fff5f5; + border-radius: 12px; + border: 1px solid #fed7d7; +} +.error-icon[data-v-8301bb50] { + font-size: 3rem; + margin-bottom: 20px; +} +.retry-btn[data-v-8301bb50] { + background: #e53e3e; + color: white; + border: none; + padding: 12px 24px; + border-radius: 8px; + cursor: pointer; + font-size: 12px; + margin-top: 20px; +} +.retry-btn[data-v-8301bb50]:hover { + background: #c53030; +} +.status-badge.pending[data-v-8301bb50] { + background: #fff3cd; + color: #856404; +} +.status-badge.unknown[data-v-8301bb50] { + background: #e2e3e5; + color: #383d41; +} +.empty-state[data-v-8301bb50] { + text-align: center; + padding: 80px 20px; +} +.empty-icon[data-v-8301bb50] { + font-size: 4rem; + margin-bottom: 20px; +} +.empty-state h3[data-v-8301bb50] { + color: var(--text-primary); + margin-bottom: 10px; + font-size: 12px; +} +.empty-state p[data-v-8301bb50] { + color: var(--text-secondary); + margin-bottom: 30px; + font-size: 12px; +} +.login-btn[data-v-8301bb50] { + background: #1976d2; + color: white; + border: none; + padding: 12px 32px; + border-radius: 6px; + cursor: pointer; + font-size: 12px; + font-weight: 500; +} +.login-btn[data-v-8301bb50]:hover { + background: #1565c0; +} +`, ""]); +// Exports +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); + + +/***/ }), + +/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./src/renderer/assets/common-styles.css": +/*!***********************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./src/renderer/assets/common-styles.css ***! + \***********************************************************************************************************************************************************************************************************************************/ /***/ ((module, __webpack_exports__, __webpack_require__) => { "use strict"; @@ -3326,22 +3192,25 @@ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ "./node_modules/css-loader/dist/runtime/noSourceMaps.js"); +/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ "./node_modules/css-loader/dist/runtime/noSourceMaps.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); +/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module -___CSS_LOADER_EXPORT___.push([module.id, ` -.user-management[data-v-7889d364] { +___CSS_LOADER_EXPORT___.push([module.id, `/* ===== 通用管理页面样式 ===== */ + +/* 页面容器 */ +.management-page { padding: 20px; padding-top: 10px; - /* 移除强制高度和滚动条设置,让内容自然流动 */ } -.search-bar[data-v-7889d364] { + +/* 搜索栏样式 */ +.search-bar { display: flex; gap: 20px; margin-bottom: 6px; @@ -3350,50 +3219,15 @@ ___CSS_LOADER_EXPORT___.push([module.id, ` flex-wrap: wrap; justify-content: space-between; } -.search-input[data-v-7889d364] { + +.search-input { position: relative; flex: 0 0 280px; min-width: 200px; max-width: 350px; } -/* 响应式设计 */ -@media (max-width: 768px) { -.search-bar[data-v-7889d364] { - flex-direction: column; - align-items: stretch; - gap: 15px; - justify-content: flex-start; -} -.search-input[data-v-7889d364] { - flex: 1; - min-width: auto; - max-width: none; -} -.filters[data-v-7889d364] { - justify-content: space-between; - flex: none; -} -.filters select[data-v-7889d364] { - flex: 1; - min-width: auto; - max-width: none; -} -} - -/* 中等屏幕优化 */ -@media (max-width: 1024px) and (min-width: 769px) { -.search-input[data-v-7889d364] { - flex: 0 0 250px; - min-width: 200px; - max-width: 300px; -} -.filters select[data-v-7889d364] { - min-width: 90px; - max-width: 130px; -} -} -.search-input i[data-v-7889d364] { +.search-input i { position: absolute; left: 12px; top: 50%; @@ -3401,16 +3235,45 @@ ___CSS_LOADER_EXPORT___.push([module.id, ` color: var(--text-muted); font-size: 12px; } -.search-input input[data-v-7889d364] { + +/* 输入控件统一样式 */ +.search-input input, +.setting-item input[type="text"], +.setting-item input[type="number"], +.setting-item select { width: 100%; - padding: 8px 10px 8px 35px; + padding: 8px 12px; border: 1px solid var(--input-border); border-radius: 6px; font-size: 12px; background-color: var(--input-bg); color: var(--input-text); + box-sizing: border-box; +} + +/* 搜索输入框特殊样式(左侧图标) */ +.search-input input { + padding-left: 35px; +} + +/* 设置项输入框特殊样式(最小宽度) */ +.setting-item input[type="text"], +.setting-item input[type="number"], +.setting-item select { + min-width: 200px; +} + +/* 输入控件焦点样式 */ +.search-input input:focus, +.setting-item input[type="text"]:focus, +.setting-item input[type="number"]:focus, +.setting-item select:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.2); } -.filters[data-v-7889d364] { + +.filters { display: flex; gap: 15px; flex-wrap: wrap; @@ -3419,71 +3282,94 @@ ___CSS_LOADER_EXPORT___.push([module.id, ` align-items: center; min-width: 0; } -.filters select[data-v-7889d364] { - padding: 6px 12px; + +.filters select { + padding: 8px 12px; border: 1px solid var(--input-border); - border-radius: 4px; + border-radius: 6px; font-size: 12px; background-color: var(--input-bg); color: var(--input-text); min-width: 100px; max-width: 150px; flex: 0 0 auto; + box-sizing: border-box; +} + +.filters select:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.2); } -.user-table[data-v-7889d364] { + +/* 表格样式 */ +.data-table { background: var(--card-bg); border-radius: 8px; box-shadow: 0 2px 8px var(--shadow-color); overflow: hidden; margin-bottom: 20px; } -table[data-v-7889d364] { + +table { width: 100%; border-collapse: collapse; } -th[data-v-7889d364], td[data-v-7889d364] { + +th, td { padding: 8px; text-align: left; border-bottom: 1px solid var(--border-color); font-size: 12px; } -th[data-v-7889d364] { + +th { background: var(--bg-secondary); font-weight: normal; color: var(--text-primary); font-size: 14px; } -.status-badge[data-v-7889d364] { + +/* 状态徽章 */ +.status-badge { padding: 4px 8px; border-radius: 12px; font-size: 12px; font-weight: normal; } -.status-badge.active[data-v-7889d364] { + +.status-badge.active { background: #e8f5e8; color: #2e7d32; } -.status-badge.inactive[data-v-7889d364] { + +.status-badge.inactive { background: #ffebee; color: #c62828; } -.role-tags[data-v-7889d364] { + +/* 角色标签 */ +.role-tags { display: flex; gap: 4px; flex-wrap: wrap; } -.role-tag[data-v-7889d364] { + +.role-tag { background: #e3f2fd; color: #1976d2; padding: 2px 6px; border-radius: 4px; font-size: 14px; } -.actions[data-v-7889d364] { + +/* 操作按钮 */ +.actions { display: flex; gap: 8px; } -.btn[data-v-7889d364] { + +.btn { padding: 8px 16px; border: none; border-radius: 4px; @@ -3494,32 +3380,33 @@ th[data-v-7889d364] { gap: 6px; transition: all 0.2s; } -.btn-primary[data-v-7889d364] { + +.btn-primary { background: #1976d2; color: white; } -.btn-primary[data-v-7889d364]:hover { + +.btn-primary:hover { background: #1565c0; } -.btn-info[data-v-7889d364] { + +.btn-info { background: #0288d1; color: white; } -.btn-danger[data-v-7889d364] { + +.btn-danger { background: #d32f2f; color: white; } -.btn-secondary[data-v-7889d364] { - background: #757575; - color: white; -} -.btn-sm[data-v-7889d364] { + +.btn-sm { padding: 6px 12px; font-size: 10px; } /* 表格操作按钮样式优化 */ -.actions .btn-sm[data-v-7889d364] { +.actions .btn-sm { background: none; border: none; padding: 6px 10px; @@ -3527,244 +3414,118 @@ th[data-v-7889d364] { color: var(--text-primary); transition: all 0.2s; } -.actions .btn-sm i[data-v-7889d364] { + +.actions .btn-sm i { font-size: 14px; } -.actions .btn-sm[data-v-7889d364]:hover { + +.actions .btn-sm:hover { background: var(--bg-secondary); color: var(--accent-color); transform: scale(1.1); } -.actions .btn-sm.btn-info[data-v-7889d364]:hover { + +.actions .btn-sm.btn-info:hover { color: #2196f3; } -.actions .btn-sm.btn-primary[data-v-7889d364]:hover { + +.actions .btn-sm.btn-primary:hover { color: #1976d2; } -.actions .btn-sm.btn-danger[data-v-7889d364]:hover { + +.actions .btn-sm.btn-danger:hover { color: #d32f2f; } -.btn[data-v-7889d364]:hover { - opacity: 0.9; -} -.btn[data-v-7889d364]:disabled { - opacity: 0.5; - cursor: not-allowed; -} -.pagination[data-v-7889d364] { + +/* 分页样式 */ +.pagination { display: flex; justify-content: center; align-items: center; gap: 20px; } -.page-info[data-v-7889d364] { + +.page-info { color: #666; font-size: 14px; } -.modal-overlay[data-v-7889d364] { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0,0,0,0.5); - display: flex; - align-items: center; - justify-content: center; - z-index: 1000; -} -.modal[data-v-7889d364] { - background: white; - border-radius: 8px; - width: 90%; - max-width: 500px; - max-height: 90vh; - overflow-y: auto; - box-sizing: border-box; -} -.modal-header[data-v-7889d364] { - display: flex; - justify-content: space-between; - align-items: center; - padding: 20px; - border-bottom: 1px solid #eee; -} -.modal-header h3[data-v-7889d364] { - margin: 0; - font-size: 14px; - font-weight: normal; -} -.close-btn[data-v-7889d364] { - background: none; - border: none; - font-size: 14px; - cursor: pointer; - color: #999; -} -.modal-body[data-v-7889d364] { - padding: 20px; - box-sizing: border-box; -} -.form-group[data-v-7889d364] { - margin-bottom: 20px; -} -.form-group label[data-v-7889d364] { - display: block; - margin-bottom: 8px; - font-weight: normal; - color: #333; - font-size: 14px; -} -.form-group input[data-v-7889d364], -.form-group select[data-v-7889d364] { - width: 100%; - padding: 10px; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 14px; - box-sizing: border-box; -} -.role-checkboxes[data-v-7889d364] { - display: flex; - flex-direction: column; - gap: 8px; -} -.checkbox-item[data-v-7889d364] { - display: flex; - align-items: center; - gap: 8px; - cursor: pointer; -} -.checkbox-item input[type="checkbox"][data-v-7889d364] { - width: auto; -} -.form-actions[data-v-7889d364] { - display: flex; - gap: 12px; - justify-content: flex-end; - margin-top: 30px; -} -.icon[data-v-7889d364] { - font-size: 14px; -} -`, ""]); -// Exports -/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); +/* 分页按钮字体大小统一 */ +.pagination .btn-sm { + font-size: 10px; +} -/***/ }), - -/***/ "./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/renderer/modules/user-management/views/UserProfile.vue?vue&type=style&index=0&id=8301bb50&scoped=true&lang=css": -/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ - !*** ./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/vue-loader/dist/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/vue-loader/dist/index.js??ruleSet[0].use[0]!./src/renderer/modules/user-management/views/UserProfile.vue?vue&type=style&index=0&id=8301bb50&scoped=true&lang=css ***! - \***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ -/***/ ((module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) -/* harmony export */ }); -/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/noSourceMaps.js */ "./node_modules/css-loader/dist/runtime/noSourceMaps.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../../node_modules/css-loader/dist/runtime/api.js */ "./node_modules/css-loader/dist/runtime/api.js"); -/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); -// Imports - +/* ===== 个人资料页面样式 ===== */ -var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); -// Module -___CSS_LOADER_EXPORT___.push([module.id, ` -.user-profile[data-v-8301bb50] { +/* 个人资料容器 */ +.user-profile { padding: 20px; - /* 移除强制高度和滚动条设置,让内容自然流动 */ -} -.profile-header[data-v-8301bb50] { - text-align: center; - margin-bottom: 26px; -} -.profile-header h1[data-v-8301bb50] { - font-size: 16px; - color: var(--text-primary); - margin-bottom: 10px; -} -.profile-subtitle[data-v-8301bb50] { - font-size: 12px; - color: var(--text-secondary); - margin: 0; -} -.loading-container[data-v-8301bb50] { - text-align: center; - padding: 60px 20px; -} -.loading-spinner[data-v-8301bb50] { - width: 50px; - height: 50px; - border: 4px solid #f3f3f3; - border-top: 4px solid #3498db; - border-radius: 50%; - animation: spin-8301bb50 1s linear infinite; - margin: 0 auto 20px; } -@keyframes spin-8301bb50 { -0% { transform: rotate(0deg); -} -100% { transform: rotate(360deg); -} -} -.error-container[data-v-8301bb50] { + +/* 页面头部 - 统一样式 */ +.page-header, +.profile-header { text-align: center; - padding: 60px 20px; - background: #fff5f5; - border-radius: 12px; - border: 1px solid #fed7d7; -} -.error-icon[data-v-8301bb50] { - font-size: 3rem; - margin-bottom: 20px; + margin-bottom: 26px; } -.retry-btn[data-v-8301bb50] { - background: #e53e3e; - color: white; - border: none; - padding: 12px 24px; - border-radius: 8px; - cursor: pointer; - font-size: 12px; - margin-top: 20px; + +.page-header h2, +.profile-header h1 { + font-size: 16px; + color: var(--text-primary); + margin-bottom: 10px; + margin: 0; } -.retry-btn[data-v-8301bb50]:hover { - background: #c53030; + +.profile-subtitle { + font-size: 12px; + color: var(--text-secondary); + margin: 0; } -.profile-content[data-v-8301bb50] { + +/* 内容区域 */ +.profile-content { max-width: 800px; margin: 0 auto; } -.profile-card[data-v-8301bb50] { + +/* 卡片样式 - 统一样式 */ +.profile-card, +.settings-section { background: var(--card-bg); border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 8px var(--shadow-color); } -.card-header[data-v-8301bb50] { + +/* 卡片头部 - 统一样式 */ +.card-header, +.settings-section h3 { margin: 0 0 16px 0; color: var(--text-primary); font-size: 14px; border-bottom: 2px solid var(--border-color); padding-bottom: 8px; } -.card-header h2[data-v-8301bb50] { + +.card-header h2, +.settings-section h3 { margin: 0; font-size: 14px; color: var(--text-primary); } -.info-grid[data-v-8301bb50] { + +/* 信息网格 */ +.info-grid { display: flex; flex-direction: column; gap: 0; } -.info-item[data-v-8301bb50] { + +/* 字段项 - 统一样式 */ +.info-item, +.setting-item { display: flex; align-items: center; justify-content: space-between; @@ -3772,84 +3533,74 @@ ___CSS_LOADER_EXPORT___.push([module.id, ` padding: 12px 0; border-bottom: 1px solid #f5f5f5; } -.info-item[data-v-8301bb50]:last-child { + +.info-item:last-child, +.setting-item:last-child { border-bottom: none; margin-bottom: 0; } -.info-item label[data-v-8301bb50] { + +/* 字段标签 - 统一样式 */ +.info-item label, +.setting-item label { font-weight: 500; color: var(--text-primary); min-width: 200px; font-size: 12px; } -.info-item span[data-v-8301bb50] { + +.info-item span { color: var(--text-primary); font-size: 12px; text-align: right; flex: 1; } -.status-badge[data-v-8301bb50] { - display: inline-block; - padding: 6px 12px; - border-radius: 20px; - font-size: 12px; - font-weight: 600; - text-align: center; - min-width: 80px; -} -.status-active[data-v-8301bb50] { - background: #d4edda; - color: #155724; -} -.status-inactive[data-v-8301bb50] { - background: #f8d7da; - color: #721c24; -} -.status-pending[data-v-8301bb50] { - background: #fff3cd; - color: #856404; -} -.status-unknown[data-v-8301bb50] { - background: #e2e3e5; - color: #383d41; -} -.roles-list[data-v-8301bb50] { + +/* 角色列表 */ +.roles-list { display: flex; flex-direction: column; gap: 16px; } -.role-item[data-v-8301bb50] { + +.role-item { background: var(--card-bg); border-radius: 8px; padding: 16px; border: 1px solid var(--border-color); margin-bottom: 12px; } -.role-header[data-v-8301bb50] { + +.role-header { margin-bottom: 12px; } -.role-name[data-v-8301bb50] { + +.role-name { display: block; font-size: 12px; font-weight: 600; color: var(--text-primary); margin-bottom: 8px; } -.role-description[data-v-8301bb50] { + +.role-description { color: var(--text-secondary); font-size: 12px; } -.role-permissions h4[data-v-8301bb50] { + +.role-permissions h4 { margin: 0 0 8px 0; color: var(--text-primary); font-size: 12px; } -.permissions-grid[data-v-8301bb50] { + +.permissions-grid { display: flex; flex-wrap: wrap; gap: 8px; } -.permission-tag[data-v-8301bb50] { + +.permission-tag { background: var(--accent-color); color: white; padding: 4px 12px; @@ -3857,107 +3608,174 @@ ___CSS_LOADER_EXPORT___.push([module.id, ` font-size: 12px; border: none; } -.no-roles[data-v-8301bb50] { + +.no-roles { text-align: center; color: var(--text-secondary); padding: 40px 20px; font-size: 12px; } -.profile-actions[data-v-8301bb50] { + +/* 操作按钮区域 - 统一样式 */ +.profile-actions, +.settings-actions { display: flex; gap: 16px; justify-content: flex-end; margin-top: 26px; } -.action-btn[data-v-8301bb50] { - padding: 12px 24px; - border: none; - border-radius: 6px; - cursor: pointer; - font-size: 12px; - font-weight: 500; - transition: all 0.2s; -} -.refresh-btn[data-v-8301bb50] { - background: #1976d2; - color: white; -} -.refresh-btn[data-v-8301bb50]:hover { - background: #1565c0; + +/* ===== 模态框样式 ===== */ + +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0,0,0,0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; } -.edit-btn[data-v-8301bb50] { - background: #f39c12; - color: white; + +.modal { + background: white; + border-radius: 8px; + width: 90%; + max-width: 500px; + max-height: 90vh; + overflow-y: auto; + box-sizing: border-box; } -.edit-btn[data-v-8301bb50]:hover { - background: #e67e22; + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px; + border-bottom: 1px solid #eee; } -.password-btn[data-v-8301bb50] { - background: #e74c3c; - color: white; + +.modal-header h3 { + margin: 0; + font-size: 14px; + font-weight: normal; } -.password-btn[data-v-8301bb50]:hover { - background: #c0392b; + +.close-btn { + background: none; + border: none; + font-size: 14px; + cursor: pointer; + color: #999; } -.empty-state[data-v-8301bb50] { - text-align: center; - padding: 80px 20px; + +.modal-body { + padding: 20px; + box-sizing: border-box; } -.empty-icon[data-v-8301bb50] { - font-size: 4rem; + +.form-group { margin-bottom: 20px; } -.empty-state h3[data-v-8301bb50] { - color: var(--text-primary); - margin-bottom: 10px; - font-size: 12px; -} -.empty-state p[data-v-8301bb50] { - color: var(--text-secondary); - margin-bottom: 30px; - font-size: 12px; + +.form-group label { + display: block; + margin-bottom: 8px; + font-weight: normal; + color: #333; + font-size: 14px; } -.login-btn[data-v-8301bb50] { - background: #1976d2; - color: white; - border: none; - padding: 12px 32px; + +.form-group input, +.form-group select, +.form-group textarea { + width: 100%; + padding: 8px 12px; + border: 1px solid var(--input-border); border-radius: 6px; - cursor: pointer; font-size: 12px; - font-weight: 500; + background-color: var(--input-bg); + color: var(--input-text); + box-sizing: border-box; } -.login-btn[data-v-8301bb50]:hover { - background: #1565c0; + +.form-group input:focus, +.form-group select:focus, +.form-group textarea:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.2); } -/* 响应式设计 */ +.form-actions { + display: flex; + gap: 12px; + justify-content: flex-end; + margin-top: 30px; +} + +/* ===== 响应式设计 ===== */ + @media (max-width: 768px) { -.user-profile[data-v-8301bb50] { + .management-page, + .user-profile { padding: 15px; -} -.profile-header h1[data-v-8301bb50] { + } + + .search-bar { + flex-direction: column; + align-items: stretch; + gap: 15px; + justify-content: flex-start; + } + + .search-input { + flex: 1; + min-width: auto; + max-width: none; + } + + .filters { + justify-content: space-between; + flex: none; + } + + .filters select { + flex: 1; + min-width: auto; + max-width: none; + } + + .profile-header h1 { font-size: 16px; -} -.info-item[data-v-8301bb50] { + } + + .info-item { flex-direction: column; align-items: flex-start; gap: 12px; -} -.info-item label[data-v-8301bb50] { + } + + .info-item label { min-width: auto; -} -.info-item span[data-v-8301bb50] { + } + + .info-item span { text-align: left; -} -.profile-actions[data-v-8301bb50] { + } + + .profile-actions { flex-direction: column; align-items: center; -} -.action-btn[data-v-8301bb50] { + } + + .action-btn { width: 100%; max-width: 300px; -} + } } `, ""]); // Exports @@ -9659,11 +9477,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.runtime.esm-bundler.js"); -const _hoisted_1 = { class: "role-management" } +const _hoisted_1 = { class: "role-management management-page" } const _hoisted_2 = { class: "search-bar" } const _hoisted_3 = { class: "search-input" } const _hoisted_4 = { class: "filters" } -const _hoisted_5 = { class: "role-table" } +const _hoisted_5 = { class: "role-table data-table" } const _hoisted_6 = { key: 0, class: "loading" @@ -9678,7 +9496,7 @@ const _hoisted_10 = ["onClick"] const _hoisted_11 = ["onClick"] const _hoisted_12 = ["onClick"] const _hoisted_13 = { - key: 3, + key: 0, class: "pagination" } const _hoisted_14 = ["disabled"] @@ -9789,34 +9607,34 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { ])) }), 128 /* KEYED_FRAGMENT */)) ]) - ])), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 分页 "), - ($setup.total > $setup.pageSize) - ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_13, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("button", { - disabled: $setup.currentPage === 1, - onClick: _cache[4] || (_cache[4] = $event => ($setup.handleCurrentChange($setup.currentPage - 1))), - class: "btn btn-sm" - }, _cache[24] || (_cache[24] = [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-chevron-left" }, null, -1 /* CACHED */), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 上一页 ", -1 /* CACHED */) - ]), 8 /* PROPS */, _hoisted_14), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_15, " 第 " + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.currentPage) + " 页,共 " + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(Math.ceil($setup.total / $setup.pageSize)) + " 页 ", 1 /* TEXT */), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("button", { - disabled: $setup.currentPage >= Math.ceil($setup.total / $setup.pageSize), - onClick: _cache[5] || (_cache[5] = $event => ($setup.handleCurrentChange($setup.currentPage + 1))), - class: "btn btn-sm" - }, _cache[25] || (_cache[25] = [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 下一页 ", -1 /* CACHED */), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-chevron-right" }, null, -1 /* CACHED */) - ]), 8 /* PROPS */, _hoisted_16) - ])) - : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true) + ])) ]), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 分页 "), + ($setup.total > $setup.pageSize) + ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_13, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("button", { + disabled: $setup.currentPage === 1, + onClick: _cache[4] || (_cache[4] = $event => ($setup.handleCurrentChange($setup.currentPage - 1))), + class: "btn btn-sm" + }, _cache[24] || (_cache[24] = [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-chevron-left" }, null, -1 /* CACHED */), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 上一页 ", -1 /* CACHED */) + ]), 8 /* PROPS */, _hoisted_14), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_15, " 第 " + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.currentPage) + " 页,共 " + (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(Math.ceil($setup.total / $setup.pageSize)) + " 页 ", 1 /* TEXT */), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("button", { + disabled: $setup.currentPage >= Math.ceil($setup.total / $setup.pageSize), + onClick: _cache[5] || (_cache[5] = $event => ($setup.handleCurrentChange($setup.currentPage + 1))), + class: "btn btn-sm" + }, _cache[25] || (_cache[25] = [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 下一页 ", -1 /* CACHED */), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-chevron-right" }, null, -1 /* CACHED */) + ]), 8 /* PROPS */, _hoisted_16) + ])) + : (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)("v-if", true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 创建/编辑角色对话框 "), ($setup.showCreateDialog) ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", { - key: 0, + key: 1, class: "modal-overlay", onClick: _cache[13] || (_cache[13] = $event => ($setup.showCreateDialog = false)) }, [ @@ -9912,7 +9730,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.runtime.esm-bundler.js"); -const _hoisted_1 = { class: "settings" } +const _hoisted_1 = { class: "settings management-page" } const _hoisted_2 = { class: "settings-content" } const _hoisted_3 = { class: "settings-section" } const _hoisted_4 = { class: "setting-item" } @@ -9948,12 +9766,18 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_1, [ _cache[43] || (_cache[43] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", { class: "page-header" }, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h2", null, "用户设置") + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h2", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-cog" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 用户设置") + ]) ], -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_2, [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 个人偏好 "), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_3, [ - _cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, "个人偏好", -1 /* CACHED */)), + _cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-user-cog" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 个人偏好") + ], -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_4, [ _cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "应用名称", -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("input", { @@ -9991,7 +9815,10 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { ]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 应用设置 "), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_7, [ - _cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, "应用设置", -1 /* CACHED */)), + _cache[25] || (_cache[25] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-tools" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 应用设置") + ], -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [ _cache[23] || (_cache[23] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "请求超时时间 (秒)", -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("input", { @@ -10017,7 +9844,10 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { ]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 用户设置 "), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [ - _cache[30] || (_cache[30] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, "用户设置", -1 /* CACHED */)), + _cache[30] || (_cache[30] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-user-shield" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 用户设置") + ], -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_11, [ _cache[27] || (_cache[27] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "关闭窗口不登出", -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_12, [ @@ -10053,7 +9883,10 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { ]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 通知偏好 "), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_15, [ - _cache[36] || (_cache[36] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, "通知偏好", -1 /* CACHED */)), + _cache[36] || (_cache[36] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-bell" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 通知偏好") + ], -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_16, [ _cache[32] || (_cache[32] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "桌面通知", -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_17, [ @@ -10100,7 +9933,10 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { ]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 数据管理 "), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_21, [ - _cache[42] || (_cache[42] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, "数据管理", -1 /* CACHED */)), + _cache[42] || (_cache[42] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-database" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 数据管理") + ], -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_22, [ _cache[37] || (_cache[37] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "数据缓存大小 (MB)", -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.withDirectives)((0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("input", { @@ -10609,12 +10445,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.runtime.esm-bundler.js"); -const _hoisted_1 = { class: "user-management" } +const _hoisted_1 = { class: "user-management management-page" } const _hoisted_2 = { class: "search-bar" } const _hoisted_3 = { class: "search-input" } const _hoisted_4 = { class: "filters" } const _hoisted_5 = ["value"] -const _hoisted_6 = { class: "user-table" } +const _hoisted_6 = { class: "user-table data-table" } const _hoisted_7 = { class: "role-tags" } const _hoisted_8 = { class: "actions" } const _hoisted_9 = ["onClick"] @@ -10893,51 +10729,48 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.runtime.esm-bundler.js"); -const _hoisted_1 = { class: "user-profile" } +const _hoisted_1 = { class: "user-profile management-page" } const _hoisted_2 = { key: 0, class: "loading-container" } const _hoisted_3 = { class: "error-container" } -const _hoisted_4 = { class: "profile-content" } -const _hoisted_5 = { class: "profile-card" } -const _hoisted_6 = { class: "card-content" } -const _hoisted_7 = { class: "info-grid" } +const _hoisted_4 = { class: "settings-content" } +const _hoisted_5 = { class: "settings-section" } +const _hoisted_6 = { class: "info-grid" } +const _hoisted_7 = { class: "info-item" } const _hoisted_8 = { class: "info-item" } const _hoisted_9 = { class: "info-item" } const _hoisted_10 = { class: "info-item" } const _hoisted_11 = { class: "info-item" } const _hoisted_12 = { class: "info-item" } -const _hoisted_13 = { class: "info-item" } -const _hoisted_14 = { class: "profile-card" } -const _hoisted_15 = { class: "card-content" } -const _hoisted_16 = { class: "info-grid" } -const _hoisted_17 = { class: "info-item" } -const _hoisted_18 = { class: "info-item" } -const _hoisted_19 = { class: "profile-card" } -const _hoisted_20 = { class: "card-content" } -const _hoisted_21 = { +const _hoisted_13 = { class: "settings-section" } +const _hoisted_14 = { class: "info-grid" } +const _hoisted_15 = { class: "info-item" } +const _hoisted_16 = { class: "info-item" } +const _hoisted_17 = { class: "settings-section" } +const _hoisted_18 = { key: 0, class: "roles-list" } -const _hoisted_22 = { class: "role-header" } -const _hoisted_23 = { class: "role-name" } -const _hoisted_24 = { class: "role-description" } -const _hoisted_25 = { class: "role-permissions" } -const _hoisted_26 = { class: "permissions-grid" } -const _hoisted_27 = { +const _hoisted_19 = { class: "role-header" } +const _hoisted_20 = { class: "role-name" } +const _hoisted_21 = { class: "role-description" } +const _hoisted_22 = { class: "role-permissions" } +const _hoisted_23 = { class: "permissions-grid" } +const _hoisted_24 = { key: 1, class: "no-roles" } -const _hoisted_28 = { class: "profile-actions" } -const _hoisted_29 = { class: "empty-state" } +const _hoisted_25 = { class: "settings-actions" } +const _hoisted_26 = { class: "empty-state" } function render(_ctx, _cache, $props, $setup, $data, $options) { const _component_PasswordChangeModal = (0,vue__WEBPACK_IMPORTED_MODULE_0__.resolveComponent)("PasswordChangeModal") return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_1, [ - _cache[29] || (_cache[29] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", { class: "profile-header" }, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h1", null, [ + _cache[29] || (_cache[29] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", { class: "page-header" }, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h2", null, [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-user" }), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 个人资料") ]), @@ -10973,115 +10806,103 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_4, [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 基本信息卡片 "), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_5, [ - _cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", { class: "card-header" }, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h2", null, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-info-circle" }), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 基本信息") - ]) + _cache[16] || (_cache[16] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-info-circle" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 基本信息") ], -1 /* CACHED */)), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_6, [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_7, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [ - _cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "用户ID", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.id || 'N/A'), 1 /* TEXT */) - ]), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [ - _cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "用户名", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.username || $setup.userInfo.name || 'N/A'), 1 /* TEXT */) - ]), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [ - _cache[12] || (_cache[12] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "邮箱", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.email || 'N/A'), 1 /* TEXT */) - ]), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_11, [ - _cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "手机号", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.phone || 'N/A'), 1 /* TEXT */) - ]), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_12, [ - _cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "状态", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", { - class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(['status-badge', $setup.getStatusClass($setup.userInfo.status)]) - }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.getStatusText($setup.userInfo.status)), 3 /* TEXT, CLASS */) - ]), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_13, [ - _cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "注册时间", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatDate($setup.userInfo.created_at) || $setup.formatDate($setup.userInfo.createdAt) || 'N/A'), 1 /* TEXT */) - ]) + _cache[10] || (_cache[10] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "用户ID", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.id || 'N/A'), 1 /* TEXT */) + ]), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_8, [ + _cache[11] || (_cache[11] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "用户名", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.username || $setup.userInfo.name || 'N/A'), 1 /* TEXT */) + ]), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_9, [ + _cache[12] || (_cache[12] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "邮箱", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.email || 'N/A'), 1 /* TEXT */) + ]), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_10, [ + _cache[13] || (_cache[13] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "手机号", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.phone || 'N/A'), 1 /* TEXT */) + ]), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_11, [ + _cache[14] || (_cache[14] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "状态", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", { + class: (0,vue__WEBPACK_IMPORTED_MODULE_0__.normalizeClass)(['status-badge', $setup.getStatusClass($setup.userInfo.status)]) + }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.getStatusText($setup.userInfo.status)), 3 /* TEXT, CLASS */) + ]), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_12, [ + _cache[15] || (_cache[15] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "注册时间", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatDate($setup.userInfo.created_at) || $setup.formatDate($setup.userInfo.createdAt) || 'N/A'), 1 /* TEXT */) ]) ]) ]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 登录信息卡片 "), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_14, [ - _cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", { class: "card-header" }, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h2", null, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-lock" }), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 登录信息") - ]) + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_13, [ + _cache[19] || (_cache[19] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-lock" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 登录信息") ], -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_15, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_14, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_15, [ + _cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "上次登录时间", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatDate($setup.userInfo.last_login_at) || $setup.formatDate($setup.userInfo.lastLogin) || 'N/A'), 1 /* TEXT */) + ]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_16, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_17, [ - _cache[17] || (_cache[17] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "上次登录时间", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.formatDate($setup.userInfo.last_login_at) || $setup.formatDate($setup.userInfo.lastLogin) || 'N/A'), 1 /* TEXT */) - ]), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_18, [ - _cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "上次登录IP", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.last_login_ip || $setup.userInfo.lastLoginIP || 'N/A'), 1 /* TEXT */) - ]) + _cache[18] || (_cache[18] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("label", null, "上次登录IP", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)($setup.userInfo.last_login_ip || $setup.userInfo.lastLoginIP || 'N/A'), 1 /* TEXT */) ]) ]) ]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 角色信息卡片 "), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_19, [ - _cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", { class: "card-header" }, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h2", null, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-crown" }), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 角色信息") - ]) + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_17, [ + _cache[22] || (_cache[22] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h3", null, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-crown" }), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 角色信息") ], -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_20, [ - ($setup.userInfo.roles && $setup.userInfo.roles.length > 0) - ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_21, [ - ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.userInfo.roles, (role) => { - return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", { - key: role.id, - class: "role-item" - }, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_22, [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_23, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(role.name), 1 /* TEXT */), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_24, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(role.description || '无描述'), 1 /* TEXT */) - ]), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_25, [ - _cache[20] || (_cache[20] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h4", null, "权限列表:", -1 /* CACHED */)), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_26, [ - ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(role.permissions, (permission) => { - return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("span", { - key: permission.id, - class: "permission-tag" - }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(permission.name), 1 /* TEXT */)) - }), 128 /* KEYED_FRAGMENT */)) - ]) + ($setup.userInfo.roles && $setup.userInfo.roles.length > 0) + ? ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_18, [ + ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)($setup.userInfo.roles, (role) => { + return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", { + key: role.id, + class: "role-item" + }, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_19, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_20, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(role.name), 1 /* TEXT */), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("span", _hoisted_21, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(role.description || '无描述'), 1 /* TEXT */) + ]), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_22, [ + _cache[20] || (_cache[20] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("h4", null, "权限列表:", -1 /* CACHED */)), + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_23, [ + ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(true), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, (0,vue__WEBPACK_IMPORTED_MODULE_0__.renderList)(role.permissions, (permission) => { + return ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("span", { + key: permission.id, + class: "permission-tag" + }, (0,vue__WEBPACK_IMPORTED_MODULE_0__.toDisplayString)(permission.name), 1 /* TEXT */)) + }), 128 /* KEYED_FRAGMENT */)) ]) - ])) - }), 128 /* KEYED_FRAGMENT */)) - ])) - : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_27, _cache[21] || (_cache[21] = [ - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, "暂无角色信息", -1 /* CACHED */) - ]))) - ]) + ]) + ])) + }), 128 /* KEYED_FRAGMENT */)) + ])) + : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)("div", _hoisted_24, _cache[21] || (_cache[21] = [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("p", null, "暂无角色信息", -1 /* CACHED */) + ]))) ]), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 操作按钮 "), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_28, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_25, [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("button", { onClick: _cache[1] || (_cache[1] = (...args) => ($setup.refreshProfile && $setup.refreshProfile(...args))), - class: "action-btn refresh-btn" + class: "btn btn-secondary" }, _cache[23] || (_cache[23] = [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-sync-alt" }, null, -1 /* CACHED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 刷新信息 ", -1 /* CACHED */) ])), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("button", { onClick: _cache[2] || (_cache[2] = (...args) => ($setup.changePassword && $setup.changePassword(...args))), - class: "action-btn password-btn" + class: "btn btn-primary" }, _cache[24] || (_cache[24] = [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-lock" }, null, -1 /* CACHED */), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createTextVNode)(" 修改密码 ", -1 /* CACHED */) @@ -11091,7 +10912,7 @@ function render(_ctx, _cache, $props, $setup, $data, $options) { ], 2112 /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */)) : ((0,vue__WEBPACK_IMPORTED_MODULE_0__.openBlock)(), (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementBlock)(vue__WEBPACK_IMPORTED_MODULE_0__.Fragment, { key: 3 }, [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createCommentVNode)(" 空状态 "), - (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_29, [ + (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", _hoisted_26, [ _cache[26] || (_cache[26] = (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("div", { class: "empty-icon" }, [ (0,vue__WEBPACK_IMPORTED_MODULE_0__.createElementVNode)("i", { class: "fas fa-user" }) ], -1 /* CACHED */)), @@ -14987,7 +14808,7 @@ __webpack_require__.r(__webpack_exports__); /******/ /******/ /* webpack/runtime/getFullHash */ /******/ (() => { -/******/ __webpack_require__.h = () => ("f9fe06d9886e8953") +/******/ __webpack_require__.h = () => ("46c51ec3a05924ce") /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/gofaster/app/src/renderer/assets/README-COMMON-STYLES.md b/gofaster/app/src/renderer/assets/README-COMMON-STYLES.md new file mode 100644 index 0000000..58c5ec4 --- /dev/null +++ b/gofaster/app/src/renderer/assets/README-COMMON-STYLES.md @@ -0,0 +1,221 @@ +# 公共样式使用指南 + +## 概述 + +`common-styles.css` 文件包含了系统中所有管理页面的通用样式,旨在提供一致的用户界面体验。 + +## 包含的样式 + +### 1. 管理页面基础样式 +- `.management-page` - 管理页面的基础容器样式 +- 统一的页面内边距和布局 + +### 2. 搜索栏和输入控件样式 +- `.search-bar` - 搜索栏容器 +- `.search-input` - 搜索输入框 +- `.filters` - 筛选器容器 +- `.filters select` - 筛选器下拉选择框 +- `.setting-item input[type="text"]` - 文本输入框 +- `.setting-item input[type="number"]` - 数字输入框 +- `.setting-item select` - 下拉选择框 +- 统一的输入控件样式和焦点效果 +- 响应式设计支持 + +### 3. 表格样式 +- `.data-table` - 数据表格容器 +- `table`, `th`, `td` - 表格基础样式 +- 统一的字体大小和间距 + +### 4. 状态徽章 +- `.status-badge` - 状态徽章基础样式 +- `.status-badge.active` - 激活状态 +- `.status-badge.inactive` - 非激活状态 + +### 5. 角色标签 +- `.role-tags` - 角色标签容器 +- `.role-tag` - 单个角色标签 + +### 6. 按钮样式 +- `.btn` - 基础按钮样式 +- `.btn-primary`, `.btn-info`, `.btn-danger` - 不同颜色变体 +- `.btn-sm` - 小尺寸按钮 +- 表格操作按钮的特殊样式 + +### 7. 分页样式 +- `.pagination` - 分页容器 +- `.page-info` - 页码信息 + +### 8. 页面头部和卡片样式(统一) +- `.page-header`, `.profile-header` - 页面头部统一样式 +- `.page-header h2`, `.profile-header h1` - 页面标题统一样式(支持图标) +- `.card-header`, `.settings-section h3` - 卡片头部统一样式(支持图标) +- `.profile-card`, `.settings-section` - 卡片容器统一样式 +- `.info-item`, `.setting-item` - 字段项统一样式 +- `.info-item label`, `.setting-item label` - 字段标签统一样式 +- `.profile-actions`, `.settings-actions` - 操作按钮区域统一样式 + +### 9. 模态框样式 +- `.modal-overlay` - 模态框遮罩 +- `.modal` - 模态框容器 +- `.modal-header`, `.modal-body` - 模态框内容区域 +- `.form-group` - 表单组样式 +- `.form-group input`, `.form-group select`, `.form-group textarea` - 模态框输入控件(使用统一样式) + +### 10. 响应式设计 +- 移动端适配样式 +- 不同屏幕尺寸的布局调整 + +## 使用方法 + +### 1. 在Vue组件中引入 + +```vue + +``` + +### 2. 在HTML模板中使用 + +```vue + +``` + +## 样式类名说明 + +### 容器类 +- `management-page` - 管理页面主容器 +- `data-table` - 数据表格容器 +- `settings-content` - 内容区域容器 + +### 布局类 +- `search-bar` - 搜索栏布局 +- `info-grid` - 信息网格布局 +- `roles-list` - 角色列表布局 +- `page-header` - 页面头部布局 +- `settings-section` - 设置分组布局 + +### 组件类 +- `status-badge` - 状态徽章 +- `role-tag` - 角色标签 +- `btn` - 按钮基础类 +- `modal` - 模态框 +- `input[type="text"]` - 文本输入框 +- `input[type="number"]` - 数字输入框 +- `select` - 下拉选择框 + +### 状态类 +- `active` - 激活状态 +- `inactive` - 非激活状态 +- `primary` - 主要样式 +- `danger` - 危险样式 + +## 自定义样式 + +如果需要自定义样式,建议: + +1. 在公共样式基础上添加特定样式 +2. 使用更具体的选择器来覆盖公共样式 +3. 保持与公共样式的一致性 + +```vue + +``` + +## 维护说明 + +- 修改公共样式时,请确保不影响现有页面的显示 +- 新增样式时,请遵循现有的命名规范 +- 定期检查所有使用公共样式的页面,确保样式一致性 + diff --git a/gofaster/app/src/renderer/assets/common-styles.css b/gofaster/app/src/renderer/assets/common-styles.css new file mode 100644 index 0000000..619a233 --- /dev/null +++ b/gofaster/app/src/renderer/assets/common-styles.css @@ -0,0 +1,576 @@ +/* ===== 通用管理页面样式 ===== */ + +/* 页面容器 */ +.management-page { + padding: 20px; + padding-top: 10px; +} + +/* 搜索栏样式 */ +.search-bar { + display: flex; + gap: 20px; + margin-bottom: 6px; + margin-top: 0; + align-items: center; + flex-wrap: wrap; + justify-content: space-between; +} + +.search-input { + position: relative; + flex: 0 0 280px; + min-width: 200px; + max-width: 350px; +} + +.search-input i { + position: absolute; + left: 12px; + top: 50%; + transform: translateY(-50%); + color: var(--text-muted); + font-size: 12px; +} + +/* 输入控件统一样式 */ +.search-input input, +.setting-item input[type="text"], +.setting-item input[type="number"], +.setting-item select { + width: 100%; + padding: 8px 12px; + border: 1px solid var(--input-border); + border-radius: 6px; + font-size: 12px; + background-color: var(--input-bg); + color: var(--input-text); + box-sizing: border-box; +} + +/* 搜索输入框特殊样式(左侧图标) */ +.search-input input { + padding-left: 35px; +} + +/* 设置项输入框特殊样式(最小宽度) */ +.setting-item input[type="text"], +.setting-item input[type="number"], +.setting-item select { + min-width: 200px; +} + +/* 输入控件焦点样式 */ +.search-input input:focus, +.setting-item input[type="text"]:focus, +.setting-item input[type="number"]:focus, +.setting-item select:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.2); +} + +.filters { + display: flex; + gap: 15px; + flex-wrap: wrap; + flex: 1; + justify-content: flex-end; + align-items: center; + min-width: 0; +} + +.filters select { + padding: 8px 12px; + border: 1px solid var(--input-border); + border-radius: 6px; + font-size: 12px; + background-color: var(--input-bg); + color: var(--input-text); + min-width: 100px; + max-width: 150px; + flex: 0 0 auto; + box-sizing: border-box; +} + +.filters select:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.2); +} + +/* 表格样式 */ +.data-table { + background: var(--card-bg); + border-radius: 8px; + box-shadow: 0 2px 8px var(--shadow-color); + overflow: hidden; + margin-bottom: 20px; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, td { + padding: 8px; + text-align: left; + border-bottom: 1px solid var(--border-color); + font-size: 12px; +} + +th { + background: var(--bg-secondary); + font-weight: normal; + color: var(--text-primary); + font-size: 14px; +} + +/* 状态徽章 */ +.status-badge { + padding: 4px 8px; + border-radius: 12px; + font-size: 12px; + font-weight: normal; +} + +.status-badge.active { + background: #e8f5e8; + color: #2e7d32; +} + +.status-badge.inactive { + background: #ffebee; + color: #c62828; +} + +/* 角色标签 */ +.role-tags { + display: flex; + gap: 4px; + flex-wrap: wrap; +} + +.role-tag { + background: #e3f2fd; + color: #1976d2; + padding: 2px 6px; + border-radius: 4px; + font-size: 14px; +} + +/* 操作按钮 */ +.actions { + display: flex; + gap: 8px; +} + +.btn { + padding: 8px 16px; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 12px; + display: inline-flex; + align-items: center; + gap: 6px; + transition: all 0.2s; +} + +.btn-primary { + background: #1976d2; + color: white; +} + +.btn-primary:hover { + background: #1565c0; +} + +.btn-info { + background: #0288d1; + color: white; +} + +.btn-danger { + background: #d32f2f; + color: white; +} + +.btn-sm { + padding: 6px 12px; + font-size: 10px; +} + +/* 表格操作按钮样式优化 */ +.actions .btn-sm { + background: none; + border: none; + padding: 6px 10px; + margin: 0 -2px; + color: var(--text-primary); + transition: all 0.2s; +} + +.actions .btn-sm i { + font-size: 14px; +} + +.actions .btn-sm:hover { + background: var(--bg-secondary); + color: var(--accent-color); + transform: scale(1.1); +} + +.actions .btn-sm.btn-info:hover { + color: #2196f3; +} + +.actions .btn-sm.btn-primary:hover { + color: #1976d2; +} + +.actions .btn-sm.btn-danger:hover { + color: #d32f2f; +} + +/* 分页样式 */ +.pagination { + display: flex; + justify-content: center; + align-items: center; + gap: 20px; +} + +.page-info { + color: #666; + font-size: 14px; +} + +/* 分页按钮字体大小统一 */ +.pagination .btn-sm { + font-size: 10px; +} + +/* ===== 个人资料页面样式 ===== */ + +/* 个人资料容器 */ +.user-profile { + padding: 20px; +} + +/* 页面头部 - 统一样式 */ +.page-header, +.profile-header { + text-align: center; + margin-bottom: 26px; +} + +.page-header h2, +.profile-header h1 { + font-size: 16px; + color: var(--text-primary); + margin-bottom: 10px; + margin: 0; +} + +.profile-subtitle { + font-size: 12px; + color: var(--text-secondary); + margin: 0; +} + +/* 内容区域 */ +.profile-content { + max-width: 800px; + margin: 0 auto; +} + +/* 卡片样式 - 统一样式 */ +.profile-card, +.settings-section { + background: var(--card-bg); + border-radius: 8px; + padding: 20px; + margin-bottom: 20px; + box-shadow: 0 2px 8px var(--shadow-color); +} + +/* 卡片头部 - 统一样式 */ +.card-header, +.settings-section h3 { + margin: 0 0 16px 0; + color: var(--text-primary); + font-size: 14px; + border-bottom: 2px solid var(--border-color); + padding-bottom: 8px; +} + +.card-header h2, +.settings-section h3 { + margin: 0; + font-size: 14px; + color: var(--text-primary); +} + +/* 信息网格 */ +.info-grid { + display: flex; + flex-direction: column; + gap: 0; +} + +/* 字段项 - 统一样式 */ +.info-item, +.setting-item { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 16px; + padding: 12px 0; + border-bottom: 1px solid #f5f5f5; +} + +.info-item:last-child, +.setting-item:last-child { + border-bottom: none; + margin-bottom: 0; +} + +/* 字段标签 - 统一样式 */ +.info-item label, +.setting-item label { + font-weight: 500; + color: var(--text-primary); + min-width: 200px; + font-size: 12px; +} + +.info-item span { + color: var(--text-primary); + font-size: 12px; + text-align: right; + flex: 1; +} + +/* 角色列表 */ +.roles-list { + display: flex; + flex-direction: column; + gap: 16px; +} + +.role-item { + background: var(--card-bg); + border-radius: 8px; + padding: 16px; + border: 1px solid var(--border-color); + margin-bottom: 12px; +} + +.role-header { + margin-bottom: 12px; +} + +.role-name { + display: block; + font-size: 12px; + font-weight: 600; + color: var(--text-primary); + margin-bottom: 8px; +} + +.role-description { + color: var(--text-secondary); + font-size: 12px; +} + +.role-permissions h4 { + margin: 0 0 8px 0; + color: var(--text-primary); + font-size: 12px; +} + +.permissions-grid { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.permission-tag { + background: var(--accent-color); + color: white; + padding: 4px 12px; + border-radius: 16px; + font-size: 12px; + border: none; +} + +.no-roles { + text-align: center; + color: var(--text-secondary); + padding: 40px 20px; + font-size: 12px; +} + +/* 操作按钮区域 - 统一样式 */ +.profile-actions, +.settings-actions { + display: flex; + gap: 16px; + justify-content: flex-end; + margin-top: 26px; +} + +/* ===== 模态框样式 ===== */ + +.modal-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0,0,0,0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +} + +.modal { + background: white; + border-radius: 8px; + width: 90%; + max-width: 500px; + max-height: 90vh; + overflow-y: auto; + box-sizing: border-box; +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20px; + border-bottom: 1px solid #eee; +} + +.modal-header h3 { + margin: 0; + font-size: 14px; + font-weight: normal; +} + +.close-btn { + background: none; + border: none; + font-size: 14px; + cursor: pointer; + color: #999; +} + +.modal-body { + padding: 20px; + box-sizing: border-box; +} + +.form-group { + margin-bottom: 20px; +} + +.form-group label { + display: block; + margin-bottom: 8px; + font-weight: normal; + color: #333; + font-size: 14px; +} + +.form-group input, +.form-group select, +.form-group textarea { + width: 100%; + padding: 8px 12px; + border: 1px solid var(--input-border); + border-radius: 6px; + font-size: 12px; + background-color: var(--input-bg); + color: var(--input-text); + box-sizing: border-box; +} + +.form-group input:focus, +.form-group select:focus, +.form-group textarea:focus { + outline: none; + border-color: var(--accent-color); + box-shadow: 0 0 0 2px rgba(74, 158, 255, 0.2); +} + +.form-actions { + display: flex; + gap: 12px; + justify-content: flex-end; + margin-top: 30px; +} + +/* ===== 响应式设计 ===== */ + +@media (max-width: 768px) { + .management-page, + .user-profile { + padding: 15px; + } + + .search-bar { + flex-direction: column; + align-items: stretch; + gap: 15px; + justify-content: flex-start; + } + + .search-input { + flex: 1; + min-width: auto; + max-width: none; + } + + .filters { + justify-content: space-between; + flex: none; + } + + .filters select { + flex: 1; + min-width: auto; + max-width: none; + } + + .profile-header h1 { + font-size: 16px; + } + + .info-item { + flex-direction: column; + align-items: flex-start; + gap: 12px; + } + + .info-item label { + min-width: auto; + } + + .info-item span { + text-align: left; + } + + .profile-actions { + flex-direction: column; + align-items: center; + } + + .action-btn { + width: 100%; + max-width: 300px; + } +} diff --git a/gofaster/app/src/renderer/modules/role-management/views/RoleManagement.vue b/gofaster/app/src/renderer/modules/role-management/views/RoleManagement.vue index 4e3ffaf..71fbcf7 100644 --- a/gofaster/app/src/renderer/modules/role-management/views/RoleManagement.vue +++ b/gofaster/app/src/renderer/modules/role-management/views/RoleManagement.vue @@ -1,5 +1,5 @@