新增:安全技术数据
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
@@ -2541,6 +2541,7 @@
|
||||
<Content Include="PZHGL\ProjectData\ProjectPageDataSave.aspx" />
|
||||
<Content Include="ReportPrint\PrintDesigner.aspx" />
|
||||
<Content Include="Doc\help.doc" />
|
||||
<Content Include="HSSE\PDFDOC\PdfBookView.aspx" />
|
||||
<Content Include="AttachFile\fileupload.ashx" />
|
||||
<Content Include="AttachFile\lib\README.md" />
|
||||
<Content Include="res\assets\css\index.css" />
|
||||
@@ -16114,6 +16115,13 @@
|
||||
<Compile Include="JDGL\CostAnalysis\EarnedValueCurve.aspx.designer.cs">
|
||||
<DependentUpon>EarnedValueCurve.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="HSSE\PDFDOC\PdfBookView.aspx.cs">
|
||||
<DependentUpon>PdfBookView.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
</Compile>
|
||||
<Compile Include="HSSE\PDFDOC\PdfBookView.aspx.designer.cs">
|
||||
<DependentUpon>PdfBookView.aspx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="JDGL\CostAnalysis\PlanAdjust.aspx.cs">
|
||||
<DependentUpon>PlanAdjust.aspx</DependentUpon>
|
||||
<SubType>ASPXCodeBehind</SubType>
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PdfBookView.aspx.cs" Inherits="FineUIPro.Web.HSSE.PDFDOC.PdfBookView" ValidateRequest="false" %>
|
||||
|
||||
<!DOCTYPE html>
|
||||
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head runat="server">
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>PDF 书籍阅读</title>
|
||||
<link href="../../res/css/common.css" rel="stylesheet" type="text/css" />
|
||||
<style type="text/css">
|
||||
/* ============ PdfBookView 页面局部样式(pdfb- 前缀,仅本页生效) ============ */
|
||||
|
||||
/* 本页为全幅框架布局,去掉 common.css 的 body 15px 内边距 */
|
||||
body.f-body { padding: 0; }
|
||||
|
||||
/* ---- 顶部标题栏 ---- */
|
||||
.pdfb-topbar .f-panel-body { background: transparent !important; }
|
||||
.pdfb-hero {
|
||||
display: flex; align-items: center; height: 100%; box-sizing: border-box;
|
||||
padding: 0 20px 0 18px;
|
||||
background: linear-gradient(115deg, #143d59 0%, #1f5f8b 55%, #2e86ab 100%);
|
||||
box-shadow: inset 0 -1px 0 rgba(255,255,255,.12), 0 2px 6px rgba(16, 42, 67, .35);
|
||||
}
|
||||
.pdfb-hero-mark {
|
||||
flex: none; width: 38px; height: 38px; margin-right: 12px;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.25);
|
||||
border-radius: 9px;
|
||||
}
|
||||
.pdfb-hero-mark svg { width: 22px; height: 22px; fill: #ffffff; display: block; }
|
||||
.pdfb-hero-text { flex: 1 1 auto; min-width: 0; }
|
||||
.pdfb-hero-title {
|
||||
font-size: 17px; font-weight: 600; color: #ffffff; letter-spacing: 1px;
|
||||
text-shadow: 0 1px 2px rgba(0,0,0,.25);
|
||||
}
|
||||
.pdfb-hero-sub { margin-top: 3px; font-size: 12px; color: rgba(255,255,255,.78); letter-spacing: .5px; }
|
||||
.pdfb-hero-tip {
|
||||
flex: none; margin-left: 16px; padding: 5px 12px;
|
||||
font-size: 12px; color: #d8ecf8;
|
||||
border: 1px dashed rgba(255,255,255,.35); border-radius: 12px;
|
||||
background: rgba(255,255,255,.07);
|
||||
}
|
||||
|
||||
/* ---- 左栏目录 ---- */
|
||||
.pdfb-left .f-panel-header .f-panel-title-text { font-weight: 600; }
|
||||
.pdfb-tree .f-tree-bodyct { padding: 3px 0 8px 0; }
|
||||
|
||||
/* ---- 中部内容区:纯白画布,编辑器与下方留白同色 ---- */
|
||||
.pdfb-center { background: #ffffff; }
|
||||
.pdfb-center .f-panel-body,
|
||||
.pdfb-center .f-field-htmleditor-wrap { background: #ffffff !important; }
|
||||
.pdfb-status { color: #6b7f93; font-size: 12px; }
|
||||
|
||||
/* 主操作按钮(保存内容)强调色 */
|
||||
a.pdfb-btn-primary, .pdfb-btn-primary {
|
||||
background: linear-gradient(#33739c, #22557a) !important;
|
||||
border: 1px solid #1b4562 !important;
|
||||
}
|
||||
.pdfb-btn-primary .f-btn-text { color: #ffffff !important; }
|
||||
.pdfb-btn-primary:hover { background: linear-gradient(#3c82b0, #28618c) !important; }
|
||||
.pdfb-btn-primary .f-btn-icon { color: #ffffff !important; }
|
||||
|
||||
/* 树节点行高与悬停(若类名匹配则生效,不匹配自动忽略) */
|
||||
.pdfb-tree .f-tree-row td { padding-top: 3px; padding-bottom: 3px; }
|
||||
.pdfb-tree .f-tree-row:hover > td { background: #e3f1fa !important; }
|
||||
|
||||
/* ---- 弹窗 ---- */
|
||||
.pdfb-window .f-panel-body { padding-top: 6px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<form id="form1" runat="server">
|
||||
<f:PageManager ID="PageManager1" AutoSizePanelID="Panel1" runat="server" />
|
||||
<f:HiddenField ID="hfCurrentChapterId" runat="server"></f:HiddenField>
|
||||
<f:HiddenField ID="hfEditChapterId" runat="server"></f:HiddenField>
|
||||
<f:Panel ID="Panel1" runat="server" ShowBorder="false" ShowHeader="false" Layout="Region">
|
||||
<Items>
|
||||
<%-- 左栏:书籍选择 + 目录树 --%>
|
||||
<f:Panel runat="server" ID="panelLeftRegion" RegionPosition="Left" RegionSplit="true"
|
||||
EnableCollapse="true" Width="300" Title="书籍目录" TitleToolTip="书籍目录(多级章节)"
|
||||
IconFont="Book" CssClass="pdfb-left"
|
||||
ShowBorder="true" ShowHeader="true" AutoScroll="true" BodyPadding="0px">
|
||||
<Toolbars>
|
||||
<f:Toolbar ID="Toolbar1" Position="Top" runat="server" ToolbarAlign="Left">
|
||||
<Items>
|
||||
<f:DropDownList ID="drpBook" runat="server" Label="书籍" LabelWidth="60px" Width="200px"
|
||||
EnableEdit="false" AutoPostBack="true" OnSelectedIndexChanged="drpBook_SelectedIndexChanged">
|
||||
</f:DropDownList>
|
||||
<f:Button ID="btnAddBook" runat="server" Text="新增" IconFont="PlusCircle" ToolTip="手动新增一本书籍"
|
||||
OnClick="btnAddBook_Click">
|
||||
</f:Button>
|
||||
</Items>
|
||||
</f:Toolbar>
|
||||
<f:Toolbar ID="Toolbar3" Position="Top" runat="server" ToolbarAlign="Left">
|
||||
<Items>
|
||||
<f:Button ID="btnAddChapter" runat="server" Text="新增章节" IconFont="PlusCircle"
|
||||
ToolTip="在选中节点下新增章节(未选中则为顶级)" OnClick="btnAddChapter_Click">
|
||||
</f:Button>
|
||||
<f:Button ID="btnEditChapter" runat="server" Text="编辑" IconFont="Pencil"
|
||||
ToolTip="修改选中章节名称" OnClick="btnEditChapter_Click">
|
||||
</f:Button>
|
||||
<f:Button ID="btnDelChapter" runat="server" Text="删除" IconFont="TrashO"
|
||||
ToolTip="删除选中章节及其子章节" ConfirmText="将删除选中章节及其全部子章节,确定删除?"
|
||||
ConfirmTarget="Top" OnClick="btnDelChapter_Click">
|
||||
</f:Button>
|
||||
</Items>
|
||||
</f:Toolbar>
|
||||
</Toolbars>
|
||||
<Items>
|
||||
<f:Tree ID="trCatalog" EnableCollapse="true" ShowHeader="false" EnableIcons="true"
|
||||
AutoLeafIdentification="true" OnNodeCommand="trCatalog_NodeCommand" runat="server"
|
||||
CssClass="pdfb-tree">
|
||||
</f:Tree>
|
||||
</Items>
|
||||
</f:Panel>
|
||||
<%-- 中部:章节内容编辑 --%>
|
||||
<f:Panel runat="server" ID="panelCenterRegion" RegionPosition="Center" ShowBorder="false"
|
||||
Layout="Fit" ShowHeader="false" CssClass="pdfb-center" BodyPadding="10px" AutoScroll="true">
|
||||
<Toolbars>
|
||||
<f:Toolbar ID="Toolbar2" Position="Top" runat="server" ToolbarAlign="Left">
|
||||
<Items>
|
||||
<f:Button ID="btnSaveContent" runat="server" Text="保存内容" IconFont="Save" CssClass="pdfb-btn-primary"
|
||||
ToolTip="保存当前章节的富文本内容(文字+图片)" OnClick="btnSaveContent_Click">
|
||||
</f:Button>
|
||||
<f:ToolbarFill ID="ToolbarFill2" runat="server"></f:ToolbarFill>
|
||||
<f:Label ID="lblProgress" runat="server" Text="" CssClass="pdfb-status">
|
||||
</f:Label>
|
||||
</Items>
|
||||
</f:Toolbar>
|
||||
</Toolbars>
|
||||
<Items>
|
||||
<f:HtmlEditor ID="htmlContent" runat="server" ShowLabel="false" Editor="UMEditor"
|
||||
BasePath="~/res/umeditor/" ToolbarSet="Full" LabelAlign="Right" Height="780">
|
||||
</f:HtmlEditor>
|
||||
</Items>
|
||||
</f:Panel>
|
||||
</Items>
|
||||
</f:Panel>
|
||||
<f:Window ID="WindowBook" Title="新增书籍" Icon="BookAdd" Hidden="true" IsModal="true" EnableMaximize="false"
|
||||
Target="Parent" Width="440px" Height="190px" CssClass="pdfb-window" runat="server">
|
||||
<Items>
|
||||
<f:Form ID="formBook" ShowBorder="false" ShowHeader="false" AutoScroll="true" BodyPadding="10px"
|
||||
LabelAlign="Right" runat="server">
|
||||
<Rows>
|
||||
<f:FormRow>
|
||||
<Items>
|
||||
<f:TextBox ID="txtBookTitle" runat="server" Label="书名" Width="340px" MaxLength="200"
|
||||
EmptyText="请输入书名" ShowRedStar="true" Required="true">
|
||||
</f:TextBox>
|
||||
</Items>
|
||||
</f:FormRow>
|
||||
</Rows>
|
||||
<Toolbars>
|
||||
<f:Toolbar ID="ToolbarBook" Position="Bottom" ToolbarAlign="Right" runat="server">
|
||||
<Items>
|
||||
<f:ToolbarFill runat="server"></f:ToolbarFill>
|
||||
<f:Button ID="btnSaveBook" Icon="SystemSave" Text="保存" runat="server" ValidateForms="formBook"
|
||||
OnClick="btnSaveBook_Click">
|
||||
</f:Button>
|
||||
<f:Button ID="btnCloseBook" Icon="SystemClose" Text="关闭" runat="server" OnClick="btnCloseBook_Click">
|
||||
</f:Button>
|
||||
</Items>
|
||||
</f:Toolbar>
|
||||
</Toolbars>
|
||||
</f:Form>
|
||||
</Items>
|
||||
</f:Window>
|
||||
<f:Window ID="WindowChapter" Title="新增章节" Icon="Bookmark" Hidden="true" IsModal="true" EnableMaximize="false"
|
||||
Target="Parent" Width="440px" Height="210px" CssClass="pdfb-window" runat="server">
|
||||
<Items>
|
||||
<f:Form ID="formChapter" ShowBorder="false" ShowHeader="false" AutoScroll="true" BodyPadding="10px"
|
||||
LabelAlign="Right" runat="server">
|
||||
<Rows>
|
||||
<f:FormRow>
|
||||
<Items>
|
||||
<f:TextBox ID="txtChapterTitle" runat="server" Label="章节名称" Width="340px" MaxLength="200"
|
||||
EmptyText="请输入章节名称" ShowRedStar="true" Required="true">
|
||||
</f:TextBox>
|
||||
</Items>
|
||||
</f:FormRow>
|
||||
<f:FormRow>
|
||||
<Items>
|
||||
<f:Label ID="lblParentChapter" runat="server" Label="位置" Text="顶级章节">
|
||||
</f:Label>
|
||||
</Items>
|
||||
</f:FormRow>
|
||||
</Rows>
|
||||
<Toolbars>
|
||||
<f:Toolbar ID="ToolbarChapter" Position="Bottom" ToolbarAlign="Right" runat="server">
|
||||
<Items>
|
||||
<f:ToolbarFill runat="server"></f:ToolbarFill>
|
||||
<f:Button ID="btnSaveChapter" Icon="SystemSave" Text="保存" runat="server" ValidateForms="formChapter"
|
||||
OnClick="btnSaveChapter_Click">
|
||||
</f:Button>
|
||||
<f:Button ID="btnCloseChapter" Icon="SystemClose" Text="关闭" runat="server" OnClick="btnCloseChapter_Click">
|
||||
</f:Button>
|
||||
</Items>
|
||||
</f:Toolbar>
|
||||
</Toolbars>
|
||||
</f:Form>
|
||||
</Items>
|
||||
</f:Window>
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,431 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using BLL;
|
||||
|
||||
namespace FineUIPro.Web.HSSE.PDFDOC
|
||||
{
|
||||
/// <summary>
|
||||
/// PDF 书籍维护页:左侧多级目录树 + 右侧富文本内容编辑(UMEditor,可输入文字、上传图片)。
|
||||
/// 章节与内容全部手动录入维护:新增书籍 / 新增·编辑·删除章节 / 保存章节富文本内容。
|
||||
/// 数据存 Sys_PdfBook / Sys_PdfChapter(内容为 HTML;上传图片在保存时转为 base64 内嵌,正文自包含)。
|
||||
/// </summary>
|
||||
public partial class PdfBookView : PageBase
|
||||
{
|
||||
#region 页面加载
|
||||
/// <summary>
|
||||
/// 页面加载。
|
||||
/// </summary>
|
||||
protected void Page_Load(object sender, EventArgs e)
|
||||
{
|
||||
// 显式指定 UTF-8 编码,避免个别环境下中文乱码
|
||||
this.Response.ContentEncoding = System.Text.Encoding.UTF8;
|
||||
this.Response.Charset = "utf-8";
|
||||
|
||||
if (!IsPostBack)
|
||||
{
|
||||
BindBooks();
|
||||
if (this.drpBook.Items.Count > 0)
|
||||
{
|
||||
this.drpBook.SelectedIndex = 0;
|
||||
InitTree(this.drpBook.SelectedValue);
|
||||
}
|
||||
this.lblProgress.Text = "";
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 绑定书籍
|
||||
/// <summary>
|
||||
/// 绑定书籍下拉框。
|
||||
/// </summary>
|
||||
private void BindBooks()
|
||||
{
|
||||
this.drpBook.Items.Clear();
|
||||
foreach (PdfBook book in PdfBookService.GetBooks())
|
||||
{
|
||||
this.drpBook.Items.Add(new FineUIPro.ListItem(book.Title, book.BookId));
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 目录树
|
||||
/// <summary>
|
||||
/// 初始化目录树(按父章节/层级递归建树,支持多级目录)。
|
||||
/// </summary>
|
||||
private void InitTree(string bookId)
|
||||
{
|
||||
this.trCatalog.Nodes.Clear();
|
||||
this.trCatalog.SelectedNodeID = "";
|
||||
var chapters = PdfBookService.GetChapters(bookId);
|
||||
|
||||
// 1) 先为每个章节创建节点
|
||||
var nodeMap = new Dictionary<string, FineUIPro.TreeNode>();
|
||||
foreach (PdfChapter c in chapters)
|
||||
{
|
||||
var node = new FineUIPro.TreeNode
|
||||
{
|
||||
Text = c.Title,
|
||||
NodeID = c.ChapterId,
|
||||
CommandName = "chapter",
|
||||
CommandArgument = c.ChapterId,
|
||||
ToolTip = c.PageStart > 0 ? ("第" + c.PageStart + " - " + c.PageEnd + " 页") : "",
|
||||
EnableClickEvent = true,
|
||||
Expanded = true // 页面默认全部展开
|
||||
};
|
||||
nodeMap[c.ChapterId] = node;
|
||||
}
|
||||
|
||||
// 2) 按父章节挂接,没有父级(或父级不在列表)的作为顶级
|
||||
var roots = new List<FineUIPro.TreeNode>();
|
||||
foreach (PdfChapter c in chapters)
|
||||
{
|
||||
var node = nodeMap[c.ChapterId];
|
||||
if (!string.IsNullOrWhiteSpace(c.ParentChapterId) && nodeMap.ContainsKey(c.ParentChapterId))
|
||||
{
|
||||
nodeMap[c.ParentChapterId].Nodes.Add(node);
|
||||
}
|
||||
else
|
||||
{
|
||||
roots.Add(node);
|
||||
}
|
||||
}
|
||||
|
||||
// 3) 顶级节点加入树
|
||||
foreach (var r in roots)
|
||||
this.trCatalog.Nodes.Add(r);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 下拉切换
|
||||
/// <summary>
|
||||
/// 切换书籍。
|
||||
/// </summary>
|
||||
protected void drpBook_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
InitTree(this.drpBook.SelectedValue);
|
||||
this.htmlContent.Text = "";
|
||||
this.hfCurrentChapterId.Text = "";
|
||||
this.lblProgress.Text = "";
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 目录点击 → 加载章节内容
|
||||
/// <summary>
|
||||
/// 点击目录节点,把章节富文本内容加载到编辑器。
|
||||
/// 所有章节(含带子章节的目录章节)均可编辑自身正文,点击即加载。
|
||||
/// </summary>
|
||||
protected void trCatalog_NodeCommand(object sender, FineUIPro.TreeCommandEventArgs e)
|
||||
{
|
||||
if (e.Node == null)
|
||||
return;
|
||||
|
||||
string chapterId = e.Node.CommandArgument;
|
||||
if (string.IsNullOrWhiteSpace(chapterId))
|
||||
chapterId = e.Node.NodeID;
|
||||
|
||||
PdfChapterDetail detail = PdfBookService.GetChapterContent(chapterId);
|
||||
this.htmlContent.Text = detail == null ? "" : (detail.Content ?? "");
|
||||
this.hfCurrentChapterId.Text = chapterId;
|
||||
this.trCatalog.SelectedNodeID = e.Node.NodeID;
|
||||
this.lblProgress.Text = "正在编辑:" + (detail == null ? e.Node.Text : detail.Title);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 保存章节内容(富文本)
|
||||
/// <summary>
|
||||
/// 保存当前章节的富文本内容(HTML;本站上传图片引用自动转为 base64 内嵌存储)。
|
||||
/// </summary>
|
||||
protected void btnSaveContent_Click(object sender, EventArgs e)
|
||||
{
|
||||
string chapterId = this.hfCurrentChapterId.Text;
|
||||
if (string.IsNullOrWhiteSpace(chapterId))
|
||||
{
|
||||
FineUIPro.Alert.Show("请先在左侧目录选择章节。");
|
||||
return;
|
||||
}
|
||||
|
||||
// 本地上传图片转 base64 后入库,正文自包含(不依赖 upload 目录文件)
|
||||
string html = EmbedLocalImagesAsBase64(this.htmlContent.Text);
|
||||
|
||||
SQLHelper.ExecutSql("UPDATE dbo.Sys_PdfChapter SET Text=N'" + SqlEsc(html)
|
||||
+ "' WHERE ChapterId='" + SqlEsc(chapterId) + "'");
|
||||
this.lblProgress.Text = "内容已保存:" + DateTime.Now.ToString("HH:mm:ss");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 把 HTML 中指向本站 UMeditor 上传相关路径(/res/umeditor/net/..,含 ../../../upload 形态)的图片引用替换为 base64 内嵌。
|
||||
/// 已是 data: 的图片与外部 http(s) 图片原样保留;路径非图片扩展名或文件不存在时不做替换(回退原引用)。
|
||||
/// </summary>
|
||||
private static readonly Regex LocalUploadImgSrcRegex = new Regex(
|
||||
"src\\s*=\\s*([\"'])([^\"']*?/res/umeditor/net/[^\"']*?)\\1",
|
||||
RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
||||
|
||||
private string EmbedLocalImagesAsBase64(string html)
|
||||
{
|
||||
if (string.IsNullOrEmpty(html) ||
|
||||
html.IndexOf("/res/umeditor/net/", StringComparison.OrdinalIgnoreCase) < 0)
|
||||
return html;
|
||||
|
||||
return LocalUploadImgSrcRegex.Replace(html, delegate(Match m)
|
||||
{
|
||||
string quote = m.Groups[1].Value;
|
||||
string raw = m.Groups[2].Value;
|
||||
int i = raw.IndexOf("/res/umeditor/net/", StringComparison.OrdinalIgnoreCase);
|
||||
if (i < 0)
|
||||
return m.Value;
|
||||
string virtualPath = raw.Substring(i);
|
||||
int q = virtualPath.IndexOf('?');
|
||||
if (q >= 0) virtualPath = virtualPath.Substring(0, q);
|
||||
|
||||
string extCheck = System.IO.Path.GetExtension(virtualPath).ToLowerInvariant();
|
||||
if (extCheck != ".png" && extCheck != ".jpg" && extCheck != ".jpeg" && extCheck != ".gif" && extCheck != ".bmp")
|
||||
return m.Value;
|
||||
|
||||
try
|
||||
{
|
||||
string physical = Server.MapPath(virtualPath);
|
||||
if (!System.IO.File.Exists(physical))
|
||||
return m.Value;
|
||||
byte[] bytes = System.IO.File.ReadAllBytes(physical);
|
||||
if (bytes.Length == 0)
|
||||
return m.Value;
|
||||
|
||||
string ext = System.IO.Path.GetExtension(physical).ToLowerInvariant();
|
||||
string mime = ext == ".png" ? "image/png"
|
||||
: ext == ".gif" ? "image/gif"
|
||||
: ext == ".bmp" ? "image/bmp"
|
||||
: "image/jpeg";
|
||||
return "src=" + quote + "data:" + mime + ";base64," + Convert.ToBase64String(bytes) + quote;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return m.Value;
|
||||
}
|
||||
});
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 书籍新增
|
||||
/// <summary>
|
||||
/// 打开新增书籍弹窗。
|
||||
/// </summary>
|
||||
protected void btnAddBook_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.txtBookTitle.Text = "";
|
||||
this.WindowBook.Hidden = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存新增书籍。
|
||||
/// </summary>
|
||||
protected void btnSaveBook_Click(object sender, EventArgs e)
|
||||
{
|
||||
string title = this.txtBookTitle.Text.Trim();
|
||||
if (title.Length == 0)
|
||||
{
|
||||
FineUIPro.Alert.Show("请输入书名。");
|
||||
return;
|
||||
}
|
||||
|
||||
string bookId = NewId("PB");
|
||||
SQLHelper.ExecutSql(
|
||||
"INSERT INTO dbo.Sys_PdfBook (BookId, Title, FilePath, TotalPages, IndexStatus, CreateUser, CreateTime) VALUES ('"
|
||||
+ SqlEsc(bookId) + "',N'" + SqlEsc(title) + "',NULL,0,2,N'test',GETDATE())");
|
||||
|
||||
this.WindowBook.Hidden = true;
|
||||
BindBooks();
|
||||
this.drpBook.SelectedValue = bookId;
|
||||
InitTree(bookId);
|
||||
this.htmlContent.Text = "";
|
||||
this.hfCurrentChapterId.Text = "";
|
||||
this.lblProgress.Text = "已新增书籍:《" + title + "》,请继续添加章节。";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 关闭新增书籍弹窗。
|
||||
/// </summary>
|
||||
protected void btnCloseBook_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.WindowBook.Hidden = true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 章节新增/编辑/删除
|
||||
/// <summary>
|
||||
/// 打开新增章节弹窗(父级=目录树选中节点,未选中则为顶级章节)。
|
||||
/// </summary>
|
||||
protected void btnAddChapter_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (string.IsNullOrEmpty(this.drpBook.SelectedValue))
|
||||
{
|
||||
FineUIPro.Alert.Show("请先新增/选择书籍。");
|
||||
return;
|
||||
}
|
||||
|
||||
this.hfEditChapterId.Text = "";
|
||||
this.txtChapterTitle.Text = "";
|
||||
string parentId = this.trCatalog.SelectedNodeID;
|
||||
this.lblParentChapter.Text = string.IsNullOrEmpty(parentId) ? "顶级章节" : "选中节点的子章节";
|
||||
this.WindowChapter.Title = "新增章节";
|
||||
this.WindowChapter.Hidden = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 打开编辑章节弹窗(修改选中章节名称)。
|
||||
/// </summary>
|
||||
protected void btnEditChapter_Click(object sender, EventArgs e)
|
||||
{
|
||||
string chapterId = this.trCatalog.SelectedNodeID;
|
||||
if (string.IsNullOrEmpty(chapterId))
|
||||
{
|
||||
FineUIPro.Alert.Show("请先在目录中选择要编辑的章节。");
|
||||
return;
|
||||
}
|
||||
|
||||
DataTable dt = SQLHelper.GetDataTableRunText(
|
||||
"SELECT ChapterTitle FROM dbo.Sys_PdfChapter WHERE ChapterId=@id",
|
||||
new[] { new SqlParameter("@id", chapterId) });
|
||||
if (dt == null || dt.Rows.Count == 0)
|
||||
{
|
||||
FineUIPro.Alert.Show("未找到该章节。");
|
||||
return;
|
||||
}
|
||||
|
||||
this.hfEditChapterId.Text = chapterId;
|
||||
this.txtChapterTitle.Text = dt.Rows[0]["ChapterTitle"].ToString();
|
||||
this.lblParentChapter.Text = "修改章节名称";
|
||||
this.WindowChapter.Title = "编辑章节";
|
||||
this.WindowChapter.Hidden = false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存章节(新增:挂在选中节点下,层级=父级+1;编辑:仅改名)。
|
||||
/// 保存后保持选中刚保存的章节:叶子章节加载其内容,目录章节仅刷新选中、不动编辑器。
|
||||
/// </summary>
|
||||
protected void btnSaveChapter_Click(object sender, EventArgs e)
|
||||
{
|
||||
string title = this.txtChapterTitle.Text.Trim();
|
||||
if (title.Length == 0)
|
||||
{
|
||||
FineUIPro.Alert.Show("请输入章节名称。");
|
||||
return;
|
||||
}
|
||||
|
||||
string bookId = this.drpBook.SelectedValue;
|
||||
string affectedId;
|
||||
|
||||
if (this.hfEditChapterId.Text != "")
|
||||
{
|
||||
// 编辑:仅改名称
|
||||
affectedId = this.hfEditChapterId.Text;
|
||||
SQLHelper.ExecutSql("UPDATE dbo.Sys_PdfChapter SET ChapterTitle=N'" + SqlEsc(title)
|
||||
+ "' WHERE ChapterId='" + SqlEsc(affectedId) + "'");
|
||||
}
|
||||
else
|
||||
{
|
||||
// 新增:父级为目录树选中节点
|
||||
string parentId = this.trCatalog.SelectedNodeID;
|
||||
int level = 1;
|
||||
if (!string.IsNullOrEmpty(parentId))
|
||||
{
|
||||
int parentLevel = SQLHelper.GetIntValue(
|
||||
"SELECT ISNULL([Level],1) FROM dbo.Sys_PdfChapter WHERE ChapterId='" + SqlEsc(parentId) + "'");
|
||||
level = parentLevel + 1;
|
||||
}
|
||||
int sort = SQLHelper.GetIntValue(
|
||||
"SELECT ISNULL(MAX(SortNo),0) FROM dbo.Sys_PdfChapter WHERE BookId='" + SqlEsc(bookId) + "'") + 1;
|
||||
affectedId = NewId("CH");
|
||||
|
||||
SQLHelper.ExecutSql(
|
||||
"INSERT INTO dbo.Sys_PdfChapter (ChapterId, BookId, ParentChapterId, [Level], ChapterTitle, PageStart, PageEnd, Text, SortNo) VALUES ('"
|
||||
+ SqlEsc(affectedId) + "','" + SqlEsc(bookId) + "',"
|
||||
+ (string.IsNullOrEmpty(parentId) ? "NULL" : "'" + SqlEsc(parentId) + "'")
|
||||
+ "," + level + ",N'" + SqlEsc(title) + "',NULL,NULL,N''," + sort + ")");
|
||||
}
|
||||
|
||||
this.WindowChapter.Hidden = true;
|
||||
InitTree(bookId);
|
||||
|
||||
// 保持选中刚保存的章节并加载其正文(目录章节同样可编辑正文)
|
||||
this.trCatalog.SelectedNodeID = affectedId;
|
||||
PdfChapterDetail detail = PdfBookService.GetChapterContent(affectedId);
|
||||
this.htmlContent.Text = detail == null ? "" : (detail.Content ?? "");
|
||||
this.hfCurrentChapterId.Text = affectedId;
|
||||
this.lblProgress.Text = "章节已保存,正在编辑:" + (detail == null ? title : detail.Title);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除选中章节及其全部子章节。
|
||||
/// </summary>
|
||||
protected void btnDelChapter_Click(object sender, EventArgs e)
|
||||
{
|
||||
string chapterId = this.trCatalog.SelectedNodeID;
|
||||
if (string.IsNullOrEmpty(chapterId))
|
||||
{
|
||||
FineUIPro.Alert.Show("请先在目录中选择要删除的章节。");
|
||||
return;
|
||||
}
|
||||
|
||||
string bookId = this.drpBook.SelectedValue;
|
||||
var all = PdfBookService.GetChapters(bookId);
|
||||
|
||||
// 递归收集要删除的章节(自身+全部后代)
|
||||
var ids = new List<string> { chapterId };
|
||||
bool changed = true;
|
||||
while (changed)
|
||||
{
|
||||
changed = false;
|
||||
foreach (PdfChapter c in all)
|
||||
{
|
||||
if (!ids.Contains(c.ChapterId) && ids.Contains(c.ParentChapterId ?? ""))
|
||||
{
|
||||
ids.Add(c.ChapterId);
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var sb = new StringBuilder();
|
||||
foreach (string id in ids)
|
||||
{
|
||||
if (sb.Length > 0)
|
||||
sb.Append(",");
|
||||
sb.Append("'").Append(id.Replace("'", "''")).Append("'");
|
||||
}
|
||||
SQLHelper.ExecutSql("DELETE FROM dbo.Sys_PdfChapter WHERE ChapterId IN (" + sb + ")");
|
||||
|
||||
InitTree(bookId);
|
||||
this.htmlContent.Text = "";
|
||||
this.hfCurrentChapterId.Text = "";
|
||||
this.lblProgress.Text = "章节已删除(含子章节 " + (ids.Count - 1) + " 个)。";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 关闭章节弹窗。
|
||||
/// </summary>
|
||||
protected void btnCloseChapter_Click(object sender, EventArgs e)
|
||||
{
|
||||
this.WindowChapter.Hidden = true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 工具
|
||||
/// <summary>SQL 字符串转义。</summary>
|
||||
private static string SqlEsc(string s)
|
||||
{
|
||||
return (s ?? "").Replace("'", "''");
|
||||
}
|
||||
|
||||
/// <summary>生成业务主键(前缀+时间+随机)。</summary>
|
||||
private static string NewId(string prefix)
|
||||
{
|
||||
return prefix + DateTime.Now.ToString("yyyyMMddHHmmss")
|
||||
+ Guid.NewGuid().ToString("N").Substring(0, 4);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,314 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <自动生成>
|
||||
// 此代码由工具生成。
|
||||
//
|
||||
// 对此文件的更改可能导致不正确的行为,如果
|
||||
// 重新生成代码,则所做更改将丢失。
|
||||
// </自动生成>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace FineUIPro.Web.HSSE.PDFDOC
|
||||
{
|
||||
|
||||
|
||||
public partial class PdfBookView
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// form1 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
|
||||
|
||||
/// <summary>
|
||||
/// PageManager1 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.PageManager PageManager1;
|
||||
|
||||
/// <summary>
|
||||
/// hfCurrentChapterId 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.HiddenField hfCurrentChapterId;
|
||||
|
||||
/// <summary>
|
||||
/// hfEditChapterId 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.HiddenField hfEditChapterId;
|
||||
|
||||
/// <summary>
|
||||
/// Panel1 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Panel Panel1;
|
||||
|
||||
/// <summary>
|
||||
/// panelLeftRegion 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Panel panelLeftRegion;
|
||||
|
||||
/// <summary>
|
||||
/// Toolbar1 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Toolbar Toolbar1;
|
||||
|
||||
/// <summary>
|
||||
/// drpBook 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.DropDownList drpBook;
|
||||
|
||||
/// <summary>
|
||||
/// btnAddBook 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnAddBook;
|
||||
|
||||
/// <summary>
|
||||
/// Toolbar3 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Toolbar Toolbar3;
|
||||
|
||||
/// <summary>
|
||||
/// btnAddChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnAddChapter;
|
||||
|
||||
/// <summary>
|
||||
/// btnEditChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnEditChapter;
|
||||
|
||||
/// <summary>
|
||||
/// btnDelChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnDelChapter;
|
||||
|
||||
/// <summary>
|
||||
/// trCatalog 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Tree trCatalog;
|
||||
|
||||
/// <summary>
|
||||
/// panelCenterRegion 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Panel panelCenterRegion;
|
||||
|
||||
/// <summary>
|
||||
/// Toolbar2 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Toolbar Toolbar2;
|
||||
|
||||
/// <summary>
|
||||
/// btnSaveContent 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnSaveContent;
|
||||
|
||||
/// <summary>
|
||||
/// ToolbarFill2 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.ToolbarFill ToolbarFill2;
|
||||
|
||||
/// <summary>
|
||||
/// lblProgress 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Label lblProgress;
|
||||
|
||||
/// <summary>
|
||||
/// htmlContent 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.HtmlEditor htmlContent;
|
||||
|
||||
/// <summary>
|
||||
/// WindowBook 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Window WindowBook;
|
||||
|
||||
/// <summary>
|
||||
/// formBook 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Form formBook;
|
||||
|
||||
/// <summary>
|
||||
/// txtBookTitle 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.TextBox txtBookTitle;
|
||||
|
||||
/// <summary>
|
||||
/// ToolbarBook 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Toolbar ToolbarBook;
|
||||
|
||||
/// <summary>
|
||||
/// btnSaveBook 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnSaveBook;
|
||||
|
||||
/// <summary>
|
||||
/// btnCloseBook 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnCloseBook;
|
||||
|
||||
/// <summary>
|
||||
/// WindowChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Window WindowChapter;
|
||||
|
||||
/// <summary>
|
||||
/// formChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Form formChapter;
|
||||
|
||||
/// <summary>
|
||||
/// txtChapterTitle 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.TextBox txtChapterTitle;
|
||||
|
||||
/// <summary>
|
||||
/// lblParentChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Label lblParentChapter;
|
||||
|
||||
/// <summary>
|
||||
/// ToolbarChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Toolbar ToolbarChapter;
|
||||
|
||||
/// <summary>
|
||||
/// btnSaveChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnSaveChapter;
|
||||
|
||||
/// <summary>
|
||||
/// btnCloseChapter 控件。
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// 自动生成的字段。
|
||||
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
|
||||
/// </remarks>
|
||||
protected global::FineUIPro.Button btnCloseChapter;
|
||||
}
|
||||
}
|
||||
@@ -24,6 +24,7 @@
|
||||
<TreeNode id="9C26BF2A-091D-4AC3-8678-334DE4E1CED7" Text="项目安全检查项" EnText="项目安全检查项" NavigateUrl="HSSE/Technique/CheckItemSet.aspx"></TreeNode>
|
||||
<TreeNode id="D11BFC83-BE64-457D-B8FA-11C37D35CD72" Text="应急预案" EnText="应急预案" NavigateUrl="HSSE/Technique/Emergency.aspx"></TreeNode>
|
||||
<TreeNode id="3E2F2FFD-ED2E-4914-8370-D97A68398814" Text="施工方案" EnText="施工方案" NavigateUrl="HSSE/Technique/SpecialScheme.aspx"></TreeNode>
|
||||
<TreeNode id="3BF92C894AD64523B7C2627F1BF25122" Text="安全标准" EnText="安全标准" NavigateUrl="HSSE/PDFDOC/PdfBookView.aspx"></TreeNode>
|
||||
<TreeNode id="8E3A5EDC-62CA-4F64-A4E7-CD3D473A6201" Text="防护标准" EnText="防护标准" NavigateUrl="HSSE/Technique/ProtectionStandards.aspx"></TreeNode>
|
||||
<TreeNode id="6D75EA6C-0E49-4B04-850B-930B628EE1DF" Text="安全职责" EnText="安全职责" NavigateUrl="HSSE/Technique/SafetyResponsibilities.aspx"></TreeNode>
|
||||
<TreeNode id="23ACEE2E-0E56-4136-9DFB-C971B3C4EA60" Text="队伍文明施工标准" EnText="队伍文明施工标准" NavigateUrl="HSSE/Technique/ConstructionStandards.aspx"></TreeNode>
|
||||
|
||||
Reference in New Issue
Block a user