Browse Source

修改系统管理的所有修改删除按钮和接口,修改视频的透明度

inspection_yanyuan
douyage 3 weeks ago
parent
commit
8f24377b0d
13 changed files with 213 additions and 75 deletions
  1. +5
    -5
      src/api/system/config.js
  2. +4
    -4
      src/api/system/dept.js
  3. +4
    -4
      src/api/system/dict/data.js
  4. +5
    -5
      src/api/system/dict/type.js
  5. +5
    -5
      src/api/system/menu.js
  6. +4
    -4
      src/api/system/notice.js
  7. +4
    -4
      src/api/system/post.js
  8. +10
    -10
      src/api/system/role.js
  9. +11
    -11
      src/api/system/user.js
  10. +10
    -1
      src/assets/styles/ruoyi.scss
  11. +4
    -1
      src/views/portal/components/PortalDeviceTree.vue
  12. +136
    -21
      src/views/portal/index.vue
  13. +11
    -0
      src/views/system/user/index.vue

+ 5
- 5
src/api/system/config.js View File

@ -37,8 +37,8 @@ export function addConfig(data) {
// 修改参数配置 // 修改参数配置
export function updateConfig(data) { export function updateConfig(data) {
return request({ return request({
url: '/system/config',
method: 'put',
url: '/system/config/edit',
method: 'post',
data: data data: data
}) })
} }
@ -46,8 +46,8 @@ export function updateConfig(data) {
// 删除参数配置 // 删除参数配置
export function delConfig(configId) { export function delConfig(configId) {
return request({ return request({
url: '/system/config/' + configId,
method: 'delete'
url: '/system/config/remove/' + configId,
method: 'post'
}) })
} }
@ -55,7 +55,7 @@ export function delConfig(configId) {
export function refreshCache() { export function refreshCache() {
return request({ return request({
url: '/system/config/refreshCache', url: '/system/config/refreshCache',
method: 'delete'
method: 'post'
}) })
} }
// 批量获取参数配置 // 批量获取参数配置


+ 4
- 4
src/api/system/dept.js View File

@ -37,8 +37,8 @@ export function addDept(data) {
// 修改部门 // 修改部门
export function updateDept(data) { export function updateDept(data) {
return request({ return request({
url: '/system/dept',
method: 'put',
url: '/system/dept/edit',
method: 'post',
data: data data: data
}) })
} }
@ -46,7 +46,7 @@ export function updateDept(data) {
// 删除部门 // 删除部门
export function delDept(deptId) { export function delDept(deptId) {
return request({ return request({
url: '/system/dept/' + deptId,
method: 'delete'
url: '/system/dept/remove/' + deptId,
method: 'post'
}) })
} }

+ 4
- 4
src/api/system/dict/data.js View File

@ -37,8 +37,8 @@ export function addData(data) {
// 修改字典数据 // 修改字典数据
export function updateData(data) { export function updateData(data) {
return request({ return request({
url: '/system/dict/data',
method: 'put',
url: '/system/dict/data/edit',
method: 'post',
data: data data: data
}) })
} }
@ -46,7 +46,7 @@ export function updateData(data) {
// 删除字典数据 // 删除字典数据
export function delData(dictCode) { export function delData(dictCode) {
return request({ return request({
url: '/system/dict/data/' + dictCode,
method: 'delete'
url: '/system/dict/data/remove/' + dictCode,
method: 'post'
}) })
} }

+ 5
- 5
src/api/system/dict/type.js View File

@ -29,8 +29,8 @@ export function addType(data) {
// 修改字典类型 // 修改字典类型
export function updateType(data) { export function updateType(data) {
return request({ return request({
url: '/system/dict/type',
method: 'put',
url: '/system/dict/type/edit',
method: 'post',
data: data data: data
}) })
} }
@ -38,8 +38,8 @@ export function updateType(data) {
// 删除字典类型 // 删除字典类型
export function delType(dictId) { export function delType(dictId) {
return request({ return request({
url: '/system/dict/type/' + dictId,
method: 'delete'
url: '/system/dict/type/remove/' + dictId,
method: 'post'
}) })
} }
@ -47,7 +47,7 @@ export function delType(dictId) {
export function refreshCache() { export function refreshCache() {
return request({ return request({
url: '/system/dict/type/refreshCache', url: '/system/dict/type/refreshCache',
method: 'delete'
method: 'post'
}) })
} }


+ 5
- 5
src/api/system/menu.js View File

@ -20,7 +20,7 @@ export function getMenu(menuId) {
// 查询菜单下拉树结构 // 查询菜单下拉树结构
export function treeselect() { export function treeselect() {
return request({ return request({
url: '/system/menu/treeselect',
url: '/system/menu/filterTreeselect',
method: 'get' method: 'get'
}) })
} }
@ -45,8 +45,8 @@ export function addMenu(data) {
// 修改菜单 // 修改菜单
export function updateMenu(data) { export function updateMenu(data) {
return request({ return request({
url: '/system/menu',
method: 'put',
url: '/system/menu/edit',
method: 'post',
data: data data: data
}) })
} }
@ -54,7 +54,7 @@ export function updateMenu(data) {
// 删除菜单 // 删除菜单
export function delMenu(menuId) { export function delMenu(menuId) {
return request({ return request({
url: '/system/menu/' + menuId,
method: 'delete'
url: '/system/menu/remove/' + menuId,
method: 'post'
}) })
} }

+ 4
- 4
src/api/system/notice.js View File

@ -29,8 +29,8 @@ export function addNotice(data) {
// 修改公告 // 修改公告
export function updateNotice(data) { export function updateNotice(data) {
return request({ return request({
url: '/system/notice',
method: 'put',
url: '/system/notice/edit',
method: 'post',
data: data data: data
}) })
} }
@ -38,7 +38,7 @@ export function updateNotice(data) {
// 删除公告 // 删除公告
export function delNotice(noticeId) { export function delNotice(noticeId) {
return request({ return request({
url: '/system/notice/' + noticeId,
method: 'delete'
url: '/system/notice/remove/' + noticeId,
method: 'post'
}) })
} }

+ 4
- 4
src/api/system/post.js View File

@ -29,8 +29,8 @@ export function addPost(data) {
// 修改岗位 // 修改岗位
export function updatePost(data) { export function updatePost(data) {
return request({ return request({
url: '/system/post',
method: 'put',
url: '/system/post/edit',
method: 'post',
data: data data: data
}) })
} }
@ -38,7 +38,7 @@ export function updatePost(data) {
// 删除岗位 // 删除岗位
export function delPost(postId) { export function delPost(postId) {
return request({ return request({
url: '/system/post/' + postId,
method: 'delete'
url: '/system/post/remove/' + postId,
method: 'post'
}) })
} }

+ 10
- 10
src/api/system/role.js View File

@ -29,8 +29,8 @@ export function addRole(data) {
// 修改角色 // 修改角色
export function updateRole(data) { export function updateRole(data) {
return request({ return request({
url: '/system/role',
method: 'put',
url: '/system/role/edit',
method: 'post',
data: data data: data
}) })
} }
@ -39,7 +39,7 @@ export function updateRole(data) {
export function dataScope(data) { export function dataScope(data) {
return request({ return request({
url: '/system/role/dataScope', url: '/system/role/dataScope',
method: 'put',
method: 'post',
data: data data: data
}) })
} }
@ -52,7 +52,7 @@ export function changeRoleStatus(roleId, status) {
} }
return request({ return request({
url: '/system/role/changeStatus', url: '/system/role/changeStatus',
method: 'put',
method: 'post',
data: data data: data
}) })
} }
@ -60,8 +60,8 @@ export function changeRoleStatus(roleId, status) {
// 删除角色 // 删除角色
export function delRole(roleId) { export function delRole(roleId) {
return request({ return request({
url: '/system/role/' + roleId,
method: 'delete'
url: '/system/role/remove/' + roleId,
method: 'post'
}) })
} }
@ -87,7 +87,7 @@ export function unallocatedUserList(query) {
export function authUserCancel(data) { export function authUserCancel(data) {
return request({ return request({
url: '/system/role/authUser/cancel', url: '/system/role/authUser/cancel',
method: 'put',
method: 'post',
data: data data: data
}) })
} }
@ -96,7 +96,7 @@ export function authUserCancel(data) {
export function authUserCancelAll(data) { export function authUserCancelAll(data) {
return request({ return request({
url: '/system/role/authUser/cancelAll', url: '/system/role/authUser/cancelAll',
method: 'put',
method: 'post',
params: data params: data
}) })
} }
@ -105,7 +105,7 @@ export function authUserCancelAll(data) {
export function authUserSelectAll(data) { export function authUserSelectAll(data) {
return request({ return request({
url: '/system/role/authUser/selectAll', url: '/system/role/authUser/selectAll',
method: 'put',
method: 'post',
params: data params: data
}) })
} }
@ -113,7 +113,7 @@ export function authUserSelectAll(data) {
// 根据角色ID查询部门树结构 // 根据角色ID查询部门树结构
export function deptTreeSelect(roleId) { export function deptTreeSelect(roleId) {
return request({ return request({
url: '/system/role/deptTree/' + roleId,
url: '/system/dept/roleDeptTreeselect/' + roleId,
method: 'get' method: 'get'
}) })
} }

+ 11
- 11
src/api/system/user.js View File

@ -30,8 +30,8 @@ export function addUser(data) {
// 修改用户 // 修改用户
export function updateUser(data) { export function updateUser(data) {
return request({ return request({
url: '/system/user',
method: 'put',
url: '/system/user/edit',
method: 'post',
data: data data: data
}) })
} }
@ -39,8 +39,8 @@ export function updateUser(data) {
// 删除用户 // 删除用户
export function delUser(userId) { export function delUser(userId) {
return request({ return request({
url: '/system/user/' + userId,
method: 'delete'
url: '/system/user/remove/' + userId,
method: 'post'
}) })
} }
@ -52,7 +52,7 @@ export function resetUserPwd(userId, password) {
} }
return request({ return request({
url: '/system/user/resetPwd', url: '/system/user/resetPwd',
method: 'put',
method: 'post',
data: data data: data
}) })
} }
@ -65,7 +65,7 @@ export function changeUserStatus(userId, status) {
} }
return request({ return request({
url: '/system/user/changeStatus', url: '/system/user/changeStatus',
method: 'put',
method: 'post',
data: data data: data
}) })
} }
@ -82,7 +82,7 @@ export function getUserProfile() {
export function updateUserProfile(data) { export function updateUserProfile(data) {
return request({ return request({
url: '/system/user/profile', url: '/system/user/profile',
method: 'put',
method: 'post',
data: data data: data
}) })
} }
@ -95,8 +95,8 @@ export function updateUserPwd(oldPassword, newPassword) {
} }
return request({ return request({
url: '/system/user/profile/updatePwd', url: '/system/user/profile/updatePwd',
method: 'put',
data: data
method: 'post',
params: data
}) })
} }
@ -122,7 +122,7 @@ export function getAuthRole(userId) {
export function updateAuthRole(data) { export function updateAuthRole(data) {
return request({ return request({
url: '/system/user/authRole', url: '/system/user/authRole',
method: 'put',
method: 'post',
params: data params: data
}) })
} }
@ -130,7 +130,7 @@ export function updateAuthRole(data) {
// 查询部门下拉树结构 // 查询部门下拉树结构
export function deptTreeSelect() { export function deptTreeSelect() {
return request({ return request({
url: '/system/user/deptTree',
url: '/system/dept/treeselect',
method: 'get' method: 'get'
}) })
} }

+ 10
- 1
src/assets/styles/ruoyi.scss View File

@ -670,7 +670,7 @@ table tbody tr > td {
.el-tree { .el-tree {
color: #dcecff; color: #dcecff;
// background-color: #0F124A !important;
background-color: transparent !important;
} }
.el-tree-node__content { .el-tree-node__content {
@ -1353,6 +1353,15 @@ body .el-table .el-button:active {
color: #43c0ff !important; color: #43c0ff !important;
} }
body .el-table .el-button.el-button--text,
body .el-table .el-button.el-button--text:hover,
body .el-table .el-button.el-button--text:focus,
body .el-table .el-button.el-button--text:active {
background: transparent !important;
background-image: none !important;
border-color: transparent !important;
}
body .el-button.el-button--primary:not(:has(.el-icon-search)):hover, body .el-button.el-button--primary:not(:has(.el-icon-search)):hover,
body .el-button.el-button--primary:not(:has(.el-icon-search)):focus, body .el-button.el-button--primary:not(:has(.el-icon-search)):focus,
body .el-button.el-button--primary:not(:has(.el-icon-search)):active, body .el-button.el-button--primary:not(:has(.el-icon-search)):active,


+ 4
- 1
src/views/portal/components/PortalDeviceTree.vue View File

@ -81,7 +81,9 @@ export default {
props: { props: {
selectedCode: { type: String, default: "" }, selectedCode: { type: String, default: "" },
// 只跟首页场站选择,不吃动环巡检右上角的站 // 只跟首页场站选择,不吃动环巡检右上角的站
stationCode: { type: String, default: "" }
stationCode: { type: String, default: "" },
// 摄像头来源:动环 / 消防 / 安防;空表示不按来源过滤
deviceSource: { type: String, default: "" }
}, },
data() { data() {
return { return {
@ -127,6 +129,7 @@ export default {
try { try {
const query = { onlineStatus: this.onlineStatus, patroldeviceTypeFlag: "ipc" }; const query = { onlineStatus: this.onlineStatus, patroldeviceTypeFlag: "ipc" };
if (this.stationCode) query.stationCode = this.stationCode; if (this.stationCode) query.stationCode = this.stationCode;
if (this.deviceSource) query.deviceSource = this.deviceSource;
const response = await getChannelTree(query, { skipWorkspaceStation: true }); const response = await getChannelTree(query, { skipWorkspaceStation: true });
if (requestId !== this.treeRequestId) return; if (requestId !== this.treeRequestId) return;
const nodes = Array.isArray(response && response.data) ? response.data : []; const nodes = Array.isArray(response && response.data) ? response.data : [];


+ 136
- 21
src/views/portal/index.vue View File

@ -189,7 +189,13 @@
<div class="video-monitor-body" :class="{ 'tree-visible': treeVisible }"> <div class="video-monitor-body" :class="{ 'tree-visible': treeVisible }">
<div class="video-monitor-main"> <div class="video-monitor-main">
<div class="camera-stats"> <div class="camera-stats">
<div v-for="item in cameraStats" :key="item.label" class="camera-stat">
<div
v-for="item in cameraStats"
:key="item.key"
class="camera-stat"
:class="{ active: treeVisible && treeDeviceSource === item.deviceSource }"
@click="selectCameraSource(item)"
>
<img class="camera-icon" :src="item.icon" alt=""> <img class="camera-icon" :src="item.icon" alt="">
<div class="camera-meta"> <div class="camera-meta">
<div class="camera-value">{{ item.value }}</div> <div class="camera-value">{{ item.value }}</div>
@ -245,9 +251,10 @@
<aside v-if="treeMounted" v-show="treeVisible" class="portal-device-tree"> <aside v-if="treeMounted" v-show="treeVisible" class="portal-device-tree">
<portal-device-tree <portal-device-tree
:key="portalTreeStationCode || 'all'"
:key="`${portalTreeStationCode || 'all'}-${treeDeviceSource || 'all-source'}`"
:selected-code="selectedPortalCameraCode" :selected-code="selectedPortalCameraCode"
:station-code="portalTreeStationCode" :station-code="portalTreeStationCode"
:device-source="treeDeviceSource"
@channels-loaded="handlePortalTreeChannels" @channels-loaded="handlePortalTreeChannels"
@open="openPortalChannel" @open="openPortalChannel"
/> />
@ -337,7 +344,8 @@ function createEmptyOverview() {
totalDefects: 0, totalDefects: 0,
slightDefects: 0, slightDefects: 0,
generalDefects: 0, generalDefects: 0,
importantDefects: 0
seriousDefects: 0,
urgentDefects: 0
})); }));
} }
@ -356,7 +364,8 @@ function createEmptyTrend() {
const DEFECT_SLIDES = [ const DEFECT_SLIDES = [
{ key: "slight", label: "轻微缺陷", fields: ["slightDefects", "minorDefects"] }, { key: "slight", label: "轻微缺陷", fields: ["slightDefects", "minorDefects"] },
{ key: "general", label: "一般缺陷", fields: ["generalDefects", "normalDefects"] }, { key: "general", label: "一般缺陷", fields: ["generalDefects", "normalDefects"] },
{ key: "important", label: "重要缺陷", fields: ["importantDefects", "majorDefects"] }
{ key: "serious", label: "严重缺陷", fields: ["seriousDefects"] },
{ key: "urgent", label: "重大缺陷", fields: ["urgentDefects"] }
]; ];
// 场站卡片下方的缺陷趋势快捷筛选 // 场站卡片下方的缺陷趋势快捷筛选
@ -415,6 +424,8 @@ export default {
videoList: [], videoList: [],
videoStationId: "", videoStationId: "",
activeVideoIndex: 0, activeVideoIndex: 0,
// 空字符串表示摄像头总数,不按设备来源过滤树
treeDeviceSource: "",
treeVisible: false, treeVisible: false,
treeMounted: false, treeMounted: false,
portalPlayers: {}, portalPlayers: {},
@ -447,10 +458,10 @@ export default {
}, },
cameraStats() { cameraStats() {
return [ return [
{ label: "摄像头总数", value: this.cameraCount.total, icon: iconTotal },
{ label: "动环摄像头", value: this.cameraCount.donghuan, icon: iconDonghuan },
{ label: "消防摄像头", value: this.cameraCount.fire, icon: iconFire },
{ label: "安防摄像头", value: this.cameraCount.security, icon: iconSecurity }
{ key: "total", label: "摄像头总数", value: this.cameraCount.total, icon: iconTotal, deviceSource: "" },
{ key: "donghuan", label: "动环摄像头", value: this.cameraCount.donghuan, icon: iconDonghuan, deviceSource: "动环" },
{ key: "fire", label: "消防摄像头", value: this.cameraCount.fire, icon: iconFire, deviceSource: "消防" },
{ key: "security", label: "安防摄像头", value: this.cameraCount.security, icon: iconSecurity, deviceSource: "安防" }
]; ];
}, },
filteredVideos() { filteredVideos() {
@ -500,6 +511,10 @@ export default {
this.videoStationId = station.id; this.videoStationId = station.id;
this.openDeviceTree(); this.openDeviceTree();
}, },
selectCameraSource(item) {
this.treeDeviceSource = item && item.deviceSource ? item.deviceSource : "";
this.openDeviceTree();
},
openDeviceTree() { openDeviceTree() {
this.treeMounted = true; this.treeMounted = true;
this.treeVisible = true; this.treeVisible = true;
@ -559,10 +574,9 @@ export default {
counts.forEach(item => { counts.forEach(item => {
const source = String(item.deviceSource || ""); const source = String(item.deviceSource || "");
const count = toCount(item.count); const count = toCount(item.count);
if (source.includes("动环")) cameraCount.donghuan += count;
else if (source.includes("消防")) cameraCount.fire += count;
else if (source.includes("安防")) cameraCount.security += count;
else cameraCount.security += count;
if (source === "动环") cameraCount.donghuan += count;
else if (source === "消防") cameraCount.fire += count;
else if (source === "安防") cameraCount.security += count;
}); });
this.cameraCount = cameraCount; this.cameraCount = cameraCount;
}).catch((error) => { }).catch((error) => {
@ -894,7 +908,8 @@ export default {
totalDefects: toCount(item.defectCount), totalDefects: toCount(item.defectCount),
slightDefects: toCount(item.minorCount), slightDefects: toCount(item.minorCount),
generalDefects: toCount(item.generalCount), generalDefects: toCount(item.generalCount),
importantDefects: toCount(item.seriousCount) + toCount(item.urgentCount)
seriousDefects: toCount(item.seriousCount),
urgentDefects: toCount(item.urgentCount)
}; };
}); });
}).catch((error) => { }).catch((error) => {
@ -1361,6 +1376,32 @@ $panel-border: rgba(84, 130, 255, 0.22);
.overview-stat.is-defect-carousel { .overview-stat.is-defect-carousel {
padding: 4px 4px 16px; padding: 4px 4px 16px;
cursor: pointer;
transition: box-shadow .25s ease;
&::before {
content: "";
position: absolute;
inset: 0;
z-index: 0;
pointer-events: none;
background:
linear-gradient(135deg, rgba(150, 210, 255, 0.16) 0%, rgba(80, 160, 230, 0.05) 28%, transparent 52%),
radial-gradient(120% 80% at 0% 0%, rgba(90, 180, 240, 0.14), transparent 58%);
opacity: 0;
transition: opacity .25s ease;
}
&:hover {
box-shadow:
inset 0 1px 0 rgba(42, 198, 255, 0.28),
inset 0 0 16px rgba(40, 130, 200, 0.2),
0 0 8px rgba(30, 110, 190, 0.2);
&::before {
opacity: 1;
}
}
.overview-defect-viewport { .overview-defect-viewport {
position: relative; position: relative;
@ -1374,6 +1415,8 @@ $panel-border: rgba(84, 130, 255, 0.22);
} }
.overview-defect-content { .overview-defect-content {
position: relative;
z-index: 1;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@ -1382,18 +1425,23 @@ $panel-border: rgba(84, 130, 255, 0.22);
} }
&.severity-slight .overview-value { &.severity-slight .overview-value {
color: #1ad6fb;
text-shadow: 0 0 12px rgba(26, 214, 251, 0.52);
color: #2f7bff;
text-shadow: 0 0 12px rgba(47, 123, 255, 0.52);
} }
&.severity-general .overview-value { &.severity-general .overview-value {
color: #ffb849;
text-shadow: 0 0 12px rgba(255, 184, 73, 0.48);
color: #3ad07a;
text-shadow: 0 0 12px rgba(58, 208, 122, 0.48);
} }
&.severity-important .overview-value {
color: #f1dc1d;
text-shadow: 0 0 12px rgba(241, 220, 29, 0.45);
&.severity-serious .overview-value {
color: #f0c14a;
text-shadow: 0 0 12px rgba(240, 193, 74, 0.45);
}
&.severity-urgent .overview-value {
color: #ef5b5b;
text-shadow: 0 0 12px rgba(239, 91, 91, 0.45);
} }
} }
@ -1504,25 +1552,53 @@ $panel-border: rgba(84, 130, 255, 0.22);
} }
.station-card { .station-card {
position: relative;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-between; justify-content: space-between;
gap: 7px; gap: 7px;
min-width: 0; min-width: 0;
padding: 9px 11px 8px; padding: 9px 11px 8px;
overflow: hidden;
border: 1px solid rgba(46, 121, 232, 0.18); border: 1px solid rgba(46, 121, 232, 0.18);
border-radius: 0; border-radius: 0;
cursor: pointer; cursor: pointer;
background: linear-gradient(90deg, rgba(10, 49, 119, 0.96), rgba(8, 38, 101, 0.92)); background: linear-gradient(90deg, rgba(10, 49, 119, 0.96), rgba(8, 38, 101, 0.92));
transition: border-color .2s, box-shadow .2s;
transition: border-color .25s ease, box-shadow .25s ease;
&::after {
content: "";
position: absolute;
inset: 0;
z-index: 1;
pointer-events: none;
background:
linear-gradient(135deg, rgba(150, 210, 255, 0.16) 0%, rgba(80, 160, 230, 0.05) 28%, transparent 52%),
radial-gradient(120% 80% at 0% 0%, rgba(90, 180, 240, 0.14), transparent 58%);
opacity: 0;
transition: opacity .25s ease;
}
&.selected { &.selected {
border-color: rgba(18, 215, 248, 0.72); border-color: rgba(18, 215, 248, 0.72);
box-shadow: inset 0 0 16px rgba(18, 215, 248, 0.12), 0 0 10px rgba(18, 215, 248, 0.12); box-shadow: inset 0 0 16px rgba(18, 215, 248, 0.12), 0 0 10px rgba(18, 215, 248, 0.12);
} }
&:hover {
border-color: rgba(72, 156, 214, 0.55);
box-shadow:
inset 0 0 18px rgba(40, 130, 200, 0.16),
0 0 10px rgba(30, 110, 190, 0.22);
&::after {
opacity: 1;
}
}
} }
.station-head { .station-head {
position: relative;
z-index: 2;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 7px; gap: 7px;
@ -1578,6 +1654,8 @@ $panel-border: rgba(84, 130, 255, 0.22);
} }
.station-btns { .station-btns {
position: relative;
z-index: 2;
display: grid; display: grid;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
gap: 6px; gap: 6px;
@ -1828,20 +1906,57 @@ $panel-border: rgba(84, 130, 255, 0.22);
} }
.camera-stat { .camera-stat {
position: relative;
display: flex; display: flex;
align-items: center; align-items: center;
gap: 14px; gap: 14px;
padding: 12px 16px; padding: 12px 16px;
overflow: hidden;
border: 1px solid transparent;
border-radius: 0; border-radius: 0;
cursor: pointer;
background: #0B2E6F; background: #0B2E6F;
transition: border-color .25s ease, box-shadow .25s ease;
&::after {
content: "";
position: absolute;
inset: 0;
z-index: 1;
pointer-events: none;
background:
linear-gradient(135deg, rgba(150, 210, 255, 0.14) 0%, rgba(80, 160, 230, 0.04) 28%, transparent 52%),
radial-gradient(120% 80% at 0% 0%, rgba(90, 180, 240, 0.12), transparent 58%);
opacity: 0;
transition: opacity .25s ease;
}
&:hover,
&.active {
border-color: rgba(72, 156, 214, 0.5);
box-shadow:
inset 0 0 18px rgba(40, 130, 200, 0.16),
0 0 10px rgba(30, 110, 190, 0.2);
&::after {
opacity: 1;
}
}
.camera-icon { .camera-icon {
position: relative;
z-index: 2;
flex: none; flex: none;
width: 42px; width: 42px;
height: 42px; height: 42px;
object-fit: contain; object-fit: contain;
} }
.camera-meta {
position: relative;
z-index: 2;
}
.camera-value { .camera-value {
font-family: "DIN Alternate", "Arial", "Microsoft YaHei", sans-serif; font-family: "DIN Alternate", "Arial", "Microsoft YaHei", sans-serif;
font-size: 24px; font-size: 24px;


+ 11
- 0
src/views/system/user/index.vue View File

@ -165,6 +165,13 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row>
<el-col :span="24">
<el-form-item label="登录IP" prop="aollowIp">
<el-input v-model="form.aollowIp" placeholder="请输入允许登录IP" maxlength="30" />
</el-form-item>
</el-col>
</el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="备注"> <el-form-item label="备注">
@ -313,6 +320,9 @@ export default {
message: "请输入正确的手机号码", message: "请输入正确的手机号码",
trigger: "blur" trigger: "blur"
} }
],
aollowIp: [
{ required: true, message: "请输入允许登录IP", trigger: "blur" }
] ]
} }
}; };
@ -398,6 +408,7 @@ export default {
email: undefined, email: undefined,
sex: undefined, sex: undefined,
status: "0", status: "0",
aollowIp: undefined,
remark: undefined, remark: undefined,
postIds: [], postIds: [],
roleIds: [] roleIds: []


Loading…
Cancel
Save