Authored by 鲁尚清

Merge branch 'master' of http://192.168.1.136:82/monitor_v3/hg-monitor-web into …

…master-v32-lushangqing
Showing 45 changed files with 2623 additions and 176 deletions
... ... @@ -114,39 +114,111 @@ INSERT INTO `user-center`.`sys_role_menu` (`roleId`, `menuId`) VALUES (1, 100001
ALTER TABLE `cloud_backend_monitor`.`b_ops_project`
MODIFY COLUMN `state` int NULL DEFAULT 0 COMMENT '0:正常,1:延期,3:预留' AFTER `remark`;
-- 9、同步流程业务添加触发器
-- 新增触发器
DELIMITER $$
CREATE TRIGGER syn_business_add AFTER INSERT ON b_bustype
FOR EACH ROW
begin
-- 9、触发器及其他
-- 1、流程表添加是否是虚拟字段
ALTER TABLE `itsm_demo`.`system_handler`
MODIFY COLUMN `isvirtual` varchar(1) NULL DEFAULT NULL COMMENT '是否虚拟 0:虚拟;1:正常' AFTER `enable`;
-- 2、文件类型的备注由个人保密协议变成入场资料
ALTER TABLE `cloud_backend_monitor`.`b_ops_file`
MODIFY COLUMN `type` int NULL DEFAULT NULL COMMENT '上传文件类型:10:入场资料,11:个人月度总结,21:月报,22:考勤记录,23:健康检查报告,31:文档资料,32:项目保密协议' AFTER `id`;
-- 乙方运维项目表添加是否是虚拟字段
ALTER TABLE `cloud_backend_monitor`.`b_ops_project`
ADD COLUMN `isvirtual` varchar(1) NULL COMMENT '是否虚拟 0:虚拟;1:正常' AFTER `enable`;
-- 3、同步流程业务添加触发器
-- 新增触发器
DELIMITER $$
CREATE TRIGGER syn_business_add AFTER INSERT ON b_bustype
FOR EACH ROW
begin
IF NEW.isLeaf = 1 THEN
INSERT INTO `itsm_demo`.`system_handler` (`system_id`, `system_name`, `sort`, `system_type`, `enable`) VALUES (NEW.busId, NEW.busTypeName, NEW.sort, "0","0");
INSERT INTO `itsm_demo`.`system_handler` (`system_id`, `system_name`, `sort`, `system_type`, `enable`,`isvirtual`) VALUES (NEW.busId, NEW.busTypeName, NEW.sort, "0",NEW.isUse,"1");
END IF;
end$$
DELIMITER ;
-- 修改触发器
DELIMITER $$
CREATE TRIGGER syn_business_change AFTER UPDATE ON b_bustype
FOR EACH ROW
begin
end$$
DELIMITER ;
-- 修改触发器
DELIMITER $$
CREATE TRIGGER syn_business_change AFTER UPDATE ON b_bustype
FOR EACH ROW
begin
IF NEW.isLeaf = 1 and OLD.isLeaf =1 THEN
UPDATE `itsm_demo`.`system_handler` SET `system_name` = NEW.busTypeName, `sort` = NEW.sort WHERE `system_id` = OLD.busId;
UPDATE `itsm_demo`.`system_handler` SET `system_name` = NEW.busTypeName, `enable`= NEW.isUse, `sort` = NEW.sort WHERE `system_id` = OLD.busId;
ELSE
DELETE FROM `itsm_demo`.`system_handler` where `system_id` = OLD.busId;
END IF;
end$$
DELIMITER ;
-- 删除触发器
DELIMITER $$
CREATE TRIGGER syn_business_delete AFTER DELETE ON b_bustype
FOR EACH ROW
begin
end$$
DELIMITER ;
-- 删除触发器
DELIMITER $$
CREATE TRIGGER syn_business_delete AFTER DELETE ON b_bustype
FOR EACH ROW
begin
IF OLD.isLeaf = 1 THEN
DELETE FROM `itsm_demo`.`system_handler` where `system_id` = OLD.busId;
END IF;
end$$
DELIMITER ;
end$$
DELIMITER ;
-- 4、同步流程用户添加触发器 暂无删除触发器 如果有垃圾数据需要从库中sql进行删除
-- 新增触发器
DELIMITER $$
CREATE TRIGGER syn_person_add AFTER INSERT ON b_ops_project_person
FOR EACH ROW
begin
-- 根据插入的项目id获取业务id
select `busId` into @system_id_ from b_ops_project WHERE id = NEW.projectId;
-- 根据用户Id获取用户昵称、在职状态
select `nickname`,`state` INTO @user_name_,@enable_ from b_ops_person WHERE id = NEW.personId;
-- 插入用户信息
INSERT INTO `itsm_demo`.`system_handler_evaluate_user` (`system_id`, `user_id`, `user_name`, `enable`) VALUES (@system_id_, NEW.personId, @user_name_, @enable_);
end$$
DELIMITER ;
-- 修改触发器
-- 如果修改用户表,修改流程用户
DELIMITER $$
CREATE TRIGGER syn_ops_person_change AFTER UPDATE ON b_ops_person
FOR EACH ROW
begin
-- 根据用户信息获取业务id
select DISTINCT(a.`busId`) into @system_id_ from b_ops_project a left JOIN b_ops_project_person b on a.id=b.projectId where b.personId=OLD.id;
-- 根据用户id修改流程用户信息
UPDATE `itsm_demo`.`system_handler_evaluate_user` SET `user_name` = NEW.nickname , `enable` = NEW.state WHERE `system_id` = @system_id_ and `user_id` = OLD.id;
end$$
DELIMITER ;
-- 5、流程项目同步是否虚拟和是否乙方运维项目
-- 新增触发器 修改流程业务的是否乙方运维和是否虚拟
DELIMITER $$
CREATE TRIGGER syn_project_add AFTER INSERT ON b_ops_project
FOR EACH ROW
begin
-- 添加项目时修改是否乙方运维、是否虚拟
UPDATE `itsm_demo`.`system_handler` SET `system_type`=1 ,`isvirtual`=NEW.isvirtual WHERE `system_id` = NEW.busId;
end$$
DELIMITER ;
-- 修改触发器 修改流程业务的是否是虚拟
DELIMITER $$
CREATE TRIGGER syn_project_change AFTER UPDATE ON b_ops_project
FOR EACH ROW
begin
-- 相当于项目被隐藏
IF NEW.`enable` = 1 THEN
UPDATE `itsm_demo`.`system_handler` SET `system_type`=0 ,`isvirtual`=1 WHERE `system_id` = OLD.busId;
ELSE
-- 修改项目时修改是否是虚拟
UPDATE `itsm_demo`.`system_handler` SET `isvirtual`=NEW.isvirtual WHERE `system_id` = OLD.busId;
END IF;
end$$
DELIMITER ;
-- 6、乙方运维项目表添加业务唯一键
ALTER TABLE `cloud_backend_monitor`.`b_ops_project`
ADD UNIQUE INDEX `busId_unique`(`busId`);
-- 10、手动把系统中的业务同步到流程的itsm_demo库中的system_handler表。且同步过来的业务只能是叶子业务,并且不能为虚拟业务
--(system_handler中system_id是业务id busId,system_type为乙方运维时,能在monitor库b_ops_project查到 关键字段 busId)
... ... @@ -160,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 '分组';
... ...
# 任务地址
[https://hgkj.5upm.com/task-view-72.html](任务地址)
## 涉及SQL
`V1015_1_乙方运维数据库设计SQL.txt`
## 涉及工程
> 1、hg-monitor-web-zj<br>
... ...
... ... @@ -61,6 +61,7 @@ loading:{
type: Boolean,
default: false
},
--------------------------------------------------------------------
columns参数说明:
// 单元绑定数据key
... ... @@ -77,3 +78,6 @@ render:function (row){
// 表格个性化展示,返回html
return html;
}
------------------------slot--------------------------------------------
#default 内容插槽
#tools 工具栏插槽
... ...
//工作汇报表单
layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions', 'xmSelect', 'laydate', 'upload'], function (exports) {
var $ = layui.$;
var form = layui.form;
var layer = layui.layer;
var admin = layui.admin;
var table = layui.table;
var common = layui.common;
var session = layui.sessions;
var laydate = layui.laydate;
var upload = layui.upload;
var domainName = common.domainName;
var xmSelect = layui.xmSelect;
//对外暴露的接口
exports('assetsRepairAdd', function (data) {
var accessToken = session.getToken()['access_token']
var userSelect = "";
var currentDate = {}
var hitDate = {}
var uploadInst = {}
var defaultUser = []
var attachmentIds = []
var id = data.id
var cols = []
var where = {}
var currentResourceType = ''
var resTypeSele
var viewType = data && data.viewType ? data.viewType : '';
//渲染表单
form.render(null, 'add-repair-form')
init()
//保存
form.on('submit(repair-form-save-id)', function (res) {
var value = $('#attachmentInput').val()
if (value != '') {
$('#upload_btn').click()
} else {
saveForm()
}
})
//保存
function saveForm() {
layer.load(2)
var data = form.val('add-repair-form')
var params = {}
params.attachmentIds = attachmentIds.toString()
delete data['file']
delete data['select']
params.workReport = JSON.stringify(data)
admin.req({
url: domainName + '/api-web/bResource/assetsrepair/save?access_token=' + accessToken,
data: JSON.stringify(params),
type: 'post',
contentType: "application/json; charset=utf-8",
done: function (res) {
if (res.success) {
layer.msg(res.msg, {
offset: '15px',
icon: 1,
time: 1000,
}, function () {
layer.closeAll()
})
} else {
layer.msg(res.msg, {
offset: '15px',
icon: 7,
time: 1000,
})
}
}
})
return false
}
//页面初始化
function init() {
loadSelect()
initDatePlus()
initUploadPlus()
if (viewType == 'view') {
initViewMode();
}
}
// 初始化下拉框
function loadSelect() {
admin.req({
url: domainName + '/api-web/bResource/findAssetsRepairList'
}).done(function (response) {
var options = "<option value=''>=归属单位=</option>";
$.each(response.data, function (i, v) {
options += "<option value='" + v.orgCode + "'>" + v.orgName + "</option>"
});
$('#slt-repairadd-org').html(options);
form.render();
});
admin.req({
url: domainName + '/api-web/bWorkreportGroup/findManufacturerList'
}).done(function (response) {
var options = "<option value=''>=选择厂商=</option>";
$.each(response.data, function (i, v) {
options += "<option value='" + v.id + "'>" + v.manufacturerName + "</option>"
});
$('#slt-repairadd-group').html(options);
form.render();
});
admin.req({
url: domainName + '/api-web/bResource/getInfoByAssetsType',
}).done(function (response) {
var options = "<option value=''>=设备类型=</option>";
$.each(response.data, function (i, v) {
options += "<option value='" + v.resTypeCode + "'>" + v.resTypeName + "</option>"
});
$('#slt-repairadd-res').html(options);
form.render();
})
$.ajax({
url: domainName + '/api-web/bResource/getGroupByAdmin?theirType=1&access_token=' + accessToken,
success: function (res) {
if (!res.map) {
layer.msg("没有上传权限,请去添加权限")
return;
} else {
var map = res.map;
$("#createUser").val(map.admin);
}
fromAssignment()
form.render();
}
})
}
//初始化日期插件
function initDatePlus() {
currentDate = laydate.render({
elem: '#createtime', //指定元素
value: new Date(),
type: 'datetime',
isInitValue: true,
max: 0,
});
hitDate = laydate.render({
elem: '#hitchtime', //指定元素
value: new Date(),
type: 'datetime',
isInitValue: true,
max: 0,
});
}
//初始化上传插件
function initUploadPlus() {
var param = {"access_token": accessToken}
var fileName = []
uploadInst = upload.render({
elem: '#attachment', //绑定元素
url: common.domainName + '/api-web/bResource/assetsrepair/upload',
data: param,
multiple: true,
auto: false, //选择文件后不自动上传
bindAction: '#upload_btn',//指定按钮触发上传
accept: 'file',
exts: 'xls|doc|pdf|docx|xlsx|jpg|png',
choose: function (obj) {
//选择文件后回调
var files = this.files = obj.pushFile();
obj.preview(function (index, file, result) {
fileName.push(file.name)
$('#attachmentInput').val(fileName.toString())
})
},
done: function (res) {
//单次上传成功
attachmentIds.push(res.str)
},
allDone: function (obj) {
//全部上传成功后
saveForm()
},
error: function (index, upload) {
// 上传失败
layer.msg('文件上传时发生故障,请稍后再试!', {
icon: 7, time: 3000
});
}
});
}
// 初始化查看模式
function initViewMode() {
$('form[lay-filter="add-workReport-form"]').find('input, textarea').attr('readonly', true);
$('form[lay-filter="add-workReport-form"]').find('select').attr('disabled', true);
$.each(xmSelect.get(), function (i, v) {
v.update({disabled: true});
});
$('#attachmentInput').parent().parent().parent().addClass('hide');
$('#table-report-add-attachment').removeClass('hide');
$('#form-item-repTitle').removeClass('hide');
//渲染附件表格
var attachmentTable = table.render({
elem: '#table-repair-add-attachment',
url: domainName + '/api-web/bResource/assetsrepair/getAttaById',
where: {
access_token: accessToken,
id: data.id
},
height: 'full',
page: {
layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
, theme: '#1E9FFF'//自定义分页主题颜色
},
end: function (e) {
form.render()
},
limit: common.limit,
limits: common.limits,
even: true,
cols: [[
{type: 'numbers', title: '序号'},
{
field: 'name', title: '文件名称', align: 'center', minWith: 200,
},
{
field: 'suffix', title: '文件后缀', align: 'center', minWith: 150,
},
{
field: 'size', title: '文件大小', align: 'center', minWith: 150,
templet: function (d) {
var str = (d.size / 1000).toFixed(2)
return `<div><span>${str}KB</span></div>`
}
},
{
title: '操作', align: "center", width: 120,
templet: '<div><span data-id="{{d.id}}" data-suffix="{{d.suffix}}" class="layui-table-link preview-attachment-btn">预览</span></div>'
}
]],
done: function () {
$('.preview-attachment-btn').on('click', function () {
var id = $(this).data('id')
var suffix = $(this).data('suffix')
if (suffix == 'jpg' || suffix == 'png' || suffix == 'JPG' || suffix == 'PNG') { //图片类型
var srcUrl = domainName + `/api-web/openoffice/readImage/${id}?access_token=` + accessToken
layer.open({
type: 1,
content: `<div><img src="${srcUrl}" width="100%" height="100%" /></div>`,
title: '图片预览',
area: ['60%', '90%']
})
} else {
//附件为文档类型
common.openReport(id)
}
})
}
})
form.render();
}
//表单赋值
function fromAssignment() {
if (data && data.id) {
$('#add-repair-form-atta').show()
//编辑表单时禁用日志类型修改和时间选择
$('#add-repair-form').find("select[name='hitchtime']").attr("disabled", "disabled")
$('#add-repair-form').find("input[name='createtime']").attr("disabled", "disabled")
//编辑表单时取消显示默认值
currentDate.config.isInitValue = false
hitDate.config.isInitValue = false
initDatePlus()
admin.req({
url: domainName + `/api-web/bResource/assetsrepair/getById`,
data: {id: data.id},
async: false,
}).done(function (res) {
form.val('add-repair-form', res.object)
if (res.object.attachmentList) {
$.each(res.object.attachmentList, function (i, v) {
writeTagsInfo(v.id, v.originalName)
})
}
})
}
}
//写入标签内容
function writeTagsInfo(id, name) {
var tags = '<span id="tags_span_' + id + '" data-id="' + id + '"><em>' + name + '</em>' +
'<button type="button" value="' + id + '" class="tagsclose close">×</button></span>';
if ($("#tags_span_" + id).length == 0) {
//拼接标签
$("#selecte_content_id").append(tags);
//绑定标签的删除事件
bindTagesDelEvent();
}
}
//删除标签事件
function bindTagesDelEvent() {
//删除已选主体的页签
$("button.tagsclose").on("click", function () {
var attachId = $(this).attr("value");
//确认提示框
layer.confirm('附件删除后将无法恢复,您确定要删除吗?', {
btn: ['确定', '取消'] //按钮
}, function () {
$.ajax({
url: domainName + `/api-web/workreport/deleteAttachment/${id}/${attachId}?access_token=` + accessToken,
type: "get",
}).done(function (res) {
layer.msg('删除成功', {
offset: '15px'
, icon: 1
, time: 1000
}, function () {
$("#tags_span_" + attachId).remove();
});
}).error(function (error) {
console.log(error);
});
});
});
}
})
})
\ No newline at end of file
... ...
/** 资产维修记录查看 */
layui.define(['table', 'form', 'sessions', 'admin', 'common', 'echarts','laydate','element'], function (exports) {
var $ = layui.$;
var form = layui.form;
var table = layui.table;
var admin = layui.admin;
var common = layui.common;
var laydate = layui.laydate;
var element = layui.element;
exports('assetsrepair', function () {
var sessions = layui.sessions;
var accessToken = sessions.getToken().access_token;
var domainName = common.domainName;
var companyChart = echarts.init(document.getElementById('chart-company-report'));
var resTypeChart = echarts.init(document.getElementById('chart-restype-report'));
var dateLimit = ""
var createTime = ""
var currentResourceTypeTreeNodeId = ""
var resTypeSelect;
//日期范围选择
laydate.render({
elem: '#dateLimit'
,range: '~',
done: function (value) {
dateLimit = value
if (dateLimit == '') {
$('[data-period="thisWeek"]').click()
} else {
$.each($("button.date"),function (i,e) {
var $dom = $(e);
if($dom.hasClass("active")){
$dom.removeClass("active")
}
})
reloadAllChange()
}
}
});
form.render();
loadCompanyReport();
loadResTypeReport();
loadWorkReportTable();
loadConditionSelect();
//监听Esc事件
$(document).keyup(function(event){
if(event.keyCode === 27 || event.keyCode === 96){
layer.closeAll();
}
});
// 日期方式选择
$('#btns-repair-time button').click(function () {
$.each($("button.date"),function (i,e) {
var $dom = $(e);
if($dom.hasClass("active")){
$dom.removeClass("active")
}
})
$("#dateLimit").val('')
dateLimit = ''
$("#btns-repair-time button").removeClass("active");
$(this).addClass("active");
createTime = ($(this).data("period"))
reloadAllChange();
});
// 回车搜索
$('[lay-filter="form-repair-condition"] input').keydown(function (e) {
if (e.keyCode === 13) {
reloadAllChange();
}
});
// 下拉框改变搜索
form.on('select(slt-repair-group)', reloadAllChange);
form.on('select(slt-repair-user)', reloadAllChange);
form.on('select(slt-repair-org)', reloadAllChange);
// 加载工作汇报表格
function loadWorkReportTable() {
var conditions = form.val('form-repair-condition');
Object.assign(conditions, {access_token: accessToken, createtime: createTime, viewMode: 'true',dateLimit:dateLimit});
table.render({
elem: '#table-repair-view',
url: domainName + '/api-web/bResource/getAssetsRepairForPage',
where: conditions,
height: 'full-360',
page: {
layout: ['count', 'prev', 'page', 'next', 'limit', 'skip'],
theme: '#1E9FFF'
},
end: function (e) {
form.render()
},
limit: common.limit,
limits: common.limits,
even: true,
cols: [[{
type: 'checkbox'
}, {
type: 'numbers', title: '序号'
}, {
field: 'title', title: '标题', align: 'center', minWidth: 200,event: 'serRead',
templet: '<div><span data-id="{{d.id}}" class="layui-table-link view-repair-title" >{{d.title}}</span></div>'
}, {
field: 'resTypeName', title: '资产类型', align: 'center',
}, {
field: 'resourceSN', title: '设备序列号', align: 'center',
},{
field: 'ip', title: 'ip段', align: 'center',
},{
field: 'orgName', title: '归属单位', align: 'center',
},{
field: 'attachmentList', title: '附件数量', align: 'center',
templet: '<div><span data-id="{{d.id}}" class="layui-table-link view-repair-attachment">{{d.attachmentList.length}}</span></div>'
},{
field: 'groupName', title: '上报人', align: 'center',
}, {
field: 'manufacturerName', title: '厂商', align: 'center',
},{
field: 'hitchtime', title: '故障时间', align: 'center',
},{
field: 'createtime', title: '维修时间', align: 'center',
}]],
done: function () {
//点击标题编辑表单
$('.view-repair-title').on('click', function () {
openWorkReportForm( $(this).data('id'))
})
//获取附件列表
$('.view-repair-attachment').on('click', function () {
openWorkReportList('attachment', $(this).data('id'))
})
}
});
}
//新增日报
$('#repair_create').on('click', function () {
openWorkReportForm()
})
//新增/编辑表单
function openWorkReportForm(id) {
var title = id ? '编辑' : '新增'
common.openWin('assets/add', title, {id: id}, ['保存', '取消'], function f() {
$("#repair-form-save-id").trigger("click");
})
}
//查看附件/接收人列表
function openWorkReportList(type, id) {
var title = '附件'
common.openWin('assets/repairlist', title, {id: id, type: type}, ['确定', '取消'])
}
// 加载查询条件下拉框
function loadConditionSelect() {
admin.req({
url: domainName + '/api-web/bResource/findAssetsRepairList'
}).done(function (response) {
var options = "<option value=''>=归属单位=</option>";
console.log(response.data)
$.each(response.data, function (i, v) {
options += "<option value='" + v.orgCode + "'>" + v.orgName + "</option>"
});
$('#slt-repair-org').html(options);
form.render();
});
admin.req({
url: domainName + '/api-web/bWorkreportGroup/findManufacturerList'
}).done(function (response) {
var options = "<option value=''>=选择厂商=</option>";
$.each(response.data, function (i, v) {
options += "<option value='" + v.id + "'>" + v.manufacturerName + "</option>"
});
$('#slt-repair-group').html(options);
form.render();
});
$.ajax({
url: domainName + '/api-user/users/getAll',
data: {
access_token: accessToken
},
success: function (response) {
var options = "<option value=''>=选择汇报人=</option>";
$.each(response, function (i, v) {
options += "<option value='" + v.username + "'>" + v.nickname + "</option>"
});
$('#slt-repair-user').html(options);
form.render();
}
});
admin.req({
url:common.domainName + '/api-web/home/resType/getTree?hardwareFlag=Y',
}).done(function (res) {
resTypeSelect = xmSelect.render({
el: '#hardware-layui-select',
name: "resType",
tips: '==资产类型==',
filterable: true,
radio: true,
clickClose: false,
layVerify: 'required',
height: '20px',
tree: {
show: true,
showFolderIcon: true,
showLine: true,
strict: true,
indent: 20
},
model: {
label: {
type: 'text'
}
},
height: 'auto',
data: res.data,
hide:function () {
var str = resTypeSelect.getValue('valueStr');
if(!str){
str = 'all';
}
currentResourceTypeTreeNodeId=str;
reloadAllChange();
}
});
form.render();
})
}
// 各单位维修情况
function loadCompanyReport() {
var conditions = form.val('form-repair-condition');
Object.assign(conditions, {access_token: accessToken, createtime: createTime, viewMode: '',dateLimit:dateLimit,groupBy: 'orgName'});
admin.req({
url: domainName + '/api-web/bResource/getAssetsRepairForGroup',
data: conditions
}).done(function (response) {
var chartData = response.map;
var groupList = chartData.groupList;
var countList = chartData.countList;
var xData = [];
var groupData = [];
$.each(groupList, function (i, v) {
xData.push(v);
groupData.push({
name: v,
value: 1
});
});
var series = [{
name: '维修数',
data: countList,
barWidth: 20,
type: 'bar',
label: {
show: true,
position: 'top',
textStyle: {
color: '#555'
},
formatter:function (data) {
return countList[data.dataIndex]
}
},
itemStyle: {
normal: {
color: (params) => {
var colors = ['#b6c2ff', '#96edc1', '#fcb75b'];
return colors[params.dataIndex % 3]
}
}
},
xAxisIndex: 0,
yAxisIndex: 0
}];
/**
双X轴标签对应,伪实现思路:
底部的标签也是柱状图,对应包含的区域为上方X轴条数占总数的比例,设为宽度即可
*/
var option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: [{
top: 20,
bottom: 70,
right: 5
}, {
height: 30,
bottom: 30,
right: 5
}],
xAxis: [{
type: 'category',
data: xData,
gridIndex: 0,
axisLabel: {
color: '#333',
show: true,
interval:0,
rotate:25
},
axisLine: {
lineStyle: {
color: '#e7e7e7'
}
},
axisTick: {
lineStyle: {
color: '#e7e7e7'
}
},
zlevel: 2
}, {
type: 'category',
gridIndex: 1,
axisLine: {
show: false
},
zlevel: 1
}],
yAxis: [{
type: 'value',
gridIndex: 0,
axisLabel: {
color: '#333'
},
splitLine: {
lineStyle: {
type: 'dashed'
}
},
axisLine: {
lineStyle: {
color: '#ccc'
}
},
axisTick: {
lineStyle: {
color: '#ccc'
}
}
}, {
type: 'value',
gridIndex: 1,
axisLabel: {
show: false
},
axisLine: {
show: false
},
splitLine: {
show: false
},
axisTick: {
show: false
}
}],
series: series
};
companyChart.setOption(option)
});
}
// 按资源类型统计
function loadResTypeReport() {
var conditions = form.val('form-repair-condition');
Object.assign(conditions, {access_token: accessToken, createtime: createTime, viewMode: '',dateLimit:dateLimit,groupBy: 'resTypeName'});
admin.req({
url: domainName + '/api-web/bResource/getAssetsRepairForGroup',
data: conditions
}).done(function (response) {
var chartData = response.map;
var groupList = chartData.groupList;
var countList = chartData.countList;
var xData = [];
var groupData = [];
$.each(groupList, function (i, v) {
xData.push(v);
groupData.push({
name: v,
value: 1
});
});
var series = [{
name: '维修数',
data: countList,
barWidth: 20,
type: 'bar',
label: {
show: true,
position: 'top',
textStyle: {
color: '#555'
},
formatter:function (data) {
return countList[data.dataIndex]
}
},
itemStyle: {
normal: {
color: (params) => {
var colors = ['#b6c2ff', '#96edc1', '#fcb75b'];
return colors[params.dataIndex % 3]
}
}
},
xAxisIndex: 0,
yAxisIndex: 0
}];
/**
双X轴标签对应,伪实现思路:
底部的标签也是柱状图,对应包含的区域为上方X轴条数占总数的比例,设为宽度即可
*/
var option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: [{
top: 20,
bottom: 70,
right: 5
}, {
height: 30,
bottom: 30,
right: 5
}],
xAxis: [{
type: 'category',
data: xData,
gridIndex: 0,
axisLabel: {
color: '#333',
show: true,
interval:0,
rotate:25
},
axisLine: {
lineStyle: {
color: '#e7e7e7'
}
},
axisTick: {
lineStyle: {
color: '#e7e7e7'
}
},
zlevel: 2
}, {
type: 'category',
gridIndex: 1,
axisLine: {
show: false
},
zlevel: 1
}],
yAxis: [{
type: 'value',
gridIndex: 0,
axisLabel: {
color: '#333'
},
splitLine: {
lineStyle: {
type: 'dashed'
}
},
axisLine: {
lineStyle: {
color: '#ccc'
}
},
axisTick: {
lineStyle: {
color: '#ccc'
}
}
}, {
type: 'value',
gridIndex: 1,
axisLabel: {
show: false
},
axisLine: {
show: false
},
splitLine: {
show: false
},
axisTick: {
show: false
}
}],
series: series
};
resTypeChart.setOption(option)
});
}
// 图表,表格重新加载
function reloadAllChange() {
loadWorkReportTable();
loadCompanyReport();
loadResTypeReport();
}
});
});
\ No newline at end of file
... ...
... ... @@ -2569,6 +2569,19 @@ layui.define(['soulTable', 'commonDetail', 'common', 'laytpl', 'view', 'admin',
{field: 'resTypeName', title: '资源类型', minWidth: x_110, align: 'center'},
{field: 'state', title: '资源状态', minWidth: x_110, align: 'center', sort: true, templet: '#resStateTpl'}
],
"ARMS":[
{
field: 'resName', title: '资源名称', minWidth: x_300, sort: true,
templet: '#resindex_resName'
},
{field: 'health', title: '健康状态', minWidth: x_110, align: 'center', sort: true, templet: '#healthTpl'},
{field: 'lastColTime', title: '最近采集时间', minWidth: x_160, align: 'center', sort: true},
{field: 'linkState', title: '连接状态', align: 'center', minWidth: x_110, templet: '#linkStateTpl', sort: true},
{field: 'adminName', title: '负责人', minWidth: x_120, align: 'center', sort: true},
{field: 'adminPhone', title: '负责人电话', minWidth: x_130, align: 'center', sort: true},
{field: 'resTypeName', title: '资源类型', minWidth: x_110, align: 'center'},
{field: 'state', title: '资源状态', minWidth: x_110, align: 'center', sort: true, templet: '#resStateTpl'}
],
},
//列点击事件
colsClickEvent: function (editFlag) {
... ...
... ... @@ -284,9 +284,11 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
success: function (layero, index) {
restoreVersionRender(dirctiveId,index);
},
yes: function () {
layer.closeAll();
//update xwx 2021-11-4 设置任务管理-指令模板数量-指令模板-绑定指令-历史版本页面关闭时关闭当前页面
yes: function (index) {
layer.close(index);
}
//update xwx 2021-11-4 设置任务管理-指令模板数量-指令模板-绑定指令-历史版本页面关闭时关闭当前页面
});
})
}
... ...
//工作汇报
layui.define(['table', 'form', 'admin', 'layer', 'common', 'sessions'], function (exports) {
var $ = layui.$;
var form = layui.form;
var layer = layui.layer;
var admin = layui.admin;
var table = layui.table;
var common = layui.common;
var session = layui.sessions
var domainName = common.domainName;
//对外暴露的接口
exports("repairlist", function (d) {
var accessToken = session.getToken()['access_token']
if (d.type == 'attachment') {
$('#attachmentTable').show()
createAttachmentTable()
}
//渲染附件表格
function createAttachmentTable() {
var attachmentTable = table.render({
elem: '#attachmentTable',
url: domainName + '/api-web/bResource/assetsrepair/getAttaById',
where: {
access_token: accessToken,
id: d.id
},
height: 'full',
page: {
layout: ['count', 'prev', 'page', 'next', 'limit', 'skip']
, theme: '#1E9FFF'//自定义分页主题颜色
},
end: function (e) {
form.render()
},
limit: common.limit,
limits: common.limits,
even: true,
cols: [[
{type: 'numbers', title: '序号'},
{
field: 'name', title: '文件名称', align: 'center', minWith: 200,
}, {
field: 'originalName', title: '原始名称', align: 'center', minWith: 200,
}, {
field: 'suffix', title: '文件后缀', align: 'center', minWith: 150,
},
{
field: 'size', title: '文件大小', align: 'center', minWith: 150,
templet: function (d) {
var str = (d.size / 1000).toFixed(2)
return `<div><span>${str}KB</span></div>`
}
},
{
title: '操作', align: "center", width: 120,
templet: '<div><span data-id="{{d.id}}" data-suffix="{{d.suffix}}" class="layui-table-link preview-attachment-btn">预览</span>' +
'<span data-id="{{d.id}}" data-suffix="{{d.suffix}}" class="layui-table-link attachment-download-btn" style="margin-left: 10px">下载</span></div>'
}
]],
done: function () {
$('.preview-attachment-btn').on('click', function () {
var id = $(this).data('id')
var suffix = $(this).data('suffix')
if (suffix == 'jpg' || suffix == 'png' || suffix == 'JPG' || suffix == 'PNG') { //图片类型
var srcUrl = domainName + `/api-web/openoffice/readImage/${id}?access_token=` + accessToken
layer.open({
type: 1,
content: `<div><img src="${srcUrl}" width="100%" height="100%" /></div>`,
title: '图片预览',
area: ['60%', '90%']
})
} else {
//附件为文档类型
common.openReport(id)
}
})
$('.attachment-download-btn').on('click',function () {
var id = $(this).data('id')
var suffix = $(this).data('suffix')
var url = domainName + `/api-web/openoffice/download/${id}?access_token=` + accessToken
window.open(url)
})
}
})
}
})
})
\ No newline at end of file
... ...
... ... @@ -515,7 +515,7 @@ layui.define(['table', 'form', 'laydate', 'common', 'sessions', 'laydate', 'admi
var $that = $(this)
var resId = $(this).data("id");
var protocol = $(this).data("protocol");
layer.confirm('确认要修改该资源的密?', {
layer.confirm('确认要修改该资源的密?', {
title: '警告',
icon: 0,
btn: ['确定', '取消']
... ...
... ... @@ -133,7 +133,7 @@ layui.define(['table', 'form', 'laydate', 'admin', 'layer', 'laytpl', 'common',
$(".pwd-btn").on("click", function () {
var resId = $(this).data("id");
var protocol = $(this).data("protocol");
layer.confirm('确认要修改该资源的密?', {
layer.confirm('确认要修改该资源的密?', {
title: '警告',
icon: 0,
btn: ['确定', '取消']
... ...
... ... @@ -4400,7 +4400,8 @@ grayColor{
.index-top .index-banner .index-banner-main .index-banner-item .index-banner-item-tips {
height: 20px;
width: 16px;
/*首页告警展示数量调整*/
width: 20px;
line-height: 20px;
top: -6px;
left: 96.5%;
... ...
<!--工作汇报表单-->
<article>
<div class="layui-card-body">
<fieldset class="layui-elem-field layui-field-title">
<legend>维修信息</legend>
</fieldset>
<form class="layui-form layui-form-pane" lay-filter="add-repair-form"
id="add-repair-form" onsubmit="return false;">
<input hidden name="id" id="id" lay-verify="checkReportIsExist">
<div class="layui-form-item">
<div class="layui-inline inline-half">
<label class="layui-form-label">设备类型</label>
<div class="layui-input-inline">
<select name="resType" id="slt-repairadd-res"
lay-filter="slt-repairadd-res">
<option value="">=设备类型=</option>
</select>
</div>
</div>
<div class="layui-inline inline-half">
<label class="layui-form-label">设备序列号</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="resourceSN" id="resourceSN">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline inline-half">
<label class="layui-form-label">故障时间</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="hitchtime" id="hitchtime">
</div>
</div>
<div class="layui-inline inline-half">
<label class="layui-form-label">维修时间</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="createtime" id="createtime">
</div>
</div>
</div>
<div class="layui-form-item hide" id="form-item-repTitle">
<div class="layui-inline inline-half">
<label class="layui-form-label">标题</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="title">
</div>
</div>
<div class="layui-inline inline-half">
<label class="layui-form-label">汇报人</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="createBy" id= "createUser" readonly="readonly">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline inline-half">
<label class="layui-form-label">归属单位</label>
<div class="layui-input-inline">
<select name="orgId" id="slt-repairadd-org"
lay-filter="slt-repairadd-org">
<option value="">=归属单位=</option>
</select>
</div>
</div>
<div class="layui-inline inline-half">
<label class="layui-form-label">选择厂商</label>
<div class="layui-input-inline">
<select name="manufacturerId" id="slt-repairadd-group"
lay-filter="slt-repairadd-group" >
<option value="">=选择厂商=</option>
</select>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline inline-half">
<label class="layui-form-label">受影响系统</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="affected" id="affected">
</div>
</div>
<div class="layui-inline inline-half">
<label class="layui-form-label">所属ip</label>
<div class="layui-input-inline">
<input type="text" class="layui-input" name="ip" id="ip">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline" style="width: 90%">
<label class="layui-form-label">选择附件</label>
<div class="layui-input-block attachment">
<input type="text" class="layui-input" readonly id="attachmentInput">
</div>
</div>
<div class="layui-inline">
<button class="layui-btn layui-btn-normal" id="attachment">附件</button>
<button id="upload_btn" hidden>附件</button>
</div>
</div>
<div class="layui-form-item" style="display: none" id="add-repair-form-atta">
<label class="layui-form-label">已存附件</label>
<div class="layui-input-inline"
style="width: 90% !important;max-height: 130px;overflow-y: auto;margin-left: 10px;">
<div class="tags" id="selecte_content_id"></div>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label textarea-label">故障现象描述</label>
<div class="layui-input-block">
<textarea class="layui-textarea" name="phenomenon"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label textarea-label">解决过程描述</label>
<div class="layui-input-block">
<textarea class="layui-textarea" name="solveprocess"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label textarea-label">处理结果</label>
<div class="layui-input-block">
<textarea class="layui-textarea" name="result"></textarea>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label textarea-label">经验总结</label>
<div class="layui-input-block">
<textarea class="layui-textarea" name="experience"></textarea>
</div>
</div>
<button type="submit" lay-submit lay-filter="repair-form-save-id" class="layui-btn hide"
id="repair-form-save-id">保存
</button>
<table id="table-repair-add-attachment" class="hide"></table>
</form>
</div>
</article>
<script>
layui.use('assetsRepairAdd', function (fn) {
fn({{d}})
})
</script>
<style>
#add-repair-form .layui-form-label {
width: 120px;
/* padding: 8px 12px; */
text-align: left !important;
}
#add-repair-form .layui-input-block{
margin-left: 120px !important;
}
.tags{
margin-top:5px;
}
.tags span {
height: 20px;
margin-right: 10px;
margin-bottom: 3px;
padding: 5px 10px 5px 10px;
float: left;
white-space: nowrap;
color:#fff;
background-color:#009688;
text-shadow: 1px 1px 1px rgba(0, 0, 0, .15);
}
.tags .close {
font-weight: bold;
line-height: 20px;
margin-left:10px;
cursor: pointer;
text-align: center;
color: #fff;
border: 0 none;
background: transparent none repeat scroll 0 0;
}
</style>
... ...
<title>资产维修记录</title>
<article class="page-container">
<div class="page-panel ">
<div class="main">
<div class="layui-card">
<div class="layui-card-header">
<div class="layui-status">
<form class="layui-form layui-card-header" onsubmit="return false"
lay-filter="form-repair-condition">
<div class="layui-form-item">
<div class="layui-inline">
<div class="layui-input-inline layui-input-inline--long">
<input type="text" id="monitor_keyword" name="title"
placeholder="标题搜索,支持内容模糊匹配" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<select name="orgId" id="slt-repair-org"
lay-filter="slt-repair-org" lay-search>
<option value="">=归属单位=</option>
</select>
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<select name="manufacturerId" id="slt-repair-group"
lay-filter="slt-repair-group" lay-search>
<option value="">=选择厂商=</option>
</select>
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline ">
<div id="hardware-layui-select" class="xm-select"></div>
</div>
</div>
<div class="layui-inline">
<div class="layui-input-inline">
<select name="createBy" id="slt-repair-user"
lay-filter="slt-repair-user" lay-search>
<option value="">=选择汇报人=</option>
</select>
</div>
</div>
<div class="layui-btn-group time-group" id="btns-repair-time" style="padding: 0">
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs date"
data-period="today">今天
</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs date"
data-period="lastWeek">上周
</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs active date"
data-period="thisWeek">本周
</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs date"
data-period="lastMonth">上月
</button>
<button type="button" class="layui-btn layui-btn-primary layui-btn-xs date"
data-period="thisMonth">本月
</button>
</div>
<div class="layui-inline" style="margin-left: 10px">
<div class="layui-input-inline" style="width: auto">
<input type="text" name="dateLimit" id="dateLimit" autocomplete="off"
class="layui-input" readonly placeholder="其他日期范围">
</div>
</div>
</div>
</form>
</div>
</div>
<div style="display: flex" class="layui-card-echart">
<div style="flex-grow: 3;width: 45%!important;">
<h5 class="lay-row-title">按单位统计</h5>
<div class="pie-chart" id="chart-company-report" style="min-height: 240px"></div>
</div>
<div style="flex-grow: 3;width: 45%!important;">
<h5 class="lay-row-title">按资产类型统计</h5>
<div class="pie-chart" id="chart-restype-report" style="min-height: 240px"></div>
</div>
</div>
<div class="layui-card-body" style="margin-top: 10px;">
<div class="warn-btns">
<button class="layui-btn layui-btn-sm layui-btn-normal active" data-type="" id="repair_create">
新增
</button>
</div>
<table id="table-repair-view" lay-filter="table-repair-view"></table>
</div>
</div>
</div>
</div>
</article>
<script>
layui.use('assetsrepair', function (fn) {
fn();
});
</script>
\ No newline at end of file
... ...
<article class="page-container">
<div class="page-panel">
<div class="main">
<div class="layui-card">
<div class="layui-card-header">
</div>
<div class="layui-card-body">
<table id="attachmentTable" lay-filter="attachmentTable"></table>
</div>
</div>
</div>
</div>
</article>
<script>
layui.use('repairlist', function (fn) {
fn({{d}})
});
</script>
\ No newline at end of file
... ...
... ... @@ -27,7 +27,7 @@
<!-- </div>-->
<!-- </div>-->
<div class="layui-inline ">
<label class="layui-form-label">所在部门<span style="color: red">*</span></label>
<label class="layui-form-label">所在部门<span style="color: red">*</span></label>
<div class="layui-input-inline">
<div id="userorgId"></div>
</div>
... ...
... ... @@ -60,18 +60,14 @@
}
return false;
}
//joke add 20210506 获取密码级别
function getPwdLevel(){
admin.req({
url: common.domainName +'/api-web/sysConf/getConfByCode?code=pwd_level'
, type: "get"
, async: false
, done: function (data) {
if (data && data.object && data.success === true && data.object.ddicDesc){
var pattern = data.object.ddicDesc.split(' ')[0];
var patternTips = data.object.ddicDesc.split(' ')[1];
var last5His = passwords;
// 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) {
... ... @@ -83,11 +79,12 @@
if (value === $('#oldPassword').val()){
return '新密码不能与旧密码一致';
}
if(!new RegExp(pattern).test(value)){
if(pattern && !new RegExp(pattern).test(value)){
return patternTips;
}
//临时增加用户组写死密码 joke add 20210508
if (checkHas(last5His,value)){
if (last5His && last5His.length > 0 && checkHas(last5His,value)){
return '不能使用最近5次密码';
}
... ... @@ -175,10 +172,27 @@
});
});
}
//joke add 20210506 获取密码级别
function getPwdLevel(){
admin.req({
url: common.domainName +'/api-web/sysConf/getConfByCode?code=pwd_level'
, type: "get"
, async: false
, done: function (data) {
if (data && data.object && data.success === true && data.object.ddicDesc){
var pattern = data.object.ddicDesc.split(' ')[0];
var patternTips = data.object.ddicDesc.split(' ')[1];
var last5His = passwords;
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 () {
... ...
... ... @@ -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",
... ...
... ... @@ -101,7 +101,7 @@
</el-link>
<br/>
<el-link type="info" :underline="false" @click="reNameFile(file,false)" >
<span v-if="!reNameFileFlg[file.id]">{{file.fileName}}</span>
<div v-if="!reNameFileFlg[file.id]" style="width: 120px;overflow: hidden;text-overflow: ellipsis;text-align: left;">{{file.fileName}}</div>
<el-input :autofocus="true" v-if="reNameFileFlg[file.id]" placeholder="输入文件名" v-model="file.fileName" @blur="reNameFile(file,true)"></el-input>
</el-link>
</div>
... ...
... ... @@ -150,7 +150,7 @@ export default {
getPage(id);
} else {
proxy.$global.viewer(item.localPath);
proxy.$global.viewer(item.localPath,proxy);
}
}
... ... @@ -373,6 +373,7 @@ export default {
params.pid = currentNodeData.value.id;
if(isUserFolder.value){
params.id="";
params.docNo="user";
params.type="user";
}
... ... @@ -555,6 +556,10 @@ export default {
if(type == 'folder'){
url = `/inspection-report/file/rename/user`;
}
if(item.fileName == null || item.fileName == '' ){
proxy.$global.showMsg("文件名称不能为空!","warning");
return;
}
// 执行改名
proxy.$http.get(url, {id:item.id,name:item.fileName}, function (res) {
if (res && res.success) {
... ...
... ... @@ -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 {}
... ...
... ... @@ -34,6 +34,7 @@
:before-upload="beforeUpload"
:multiple="false"
:http-request="getInsetFile"
:on-change="fileChange"
:auto-upload="true">
<el-button size="small" type="primary">上传照片</el-button>
</el-upload>
... ...
... ... @@ -120,6 +120,7 @@ export default {
category:props.category,
docNo:props.docNo
}
debugger
// 上传文件
proxy.$http.uploadFile("/inspection-report/file/upload", params, function (res) {
if (res && res.code == 0) {
... ... @@ -131,6 +132,11 @@ export default {
})
}
let fileChange = (file, fileList) =>{
debugger
console.log(file, fileList);
}
// 上传按钮点击
let uploadFile = () => {
proxy.$refs.upload.submit()
... ... @@ -167,7 +173,8 @@ export default {
show,
uploadFile,
hidedialog,
beforeUpload
beforeUpload,
fileChange
}
}
}
... ...
... ... @@ -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)',
});
... ... @@ -123,8 +123,14 @@ global.getQueryVariable = (variable) => {
* 文件预览
* @param path
*/
global.viewer = (path) =>{
window.open("/src/lib/extend/pdfjs/web/viewer.html?test=" + encodeURIComponent(path));
global.viewer = (path,proxy) =>{
proxy.$http.get(`/api-web/openoffice/convertPdf/?path=${encodeURIComponent(path)}`, {}, function (res) {
if (res && res.success) {
window.open("/src/lib/extend/pdfjs/web/viewer.html?test=" + encodeURIComponent(res.str));
} else {
global.showMsg(data.msg,"error")
}
})
}
/**
... ...
layui.define(['commonDetail','common', 'admin'], function (exports) {
var $ = layui.$;
var commonDetail = layui.commonDetail;
var common = layui.common;
var admin = layui.admin;
//对外暴露的接口
exports('arms', function (data) {
var resId = '';
var resType = '';
var os = '';
var domainName = common.domainName;
var showFlag = common.getUrlParam("show");
if(showFlag && showFlag == '0'){
resId = common.getUrlParam("resId");
resType = common.getUrlParam("resType");
os = common.getUrlParam("os");
}else{
resId = data.resId;
resType = data.resType;
os = data.os;
}
//基本信息
var jbxxKpi = "KPIE13DD9A3,KPIF74D9D2B";
commonDetail.bindTips();
renderPageInfo()
//渲染页面
function renderPageInfo() {
//资源状态
commonDetail.renderResHealth("arms_health_state", resId);
//基本信息
commonDetail.renderText("arms_baseinfo", resId, jbxxKpi, null, null, null, "true");
//GC瞬时次数/每分钟
dataRenderingBase("arms_frequency_lineChart", resId, "KPIB30309CF,KPI6AFFCBDB", "GC瞬时次数/每分钟", null);
// //GC瞬时耗时/每分钟
dataRenderingBase("arms_elapsed_lineChart", resId, "KPI5769F327,KPI8B2CCCCF", "GC瞬时耗时/每分钟", null);
// //堆内存详情/每分钟
dataRenderingBase("arms_JVM_memory_lineChart", resId, "KPI5C214A8F,KPI14BD24A7,KPI206706E5", "堆内存详情/每分钟", null);
// //非堆内存/每分钟
dataRenderingBase("arms_NOJVN_memory_lineChart", resId, "KPIA751DDD7,KPIB0C32458,KPIBEA62DAA,KPID346BB6F", "非堆内存/每分钟", null);
// //直接缓冲区/每分钟
dataRenderingBase("arms_cacheRegion_lineChart", resId, "KPIBAD64951,KPIA80D93D8", "直接缓冲区/每分钟", null);
// //JVM线程数/每分钟
dataRenderingBase("arms_JVM_threadCount_lineChart", resId, "KPI7C4BEB26,KPI97B71BAA,KPI15EC2627,KPIA9E2E4DE,KPI068D9FA5,KPI6ECA9036,KPI328E5AFE,KPI8F8FAD7F", "JVM线程数/每分钟", null, 1);
//活动告警
commonDetail.renderActiveAlarms("arms_active_alram", resId);
}
//折线图数据渲染及页面设置
function dataRenderingBase(id, resId, kpiId, title, flag) {
var dataList = {};
var item = {};
var other = {};
item.legend = {};
item.x = {};
item.y = {};
//获取数据
admin.req({
url: domainName + '/api-web/details/getBase',
data: {
resId: resId,
kpiIds: kpiId,
}
}).done(function (response) {
if (response.success && !response.msg) {//有数据
dataList.legend = response.map.legend;
dataList.x = response.map.x;
if (response.map.y != null && response.map.y.length === 1) {
dataList.y = response.map.y;
} else {
var series=[];
$.each(response.map.y, function (i, v) {
var lineIndex = Math.ceil(Math.random() * 6);
var item = {
name:dataList.legend[i],
stack:'Total',
type: 'line',
emphasis: {
focus: 'series'
},
itemStyle: {
normal: {
color: common.colorsArr[i%6].start
}
},
data: v,
};
series.push(item);
});
other["series"]=series;
}
initLinChart(id, resId, kpiId, title, flag, dataList, other);
} else {//无数据
//初始化数据
}
});
//页面渲染
return {item, other}
}
//初始化折线图
function initLinChart(id, resId, kpiId, title, flag, data, other) {
//初始化echarts
var myChart = echarts.init(document.getElementById(id));
//初始化配置option
var option;
option = {
legend: {//设置图表图例
data: data.legend,
},
tooltip: {
trigger: 'axis',
},
toolbox: {
feature: {
saveAsImage: {}
}
},
xAxis: {//X轴数据
type: 'category',
boundaryGap: false,
data: data.x,
},
yAxis: {//设置提示
type: 'value'
},
grid: { //直角坐标系内绘图网格
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
series: [//y轴数据
{
data: data.y?data.y:{},
type: 'line',
smooth: true
}
]
};
//获取传入option对象
var keys = Object.keys(other);
//替换option属性
keys.forEach(item => {
option[item]=other[item];
});
option && myChart.setOption(option);
}
//定时任务
var timer = setInterval(function () {
renderPageInfo()
},commonDetail.timerTime);
commonDetail.detailTimer.push(timer);
});
});
\ No newline at end of file
... ...
<!--arms详细页面-->
<article class="page-container template">
<div class="page-panel">
<div class="main">
<div class="layui-card template_detail_content">
<div class="layui-card-body">
<div class="lay-row">
<div class="lay-row-item">
<h5 class="lay-row-title">资源状态</h5>
<div class="res-state" id="arms_health_state"></div>
</div>
<div class="lay-row-item">
<h5 class="lay-row-title">堆内存详情/每分钟</h5>
<div id="arms_JVM_memory_lineChart" class="detail_line_chart"></div>
</div>
<div class="lay-row-item">
<h5 class="lay-row-title">JVM线程数/每分钟</h5>
<div id="arms_JVM_threadCount_lineChart" class="detail_line_chart"></div>
</div>
</div>
<div class="lay-row">
<div class="lay-row-item">
<h5 class="lay-row-title">GC瞬时次数/每分钟</h5>
<div id="arms_frequency_lineChart" class="detail_line_chart"></div>
</div>
<div class="lay-row-item">
<h5 class="lay-row-title">GC瞬时耗时/每分钟</h5>
<div id="arms_elapsed_lineChart" class="detail_line_chart"></div>
</div>
<div class="lay-row-item">
<h5 class="lay-row-title">非堆内存/每分钟</h5>
<div id="arms_NOJVN_memory_lineChart" class="detail_line_chart"></div>
</div>
<div class="lay-row-item">
<h5 class="lay-row-title">直接缓冲区/每分钟</h5>
<div id="arms_cacheRegion_lineChart" class="detail_line_chart"></div>
</div>
</div>
<div class="lay-row">
<div class="lay-row-item">
<h5 class="lay-row-title">实时告警动态</h5>
<div id="arms_active_alram"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</article>
<textarea id="arms_param_id" style="display: none;">{{d}}</textarea>
<script>
layui.use('arms', function (fn) {
var $ = layui.$;
var parm = $("#arms_param_id").val();
if(parm.indexOf('{{d') != -1){
fn();
}else{
fn(JSON.parse(parm));
}
});
</script>
\ No newline at end of file
... ...
/* 属性配置 -- 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>
<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" disabled style='width: 190px;'></el-input>
<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-form-item label="学历" prop="education" class="form-class">
<el-input v-model="ruleForm.education" style='width: 190px;'></el-input>
</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-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" disabled style='width: 190px;'></el-input>
<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" style='width: 190px;'></el-input>
<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
disabled
:readonly="isAdmin()"
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
:readonly="isAdmin()"
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-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;">
<el-button type="primary" size="small" @click="saveUser">保存</el-button>
<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>
<!-- <el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>Create</el-button
>
<el-button @click="resetForm('ruleForm')">Reset</el-button>
</el-form-item> -->
</div>
</div>
</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,
... ... @@ -48,11 +233,12 @@ 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"
... ...