面试杂谈,题目记录

昨天面试了一天,笔试后hr面试,然后再面试,然后再试,然后技术面试。虽然最后被pass掉了,但是这次面试还是受益匪浅的

没有什么面试经验,能有次这样的面试,虽然结果令人沮丧的想诅咒人,但是过程还是值得玩味。现在记录一下昨天没有回答出来的面试题,当做是一种积累吧。


1:property和attribute的区别

attribute属于OOA/OOD的概念,而property属于编程语言中的概念。

在OOA/OOD中的使用Attribute表示属性,指对象(Object)的特征(Feature)。我们 在一些编程语言(如C#、Delhpi等)中遇到的“属性”一词

下面我们来说明它们的异同。


Attribute
Attributes是Microsoft .NETFramework文件的元数据,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为。
Property
属性是面向对象编程的基本概念,提供了对私有字段的访问封装,在 C#中以get和set访问器方法实现对可读可写属性的操作,提供了安全和灵活的数据访问封装。


2:Socket 与 Webservice 的通信区别

socket是一种协议,采用tcp或udp协议通信。

Tcp、udp属于网络层,上边各层的应用都需要我们自己实现,例如端口的定义,数据包的定义,数据包的加密解密等。

 webservice是一种服务,采用HTTP协议通信,Soap作为数据格式。

HTTP协议属于应用层,通过服务器才可以发布,这样内部定义的端口,数据包,加解密都做好了,可以直接使用。

 webservice基于HTTP协议,因此可以利用现有非常成熟的Web集群来提供高负载,同比之下 socket就非常难。

 网络七层协议从低到高:

1、物理层(Physical Layer)、

2、数据链路层(Data Link Layer)、

3、网络层(Network Layer)、

4、传输层(Transport Layer)、

5、会话层(Session Layer)、

6、表示层(Presentation Layer)、

7、应用层(Application Layer)


webservice一般分为http webservice ,soap webservice两种,都是基于http通信协议的,一般返回xml格式的数据,所以也可以叫做xml webservice.

http webservice 通过get post 两种方法来调用远程的数据服务,适合简单参数的传递(get 直接在url里带上参数);soap webservice通过soap协议传输数据,soap是基于xml标准的,也是就说可以用xml结构的数据来传输参数,这样参数类型可以很复杂,处理远程返回的xml数据时也更方便.

其实soap协议也是基于http协议的.

webservice离不开web服务器(apache),web服务器是一个在公网上提供http通信的服务器.webservice 一般都建立在web服务器上,以供别人调用.

socket 是基于传输层的,http基于应用层,socket是一切通过端口通信的基础(包括http),http://baike.baidu.com/view/13870.htm

使用中,http常用于b/s通信,如web服务器就是用http做传输协议的,socket用于c/s(还有现在的富客户端),应用服务器中常用.socket穿防火墙有问题,而http几乎可以穿过任何防火墙(屏80的不多吧),socket通信的即时性比http好.

3:利用反射DataSet转换成List 泛型

 /// <summary>   
    /// DataSet装换为泛型集合   
    /// </summary>   
    /// <typeparam name="T"></typeparam>   
    /// <param name="p_DataSet">DataSet</param>   
    /// <param name="p_TableIndex">待转换数据表索引</param>   
    /// <returns></returns>   
    /// 2008-08-01 22:46 HPDV2806   
    public static IList<T> DataSetToIList<T>(DataSet p_DataSet, int p_TableIndex)  
    {  
        if (p_DataSet == null || p_DataSet.Tables.Count < 0)  
            return null;  
        if (p_TableIndex > p_DataSet.Tables.Count - 1)  
            return null;  
        if (p_TableIndex < 0)  
            p_TableIndex = 0;  
        DataTable p_Data = p_DataSet.Tables[p_TableIndex];  
        // 返回值初始化   
        IList<T> result = new List<T>();  
        for (int j = 0; j < p_Data.Rows.Count; j++)  
        {  
            T _t = (T)Activator.CreateInstance(typeof(T));  
            PropertyInfo[] propertys = _t.GetType().GetProperties();  
            foreach (PropertyInfo pi in propertys)  
            {  
                for (int i = 0; i < p_Data.Columns.Count; i++)  
                {  
                    // 属性与字段名称一致的进行赋值   
                    if (pi.Name.Equals(p_Data.Columns[i].ColumnName))  
                    {  
                        // 数据库NULL值单独处理   
                        if (p_Data.Rows[j][i] != DBNull.Value)  
                            pi.SetValue(_t, p_Data.Rows[j][i], null);  
                        else  
                            pi.SetValue(_t, null, null);  
                        break;  
                    }  
                }  
            }  
            result.Add(_t);  
        }  
        return result;  
    }  
    /// <summary>   
    /// DataSet装换为泛型集合   
    /// </summary>   
    /// <typeparam name="T"></typeparam>   
    /// <param name="p_DataSet">DataSet</param>   
    /// <param name="p_TableName">待转换数据表名称</param>   
    /// <returns></returns>   
    /// 2008-08-01 22:47 HPDV2806   
    public static IList<T> DataSetToIList<T>(DataSet p_DataSet, string p_TableName)  
    {  
        int _TableIndex = 0;  
        if (p_DataSet == null || p_DataSet.Tables.Count < 0)  
            return null;  
        if (string.IsNullOrEmpty(p_TableName))  
            return null;  
        for (int i = 0; i < p_DataSet.Tables.Count; i++)  
        {  
            // 获取Table名称在Tables集合中的索引值   
            if (p_DataSet.Tables[i].TableName.Equals(p_TableName))  
            {  
                _TableIndex = i;  
                break;  
            }  
        }  
        return DataSetToIList<T>(p_DataSet, _TableIndex);  
    }  

4:简述 private、 protected、 public、 internal 修饰符的访问权限

这一题是公司拿来面试别人的题目,结果这次自己面试居然没写对敲打

private : 私有成员, 在类的内部才可以访问。 
protected : 保护成员,该类内部和继承类中可以访问。 
public : 公共成员,完全公开,没有访问限制。 
internal: 在同一命名空间内可以访问。

5:visibility: hidden和display: none 有什么不同?

这一题答对了,但是还是放在这个记录里面吧

visibility: hidden----将元素隐藏,但是在网页中该占的位置还是占着。
display: none----将元素的显示设为无,即在网页中不占任何的位置。

6:简述装饰模式

最近刚好在看设计模式结果装饰模式还没看到,这次面试居然被问到了,杯具

这个问题先保留着,等设计模式看完写个笔记好了


7:同一个用户组里面不同的用户登录到后台权限不一样怎么设计

这种权限没弄过,接触的都是同一个用户组权限一样的情况,后来在群里聊讨论结果如下

先说说几种权限管理方案

一,简单session控制

实现原理和方法:

用户登录后台,输入用户名和密码,对用户的用户名和密码进行验证,验证通过后,可以把用户的一些基本信息放到session里面当用户访问后台的其他页面时,去判断一下session是否存在,并且没有过期。不过,后台管理员权限一样,没有区分

1,后台页面共用的基本类,我们可以在基本类的里加以判断,或者在基本类外面在extends一层,加以判断,去check一下session。

2,直接重写一个check_login.php每个后台页面都包涵这个页面,通过这个页面加以判断,check一下session。

二,菜单控制

         自己系统里面就是三级菜单控制

实现原理和方法:

菜单控制比简单session控制要高级一点,不光判断用户是否登录,还对用户的权限进行了控制,不同的人看到不同的东西。

1,在显示菜单的地方加以判断,不同的用户显示不同的菜单。这种方法用户虽然看不到菜单,但是可以通过输入url,进入没有显示的菜单页面,前提是用户用户知道url才行。

2,建立一个用户和菜单内容的关系表,把用户所能看到的内容,放到数据库内,当要显示菜单的地方,用数据库进行读取,如果用户是通过输入url进入的话,我们也可以根据用户和url,到关系表中进行查找,如果没有找到的话,就不准许进入,这种方法可以避免上面一种方法的弊端了。

三,页面元素控制

上面说的菜单控制,可以设置权限到页面的级别,但是如果我有这样的需求又怎么办呢,所有的人都可以访问一个页面,一部分可以进行添加操作,一部分人可以进行删除操作,一部分可以进行审核工作。这样的需求,菜单控制很难实现的。现在的权限管理中好多都用的这种方式。例如:一些开源的论坛,cms系统。个人想了一个方法,觉得可以实现页面元素控制。看一下下面的图片。

解释一下:

A表,成员组表。这个表里面存的是一个一个组,财务组,开发组,发货组,定单审核组,退货组等。
B表,成员表。这个表里面存的是一个一个成员,张三,财务组。李四,开发组,王五,发货组,王五定单审核组。
C表,元素权限表。这个表里面存的是一个一个虚拟的权限。比如浏览权限,财务查看权限,发货权限,定单审核权限等。
D表,类别和元素权限的关系表,或者是页面和元素权限的关系表。也就是说,一个类别拥有什么权限,或者某个页面拥有什么权限。
E表,是成员组表和D表的关系表。表示这个成员组拥有那些权限,成员组拥有什么权限,表成成员也拥有什么权限。

为了表达清楚我的意思,我把这一套,分成了5张表,可以精减一下,去掉一到二张表。

实现原理和方法:

页面元素控制可以说是菜单控制的更进一步,更细一点了。对页面里面的具体操作也进行了控制。实现原理和菜单控制差不多。

1,和菜单管理一样,在显示菜单的地方,根据用户所在组进行显示。例如:张三,财务组,他进去看能看到财务的菜单,这个菜单下面也许会有很多页面,每个页面会有很多操作,查看一下E表,表找一下这个组能操作的类或者页面。我把这个方法叫做提前做法,就是有就显示,没有不显示。

2,还有一种办法就是加载页面时把页面中的操作都显示出来,在经过统一的接口来把不能操作的选项去掉。这样的话,可以把页面代码和权限代码分开。这样我觉得不至于把代码搞得太复杂。我把这个方法叫做马后炮做法。


了解完权限管理方案后,开始想怎么设计同一组里面不同成员的管理权限,额,忘记怎么昨天怎么说了,先发上来再说。委屈


8:大批量数据查询优化解决方法

1、先批量查出所有数据,例子中是一万条一批。
2、在查出数据之后把每次的数据按一定规则存入本地文件。
3、获取数据时,通过批次读取,获得大批量数据


                  真心没有海量数据优化的经验,平时用的都是分页,几十万条数据而已。 附上一链接大量数据优化   http://my.oschina.net/heroyang/blog/69646






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值