Commit de8b37c0 by 周海峰

no message

parent 15ab1ab3
import request from '@/utils/request'
export function queryAppuser(data) {
return request({
url: '/console/user/queryAppuser',
method: 'get',
params: data
})
}
export function addAppUser(data) {
return request({
url: '/console/user/addAppUser',
method: 'post',
data: data
})
}
export function delAppUser(data) {
return request({
url: '/console/user/delAppUser',
method: 'post',
data: data
})
}
\ No newline at end of file
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
:align-center="true" :align-center="true"
:fullscreen="false" :fullscreen="false"
@close="handleClose" @close="handleClose"
width="600px" width="500px"
> >
<el-form <el-form
ref="formRef" ref="formRef"
...@@ -25,17 +25,17 @@ ...@@ -25,17 +25,17 @@
<el-input v-model="form.username" placeholder="请输入用户名" /> <el-input v-model="form.username" placeholder="请输入用户名" />
</el-form-item> </el-form-item>
<!-- 备注 --> <!-- 备注 -->
<el-form-item label="备注" prop="remark"> <el-form-item label="备注" prop="note">
<el-input <el-input
v-model="form.remark" v-model="form.note"
placeholder="请输入备注" placeholder="请输入备注"
/> />
</el-form-item> </el-form-item>
<!-- 是否明文和是否脱敏 --> <!-- 是否明文和是否脱敏 -->
<el-form-item> <el-form-item>
<el-checkbox v-model="form.isoriginal">是否明文</el-checkbox> <el-checkbox v-model="form.isoriginal" :true-value="'1'" :false-value="'0'">是否明文</el-checkbox>
<el-checkbox v-model="form.ismask" style="margin-left: 20px">是否脱敏</el-checkbox> <el-checkbox v-model="form.ismask" :true-value="'1'" :false-value="'0'" style="margin-left: 20px">是否脱敏</el-checkbox>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
...@@ -49,81 +49,77 @@ ...@@ -49,81 +49,77 @@
</el-dialog> </el-dialog>
</template> </template>
<script> <script setup>
export default { import { ref, reactive, watch } from 'vue'
name: 'AppUserEdit', import { addAppUser } from '@/api/safetyManagement/appUserConfig.js'
props: { const props = defineProps({
visible: { visible: {
type: Boolean, type: Boolean,
default: false default: false
},
formData: {
type: Object,
default: () => null
}
}, },
emits: ['update:visible', 'success'], formData: {
watch: { type: Object,
visible(val) { default: () => null
if (val && this.formData) { }
this.form = { })
...this.formData, const emit = defineEmits(['update:visible', 'success'])
password: '',
confirmPassword: '' const formRef = ref(null)
} const form = reactive({
} useridentifier: '',
} username: '',
}, note: '',
data() { isoriginal: '0', // 默认字符串类型
return { ismask: '0'
form: { })
useridentifier: '', const rules = {
username: '', useridentifier: [
remark: '', { required: true, message: '请输入唯一标识', trigger: 'blur' }
isoriginal: false, ],
ismask: false username: [
}, { required: true, message: '请输入用户名', trigger: 'blur' }
rules: { ]
useridentifier: [ }
{ required: true, message: '请输入唯一标识', trigger: 'blur' }
], watch(() => props.visible, (val) => {
username: [ if (val && props.formData) {
{ required: true, message: '请输入用户名', trigger: 'blur' } Object.assign(form, {
] ...props.formData,
} isoriginal: String(props.formData.isoriginal ?? '0'),
} ismask: String(props.formData.ismask ?? '0')
}, })
methods: { }
handleClose() { console.log('表单数据', form)
this.$emit('update:visible', false) })
this.$refs.formRef?.resetFields()
this.form = { const handleClose = () => {
useridentifier: '', emit('update:visible', false)
username: '', formRef.value?.resetFields()
remark: '', Object.assign(form, {
isoriginal: false, useridentifier: '',
ismask: false username: '',
} note: '',
}, isoriginal: '0',
handleSubmit() { ismask: '0'
this.$refs.formRef.validate((valid) => { })
if (valid) { }
// 提交表单逻辑
const params = { ...this.form } const handleSubmit = () => {
// 如果是编辑模式且没有修改密码,则不提交密码字段 formRef.value.validate(async (valid) => {
if (this.formData && !params.password) { if (valid) {
delete params.password const params = { ...form }
delete params.confirmPassword try {
const res = await addAppUser(params)
if (res.code === 'POP_00014') {
emit('success')
handleClose()
} }
} catch (error) {
console.log('submit form', params) // 可根据需要添加错误提示
// 调用接口保存数据 console.error('添加用户失败', error)
this.$emit('success') }
this.handleClose()
}
})
} }
} })
} }
</script> </script>
......
...@@ -11,13 +11,13 @@ ...@@ -11,13 +11,13 @@
<el-form :inline="true" :model="searchForm" class="search-form"> <el-form :inline="true" :model="searchForm" class="search-form">
<div class="left-area"> <div class="left-area">
<el-form-item label="唯一标识:"> <el-form-item label="唯一标识:">
<el-input v-model="searchForm.useridentifier" placeholder="请输入唯一标识"></el-input> <el-input v-model="searchForm.useridentifier" clearable placeholder="请输入唯一标识"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="用户名:"> <el-form-item label="用户名:">
<el-input v-model="searchForm.username" placeholder="请输入用户名"></el-input> <el-input v-model="searchForm.username" clearable placeholder="请输入用户名"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="备注:"> <el-form-item label="备注:">
<el-input v-model="searchForm.remark" placeholder="请输入备注"></el-input> <el-input v-model="searchForm.note" clearable placeholder="请输入备注"></el-input>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button> <el-button type="primary" icon="Search" @click="handleSearch">搜索</el-button>
...@@ -33,26 +33,40 @@ ...@@ -33,26 +33,40 @@
<div class="user-list"> <div class="user-list">
<div class="user-grid"> <div class="user-grid">
<div v-for="(user, index) in userList" :key="index" class="user-card"> <div v-for="(user, index) in userList" :key="index" class="user-card">
<div class="card-left-bar"></div>
<div class="user-info"> <div class="user-info">
<div class="info">
<div class="name">{{ user.username }}</div>
<div class="username">
<el-icon><User /></el-icon>
用户名 {{ user.username }}
</div>
<div class="note">
<el-icon><Edit /></el-icon>
备注 {{ user.note }}
</div>
</div>
<div class="avatar"> <div class="avatar">
<el-avatar :size="50" icon="User"></el-avatar> <el-avatar :size="80" icon="UserFilled" style="background: #f6f8fa; color: #d3d8e0;" />
</div> </div>
<div class="info"> </div>
<div class="useridentifier">{{ user.username }}</div> <div class="card-divider"></div>
<div class="username">用户名: {{ user.username }}</div> <div class="card-bottom">
<div class="remark">备注: {{ user.remark }}</div> <div>
<el-icon><Clock /></el-icon>
{{ user.createtime || '' }}
</div> </div>
<!-- 遮罩层和操作按钮 --> <el-icon class="lock"><Lock /></el-icon>
<div class="hover-mask"> </div>
<div class="operation-buttons"> <div class="hover-mask">
<div class="operation-btn" @click="handleDelete(user)"> <div class="operation-buttons">
<i class="el-icon-delete"></i> <div class="operation-btn" @click="handleDelete(user)">
<span>删除</span> <el-icon><Delete /></el-icon>
</div> <span>删除</span>
<div class="operation-btn" @click="handleEdit(user)"> </div>
<i class="el-icon-edit"></i> <div class="operation-btn" @click="handleEdit(user)">
<span>编辑</span> <el-icon><FolderOpened /></el-icon>
</div> <span>编辑</span>
</div> </div>
</div> </div>
</div> </div>
...@@ -62,7 +76,9 @@ ...@@ -62,7 +76,9 @@
<!-- 分页 --> <!-- 分页 -->
<div class="pagination"> <div class="pagination">
<div class="pagination-info">共有记录 1条,每页显示 8条,共 1页</div> <div class="pagination-info">
共有记录 {{ total }} 条,每页显示 {{ pageSize }} 条,共 {{ Math.max(1, Math.ceil(total / pageSize)) }}
</div>
<el-pagination <el-pagination
background background
layout="prev, pager, next, jumper" layout="prev, pager, next, jumper"
...@@ -82,72 +98,89 @@ ...@@ -82,72 +98,89 @@
</div> </div>
</template> </template>
<script> <script setup>
import { ref, reactive, onMounted } from 'vue'
import AppUserEdit from './edit.vue' import AppUserEdit from './edit.vue'
import { queryAppuser, delAppUser } from '@/api/safetyManagement/appUserConfig.js'
import { ElMessageBox } from 'element-plus'
const searchForm = reactive({
useridentifier: '',
username: '',
note: ''
})
const userList = ref([])
const total = ref(1)
const currentPage = ref(1)
const pageSize = ref(8)
const editVisible = ref(false)
const editData = ref(null)
export default { const getList = async () => {
useridentifier: 'AppUserConfig', try {
components: { const res = await queryAppuser({
AppUserEdit useridentifier: searchForm.useridentifier,
}, username: searchForm.username,
data() { note: searchForm.note,
return { pageno: currentPage.value,
searchForm: { pagesize: pageSize.value
useridentifier: '', })
username: '', if (res.code === 'POP_00014') {
remark: '' userList.value = res.data.list || []
}, total.value = res.data.total || 0
userList: [
{
realname: 'admin',
username: 'admin',
remark: ''
}
],
total: 1,
currentPage: 1,
pageSize: 8,
editVisible: false,
editData: null
}
},
methods: {
handleSearch() {
// 实现搜索逻辑
},
handleAdd() {
// 打开新增用户弹窗
this.editData = null
this.editVisible = true
},
handlePageChange(page) {
// 实现分页逻辑
},
handleDelete(row) {
// 实现删除用户逻辑
this.$confirm('确认删除该用户吗?', '提示', {
type: 'warning'
}).then(() => {
// 调用删除接口
console.log('删除用户', row)
}).catch(() => {})
},
handleEdit(row) {
// 打开编辑用户弹窗
this.editData = { ...row }
this.editVisible = true
},
handleEditSuccess() {
// 编辑成功后的回调
this.editVisible = false
// 刷新列表数据
this.getList()
},
getList() {
// 获取用户列表数据
} }
} catch (error) {
console.error('获取用户列表失败', error)
}
}
const handleSearch = () => {
currentPage.value = 1
getList()
}
const handleAdd = () => {
editData.value = null
editVisible.value = true
}
const handlePageChange = (page) => {
currentPage.value = page
getList()
}
const handleDelete = async (row) => {
try {
ElMessageBox.confirm('确认删除该用户吗?', '提示', {
type: 'warning'
}).then(() => {
// 调用删除接口
delAppUser({id: row.id})
.then(res => {
if (res.code === 'POP_00014') {
getList();
} else {
const modal = instance?.appContext.config.globalProperties.$modal
modal && modal.msgError ? modal.msgError(res.msg || '删除失败') : alert(res.msg || '删除失败')
}
})
}).catch(() => {})
} catch (e) {
// 用户取消或请求失败
// 可选:打印错误
// console.error('删除失败或已取消', e)
} }
} }
const handleEdit = (row) => {
editData.value = { ...row }
editVisible.value = true
}
const handleEditSuccess = () => {
editVisible.value = false
getList()
}
onMounted(() => {
getList()
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
...@@ -206,89 +239,169 @@ export default { ...@@ -206,89 +239,169 @@ export default {
.user-card { .user-card {
background: #fff; background: #fff;
border-radius: 8px; border-radius: 12px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.04);
overflow: hidden; overflow: visible; // 保证遮罩不被裁剪
position: relative;
padding: 0;
border: none;
transition: box-shadow 0.2s;
display: flex;
flex-direction: column;
justify-content: space-between;
&:hover {
box-shadow: 0 4px 24px 0 rgba(0, 0, 0, 0.08);
}
}
.card-left-bar {
position: absolute;
left: 0;
top: 24px;
bottom: 24px;
width: 8px;
background: #409EFF;
border-radius: 4px;
} }
.user-info { .user-info {
display: flex; display: flex;
align-items: center; align-items: flex-start;
padding: 20px; padding: 24px 24px 0 24px;
position: relative; position: relative;
height: auto;
cursor: pointer; cursor: pointer;
height: 100%;
.avatar { .avatar {
margin-right: 15px; margin-left: auto;
margin-right: 0;
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
} }
.info { .info {
flex: 1; flex: 1;
display: flex;
.useridentifier { flex-direction: column;
font-size: 16px; justify-content: flex-start;
font-weight: bold;
margin-bottom: 8px; .name {
color: #333; font-size: 20px;
font-weight: 600;
color: #409EFF;
margin-bottom: 12px;
} }
.username, .remark { .username {
font-size: 15px;
color: #666; color: #666;
font-size: 14px; margin-bottom: 8px;
margin-bottom: 5px; display: flex;
} align-items: center;
} gap: 6px;
.hover-mask { .el-icon {
position: absolute; font-size: 16px;
top: 0; color: #bdbdbd;
left: 0; }
width: 100%; }
height: 100%;
background-color: rgba(0, 0, 0, 0.6);
display: none;
justify-content: center;
align-items: center;
.operation-buttons { .note {
font-size: 15px;
color: #666;
margin-bottom: 8px;
display: flex; display: flex;
gap: 30px; align-items: center;
gap: 6px;
.operation-btn { white-space: nowrap;
display: flex; overflow: hidden;
flex-direction: column; text-overflow: ellipsis;
align-items: center; max-width: 320px;
color: white;
cursor: pointer; .el-icon {
font-size: 16px;
i { color: #bdbdbd;
font-size: 24px;
margin-bottom: 8px;
}
span {
font-size: 14px;
}
&:hover {
color: #409EFF;
}
} }
} }
} }
}
&:hover { .card-divider {
.hover-mask { height: 2px;
display: flex; background: #f2f6fa;
} margin: 12px 24px 0 24px;
border-radius: 1px;
}
.card-bottom {
display: flex;
align-items: center;
justify-content: space-between;
padding: 8px 24px 12px 24px;
color: #909399;
font-size: 15px;
.el-icon {
margin-right: 6px;
}
.lock {
font-size: 18px;
color: #bdbdbd;
margin-left: 8px;
} }
} }
.operation-time { .hover-mask {
color: #666; position: absolute;
i { top: 0;
margin-right: 5px; left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.6);
display: flex;
justify-content: center;
align-items: center;
z-index: 2;
opacity: 0;
pointer-events: none; // 默认不拦截,避免首次点击无效
transition: opacity 0.2s;
}
.user-card:hover .hover-mask {
opacity: 1;
pointer-events: auto; // 悬浮时可点击
}
.operation-buttons {
display: flex;
gap: 80px;
justify-content: center;
align-items: center;
}
.operation-btn {
display: flex;
flex-direction: column;
align-items: center;
color: white;
cursor: pointer;
background: none;
border-radius: 0;
padding: 0;
box-shadow: none;
transition: color 0.2s;
span {
font-weight: 500;
}
&:hover {
color: #409EFF;
} }
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论