(转)一步一步Asp.Net MVC系列_权限管理设计起始篇

原文地址:http://www.cnblogs.com/mysweet/archive/2012/07/26/2610793.html

 

 

前一段时间,写了一步一步asp.net的一系列博客,最近,也快要大四,忙着准备找个工作,这也算是最后一个假期了,这个系列可能不太长,尽量写完.还是多学习,少扯淡的风格,我们的学习还好

继续,现在开始学习asp.net MVC系列,基础知识,大家看博客园相关的一系列就可以了,我们在

这里学一下一个权限管理的设计.我采用的是Asp.net MVC+EF+N层的方式,顺便加入点

spring.net注入的部分,当然我们最主要的还是关于权限设计的部分.而架构,咱也没学过太复

杂的架构,我们还是从最常用的三层架构进行扩展.

参考书籍:

<<重构,改善既有代码的设计>>

  <<.net应用架构设计原则,模式与实践>>

<<.net设计范式>>

<<代码整洁之道>>

  以及网上众多的教程,博客等等

首先,我们要讲解一下关于项目的搭建部分.我们的项目主要分为5部分,业务逻辑层,数据访问层,界面层,领域模型层以及

一个公共类的部分.

当然,我们要先建立一个工程,并建立相应的解决方案文件夹,并且保持清晰程度,我们在工程加上前缀(最好是公司前缀)后面加上部分.

image

然后在每个解决方案文件夹下面建立响应的项目,

image

这里主要是:

业务逻辑层:

TZHSWEET.IBLL:业务逻辑层接口

TZHSWEET.BLL:业务逻辑层实现

数据访问层:

TZHSWEET.IDao:数据访问层接口

TZHSWEET.Dao:数据访问层实现

领域模型层:

TZHSWEET.Entity:这是EF建立的模型

TZHSWEET.ViewModel:这个是用来传递UI层和业务逻辑层的相关模型对象

界面层:

TZHSWEET.WebUI:主要的MVC和LigerUI实现的界面部分

TZHSWEET.UI:关于MVC公共UI定义的部分

公共类库部分:

TZHSWEET.CacheStorage主要是常用的缓存

TZHSWEET.Common主要是一些公共类实现等等

这里仅仅是三层架构按照我自己的想法做了一个适应性扩展,呵呵.

EF不用说了,这里只是一个简单的应用

image

在这里我先讲解关于Idao和Dao部分

我们的目标是"0"增删改查的数据访问层实现,

主要是靠EF的定义通用的增删改查,然后其他类继承增删改查接口和相应的自定义子类接口,实现扩展.

首先,我们从以前写代码的经验知道,我们的Dao主要是做增删改查等方面,我们就先定义一个公共的接口,叫做IBaseDao,这个接口定义泛型的增删改查,

   1:   /*  作者:       tianzh
   2:   *  创建时间:   2012/7/16 11:01:34
   3:   *
   4:   */
   5:  using System;
   6:  using System.Collections.Generic;
   7:  using System.Linq;
   8:  using System.Text;
   9:  using System.Data.Objects;
  10:   
  11:  namespace TZHSWEET.IDao
  12:  {
  13:     public interface IBaseDao<T>// where T:class //限制class
  14:      {
  15:          #region 查询普通实现方案(基于Lambda表达式的Where查询)
  16:          /// <summary>
  17:          /// 获取所有Entity
  18:          /// </summary>
  19:          /// <param name="exp">Lambda条件的where</param>
  20:          /// <returns></returns>
  21:          IEnumerable<T> GetEntities(Func<T, bool> exp);
  22:          
  23:          /// <summary>
  24:          /// 计算总个数(分页)
  25:          /// </summary>
  26:          /// <param name="exp">Lambda条件的where</param>
  27:          /// <returns></returns>
  28:          int GetEntitiesCount(Func<T, bool> exp);
  29:        
  30:          /// <summary>
  31:          /// 分页查询(Linq分页方式)
  32:          /// </summary>
  33:          /// <param name="pageNumber">当前页</param>
  34:          /// <param name="pageSize">页码</param>
  35:          /// <param name="orderName">lambda排序名称</param>
  36:          /// <param name="sortOrder">排序(升序or降序)</param>
  37:          /// <param name="exp">lambda查询条件where</param>
  38:          /// <returns></returns>
  39:          IEnumerable<T> GetEntitiesForPaging(int pageNumber, int pageSize, Func<T, string> orderName, string sortOrder, Func<T, bool> exp);
  40:         
  41:          /// <summary>
  42:          /// 根据条件查找
  43:          /// </summary>
  44:          /// <param name="exp">lambda查询条件where</param>
  45:          /// <returns></returns>
  46:          T GetEntity(Func<T, bool> exp);
  47:         
  48:          #endregion
  49:          #region 查询Sql语句外接接口的查询实现
  50:          /// <summary>
  51:          /// 获取所有Entity(立即执行请使用ToList()
  52:          /// </summary>
  53:          /// <param name="CommandText">Sql语句</param>
  54:          /// <param name="objParams">可变参数</param>
  55:          /// <returns></returns>
  56:          IEnumerable<T> GetEntities(string CommandText);
  57:          
  58:          /// <summary>
  59:          /// 计算总个数(分页)
  60:          /// </summary>
  61:          /// <param name="CommandText">Sql语句</param>
  62:          /// <param name="objParams">可变参数</param>
  63:          /// <returns></returns>
  64:          int GetEntitiesCount(string CommandText);
  65:        
  66:         /// <summary>
  67:          /// 分页查询(Linq分页方式)
  68:          /// </summary>
  69:          /// <param name="tableName">表名</param>
  70:          /// <param name="pageNumber">当前页</param>
  71:          /// <param name="pageSize">页码</param>
  72:          /// <param name="orderName">lambda排序名称</param>
  73:          /// <param name="sortOrder">排序(升序or降序)</param>
  74:          /// <param name="CommandText">Sql语句</param>
  75:          /// <param name="Count">总个数</param>
  76:          /// <returns></returns>
  77:          IEnumerable<T> GetEntitiesForPaging(string tableName, int pageNumber, int pageSize, string orderName, string sortOrder, string CommandText, out int Count);
  78:        
  79:          /// <summary>
  80:          /// 根据条件查找
  81:          /// </summary>
  82:          /// <param name="CommandText">Sql语句</param>
  83:          /// <param name="objParams">可变参数</param>
  84:          /// <returns></returns>
  85:          T GetEntity(string CommandText);
  86:   
  87:          #endregion
  88:         /// <summary>
  89:         /// 插入Entity
  90:         /// </summary>
  91:         /// <param name="model"></param>
  92:         /// <returns></returns>
  93:         bool Insert(T entity);
  94:         /// <summary>
  95:         /// 更新Entity
  96:         /// </summary>
  97:         /// <param name="model"></param>
  98:         /// <returns></returns>
  99:         bool Update(T entity);
 100:         /// <summary>
 101:         /// 删除Entity
 102:         /// </summary>
 103:         /// <param name="entity"></param>
 104:         /// <returns></returns>
 105:         bool Delete(T entity);
 106:      }
 107:  }


接下来,我们需要定义一系列的接口继承这个接口,代码类似:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using TZHSWEET.Entity;
   6:   
   7:  namespace TZHSWEET.IDao
   8:  {
   9:   
  10:      public interface IDepartmentDao<T> : IBaseDao<T> where T : class
  11:      {
  12:   
  13:      }
  14:  }


这层接口,大家可能认为没什么必要,但是,这个接口非常重要,这个接口保证了我们用EF一个抽象类实现增删改查的同时又增加了子类的自身扩展性.

接下来,就是Dao部分,我们需要很慎重的去设计,

首先我们要设计一个用EF实现的公共父类的BaseEFDao类,用他来实现增删改查,

   1:   /*  作者:       tianzh
   2:   *  创建时间:   2012/7/16 11:06:16
   3:   *
   4:   */
   5:  using System;
   6:  using System.Collections.Generic;
   7:  using System.Linq;
   8:  using System.Text;
   9:  using TZHSWEET.IDao;
  10:  using TZHSWEET.Entity;
  11:  using System.Data;
  12:  using TZHSWEET.Common;
  13:  using System.Data.Objects;
  14:  namespace TZHSWEET.EFDao
  15:  {
  16:      /// <summary>
  17:      /// 公共接口
  18:      /// </summary>
  19:      public  class BaseEFDao<T> : IBaseDao<T> where T : class,new()   //限制T为class
  20:      {
  21:         
  22:          #region 查询普通实现方案(基于Lambda表达式的Where查询)
  23:         /// <summary>
  24:          /// 获取所有Entity
  25:         /// </summary>
  26:         /// <param name="exp">Lambda条件的where</param>
  27:         /// <returns></returns>
  28:          public virtual IEnumerable<T> GetEntities(Func<T, bool> exp)
  29:          {
  30:   
  31:              using (BaseManageEntities Entities = new BaseManageEntities())
  32:              {
  33:                  return Entities.CreateObjectSet<T>().Where(exp).ToList();
  34:              }
  35:   
  36:          }
  37:          /// <summary>
  38:          /// 计算总个数(分页)
  39:          /// </summary>
  40:          /// <param name="exp">Lambda条件的where</param>
  41:          /// <returns></returns>
  42:          public virtual int GetEntitiesCount(Func<T, bool> exp)
  43:          {
  44:              using (BaseManageEntities Entities = new BaseManageEntities())
  45:              {
  46:                  return Entities.CreateObjectSet<T>().Where(exp).Count();
  47:              }
  48:          }
  49:          /// <summary>
  50:          /// 分页查询(Linq分页方式)
  51:          /// </summary>
  52:          /// <param name="pageNumber">当前页</param>
  53:          /// <param name="pageSize">页码</param>
  54:          /// <param name="orderName">lambda排序名称</param>
  55:          /// <param name="sortOrder">排序(升序or降序)</param>
  56:          /// <param name="exp">lambda查询条件where</param>
  57:          /// <returns></returns>
  58:          public virtual IEnumerable<T> GetEntitiesForPaging(int pageNumber, int pageSize, Func<T, string> orderName, string sortOrder, Func<T, bool> exp)
  59:          {
  60:              using (BaseManageEntities Entities = new BaseManageEntities())
  61:              {
  62:                  if (sortOrder=="asc") //升序排列
  63:                  {
  64:                      return Entities.CreateObjectSet<T>().Where(exp).OrderBy(orderName).Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
  65:                  }
  66:                  else
  67:                      return Entities.CreateObjectSet<T>().Where(exp).OrderByDescending(orderName).Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
  68:              }
  69:   
  70:          }
  71:          /// <summary>
  72:          /// 根据条件查找
  73:          /// </summary>
  74:          /// <param name="exp">lambda查询条件where</param>
  75:          /// <returns></returns>
  76:          public virtual T GetEntity(Func<T, bool> exp)
  77:          {
  78:              using (BaseManageEntities Entities = new BaseManageEntities())
  79:              {
  80:                  return Entities.CreateObjectSet<T>().Where(exp).SingleOrDefault();
  81:              }
  82:          }
  83:          #endregion
  84:          #region 查询Entity To Sql语句外接接口的查询实现
  85:          /// <summary>
  86:          /// 获取所有Entity(立即执行请使用ToList()
  87:          /// </summary>
  88:          /// <param name="CommandText">Sql语句</param>
  89:          /// <param name="objParams">可变参数</param>
  90:          /// <returns></returns>
  91:          public virtual IEnumerable<T> GetEntities(string CommandText)
  92:          {
  93:   
  94:              using (BaseManageEntities Entities = new BaseManageEntities())
  95:              {
  96:                  return Entities.ExecuteStoreQuery<T>("select * from "+typeof(T).Name+" where "+CommandText).ToList();
  97:              }
  98:   
  99:          }
 100:         /// <summary>
 101:          /// 计算总个数(分页)
 102:          /// </summary>
 103:          /// <param name="CommandText">Sql语句</param>
 104:          /// <returns></returns>
 105:          public virtual int GetEntitiesCount(string CommandText)
 106:          {
 107:              using (BaseManageEntities Entities = new BaseManageEntities())
 108:              {
 109:                  return Entities.ExecuteStoreQuery<T>("select * from " +typeof(T).Name+ " where "+CommandText).Count();
 110:              }
 111:          }
 112:   
 113:          /// <summary>
 114:          /// 分页查询(Linq分页方式)
 115:          /// </summary>
 116:          /// <param name="tableName">表名</param>
 117:          /// <param name="pageNumber">当前页</param>
 118:          /// <param name="pageSize">页码</param>
 119:          /// <param name="orderName">lambda排序名称</param>
 120:          /// <param name="sortOrder">排序(升序or降序)</param>
 121:          /// <param name="CommandText">Sql语句</param>
 122:          /// <param name="Count">总个数</param>
 123:          /// <returns></returns>
 124:          public virtual IEnumerable<T> GetEntitiesForPaging(string tableName, int pageNumber, int pageSize, string orderName, string sortOrder, string CommandText,out int Count)
 125:          {
 126:              PaginationHelper pager = new PaginationHelper(tableName, orderName, pageSize, pageNumber, sortOrder, CommandText);
 127:              pager.GetSelectTopByMaxOrMinPagination();
 128:              using (BaseManageEntities Entities = new BaseManageEntities())
 129:              {
 130:                 Count =GetEntitiesCount(CommandText);
 131:                 return Entities.ExecuteStoreQuery<T>(pager.GetSelectTopByMaxOrMinPagination()).ToList();
 132:   
 133:              }
 134:   
 135:          }
 136:         /// <summary>
 137:          /// 根据条件查找
 138:         /// </summary>
 139:          /// <param name="CommandText">Sql语句</param>
 140:          /// <param name="objParams">可变参数</param>
 141:         /// <returns></returns>
 142:          public virtual T GetEntity(string CommandText)
 143:          {
 144:              using (BaseManageEntities Entities = new BaseManageEntities())
 145:              {
 146:                  return Entities.ExecuteStoreQuery<T>("select * from "+typeof(T).Name+" where "+CommandText).SingleOrDefault();
 147:              }
 148:          }
 149:          #endregion
 150:          #region 增删改实现
 151:          /// <summary>
 152:          /// 插入Entity
 153:          /// </summary>
 154:          /// <param name="model"></param>
 155:          /// <returns></returns>
 156:          public virtual bool Insert(T entity)
 157:          {
 158:              using (BaseManageEntities Entities = new BaseManageEntities())
 159:              {
 160:                  var obj = Entities.CreateObjectSet<T>();
 161:                  obj.AddObject(entity);
 162:                  return Entities.SaveChanges() > 0;
 163:              }
 164:          }
 165:          /// <summary>
 166:          /// 更新Entity(注意这里使用的傻瓜式更新,可能性能略低)
 167:          /// </summary>
 168:          /// <param name="model"></param>
 169:          /// <returns></returns>
 170:          public virtual bool Update(T entity)
 171:          {
 172:              using (BaseManageEntities Entities = new BaseManageEntities())
 173:              {
 174:                  var obj = Entities.CreateObjectSet<T>();
 175:                  obj.Attach(entity);
 176:                  Entities.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
 177:                  return Entities.SaveChanges() > 0;
 178:              }
 179:   
 180:          }
 181:          /// <summary>
 182:          /// 删除Entity
 183:          /// </summary>
 184:          /// <param name="entity"></param>
 185:          /// <returns></returns>
 186:          public virtual bool Delete(T entity)
 187:          {
 188:              using (BaseManageEntities Entities = new BaseManageEntities())
 189:              {
 190:                  var obj = Entities.CreateObjectSet<T>();
 191:                 
 192:                  if (entity != null)
 193:                  {
 194:                      obj.Attach(entity);
 195:                         Entities.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted);
 196:                
 197:                         obj.DeleteObject(entity);
 198:                      return Entities.SaveChanges() > 0;
 199:   
 200:                  }
 201:                  return false;
 202:              }
 203:          }
 204:       
 205:          #endregion
 206:        
 207:   
 208:     
 209:      }
 210:  }



接下来我们的工作量就小了,我们可以看到成果了,我们接下来的实现,只需要继承上面这个BaseEFDao和IxxxDao的部分就可以很轻松的实现,子类的增删改查以及子类的扩展了.

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using TZHSWEET.Entity;
   6:  using TZHSWEET.IDao;
   7:  namespace TZHSWEET.EFDao
   8:  {
   9:      public class FavoriteEFDao : BaseEFDao<tbFavorite>, IFavoriteDao<tbFavorite>
  10:      {
  11:   
  12:      }
  13:  }


大家可以看到继承了2个,一个是BaseEFDao父类,一个是IFavoriteDao接口,

BaseEFDao是实现EF的增删改查,IFavoriteDao实现了子类的扩展,比如子类需要加入

GetxxxByID之类的,当然我们在业务逻辑层一般只能通过IFavoriteDao调用此服务,而

这个继承体系保证了我们在实现增删改查的同时外放一个接口保证扩展性.

继承体系图:

image

这样我们的数据访问层,很轻松的实现了,基本上代码量非常少,增删改查部分几乎"0"代码,都是泛型的父类实现了.

今天就讲解到这里,接下来插播点当前有趣的实例部分:

image

界面友好,友好的名称远远比注释更好,<<重构>>这本书,让我学到太多太多,特别是细节的设计,更清晰.

可以参考,我的代码风格,可以看到我的进步非常大,我现在看到2-3个月以前的代码,简直都是<<重构>>这本书的反面教材.

当前的权限管理系统,设计了一个初步的模型,这里贴张小图:

参考了LigerUI,谢略的权限管理系统,吉日的权限管理数据库设计和N多日志,以及传说中的弦哥的Asp.Net大型项目实践系列教程,以及众多的资料,慢慢的我也会把这个写成一个系列.最后,写完这个教程,我会把代码传到公共网盘上面,不过由于现在代码持续改进,所以,就大家先看看思路.

image

一直在努力,从未曾放弃,努力学习中.....欢迎一起学习.net!

转载于:https://www.cnblogs.com/fcsh820/archive/2012/08/10/2632280.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无盘服务器 机械盘,Win7启动速度研究,同样的PC配置,机械盘、固态盘、无盘网络启动速度为何不同?...

别装深沉了&#xff0c;赶快来凑凑热闹吧&#xff01;您需要 登录 才可以下载或查看&#xff0c;没有帐号&#xff1f;立即注册x一、环境&#xff1a;一台台式机(映泰B85、i5-4590、16G内存、三星、Intel固态盘、Realtek网卡)&#xff1b;一台笔记本(T440P、8G内存、三星、Inte…

LeetCode 681. 最近时刻

文章目录1. 题目2. 解题1. 题目 给定一个形如 “HH:MM” 表示的时刻&#xff0c;利用当前出现过的数字构造下一个距离当前时间最近的时刻。每个出现数字都可以被无限次使用。 你可以认为给定的字符串一定是合法的。 例如&#xff0c;“01:34” 和 “12:09” 是合法的&#xf…

[Hands On ML] 5. 支持向量机

文章目录1. 线性支持向量机分类2. 非线性支持向量机分类2.1 多项式核2.2 高斯 RBF 核3. 支持向量机回归4. 原理本文为《机器学习实战&#xff1a;基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考 SVM 特别适合应用于复杂但中小规模数据集的分类问题。 可参考&#…

LeetCode 340. 至多包含 K 个不同字符的最长子串(滑动窗口)

文章目录1. 题目2. 解题1. 题目 给定一个字符串 s &#xff0c;找出 至多 包含 k 个不同字符的最长子串 T。 示例 1: 输入: s "eceba", k 2 输出: 3 解释: 则 T 为 "ece"&#xff0c;所以长度为 3。示例 2: 输入: s "aa", k 1 输出: 2 解释…

LeetCode 616. 给字符串添加加粗标签(Trie树)

文章目录1. 题目2. 解题1. 题目 给一个字符串 s 和一个字符串列表 dict &#xff0c;你需要将在字符串列表中出现过的 s 的子串添加加粗闭合标签 <b> 和 </b> 。 如果两个子串有重叠部分&#xff0c;你需要把它们一起用一个闭合标签包围起来。 同理&#xff0c;如…

LeetCode 158. 用 Read4 读取 N 个字符 II

文章目录1. 题目2. 解题1. 题目 给你一个文件&#xff0c;并且该文件只能通过给定的 read4 方法来读取&#xff0c;请实现一个方法使其能够读取 n 个字符。 注意&#xff1a;你的 read 方法可能会被调用多次。 read4 的定义&#xff1a; 参数类型: char[] buf返回类型: int …

小白学数据分析-----数据指标 累计用户数的使用

小白学数据分析--数据指标累计用户数的使用 累计用户数是指注册用户数的累计&#xff0c;即可以认为是新用户的累计。在一般的数据统计中&#xff0c;我们基本上都会涉及到这个指标&#xff0c;且这个指标是逐渐累加的&#xff0c;比如&#xff1a; 时间 注册…

LeetCode 751. IP 到 CIDR(贪心)

文章目录1. 题目2. 解题1. 题目 给定一个起始 IP 地址 ip 和一个我们需要包含的 IP 的数量 n&#xff0c;返回用列表&#xff08;最小可能的长度&#xff09;表示的 CIDR块的范围。 CIDR 块是包含 IP 的字符串&#xff0c;后接斜杠和固定长度。例如&#xff1a;“123.45.67.8…

LeetCode 308. 二维区域和检索 - 可变(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个 2D 矩阵 matrix&#xff0c;请计算出从左上角 (row1, col1) 到右下角 (row2, col2) 组成的矩形中所有元素的和。 上述粉色矩形框内的&#xff0c;该矩形由左上角 (row1, col1) (2, 1) 和右下角 (row2, col2) (4, 3) 确定。其中&am…

实战 SQL Server 2008 数据库误删除数据的恢复 (转)

今天有个朋友很着急地打电话给我&#xff0c;他用delete语句误删除了SQL Server 2008数据库中两个表中的所有记录&#xff0c;而这个数据库之前没有任何备份。让我帮他解决一下&#xff0c;不然他要赔偿客户很多钱。 SQL Server中误删除数据的恢复本来不是件难事&#xff0c;从…

在线销售数据分析–人货场三维分析角度

文章目录一、数据来源及理解二、分析思路三、数据处理数据预处理数据清洗数据转换四、数据描述性统计五、三维分析-人用户质量分析用户类别分析DM(管理者)排名分析六、三维分析-货销售金额及销量分布情况商品退货率七、三维分析-场城市区域八、总结一、数据来源及理解 此次分析…

LeetCode 348. 判定井字棋胜负(计数)

文章目录1. 题目2. 解题1. 题目 请在 n n 的棋盘上&#xff0c;实现一个判定井字棋&#xff08;Tic-Tac-Toe&#xff09;胜负的神器&#xff0c;判断每一次玩家落子后&#xff0c;是否有胜出的玩家。 在这个井字棋游戏中&#xff0c;会有 2 名玩家&#xff0c;他们将轮流在棋…

LeetCode 694. 不同岛屿的数量(BFS/DFS+set)

文章目录1. 题目2. 解题2.1 BFS2.2 DFS1. 题目 给定一个非空01二维数组表示的网格&#xff0c;一个岛屿由四连通&#xff08;上、下、左、右四个方向&#xff09;的 1 组成&#xff0c;你可以认为网格的四周被海水包围。 请你计算这个网格中共有多少个形状不同的岛屿。 两个岛…

数据分析-书籍整理(二)

业务书籍 《数据化管理-洞悉零售及电子商务》讲解了关于零售和电商的一些知识&#xff0c;有很多实用案例。很有借鉴意义。 《游戏数据分析实战》游戏各个阶段的数据分析&#xff0c;方法&#xff0c;数据来源&#xff0c;案例等。 《增长黑客》这本书我看了两遍&#xff0c…

LeetCode 1516. Move Sub-Tree of N-Ary Tree(DFS)

文章目录1. 题目2. 解题1. 题目 Given the root of an N-ary tree of unique values, and two nodes of the tree p and q. You should move the subtree of the node p to become a direct child of node q. If p is already a direct child of q, don’t change anything. …

空气质量指数(AQI)分析与预测

文章目录前言一、背景Ⅰ数据来源Ⅱ 数据背景Ⅲ 分析目的二、数据探索性分析Ⅰ 数据类型Ⅱ 描述性统计Ⅲ 数据预处理1.缺失值处理1&#xff09;删除缺失值2&#xff09;均值/中值填充2.异常值处理3.重复值处理三、数据分析Ⅰ空气质量排名Ⅱ 全国空气质量1.全国空气质量等级统计2…

LeetCode MySQL解题目录

已完成的 LeetCode MySQL 数据库题目。点击查看我的 LeetCode 算法解题目录。 已解决 123/123 - 简单 54 中等 51 困难 18 前置入门学习 MySQL 基本查询、条件查询、投影查询MySQL 排序、分页查询、聚合查询MySQL 多表查询、连接查询&#xff08;内连接、外连接&#xff09;…

数据分析方法--回归分析方法((SPSS建模:多元线性回归案例)

文章目录回归定义最常用回归方法一、线性回归(Linear Regression)二、逻辑回归(Logistic Regression)三、多项式回归(Polynomial Regression)四、逐步回归(Stepwise Regression)五、岭回归(Ridge Regression)六、套索回归(Lasso Regression)七、回归(ElasticNet)如何正确选择回…

LeetCode MySQL 1511. Customer Order Frequency

文章目录1. 题目2. 解题1. 题目 Table: Customers ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | name | varchar | | country | varchar | ------------------------ customer_id is the p…