예제 #1
0
        /// <summary>
        /// 保存主菜单的前置验证
        /// </summary>
        /// <param name="info"></param>
        /// <param name="logonInfo"></param>
        protected override void SavingCheck(MenuMainInfo info, TokenLogonInfo logonInfo)
        {
            if (string.IsNullOrWhiteSpace(info.Name))
            {
                ApiException.ThrowBadRequest("主菜单名称不能为空");
            }
            if (info.Index <= 0)
            {
                info.Index = 10;
            }
            if (info.Type == MenuType.None)
            {
                info.Type = DefaultMenuType;
            }

            foreach (var sub in info.SubMenu)
            {
                if (string.IsNullOrWhiteSpace(sub.Name))
                {
                    ApiException.ThrowBadRequest("子菜单名称不能为空");
                }
                if (string.IsNullOrWhiteSpace(sub.Link))
                {
                    ApiException.ThrowBadRequest("子菜单的地址不能为空");
                }
                if (sub.Index <= 0)
                {
                    sub.Index = 10;
                }
                if (sub.Type == MenuType.None)
                {
                    sub.Type = DefaultMenuType;
                }
            }
        }
        /// <summary>
        /// 获取程序集中数据访问操作的所有特性信息
        /// </summary>
        private static IEnumerable <DBMappingAttribute> LoadMapping()
        {
            foreach (var assembly in AssemblyHelper.GetAssemblyList())
            {
                foreach (Type type in assembly.GetTypes())
                {
                    // 忽略接口
                    if (type.IsInterface)
                    {
                        continue;
                    }
                    // 忽略带泛型的定义 泛型定级均为基类
                    if (type.Name.Contains("`"))
                    {
                        continue;
                    }
                    // 类型必须继承 IDBOperation 接口
                    if (type.GetInterfaces().Where(i => i.ToString().Contains("IDBOperation")).Count() == 0)
                    {
                        continue;
                    }

                    // 获取数据持久化操作的特性
                    DBMappingAttribute attribute = type.GetCustomAttribute <DBMappingAttribute>(false);
                    // 数据操作必须有特性,严格检查避免代码书写错误
                    if (attribute == null)
                    {
                        ApiException.ThrowBadRequest($"数据持久化操作对象:{type.FullName} 必须设置数据映射特性:DBMapping");
                    }
                    // 完善特性信息
                    attribute.DALTypeName = type.FullName;

                    string baseName          = type.BaseType.FullName;
                    int    start1            = baseName.IndexOf("`1[[") + 4;
                    string ModelTypeName     = baseName.Substring(start1, baseName.IndexOf(",") - start1);
                    int    start2            = baseName.IndexOf(",") + 1;
                    string ModelAssemblyName = baseName.Substring(start2, baseName.IndexOf(",", start2) - start2);

                    attribute.ModelType = AssemblyHelper.GetTypeByName(ModelAssemblyName, ModelTypeName);

                    attribute.DBType = DBType.MongoDB;
                    if (string.IsNullOrWhiteSpace(attribute.ConnectionName))
                    {
                        attribute.ConnectionOptions = Connection.Default;
                        attribute.ConnectionName    = Connection.Default.Name.ToLower();
                    }
                    else
                    {
                        attribute.ConnectionName    = attribute.ConnectionName.ToLower();
                        attribute.ConnectionOptions = Connection.ByName(attribute.ConnectionName);
                    }
                    // 返回特性信息
                    yield return(attribute);
                }
            }
        }
        public void UpdateAdmin()
        {
            var employeeService = ServiceLoader.GetService <EmployeeService>();

            if (employeeService.SearchQueryable().Count() > 0)
            {
                ApiException.ThrowBadRequest("系统中拥有用户信息,无密码初始化失败。您可以通过管理员账号登陆后再初始化");
            }
            Init();
        }
        /// <summary>
        /// 根据ID 物理删除数据
        /// </summary>
        /// <param name="id">删除的ID</param>
        /// <returns>返回已删除的对象信息</returns>
        public T RemoveById(string id)
        {
            if (!ObjectId.TryParse(id, out ObjectId objId))
            {
                MongoLog.Logger.Error($"按ID物理删除时参数错误,无法转换成ObjectId的Id值为:[{id}]\r\n类型为:[{typeof(T).FullName}]");
                ApiException.ThrowBadRequest("物理删除的ID值错误");
            }

            return(RemoveByTypeId(objId));
        }
예제 #5
0
        /// <summary>
        /// 根据连接的名称获取连接信息
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public DBConnectionOptions ByName(string name)
        {
            var conn = ConnectionList.Where(e => e.Name == name).FirstOrDefault();

            if (conn == null)
            {
                ApiException.ThrowBadRequest($"请完善名称为{name}的数据库连接配置");
            }
            return(conn);
        }
        /// <summary>
        /// 根据批次获取导入的主表信息
        /// </summary>
        /// <param name="batch"></param>
        /// <returns></returns>
        public DataImportIndexInfo SearchMainByBatch(string batch)
        {
            var main = mainDal.Queryable().Where(e => e.Batch == batch).FirstOrDefault();

            if (main == null)
            {
                ApiException.ThrowBadRequest("无法找到导入的数据信息");
            }
            return(main);
        }
        public List <SelectView> MySub()
        {
            if (string.IsNullOrWhiteSpace(LogonInfo.DepartmentId))
            {
                ApiException.ThrowBadRequest("您需要先有所属部门才可执行此操作");
            }

            DepartmentQuery query = new DepartmentQuery()
            {
                ParentId = LogonInfo.DepartmentId
            };
            List <SelectView> subList = _Service.Select(query);

            return(subList);
        }
예제 #8
0
        /// <summary>
        /// 保存一个主菜单信息 (子菜单不变)
        /// </summary>
        /// <param name="mainInfo"></param>
        public void SaveMainMenu(MenuMainInfo mainInfo)
        {
            if (string.IsNullOrEmpty(mainInfo.Name))
            {
                ApiException.ThrowBadRequest("菜单名称不能为空");
            }

            var main = GetMainByName(mainInfo.Name);

            if (main != null)
            {
                main.Index = main.Index;
                main.Link  = main.Link;
                _Dal.UpdateObject(main);
            }
            else
            {
                _Dal.InsertObject(main);
            }
        }
        public ResultView SetProperty([FromBody] SetPropertyView view)
        {
            if (string.IsNullOrWhiteSpace(view.PropertyName))
            {
                ApiException.ThrowBadRequest("属性名不能为空");
            }

            var info = _Service._SearchById(LogonInfo.Id);

            switch (view.PropertyName.ToLower())
            {
            case "position": { info.Position = view.PropertyValue; break; }

            case "name": { info.Name = view.PropertyValue; break; }

            case "nickname": { info.Nickname = view.PropertyValue; break; }

            case "mobile": { info.Mobile = view.PropertyValue; break; }

            case "telephone": { info.Telephone = view.PropertyValue; break; }
            }
            _Service.Update(info, LogonInfo);
            return(ResultView.Success("信息修改成功"));
        }
        /// <summary>
        /// 更新一个对象信息
        /// </summary>
        /// <param name="info">更新对象</param>
        /// <param name="logonInfo">登录人信息</param>
        /// <returns></returns>
        public virtual ResultView Update(T info, TokenLogonInfo logonInfo)
        {
            if (info == null)
            {
                ApiException.ThrowBadRequest("更新对象不能为空");
            }
            _logger.LogTrace($"更新一个对象信息 ==> 类型为:[{typeof(T).FullName}]\r\n操作人信息:[{logonInfo.ToJson()}]\r\n更新对象:[{info.ToJson()}]");

            try
            {
                // 根据ID获取原数据信息
                var old = _SearchById(info.Id);
                // 更新数据前的预制数据
                info.CreateDate  = old.CreateDate;
                info.CreaterId   = old.CreaterId;
                info.CreaterName = old.CreaterName;
                info.UpdateDate  = DateTime.Now;
                info.UpdaterId   = logonInfo.Id;
                info.UpdaterName = logonInfo.Name;
                info.IsDelete    = false;
                if (info.ProcessState == ProcessState.None)
                {
                    info.ProcessState = ProcessState.Edit;
                }

                #region 保存验证
                // 保存的数据校验,可以被重写
                SavingCheck(info, logonInfo);
                // 判断是否可以执行新增操作,可以被重写
                if (!IsExecuteUpdate(info, old, logonInfo))
                {
                    return(ResultView.Success());
                }
                OnUpdateCheck?.Invoke(info, old, logonInfo);
                OnSaveCheck?.Invoke(info, logonInfo);
                #endregion

                #region 保存的前置处理
                // 更新的前置操作,可以被重写
                Updating(info, old, logonInfo);
                // 新增/保存的通用前置操作,可以被重写
                Saving(info, logonInfo);
                // 事件处理
                OnUpdating?.Invoke(info, old, logonInfo);
                OnSaving?.Invoke(info, logonInfo);
                #endregion

                // 持久化数据
                _Dal.UpdateObject(info);

                #region 保存后置处理
                // 更新的后置操作,可以被重写
                Updated(info, old, logonInfo);
                // 新增/保存的通用后置操作,可以被重写
                Saved(info, logonInfo);
                // 新增后的后置事件处理
                OnUpdated?.Invoke(info, old, logonInfo);
                OnSaved?.Invoke(info, logonInfo);
                #endregion

                // 返回保存结果
                return(ResultView.Success(info.IdString));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"更新一个对象信息异常 ==> 类型为:[{typeof(T).FullName}]\r\n操作人信息:[{logonInfo.ToJson()}]\r\n更新对象:[{info.ToJson()}]");
                throw;
            }
        }
        /// <summary>
        /// 创建一个对象信息
        /// </summary>
        /// <param name="info">新增对象</param>
        /// <param name="logonInfo">登录人信息</param>
        /// <returns></returns>
        public virtual ResultView Create(T info, TokenLogonInfo logonInfo)
        {
            if (info == null)
            {
                ApiException.ThrowBadRequest("新增对象不能为空");
            }
            _logger.LogTrace($"新增一个对象信息 ==> 类型为:[{typeof(T).FullName}]\r\n新增对象:[{info.ToJson()}]");

            try
            {
                // 新增数据前的预制数据
                info.CreateDate   = DateTime.Now;
                info.UpdateDate   = DateTime.Now;
                info.UpdaterId    = logonInfo.Id;
                info.UpdaterName  = logonInfo.Name;
                info.CreaterId    = logonInfo.Id;
                info.CreaterName  = logonInfo.Name;
                info.IsDelete     = false;
                info.ProcessState = ProcessState.Edit;

                #region 保存验证
                // 保存的数据校验
                SavingCheck(info, logonInfo);
                // 判断是否可以执行新增操作
                if (!IsExecuteCreate(info, logonInfo))
                {
                    return(ResultView.Success());
                }
                // 保存数据验证的事件处理
                OnCreateCheck?.Invoke(info, logonInfo);
                OnSaveCheck?.Invoke(info, logonInfo);
                #endregion

                #region 保存的前置处理
                // 新增的前置操作,可以被重写
                Creating(info, logonInfo);
                // 新增/保存的通用前置操作,可以被重写
                Saving(info, logonInfo);
                // 新增时的前置事件处理
                OnCreating?.Invoke(info, logonInfo);
                OnSaving?.Invoke(info, logonInfo);
                #endregion

                // 持久化数据
                _Dal.InsertObject(info);

                #region 保存后置处理
                // 新增的通用后置操作,可以被重写
                Created(info, logonInfo);
                // 新增/保存的通用后置操作,可以被重写
                Saved(info, logonInfo);
                // 新增后的后置事件处理
                OnCreated?.Invoke(info, logonInfo);
                OnSaved?.Invoke(info, logonInfo);
                #endregion

                // 返回保存结果
                return(ResultView.Success(info.IdString));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"新增一个对象信息异常 ==> 类型为:[{typeof(T).FullName}]\r\n操作人信息:[{logonInfo.ToJson()}]\r\n新增对象:[{info.ToJson()}]");
                throw;
            }
        }
        /// <summary>
        /// 初始化数据库的连接
        /// </summary>
        public static void SetConnection()
        {
            // 创建数据库连接信息
            if (Connection == null)
            {
                Connection = new DBConnection(DBType.MongoDB, OnChange);
            }
            if (Connection.ConnectionList.Count == 0)
            {
                ApiException.ThrowBadRequest("请填写数据库的连接配置");
            }

            // 为每个数据库连接创建数据库服务
            Dictionary <string, MongoProvider> ConnDict = new Dictionary <string, MongoProvider>();

            foreach (var conn in Connection.ConnectionList)
            {
                conn.Name     = conn.Name.ToLower();
                LoggerConnect = conn;
                if (string.IsNullOrWhiteSpace(conn.Name))
                {
                    ApiException.ThrowBadRequest("请为连接数据库的字符串指定名称");
                }
                if (ConnDict.ContainsKey(conn.Name))
                {
                    continue;
                }
                try
                {
                    // 获取数据链接客户端
                    IMongoClient MongoClient = new MongoClient(conn.ConnectionString());
                    // 获取数据库
                    IMongoDatabase MongoDatabase = MongoClient.GetDatabase(conn.Database);
                    ConnDict.Add(conn.Name, new MongoProvider {
                        Client = MongoClient, Database = MongoDatabase, Connection = conn
                    });
                }
                catch (Exception ex)
                {
                    // 由于数据库连接字符串容易被外界改变,所以只针对连接字符串出错时记录日志并发送邮件。其它错误应该在测试阶段发现。
                    DBLog.Logger.Error(ex, "连接MongoDB数据库失败", Connection.ConnectionList);
                    throw new Exception("连接数据库失败,请检查数据库连接字符串");
                }
            }

            // 根据持久化操作对象的特性创建数据库操作服务
            ProviderDict.Clear();
            foreach (var map in LoadMapping())
            {
                if (ProviderDict.ContainsKey(map.DALTypeName))
                {
                    continue;
                }

                if (!ConnDict.ContainsKey(map.ConnectionName))
                {
                    ApiException.ThrowBadRequest($"Mongo数据库{map.ConnectionName}连接信息不存在,请检查配置项");
                }
                var db = ConnDict[map.ConnectionName];
                ProviderDict.Add(map.DALTypeName, new MongoProvider
                {
                    Name           = map.DALTypeName,
                    Client         = db.Client,
                    Database       = db.Database,
                    Connection     = db.Connection,
                    CollectionName = map.CollectionName,
                    Collection     = db.Database.GetType().GetMethod("GetCollection").MakeGenericMethod(map.ModelType).Invoke(db.Database, new object[] { map.CollectionName, null })
                });
            }
        }