zoukankan      html  css  js  c++  java
  • 读取系统中的dll文件和xml文件,识别为对应的数据字典

    后端代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    using System.Xml;
    using Abp.Application.Services.Dto;
    using Abp.Collections.Extensions;
    using Abp.Domain.Entities;
    using Abp.Domain.Entities.Auditing;
    using Abp.UI;
    using BM.ERP.Sys.DatabaseTables.Dto;
    using BM.ERP.Sys.Notices;

    namespace BM.ERP.Sys.DatabaseTables
    {
    public class DatabaseTableAppService: ERPAppServiceBase,IDatabaseTableAppService
    {
    /// <summary>
    /// 查询列表
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<PagedResultDto<DatabaseTableDto>> GetAll(GetAllInput input)
    {
    List<DatabaseTableDto> allTables = new List<DatabaseTableDto>();
    allTables = GetAllTables(allTables);
    var list = allTables.WhereIf(!string.IsNullOrEmpty(input.TName), p => !string.IsNullOrEmpty(p.TName) && p.TName.ToUpper().Contains(input.TName.ToUpper()))
    .WhereIf(!string.IsNullOrEmpty(input.TRemark), p => !string.IsNullOrEmpty(p.TRemark) && p.TRemark.ToUpper().Contains(input.TRemark.ToUpper()))
    .ToList();
    var count = list.Count();
    var dtos = list.OrderBy(p=>p.TName).Skip(input.SkipCount).Take(input.MaxResultCount).ToList();
    if (dtos != null)
    {
    return new PagedResultDto<DatabaseTableDto>(count, dtos);
    }
    else
    {
    return new PagedResultDto<DatabaseTableDto>(0, new List<DatabaseTableDto>());
    }
    }


    /// <summary>
    /// 查询列表
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    public async Task<PagedResultDto<GetDetailsDatabaseTableDto>> GetDetails(GetDetailsInput input)
    {
    List<DatabaseTableDto> allTables = new List<DatabaseTableDto>();
    allTables = GetAllTables(allTables);

    List<GetDetailsDatabaseTableDto> allTableDetails = new List<GetDetailsDatabaseTableDto>();
    foreach (var table in allTables)
    {
    foreach (var detail in table.PTables)
    {
    allTableDetails.Add(new GetDetailsDatabaseTableDto()
    {
    PName = detail.PName,
    PRemark=detail.PRemark,
    PAllName=detail.PAllName,
    TName=table.TName,
    TRemark=table.TRemark,
    TAllName=table.TAllName,
    PType=detail.PType,
    PISNull=detail.PISNull,
    PMaxLength=detail.PMaxLength
    });
    }
    }

    var list = allTableDetails.WhereIf(!string.IsNullOrEmpty(input.TName), p => !string.IsNullOrEmpty(p.TName)&& p.TName.ToUpper() == input.TName.ToUpper())
    .WhereIf(!string.IsNullOrEmpty(input.TRemark), p => !string.IsNullOrEmpty(p.TRemark) && p.TRemark.ToUpper().Contains(input.TRemark.ToUpper()))
    .WhereIf(!string.IsNullOrEmpty(input.PName), p => !string.IsNullOrEmpty(p.PName) && p.PName.ToUpper().Contains(input.PName.ToUpper()))
    .WhereIf(!string.IsNullOrEmpty(input.PRemark), p => !string.IsNullOrEmpty(p.PRemark) && p.PRemark.ToUpper().Contains(input.PRemark.ToUpper()))
    .ToList();
    var count = list.Count();
    var dtos = list.Skip(input.SkipCount).Take(input.MaxResultCount).ToList();
    if (dtos != null)
    {
    return new PagedResultDto<GetDetailsDatabaseTableDto>(count, dtos);
    }
    else
    {
    return new PagedResultDto<GetDetailsDatabaseTableDto>(0, new List<GetDetailsDatabaseTableDto>());
    }
    }
    public List<DatabaseTableDto> GetAllTables(List<DatabaseTableDto> allTables) {
    var types = Assembly.Load("BM.ERP.Core").GetTypes();
    foreach (var type in types)
    {
    if (HasImplementedRawGeneric(type, typeof(Entity<>)))
    {
    DatabaseTableDto tables = new DatabaseTableDto()
    {
    TName = type.Name,
    PTables = new List<DataTableProperty>()
    };
    PropertyInfo[] properties = type.GetProperties();
    foreach (var property in properties)
    {

    StringLengthAttribute IsStringLengthAtt = (StringLengthAttribute)property.GetCustomAttributes(typeof(StringLengthAttribute), false).FirstOrDefault();
    var IsRequired = property.GetCustomAttributes(typeof(RequiredAttribute), false).Any();
    tables.PTables.Add(new DataTableProperty()
    {
    PName = property.Name,
    PType = GetType( property.PropertyType.FullName.ToString()),
    PISNull= !IsRequired,
    PMaxLength=IsStringLengthAtt==null?null: IsStringLengthAtt.MaximumLength.ToString()
    });

    }
    allTables.Add(tables);
    }
    }

    allTables = GetXMLInfo(allTables);
    return allTables;
    }
    public string GetType(string fullType)
    {
    if (fullType == null)
    {
    return fullType;
    }
    else if (fullType.ToUpper().Contains("DATETIME"))
    {
    return "DateTime";
    }
    else if (fullType.ToUpper().Contains("STRING"))
    {
    return "String";
    }
    else if (fullType.ToUpper().Contains("BOOLEAN"))
    {
    return "Boolean";
    }
    else if (fullType.ToUpper().Contains("INT"))
    {
    return "Int";
    }
    else if (fullType.ToUpper().Contains("GUID"))
    {
    return "Guid";
    }
    else if (fullType.ToUpper().Contains("SINGLE"))
    {
    return "Single";
    }
    else if (fullType.ToUpper().Contains("DOUBLE"))
    {
    return "Double";
    }
    else if (fullType.ToUpper().Contains("LIST"))
    {
    return "List";
    }
    else if (fullType.ToUpper().Contains("COLLECTION"))
    {
    return "Collection";
    }
    else if (fullType.ToUpper().Contains("DECIMAL"))
    {
    return "Decimal";
    }
    else
    {
    return fullType;
    }
    }
    /// <summary>
    /// 判断指定的类型 <paramref name="type"/> 是否是指定泛型类型的子类型,或实现了指定泛型接口。
    /// </summary>
    /// <param name="type">需要测试的类型。</param>
    /// <param name="generic">泛型接口类型,传入 typeof(IXxx&lt;&gt;)</param>
    /// <returns>如果是泛型接口的子类型,则返回 true,否则返回 false。</returns>
    public static bool HasImplementedRawGeneric( Type type, Type generic)
    {
    if (type == null) throw new ArgumentNullException(nameof(type));
    if (generic == null) throw new ArgumentNullException(nameof(generic));

    // 测试接口。
    var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType);
    if (isTheRawGenericType) return true;

    // 测试类型。
    while (type != null && type != typeof(object))
    {
    isTheRawGenericType = IsTheRawGenericType(type);
    if (isTheRawGenericType) return true;
    type = type.BaseType;
    }

    // 没有找到任何匹配的接口或类型。
    return false;

    // 测试某个类型是否是指定的原始接口。
    bool IsTheRawGenericType(Type test)
    => generic == (test.IsGenericType ? test.GetGenericTypeDefinition() : test);
    }
    /// <summary>
    /// 获取对应的注释
    /// </summary>
    /// <param name="allTables"></param>
    /// <returns></returns>
    public List<DatabaseTableDto> GetXMLInfo(List<DatabaseTableDto> allTables)
    {
    try
    {
    var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
    var fileNamePath = "bin\BM.ERP.Core.xml";
    var filePath = Path.Combine(baseDirectory, fileNamePath);

    if (!File.Exists(filePath))
    {
    throw new UserFriendlyException("未找到相关文件");
    }
    XmlDocument xmlDoc = new XmlDocument();
    xmlDoc.Load(filePath);
    XmlNode root = xmlDoc.SelectSingleNode("doc").SelectSingleNode("members");
    //获取到所有<users>的子节点
    XmlNodeList nodeList = root.SelectNodes("member");

    //遍历所有子节点
    foreach (XmlNode xmlNode in nodeList)
    {
    var name = xmlNode.Attributes["name"].Value;
    var realName = name.Substring(name.LastIndexOf(".") + 1);//表名
    var table = allTables.FirstOrDefault(p => p.TName == realName);
    if (table!=null&&table.TName == realName && name.Contains("T:BM.ERP"))
    {
    XmlNode child = xmlNode.SelectSingleNode("summary");
    if (child == null)
    {
    continue;
    }
    table.TRemark = child.InnerText;
    table.TAllName = name.Substring(name.IndexOf(":") + 1);
    }
    if (name.Contains("P:BM.ERP"))
    {
    var tab = allTables.Where(p => p.TAllName!=null&& name.Contains(p.TAllName)).FirstOrDefault();
    if (tab != null)
    {
    XmlNode child = xmlNode.SelectSingleNode("summary");
    if (child == null)
    {
    continue;
    }
    var pTab = tab.PTables.Where(p => p.PName == name.Substring(name.LastIndexOf(".") + 1)).FirstOrDefault();
    if (pTab != null)
    {
    pTab.PRemark = child.InnerText;
    pTab.PAllName = name.Substring(name.IndexOf(":") + 1);
    }
    }
    }

    }

    }
    catch (System.Exception e)
    {
    return new List<DatabaseTableDto>();
    }

    return allTables;
    }

    }
    }

    前端:

    <div ng-controller="app.sys.views.databaseTables.treeIndex as vm">
    <div ng-include="'/App/common/views/layout/content-header.cshtml'"></div>
    <div class="content" >
    <div class="row">
    <div class="col-sm-4">
    <div class="box box-primary" busy-if="vm.loading">
    <div class="box-header with-border">
    <i class="fa fa-sitemap"></i>
    <h3 class="box-title">数据字典</h3>
    <form class="form-inline " role="form" ng-submit="vm.loadData()" >
    <div class="pull-right">
    <div class="form-group">
    <div class="input-group">
    <input class="form-control" type="text" placeholder="表名"
    ng-model="vm.requestParams.tName">
    </div>
    </div>
    <div class="form-group">
    <div class="input-group">
    <button type="submit" class="btn btn-warning" uib-tooltip="搜索">
    <i class="fa fa-search"></i>
    </button>
    </div>
    </div>
    </div>
    </form>
    </div>

    @*<div class="box-body">
    <div class="tree"></div>
    </div>*@
    <div class="list-group">
    <div ng-repeat="item in vm.entity.items" class="list-group-item" ng-class="{active:item.ishighlight==true}" ng-click="vm.members.getGridData(item.tName)">
    <h5 class="list-group-item-heading">{{item.tName}}</h5>
    <p class="list-group-item-text"> {{item.tRemark}}</p>
    </div>
    </div>
    </div>
    </div>
    <div class="col-sm-8">
    <div class="box" busy-if="vm.loading">
    <div class="box-header with-border">
    <div class="row">
    <div class="col-md-12">
    <i class="fa fa-list"></i>
    <h3 class="box-title">属性</h3>
    <div class="pull-right form-inline">
    <div class="form-group">
    字段:
    <input type="text" class="form-control input-sm" style="100px"
    ng-model=" vm.members.requestParams.pName"
    placeholder="字段">
    </div>
    <div class="form-group">
    说明:
    <input type="text" class="form-control input-sm" style="100px"
    ng-model=" vm.members.requestParams.pRemark"
    placeholder="说明">
    </div>
    <div class="form-group">
    <button type="submit" ng-click="vm.members.getGridData(vm.name)" class="btn btn-warning btn-sm" uib-tooltip="点击搜索">
    <i class="fa fa-fw fa-search"></i>搜索
    </button>
    </div>
    <div class="form-group">
    <button type="submit" ng-click="vm.members.getGridData(null)" class="btn btn-warning btn-sm" uib-tooltip="点击搜索">
    <i class="fa fa-fw fa-search"></i>全库搜索
    </button>
    </div>
    </div>
    </div>
    </div>
    </div>
    <div class="box-body no-padding">
    <div ui-grid="vm.members.gridOptions" ui-grid-pagination ui-grid-resize-columns ui-grid-selection ui-grid-auto-resize ui-grid-auto-height></div>
    </div>
    </div>
    </div>
    </div>
    </div>
    </div>

    js:

    (function () {
    angular.module('app').controller('app.sys.views.databaseTables.treeIndex', [
    '$scope', 'uiGridConstants', '$q', 'abp.services.app.databaseTable',
    function ($scope, uiGridConstants, $q, databaseTableService) {
    var vm = this;

    vm.initializing = true;//初始化中
    vm.name = null;

    //查询条件
    vm.requestParams = {
    filter: '',
    skipCount: 0,
    maxResultCount: 9000,
    sorting: null
    };
    vm.entity = { items :[] }

    //加载数据
    vm.loadData = function () {
    vm.loading = true;
    var s = databaseTableService.getAll(vm.requestParams).then(function (result) {
    vm.entity.items = result.data.items;
    }).finally(function () {
    vm.loading = false;
    });
    return s;
    }
    vm.members = new function () {
    var _this = this;
    this.loading = false;

    //获取列表请求参数
    this.requestParams = {
    id: null,
    skipCount: 0,
    maxResultCount: app.consts.grid.defaultPageSize,
    sorting: null
    };

    //表格配置
    this.gridOptions = {
    enableHorizontalScrollbar: uiGridConstants.scrollbars.WHEN_NEEDED,
    enableVerticalScrollbar: uiGridConstants.scrollbars.WHEN_NEEDED,
    paginationPageSizes: app.consts.grid.defaultPageSizes,
    paginationPageSize: app.consts.grid.defaultPageSize,
    enableRowHeaderSelection: true, //是否显示选中checkbox框 ,默认为true
    enableRowSelection: true, // 行选择是否可用,默认为true;
    useExternalPagination: true,
    useExternalSorting: true,
    //enableGridMenu: true,//是否显示表格 菜单
    appScopeProvider: vm,
    minRowsToShow: 1,
    //列配置
    columnDefs: [
    {
    name: '字段',
    field: 'pName',
    200
    },
    {
    name: '说明',
    field: 'pRemark',
    200,
    },
    {
    name: '类型',
    field: 'pType',
    100
    },

    {
    name: '最大长度',
    field: 'pMaxLength',
    100
    },
    {
    name: '允许Null值',
    field: 'pisNull',
    100,
    cellTemplate:
    '<div class="ui-grid-cell-contents">' +
    '<span class="label label-primary" title="含有作废人员工资" ng-show="row.entity.pisNull">√</span>' +
    '</div>'
    },
    {
    name: '所属表',
    field: 'tName',
    200
    },
    {
    name: '所属表描述',
    field: 'tRemark',
    200
    }
    ]
    ,
    onRegisterApi: function (gridApi) {
    $scope.gridApi = gridApi;
    //排序事件
    $scope.gridApi.core.on.sortChanged($scope, function (grid, sortColumns) {
    if (!sortColumns.length || !sortColumns[0].field) {
    vm.members.requestParams.sorting = null;
    } else {
    vm.members.requestParams.sorting = sortColumns[0].field + ' ' + sortColumns[0].sort.direction;
    }

    _this.getGridData(vm.members.requestParams.tName);

    });
    //翻页事件
    gridApi.pagination.on.paginationChanged($scope, function (pageNumber, pageSize) {
    vm.members.requestParams.skipCount = (pageNumber - 1) * pageSize;
    vm.members.requestParams.maxResultCount = pageSize;

    _this.getGridData(vm.members.requestParams.tName);
    });
    }
    ,
    data: []
    };

    //查询
    this.getGridData = function (tName) {
    for (var i = 0; i < vm.entity.items.length; i++){
    if (vm.entity.items[i].tName == tName) {
    vm.entity.items[i].ishighlight = true;
    }
    else {
    vm.entity.items[i].ishighlight = false;
    }
    }
    vm.members.requestParams.tName = tName;
    if (vm.members.requestParams.tName != null) {
    vm.name = vm.members.requestParams.tName;
    }
    _this.loading = true;
    var s = databaseTableService.getDetails(_this.requestParams).then(function (result) {
    _this.gridOptions.totalItems = result.data.totalCount;
    _this.gridOptions.data = result.data.items;
    }).finally(function () {
    _this.loading = false;
    });
    };

    }

    vm.loadData();
    }
    ]);
    })();

  • 相关阅读:
    Windows Socket编程简介
    IIS7.0 Appcmd 命令详解
    VC显示网页验证码、模拟CSDN网页登录
    c++对象初始化中 ZeroMemory、memset、直接赋0的区别
    在MFC程序中显示 JPG/GIF图像
    开始学习WTL——(1)关于STL/ATL/WTL之间的区别
    可编辑子项的CListCtrl类
    VC添加自定义消息
    VC调用JavaScript函数--处理QQ网页登录密码加密(空间、农场、WEB QQ等)
    VC创建定时关闭的MessageBox
  • 原文地址:https://www.cnblogs.com/luoxiaoxiao102/p/12911288.html
Copyright © 2011-2022 走看看