first commit

This commit is contained in:
2025-06-25 10:53:11 +08:00
commit 9f374011ae
1240 changed files with 181139 additions and 0 deletions
+726
View File
@@ -0,0 +1,726 @@
{extend name="../../base/view/common/base" /} {block name="body"}
<div class="card-content">
<div class="layui-row layui-col-space12">
<div class="layui-col-md8">
<div class="layui-row layui-col-space12">
<div class="layui-col-md12">
<div class="layui-card">
<dl class="home-desc p-4" style="line-height: 70px;">
<dt>
<img src="{$params.thumb}" onerror="javascript:this.src='{__IMG__}/icon.png';this.onerror=null;" />
</dt>
<dd class="h5">
Hi
{$params.name},您的ID号是:{$params.uid},欢迎使用<strong>{:get_system_config('web','admin_title')}</strong>,是您工作中必不可少的伙伴!
</dd>
</dl>
</div>
<div class="layui-card">
<div class="table-title">最新企业公告</div>
<div style="padding: 8px 12px 12px">
<table class="layui-table">
<colgroup>
<col width="80" />
<col width="90" />
<col />
<col width="136" />
</colgroup>
<thead>
<tr>
<th style="text-align: center">编号ID</th>
<th style="text-align: center">公告分类</th>
<th style="text-align: center">公告标题</th>
<th style="text-align: center">发布时间</th>
</tr>
</thead>
<tbody class="layui-table-body">
{empty name="note_list"}
<tr>
<td colspan="4">
<div class="layui-none">无数据</div>
</td>
</tr>
{/empty} {volist name="note_list" id="vo"}
<tr>
<td align="center">N{$vo.id}</td>
<td align="center">{$vo.cate_title}</td>
<td>
<a class="open-a" data-href="/home/index/note_detail/id/{$vo.id}">{$vo.title}</a>
</td>
<td align="center">{$vo.create_time}</td>
</tr>
{/volist}
</tbody>
</table>
</div>
</div>
<div class="layui-card">
<div class="table-title">我参与的项目</div>
<div style="padding: 8px 12px 12px">
<table class="layui-table">
<colgroup>
<col width="80" />
<col width="70" />
<col width="80" />
<col />
<col width="80" />
<col width="60" />
<col width="180" />
</colgroup>
<thead>
<tr>
<th style="text-align: center">编号ID</th>
<th style="text-align: center">状态</th>
<th style="text-align: center">项目类型</th>
<th style="text-align: center">项目主题</th>
<th style="text-align: center">负责人</th>
<th style="text-align: center">任务</th>
<th style="text-align: center">计划工期</th>
</tr>
</thead>
<tbody class="layui-table-body">
{empty name="$project.list"}
<tr>
<td colspan="6">
<div class="layui-none">无数据</div>
</td>
</tr>
{/empty} {volist name="$project.list" id="vo"}
<tr>
<td align="center">M{$vo.id}</td>
<td align="center">
<span class="layui-badge bg-status-{$vo.status}">{$vo.status_name}</span>
</td>
<td align="center">
<span class="layui-xmlx bg-cate-{$vo.project_type}" style="color: white;">
{if condition="$vo.project_type eq 1"}内部项目
{elseif condition="$vo.project_type eq 2"}外部项目
{elseif condition="$vo.project_type eq 3"}申报项目
{/if}
</span>
</td>
<td>
<a class="link-a" data-href="/project/index/view/id/{$vo.id}">{$vo.name}</a>
</td>
<td align="center">{$vo.director_name}</td>
<td align="center">{$vo.tasks}</td>
<td align="center">{$vo.plan_time}</td>
</tr>
{/volist}
</tbody>
</table>
</div>
</div>
<div class="layui-card">
<div class="table-title">我参与的任务</div>
<div style="padding: 8px 12px 12px">
<table class="layui-table">
<colgroup>
<col width="80" />
<col width="150" />
<col />
<col width="80" />
<col width="80" />
<col width="70" />
<col width="80" />
<col width="110" />
</colgroup>
<thead>
<tr>
<th style="text-align: center">编号ID</th>
<th style="text-align: center">所属项目</th>
<th style="text-align: center">任务主题</th>
<th style="text-align: center">类型</th>
<th style="text-align: center">紧急程度</th>
<th style="text-align: center">状态</th>
<th style="text-align: center">预估工时</th>
<th style="text-align: center">计划完成日期</th>
</tr>
</thead>
<tbody class="layui-table-body">
{empty name="$task.list"}
<tr>
<td colspan="6">
<div class="layui-none">无数据</div>
</td>
</tr>
{/empty} {volist name="$task.list" id="vo"}
<tr>
<td align="center">T{$vo.id}</td>
<td align="center">
<a class="link-a" data-href="/project/index/view/id/{$vo.project_id}">{$vo.belong_project}</a>
</td>
<td>
<a class="open-a" data-href="/task/index/view/id/{$vo.id}">{$vo.title}</a>
</td>
<td align="center">{$vo.type_name}</td>
<td align="center">
<span class="layui-badge bg-priority-{$vo.priority}">{$vo.priority_name}</span>
</td>
<td align="center">
<span class="layui-badge bg-flow-{$vo.flow_status}">{$vo.flow_name}</span>
</td>
<td align="center">{$vo.plan_hours}</td>
<td align="center">{$vo.end_time}</td>
</tr>
{/volist}
</tbody>
</table>
</div>
</div>
<div class="layui-card">
<div class="table-title">最新知识文档</div>
<div style="padding: 8px 12px 12px">
<table class="layui-table">
<colgroup>
<col width="80" />
<col width="90" />
<col />
<col width="60" />
<col width="80" />
<col width="136" />
</colgroup>
<thead>
<tr>
<th style="text-align: center">编号ID</th>
<th style="text-align: center">所属分类</th>
<th style="text-align: center">知识主题</th>
<th style="text-align: center">阅览数</th>
<th style="text-align: center">创建员工</th>
<th style="text-align: center">创建时间</th>
</tr>
</thead>
<tbody class="layui-table-body">
{empty name="knowledge_list"}
<tr>
<td colspan="5">
<div class="layui-none">无数据</div>
</td>
</tr>
{/empty} {volist name="knowledge_list" id="vo"}
<tr>
<td align="center">K{$vo.id}</td>
<td align="center">{$vo.cate_name}</td>
<td>
<a class="link-a" data-href="/knowledge/index/doc_detail/kid/{$vo.id}">{$vo.title}</a>
</td>
<td align="center">{$vo.views}</td>
<td align="center">{$vo.admin_name}</td>
<td align="center">{$vo.create_time}</td>
</tr>
{/volist}
</tbody>
</table>
</div>
</div>
<div class="layui-card">
<div id="chartView" style="width: 100%; height: 300px"></div>
</div>
<div class="layui-card">
<div id="chartYear" style="width: 100%; height: 240px"></div>
</div>
</div>
</div>
</div>
<div class="layui-col-md4">
<div class="layui-card dashboard-num">
<table>
<tbody>
<tr>
<td>
<div class="num-title">项目</div>
<div class="num-num">{$count.projects}</div>
</td>
<td>
<div class="num-title">产品</div>
<div class="num-num">{$count.product}</div>
</td>
<td>
<div class="num-title">任务</div>
<div class="num-num">{$count.tasks}</div>
</td>
<td>
<div class="num-title">知识库</div>
<div class="num-num">{$count.knowledges}</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="layui-card">
<div class="table-title">系统信息</div>
<div class="layui-card-body">
<table class="layui-table" lay-skin="" lay-size="sm">
{if condition="($install == true)"}
<tr>
<td colspan="4" style="color: #e94335; background-color: #fafafa">
提醒:发现app目录下的install文件夹没删除,为了系统的安全,请手动去删除。
</td>
</tr>
{/if}
<tr>
<td class="info-td">服务器系统</td>
<td>{:get_system_info('os')}</td>
<td class="info-td">PHP版本</td>
<td>{:get_system_info('php')}</td>
</tr>
<tr>
<td class="info-td">上传附件限制</td>
<td>{:get_system_info('upload_max_filesize')}</td>
<td class="info-td">执行时间限制</td>
<td>{:get_system_info('max_execution_time')}</td>
</tr>
<tr>
<td class="info-td">ThinkPHP版本</td>
<td>{$TP_VERSION}</td>
<td class="info-td">系统版本</td>
<td>{:SYS_VERSION}</td>
</tr>
</table>
</div>
</div>
<div class="layui-card dashboard-total">
<div class="table-title mb-3">我的工作情况</div>
<div class="layui-card dashboard-num">
<table>
<tbody>
<tr>
<td>
<div class="num-title">参与项目</div>
<div class="num-num">{$project.count}</div>
</td>
<td>
<div class="num-title">已完成</div>
<div class="num-num">{$project.count_ok}</div>
</td>
<td>
<div class="num-title">未完成</div>
<div class="num-num">{$project.count_no}</div>
</td>
<td>
<div class="num-title">完成率</div>
<div class="num-num">{$project.count_lv}%</div>
<div class="badge">
<span class="layui-bg-blue">影响力</span>
</div>
</td>
</tr>
<tr>
<td>
<div class="num-title">参与任务</div>
<div class="num-num">{$task.count}</div>
</td>
<td>
<div class="num-title">已完成</div>
<div class="num-num">{$task.count_ok}</div>
</td>
<td>
<div class="num-title">未完成</div>
<div class="num-num">{$task.count_no}</div>
</td>
<td>
<div class="num-title">完成率</div>
<div class="num-num">{$task.count_lv}%</div>
<div class="badge">
<span class="layui-bg-blue">拼效率</span>
</div>
</td>
</tr>
<tr>
<td>
<div class="num-title">工作记录</div>
<div class="num-num">{$work.count}</div>
</td>
<td>
<div class="num-title">总工时</div>
<div class="num-num">{$work.hours}</div>
</td>
<td>
<div class="num-title">任务延期</div>
<div class="num-num">{$task.delay}</div>
</td>
<td>
<div class="num-title">延期率</div>
<div class="num-num">{$task.delay_lv}%</div>
<div class="badge">
<span class="layui-bg-blue">勤奋度</span>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="layui-card">
<div class="table-title">
最活跃员工<span style="
color: #999;
font-size: 14px;
font-weight: 400;
margin-left: 5px;
">最近30天前十的活跃度</span>
</div>
<div class="layui-card-body">
<div id="logChart" style="width: 100%; height: 268px"></div>
</div>
</div>
<div class="layui-card">
<div class="table-title">员工最新动态</div>
<div class="layui-card-body dashboard-logs">
<ul class="layui-timeline" id="logs"></ul>
</div>
</div>
</div>
</div>
{/block}
<!-- 脚本 -->
{block name="script"}
<script src="https://cdn.staticfile.org/echarts/5.3.0/echarts.min.js"></script>
<script>
const moduleInit = [
"tool",
"gouguEdit",
"gouguComment",
"gouguSchedule",
"employeepicker",
];
function gouguInit() {
get_logs();
get_view_data();
}
function setHour(num) {
var str = num + ":00";
if (num < 10) {
str = "0" + num + ":00";
}
return str;
}
var archiveCalendar = {};
function getRange() {
let today = new Date();
let tYear = today.getFullYear();
let tMonth = today.getMonth() + 1;
let tDate = today.getDate();
let dateFirst = tYear + "-" + tMonth + "-" + tDate;
let datelast = tYear - 1 + "-" + tMonth + "-" + tDate;
let dataRange = [];
dataRange.push(dateFirst);
dataRange.push(datelast);
return dataRange;
}
function getDay() {
var today = new Date();
var dayArray = [];
for (var i = 0; i < 366; i++) {
var targetday_milliseconds = today.getTime() - 1000 * 60 * 60 * 24 * i;
var date = new Date(targetday_milliseconds);
dayArray.push(retunDay(date));
}
return dayArray;
}
function retunDay(day) {
var tYear = day.getFullYear();
var tMonth = day.getMonth();
var tDate = day.getDate();
tMonth = tMonth + 1;
if (tMonth.toString().length == 1) {
tMonth = "0" + tMonth;
}
if (tDate.toString().length == 1) {
tDate = "0" + tDate;
}
var dateStr = tYear + "-" + tMonth + "-" + tDate;
var dateArray = [];
dateArray.push(dateStr);
if (archiveCalendar[dateStr]) {
dateArray.push(archiveCalendar[dateStr]);
} else {
dateArray.push(0);
}
return dateArray;
}
var chartView = echarts.init(document.getElementById("chartView"));
var chartYear = echarts.init(document.getElementById("chartYear"));
var logChart = echarts.init(document.getElementById("logChart"));
function get_view_data() {
$.ajax({
url: "/home/index/get_view_data",
type: "get",
data: {},
success: function (e) {
if (e.code == 0) {
var data_first = e.data.data_first;
var data_second = e.data.data_second;
archiveCalendar = e.data.data_three;
var data_logs = e.data.data_logs;
var myDate = new Date();
var nowHour = myDate.getHours(); //获取当前小时数(0-23)
var xData = [];
var yData1 = [];
var yData2 = [];
var logItem = [];
$.each(data_first, function (key, value) {
if (key <= nowHour) {
yData1.push(value);
}
});
$.each(data_second, function (key, value) {
xData.push(setHour(key));
yData2.push(value);
});
$.each(data_logs, function (key, value) {
let item = {
value: value.count,
name: value.name,
};
logItem.push(item);
});
let opsA = {
title: {
top: "12px",
text: "今日与昨日员工活跃度",
left: "8px",
textStyle: {
fontSize: "18",
color: "#333",
},
},
color: ["#1AAD19", "#1890FF"],
grid: {
left: "16px",
right: "30px",
bottom: "12px",
top: "60px",
containLabel: true,
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
crossStyle: {
color: "#999",
},
},
},
toolbox: {
show: true,
},
legend: {
data: ["今日", "昨日"],
top: "16px",
},
xAxis: [
{
type: "category",
boundaryGap: !1,
data: xData,
axisLine: {
lineStyle: {
color: "#999999",
width: 1,
},
},
},
],
yAxis: [
{
type: "value",
axisLine: {
show: true,
lineStyle: {
color: "#999999",
width: 1,
},
},
},
],
series: [
{
name: "今日",
type: "line",
smooth: !0,
itemStyle: {
normal: {
areaStyle: {
type: "default",
opacity: 0.2,
},
},
},
data: yData1,
},
{
name: "昨日",
type: "line",
smooth: !0,
itemStyle: {
normal: {
areaStyle: {
type: "default",
opacity: 0.2,
},
},
},
data: yData2,
},
],
};
chartView.setOption(opsA);
let opsB = {
title: {
top: "12px",
text: "近一年员工活跃度",
left: "8px",
textStyle: {
fontSize: "18",
color: "#333",
},
},
tooltip: {
padding: 6,
formatter: function (obj) {
var value = obj.value;
return (
'<div style="font-size: 12px;">' +
value[0] +
"员工活跃度:" +
value[1] +
"</div>"
);
},
},
visualMap: {
min: 0,
max: 300,
show: false,
inRange: {
color: ["#fafafa", "#1AAD19"],
},
},
calendar: {
top: 72,
left: 52,
right: 20,
range: getRange(),
cellSize: ["auto", 21],
splitLine: {
lineStyle: {
color: "#aaa",
type: "dashed",
},
},
itemStyle: {
borderWidth: 0.5,
},
yearLabel: { show: false },
monthLabel: {
nameMap: "cn",
fontSize: 12,
},
dayLabel: {
show: true,
formatter: "{start} 1st",
fontWeight: "lighter",
nameMap: [
"周日",
"周一",
"周二",
"周三",
"周四",
"周五",
"周六",
],
fontSize: 12,
},
},
series: [
{
type: "heatmap",
coordinateSystem: "calendar",
calendarIndex: 0,
data: getDay(),
},
],
};
chartYear.setOption(opsB);
let optC = {
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} :{d}%",
},
legend: {
top: "1%",
left: "center",
},
series: [
{
name: "活跃度",
type: "pie",
radius: "50%",
center: ["50%", "60%"],
data: logItem,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
},
],
};
logChart.setOption(optC);
}
},
});
}
window.onresize = function () {
chartView.resize();
chartYear.resize();
logChart.resize();
};
//获取工作记录
function get_logs() {
$.ajax({
url: "/home/index/log_list",
type: "get",
data: {
page: 1,
limit: 15,
},
success: function (e) {
if (e.code == 0) {
var html = "";
$.each(e.data, function (key, value) {
html += `<li class="layui-timeline-item">
<i class="layui-icon layui-timeline-axis"></i>
<div class="layui-timeline-content layui-text">
<div class="layui-timeline-title"><span title="${value.id}">${value.times}</span>${value.content}</div>
</div>
</li>`;
});
$("#logs").html(html);
}
},
});
}
</script>
<!-- /脚本 -->
{/block}
</div>
+60
View File
@@ -0,0 +1,60 @@
{extend name="../../base/view/common/base" /}
{block name="style"}
<style type="text/css">
.latest-news{padding-top: 12px; padding-bottom:30px; padding-left: 20px; position: relative;}
.latest-news .layui-timeline-title{padding-bottom:0; font-size: 14px;}
.latest-news .layui-timeline-item{padding-bottom:5px;}
.layui-timeline-title span{color:#999}
.panel-more{width: 100%; height:48px; line-height: 48px; text-align: center; position: absolute; bottom: 0; left:0;}
.panel-more a{color:#0088FF}
</style>
{/block}
<!-- 主体 -->
{block name="body"}
<div class="body-content" style="padding: 20px;">
<div class="h3-title">员工动态</div>
<div class="latest-news">
<ul class="layui-timeline" id="logs"></ul>
<div class="panel-more"><a href="javascript:getLogs();">查看更多动态</a></div>
</div>
</div>
{/block}
<!-- /主体 -->
<!-- 脚本 -->
{block name="script"}
<script>
var page=1,limit=20;
function getLogs() {
$.ajax({
url: "/api/index/log_list",
type: 'get',
data: {
page:page,
limit: limit
},
success: function(e) {
if (e.code == 0) {
var html = '';
if(e.data.length>0){
page++;
$.each(e.data, function(key, value) {
html += '<li class="layui-timeline-item">\
<i class="layui-icon layui-timeline-axis"></i>\
<div class="layui-timeline-content layui-text">\
<div class="layui-timeline-title"><span title="'+value.id+'">'+value.times+'</span>'+value.content+'</div>\
</div>\
</li>';
});
$('#logs').append(html);
}else{
$('.panel-more').remove();
}
}
}
})
}
getLogs();
</script>
{/block}
<!-- /脚本 -->
+36
View File
@@ -0,0 +1,36 @@
<style>
.text-detial-ops{line-height: 30px; color:#999; font-size: 12px; padding: 12px 0;}
.text-detial-ops span{margin-right: 20px;}
.text-detial-ops a{margin-right:10px;}
.text-detial-content{padding: 8px 0; color:#333; word-break: break-all; border-top:1px solid #e8e8e8;font-size: 16px!important; line-height: 1.72!important;}
.text-detial-content p{padding: 8px 0;}
.text-detial-content img{max-width:98%!important; margin:0 auto; display:block; border: 1px solid #e6e6e6; -webkit-box-shadow: 0 2px 6px rgba(26,26,26,.08); box-shadow: 0 2px 6px rgba(26,26,26,.08); border-radius: 4px;}
.text-detial-content h1,.text-detial-content h2,.text-detial-content h3,.text-detial-content h4,.text-detial-content h5{margin-top:10px;}
.text-detial-content a{color:#186AF2; font-style:italic;}
.text-detial-content a:hover{text-decoration:underline;}
.text-detial-content p code,.blog-detial-content pre{margin:0 3px;font-size: 14px; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; background: #f6f6f6; padding: 10px; border-radius: 2px;}
.text-detial-content p code{border: 1px solid #eee;padding: 2px 4px;}
.text-detial-content table {border-collapse: collapse; border-spacing: 0; display: block; width: 100%; overflow: auto; word-break: normal;word-break: keep-all; margin-top: 0;margin-bottom: 16px;}
.text-detial-content table tr {background-color: #fff;border-top: 1px solid #ccc;}
.text-detial-content table tr:nth-child(2n) {background-color: #f8f8f8;}
.text-detial-content table td, .blog-detial-content table th { padding: 6px 12px;border: 1px solid #ddd; font-size:14px; }
.text-detial-content table th {font-weight: 800;}
.text-detial-content li {list-style: initial;margin-left: 20px;}
:not(pre)>code[class*=language-], pre[class*=language-]{background:#fff!important;border:1px solid #e8e8e8!important; border-radius:3px;}
</style>
<div class="page-content p-4">
<h1>{$note.title}</h1>
<div class="text-detial-ops">
<span>{$note.admin_name}发表于:{$note.create_time | date='Y-m-d H:i'}</span>
<span>公告分类:
{volist name=":set_recursion(get_note_cate())" id="v"}
{eq name="$note.cate_id" value="$v.id" }{$v.title}{/eq}
{/volist}</span>
<span>展示期间:{$note.start_time | date='Y-m-d'} - {$note.end_time | date='Y-m-d'}</span>
<span>阅览:{$note.read}</span>
</div>
<div class="text-detial-content">
{$note.content|raw}
</div>
</div>