|
|
@ -5,37 +5,38 @@ |
|
|
|
<div class="left"> |
|
|
|
<div class="top"> |
|
|
|
<div class="ns-table-title">关联企业</div> |
|
|
|
<div> |
|
|
|
<div style="height: 100%; overflow-y: auto"> |
|
|
|
<a-input-search |
|
|
|
v-model:value="searchValue" |
|
|
|
style="margin-bottom: 8px" |
|
|
|
placeholder="请输入关联企业" |
|
|
|
@search="onSearch" /> |
|
|
|
<a-tree :tree-data="treeData" defaultExpandAll @select="handleSelect"> |
|
|
|
<template #title="{ title }"> |
|
|
|
{{ title }} |
|
|
|
<!-- <span v-if="title.indexOf(searchValue) > -1"> |
|
|
|
{{ title.substring(0, title.indexOf(searchValue)) }} |
|
|
|
</span> |
|
|
|
<span v-else>{{ title }}</span> --> |
|
|
|
<a-tree |
|
|
|
v-if="treeData?.length" |
|
|
|
:tree-data="treeData" |
|
|
|
defaultExpandAll |
|
|
|
@select="handleSelect"> |
|
|
|
<template #title="data"> |
|
|
|
{{ data.orgInfo?.orgName }} |
|
|
|
</template> |
|
|
|
</a-tree> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="ns-table-title">关联部门</div> |
|
|
|
<div> |
|
|
|
<div class="ns-table-title">关联部门</div> |
|
|
|
|
|
|
|
<a-input-search |
|
|
|
v-model:value="searchValue2" |
|
|
|
style="margin-bottom: 8px" |
|
|
|
placeholder="请输入关联部门" |
|
|
|
@search="onSearch2" /> |
|
|
|
<a-tree :tree-data="treeData2" defaultExpandAll @select="handleSelect2"> |
|
|
|
<template #title="{ title }"> |
|
|
|
{{ title }} |
|
|
|
<!-- <span v-if="title.indexOf(searchValue) > -1"> |
|
|
|
{{ title.substring(0, title.indexOf(searchValue)) }} |
|
|
|
</span> |
|
|
|
<span v-else>{{ title }}</span> --> |
|
|
|
<a-tree |
|
|
|
v-if="treeData2?.length" |
|
|
|
:tree-data="treeData2" |
|
|
|
defaultExpandAll |
|
|
|
@select="handleSelect2"> |
|
|
|
<template #title="data"> |
|
|
|
{{ data.deptInfo?.deptName }} |
|
|
|
</template> |
|
|
|
</a-tree> |
|
|
|
</div> |
|
|
@ -44,17 +45,31 @@ |
|
|
|
<ns-view-list-table v-bind="tableConfig" :model="data" ref="mainRef" /> |
|
|
|
</div> |
|
|
|
<a-drawer |
|
|
|
:width="1200" |
|
|
|
:width="500" |
|
|
|
:visible="visible" |
|
|
|
:body-style="{ paddingBottom: '80px' }" |
|
|
|
:footer-style="{ textAlign: 'right' }" |
|
|
|
destroyOnClose |
|
|
|
@close="onClose"> |
|
|
|
<ns-form ref="formRef" :schemas="formSchema" :model="formData" class="form" /> |
|
|
|
<ns-form |
|
|
|
ref="formRef" |
|
|
|
:schemas="formSchema" |
|
|
|
:model="formData" |
|
|
|
class="form" |
|
|
|
:wrapperCol="{ span: 20 }" |
|
|
|
formLayout="vertical" /> |
|
|
|
<span class="admin">用户权限</span> |
|
|
|
<ns-view-list-table v-bind="tableConfig2" :model="data" ref="mainRef" rowKey="uuid" /> |
|
|
|
<a-button style="margin-right: 8px" @click="onClose">取消</a-button> |
|
|
|
<a-button type="primary" @click="onEdit">确定</a-button> |
|
|
|
<ns-view-list-table |
|
|
|
v-bind="tableConfig2" |
|
|
|
class="drawerTable" |
|
|
|
:model="data" |
|
|
|
:pagination="false" |
|
|
|
ref="mainRef" |
|
|
|
rowKey="uuid" /> |
|
|
|
<template #footer> |
|
|
|
<a-button style="margin-right: 8px" @click="onClose">取消</a-button> |
|
|
|
<a-button type="primary" @click="onEdit">确定</a-button> |
|
|
|
</template> |
|
|
|
</a-drawer> |
|
|
|
|
|
|
|
<a-modal |
|
|
@ -69,15 +84,13 @@ |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
<script lang="ts"> |
|
|
|
import { Modal } from 'ant-design-vue'; |
|
|
|
import { createVNode, defineComponent, reactive, ref } from 'vue'; |
|
|
|
import { http } from '/nerv-lib/util/http'; |
|
|
|
import { ExclamationCircleOutlined } from '@ant-design/icons-vue'; |
|
|
|
import { cloneDeep } from 'lodash-es'; |
|
|
|
import { NsMessage } from '/nerv-lib/component'; |
|
|
|
import { NsMessage, NsModal } from '/nerv-lib/component'; |
|
|
|
import { formConfig, formConfig2 } from './config'; |
|
|
|
import { mockData, mockData2, treeData, treeData2 } from './mock'; |
|
|
|
import { origanizemanage } from '/@/api/origanizemanage'; |
|
|
|
import { origanizemanage, department } from '/@/api/origanizemanage'; |
|
|
|
|
|
|
|
export default defineComponent({ |
|
|
|
name: 'OrderListIndex', |
|
|
@ -85,7 +98,7 @@ |
|
|
|
const mainRef = ref(); |
|
|
|
const data = reactive({}); |
|
|
|
let formData = ref({}); |
|
|
|
let formData2 = ref({}); |
|
|
|
let formData2 = ref({ userRoleList: [1, 1, 3] }); |
|
|
|
const formRef = ref(); |
|
|
|
const visible = ref(false); |
|
|
|
const addformvisible = ref(false); |
|
|
@ -94,7 +107,24 @@ |
|
|
|
const formSchema = formConfig; |
|
|
|
const casData = ref([]); |
|
|
|
const formSchema2 = formConfig2(casData); |
|
|
|
const treeData = ref([]); |
|
|
|
const treeData2 = ref([]); |
|
|
|
const userAuthList = ref([]); |
|
|
|
const orgId = JSON.parse(sessionStorage.getItem('userInfo')).orgId; |
|
|
|
|
|
|
|
const fetch = (api, params = { orgId }) => { |
|
|
|
return http.post(api, params); |
|
|
|
}; |
|
|
|
|
|
|
|
// 企业树 |
|
|
|
fetch(origanizemanage.queryOrgTree).then((res) => { |
|
|
|
treeData.value = res.data; |
|
|
|
}); |
|
|
|
|
|
|
|
// 部门树 |
|
|
|
fetch(origanizemanage.queryDeptTree).then((res) => { |
|
|
|
treeData2.value = res.data; |
|
|
|
}); |
|
|
|
const opMap: any = { |
|
|
|
type: 'add', |
|
|
|
fuc: () => {}, |
|
|
@ -103,18 +133,37 @@ |
|
|
|
|
|
|
|
const onSearch = () => { |
|
|
|
console.log(searchValue.value); |
|
|
|
fetch(origanizemanage.queryOrgTree, { orgName: searchValue.value, orgId }).then((res) => { |
|
|
|
treeData.value = res.data; |
|
|
|
}); |
|
|
|
}; |
|
|
|
const onSearch2 = () => { |
|
|
|
console.log(searchValue2.value); |
|
|
|
fetch(origanizemanage.queryDeptTree, { deptName: searchValue2.value, orgId }).then( |
|
|
|
(res) => { |
|
|
|
treeData2.value = res.data; |
|
|
|
}, |
|
|
|
); |
|
|
|
}; |
|
|
|
|
|
|
|
const tableFetch = (params) => { |
|
|
|
tableConfig.value.params = { |
|
|
|
...tableConfig.value.params, |
|
|
|
...params, |
|
|
|
}; |
|
|
|
|
|
|
|
mainRef.value?.nsTableRef.reload(); |
|
|
|
}; |
|
|
|
|
|
|
|
const handleSelect = (selectedKeys: any, info: any) => { |
|
|
|
console.log(selectedKeys, 'selectedKeys'); |
|
|
|
console.log(info, 'info'); |
|
|
|
fetch(origanizemanage.queryDeptTree, { orgId: info.node?.orgInfo.orgId }).then((res) => { |
|
|
|
treeData2.value = res.data; |
|
|
|
}); |
|
|
|
tableFetch({ orgId: info.node?.orgInfo.orgId }); |
|
|
|
}; |
|
|
|
|
|
|
|
const handleSelect2 = (selectedKeys: any, info: any) => { |
|
|
|
console.log(selectedKeys, 'selectedKeys'); |
|
|
|
console.log(info, 'info'); |
|
|
|
tableFetch({ deptId: info.node?.deptInfo.deptId }); |
|
|
|
}; |
|
|
|
|
|
|
|
const onClose = () => { |
|
|
@ -124,31 +173,38 @@ |
|
|
|
const onEdit = () => { |
|
|
|
formRef.value?.triggerSubmit().then(() => { |
|
|
|
console.log(formData.value, 'formData.value'); |
|
|
|
opMap.fuc && opMap.fuc(formData.value); |
|
|
|
if (!userAuthList.value.length) { |
|
|
|
NsMessage.error('请添加用户权限'); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
opMap.fuc && opMap.fuc({ ...formData.value, userRoleList: userAuthList.value, orgId }); |
|
|
|
visible.value = false; |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
const handleOk = () => { |
|
|
|
console.log(formData2.value, 'formData2.value'); |
|
|
|
console.log(opMap.type, 'type'); |
|
|
|
if (opMap.type === 'add') { |
|
|
|
mockData2.value.push({ information: casData.value.join('/') }); |
|
|
|
} else { |
|
|
|
if (casData.value?.length !== 3) { |
|
|
|
NsMessage.error('未选择角色'); |
|
|
|
} |
|
|
|
userAuthList.value.push({ |
|
|
|
userAuthList: cloneDeep(casData.value), |
|
|
|
roleId: casData.value[2].value, |
|
|
|
roleName: casData.value[2].label, |
|
|
|
}); |
|
|
|
addformvisible.value = false; |
|
|
|
}; |
|
|
|
const handleClose = () => { |
|
|
|
addformvisible.value = false; |
|
|
|
}; |
|
|
|
|
|
|
|
const tableConfig = { |
|
|
|
const tableConfig = ref({ |
|
|
|
title: '用户管理', |
|
|
|
api: origanizemanage.userList, |
|
|
|
params: { |
|
|
|
orgId: JSON.parse(sessionStorage.getItem('userInfo')).orgId, |
|
|
|
orgId, |
|
|
|
}, |
|
|
|
listField: 'data.records', |
|
|
|
headerActions: [ |
|
|
|
{ |
|
|
|
label: '新增', |
|
|
@ -158,11 +214,9 @@ |
|
|
|
opMap.type = 'add'; |
|
|
|
opMap.fuc = (formData: any) => { |
|
|
|
console.log(formData, 'formData'); |
|
|
|
// origanizemanage.addUser |
|
|
|
// mockData.value.push({ |
|
|
|
// id: Math.random().toString().slice(2, 6), |
|
|
|
// ...cloneDeep(formData), |
|
|
|
// }); |
|
|
|
http.post(origanizemanage.addUser, formData).then(() => { |
|
|
|
visible.value = false; |
|
|
|
}); |
|
|
|
}; |
|
|
|
visible.value = true; |
|
|
|
}, |
|
|
@ -187,33 +241,14 @@ |
|
|
|
{ |
|
|
|
label: '批量删除', |
|
|
|
type: 'primary', |
|
|
|
name: 'RoleTypeAdd', |
|
|
|
name: 'userBatchDel', |
|
|
|
dynamicDisabled: (data: any) => { |
|
|
|
return data.list.length === 0; |
|
|
|
}, |
|
|
|
confirm: true, |
|
|
|
isReload: true, |
|
|
|
handle: (data: any) => { |
|
|
|
console.log('object :>> ', data.list); |
|
|
|
const idList = data.list.map((item) => item.id); |
|
|
|
mockData.value.splice(0); |
|
|
|
return; |
|
|
|
const copyData = cloneDeep(mockData.value); |
|
|
|
mockData.value = copyData.filter((tar) => { |
|
|
|
return !idList.includes(tar.id); |
|
|
|
}); |
|
|
|
|
|
|
|
console.log(mockData.value); |
|
|
|
|
|
|
|
return; |
|
|
|
copyData.map((item, index) => { |
|
|
|
if (idList.includes(item.id)) { |
|
|
|
mockData.value.filter((tar) => { |
|
|
|
return !idList.includes(tar.id); |
|
|
|
}); |
|
|
|
} |
|
|
|
}); |
|
|
|
}, |
|
|
|
api: origanizemanage.batchDel, |
|
|
|
dynamicParams: { userIds: 'userId[]' }, |
|
|
|
}, |
|
|
|
], |
|
|
|
columns: [ |
|
|
@ -258,30 +293,34 @@ |
|
|
|
}, |
|
|
|
{ |
|
|
|
title: '组织关系', |
|
|
|
dataIndex: 'deptInfo', |
|
|
|
customRender: (value) => { |
|
|
|
return value.record.deptInfo.orgName; |
|
|
|
}, |
|
|
|
dataIndex: 'orgName', |
|
|
|
}, |
|
|
|
{ |
|
|
|
title: '部门/角色', |
|
|
|
dataIndex: 'orgInfo', |
|
|
|
customRender: (value) => { |
|
|
|
// // console.log(value.record.orgInfo.orgName, 'ss'); |
|
|
|
// console.log( |
|
|
|
// value.record.userRoleList.map((item) => { |
|
|
|
// return `${value.record.orgInfo.orgName}/${item.roleName}`; |
|
|
|
// }), |
|
|
|
// ); |
|
|
|
// value.record.userRoleList.map((item) => { |
|
|
|
// return `${value.record.orgInfo.orgName}/${item.roleName}`; |
|
|
|
// }); |
|
|
|
// return `${value.record.orgInfo.orgName}/`; |
|
|
|
dataIndex: 'deptRoleInfoList', |
|
|
|
customRender: ({ value }) => { |
|
|
|
if (!value) return '-'; |
|
|
|
return createVNode('div', {}, [ |
|
|
|
createVNode('span', {}, value[0]), |
|
|
|
value.length > 1 && |
|
|
|
createVNode( |
|
|
|
'a', |
|
|
|
{ |
|
|
|
onClick: () => |
|
|
|
NsModal.info({ |
|
|
|
icon: null, |
|
|
|
content: createVNode('div', { innerHTML: value.join('<br>') }), |
|
|
|
}), |
|
|
|
}, |
|
|
|
`+${value.length}`, |
|
|
|
), |
|
|
|
]); |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
title: '状态', |
|
|
|
dataIndex: 'userStatus', |
|
|
|
customRender: ({ value }) => ['正常', '冻结'][value], |
|
|
|
}, |
|
|
|
], |
|
|
|
columnActions: { |
|
|
@ -306,61 +345,30 @@ |
|
|
|
}, |
|
|
|
{ |
|
|
|
label: '冻结', |
|
|
|
name: 'RoleTypeEdit', |
|
|
|
handle: (record: any) => { |
|
|
|
console.log(record, 'record'); |
|
|
|
Modal.confirm({ |
|
|
|
title: '是否冻结该账户', |
|
|
|
icon: createVNode(ExclamationCircleOutlined), |
|
|
|
content: createVNode('div', { style: 'color:red;' }, ''), |
|
|
|
|
|
|
|
onOk() { |
|
|
|
// http |
|
|
|
// .post('/api/parking_merchant/objs/gateInfo/delete', { |
|
|
|
// uuid: record.uuid, |
|
|
|
// }) |
|
|
|
// .then((res) => { |
|
|
|
// mainRef.value.nsTableRef.reload(); |
|
|
|
// }); |
|
|
|
NsMessage.success('冻结成功'); |
|
|
|
}, |
|
|
|
class: 'test', |
|
|
|
}); |
|
|
|
}, |
|
|
|
name: 'userFrozen', |
|
|
|
confirm: true, |
|
|
|
defaultParams: { userStatus: 1 }, |
|
|
|
dynamicParams: 'userId', |
|
|
|
isReload: true, |
|
|
|
api: origanizemanage.frozen, |
|
|
|
}, |
|
|
|
{ |
|
|
|
label: '重置密码', |
|
|
|
name: 'RoleTypeEdit', |
|
|
|
handle: (record: any) => { |
|
|
|
console.log(record, 'record'); |
|
|
|
Modal.confirm({ |
|
|
|
title: '是否重置密码', |
|
|
|
icon: createVNode(ExclamationCircleOutlined), |
|
|
|
content: createVNode('div', { style: 'color:red;' }, ''), |
|
|
|
onOk() { |
|
|
|
// Modal.success({ |
|
|
|
// title: '密码重置成功,初始密码123456', |
|
|
|
// }); |
|
|
|
NsMessage.success('密码重置成功,初始密码123456'); |
|
|
|
}, |
|
|
|
onCancel() { |
|
|
|
console.log('Cancel'); |
|
|
|
}, |
|
|
|
class: 'test', |
|
|
|
}); |
|
|
|
name: 'userCodeReset', |
|
|
|
confirm: true, |
|
|
|
handle: ({ userId }: any) => { |
|
|
|
http |
|
|
|
.post(origanizemanage.resetPwd, { userId }) |
|
|
|
.then(() => NsModal.success({ content: '密码重置成功,初始密码123456' })); |
|
|
|
}, |
|
|
|
}, |
|
|
|
{ |
|
|
|
label: '删除', |
|
|
|
name: 'RoleTypeEdit', |
|
|
|
dynamicParams: { |
|
|
|
uuid: 'uuid', |
|
|
|
}, |
|
|
|
name: 'userDelete', |
|
|
|
dynamicParams: 'userId', |
|
|
|
confirm: true, |
|
|
|
handle: (record: any, name: any, reload: any) => { |
|
|
|
console.log(record, name, reload, 'record'); |
|
|
|
mockData.value.splice(0, 1); |
|
|
|
}, |
|
|
|
isReload: true, |
|
|
|
api: origanizemanage.del, |
|
|
|
}, |
|
|
|
], |
|
|
|
}, |
|
|
@ -409,15 +417,15 @@ |
|
|
|
component: 'NsSelect', |
|
|
|
componentProps: { |
|
|
|
placeholder: '请选择', |
|
|
|
disabled: true, |
|
|
|
allowClear: true, |
|
|
|
options: [ |
|
|
|
{ |
|
|
|
label: '正常', |
|
|
|
value: 1, |
|
|
|
value: 0, |
|
|
|
}, |
|
|
|
{ |
|
|
|
label: '冻结', |
|
|
|
value: 2, |
|
|
|
value: 1, |
|
|
|
}, |
|
|
|
], |
|
|
|
}, |
|
|
@ -427,14 +435,13 @@ |
|
|
|
}, |
|
|
|
// pagination: { defaultPageSize: 10 }, |
|
|
|
rowKey: 'id', |
|
|
|
}; |
|
|
|
}); |
|
|
|
const tableConfig2 = { |
|
|
|
// api: { |
|
|
|
// url: '/carbon_emission/device/getGatewayList', |
|
|
|
// method: 'post', |
|
|
|
// }, |
|
|
|
value: mockData2.value, |
|
|
|
listField: 'data.records', |
|
|
|
value: userAuthList.value, |
|
|
|
rowSelection: null, |
|
|
|
headerActions: [ |
|
|
|
{ |
|
|
@ -442,11 +449,11 @@ |
|
|
|
name: 'RoleTypeAdd', |
|
|
|
type: 'primary', |
|
|
|
handle: () => { |
|
|
|
opMap.type = 'add'; |
|
|
|
opMap.fuc = (formData2: any) => { |
|
|
|
console.log(formData2, 'formData2'); |
|
|
|
mockData2.value.push(cloneDeep(formData2)); |
|
|
|
}; |
|
|
|
// opMap.type = 'add'; |
|
|
|
// opMap.fuc = (formData2: any) => { |
|
|
|
// console.log(formData2, 'formData2'); |
|
|
|
// userAuthList.value.push(cloneDeep(formData2)); |
|
|
|
// }; |
|
|
|
addformvisible.value = true; |
|
|
|
}, |
|
|
|
}, |
|
|
@ -454,36 +461,52 @@ |
|
|
|
columns: [ |
|
|
|
{ |
|
|
|
title: '角色信息', |
|
|
|
dataIndex: 'information', |
|
|
|
dataIndex: 'userRoleList', |
|
|
|
customRender: ({ record }) => { |
|
|
|
if (record) { |
|
|
|
const res = record.userAuthList.reduce((pre, cur) => { |
|
|
|
pre.push(cur.label); |
|
|
|
return pre; |
|
|
|
}, []); |
|
|
|
return res.join('/'); |
|
|
|
} |
|
|
|
return '-'; |
|
|
|
}, |
|
|
|
}, |
|
|
|
], |
|
|
|
columnActions: { |
|
|
|
title: '操作', |
|
|
|
actions: [ |
|
|
|
{ |
|
|
|
label: '编辑', |
|
|
|
name: 'RoleTypeEdit', |
|
|
|
// dynamicParams: 'uuid', |
|
|
|
handle: (record: any) => { |
|
|
|
console.log(record, 'record'); |
|
|
|
formData2.value = record; |
|
|
|
opMap.type = 'edit'; |
|
|
|
opMap.fuc = (formData2: any) => { |
|
|
|
Object.assign( |
|
|
|
mockData.value.filter((item) => item.id === record.id)[0], |
|
|
|
formData2, |
|
|
|
); |
|
|
|
}; |
|
|
|
addformvisible.value = true; |
|
|
|
}, |
|
|
|
}, |
|
|
|
// { |
|
|
|
// label: '编辑', |
|
|
|
// name: 'RoleTypeEdit', |
|
|
|
// // dynamicParams: 'uuid', |
|
|
|
// handle: (record: any) => { |
|
|
|
// console.log(record, 'record'); |
|
|
|
// formData2.value = record; |
|
|
|
// opMap.type = 'edit'; |
|
|
|
// opMap.fuc = (formData2: any) => { |
|
|
|
// Object.assign( |
|
|
|
// mockData.value.filter((item) => item.id === record.id)[0], |
|
|
|
// formData2, |
|
|
|
// ); |
|
|
|
// }; |
|
|
|
// addformvisible.value = true; |
|
|
|
// }, |
|
|
|
// }, |
|
|
|
{ |
|
|
|
label: '删除', |
|
|
|
name: 'RoleTypeEdit', |
|
|
|
confirm: true, |
|
|
|
handle: (record: any, name: any, reload: any) => { |
|
|
|
console.log(record, name, reload, 'record'); |
|
|
|
mockData2.value.splice(0, 1); |
|
|
|
const id = record.roleId; |
|
|
|
console.log(userAuthList.value, id); |
|
|
|
let idx = 0; |
|
|
|
userAuthList.value?.some((item, index) => { |
|
|
|
idx = index; |
|
|
|
if (item.roleId === id) return true; |
|
|
|
}); |
|
|
|
userAuthList.value.splice(idx, 1); |
|
|
|
}, |
|
|
|
}, |
|
|
|
], |
|
|
@ -523,16 +546,16 @@ |
|
|
|
display: flex; |
|
|
|
} |
|
|
|
.left { |
|
|
|
width: 400px; |
|
|
|
width: 350px; |
|
|
|
border-right: 5px solid rgb(229, 235, 240); |
|
|
|
min-width: fit-content; |
|
|
|
} |
|
|
|
.right { |
|
|
|
flex: 1; |
|
|
|
overflow: auto; |
|
|
|
min-width: 0; |
|
|
|
} |
|
|
|
.top { |
|
|
|
height: 46vh; |
|
|
|
height: 50%; |
|
|
|
border-bottom: 5px solid rgb(229, 235, 240); |
|
|
|
} |
|
|
|
.ns-table-title { |
|
|
@ -550,10 +573,13 @@ |
|
|
|
font-size: 16px; |
|
|
|
font-weight: bold; |
|
|
|
user-select: text; |
|
|
|
padding-left: 16px; |
|
|
|
width: calc(100% + 32px); |
|
|
|
} |
|
|
|
.form { |
|
|
|
margin-left: 10px; |
|
|
|
.drawerTable { |
|
|
|
:deep(.ns-table-container), |
|
|
|
:deep(.ns-table-main) { |
|
|
|
border-top: 0; |
|
|
|
padding: 0; |
|
|
|
} |
|
|
|
} |
|
|
|
</style> |
|
|
|