Authored by xwx

Merge branch 'master' of http://113.200.75.45:82/monitor_v3/hg-monitor-web into master-v32-xwx

Showing 27 changed files with 1109 additions and 265 deletions
... ... @@ -111,7 +111,7 @@ INSERT INTO `user-center`.`sys_menu` (`id`, `parentId`, `menuCode`, `name`, `url
INSERT INTO `user-center`.`sys_role_menu` (`roleId`, `menuId`) VALUES (1, 1000009);
INSERT INTO `user-center`.`sys_role_menu` (`roleId`, `menuId`) VALUES (1, 1000011);
-- 8、修改项目表中的预留字段
ALTER TABLE `cloud_backend_monitor`.`b_ops_project`
ALTER TABLE `cloud_backend_monitor`.`b_ops_project`
MODIFY COLUMN `state` int NULL DEFAULT 0 COMMENT '0:正常,1:延期,3:预留' AFTER `remark`;
-- 9、触发器及其他
... ... @@ -232,11 +232,5 @@ INSERT INTO `inspection-report`.`b_insepectionreport_type` (`id`, `pid`, `name`,
INSERT INTO `inspection-report`.`b_insepectionreport_type` (`id`, `pid`, `name`, `docNo`, `type`, `createUser`, `createTime`, `sort`, `status`) VALUES ('FOUR_HEALTH', '0', '健康检查报告', '10005', 'FOUR_HEALTH', 'admin', '2021-10-12 19:55:13', '10005', 0);
INSERT INTO `inspection-report`.`b_insepectionreport_type` (`id`, `pid`, `name`, `docNo`, `type`, `createUser`, `createTime`, `sort`, `status`) VALUES ('FOUR_MONTHLY', '0', '月报', '10003', 'FOUR_MONTHLY', 'admin', '2021-10-12 19:55:13', '10003', 0);
-- 王涛 inspection-report
alter table b_inspection_document MODIFY column fileSize varchar(50) DEFAULT NULL COMMENT '文件大小';
ALTER TABLE `inspection-report`.`b_inspection_document`
ADD COLUMN `status` int(1) DEFAULT '0' COMMENT '删除状态 0 正常,1删除,默认0';
ALTER TABLE `inspection-report`.`b_insepectionreport_type`
ADD COLUMN `status` int(1) DEFAULT '0' COMMENT '删除状态 0 正常,1删除,默认0';
\ No newline at end of file
-- 12、修改属性分组字段长度
ALTER TABLE `cloud_backend_monitor`.`b_ops_person_property` MODIFY COLUMN `groupings` VARCHAR(100) NULL COMMENT '分组';
... ...
... ... @@ -61,6 +61,7 @@ loading:{
type: Boolean,
default: false
},
--------------------------------------------------------------------
columns参数说明:
// 单元绑定数据key
... ... @@ -77,3 +78,6 @@ render:function (row){
// 表格个性化展示,返回html
return html;
}
------------------------slot--------------------------------------------
#default 内容插槽
#tools 工具栏插槽
... ...
... ... @@ -60,6 +60,118 @@
}
return false;
}
// Start Wang 2021/11/3 10:13 密码不能修改 [https://hgkj.5upm.com/bug-view-65.html]
/**
* 表单提交处理
*
* 作者: Wang
* 时间:2021/11/3 10:10
*/
function verifyForm(pattern, patternTips,last5His){
form.render();
//自定义验证
form.verify((function(pattern, patternTips,last5His) {
return {
pass: function (value) {
if (value === ''){
return '必填项不能位空';
}
if (value === $('#oldPassword').val()){
return '新密码不能与旧密码一致';
}
if(pattern && !new RegExp(pattern).test(value)){
return patternTips;
}
//临时增加用户组写死密码 joke add 20210508
if (last5His && last5His.length > 0 && checkHas(last5His,value)){
return '不能使用最近5次密码';
}
}
//确认密码
, repass: function (value) {
if (value === ''){
return '必填项不能位空';
}
if (value !== $('#setting-new-password').val()) {
return '两次密码输入不一致';
}
}
};
})(pattern, patternTips,last5His));
//设置密码
form.on('submit(setmypass)', function (obj) {
var newPassword = $("#setting-new-password").val();
var oldPassword = $("#oldPassword").val();
var loginUser = sessions.getUser();
var sysUser ={};
sysUser.newPassword = newPassword;
sysUser.oldPassword = oldPassword;
if(loginUser == "admin"){
sysUser.id = 1;
}else {
sysUser.id = 0;
sysUser.username = loginUser;
}
//修改密码
$.ajax({
url: common.domainName + "/api-user/users/password?access_token="+accessToken, //实际使用请改成服务端真实接口
timeout: 50000, //超时时间设置,单位毫秒
type: 'put',
contentType : "application/json;charset=utf-8",
data:JSON.stringify(sysUser),
success: function (data) {
var icon = 1;
if (data.resp_code != 0){
icon = 2;
}
layer.msg(data.resp_msg, {
offset: '15px'
, icon: icon
, time: 2000
}, function () {
if (icon === 1){
// admin.events.refresh();
if (forceType){
localStorage.removeItem("showChangePwd");
}
admin.exit();
}
});
},
error: function (xhr, textStatus, errorThrown) {
$(obj).attr("disabled", false);
if (textStatus == 'timeout') {
layer.msg("请求超时,请重试!", {
icon: 5
, time: 2000
});
return;
}
var msg = xhr.responseText;
if (msg == undefined) {
layer.msg("请求超时,请重试!", {
icon: 5
, time: 2000
});
} else {
var response = JSON.parse(msg);
var message = response.error_description;
if (message == undefined) {
message = response.message;
}
layer.msg(message, {
icon: 5
, time: 2000
});
}
}
});
});
}
//joke add 20210506 获取密码级别
function getPwdLevel(){
... ... @@ -72,113 +184,15 @@
var pattern = data.object.ddicDesc.split(' ')[0];
var patternTips = data.object.ddicDesc.split(' ')[1];
var last5His = passwords;
form.render();
//自定义验证
form.verify((function(pattern, patternTips,last5His) {
return {
pass: function (value) {
if (value === ''){
return '必填项不能位空';
}
if (value === $('#oldPassword').val()){
return '新密码不能与旧密码一致';
}
if(!new RegExp(pattern).test(value)){
return patternTips;
}
//临时增加用户组写死密码 joke add 20210508
if (checkHas(last5His,value)){
return '不能使用最近5次密码';
}
}
//确认密码
, repass: function (value) {
if (value === ''){
return '必填项不能位空';
}
if (value !== $('#setting-new-password').val()) {
return '两次密码输入不一致';
}
}
};
})(pattern, patternTips,last5His));
//设置密码
form.on('submit(setmypass)', function (obj) {
var newPassword = $("#setting-new-password").val();
var oldPassword = $("#oldPassword").val();
var loginUser = sessions.getUser();
var sysUser ={};
sysUser.newPassword = newPassword;
sysUser.oldPassword = oldPassword;
if(loginUser == "admin"){
sysUser.id = 1;
}else {
sysUser.id = 0;
sysUser.username = loginUser;
}
//修改密码
$.ajax({
url: common.domainName + "/api-user/users/password?access_token="+accessToken, //实际使用请改成服务端真实接口
timeout: 50000, //超时时间设置,单位毫秒
type: 'put',
contentType : "application/json;charset=utf-8",
data:JSON.stringify(sysUser),
success: function (data) {
var icon = 1;
if (data.resp_code != 0){
icon = 2;
}
layer.msg(data.resp_msg, {
offset: '15px'
, icon: icon
, time: 2000
}, function () {
if (icon === 1){
// admin.events.refresh();
if (forceType){
localStorage.removeItem("showChangePwd");
}
admin.exit();
}
});
},
error: function (xhr, textStatus, errorThrown) {
$(obj).attr("disabled", false);
if (textStatus == 'timeout') {
layer.msg("请求超时,请重试!", {
icon: 5
, time: 2000
});
return;
}
var msg = xhr.responseText;
if (msg == undefined) {
layer.msg("请求超时,请重试!", {
icon: 5
, time: 2000
});
} else {
var response = JSON.parse(msg);
var message = response.error_description;
if (message == undefined) {
message = response.message;
}
layer.msg(message, {
icon: 5
, time: 2000
});
}
}
});
});
verifyForm(pattern, patternTips,last5His);
} else {
layer.msg('没有获取去密码级别,将不做密码级别验证!', {icon: 0});
verifyForm(undefined, undefined,passwords);
}
}
});
}
// End Wang 2021/11/3 10:12 密码不能修改 [https://hgkj.5upm.com/bug-view-65.html]
$('.layui-layer-setwin .layui-layer-close').click(function () {
... ... @@ -211,4 +225,4 @@
});
});
});
</script>
\ No newline at end of file
</script>
... ...
... ... @@ -8,9 +8,11 @@
<script src="public/lib/vue/vue.global.prod.js"></script>
<script src="public/lib/vue/vue-router.global.prod.js"></script>
<script src="public/lib/vue/vuex.global.prod.js"></script>
<link href="public/lib/element-plus/index-icon.css" rel="stylesheet">
<link href="public/lib/element-plus/index.css" rel="stylesheet">
<script src="public/lib/element-plus/index.full.js"></script>
<script src="public/lib/element-plus/zh-cn.js"></script>
<link href="public/lib/vant/index.css" rel="stylesheet">
<script src="public/lib/vant/vant.min.js"></script>
<script src="public/lib/axios/axios.min.js"></script>
... ...
... ... @@ -8,7 +8,6 @@
background-color: #CCCCCC;
padding: 3px 3px;
width:calc(100% - 10px);
overflow:hidden;
}
.container .cm-card{
... ... @@ -39,7 +38,7 @@ custom-class="config-dialog"
/*加载图标*/
.el-loading-spinner .icon-mj{
.el-loading-spinner .el-icon{
width: 70px;
height: 70px;
background: url(../../../start/layui/css/modules/layer/default/loading-mj.png) no-repeat center;
... ...
... ... @@ -55,6 +55,72 @@
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont">&#xe613;</span>
<div class="name">虚拟桌面</div>
<div class="code-name">&amp;#xe613;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe63c;</span>
<div class="name">堡垒机</div>
<div class="code-name">&amp;#xe63c;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe61a;</span>
<div class="name">堡垒机sas</div>
<div class="code-name">&amp;#xe61a;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe657;</span>
<div class="name">堡垒机授权申请流程</div>
<div class="code-name">&amp;#xe657;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe63d;</span>
<div class="name">虚拟桌面</div>
<div class="code-name">&amp;#xe63d;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe905;</span>
<div class="name">水坝b</div>
<div class="code-name">&amp;#xe905;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe675;</span>
<div class="name">虚拟桌面</div>
<div class="code-name">&amp;#xe675;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe614;</span>
<div class="name">滚水坝</div>
<div class="code-name">&amp;#xe614;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xebde;</span>
<div class="name">线</div>
<div class="code-name">&amp;#xebde;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe7fd;</span>
<div class="name">line</div>
<div class="code-name">&amp;#xe7fd;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xec62;</span>
<div class="name">路由器</div>
<div class="code-name">&amp;#xec62;</div>
</li>
<li class="dib">
<span class="icon iconfont">&#xe752;</span>
<div class="name">搜索</div>
<div class="code-name">&amp;#xe752;</div>
... ... @@ -498,9 +564,9 @@
<pre><code class="language-css"
>@font-face {
font-family: 'iconfont';
src: url('iconfont.woff2?t=1634540750988') format('woff2'),
url('iconfont.woff?t=1634540750988') format('woff'),
url('iconfont.ttf?t=1634540750988') format('truetype');
src: url('iconfont.woff2?t=1635930253141') format('woff2'),
url('iconfont.woff?t=1635930253141') format('woff'),
url('iconfont.ttf?t=1635930253141') format('truetype');
}
</code></pre>
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
... ... @@ -527,6 +593,105 @@
<ul class="icon_lists dib-box">
<li class="dib">
<span class="icon iconfont icon-xunizhuomian"></span>
<div class="name">
虚拟桌面
</div>
<div class="code-name">.icon-xunizhuomian
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-baoleiji"></span>
<div class="name">
堡垒机
</div>
<div class="code-name">.icon-baoleiji
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-baoleijisas"></span>
<div class="name">
堡垒机sas
</div>
<div class="code-name">.icon-baoleijisas
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-baoleijishouquanshenqingliucheng"></span>
<div class="name">
堡垒机授权申请流程
</div>
<div class="code-name">.icon-baoleijishouquanshenqingliucheng
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-xunizhuomian1"></span>
<div class="name">
虚拟桌面
</div>
<div class="code-name">.icon-xunizhuomian1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-shuiba2"></span>
<div class="name">
水坝b
</div>
<div class="code-name">.icon-shuiba2
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-xunizhuomian2"></span>
<div class="name">
虚拟桌面
</div>
<div class="code-name">.icon-xunizhuomian2
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-gunshuiba"></span>
<div class="name">
滚水坝
</div>
<div class="code-name">.icon-gunshuiba
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-line1"></span>
<div class="name">
线
</div>
<div class="code-name">.icon-line1
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-line"></span>
<div class="name">
line
</div>
<div class="code-name">.icon-line
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-luyouqi"></span>
<div class="name">
路由器
</div>
<div class="code-name">.icon-luyouqi
</div>
</li>
<li class="dib">
<span class="icon iconfont icon-sousuo"></span>
<div class="name">
搜索
... ... @@ -1194,6 +1359,94 @@
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-xunizhuomian"></use>
</svg>
<div class="name">虚拟桌面</div>
<div class="code-name">#icon-xunizhuomian</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-baoleiji"></use>
</svg>
<div class="name">堡垒机</div>
<div class="code-name">#icon-baoleiji</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-baoleijisas"></use>
</svg>
<div class="name">堡垒机sas</div>
<div class="code-name">#icon-baoleijisas</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-baoleijishouquanshenqingliucheng"></use>
</svg>
<div class="name">堡垒机授权申请流程</div>
<div class="code-name">#icon-baoleijishouquanshenqingliucheng</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-xunizhuomian1"></use>
</svg>
<div class="name">虚拟桌面</div>
<div class="code-name">#icon-xunizhuomian1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-shuiba2"></use>
</svg>
<div class="name">水坝b</div>
<div class="code-name">#icon-shuiba2</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-xunizhuomian2"></use>
</svg>
<div class="name">虚拟桌面</div>
<div class="code-name">#icon-xunizhuomian2</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-gunshuiba"></use>
</svg>
<div class="name">滚水坝</div>
<div class="code-name">#icon-gunshuiba</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-line1"></use>
</svg>
<div class="name">线</div>
<div class="code-name">#icon-line1</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-line"></use>
</svg>
<div class="name">line</div>
<div class="code-name">#icon-line</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-luyouqi"></use>
</svg>
<div class="name">路由器</div>
<div class="code-name">#icon-luyouqi</div>
</li>
<li class="dib">
<svg class="icon svg-icon" aria-hidden="true">
<use xlink:href="#icon-sousuo"></use>
</svg>
<div class="name">搜索</div>
... ...
@font-face {
font-family: "iconfont"; /* Project id 2843738 */
src: url('iconfont.woff2?t=1634540750988') format('woff2'),
url('iconfont.woff?t=1634540750988') format('woff'),
url('iconfont.ttf?t=1634540750988') format('truetype');
src: url('iconfont.woff2?t=1635930253141') format('woff2'),
url('iconfont.woff?t=1635930253141') format('woff'),
url('iconfont.ttf?t=1635930253141') format('truetype');
}
.iconfont {
... ... @@ -13,6 +13,50 @@
-moz-osx-font-smoothing: grayscale;
}
.icon-xunizhuomian:before {
content: "\e613";
}
.icon-baoleiji:before {
content: "\e63c";
}
.icon-baoleijisas:before {
content: "\e61a";
}
.icon-baoleijishouquanshenqingliucheng:before {
content: "\e657";
}
.icon-xunizhuomian1:before {
content: "\e63d";
}
.icon-shuiba2:before {
content: "\e905";
}
.icon-xunizhuomian2:before {
content: "\e675";
}
.icon-gunshuiba:before {
content: "\e614";
}
.icon-line1:before {
content: "\ebde";
}
.icon-line:before {
content: "\e7fd";
}
.icon-luyouqi:before {
content: "\ec62";
}
.icon-sousuo:before {
content: "\e752";
}
... ...
... ... @@ -6,6 +6,83 @@
"description": "",
"glyphs": [
{
"icon_id": "4675111",
"name": "虚拟桌面",
"font_class": "xunizhuomian",
"unicode": "e613",
"unicode_decimal": 58899
},
{
"icon_id": "7556320",
"name": "堡垒机",
"font_class": "baoleiji",
"unicode": "e63c",
"unicode_decimal": 58940
},
{
"icon_id": "9018063",
"name": "堡垒机sas",
"font_class": "baoleijisas",
"unicode": "e61a",
"unicode_decimal": 58906
},
{
"icon_id": "9344245",
"name": "堡垒机授权申请流程",
"font_class": "baoleijishouquanshenqingliucheng",
"unicode": "e657",
"unicode_decimal": 58967
},
{
"icon_id": "9865796",
"name": "虚拟桌面",
"font_class": "xunizhuomian1",
"unicode": "e63d",
"unicode_decimal": 58941
},
{
"icon_id": "11439036",
"name": "水坝b",
"font_class": "shuiba2",
"unicode": "e905",
"unicode_decimal": 59653
},
{
"icon_id": "25091142",
"name": "虚拟桌面",
"font_class": "xunizhuomian2",
"unicode": "e675",
"unicode_decimal": 58997
},
{
"icon_id": "25132617",
"name": "滚水坝",
"font_class": "gunshuiba",
"unicode": "e614",
"unicode_decimal": 58900
},
{
"icon_id": "19710217",
"name": "线",
"font_class": "line1",
"unicode": "ebde",
"unicode_decimal": 60382
},
{
"icon_id": "4767098",
"name": "line",
"font_class": "line",
"unicode": "e7fd",
"unicode_decimal": 59389
},
{
"icon_id": "5961324",
"name": "路由器",
"font_class": "luyouqi",
"unicode": "ec62",
"unicode_decimal": 60514
},
{
"icon_id": "577365",
"name": "搜索",
"font_class": "sousuo",
... ...
... ... @@ -373,6 +373,7 @@ export default {
params.pid = currentNodeData.value.id;
if(isUserFolder.value){
params.id="";
params.docNo="user";
params.type="user";
}
... ...
... ... @@ -11,10 +11,12 @@
<slot :row="scope.row" :prop="item.prop" :column="item">
<div v-if="typeof(item.render) == 'function'" >
<div v-if="typeof(item.click) == 'function'">
<el-link :type="linkType" :underline="isLink" @click="item.click(scope.row)" v-html="item.render(scope.row)"></el-link>
<!--<el-link :type="linkType" :underline="isLink" @click="item.click(scope.row)" v-html="item.render(scope.row)"></el-link>-->
<span @click="item.click(scope.row)" v-html="item.render(scope.row)"></span>
</div>
<div v-else>
<el-link :type="linkType" :underline="isLink" v-html="item.render(scope.row)"></el-link>
<!-- <el-link :type="linkType" :underline="isLink" v-html="item.render(scope.row)"></el-link>-->
<span v-html="item.render(scope.row)"></span>
</div>
</div>
<span v-else>
... ...
... ... @@ -72,16 +72,7 @@ export default {
type: Boolean,
default: false
},
// 是否展示链接
isLink:{
type: Boolean,
default: false
},
// 是否展示链接
linkType:{
type: String,
default: 'primary'
},
},
data() {
return {}
... ...
... ... @@ -19,7 +19,7 @@ global.showLoading = (callback) => {
const loading = ElementPlus.ElLoading.service({
lock: true,
text: '',
spinner: 'icon-mj',
spinner: ' ',
background: 'rgba(0, 0, 0, 0.7)',
});
... ...
/* 属性配置 -- start */
.assets-configmanager {
padding: 6px 3px;
background: white;
.form-post {
width: 100%;
}
.col-class{
background: white;
padding: 10px;
margin: 5px;
/* 属性配置 -- end */
.yfyw-user {
padding-top: 6px;
width: 99%;
}
.yes{
color: green;
.yfyw-user .title{
font-weight: bold;text-align: left;padding-left: 40px;margin-bottom: 6px
}
.no{
color: red;
.yfyw-user .form-class {
margin-bottom: 0px !important;
}
.assets-configmanagers {
background: #F0F0F0;
.yfyw-user .el-form--label-top .el-form-item__label {
padding: 0px !important;
line-height: 20px !important;
}
.assets-configmanager .config-tools {
.yfyw-user .el-form-item__content {
text-align: left;
margin-left: 2%;
margin-bottom: 6px;
width: 300px;
}
.assets-configmanagers .tbl-header-class {
color: #1E9FFF;
font-weight: bold;
.yfyw-user .el-input__inner, .el-textarea__inner {
border: none;
border-bottom: solid 1px #DCDFE6;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.assets-configmanagers .tbl-header-class th {
background: #EBF5F9 !important;
text-align: center;
.yfyw-user .el-form-item__content .el-date-editor--date {
width: 300px;
}
.assets-configmanagers .tbl-header-class th .cell {
text-align: center !important;
.yfyw-user .form-textarea .el-form-item__content {
width: 90%;
}
.assets-configmanager .el-table__row td{
padding: 2px 0px;!important;
text-align: center;
.yfyw-user .zc-view {
display: flex;
flex-wrap: nowrap;
flex-direction: row;
padding-left: 40px;
border-bottom: solid 1px #DCDFE6;
}
.form-class{
margin-bottom: 50px!important;
.yfyw-user .zc-view .zc-img {
width: 120px;
padding: 3px;
}
.yfyw-user .zc-view .zc-img i {
font-size: 100px
}
.yfyw-user .zc-view .zc-info {
width: calc(100% - 120px);
text-align: left;
}
.yfyw-user .zc-view .zc-item {
display: flex;
flex-wrap: wrap
}
.yfyw-user .zc-view .zc-item .zc-item-label {
width: 33%;
line-height: 30px
}
.yfyw-user .zc-view .zc-item .zc-item-label .zc-item-label-left {
width: 200px;
font-weight: bold;
text-align: right
}
.yfyw-user .zc-view .zc-item .zc-item-label .zc-item-label-right {
width: 200px;
text-align: left;
padding-left: 3px
}
.yfyw-user .zc-view .zc-info .zc-item-tools {
text-align: right;
padding: 3px
}
/* 属性配置 -- end */
... ...
... ... @@ -6,4 +6,16 @@
:showBorder="true" :currentPage="currentPage" :total="total" :loading="false"
:showPage="true" :height="height" :pageSize="pageSize"></cm-table-page>
</div>
<cm-dialog :title="title" width="80%" :showDialogVisible="dialogFlg" @hidedialog="showDialog" :showFooter="false">
<template v-slot>
<div v-if="componentName && componentName != ''">
<component v-bind:is="componentName"
:docType="docType"
height="500"
:docTypeName="docTypeName"
:pageSize="pageSize"
:treeNode="treeNode" :parentNode="parentNode" :projectId="projectId"></component>
</div>
</template>
</cm-dialog>
</div>
... ...
export default {
name: 'projectUserIndex',
template: '',
components: {},
components: {
// 人员信息
'USER': Vue.defineAsyncComponent(
() => myImport('components/page/operationMaintenance/user/index')
),
//文档
// 个人保密协议(THREE_PERSONAGE_NDA)
// 月度总结 THREE_MONTHLY_SUMMARY
// 月报 FOUR_MONTHLY
// 考勤记录 FOUR_CHECKING_IN
// 健康检查报告 FOUR_HEALTH
// 文档资料 TWO_DOCUMENT_MATERIAL
// 项目保密协议 TWO_NDA
'DOCUMENT': Vue.defineAsyncComponent(
() => myImport('components/page/operationMaintenance/doc/index')
),
},
data() {
return {}
},
... ... @@ -26,16 +42,29 @@ export default {
type: Number,
default: 10
},
},
setup(props, {attrs, slots, emit}) {
const {proxy} = Vue.getCurrentInstance();
let title = Vue.ref('');
let docType = Vue.ref('');
let docTypeName = Vue.ref('');
let componentName = Vue.ref('');
let dialogFlg = Vue.ref(false);
let columns = Vue.ref([{
prop: 'nickname',
label: '运维人员姓名',
sortable: true,
click: function (row) {
// 点击弹框展示人员信息
title.value = "人员信息";
componentName.value = "USER";
showDialog(true);
}
}, {
prop: 'phone',
label: '联系电话',
... ... @@ -72,9 +101,16 @@ export default {
label: '个人信息',
sortable: true,
width: '180px',
click: function (row) {
// 点击弹框展示 个人信息
title.value = "个人信息";
componentName.value = "USER";
props.parentNode.id = row.id;
showDialog(true);
},
render: function (row) {
if (row.personalMessage == "YES") {
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;color:#409EFF"></i><span></span>`;
} else {
return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
}
... ... @@ -82,12 +118,20 @@ export default {
}, {
prop: 'personalSecrecyBook',
label: '个人保密协议书',
label: '入场资料',
sortable: true,
width: '180px',
click: function (row) {
// 点击弹框展示 个人保密协议书
title.value = "入场资料";
componentName.value = "DOCUMENT";
docType.value = "THREE_PERSONAGE_NDA";
docTypeName.value = "入场资料";
showDialog(true);
},
render: function (row) {
if (row.personalSecrecyBook == "YES") {
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;color:#409EFF"></i><span></span>`;
} else {
return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
}
... ... @@ -97,9 +141,17 @@ export default {
label: '月度总结',
sortable: true,
width: '180px',
click: function (row) {
// 点击弹框展示 月度总结
title.value = "月度总结";
componentName.value = "DOCUMENT";
docType.value = "THREE_MONTHLY_SUMMARY";
docTypeName.value = "月度总结";
showDialog(true);
},
render: function (row) {
if (row.monthlySummary == "YES") {
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;color:#409EFF"></i><span></span>`;
} else {
return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
... ... @@ -107,6 +159,11 @@ export default {
}
}]);
let showDialog = (flg) => {
dialogFlg.value = flg;
}
let dataList = Vue.ref([]);
let currentPage = Vue.ref(1);
let total = Vue.ref(0);
... ... @@ -140,6 +197,7 @@ export default {
});
}
// 挂载完
Vue.onMounted(() => {
getPage();
... ... @@ -160,7 +218,13 @@ export default {
dataList,
currentPage,
total,
getPage
getPage,
title,
docType,
docTypeName,
dialogFlg,
showDialog,
componentName
}
}
}
... ...
<div style="padding-top: 20px;">
<el-divider content-position="left">个人信息</el-divider>
<el-form :model="ruleForm" label-width="120px" :size="$global.elementSize">
<el-row>
<el-col :span="8">
<el-form-item label="姓名" prop="nickname" class="form-class">
<el-input v-model="ruleForm.nickname" disabled style='width: 190px;'></el-input>
</el-form-item>
<el-form-item label="性别" prop="sex" class="form-class">
<el-radio-group v-model="ruleForm.sex">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="学历" prop="education" class="form-class">
<el-input v-model="ruleForm.education" style='width: 190px;'></el-input>
</el-form-item>
<el-form-item label="手机号" prop="phone" class="form-class">
<el-input v-model="ruleForm.phone" disabled style='width: 190px;'></el-input>
</el-form-item>
<el-form-item label="电子邮箱" prop="email" class="form-class">
<el-input v-model="ruleForm.email" style='width: 190px;'></el-input>
</el-form-item>
<div class="yfyw-user">
<div>
<el-avatar :size="80" :src="imageUrl">
<i class="iconfont icon-yonghu" style="font-size: 80px;"/>
</el-avatar>
<el-upload
class="upload-demo"
:show-file-list="false"
:before-upload="beforeAvatarUpload"
:multiple="false"
:http-request="getFile"
:auto-upload="true">
<el-button size="mini" type="primary">上传照片</el-button>
</el-upload>
</div>
<div class="title">
<i class="iconfont icon-icon--yingbing" /> 人员基本信息
</div>
<div style="padding-left: 40px;margin-bottom: 6px">
<el-form :model="ruleForm" label-width="120px" :size="$global.elementSize" label-position="top" >
<el-row :gutter="5">
<el-col :span="8">
<el-form-item label="姓名" prop="nickname" class="form-class">
<el-input v-model="ruleForm.nickname" :readonly="isAdmin()"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="性别" prop="sex" class="form-class">
<el-radio-group v-model="ruleForm.sex">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="年龄" prop="age" class="form-class">
<el-input v-model="ruleForm.age" type="number"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="入职时间" prop="entryTime" class="form-class">
<el-date-picker
disabled
v-model="ruleForm.entryTime"
type="date"
style='width: 190px;'
placeholder="选择日期">
</el-date-picker>
</el-form-item>
<el-form-item label="获得证书" prop="certificate" disabled class="form-class">
<el-input v-model="ruleForm.certificate" style='width: 190px;'></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所在公司" prop="company" class="form-class">
<el-input v-model="ruleForm.company" disabled style='width: 190px;'></el-input>
</el-form-item>
<el-form-item label="年龄" prop="age" class="form-class">
<el-input v-model="ruleForm.age" style='width: 190px;'></el-input>
</el-form-item>
<el-form-item label="毕业院校" prop="university" class="form-class">
<el-input v-model="ruleForm.university" disabled style='width: 190px;'></el-input>
</el-form-item>
<el-form-item label="座机号码" prop="tel" class="form-class">
<el-input v-model="ruleForm.tel" style='width: 190px;'></el-input>
</el-form-item>
<el-form-item label="家庭住址" prop="post" class="form-class">
<el-input v-model="ruleForm.post" style='width: 190px;'></el-input>
</el-form-item>
<el-form-item label="离职时间" prop="quitTime" class="form-class">
<el-date-picker
v-model="ruleForm.quitTime"
disabled
type="date"
style='width: 190px;'
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-image style="width: 200px; height: 200px" :src="imageUrl"></el-image>
<el-upload
class="upload-demo"
:show-file-list="false"
:before-upload="beforeAvatarUpload"
:multiple="false"
:http-request="getFile"
:auto-upload="true">
<el-button size="small" type="primary">上传照片</el-button>
</el-upload>
</el-col>
</el-row>
<div style="text-align: center;">
<el-button type="primary" size="small" @click="saveUser">保存</el-button>
<el-row :gutter="5">
<el-col :span="8">
<el-form-item label="座机号码" prop="tel" class="form-class">
<el-input v-model="ruleForm.tel"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="手机号" prop="phone" class="form-class">
<el-input v-model="ruleForm.phone" :readonly="isAdmin()"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="电子邮箱" prop="email" class="form-class">
<el-input v-model="ruleForm.email"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="5">
<el-col :span="8">
<el-form-item label="毕业院校" prop="university" class="form-class">
<el-input v-model="ruleForm.university" :readonly="isAdmin()"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="学历" prop="education" class="form-class">
<el-input v-model="ruleForm.education"></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="所在公司" prop="company" class="form-class">
<el-input v-model="ruleForm.company" :readonly="isAdmin()"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="5">
<el-col :span="8">
<el-form-item label="在职状态" prop="certificate" :readonly="isAdmin()" class="form-class">
<el-radio-group v-model="ruleForm.state">
<el-radio :label="1">在职</el-radio>
<el-radio :label="2">离职</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="入职时间" prop="entryTime" class="form-class">
<el-date-picker
:readonly="isAdmin()"
v-model="ruleForm.entryTime"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="离职时间" prop="quitTime" class="form-class">
<el-date-picker
v-model="ruleForm.quitTime"
:readonly="isAdmin()"
type="date"
placeholder="选择日期">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="5">
<el-col :span="24">
<el-form-item label="获得证书" prop="post" class="form-textarea">
<el-input v-model="ruleForm.certificate" type="textarea"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="5">
<el-col :span="24">
<el-form-item label="家庭住址" prop="post" class="form-textarea">
<el-input v-model="ruleForm.post" type="textarea"></el-input>
</el-form-item>
</el-col>
</el-row>
<div style="text-align: center;padding-top: 10px">
<el-button type="primary" size="mini" @click="saveUser">保存基本信息</el-button>
</div>
</el-form>
</div>
<!--资产信息-->
<div class="title">
<i class="iconfont icon-liebiaomoshi"/> 资产信息
<el-dropdown size="mini" split-button @click="assetsAdd('bastion',`新建${icon['bastion'].name}资产`)" style="margin-left: 20px">
<i class="icon el-icon-plus"/>添加{{icon['bastion'].name}}
<template #dropdown>
<div style="max-height: 300px;overflow-y: auto">
<el-dropdown-menu>
<el-dropdown-item v-for="(v,k) in icon" @click="assetsAdd(k,`新建${icon[k].name}资产`)">
添加{{v.name}}
</el-dropdown-item>
</el-dropdown-menu>
</div>
</template>
</el-dropdown>
</div>
<div v-for="(v,k) in assetsMaps">
<div class="zc-view" v-for="(arr,index) in v">
<div class="zc-img">
<i class="iconfont" :class="icon[k].icon"></i><br/>
{{ icon[k].name }}
<span v-if="index > 0">({{index}})</span>
</div>
<div class="zc-info">
<div class="zc-item">
<div class="zc-item-label" v-for="(item,index2) in arr">
<span class="zc-item-label-left">{{item.name}}:</span>
<span class="zc-item-label-right">{{item.value}}</span>
</div>
</div>
<div class="zc-item-tools">
<el-button-group size="mini">
<el-button @click="btnClick('add',arr,`新建${icon[k].name}资产`)">
<i class="el-icon-plus"/>
</el-button>
<!--<el-button @click="btnClick('save',arr,`保存${icon[k].name}资产`)">
<i class="el-icon-check"/>
</el-button>-->
<el-button @click="btnClick('edit',arr,`编辑${icon[k].name}资产`)">
<i class="el-icon-edit"/>
</el-button>
<el-button @click="deleteAssets(arr,`删除${icon[k].name}资产`)">
<i class="el-icon-remove"/>
</el-button>
</el-button-group>
</div>
</div>
</div>
<!-- <el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>Create</el-button
>
<el-button @click="resetForm('ruleForm')">Reset</el-button>
</el-form-item> -->
</el-form>
</div>
<cm-dialog :title="btnType.title" width="60%" :showDialogVisible="op" @hidedialog="showDialog" :showFooter="true" @okfunc="okFunc">
<template v-slot style="padding: 10px">
<el-form label-width="120px" :size="$global.elementSize" label-position="top" >
<el-row :gutter="5" >
<el-col :span="8" v-for="item in btnType.data">
<el-form-item :label="item.name" :prop="item.name" class="form-class">
<el-input v-if="item.extend && item.extend.dict == undefined" v-model="item.value"></el-input>
<el-select v-else v-model="item.value" :placeholder="`请选择${item.name}`">
<el-option
v-for="item in item.extend.dict"
:key="item.value"
:label="item.name"
:value="item.name" >
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
</cm-dialog>
</div>
... ...
const assets = (props, {attrs, slots, emit}) => {
const {proxy} = Vue.getCurrentInstance();
let assetsMaps = Vue.ref({});
let btnType = Vue.ref({
flg: '',
data: []
});
// 类型 bastion 堡垒机,dam 防水坝,virtual 虚拟桌面
let icon = {
bastion: {
name: '堡垒机',
icon: 'icon-baoleiji'
},
dam: {
name: '防水坝',
icon: 'icon-shuiba2'
},
virtual: {
name: '虚拟桌面',
icon: 'icon-xunizhuomian'
},
}
// 查询列表
let getAssets = () => {
proxy.$http.get(`/api-web/person/assets/userList/${props.parentNode.id}`, {}, function (res) {
if (res && res.map) {
assetsMaps.value = res.map;
}
});
}
let assetsAdd = (type, msg) => {
proxy.$http.get(`/api-web/person/assets/typeList/${type}`, {}, function (res) {
if (res && res.data && res.data.length > 0) {
btnClick('add',res.data,msg);
} else {
proxy.$global.showMsg("没有配置属性!","warning");
}
});
}
/**
* 新增资产
* <p>
* 作者: Wang
* 时间:2021/11/3 20:14
*/
let btnClick = (flg, arr, title) => {
let data = [];
if ('add' == flg) {
// 新增复制
arr.map((v) => {
let obj = {...v};
obj.value = '';
obj.id = 0;
obj.groupings = (new Date()).getTime();
data.push(obj)
})
} else {
data = arr;
}
data.map(function (v){
let str = v.extend;
if(str){
try {
let json = JSON.parse(str);
v.extend = json;
}catch (e){
}
}
})
btnType.value = {
flg: flg,
data: data,
title: title
}
showDialog(true);
}
/**
* 新增资产
* <p>
* 作者: Wang
* 时间:2021/11/3 20:14
*/
let addAssets = () => {
let data = btnType.value.data
data.map(function (v){
v.extend = JSON.stringify(v.extend);
})
proxy.$http.post(`/api-web/person/assets/add/${props.parentNode.id}`,data , function (res) {
if (res && res.success) {
proxy.$global.showMsg("添加成功");
showDialog(false);
getAssets();
}
});
}
/**
* 保存资产
* <p>
* 作者: Wang
* 时间:2021/11/3 20:14
*/
let saveAssets = () => {
let data = btnType.value.data
data.map(function (v){
v.extend = JSON.stringify(v.extend);
})
proxy.$http.post(`/api-web/person/assets/edit/${props.parentNode.id}`, data, function (res) {
if (res && res.success) {
proxy.$global.showMsg("编辑成功");
showDialog(false);
getAssets();
}
});
}
/**
* 删除资产
* <p>
* 作者: Wang
* 时间:2021/11/3 20:14
*/
let deleteAssets = (arr) => {
proxy.$global.confirm(`您确认永久删除该资产信息吗?`,function (){
proxy.$http.post(`/api-web/person/assets/delete/${props.parentNode.id}`, arr, function (res) {
if (res && res.success) {
proxy.$global.showMsg("删除成功");
} else {
proxy.$global.showMsg("删除失败,资产不存在或者已被删除!","error");
}
showDialog(false);
getAssets();
});
})
}
// 弹框标识
let op = Vue.ref(false);
/**
* 展示编辑弹框
* <p>
* 作者: Wang
* 时间:2021/11/3 20:17
*/
let showDialog = (flg) => {
op.value = flg;
}
let okFunc = () => {
let flg = btnType.value.flg;
if (flg == 'add') {
addAssets();
} else if (flg == 'edit') {
saveAssets();
}
}
return {
icon,
getAssets,
assetsMaps,
addAssets,
saveAssets,
deleteAssets,
op,
showDialog,
okFunc,
btnClick,
btnType,
assetsAdd
}
}
export default {
name: 'projectPJIndex',
template: '',
... ... @@ -25,6 +209,7 @@ export default {
const {proxy} = Vue.getCurrentInstance();
let imageUrl = Vue.ref('');
let ruleForm = Vue.ref({
nickname: '',
sex: 0,
... ... @@ -47,12 +232,13 @@ export default {
// 获取表格数据
let getPage = () => {
proxy.$http.get("/api-web/bOpsPerson/search", {
"nickname": props.parentNode.label,
"id": props.parentNode.id,
"projectId": props.projectId
}, function (res) {
if (res && res.object) {
ruleForm.value = res.object
}else {
} else {
ruleForm.value = res.object
}
});
... ... @@ -65,7 +251,7 @@ export default {
// 保存用户信息
let saveUser = () => {
proxy.$http.post("/api-web/bOpsPerson/saveOrUpdate",ruleForm.value , function (res) {
proxy.$http.post("/api-web/bOpsPerson/saveOrUpdate", ruleForm.value, function (res) {
if (res && res.code == 0) {
proxy.$global.showMsg('保存成功!');
}
... ... @@ -73,10 +259,10 @@ export default {
}
let getFile = (param) =>{
let getFile = (param) => {
let fileObj = param.file
let params = {
file:fileObj,
file: fileObj,
id: props.parentNode.id
}
// 上传文件
... ... @@ -88,30 +274,64 @@ export default {
imageUrl.value = URL.createObjectURL(fileObj);
}
let beforeAvatarUpload = (file) =>{
let beforeAvatarUpload = (file) => {
const isJPG = file.type.indexOf('image/') != -1
if (!isJPG) {
proxy.$global.showMsg('您上传的不是图片文件,请选择图片!','error');
proxy.$global.showMsg('您上传的不是图片文件,请选择图片!', 'error');
}
return isJPG
}
let isAdmin = () => {
return localStorage.getItem('lgn') != 'admin';
}
const {
icon,
getAssets,
assetsMaps,
addAssets,
saveAssets,
deleteAssets,
op,
showDialog,
okFunc,
btnClick,
btnType,
assetsAdd
} = assets(props, {attrs, slots, emit});
// // 挂载完
Vue.onMounted(() => {
getPage();
getAssets();
})
// 监听编辑状态
Vue.watch(() => props.projectId, (newValue, oldVlaue) => {
getPage();
getAssets();
});
return {
imageUrl,
ruleForm,
saveUser,
getFile,
beforeAvatarUpload,
isAdmin,
// 资产属性
icon,
getAssets,
assetsMaps,
addAssets,
saveAssets,
deleteAssets,
op,
showDialog,
okFunc,
btnClick,
btnType,
assetsAdd
}
}
}
... ...
... ... @@ -37,7 +37,7 @@ export default {
label: '日常资料',
render: function (row) {
if(row.dayMaterial =="YES"){
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;color:#409EFF"></i><span></span>`;
}else{
return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
}
... ... @@ -49,7 +49,7 @@ export default {
label: '文档资料',
render: function (row) {
if(row.documentMaterial =="YES"){
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;color:#409EFF"></i><span></span>`;
}else{
return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
}
... ... @@ -60,7 +60,7 @@ export default {
label: '项目保密协议',
render: function (row) {
if(row.nda =="YES"){
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;"></i><span></span>`;
return `<i class="iconfont icon-icon--yes" style="font-size: 22px;margin-right: 10px;color:#409EFF"></i><span></span>`;
}else{
return `<i class="iconfont icon-icon--shanchu" style="font-size: 22px;margin-right: 10px;color:red"></i><span></span>`;
}
... ...
... ... @@ -14,7 +14,7 @@
</div>
</el-col>
<el-col :span="20" >
<div class="cm-card" :style="{'min-height':height+'px','height':'100%','padding-left':'5px'}" >
<div class="cm-card" :style="{'max-height':height+'px','height':'100%','padding-left':'5px'}" >
<component v-bind:is="componentName"
:docType="docType"
:docTypeName="docTypeName"
... ...