快速web开发框架——learunframework
- 格式:pdf
- 大小:1.02 MB
- 文档页数:7


掌握常用框架的基本用法与应用场景常用框架的基本用法和应用场景可以根据具体的框架来进行讨论。
以下是几个常用框架的基本用法和应用场景。
1. Spring框架:Spring是一个轻量级的Java开发框架,提供了一站式的解决方案,包括依赖注入、AOP、事务管理、Web开发等。
在Spring框架中,可以通过注解或XML配置来管理各个组件之间的依赖关系,并利用Spring的IOC容器来管理对象的生命周期。
应用场景包括Web应用开发、企业应用开发、中小型项目开发等。
2. Hibernate框架:Hibernate是一个Java持久化框架,它提供了将Java对象映射到数据库表的解决方案。
通过Hibernate,开发人员可以简化数据库操作,使用面向对象的方式来进行数据库访问,提高开发效率。
应用场景包括ORM映射、事务管理、性能优化等。
3. Django框架:Django是一个基于Python的Web开发框架,致力于提供高效的、安全的Web应用程序开发解决方案。
它采用了MTV (Model-Template-View)的设计模式,通过模型(Model)与数据库交互,通过模板(Template)生成HTML页面,通过视图(View)处理用户请求。
应用场景包括Web应用开发、数据分析平台搭建等。
4. React框架:React是一个用于构建用户界面的JavaScript库,它提供了高效的组件化开发方式,通过虚拟DOM的技术实现了高性能的界面渲染。
React可以与其他框架或库(如Redux、React Router)结合使用,用于构建单页应用、移动应用等。
应用场景包括前端开发、跨平台移动应用开发等。
除了以上几个框架,还有许多其他常用框架,如Angular、Vue.js、Express等,它们都有各自的特点和适用场景。
掌握这些常用框架的基本用法和应用场景,可以帮助开发人员更高效地进行软件开发,提高开发质量和效率。
此外,不仅要掌握框架的基本用法,还要提升自己的拓展能力,如深入学习框架的源码、参与开源社区、阅读相关的技术文章和书籍等,才能更好地应对各种应用场景和解决复杂问题。
手把手教你构建一个完整的Web应用程序构建一个完整的Web应用程序是一个复杂而庞大的工程,涉及到前端、后端、数据库和服务器等多个方面的知识。
本文将为你提供一个详细的步骤,手把手地教你构建一个完整的Web应用程序。
第一步:需求分析和设计在开始构建一个Web应用程序之前,首先需要明确你的需求和目标。
你需要思考你想要构建什么样的应用程序,它的功能和特点是什么,它适用于哪个领域或用户群体。
一旦你明确了需求,接下来就是进行设计。
设计阶段包括确定应用程序的用户界面(UI)设计、数据库设计和系统架构设计等方面。
你可以使用一些设计工具来帮助你完成设计工作,如Axure、Adobe XD等。
第二步:前端开发前端开发是构建Web应用程序不可或缺的一部分。
在这一阶段,你需要使用HTML、CSS和JavaScript等技术来实现应用程序的用户界面。
首先,你可以使用HTML来构建应用程序的基本结构和内容。
HTML是一种标记语言,用于定义Web页面的结构和内容。
你可以使用常见的HTML标签来创建头部、导航栏、侧边栏、内容区域等元素。
接下来,你可以使用CSS来美化应用程序的界面。
CSS是一种用于描述页面样式的语言,可以控制元素的大小、颜色、字体等属性。
你可以使用内联样式、内部样式表或外部样式表来应用CSS样式。
最后,你可以使用JavaScript来添加交互功能和动态效果。
JavaScript是一种脚本语言,可以实现页面的动态更新、表单验证、用户交互等功能。
你可以编写JavaScript脚本并将其嵌入到HTML中。
第三步:后端开发在完成前端开发后,接下来需要进行后端开发。
后端开发主要涉及到服务器端编程和数据库操作。
首先,你可以选择一种后端开发语言和框架来实现服务器端编程。
常见的后端开发语言包括Java、Python、PHP等,而常见的后端开发框架包括Spring、Django、Laravel等。
你可以根据自己的熟悉程度和项目需求选择合适的语言和框架。
前端开发中常用的工具和框架随着互联网的快速发展,前端开发越来越成为一个热门职业。
作为前端开发者,学习一些常用的工具和框架无疑能提高工作效率和开发质量。
本文将介绍一些前端开发中常用的工具和框架,以供读者参考。
一、前端常用工具1.编辑器:Sublime Text/Visual Studio CodeSublime Text和Visual Studio Code是前端开发中最常用的编辑器之一。
它们都有很好的插件支持,可以大大提高开发的效率。
Sublime Text支持快捷键,可以快速定位到需要修改的代码;而Visual Studio Code则支持智能感知,可以快速帮助开发者完成代码的编写。
2.调试工具:Chrome DevToolsChrome DevTools是由Google Chrome开发的一款调试工具,可以用于调试HTML、CSS和JavaScript代码。
它支持多种调试方式,可以直观的显示代码的错误,并且提供了丰富的调试功能。
3.构建工具:Webpack/Gulp/GruntWebpack、Gulp和Grunt都是前端开发中常用的构建工具。
Webpack可以将多个JavaScript文件打包成一个文件,同时也支持将CSS文件、图片等文件打包在一起;Gulp和Grunt则更多地用于自动化构建,可以自动完成编译、压缩和打包等操作。
4.版本控制:GitGit是一种分布式版本控制系统,可以帮助开发者管理团队或个人编写的代码。
它可以跟踪代码的变化,保证代码的稳定性和可靠性。
二、前端常用框架1.前端框架:AngularJS/React/VueAngularJS、React和Vue都是常用的前端框架。
AngularJS是由Google开发的,它可以帮助开发者构建动态的Web应用;React是由Facebook开发的,它可以帮助开发者构建高性能的Web应用;Vue则是一种轻量级的框架,它可以帮助开发者构建交互式的Web应用。
基于.netcore2.0+mysql+AceAdmin搭建⼀套快速开发框架前⾔.net core已经出来⼀段时间了,相信⼤家对.net core的概念已经很清楚了,这⾥就不再赘述。
笔者⽬前也⽤.net core做过⼀些项⽬,并且将以前framework下的⼀些经验移植到了.net core下,并结合.net core本⾝的⼀些特性整理成此框架,以供学习参考。
如有不⾜之处,欢迎指正。
框架介绍先来⼀张整体分层结构图基础层1.Cloud.Core项⽬是核⼼项⽬,主要实现缓存的操作、dapper操作、EF Repository、PageList、⽇志等操作2.Cloud.Utility属于帮助类领域层3.Cloud.Entity实体对象,存放数据库映射实体、Fluent API配置、枚举字典、DbContext等4.Cloud.UnitOfWork,操作数据库的⽹关,⾥⾯封装了对仓储的操作、dapper的操作、事务等服务层5.Cloud.Service 业务逻辑的实现6.Cloud.Dto 数据传输对象,实体对象不直接和表现层接触,通过dto互转表现层7.Cloud.Framework,表现层框架,封装了超类controller,全局授权过滤器,全局异常过滤器,ActionFilter,HtmlHelper等操作8.Cloud.Boss 启动项⽬使⽤的技术基于.net core 2.0的 core mvc基于.net core 2.0的efdappermysql前端框架技术要点1.实体基类定义2.泛型仓储的封装2.1仓储接⼝的定义,泛型约束T必须是BaseEntity类型public interface IRepository<T> where T : BaseEntity{DatabaseFacade Database { get; }IQueryable<T> Entities { get; }int SaveChanges();Task<int> SaveChangesAsync();void Disposed();bool Delete(List<T> entitys, bool isSaveChange = true);bool Delete(T entity, bool isSaveChange = true);Task<bool> DeleteAsync(List<T> entitys, bool isSaveChange = true); Task<bool> DeleteAsync(T entity, bool isSaveChange = true);Task<T> GetAsync(Expression<Func<T, bool>> predicate = null);Task<List<T>> GetListAsync(Expression<Func<T, bool>> predicate = null);T Get(object id);T Get(Expression<Func<T, bool>> predicate = null);Task<T> GetAsync(object id);Task<IQueryable<T>> LoadAsync(Expression<Func<T, bool>> predicate = null);bool Insert(List<T> entitys, bool isSaveChange = true);bool Insert(T entity, bool isSaveChange = true);Task<bool> InsertAsync(List<T> entitys, bool isSaveChange = true);Task<bool> InsertAsync(T entity, bool isSaveChange = true);bool Update(List<T> entitys, bool isSaveChange = true);bool Update(T entity, bool isSaveChange = true, List<string> updatePropertyList = null);Task<bool> UpdateAsync(List<T> entitys, bool isSaveChange = true);Task<bool> UpdateAsync(T entity, bool isSaveChange = true, List<string> updatePropertyList = null);}2.2仓储接⼝的实现public class Repository<T> : IRepository<T> where T : BaseEntity{DbContext _dbContext;public Repository(DbContext dbContext){_dbContext = dbContext;}public int SaveChanges(){return _dbContext.SaveChanges();}public async Task<int> SaveChangesAsync(){return await _dbContext.SaveChangesAsync();}public void Disposed(){throw new Exception("不允许在这⾥释放上下⽂,请在UnitOfWork中操作");_dbContext.Dispose();}#region 插⼊数据public bool Insert(T entity, bool isSaveChange = true){_dbContext.Set<T>().Add(entity);if (isSaveChange){return SaveChanges() > 0;}return false;}public async Task<bool> InsertAsync(T entity, bool isSaveChange = true){_dbContext.Set<T>().Add(entity);if (isSaveChange){return await SaveChangesAsync() > 0;}return false;}public bool Insert(List<T> entitys, bool isSaveChange = true){_dbContext.Set<T>().AddRange(entitys);if (isSaveChange){return SaveChanges() > 0;}return false;}public async Task<bool> InsertAsync(List<T> entitys, bool isSaveChange = true){_dbContext.Set<T>().AddRange(entitys);if (isSaveChange){return await SaveChangesAsync() > 0;}return false;}#endregion#region 更新数据public bool Update(T entity, bool isSaveChange = true, List<string> updatePropertyList = null){if (entity==null){return false;}_dbContext.Set<T>().Attach(entity);if (updatePropertyList==null){_dbContext.Entry<T>(entity).State = EntityState.Modified;//全字段更新}else{updatePropertyList.ForEach(c => {_dbContext.Entry(entity).Property(c).IsModified = true; //部分字段更新的写法});}if (isSaveChange){return SaveChanges() > 0;}return false;}public bool Update(List<T> entitys, bool isSaveChange = true){if (entitys==null||entitys.Count==0){return false;}entitys.ForEach(c => {Update(c, false);});if (isSaveChange){return SaveChanges() > 0;}return false;}public async Task<bool> UpdateAsync(T entity, bool isSaveChange = true, List<string> updatePropertyList = null) {if (entity == null){return false;}_dbContext.Set<T>().Attach(entity);if (updatePropertyList == null){_dbContext.Entry<T>(entity).State = EntityState.Modified;//全字段更新}else{updatePropertyList.ForEach(c => {_dbContext.Entry(entity).Property(c).IsModified = true; //部分字段更新的写法});}if (isSaveChange){return await SaveChangesAsync() > 0;}return false;}public async Task<bool> UpdateAsync(List<T> entitys, bool isSaveChange = true){if (entitys == null || entitys.Count == 0){return false;}entitys.ForEach(c => {_dbContext.Set<T>().Attach(c);_dbContext.Entry<T>(c).State = EntityState.Modified;});if (isSaveChange){return await SaveChangesAsync() > 0;}return false;}#endregion#region 删除public bool Delete(T entity, bool isSaveChange = true){_dbContext.Set<T>().Attach(entity);_dbContext.Set<T>().Remove(entity);return isSaveChange ? SaveChanges() > 0 : false;}public bool Delete(List<T> entitys, bool isSaveChange = true){entitys.ForEach(entity =>{_dbContext.Set<T>().Attach(entity);_dbContext.Set<T>().Remove(entity);});return isSaveChange ? SaveChanges() > 0 : false;}public virtual async Task<bool> DeleteAsync(T entity, bool isSaveChange = true){_dbContext.Set<T>().Attach(entity);_dbContext.Set<T>().Remove(entity);return isSaveChange ? await SaveChangesAsync() > 0 : false;}public virtual async Task<bool> DeleteAsync(List<T> entitys, bool isSaveChange = true){entitys.ForEach(entity =>{_dbContext.Set<T>().Attach(entity);_dbContext.Set<T>().Remove(entity);});return isSaveChange ? await SaveChangesAsync() > 0 : false;}#endregionpublic IQueryable<T> Entities => _dbContext.Set<T>().AsQueryable().AsNoTracking();//public async Task<IQueryable<T>> EntitiesAsync => Task.Run(()=> _dbContext.Set<T>().AsQueryable().AsNoTracking()); public DatabaseFacade Database => _dbContext.Database;#region 查找public T Get(object id){return _dbContext.Set<T>().Find(id);}public T Get(Expression<Func<T, bool>> predicate = null){return _dbContext.Set<T>().Where(predicate).AsNoTracking().FirstOrDefault();}public async Task<T> GetAsync(object id){return await _dbContext.Set<T>().FindAsync(id);}public async Task<T> GetAsync(Expression<Func<T, bool>> predicate = null){return await _dbContext.Set<T>().Where(predicate).AsNoTracking().FirstOrDefaultAsync();}public async Task<List<T>> GetListAsync(Expression<Func<T, bool>> predicate = null){return await _dbContext.Set<T>().Where(predicate).AsNoTracking().ToListAsync();}public async Task<IQueryable<T>> LoadAsync(Expression<Func<T, bool>> predicate = null){if (predicate == null){predicate = c => true;}return await Task.Run(() => _dbContext.Set<T>().Where(predicate).AsNoTracking());}public void Dispose(){throw new NotImplementedException();}#endregion}3.表部分字段更新实现EF默认的更新⽅式是⼀个实体对应的表全部字段更新,那么我们想更新表的部分字段怎么处理?⾸先定义需要更新的字段:public class PropertyExpression<T> where T : BaseEntity{private PropertyExpression() { }private static List<string> propertyList = new List<string>();public static PropertyExpression<T> Init{get{propertyList.Clear();return new PropertyExpression<T>();}}public PropertyExpression<T> Property(Expression<Func<T, object>> expr){var rtn = "";if (expr.Body is UnaryExpression){rtn = ((MemberExpression)((UnaryExpression)expr.Body).Operand);}else if (expr.Body is MemberExpression){rtn = ((MemberExpression)expr.Body);}else if (expr.Body is ParameterExpression){rtn = ((ParameterExpression)expr.Body);}propertyList.Add(rtn);return this;}public List<string> ToList(){return propertyList;}} EF更新的处理public bool Update(T entity, bool isSaveChange = true, List<string> updatePropertyList = null){if (entity==null){return false;}_dbContext.Set<T>().Attach(entity);if (updatePropertyList==null){_dbContext.Entry<T>(entity).State = EntityState.Modified;//全字段更新}else{updatePropertyList.ForEach(c => {_dbContext.Entry(entity).Property(c).IsModified = true; //部分字段更新的写法});}if (isSaveChange){return SaveChanges() > 0;}return false;} 使⽤var entity = _unitOfWork.SysRoleRep.Get(model.RoleId);if (entity == null){throw new Exception("要查找的对象不存在");} = model.RoleName;var updatedPropertyList = PropertyExpression<Sys_Role>.Init.Property(c => ).ToList();_unitOfWork.SysRoleRep.Update(entity, true, updatedPropertyList);4.动态加载实体到DbContextpublic class EntityTypeConfiguration<T> : IEntityTypeConfiguration<T> where T : class{public void Configure(EntityTypeBuilder<T> builder){RelyConfigure(builder);}public virtual void RelyConfigure(EntityTypeBuilder<T> builder){}}public class Sys_Error_LogConfiguration : EntityTypeConfiguration<Sys_Error_Log>{public override void RelyConfigure(EntityTypeBuilder<Sys_Error_Log> builder){builder.ToTable("sys_error_log");builder.HasKey(x => x.Id);base.RelyConfigure(builder);}}public class EfDbContext : DbContext{public EfDbContext(DbContextOptions<EfDbContext> options) : base(options){}//配置数据库连接protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){// eSqlServer("xxxx connection string");base.OnConfiguring(optionsBuilder);}//第⼀次使⽤EF功能时执⾏⼀次,以后不再执⾏protected override void OnModelCreating(ModelBuilder modelBuilder){//获取当前程序集中有基类并且基类是泛型的类var typesToRegister = Assembly.GetExecutingAssembly().GetTypes().Where(c => c.BaseType != null && c.BaseType.IsGenericType).ToList(); foreach (var type in typesToRegister){//泛型定义相同if (type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)){dynamic configurationInstance = Activator.CreateInstance(type);modelBuilder.ApplyConfiguration(configurationInstance);}}base.OnModelCreating(modelBuilder);}}5.⼯作单元⼯作单元是对仓储和事务的封装原理参考:https:///zh-cn/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-applicationpublic class EfUnitOfWork : IUnitOfWork{private EfDbContext _dbContext;//每次请求上下⽂只会创建⼀个public EfUnitOfWork(EfDbContext context){this._dbContext = context;}public int SaveChanges(){return _dbContext.SaveChanges();}public async Task<int> SaveChangesAsync(){return await _dbContext.SaveChangesAsync();}private bool disposed = false;protected virtual void Dispose(bool disposing){if (!this.disposed){if (disposing){_dbContext.Dispose();//随着⼯作单元的销毁⽽销毁}}this.disposed = true;}public void Dispose(){Dispose(true);GC.SuppressFinalize(this);}public IDbContextTransaction BeginTransaction(){var scope = _dbContext.Database.BeginTransaction();return scope;}public List<T> SqlQuery<T>(string sql, object param = null) where T : class{var con= _dbContext.Database.GetDbConnection();if (con.State!= ConnectionState.Open){con.Open();}var list= MysqlDapperReader.SqlQuery<T>(con, sql, param);return list;//throw new NotImplementedException();}public Task<List<T>> SqlQueryAsync<T>(string sql, object param = null) where T : class{throw new NotImplementedException();}#region Sys Repositoryprivate IRepository<Sys_User> _sysUserRep;public IRepository<Sys_User> SysUserRep{get{if (_sysUserRep == null){//var s= HttpContext.Current.Items["currentUser"];//var s = HttpContext.Current.RequestServices.GetService<IRepository<Sys_User>>();//HttpContext.RequestServices.GetService<IRepository<Sys_User>>();_sysUserRep = new Repository<Sys_User>(_dbContext);}return _sysUserRep;}}private IRepository<Sys_Role> _sysRoleRep;public IRepository<Sys_Role> SysRoleRep{get{if (_sysRoleRep == null){_sysRoleRep = new Repository<Sys_Role>(_dbContext);}return _sysRoleRep;}}private IRepository<Sys_Role_User> _sysRoleUserRep;public IRepository<Sys_Role_User> SysRoleUserRep{get{if (_sysRoleUserRep == null){_sysRoleUserRep = new Repository<Sys_Role_User>(_dbContext);}return _sysRoleUserRep;}}private IRepository<Sys_Permission> _sysPermissionRep;public IRepository<Sys_Permission> SysPermissionRep{get{if (_sysPermissionRep == null){_sysPermissionRep = new Repository<Sys_Permission>(_dbContext);}return _sysPermissionRep;}}private IRepository<Sys_Module> _sysModuleRep;public IRepository<Sys_Module> SysModuleRep{get{if (_sysModuleRep == null){_sysModuleRep = new Repository<Sys_Module>(_dbContext);}return _sysModuleRep;}}private IRepository<Sys_Error_Log> _sysErrorLogRep;public IRepository<Sys_Error_Log> SysErrorLogRep{get{if (_sysErrorLogRep == null){_sysErrorLogRep = new Repository<Sys_Error_Log>(_dbContext);}return _sysErrorLogRep;}}private IRepository<Sys_Operation_Log> _sysOperationLogRep;public IRepository<Sys_Operation_Log> SysOperationLogRep{get{if (_sysOperationLogRep == null){_sysOperationLogRep = new Repository<Sys_Operation_Log>(_dbContext);}return _sysOperationLogRep;}}#endregion}6.业务的实现⽅式 以前我是service中直接创建仓储然后⽤仓储操作数据库,⽅式如下:这种⽅式⽐较繁琐,后来我将创建仓储统⼀放在⼯作单元中进⾏,在service中直接创建UnitOfWork,⽅式如下:7.Service的动态注册public static class AutoIocRegister{/// <summary>/// 动态注⼊IOC,注意类和接⼝的命名规则,接⼝在类名前⾯加"I"/// </summary>/// <param name="services"></param>/// <param name="assemblyName">程序集名称</param>public static void BatchAddScoped(this IServiceCollection services, string assemblyName){var libs = pileLibraries;var serviceLib = libs.Where(c => .Contains(assemblyName)).FirstOrDefault();var assembly = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName()); var serviceClassList = assembly.GetTypes().Where(c => c.IsClass).ToList();foreach (var item in serviceClassList){var interfaceName = "I" + ;var interfaceType = assembly.GetTypes().Where(c => c.IsInterface && == interfaceName).FirstOrDefault(); if (interfaceType == null) continue;services.AddScoped(interfaceType, item);}}} 调⽤:services.BatchAddScoped("Cloud.Service");8.⽇志记录:⽇志分操作⽇志和错误⽇志,可以设置在数据库和⽂本中同时记录:通过全局过滤器GlobalExceptionFilter和GlobalAuthorizeFilter处理9.前端的封装(分页、弹出层、ajax等)先放⼏张图吧,详细的以后再介绍。