精华内容
下载资源
问答
  • 什么是人脉和人脉资源

    千次阅读 2008-05-29 13:16:00
    什么是人脉和人脉资源关于人脉的提法仅仅是最近几年的事情,所以,也没有一个公共认可和标准的答案。不过,擅长“为人处世”之道的中国人,看到这个词,自然心领神会。我们可以从以下几个方面来理解: 1.人脉如同...

    什么是人脉和人脉资源

    关于人脉的提法仅仅是最近几年的事情,所以,也没有一个公共认可和标准的答案。不过,擅长“为人处世”之道的中国人,看到这个词,自然心领神会。我们可以从以下几个方面来理解:

     

    1.人脉如同血脉

    众所周知,四通八达、错综复杂的血脉网络,是人的生命赖以存在的基础。血脉即经脉,简称脉。血液运行之通道。《灵枢?九针论》:“人之所以成生者,血脉也。”《活人书》卷三:“血脉者,营养百骸,滋润五脏者也。”血脉系统运行不畅,轻者供血不足,头昏脑涨,四肢乏力,重者血脉淤塞,血液循环中断,危机人的生命。

    在人们追求事业成功和幸福快乐的生活过程中,同样也存在一个类似血脉的系统,我们称它为人脉。如果说血脉是人的生理生命支持系统的话,那么人脉则是人的社会生命支持系统。常言说“一个好汉三个帮,一个篱笆三个桩”,“一人成木,二人成林,三人成森林”,都是说,要想做成大事,必定要有做成大事的人脉网络和人脉支持系统。我们的祖先创造了“人”这个字,可以说是世界上最伟大的发明,是对人类最杰出的贡献。一撇一捺两个独立的个体,相互支撑、相互依存、相互帮助,构成了一个大写的“人”,“人”的象形构成完美地诠释了人的生命的意义所在。

     

    2.人脉如同树脉

    一棵小树苗要想长成参天大树,成为栋梁之材,必须要有粗壮厚实的根脉供给大地的营养,必须要有充足丰富的枝脉和纤细纵横的叶脉供给自然的空气、阳光和雨露。没有叶、没有枝、没有根,也就没有树。根脉、枝脉、叶脉的死亡最终导致了树的死亡。而栋梁之才的形成必须要有根深叶茂的生命支撑环境。

     

    3.人脉是一种资源和资本。

    你在公司工作最大的收获不只是你赚了多少钱,积累了多少经验,而更重要的是你认识了多少人,结识了多少朋友,积累了多少人脉资源。这种人脉资源不仅对你在公司工作时有用,即使你以后离开了这个公司,还会发生作用,成为你创业的重大资产。拥有它之后,你知道你在创业过程中一旦遇到什么困难,你该打电话给谁。假设你是个业务经理,那么,你的最大收获就不只是工资、提成以及职务的升迁,更重要的是你积累起来的人脉资源。它是你终身受用的无形资产和潜在财富!

     

    4.人脉与人际关系

    人脉与人际关系有着千丝万缕的联系。经营人际关系是面,经营人脉资源是点;人际关系是花,人脉资源是果;人际关系是目标,人脉资源是目的;人际关系是过程,人脉资源是结果。可以这样说,没有人脉资源落地生根的人际关系是空泛的、毫无任何意义的人际关系,而人脉资源的开花结果则依赖于良好的人际关系基础。

    很多成功的商界人士都深深意识到了人脉资源对自己事业成功的重要性。美国钢铁大王及成功学大师卡耐基经过长期研究得出结论说:“专业知识在一个人成功中的作用只占15%,而其余的85%则取决于人际关系。”所以说,无论你从事什么职业,学会处理人际关系,掌握并拥有丰厚的人脉资源,你就在成功路上走了85%的路程,在个人幸福的路上走了99%的路程了。无怪乎美国石油大王约翰?D?洛克菲勒说:“我愿意付出比天底下得到其他本领更大的代价来获取与人相处的本领。”

     

    【案例】广东私企老板自费读中央党校渐成时尚

    到中央党校学习,已成为广东私企老板的一种时尚。羊城晚报消息,记者从2005年12月25日结束的广东非公有制经济发展论坛上获悉,今年以来,广东已有400多名私企老板自费到中央党校学习,学政治,学管理,了解经济形势。

    广东非公有经济研究会常务副秘书长刘洋说,广东是私企老板到中央党校学习最踊跃的省份。一年四期的民营经济与实务进修班,每期招收全国学员约150人左右,来自广东的私企老板均超过1/3,有一期还去了90多人。一位党校老师开玩笑说,听到那么多学员在课室讲广东话,还以为到了广东讲课。

    记者发现,到中央党校“充电”的广东私企老板分量不轻,既有上了财富榜的亿万富豪,如志高空调李兴浩;也有行业领军人物如绿茵阁的林欣、天天洗衣的卢志基等;还有不少后起之秀。这些学员所掌控的企业四分之一属广东百强私营企业。

    私企老板到中央党校进修,缘于“入世”后经济形势发生变化,老板们深刻认识到要与时俱进,必须认清形势,提高自身素质。到党校学习,虽然时间不长,但是内容丰富,既学习党的方针政策,又学习各类管理技巧,课程实用生动。

    个别私企老板还学上了瘾,几进“宫”,如志高空调的李兴浩,他第一次到中央党校学习是上世纪90年代末。他说,当时,到党校学习的私企老板凤毛麟角;最近,他又去了一次,学经济形势,发现那里的私企大腕摩肩接踵。李兴浩表示,到党校脱产学习,虽然会耽误一点生意,但领悟了很多破解难题的方法,结交了很多朋友,值得!

     

    1.人脉系统是心灵抚慰最好的支持系统

    艰难和喜悦,都需要人来分享,这是一种心理诉求。你不可抗拒,只能因势利导。从本质上讲,人是孤独的动物,他人的温暖和帮助,是心理维生素。任何对支持系统的轻慢,即便不说是愚蠢,也是无知和疏漏。人的最大的痛苦并不是在悲凄之时无人知心倾诉,而是在快乐之际无人举杯同贺,锦衣夜行,实在是人生的大悲哀!

    人脉是你最好的支持系统,当你哭泣的时候,他会默默地递上纸巾;在你忘乎所以的时候,他会当头给你泼下锥心刺骨的冷水,令你想起自己的本分;他是雪中送炭的贵人;他是锦上添花的天使。

     

    2.人脉是事业发展的情报站

    在这个信息发达的时代,拥有无限发达的信息,就拥有无限发展的可能性。人脉有多广,情报就有多广,这是你事业无限发展的平台。日本三洋电机的总裁龟山太一郎被同行誉为“情报人”,结合自己的实践独创的“情报槽”理论,令人耳目一新。他说:“一般汇集情报,有从人身上、从事物身上获得两个来源。我主张从人身上加以汇集。如此一来,资料建档之后随时可以活用,对方也随时会有反应,就好像把活鱼放回鱼槽中一样。把情报养在情报槽里,它才能随时吸收到足够的营养。”

    一个人思考的时代已经过去,建立品质优良的人脉网为你提供情报,成了决定工作成败的关键。一定意义上说,你的人脉的广度和厚度决定了你的“情报雷达系统”的广度和厚度。

     

    3.人脉是事业成功的助推器

    我们每一个人都希望自己有一个生命中的“贵人”,在关键时刻或危难之际能帮我们一把。“贵人相助”确实是我们成功的道路上宝贵的资源,他可以一下子打开我们机遇的天窗,让我们拨云见日,豁然开朗,直接进入成功的序列和境界;他可以大大缩短我们成功的时间,提升我们成功的速度,使我们站在巨人的肩膀。

    世界首富比尔?盖茨的首次成功也与人脉资源有着千丝万缕的联系。在他20岁时签到了第一份合约,这份合约是跟当时全世界第一电脑公司——IBM签的。当时,他还是位在大学读书的学生,没有太多的人脉资源。比尔?盖茨之所以可以签到这份合约,中间有一个中介人——比尔?盖茨的母亲。比尔?盖茨的母亲是IBM的董事会董事,妈妈理所当然地介绍自己的儿子认识董事长,从而成就比尔?盖茨人生的第一个大单,奠定了他事业成功的第一块基石。而IBM根本没有把比尔?盖茨当回事,这只是后话。

     

    4.人脉是个人成长的镜子

    “不识庐山真面目,只缘身在此山中”。人的最大的敌人是自己。而战胜自己的最有力武器是认识自我。“以人为镜,可以明得失。”物以类聚,人以群分,在我们丰富的人脉网络中,每一个人都是我们学习的标杆和榜样,从他们身上,我们可以看到自己的不足和缺点,更可以免费地学习到他们成功的经验和失败的教训。

     

    每个人总是在不断开发自己的人脉网络,区别在于成功的人总是比一般的人具有更庞大和更有力量的人脉网络。这样,我们就不难理解,为什么广东的民营企业家们热衷于到中央党校学习的原因了,因为,那里汇聚着最前沿、最新鲜的中国政治经济信息,那里汇聚着决定中国发展方向的智慧精英,那里汇聚着中国最有潜力和实力的政治精英和商界精英。

    如何以极自然的、有创意的、互利的方式去经营人脉,是胜负关键。斯坦福(Stanford)研究中心曾经发表一份调查报告指出,一个人赚的钱,12.5%来自知识、87.5%来自关系;有人总结说:对于个人,二十岁到三十岁时,一个人靠专业、体力赚钱;三十岁到四十岁时,则靠朋友、关系赚钱;四十岁到五十岁时,靠钱赚钱。由此可知人脉竞争力是如何在一个人的成就里扮演着重要的角色。

    那么,人脉资源纵横交织,错综复杂,在现实的生活中究竟有哪些人脉资源呢?

     

    1.按形成过程分类

    人脉资源根据其形成的过程可以分为:血缘人脉、地缘人脉、学缘人脉、事缘人脉、客缘人脉、随缘人脉等。

     

    图7-1 人脉的形成分类

     

    (1)血缘人脉

    由家族、宗族、种族形成的血缘人脉关系。

    (2)地缘人脉

    因居住地域形成的人脉关系,最典型的就是“两眼泪汪汪”的老乡关系。老乡关系因所处地域的大小而不同,出了乡同乡的是老乡,出了县同县的是老乡,出了省同省的是老乡,出了国全中国的人都是老乡。

    (3)学缘人脉

    因共同学习而产生的人脉关系。学缘人脉不仅局限于时间较长的小学、中学、大学的同学关系,随着人们现代交际意识的提高,各种各样的短期培训班甚至会议中,蕴涵着十分丰富的人脉关系资源。

    (4)事缘人脉

    因共同工作或处理事务而产生的人脉关系。事缘人脉不仅仅局限于工作中的同事、上司、下属,一段短暂的共事经历也能形成良好的人脉关系。比如一个单位或多家单位为完成一项任务或项目,而临时抽调人员组成团队,任务完成后各自归队,但共同工作与生活的友谊则会留在每一个人的心中。

    (5)客缘人脉

    因工作中与各类客户打交道而形成的人脉关系。比如厂家、供应商、零售商、加盟商、合作商、消费者等,在进行商务交易和往来的过程中,其实是互为顾客关系。俗话说“不打不成交”,这种真金白银的商业活动在考验着每一个人的能力和品行。职业经理人在为顾客做好服务,提高企业经济效益的同时,切莫忘了投入自己的诚信和情感,积累自己的人脉资源。

    (6)随缘人脉

    “有缘千里来相会”,人是有缘分的。一次短暂的聚会,一次偶然的邂逅,这都是上天给我们安排的随缘机会,只要我们抢抓机遇,善于表现自己,而又理解他人,一见钟情的缘分就会降临,你的人生或事业也可能从此就会与众不同。

     

    2.按行业分类

    人脉资源根据所起行业部门的不同,经理人的人脉资源可以分为:政府人脉资源、金融人脉资源、行业人脉资源、技术人脉资源、思想智慧人脉资源、媒体人脉资源等。

     

    图7-2 人脉的行业分类

     

    3.按重要程度分类

    人脉资源根据重要程度的不同,可以分为:核心层人脉资源、紧密层人脉资源、松散备用层人脉资源。

     

    图7-3 人脉的三个层次

     

    (1)核心层人脉资源

    指对职业和事业生涯能起到核心、关键、重要、决定作用的人脉资源。这些资源根据个人目前所处的职业位置、事业阶段以及未来的发展方向不同而不同。比如一个营销部门经理的核心人脉资源,可能是他的顶头上司、公司老板、关键同事和下属、对公司业务和自身业绩有重大影响的重要客户、以及其他可能影响职业与事业发展的重要人物等。

    (2)紧密层人脉资源

    指在核心层人脉资源的基础上,适当的扩展,对一个营销经理而言,公司的董事会成员、其他领导、其他部门同事、一般下属、次重点客户、对自己有影响的老师、同学、朋友等。

    (3)松散备用层人脉资源

    指根据自己的职业与事业生涯规划,在将来可能对自己有重大或一定影响的人脉资源。比如公司未来可能的接班人选、有发展潜力的同事、下属、客户、同学、朋友等。

    人脉资源根据动态变化状态,还可以分为:现在时人脉资源和将来时人脉资源。

    你想五年后成为什么样类型的人,现在就应该开始布局,从现在开始开拓人脉,进而达成自己的目标。如果没有为五年后的人脉开始订定目标,盲从的拓展人脉只会为自己带来更多的繁忙与麻烦。早一点规划自己的人脉网络,五年后,将会发现身边到处是可随时协助您的的专业人士,一通电话即可解决您烦恼的棘手问题。

    “专业是刀柄,人脉是利刃”,在现今变化多端的社会局势中,光靠本身的专业职能是不够的,唯有配合互动互利的方式去经营人脉,才是胜负关键。如不仔细想想未来的人脉如规划运行,将会发现自己只是在原地踏歩。

     

    1.明确职业和事业生涯规划

    要弄清楚以下几个问题:

    ——我的职业方向是什么?

    ——我准备在什么行业、什么类型的企业工作?

    ——我有自己创业的打算吗?我准备在哪个领域或行业创业?

    ——我的职业事业生涯大体分为几个阶段?

     

    2.弄清职业和事业的人脉资源需求

    要弄清楚以下几个问题:

    ——我目前的职业和事业进展得顺利吗?

    ——如果顺利,是谁给了我最有力的支持和帮助?今后我还要得到他们什么样的支持?

    ——如果不顺利,原因是什么?假如不是我的能力问题,那么,是谁没有给我最有力的支持?他们为什么没有帮助我?

    ——为了实现我的职业目标,我需要哪些人脉资源的鼎力相助?我现在得到了吗?

    ——为了实现长远的职业目标,我还要开发哪些潜在的人脉资源?

     

    3.制定人脉资源经营行动计划

    在制定人脉资源行动计划时,应注意以下几个问题:

    (1)人脉资源的结构要科学合理

    比如,性别结构,年龄结构,行业结构,学历与知识素养结构,高低层次结构,内外结构,现在和未来的结构等。不少经理人的人脉圈子结构太单一、单调,导致了人脉资源的质量不高。比如,有的人只重视公司内部的人脉资源,而忽视了公司外部的人脉资源,造成圈子狭窄,信息闭塞,坐井观天。有的人只重视眼前的现在的人脉资源,而忽视了未来的今后的人脉资源,结果,随着职业和事业的发展以及环境的变化,造成关键时刻人脉资源缺位断档,临时抱佛脚往往效果不好。

    (2)人脉资源要兼顾职业事业和生活的需要

    不能只顾职业的发展,事业的成功,而忽视生活的丰富多彩和应急需求。比如,有的人尽管在你的职业事业上起不到什么作用,但是,他们却是你家长里短、柴米油盐日常生活中的好帮手,你不应该忽视他们。

    (3)人脉资源要平衡物质和精神方面的需要

    你不能一头扎进追求名利的陷阱,而忘却了生命追求快乐和幸福的本义。比如,你要有一两个真性情的朋友,哪怕他们性格粗糙甚至低俗,但他们可以骂得你狗血喷头,让你有片刻的清醒。你还应该有一两个善于倾听的伙伴,他们是你倾诉的对象,成功时他们与你一起分享,挫折时他们与你一起分忧。你甚至还应该有一两个好抬杠的家伙,他们总是与你的观点相左,但你总能从他们的荒谬言论中汲取必要的营养。

    (4)人脉资源要重视心智方面的需要

    比如,你应该结交一些专家、学者、教授、实战英雄、智者、小诸葛等,定期与他们交流,将会使你受益非浅。你百思不待其解的难题,他们的片言只语可能会给你指点迷津。

    (5)制定人脉资源规划的六个步骤

    一般而言,制定人脉资源规划有下面六个步骤:

     

    图7-4 人脉资源规划的六个步骤

     

    4.注意人脉资源的深度、广度和关联度

    在拓展你人脉资源的过程中,要注意人脉的深度、广度和关联度。人脉的深度即人脉关系纵向延伸的情况,达到了什么级别;人脉的广度即人脉关系横向延伸的情况,范围(区域与行业)有多广;人脉的关联度指人脉关系与个人所从事行业的相关性和人脉资源直接的相关性。人脉资源既要有广度和深度,又需要关联度,利用朋友的朋友或他人的介绍等去拓展你的人脉资源,从长远考虑,千万不要有人脉“近视症”,需要关注成长性和延伸空间。

    辛勤耕耘人脉的沃土,才会构建广袤的人脉天地网络,最终达到“四海翻腾云水怒,五洲震荡风雷激”的人脉境界,实现 “振臂一挥,应者云集”大成人生。在这一苦心经营的过程中,我们应该遵循以下五项基本原则。

    1.互惠原则
    即利人利己。利人利己是一种双赢的人际关系模式,利人利己者认为,世界之大,人人都有立足的空间,他人之得不必视为自己之失。利人利己观念以品格为基础:诚信、成熟、豁达。豁达的胸襟源于厚实的个人价值观与安全感,由于相信有足够的资源,所以不怕与人共名声、共财势,从而开启无限的可能性,充分发挥创造力与宽广的选择空间。
    利己损人,世上多少争斗;利人利己,人间无限芳春。美国汽车大王亨利?福特曾说过:“如果成功有秘诀的话,那就是站在对方立场来考虑问题,能够站在对方的立场,了解对方心情的人,不必担心自己的前途。”“己欲立而立人,己欲达而达人”,只有这样,才能赢得人们的信任与好感,建立融洽的人际关系。

    【故事】盲人点灯
    一个禅师走在漆黑的路上,因为路太黑,行人之间难免磕磕碰碰,禅师也被行人撞了好几下。他继续向前走,远远看见有人提着灯笼向他走过来,这时旁边有个路人说道:“这个瞎子真奇怪,明明看不见,却每天晚上打着灯笼!”
    禅师也觉得非常奇怪,等那个打灯笼的盲人走过来的时候,他便上前问道:“你真的是盲人为什么在夜晚还打着灯笼呢?”
    盲人说:“我听别人说,每到晚上,人们都变成了和我一样的盲人,因为夜晚没有灯光,所以我就在晚上打着灯笼出来。”
    禅师非常震动地感叹道:“原来你所做的一切都是为了别人!”
    盲人沉思了一会儿,回答说:“不是,我为的是自己!我是盲人,什么也看不见,但我从来没有被人碰到过。因为我的灯笼既为别人照了亮,也让别人看到了我,这样他们就不会因为看不见而撞到我了。”
    禅师顿悟,感叹道:“我辛苦奔波就是为了找佛,其实佛就在我的身边啊!”
    点灯照亮别人的同时,更照亮了自己。在生活中,我们应该时刻记得:帮助别人也就等于帮助自己。

    2.诚实守信原则
    在人际交往中,一般人都喜欢与诚实、爽直、表里如一的人打交道。因此,在人际交往中应切记诚实守信的原则。墨子说:“言必信,行必果。”孔子说:“与朋友交,言而有信。”信用是处理人际关系的必守信条,敌对双方谈判要守信用,做生意双方成交要守信用,上、下级讲话要讲信用,甚至连父亲对刚懂事的儿子讲话也要讲信用。我国历史上有个著名的故事,曾子的儿子吵闹不休,曾妻就骗他说:“等你父亲回来,杀猪给你吃。”曾子回家听到妻子告诉他这件事后,果然持刀把猪杀了。显然,曾子是在培养儿子的信用意识。
    信用的心理作用是给对方以安全感,人际关系是以互相吸引为前提,而这种吸引很重要的一点是双方必须在交往中达到心理上的安全感。因此,约定的聚会,要按时出席:承诺的任务,要力争完成;朋友托办的事,答应了,就要办到;借别人的款项、物品,要如期归还。这些不是无关紧要的小节,而影响到个人信誉和人际关系的大问题,切不可掉以轻心。

    3.互赖原则
    集思广益的合作威力无比。许多自然现象告诉我们:全体大于部分的总和,不同植物生长在一起,根部会相互缠绕,土质因此改善,植物比单独生长时更为茂盛。两块砖头所能承受的力量大于个别承受力的总和。这一原理也同样适用于人类,但并非万无一失。只有敞开胸怀,以接纳的心态尊重差异,才能众志成城。
    “红花亦需绿叶来陪衬”。任何事业,都不是个人独力所能够完成的,有赖于同仁的互助合作,因此,我们要树立“合则彼此有利,分则大家倒霉”的意识。共同努力,一起来担负责任,才能共策共力,达到真正互利共赢的境界。

    4.分享原则
    分享是一种最好的建立人脉网的方式,你分享的越多,得到的就越多。世界上有两种东西是越分享越多的:一是智慧、知识,二是人脉、关系。正如肖伯纳所说:我有一个苹果,你有一个苹果,交换一下每人还是一个苹果;我有一个思想,你有一个思想,交换一下每人至少有两个以上的思想。同理,你有一个关系,我有一个关系,如果各自独享则每人仍是一个关系,如果拿来分享,交流之后则每人拥有两个以上的关系。
    我们来看一看李家诚的生意经:假如一笔生意你卖10元是天经地义的,而我只卖9元,让他人多赚一元。表面上看我是少赚了一元或者亏了一元,但是,从此之后,这个人还和我做生意,而且交易越来越大,而且又介绍他们的朋友与我做生意,朋友又介绍朋友来与我做生意。所以,我生意越来越多,越来越大,我的朋友圈子也越来越广。
    你分享的东西是对别人有用有帮助的,别人会感谢你。你愿意向别人分享,有一种愿意付出的心态,别人会觉得你是一个正直的人,别人愿意与你做朋友,愿意与你打交道。

    5.用“心”原则
    心与脉管相连,脉管为血液循行的隧道。《素间?平人气象论》说:“心藏血脉之气”。藏之于心的这种“气”,就是推动血液循行的动力。心与脉管相通,心气推动血掖在脉管中循行,例如,心血充盈,心气旺盛、则血脉运行畅通,其脉象和缓有力、节律均匀为之正常。反之,心气虚弱,推动无力,则血脉运行不畅。同样道理,在人脉资源的经营中,我们只有以心换心,用诚心、真心、爱心才能换来心心相印的人脉脉动效果,才能产生生生不息的强大的人脉动力。

    常常有人抱怨,我想创一番自己的事业,却没有合适的主攻方向,缺乏必要的资金力量,更幻想能得贵人相助。其实,庞大的资源往往就在自己身边,那就是无数的“人”。只要善于开发、把握、经营、培育你的人脉,就能聚集人气,进而铸造人望,所谓资金、技术、渠道、信息还不是唾手可得吗?

    1.熟人介绍:扩展你的人脉链条
    根据美国人力资源管理协会与《华尔街日报》共同针对人力资源主管与求职者所进行的一项调查显示:95%的人力资源主管或求职者透过人脉关系找到适合的人才或工作,而且61%的人力资源主管及78%的求职者认为,这是最有效的方式。前程无忧网也曾经做过“最有效的求职途径”调查,其中“熟人介绍”被列为第二大有效方法。
    所以,根据你的人脉发展规划,你可以列出需要开发的人脉对象所在的领域,然后,你就可以要求你现在的人脉支持者帮你寻找或介绍你所希望的人脉目标,然后,创造机会,采取行动。

    2.参与社团:走出自我封闭的小圈子
    参与社团可在自然状态下与他人互动建立关系,从中学习服务人群进而创造商机并扩展自己的人脉网络。
    你所认识的人是否都和自己很像?背景相似?对于很多事情的看法也一致?如果你的回答是肯定的,那么你可要注意,因为这表示你的生活圈越来越狭窄,拓展人脉的机会也越来越少。
    如何扩展公司、单位以外的人脉,扩大交友范围,所谓的“虚拟团队”就很重要,亦即透过社团活动的开拓来经营人际关系。平常太主动亲近陌生人时,容易遭受拒绝,但是参与社团时,人与人的交往在“自然”的情况下将更顺利。为什么强调自然?因为人与人的交往、互动,最好在自然的情况下发生,有助于建立情感和信任。透过社团里面的公益活动、休闲活动,产生人际互动和联系。
    很多人不是以我没钱,就是我没时间为理由,拒绝加入任何社团。其实想要拓展自己的人脉网络,爱钱之前必须先学会如何爱人,接近人就等于是接近钱、接近前途;唯有接近人群,打开人脉通道,一通百通,才是创造财富和寻找人生机遇的最佳捷径。
    别忘了,如果你参加了某个社团,你最好能谋到一个组织者的角色,当然,理事长、会长、秘书长更好,求其次也要当一个干事之类,因为,这样你就得到了一个服务他人的机会,在为他人服务的过程中,自然你就增加了与他人联系、交流、了解的时间,你的人脉之路也就在自然而然中不断延伸。

    3.利用网络:廉价的人脉通道
    我有一个在一家中型企业做销售部经理的朋友,闲暇时间喜欢上网,而且建立了自己的博客,一有时间就将自己商场打拼的体会、经验、教训、甘苦贴在网上。有一次,在浏览博客网页时,他发现了一篇很精彩的文章,读完之后,他把自己的读后感以及对文章的肯定和赞美给作者留了言。就这样一来二去,他们建立了坦诚交流的“文缘”,很是投机。四个月后的一天,他突然接到这位网友的电话,说是在他所在的城市出差,问能否见上一面。见面交谈了尽两个小时之后,对方方才递上了自己的名片,并问他是否愿意到他的企业去工作。原来,这位网友竟然是自己所从事行业中全国有名的第二大企业的老板。
    现在,他已是这家企业主管营销的副总经理。由于他们在网上不设防的交流,双方对对方的价值观、思想、爱好、兴趣、处世原则、能力等已经有了比较透彻的了解,所以,与这位网友老板相处一直很融洽。目前,他还担任了两个博客版面的斑竹,据他说,利用网络他已在全国十五六个城市有了近20位比较知心的朋友,此举大大促进了他业务的开展,他自己也为人脉资源的延伸激动不已。

    4.参加培训:志同道合的平台
    参加与自己的工作或兴趣有关的各类培训班,有三大好处:一是走出去方知天外有天、人外有人;二是一学习才知道自己孤陋寡闻;三是培训班不仅是一个学知识、长见识、开思路的好地方,更是我们借此拓展人脉资源的好机会、好平台。当然,最主要的是你要积极主动,做一个有心人。

    5.参加活动:表现自己、结交他人的舞台
    同学会、老乡会、战友会、联谊会、沙龙聚会、庆典会等等,你若有时间还是尽可能地参加。有些人本能地厌恶或害怕参加闹闹哄哄的聚会,认为这些活动纯粹是在浪费时间和精力。自然,你若是想做一个独善其身的人,这些活动的确是浪费时间和生命。而你如果想扩展你的职业和事业,这些活动对你来说是必不可少,你需要做的是,分辨出哪些该参加,哪些该拒绝参加。一旦决定参加,你就肩负一项任务,就是你为什么参加这次活动?你必须从这次活动中有所收获,那就是有利于丰富你的人脉资源。当然,老人脉、老朋友之间的活动你可以轻松一些。

    6.处处留心皆人脉:学会沟通和赞美
    想成为一名成功的人士,你要善于学会把握机会,抓住一切机会去培育人脉资源与关系,其实有许多机会就在你身边,但你可能总是平白的让它流失。如在婚宴场合,你可以在出发前,先吃点东西,并提早到现场,因为,那是他们认识更多陌生人的机会;就是参加一次萍水相逢的会议,你也可以与你的前后左右五六个人交换名片,利用休会的间隙聊聊;在外出旅行过程中,善于沟通与交流,主动与他人沟通等等。
    美国钢铁大王卡内基,在1921年付出100万美元的超高年薪聘请CEO夏布(Schwab)。当时许多记者访问卡内基时问为什么是他?卡内基说“因为他最会赞美别人,这也是他最值钱的本事。”甚至,卡内基为自己写的墓志铭是这样的“这里躺着一个人,他懂得如何让比他聪明的人更开心。”可见,赞美在人脉经营中是多么重要。
    在公司内部,你也要珍惜与你的上司、老板、同事单独相处的机会,比如陪同上司或老板开会、出差等,这是上天赐予你强化人脉的绝佳良机,千万不要错过。当然,你要做好充分的准备,适当地表现,切勿弄巧成拙。

    7.创造机会
    【案例】A、B、C的人脉经营
    A,合资公司做白领,觉得自己满腔抱负没有得到上级的赏识,经常想:要是有一天能见到老总,有机会展示一下自己的才干就好了!
    A的同事B,也有同样的想法,他更进一步,去打听老总上下班时间,算好他大概会在何时进电梯,他也在这个时候去坐电梯,希望能遇到老总,有机会可以打个招呼。
    他们的同事C更进一步。他详细了解老总的奋斗历程,弄清老总毕业的学校,人际风格,关心的问题,精心设计了几句简单有份量的开场白,在算好时间去乘坐电梯,跟老总打过几次招呼,终于有一天跟老总长谈了一次,不久就争取到了更好的职位。

    愚者错失机会,智者善抓机会,成功者创造机会。机会只给准备好的人,准备二字,并非说说而已。而更要的是要“做”,要去创造。据传,日月光半导体总经理刘英武当初在美国IBM服务时,为了争取与老板碰面的机会,每天都观察老板上洗手间的时间,自己选择在那时去上洗手间,增加互动。

    8.大数法则
    全世界的人那么多,有60多亿人口,有哪些人可以作为我的人脉关系呢?许多人都会提出这个问题。
    首先,你必须有一个目标定位,然后,决定找哪些类型的人,当这些目标确定之后,就找一个简单的方法,贯彻始终。这个方法不是别的,就是使用“大数法则”。什么是大数法则?大数法则又称“大数定律”或“平均法则”,是概率论的主要法则之一。大数法则的精神实质在于观察的数量越大,预期损失率结果越稳定,所以,大数法则是保险精算中确定费率的主要原则。
    把“大数法则”用在人脉关系上,就是借用这个原则的精神实质:你结识的人数越多,那么,预期成为你的朋友至交的人数占你所结识的总人数的比例越稳定。所以,在概率确定的情况下,你要做的工作就是结识更多更多的人,广泛地收集人脉信息,有效地运用大数法则来推断分析,评估你的人脉关系的进展以及存在的问题,从而制订相应的对策,不断改进方法,广结人缘。
    法国亿而富(Total Fina Elf)机油前总裁,每年总要立下志愿,与一千个人交换名片,并跟其中的两百个人联络,而且还要跟其中的五十个人成为朋友。他遵循的就是大数法则。谁是我职业和事业上的贵人?答案是每个人都可能成为你的贵人,贵人就在你的身边,关键是你要有人脉资源经营的意识,你要用心寻找,用心经营。

    要成大事,先要会做人;而会做人,即是善于在交往中积累人脉资源。若能做到圆通有术,左右逢源,进退自如,上不得罪于达官贵人,下不失信于平民百姓,中不招妒于同行朋友,方圆得体,张驰有度,人脉大树自然会枝繁叶茂。胡雪岩就是这样一个人,在晚清混乱的局势中立足脚跟,在商业上红极一时。纵观胡雪岩的一生,其成功之处可归结在为人处世上,他能在乱世之中,方圆皆用,刚柔皆施,懂得 如何管理人脉资源,并利用它为自己的商业铺路。

    【案例】吴榳华:朋友数千 助造千万富翁
    吴榳华:上海香港商会理事兼公共事务副会长、香港体育会会长、上海市公共关系协会副会长、上海利苑金阁餐饮有限公司董事、上海威顺康乐体育咨询有限公司董事长、总经理。
    1.上海打下人脉基础
    1993年吴榳华经香港朋友推荐来到上海担任一家珠宝公司的总经理,负责在上海筹建业务,开设零售店。
    利用在同一个商厦办公的便利,吴榳华逐渐认识了他来上海的第一批朋友。这些朋友中,做各种各样的生意的,其中有很多都是在上海的香港人。在这些香港朋友的介绍下,加入了上海香港商会。后来香港商会的一位副会长的朋友由于工作调离上海,推荐吴榳华成了香港商会的副会长。而利用香港商会这个平台,吴榳华又认识了一大批在上海工作的香港成功人士。据了解,在上海工作的香港人超过几万人。
    2.创办香港体育会并担任会长
    1997年吴榳华创办了香港体育会并担任会长。这是一个自发的群体性体育组织,最初才20多个成员。朋友带朋友,这个圈子越来越大,作为会长的吴榳华,在花费间和精力的同时也给他带来了更多的朋友。
    3.辞去珠宝公司的职务,任一家美资烟草公司上海首席代表
    “在烟草公司做首席代表的这几年里,是我朋友发展最多、最快的时候。”吴榳华回忆道。后来集团被收购,公司将他派驻其他地区,他发现自己已经离不开上海了,如果离开上海,自己辛苦建立起来的人脉将浪费了。于是,他决定离开烟草公司。
    4.成立上海威顺(Vision)康乐体育咨询有限公司
    “寓商机于休闲”。吴榳华说:“其实通过我手上的人脉关系,做什么事情都会比较轻松。然而我认识这么多朋友以来,从来没有以什么商业或者生意上的目的去找过朋友,都是朋友主动帮助我的。朋友有什么生意,会马上想到我并且通知我。”
      5.用朋友关系投资房产
      在1999年和2000年的时候,吴榳华在朋友的推荐下开始投资房地产。最多的时候,吴榳华手上有十几套以上的房产。吴榳华陆续把手上房产变现,收益颇丰。
    6.人脉是餐馆最佳推动力
    2005年接手一家餐馆,一个月后,餐馆的营业额就成倍增长,仅吴榳华朋友的营业额就达到了20多万元。“很多时候,都是朋友知道我在这边管理,过来捧场的。”吴榳华说。
    7.住院数百朋友探望,生日数百朋友参加
    而让吴榳华永远难忘的是一次住院。“当时我昏迷了几个小时,甚至心脏都停止跳动两分多钟。”吴榳华回忆这段情节,还连连感叹不已。而当朋友知道吴榳华病危的消息,不到一两个小时就来了一两百人到医院看他,里面有香港旅游局上海首席代表、施华洛士奇的上海首席代表,汇丰银行的行长等等,都是一些单位的领导。甚至还有不少朋友都哭了,吴榳华在这些朋友当中人缘可见一斑。
    而他的生日聚会更是热闹。吴榳华说:“最初的时候,有四五十个人参加,到最多的似乎,有超过300~400人来参加我的生日PARTY。”
    8.长期用心经营终结人脉硕果
    吴榳华对记者直言,自己有两三千个朋友,每年都会见面3~4次的有近约1500个,而经常性见面和联系,有三四百人之多。也就是说,按照1年365天计算,吴榳华每天至少要见12~17人次的朋友。
    9.名片+情感的人脉管理秘笈
    这么多朋友,但就名片管理起来就很吃力。吴榳华有什么秘笈呢?
    首先是感情攻势。吴榳华每年的春节和朋友生日,吴榳华都会把所有的名片找出来,一个一个打电话过去,问候一下,然后都要亲手写一张贺卡过去给他。仅春节他要亲手写近两千多张贺卡。
    其次,要做有心人。吴榳华有个习惯,每次和别人交换名片后,吴榳华都会名片上写上见面的日期、地点和事由。“记得这些朋友什么时候什么地点认识的。下次就会记得。否则这么多朋友,有时候一下子交换几十张名片,你很难会记得。”对方同时也可能这样。第二次见面的时候,你提起是什么时候什么地点认识,对方可能就会想起来。这样第二次见面的时候,对方看你记得这么清楚,会觉得你很重视他,对你的感觉很好。“其实,我还做得不够。真正还可以细化,把这个人的生日啊、爱好等都可以记在名片上。”
    最后,是对名片归类。吴榳华有一个很大的“名片库”,分类管理是他的诀窍。按照行业分成不同的类型,在行业下在按照职位细分。
    ——根据《理财周刊》改编

    1.名片——人脉资源存折
    名片是商务人士的必备沟通交流工具。但是你是否对收到的名片进行了有效的管理?你是不是有过这种情况:参加一次人际活动之后,名片收到了一大把,你往家里或办公室里随手一放,可是有一天,你急于寻找一位曾经结识的朋友帮忙,却东找西翻,就是找不到他留给你的名片和联系方法。
    不要小看了小小的名片,它可是你人脉管理中重要的资源。因此,对名片的管理十分必要。
    ——首先,当你和他人在不同场合交换名片时,务必详尽记录与对方会面的人、事、时、地、物。交际活动结束后,应回忆复习一下刚刚认识的重要人物,记住他的姓名、企业、职务、行业等。第二天或过个两三天,主动打个电话或发个电邮,向对方表示结识的高兴,或者适当地赞美对方的某个方面,或者回忆你们愉快的聚会细节,让对方加深对你的印象和了解。
    ——其次,对名片进行分类管理。你可以按地域分类,比如:按省份、城市;也可以按行业分类;还可以按人脉资源的性质分类,比如:同学、客户、专家等。
    ——第三,养成经常翻看名片的习惯,工作的间隙,翻一下你的名片档案,给对方打一个问候的电话,发一个祝福的短信等,让对方感觉到你的存在和对他的关心与尊重。
    ——第四,定期对名片进行清理。将你手边所有的名片与相关资源数据作以全面性整理,依照关联性重要性、长期互动与使用机率、数据的完整性的因素,将它们分成三堆,第一堆是一定要长期保留的,第二堆是不太确定,可以暂时保留的,第三堆是确定不要的。将确定不要的销毁处理。

    2.建立你的人脉资源数据库
    如果你的人脉资源十分丰富,建议你进行人脉资源数据库管理。你可以在网上下载一个名片管理软件,然后输入相关数据。比如:姓名(中英文)、工作数据(公司部门与职称)、地址(商务地址,住家地址,其它地址)、电话与传真及行动电话、电子信箱(公司与个人永久信箱)、网址等,甚至还可以输入更个人化的资料,如:ICQ、生日、昵称、个人化称谓、介绍人、统一编号等其它字段。

    3.了解需求,满足需求
    有句话说得好“你要想钓住鱼,就要像鱼那样思考”。也就是说,我们必须弄清楚鱼在想些什么,想吃什么,然后投其所好。当然,经营人脉资源不能简单地理解为钓鱼,但有些道理是相通的。
    ——首先,你要像对待尊贵的顾客那样,了解人脉对象的基本情况,比如:家庭状况、收入状况、学历教育背景、兴趣爱好、价值观、工作生活习惯、职业事业理想目标、性格特点等等各方面的细节,有必要的话还要在备忘录或数据库中记录备忘。
    ——其次,掌握人脉对象目前工作生活中最大的需求是什么,最看重什么,看看自己能为对方做些什么,能帮上什么忙,能提供些什么参考建议等。
    ——第三,无论对方的需求千差万别,但有一些基本需要是基本相同的,那就是被赞美、被尊重、被关心、被肯定、被同情、被理解、被帮助等。通过适当的赞美、尊重、关心、肯定、理解等行为,让对方感到你对他的重视,他对你的重要,自然对方就有一种满足感。

    4.用惊喜和感动创造人脉忠诚
    在顾客关系管理理论中,有很多关于创造顾客忠诚的阐述。其实,经营人脉资源如同经营顾客一样,实现人脉忠诚才是人脉经营与管理的最终目的。为什么很多人人缘不错,认识的人也很多,但是在最需要帮助的时候,却“门前冷落车马稀”?这说明人脉经营的功夫不到,仍然停留在酒肉朋友、泛泛而交的较低的层次上。
    每一个人在工作和生活的不同时间,都可能出现最需要别人帮助、关心、支持、鼓励乃至同情的时候,他如果是你的人脉对象,在他最需要的时候,你应该就在身边。或者是义不容辞的冲锋陷阵,或者是风急火燎地忙前忙后,哪怕是你默默地同他在一起,什么都不做,哪怕是你的一句鼓励的话语,一个同情的眼神,哪怕是你与他一起大笑,一起痛苦,一起着急,一起担忧,他都会感到真正友谊的存在,他都会深藏对你深深的感动。

    5.用二八原理经营人脉资源
    企业经营管理中有一个著名的“二八”理论,通常的意义是说,在企业中20%的产品在创造着企业80%的利润,20%的顾客为企业带来80%的收入,20%的骨干在创造着80%的财富,80%的质量瑕疵是由20%的原因造成的等。二八原理告诉我们,要抓住那些决定事物命运和本质的关键的少数。
    经营人脉资源也是如此。也许,对你一生的前途命运起重大影响和决定作用的,也就是那么几个重要人物,甚至只是一个人。所以,我们不能平均使用我们的时间、精力和资源,我们必须区别对待,我们必须对影响或可能影响我们前途和命运的20%的“贵人”另眼相看,我们必须在他们身上花费80%的时间、精力和资源。这是科学经营人脉资源的原则,与我们的人品与道德是两码事。

    6.日积月累,细心呵护
    四通八达的人脉网络需要爱心的浇灌,需要精心的梳理,需要细心的呵护,需要耐心的期待。因此,你应该将人脉资源经营管理,纳入你的长期和短期的职业事业规划计划之中,逐步养成经营人脉的习惯。
    根据不同层次的人脉资源分类,确定相应的联系、拜访、聚会等频次。但是,在常规的节假日,或对方特殊的日子,比如生日,你不妨打一个问候的电话或发一条祝福的短信,或寄上一个精致的贺卡(或电子贺卡),或发一封EMAIL,或通过QQ、MSN等进行沟通交流。
    而对于20%的关键的少数,你更要细心计划并付诸实施。

    7.人脉经营宜走长线
    友谊之花,须经年累月培养;做人做事,不可急功近利。善于放长线、钓大鱼的人,看到大鱼上钩之后,总是不急着收线扬竿,把鱼甩到岸上。因为这样做,到头来不仅可能抓不到鱼,还可能把钓竿折断。他会按捺下心头的喜悦,不慌不忙地收几下线,慢慢把鱼拉近岸边;一旦大鱼挣扎,便又放松钓线,让鱼游窜几下,再又慢慢收钓。如此一收一驰,待到大鱼精疲力尽,无力挣扎,才将它拉近岸边,用提网兜拽上岸。
    求人也是一样,如果逼迫得太紧,别人反而会一口回绝你的请求。只有耐心等待,才会有成功的喜讯来临。
    【案例】总经理的长线投资
    某企业的总经理长期承包一些大公司的工程,对待这些公司的重要人物自不必说,他与别人的不同之处是:不仅奉承公司要人,对年轻的职员也殷勤款待。
    谁都知道,这位董事长并非无的放矢。他知道,十个欠他人情债的人当中,有九个会给他带来意想不到的收益。他现在做的“亏本”生意,日后会利滚利地收回来。
    所以,当他所看中的某位年轻职员晋升为科长时,他会立即跑去庆祝,赠送礼物,同时还邀请他到高级餐馆用餐。年轻的科长自然感激涕零,心想:我这么卑微的人物,人家能这么抬举,有机会真应该报答才对!
    这样,当有朝一日这些职员晋升至处长、经理等要职时,还记着这位总经理的恩惠。因此在生意竞争十分激烈的时期,许多承包商倒闭破产,而这位总经理的公司却仍旧生意兴隆。

    综观这位总经理的“放长线”手腕,确有他“老姜”的“辣味”。这也揭示求人交友要有长远眼光,尽量少做临时抱佛脚的买卖,而要注意有目标的长期感情投资。需要注意的是,放长线钓大鱼,必须慧眼识英雄,才不至于将心血枉费在那些中看不中用的庸才身上。

    8.勤烧香,拜冷庙,交落难英雄
    俗话说:“平时不烧香,临时抱佛脚”。这是肯定不行的。你拿菩萨当枪使,她自然不会帮你。因此,我们应该在平时多烧香,多积累自己的敬意和虔诚。一旦有事,你去求她,她自然念及你平时的热忱和贡献,有求必应。
    在烧好热庙的同时,你也要观察搜索一些有灵气的冷庙。对于热庙你仅仅是芸芸众生中一个不起眼的香客之一,菩萨尽管吃着你的供奉但未必记得你。所以一旦有事求它,它对你只以众人相待,不会特别照顾。而冷庙则不同,在门庭冷落、无人供奉的时候,你却很虔诚地去烧香,菩萨对你当然特别在意。同样的烧一炷香,冷庙的菩萨却认为这是欠天大的人情,日后有事去求它,它自然特别照应。如果有一天冷庙成了热庙,菩萨对你还是会特别看待,不把你当成溜须拍马之辈。
    投资股票需要你有一双慧眼,能准确看到尚处在谷底的所谓“垃圾股”,逢低买入,一旦该股潜力发挥自然会让你赚得盆满钵满。经营人脉资源也是如此,你要有一双识人的慧眼,能够看准真正的英雄。尤其是在英雄落难之时,你更应该拔刀相助、雪中送炭。寸金之遇,一饭之恩,可以使他终生铭记。日后如有所需,他必会倾力相报。即使你无所需,他一旦否极泰来,也绝不会忘了你这个患难至交。
    不少人总认为冷庙的菩萨不灵,所以才成为冷庙。其实英雄落难,壮士潦倒,“三十年河东,三十年河西”都是常见的事。只要一朝交泰,风水流转,他们一飞冲天、一鸣惊人的时候,你的好心与苦心自然会得到丰厚的回报。

    9.广结善缘,广植善因,必将广结善果
    有人说:二十世纪最伟大的发明就是人与人之间的沟通。佛经上也说:“未成佛道,先结人缘。”所谓结缘,就是和他人建立融洽的关系和良好的沟通。
    过去,有的人在路上点一盏路灯跟行人结缘,有人做个茶亭施茶与人结缘,有人造一座桥梁衔接两岸与人结缘,有人挖一口水井供养大众结缘,这些都是很可贵的善缘。只要人有善心,自然善缘处处在,善门处处开!
    (1)经济结缘
    有时候我们可以用一块钱跟别人结善缘,不但带给别人亲切感,甚至也许因此救了他人一条命。比如说公路上出了车祸,有人想打电话报案求援,偏偏只有钞票没有铜板,根本无法换钱,这时候你借他一元,马上救护车也来了,医生也来了,许多流血垂危的伤者都得到了及时救护,你这一块钱的善缘就广大无比了!

    【故事】一块银元
    抗战期间,有一位年轻战士赶赴沙场的途中,救了一位想要跳河自尽的妇人,妇人被救上岸之后,不但没有感谢青年,并且怪青年害她生不如死,在青年一再的询问之下,妇人才伤心欲绝地道出自尽的原因:原来她的丈夫遭人陷害入狱,家中留下年迈多病的高堂、以及三们嗷嗷待哺的稚子需要侍奉抚养,奈何家徒四壁,贫无立锥,只好将仅有的衣物典当得了一块银元,以治疗母亲的陈年痼疾,那知屋漏漏逢天下雨,奸诈的商人却以假的银元欺骗她,在这种断绝生路之下,只好一死以求了断。
    青年听了之后,油然升起恻隐之心,就对妇人说: “您的遭遇太值得同情了,我这里有一块银元,请您拿回去安顿家人,为了免得再危害及他人,请把假的银元给我吧!” 青年拿了假银元,不经意地随手往身上口袋一放,就出征去了。
    在一次激烈的战争中,枪林弹雨之下,一颗子弹朝青年的胸膛射来,正巧打在放着假银元的部位,假银元凹陷了下去,却救青年一命,青年于是拍手赞叹说: “太值得了!这一块钱真是千金难换啊!” 青年由于一念之善,以一块银元救了妇人一家人,也为自己挣回后半的人生。

    (2)语言结缘
    别人灰心的时候,你鼓励他一句话,对方就有绝处逢生的感觉;别人失望的时候,你赞美他一句话,他就会觉得人生可爱多了。所谓“一字之褒,荣于华衮;一字之贬,严于斧钺”,一句好话有时真可以使人我快乐、天地清平!
    (3)功德结缘
    一件小小的善事,一个小小的善心,都可以蔚成大功德。

    【故事】举手之劳的善事
    荷兰曾经有一个小孩子,傍晚从海边堤防走回家的时候,偶然发现堤防上有一个小洞,海水正慢慢的从洞口流出来,他一想:哎啊,这不得了!要是不赶快把它堵塞起来,明天这堤防就会溃决,海水会淹没整个城市的。这个子孩子一发善心,找不到东西堵塞,就用手指头去堵,他站在风雨中,从天黑等到天亮,整个晚上都等不到人,天亮以后才有人发现他僵冷的晕倒在堤防边,手指头还紧紧塞在洞里,大家才万分感动的知道他一根指头挽救了全城居民的生命财产。

    所以,“勿以恶小而为之,勿以善小而不为”,一个小小的善心,能够拯救无比的生命,成就无限的功德。
    (4)教育结缘
    我们也可以用自己知识或技术来和人结缘。常言道“授人以鱼,饱餐一顿;授人以渔,享用一生”。你今天教别人一点知识或技术,明天就会成为他立身处世的本领;常常一句睿智的语言,可能影响对方一生,成为他生活的指南和处世的依据。
    (5)微笑结缘
    一个微笑,一个眼神,举手投足之间,可能会带给别人带来意想不到的善缘。曾经有一个失业的青年徘徊在火车站前,望着车水马龙的繁华景色发楞,想找一个有钱人的座车撞上去自杀,以便让贫穷的老母亲得到一笔抚恤金过日子。正在他万念俱灰的时候,有一个高贵美丽的小姐经过他面前,对他微微一笑的点了个头,这个青年一高兴,倒忘了寻死了;第二天他居然得到了一份工作养家,更不想死了!可见,一个不经意的笑容的因缘是多么的巨大。
    (6)危机结缘
    谁都有危难的时候,谁都有最需要帮助的时候,在他人危难时刻帮上一把,在他人最需要的时候扶上一程,这一方面是我们做人的基本道德要求,也是我们广结善缘的大好时机。虽然很少有人能做到“人饥己饥,人溺己溺”的境界,但我们至少可以随时体察一下别人的需要,时刻关心朋友,帮助他们脱离困境,当朋友身患重病时,你应该多去探望,多谈谈朋友关心的感兴趣的话题;当朋友遭到挫折而沮丧时,你应该给予鼓励;当朋友愁眉苦脸,郁郁寡欢时,你应该亲切地询问他们。这些适时的安慰会像阳光一样温暖受伤者的心田,给他们希望。
    (7)邂逅结缘
    美国老牌影星寇克?道格拉斯年轻时十分落魄潦倒,有一回,他搭火车时,无意中与旁边的一位女士攀谈起来,没想到这一聊,竟聊出了他人生的转折点。没过几天,他就被邀请至制片厂报到,因为,这位女士竟是好莱坞著名制片人!这个故事的重点在于:机遇女神有时可能就是一个刚刚与你闲聊过的女人 !
    现在,你不妨静下心来想想看,你曾经有多少次与机遇女神擦肩而过?有时“贵人”可能不是一位女神,可能是那个需要你搀扶一下的老者。

    在当前十倍速知识经济时代,人脉已成为专业的支持体系。从现在起,累积你的“人脉存折”,经营你的人脉资源吧!对于个人来说,专业是利刃,人脉是秘密武器,如果光有专业,没有人脉,个人竞争力就是一分耕耘,一分收获。但若加上人脉,个人竞争力将是一分耕耘,数倍收获。
    正如美国的一句流行语所说“一个人能否成功,不在于你知道什么(what you know),而是在于你认识谁(whom you know)。”
    人脉是一个人通往财富、成功的入门票。两百年前,胡雪岩因为擅于经营人脉,而得以从一个倒夜壶的小差,翻身成为清朝的红顶商人。三百年后的今天,检视政界商界成功人物的成长轨迹,也都因为拥有一本雄厚的“人脉存折”,才有之后的辉煌的“成就存折”。

    浏览器 文化礼品 网站
    聚合到我的好诶网博告网 提供的广告
    展开全文
  • Java+学生信息管理系统+GUI+文件

    万次阅读 多人点赞 2019-07-05 20:10:03
    该系统可实现学生信息的增加,删除,修改,查询,并将学生信息存储在文件中 其中, 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以...

    朋友们啊,请仔细看博客哦,这个项目我完成的时候,确实是可以跑起来的,所有功能和效果基本都写在博客里了,代码资源也给上了(遇到好几个朋友私信问代码,我也是无奈了)。

    如果运行不起来,出现各种问题可能是因为版本,电脑环境等原因,这些可以在评论区讨论(我盲猜我爱莫能助),或者根据报错自行搜索。这个项目对于我来说有点久远了,当时做好后就写了这个博客,很多细节可能不太记得了,另外,我要转前端了哈哈哈(*^▽^*),所以搞Java的同学自己加油吧~遇到问题没什么,多百度,多看教程,你可以的!

    关于这个项目的私信和评论区我可能就不会怎么回了,评论区讨论的朋友如果知道怎么解决可以回一下哈,我呢就爱莫能助了O(∩_∩)O~

    我这简陋的成果只是给有需要的同学参考,希望同学们可以自己多动手,练练实践能力,编码能力是要自己去踩坑才能有提升的呀。

    另外,大部分项目是需要操作数据库的,但我当时做项目的时候,老师要求的是操作文件,需要操作数据库的朋友,自行研究一下吧,附上我的数据库学习博客:Java操作数据库-JDBC数据库

    项目代码资源下载地址:Student_Manage.zip

    因为CSDN的积分是自动调整的,且很多同学都没有积分,补充上了码云的代码仓库地址https://gitee.com/huan2515/student-manage.git

    附上“如何在码云Gitee中部署个人静态网站?git提交网站”地址:https://www.bilibili.com/read/cv6506359?share_medium=android&share_source=qq&bbid=XYA0AA2A7669743DD029D12A5C0A0B24B7524&ts=1608258917421

    我写的时候是用的eclipse,JDK8。

    这个项目只是当初我的一个很简陋的课程设计,还有很多可以提升的空间,很多的重复性源码也可以整理成为工具类,方便调用。参考借鉴的同学可以参考我这个项目,以节省时间和精力,多优化。

    最终项目结构:
    在这里插入图片描述

    1. 要求

    该系统可实现学生信息的增加,删除,修改,查询,筛选的功能。并将学生信息存储在文件txt 中,不会覆盖原数据。
    该系统没有利用数据库,是使用文件来存储学生数据,有基本的 UI 界面,操作友好,项目运行没有问题。

    2. 主函数

    package Student_Manage;
    
    public class Main {
    
    	 public static void main(String[] args) {
    		new Login();
    	    }
    }
    
    

    学生类

    package Student_Manage;
    
    public class student_information {
    	private String stuID;    /*  学生学号  */
    	private String name;     /* 学生姓名 */
    	private String sex;     /* 学生性别  */
        private String age;        /*  学生年龄  */
        private String callnumber;   /* 学生电话号码   */
        private String home_place;   /* 学生家庭住址,籍贯 */
        private String identityID;   /* 学生身份证号码 */
        
        /*无参构造函数*/
        public student_information() {
        
        }
        /*有参构造函数 */
        public student_information(String stuID,String name,String sex,String age,String callnumber,String home_place,String identityID) {
        	super();
        	this.stuID=stuID;
        	this.name=name;
        	this.sex=sex;
        	this.age=age;
        	this.callnumber=callnumber;
        	this.home_place=home_place;
        	this.identityID=identityID;
        }
        public String getStuID() {
        	return this.stuID;
        }
        public void setStuID(String stuID) {
        	this.stuID=stuID;
        }
        
        public String getName() {
        	return name;
        }
        public void setName(String name) {
        	this.name=name;
        }
        
        public String getSex() {
        	return this.sex;
        }
        public void setSex(String sex) {
        	this.sex=sex;
        }
        
        public String getAge() {
        	return this.age;
        }
        public void setAge(String age) {
        	this.age=age;
        }
        
        public String getCallnumber() {
        	return this.callnumber;
        }
        public void setCallnummber(String callnumber) {
        	this.callnumber=callnumber;
        }
        
        public String getHome_place() {
        	return this.home_place;
        }
        public void setHome_place(String home_place) {
        	this.home_place=home_place;
        }
        
        public String getIdentityID() {
        	return this.identityID;
        }
        public void setIdentityID(String identityID) {
        	this.identityID=identityID;
        }
        
        //从文件中录入的数据格式    "学号  姓名  性别  年龄  电话号码  家庭住址  身份证号码"  
        public String fileString()
    	{
    		return stuID+" "+name+" "+sex+" "+age+"  "+callnumber+"  "+home_place+"  "+identityID;
    	}
    
       
    }
    
    

    3. 静态登录界面实现

      登录界面还有完善的空间,可增加密码验证,通过管理员和学生账号的不同验证其身份,还可增加注册功能
    
    package Student_Manage;
    
    /**
     * 功能:学生成绩管理系统
     * 步骤1、登录界面的静态实现
     * author:ywq
     */
    import java.awt.*;
    import javax.swing.*;
    
    import java.awt.event.*;
    
    public  class Login extends JFrame implements  ActionListener{
    	//定义组件
    	JFrame frame=new JFrame();
    	JPanel jp1,jp2,jp3;//面板
    	JLabel jlb1,jlb2;//标签
    	JButton jb1,jb2;//按钮
    	
    	//构造函数
    	public Login(){
    		//创建面板
    		jp1=new JPanel();
    		jp2=new JPanel();
    		jp3=new JPanel();
    		//创建标签
    		jlb1=new JLabel("请按照你的身份选择登陆");
    		
    		//创建按钮
    		jb1=new JButton("信息管理人员");
    		jb2=new JButton("学生");
    				
    		//设置布局管理
    		frame.setLayout(new GridLayout(3, 1));//网格式布局
    		
    		//加入各个组件
    		jp1.add(jlb1);
    			
    		jp3.add(jb1);
    		jp3.add(jb2);
    		
    		//加入到JFrame
    		frame.add(jp2);
    		frame.add(jp1);
    		//this.add(jp2);
    		frame.add(jp3);
    		
    		//设置窗体
    		frame.setTitle("用户登录界面");//窗体标签
    		frame.setSize(400, 300);//窗体大小
    		frame.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出关闭JFrame
    		frame.setVisible(true);//显示窗体
    		
    		//锁定窗体
    		//this.setResizable(false);
    				
    		jb1.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    			   frame.setVisible(false);
    				new ManagerLogin();
    			}
    		});
    		
    		jb2.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    			   frame.setVisible(false);
    				new StudentLogin();
    			}
    		});
    		
    		
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		// TODO Auto-generated method stub
    		
    	}
    }
    
    

    效果图
    效果图

    4. 信息管理员登录界面

    该界面的标签,文本框等的位置还可以调整,使其更美观。
    
    package Student_Manage;
    
    //信息管理人员登陆后的界面
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.*;/*ArrayList;
    import java.util.Hashtable;
    */
    public class ManagerLogin extends JFrame implements  ActionListener{
    	
    	Function fun=new Function();
    	
    	//定义组件 
    	JLabel lb1=new JLabel("当前是信息管理人员登录界面" );//JLabel 对象可以显示文本、图像
    	JLabel lb2=new JLabel("提示:录入前请先输入学号,修改、删除根据学号修改信息");
    	
        JTextField 学号,姓名,年龄,电话号码,家庭住址,身份证号码;//输入学生基本信息得文本
        JRadioButton 男,女;//声明单选项对象,性别选择
        ButtonGroup group=null;//声明按钮组
        JButton 录入,查询,删除,修改,显示,返回;//声明相应的操作的按钮
        JPanel p1,p2,p3,p4,p5,p6,p7,pv,ph,pb;//调节布局的通道
        
        public ManagerLogin(){       //负责管理员登录的主窗口
            super("学生信息管理系统");
            学号=new JTextField(10);//创建文本信息的的对象
            姓名=new JTextField(10);
            电话号码=new JTextField(15);
            年龄=new JTextField(5);
            家庭住址=new JTextField(15);
            身份证号码=new JTextField(18);
            
            group=new ButtonGroup();
            男=new JRadioButton("男");//初始化单选框,
            女=new JRadioButton("女");
            group.add(男);//把按钮添加到按钮组
            group.add(女);
            录入=new JButton("增加学生信息");//创建按钮对象
            查询=new JButton("查询符合条件的学生信息");
            删除=new JButton("删除学生信息");
            修改=new JButton("修改学生信息");
            显示=new JButton("显示全部学生信息");
            返回=new JButton("返回登录界面");
        
            pb=new JPanel();
            pb.add(lb1,JLabel.CENTER);
                    
            p1=new JPanel();//创建一个面板     
           
            p1.add(lb2,JLabel.CENTER);
            p1.add(new JLabel("学号:",JLabel.CENTER));//JLabel.CENTER是指JLabel的中心点。CENTER是中心点的坐标
            p1.add(学号);
            
            p2=new JPanel();
            p2.add(new JLabel("姓名:",JLabel.CENTER));
            p2.add(姓名);
            p3=new JPanel();
            p3.add(new JLabel("性别:",JLabel.CENTER));
            p3.add(男);
            p3.add(女);
            p4=new JPanel();
            p4.add(new JLabel("年龄:",JLabel.CENTER));
            p4.add(年龄);
            p5=new JPanel();
            p5.add(new JLabel("电话号码:",JLabel.CENTER));
            p5.add(电话号码);    
            p6=new JPanel();
            p6.add(new JLabel("家庭住址:",JLabel.CENTER));
            p6.add(家庭住址);
            p7=new JPanel();
            p7.add(new JLabel("身份证号码:",JLabel.CENTER));
            p7.add(身份证号码);
           
            pv=new JPanel();//面板
            pv.setLayout(new GridLayout(7,1));   //把pv组件设置成第七行1列的网格布局
                
            pv.add(p1);//把面板放到容器中,add()代表容器
            pv.add(p2);
            pv.add(p3);
            pv.add(p4);
            pv.add(p5);
            pv.add(p6);
            pv.add(p7);
                   
            ph=new JPanel();      
            ph.add(录入);
            ph.add(查询);
            ph.add(修改);
            ph.add(删除);    
            ph.add(显示);
            ph.add(返回);
                   
            Container con=getContentPane();//建立容器对象con,取得容器面板
            con.setLayout(new BorderLayout());//设置布局为边框布局,边框布局分东南西北中5个方位来添加控件。
            //若没有指定方位,将添加到中间,上下左右都可以扩展
            con.add(pb, BorderLayout.NORTH);//Frame对象lb调用方法add(),lb放在最北上方     
            con.add(pv, BorderLayout.CENTER);//pv在中间
            con.add(ph, BorderLayout.SOUTH);//ph在南边
            setDefaultCloseOperation(EXIT_ON_CLOSE);//置一个默认的关闭操作,也就是你的JFrame窗口的关闭按钮,点击它时,退出程序
            setBounds(100,100,900,450);//setBounds(x,y,width,height); x:组件在容器X轴上的起点 y:组件在容器Y轴上的起点 width:组件的长度 height:组件的高度
            setVisible(true);//目的是使控件可以显示出来,如果该控件已经被显示出来
              
            student_information stu=new student_information();
            ArrayList<student_information> arry=new ArrayList<student_information>();
            //添加监听
            //点击录入按钮  学号","姓名","性别","年龄","电话号码","家庭住址","身份证号码"  
            录入.addActionListener(new ActionListener() {
        	   public void actionPerformed(ActionEvent e) {		     		     
        		 String sID = 学号.getText();    //获取文本框中内容
        		 if(fun.find(sID)!=-1)
        		 {
        			 JOptionPane.showMessageDialog(null, "该学号对应的学生已经存在!!!\n\n请重新输入或者修改已经录入的学生");   			 
        			  //清空文本框
        			 学号.setText("");
        			 姓名.setText("");
        			 年龄.setText("");
        			 电话号码.setText("");
        			 家庭住址.setText("");
        			 身份证号码.setText("");
        			 return;
        		 }      		 
        		 String sname = 姓名.getText();  		 
        		 //先判断学号和姓名是否为空,如果为空,直接退出
        		 if(sID.equals("")||sname.equals(""))
        		 {
        			 JOptionPane.showMessageDialog(null, "录入的学生学号或姓名为空!!!\n\n请重新输入");
        			 return;
        		 }  	   		 	 
          		 String sage = 年龄.getText();     		 
          		 if(sage.equals(""))//年龄为空,没有输入
       			    sage="--";  		 
          		 String scall = 电话号码.getText();
          		 if(scall.equals(""))
          			  scall="--";
          		 String shome = 家庭住址.getText();
          		if(shome.equals(""))
          		    shome="--";
          		 String siden = 身份证号码.getText();
          		if(siden.equals(""))
          		   siden="--";
          		 String ssex=null;
                 if(男.isSelected()){//选择男女
                    ssex=男.getText();
                 }
                 else{
                     ssex=女.getText();
                 }   
                
          		 stu.setStuID(sID);
          		 stu.setAge(sage);
          		 stu.setName(sname);
          		 stu.setSex(ssex);
          		 stu.setCallnummber(scall);
          		 stu.setHome_place(shome);
          		 stu.setIdentityID(siden);
          		 
          		 //arry.clear();//	清除原数组列表中的数据	
          		// Input input=new Input(stu);
          		 System.out.println("信息管理员");
          		 System.out.println(stu.fileString());
          		 
          		 fun.add(stu);
          		 fun.writefile();
          		 
          		 JOptionPane.showMessageDialog(null, "录入成功!!!");
          		 //dispose();
          		 setVisible(false); 
          		 new ManagerLogin();
          		 
          		  //清空文本框
          		 /*
    			学号.setText("");
    			姓名.setText("");
    			年龄.setText("");
    			电话号码.setText("");
    		    家庭住址.setText("");
    			身份证号码.setText("");
    			group.clearSelection();   //清空按钮已选状态
    			*/
        	   }   	   
           });
            
                       
           //显示全部学生信息
              显示.addActionListener(new ActionListener() {
         	   public void actionPerformed(ActionEvent e) {     		   
         		   //show_stuall all=new show_stuall();     
         		   new show_stuall();   		     		   
         	    }	     		   
              });
                          
            //查询某个学生信息       
            查询.addActionListener(new ActionListener() {
            	   public void actionPerformed(ActionEvent e) {      		  
            		   String sID = 学号.getText();    //获取文本框中内容 
            		   if(sID.equals(""))
            		     sID="--";       		   
              		  String sname = 姓名.getText();  		 
              		  if(sname.equals(""))
            			   sname="--";      		 	 
                	  String sage = 年龄.getText();     		 
                	  if(sage.equals(""))             //年龄为空,没有输入
             			    sage="--";  		 
                	  String scall = 电话号码.getText();
                	 if(scall.equals(""))
                			  scall="--";
                		 String shome = 家庭住址.getText();
                		if(shome.equals(""))
                		    shome="--";
                		 String siden = 身份证号码.getText();
                		if(siden.equals(""))
                		   siden="--";
                		 String ssex=null;
                       if(男.isSelected()){//选择男女
                          ssex=男.getText();
                       }
                       else {
                    	    if(女.isSelected())
                             ssex=女.getText();
                           else {
    						  ssex="--";
    					   }
                       }          		            
            	 		 //将要查询的符合条件的写入文件
            	 		FileWriter fw=null;
        				BufferedWriter out=null;//学号","姓名","性别","年龄","电话号码","家庭住址","身份证号码" };
        				try {
        					 fw = new FileWriter("查询时暂时存放的文件.txt");
        					 out = new BufferedWriter(fw);
        					 //姓名学号等中间隔一个空格
        					 out.write(sID+"  ");
        					 out.write(sname+"  ");
        					 out.write(ssex+"  ");
        					 out.write(sage+"  "); 					   					 
        					 out.write(scall+"  ");
        					 out.write(shome+"  ");
        					 out.write(siden+"  "); //每次覆盖写入,无需全部保存
        				   					 
        					out.close();
        					fw.close();
        						
        				} catch (IOException e1) {
        					e1.printStackTrace();
        					
        				}     				
        				//开始查询
        				new showones();  
        				
        				//清空文本框
        				学号.setText("");
        				姓名.setText("");
        				年龄.setText("");
        				电话号码.setText("");
        			    家庭住址.setText("");
        				身份证号码.setText("");
        				group.clearSelection();
        				
            	    }	     		   
                 }); 
           
     
           
           //删除学生信息,按学号删除
              删除.addActionListener(new ActionListener() {
            	   public void actionPerformed(ActionEvent e) {
            		   String sID = 学号.getText();    //获取文本框中内容
            		   int flag=fun.find(sID);
            		   if(flag==-1)
            		   {
            			   JOptionPane.showMessageDialog(null, "未查找到该学号的学生!!!\n\n请重新输入");       			    
            		   }
            		   else {
    					 fun.delete(sID); 
            		     fun.writefile();
            		     JOptionPane.showMessageDialog(null, "删除成功!!!\n");
    				 }
           		
            		   //清空文本框
           			学号.setText("");
           			姓名.setText("");
           			年龄.setText("");
           			电话号码.setText("");
           		    家庭住址.setText("");
           			身份证号码.setText("");
           			group.clearSelection();
            		   
            	    }	     		   
                 });       
              
              //修改学生信息
              修改.addActionListener(new ActionListener() {
              	   public void actionPerformed(ActionEvent e) {
              		  String sID = 学号.getText();    //获取文本框中内容
              		 int flag=fun.find(sID);    //查找是否存在      		
             		 if (flag==-1)
             		 {
         			   JOptionPane.showMessageDialog(null, "未查找到该学号的学生!!!\n\n请重新输入");
          			   return;  
         		    }    
             		else
          			   JOptionPane.showMessageDialog(null, "该系统中存在该学生数据\n\n,确认返回后请输入需要修改后的数据");
           			 		    		     		 
              		 String sage = 年龄.getText();     		 
              		 if(sage.equals(""))//年龄为空,没有输入
           			    sage="--";  		 
              		 String scall = 电话号码.getText();
              		 if(scall.equals(""))
              			  scall="--";
              		 String shome = 家庭住址.getText();
              		if(shome.equals(""))
              		    shome="--";
              		 String siden = 身份证号码.getText();
              		if(siden.equals(""))
              		   siden="--";
              		 String ssex=null;
                     if(男.isSelected()){//选择男女
                        ssex=男.getText();
                     }
                     else{
                         ssex=女.getText();
                     }   
                     String sname = 姓名.getText();  		 
            		 //先判断学号和姓名是否为空,如果为空,直接退出
            		 if(sname.equals(""))
            		 {
            			 JOptionPane.showMessageDialog(null, "录入的学生姓名为空!!!\n\n请重新输入");
            			 return;
            		 }  	
            		// student_information stu=new student_information();
              		 stu.setStuID(sID);
              		 stu.setAge(sage);
              		 stu.setName(sname);
              		 stu.setSex(ssex);
              		 stu.setCallnummber(scall);
              		 stu.setHome_place(shome);
              		 stu.setIdentityID(siden);
             		 
              		 fun.update(stu);       //修改
              		 fun.writefile();
              		 JOptionPane.showMessageDialog(null, "修改成功!!!");
              		  //清空文本框
         			学号.setText("");
         			姓名.setText("");
         			年龄.setText("");
         			电话号码.setText("");
         		    家庭住址.setText("");
         			身份证号码.setText("");
         			group.clearSelection();	 		 			          		         		 
              	    }	     		             	   
                   });
                            
        返回.addActionListener(new ActionListener() {
    		public void actionPerformed(ActionEvent e) {
    			setVisible(false);      //目的是使控件不可以显示出来
    			new Login();
    		}
    	});
         }
    
    	@Override
    	public void actionPerformed(ActionEvent arg0) {
    		// TODO Auto-generated method stub
    		
    	}
    
    }
    
    

    效果图
    在这里插入图片描述

    5. 学生登录界面

    	package Student_Manage;
    	
    	//学生登陆后的界面
    	import java.awt.*;
    	import javax.swing.*;
    	import java.awt.event.*;
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.*;/*ArrayList;
    	import java.util.Hashtable;
    	*/
    public  class StudentLogin extends JFrame implements  ActionListener{
    		
    		Function fun=new Function();		
    		//定义组件 
    		JLabel lb1=new JLabel("当前是学生登录界面" );//JLabel 对象可以显示文本、图像
    		JLabel lb2=new JLabel("提示:录入前请先输入学号,修改、删除根据学号修改信息");
    	    JTextField 学号,姓名,年龄,电话号码,家庭住址,身份证号码;//输入学生基本信息得文本
    	    JRadioButton 男,女;//声明单选项对象,性别选择
    	    ButtonGroup group=null;//声明按钮组
    	    JButton 录入,查询,删除,修改,显示,返回;//声明相应的操作的按钮
    	    JPanel p1,p2,p3,p4,p5,p6,p7,pv,ph,pb;//调节布局的通道
    	    
    	    student_information stu=new student_information();
    	    ArrayList<student_information> arry=new ArrayList<>();
    	    
    	    public StudentLogin(){       //负责管理员登录的主窗口
    	        super("学生信息管理系统");
    	        学号=new JTextField(10);//创建文本信息的的对象
    	        姓名=new JTextField(10);
    	        电话号码=new JTextField(15);
    	        年龄=new JTextField(5);
    	        家庭住址=new JTextField(15);
    	        身份证号码=new JTextField(18);
    	        
    	        group=new ButtonGroup();
    	        男=new JRadioButton("男");//初始化单选框,
    	        女=new JRadioButton("女");
    	        group.add(男);//把按钮添加到按钮组
    	        group.add(女);
    	        //录入=new JButton("增加学生信息");//创建按钮对象
    	        查询=new JButton("查询某个学生信息");
    	        //删除=new JButton("删除学生信息");
    	       // 修改.setEnabled(false);   //设置修改控件不可用
    	        //修改=new JButton("修改学生信息"); 
    	        显示=new JButton("显示全部学生信息");
    	        返回=new JButton("返回登录界面");
    	    
    	        pb=new JPanel();
    	        pb.add(lb1,JLabel.CENTER);
    	                
    	        p1=new JPanel();//创建一个面板     
    	        //p1.setLayout(new GridLayout(3,0));
    	        p1.add(lb2,JLabel.CENTER);
    	        p1.add(new JLabel("学号:",JLabel.CENTER));//JLabel.CENTER是指JLabel的中心点。CENTER是中心点的坐标
    	        p1.add(学号);
    	        
    	        p2=new JPanel();
    	        p2.add(new JLabel("姓名:",JLabel.CENTER));
    	        p2.add(姓名);
    	        p3=new JPanel();
    	        p3.add(new JLabel("性别:",JLabel.CENTER));
    	        p3.add(男);
    	        p3.add(女);
    	        p4=new JPanel();
    	        p4.add(new JLabel("年龄:",JLabel.CENTER));
    	        p4.add(年龄);
    	        p5=new JPanel();
    	        p5.add(new JLabel("电话号码:",JLabel.CENTER));
    	        p5.add(电话号码);    
    	        p6=new JPanel();
    	        p6.add(new JLabel("家庭住址:",JLabel.CENTER));
    	        p6.add(家庭住址);
    	        p7=new JPanel();
    	        p7.add(new JLabel("身份证号码:",JLabel.CENTER));
    	        p7.add(身份证号码);
    	       
    	        pv=new JPanel();//面板
    	        pv.setLayout(new GridLayout(7,1));   //把pv组件设置成第七行1列的网格布局
    	            
    	        pv.add(p1);//把面板放到容器中,add()代表容器
    	        pv.add(p2);
    	        pv.add(p3);
    	        pv.add(p4);
    	        pv.add(p5);
    	        pv.add(p6);
    	        pv.add(p7);
    	               
    	        ph=new JPanel();      
    	       // ph.add(录入);
    	        ph.add(查询);
    	       // ph.add(修改);
    	       // ph.add(删除);    
    	        ph.add(显示);
    	        ph.add(返回);
    	               
    	        Container con=getContentPane();//建立容器对象con,取得容器面板
    	        con.setLayout(new BorderLayout());//设置布局为边框布局,边框布局分东南西北中5个方位来添加控件。
    	        //若没有指定方位,将添加到中间,上下左右都可以扩展
    	        con.add(pb, BorderLayout.NORTH);//Frame对象lb调用方法add(),lb放在最北上方     
    	        con.add(pv, BorderLayout.CENTER);//pv在中间
    	        con.add(ph, BorderLayout.SOUTH);//ph在南边
    	        setDefaultCloseOperation(EXIT_ON_CLOSE);//置一个默认的关闭操作,也就是你的JFrame窗口的关闭按钮,点击它时,退出程序
    	        setBounds(100,100,900,450);//setBounds(x,y,width,height); x:组件在容器X轴上的起点 y:组件在容器Y轴上的起点 width:组件的长度 height:组件的高度
    	        setVisible(true);//目的是使控件可以显示出来,如果该控件已经被显示出来
    	          
    	        //添加监听        
    	       //显示全部学生信息
    	          显示.addActionListener(new ActionListener() {
    	     	   public void actionPerformed(ActionEvent e) {     		   
    	     		  new show_stuall();   	
    	     		   
    	     	    }	     		   
    	          });
    	          
    	          //查询某个学生信息       
    	          查询.addActionListener(new ActionListener() {
    	          	   public void actionPerformed(ActionEvent e) {      		  
    	          		   String sID = 学号.getText();    //获取文本框中内容 
    	          		   if(sID.equals(""))
    	          		     sID="--";       		   
    	            		  String sname = 姓名.getText();  		 
    	            		  if(sname.equals(""))
    	          			   sname="--";      		 	 
    	              	  String sage = 年龄.getText();     		 
    	              	  if(sage.equals(""))             //年龄为空,没有输入
    	           			    sage="--";  		 
    	              	  String scall = 电话号码.getText();
    	              	 if(scall.equals(""))
    	              			  scall="--";
    	              		 String shome = 家庭住址.getText();
    	              		if(shome.equals(""))
    	              		    shome="--";
    	              		 String siden = 身份证号码.getText();
    	              		if(siden.equals(""))
    	              		   siden="--";
    	              		 String ssex=null;
    	              		if(男.isSelected()){//选择男女
    	                        ssex=男.getText();
    	                     }
    	                     else {
    	                  	    if(女.isSelected())
    	                           ssex=女.getText();
    	                         else {
    	  						  ssex="--";
    	  					   }
    	                     }          	
    	              		            
    	          	 		 //将要查询的符合条件的写入文件
    	          	 		FileWriter fw=null;
    	      				BufferedWriter out=null;  //学号","姓名","性别","年龄","电话号码","家庭住址","身份证号码" };
    	      				try {
    	      					 fw = new FileWriter("查询时暂时存放的文件.txt");
    	      					 out = new BufferedWriter(fw);
    	      					 //姓名学号等中间隔一个空格
    	      					 out.write(sID+"  ");
    	      					 out.write(sname+"  ");
    	      					 out.write(ssex+"  ");
    	      					 out.write(sage+"  "); 					   					 
    	      					 out.write(scall+"  ");
    	      					 out.write(shome+"  ");
    	      					 out.write(siden+"  "); //每次覆盖写入,无需全部保存
    	      				   					 
    	      					out.close();
    	      					fw.close();
    	      						
    	      				} catch (IOException e1) {
    	      					e1.printStackTrace();
    	      					
    	      				}     				
    	      				//开始查询
    	      				new showones();  
    	      				
    	      				//清空文本框
    	      				学号.setText("");
    	      				姓名.setText("");
    	      				年龄.setText("");
    	      				电话号码.setText("");
    	      			    家庭住址.setText("");
    	      				身份证号码.setText("");
    	      				group.clearSelection();
    	      				
    	          	    }	     		   
    	               }); 	   
    
    	    返回.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				setVisible(false);      //目的是使控件不可以显示出来
    				new Login();
    			}
    		});
      }
    
    		@Override
    		public void actionPerformed(ActionEvent e) {
    			// TODO Auto-generated method stub
    			
    		}
    }
    
    

    效果图
    在这里插入图片描述

    6. 增加,删除,修改功能

    package Student_Manage;
    
    import java.io.*;
    import java.util.*;
    
    
    //修改,删除,增加某个学生信息
    
    class Function {
    	
    	//本程序学生数量不多,用数组列表ArrayList,  当学生数据多的时候,考虑用链表
        ArrayList<student_information> arry=new ArrayList<student_information>();  			
    	public Function()           //读文件,将文件中的学生信息存放在数组列表
    	{
    		this.readfile();
    	}
    	//根据学号查找学生信息,找到返回学号,找不到返回-1
    	public int find(String str) 
    	{		
    	    for (int i = 0; i<arry.size(); i++)
    	      if (arry.get(i).getStuID().equals(str))
    						return i;//等于在数组列表的位置
    			return -1;
    	}	
    	
    	//修改学生信息
    	public void update(student_information stu) {
    		int flag=find(stu.getStuID());    //查找是否存在
    		arry.set(flag, stu);		   //替换 flag 处的学生信息
    	}	
    	// 读文件,
    	public boolean readfile() {					 
    			String t=null;
    			try{
    				FileReader f1 = new FileReader("student.txt");
    				BufferedReader br=new BufferedReader(f1);				
    				arry.clear();    //	清除原数组列表中的数据				
    				while ((t= br.readLine())!= null)
    					{
    					  String [] s=t.split("\\s+");				 
    					  student_information st=new student_information(s[0],s[1],s[2],s[3],s[4],s[5],s[6]);//注意若该文件每行没有七个字符串,则会出错
    					  arry.add(st);
    					  System.out.println("读取文件:");
    					  System.out.println(s[0]);
    					}
    				     f1.close();
    				     br.close();				     
    				     return true;
    					} catch (IOException e) {
    							// TODO 自动生成的 catch 块
    					e.printStackTrace();
    					return false;
    				}	
    		     }					
    	//添加学生信息	
    	public boolean add(student_information stu)
    	     {		
    		System.out.println();	
    		System.out.println("要添加的学生");	
    		System.out.println(stu.fileString());
    		System.out.println();
    		if (find(stu.getStuID())!=-1)
    			return false;		
    		arry.add(stu); 
    		return true;			
    	}
    	
    	//写注意每行必须有七个元素,否则读取文件并判断是否存在时会出错时会出错,没有输入的用---代替
    	public boolean writefile() {
    				FileWriter fw=null;
    				BufferedWriter out=null;
    				try {
    					 fw = new FileWriter("student.txt");    
    					 out = new BufferedWriter(fw);
    					 //姓名学号等中间隔一个空格
    						for(int i=0;i<arry.size();i++){
    							String s=arry.get(i).fileString();
    							System.out.println("数组列表数据:");
    							System.out.println(arry.get(i).fileString());
    					    	out.write(s);
    					    	out.newLine();
    					    }
    						out.close();
    						fw.close();
    						return true;
    				} catch (IOException e) {
    					e.printStackTrace();
    					return false;
    				}
    		   }
    	
    	//删除学生信息,并且文件中的内容也要修改
    	public boolean delete(String s)	//添加学生记信息
    	{  
    		int pos=find(s);
    		if (pos==-1)
    			return false;
    		
    		arry.remove(pos);    
    		return true;
    	}
    	
    		
    /*
    	//删除学生信息,并且重写文件内容					
    	 public boolean delete(String s) {	
    		        File file =new File("student.txt");
    		        try {
    		            if(!file.exists()) {
    		                file.createNewFile();
    		            }
    		            FileWriter fileWriter =new FileWriter(file);
    		            fileWriter.write("");
    		            fileWriter.flush();
    		            fileWriter.close();		            
    	    			int flag=find(s);		    		
    		    		System.out.print(flag);
    		    		arry.remove(flag);  		    		
    		    		writefile();
    		    		return true;	            
    		        } catch (IOException e) {
    		            e.printStackTrace();
    		            return false;
    		        }				
    		    }
    		    */		
    }			
    

    增加功能的效果图
    在这里插入图片描述
    删除功能的效果图
    在这里插入图片描述
    修改功能的效果图

      修改,输入某个学生的学号及修改之后的信息,按照学号查找该学生并且将修改之后的信息录入系统
      修改功能还可以进一步完善,例如只修改某个条件,而无需输入所有信息
    

    在这里插入图片描述
    在这里插入图片描述
    删除功能的效果图

    删除功能是通过输入学号,按照学号查找,查找到之后在系统中删除该学生
    

    在这里插入图片描述

    7. 查询和筛选功能

    • 显示系统中所有学生的信息
    package Student_Manage;
    
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    import javax.swing.table.TableRowSorter;
    
    import java.io.*;
    
    import java.util.ArrayList;
    import java.util.Vector;
    
    //读取学生信息,展示在窗口
    
    public class show_stuall {	
    	
    	JTable table = null;
        DefaultTableModel model = null;
    	//显示全部学生信息
       public show_stuall() {
    	    JFrame jf = new JFrame("显示全部学生信息(点击表头可以按照升序降序排序)");	   
    	    // 创建内容面板
    	     JPanel panel = new JPanel();
    	    // 表头(列名)
    	   Vector columnNames=createColumnNames();
    	   Vector data=createTableModelData();	   
    	 // 创建一个默认的表格模型
    	    model = new DefaultTableModel(data, columnNames);
    	   table = new JTable(model);
           table.setPreferredScrollableViewportSize(new Dimension(400, 80));
           JScrollPane tablePanel = new JScrollPane(table);  				        
    	        // 设置表格内容颜色
    	        table.setForeground(Color.BLACK);                   // 字体颜色
    	        table.setFont(new Font(null, Font.PLAIN, 14));      // 字体样式
    	        table.setSelectionForeground(Color.DARK_GRAY);      // 选中后字体颜色
    	        table.setSelectionBackground(Color.LIGHT_GRAY);     // 选中后字体背景
    	        table.setGridColor(Color.GRAY);                     // 网格颜色
    
    	        // 设置表头
    	        table.getTableHeader().setFont(new Font(null, Font.BOLD, 14));  // 设置表头名称字体样式
    	        table.getTableHeader().setForeground(Color.RED);                // 设置表头名称字体颜色
    	        table.getTableHeader().setResizingAllowed(false);               // 设置不允许手动改变列宽
    	        table.getTableHeader().setReorderingAllowed(false);             // 设置不允许拖动重新排序各列
    
    	        // 设置行高
    	        table.setRowHeight(40);
    
    	        // 第一列列宽设置为40
    	        table.getColumnModel().getColumn(0).setPreferredWidth(40);
                 
    	        // 设置滚动面板视口大小(超过该大小的行数据,需要拖动滚动条才能看到)
    	        table.setPreferredScrollableViewportSize(new Dimension(900, 320));
    	        
    	        //排序器	        
    	        RowSorter sorter = new TableRowSorter(model);
    	        table.setRowSorter(sorter);
    	        JScrollPane pane = new JScrollPane(table);      
    
    	        // 把 表格 放到 滚动面板 中(表头将自动添加到滚动面板顶部)
    	        JScrollPane scrollPane = new JScrollPane(table);
    
    	        // 添加 滚动面板 到 内容面板
    	        panel.add(scrollPane);
    	       // JScrollPane pane = new JScrollPane(table);
    	        // 设置 内容面板 到 窗口
    	        jf.setContentPane(panel);
    	        jf.pack();
    	        jf.setSize(900, 600);
    	        jf.add(scrollPane, BorderLayout.CENTER);
    	        
    	        //数据居中显示
    	        DefaultTableCellRenderer r = new DefaultTableCellRenderer();   
    			r.setHorizontalAlignment(JLabel.CENTER);   
    			table.setDefaultRenderer(Object.class, r);
    			
    	        jf.setLocationRelativeTo(null);
    	        int t=table.getRowCount();
    	        if(t<=0){
    	        	JOptionPane.showMessageDialog(null, "该系统中还没有录入学生信息!!!");
    	        	jf.setVisible(false);
    	        }
    	        else {
    	        	jf.setVisible(true);
    	        }	 
    	    }
        
         private Vector createColumnNames() {
           Vector columnNames = new Vector();
           //columnNames.add("序号");
           columnNames.add("学号");
           columnNames.add("姓名");
           columnNames.add("性别");
           columnNames.add("年龄");
           columnNames.add("电话号码");
           columnNames.add("家庭住址");
           columnNames.add("身份证号码");
           
           return columnNames;
       }
       
         private Vector createTableModelData() {
            
             Vector data = new Vector();
             String t=null;
    			try{
    				FileReader f1 = new FileReader("student.txt");
    				BufferedReader br=new BufferedReader(f1);				
    				//arry.clear();//	清除原数组列表中的数据
    				int i=0;
    				while ((t= br.readLine())!= null)
    					{
    					  String [] s=t.split("\\s+");		//通过空格分割字符串数组					  
    					  Vector rowData = new Vector();
    				
    					  //rowData.add("i");				  
    					  rowData.add(s[0]);					  
    					  rowData.add(s[1]);
    					  rowData.add(s[2]);
    					  rowData.add(s[3]);
    					  rowData.add(s[4]);			  
    					  rowData.add(s[5]);   
    					  rowData.add(s[6]);				  
    					  data.add(rowData);					  
    					 // System.out.print(s[6]);					  
    					  i++;					   
    					}
    				     f1.close();
    				     br.close();			     
    				     
    					} catch (IOException e) {
    							// TODO 自动生成的 catch 块
    					e.printStackTrace();
    					
    				}	  
            return data;
         }   
    }
    	       
    

    效果图

    当前按照学号升序排序,点击表头,可以按照升序,降序排序
    

    在这里插入图片描述

    • 筛选系统中符合条件的学生信息
    package Student_Manage;
    
    import javax.management.modelmbean.ModelMBean;
    import javax.swing.*;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    import javax.swing.table.TableRowSorter;
    
    import java.awt.*;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.Vector;
    
    
    public class showones {	
    	//读取学生信息,展示在窗口
    		
    		ArrayList<student_information> arry=new ArrayList<student_information>();
    		student_information stu=new student_information();
    		JTable table = null;
    	    DefaultTableModel model = null;
    		//显示全部学生信息
    	   public showones() {
    		    JFrame jf = new JFrame("显示符合条件的学生信息(点击表头可以按照升序降序排序");
    		    //jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    		    // 创建内容面板
    		     JPanel panel = new JPanel();
    		    // 表头(列名)
    		  //  String[] columnNames ={"序号","学号","姓名","性别","年龄","电话号码","家庭住址","身份证号码" };  	
    		    Vector columnNames=createColumnNames();	    
    		    //需要查询的符合条件的,用字符串数组f记录		       
    			 String [] f = new String [7];
    				try{
    					FileReader f1 = new FileReader("查询时暂时存放的文件.txt");
    					BufferedReader br=new BufferedReader(f1);				
    					//arry.clear();//	清除原数组列表中的数据
    					String t=null;
    					while ((t= br.readLine())!= null)
    						{
    						  f=t.split("\\s+");			//要查询的学生信息	 
    						}
    					
    										
    				  f1.close();
    				  br.close();				  				  
    					} catch (IOException e) {
    								// TODO 自动生成的 catch 块
    					e.printStackTrace();						
    					}
    								
    				//记得清空,否则下次查询没有筛选条件时,查询的是上一次的条件
    				 File file =new File("查询时暂时存放的文件.txt");
    			        try {
    			            if(!file.exists()) {
    			                file.createNewFile();
    			            }
    			            FileWriter fileWriter =new FileWriter(file);
    			            fileWriter.write("");
    			            fileWriter.flush();
    			            fileWriter.close();			    		            
    			        } catch (IOException e) {
    			            e.printStackTrace();			         
    			        }		
    			    
    				//判断需要查询的是那些条件				
    				ArrayList List = new ArrayList(); 
    				for(int i=0;i<7;i++) {
    					if(!f[i].equals("--"))     //需要满足的条件
    						List.add(i); 							
    				}
    				//将满足查询条件的学生信息录入系统				 
    				for(int i=0;i<List.size();i++)
    					System.out.println(List.get(i));
    				try{
    						FileReader f1 = new FileReader("student.txt");
    						BufferedReader br=new BufferedReader(f1);
    						String t=null;
    						int flag=0;
    				        int t1=0;
    				        
    						arry.clear();//	清除原数组列表中的数据					
    						while ((t= br.readLine())!= null)
    							{
    							  String [] s=t.split("\\s+");		
    							 for(int i=0;i<List.size();i++)
    							 {
    								 t1=(int) List.get(i);
    								 if(f[t1].equals(s[t1])) {
    									 flag=flag+1;
    								 }
    							 }
    							  if(flag==List.size()) {
    								student_information st=new student_information(s[0],s[1],s[2],s[3],s[4],s[5],s[6]);//注意若该文件每行没有七个字符串,则会出错
    								 arry.add(st);
    							  }							  
    							  flag=0;
    							  
    							}
    						     f1.close();
    						     br.close();						     						     
    							} catch (IOException e) {
    									// TODO 自动生成的 catch 块
    							e.printStackTrace();				
    						}	
    		    	 				
    				Vector data=createTableModelData();
    				
    				// 创建一个默认的表格模型
    			    model = new DefaultTableModel(data, columnNames);
    			   table = new JTable(model);
    		       table.setPreferredScrollableViewportSize(new Dimension(400, 80));
    		       JScrollPane tablePanel = new JScrollPane(table);  
    				
    				
    		        // 设置表格内容颜色
    		        table.setForeground(Color.BLACK);                   // 字体颜色
    		        table.setFont(new Font(null, Font.PLAIN, 14));      // 字体样式
    		        table.setSelectionForeground(Color.DARK_GRAY);      // 选中后字体颜色
    		        table.setSelectionBackground(Color.LIGHT_GRAY);     // 选中后字体背景
    		        table.setGridColor(Color.GRAY);                     // 网格颜色
    
    		        // 设置表头
    		        table.getTableHeader().setFont(new Font(null, Font.BOLD, 14));  // 设置表头名称字体样式
    		        table.getTableHeader().setForeground(Color.RED);                // 设置表头名称字体颜色
    		        table.getTableHeader().setResizingAllowed(false);               // 设置不允许手动改变列宽
    		        table.getTableHeader().setReorderingAllowed(false);             // 设置不允许拖动重新排序各列
    
    		        // 设置行高
    		        table.setRowHeight(40);
    
    		        // 第一列列宽设置为40
    		        table.getColumnModel().getColumn(0).setPreferredWidth(40);
    	             
    		        // 设置滚动面板视口大小(超过该大小的行数据,需要拖动滚动条才能看到)
    		        table.setPreferredScrollableViewportSize(new Dimension(900, 320));
    		        //排序器	        
    		        RowSorter sorter = new TableRowSorter(model);
    		        table.setRowSorter(sorter);
    		        JScrollPane pane = new JScrollPane(table);      
    
    		        // 把 表格 放到 滚动面板 中(表头将自动添加到滚动面板顶部)
    		        JScrollPane scrollPane = new JScrollPane(table);
    
    		        // 添加 滚动面板 到 内容面板
    		        panel.add(scrollPane);
    		       // JScrollPane pane = new JScrollPane(table);
    		        // 设置 内容面板 到 窗口
    		        jf.setContentPane(panel);
    		        jf.pack();
    		        jf.setSize(900, 600);
    		        jf.add(scrollPane, BorderLayout.CENTER);
    		        //数据居中显示
    		        DefaultTableCellRenderer r = new DefaultTableCellRenderer();   
    				r.setHorizontalAlignment(JLabel.CENTER);   
    				table.setDefaultRenderer(Object.class, r);
    				
    				jf.setLocationRelativeTo(null);
    				int t=arry.size();
    				 //int t=table.getRowCount();
    			        if(t<=0){
    			        	JOptionPane.showMessageDialog(null, "该系统中没有符合条件的学生!!!");
    			        	jf.setVisible(false);
    			        }
    			        else {
    			        	jf.setVisible(true);
    			        }
    		    }
         private Vector createColumnNames() {
           Vector columnNames = new Vector();
           //columnNames.add("序号");
           columnNames.add("学号");
           columnNames.add("姓名");
           columnNames.add("性别");
           columnNames.add("年龄");
           columnNames.add("电话号码");
           columnNames.add("家庭住址");
           columnNames.add("身份证号码");
        
           return columnNames;
           }
    
         private Vector createTableModelData() {
        	 Vector data = new Vector();    	     	
             for(int i=0;i<arry.size();i++) {       	 
    	    	 Vector<String> rowData=new Vector<>();	    	
    	    	 rowData.add(arry.get(i).getStuID());
    	    	 rowData.add(arry.get(i).getName());
    	    	 rowData.add(arry.get(i).getSex());
    	    	 rowData.add(arry.get(i).getAge());
    	    	 rowData.add(arry.get(i).getCallnumber());
    	    	 rowData.add(arry.get(i).getHome_place());
    	    	 rowData.add(arry.get(i).getIdentityID());			    	 		    					  
        		 data.add(rowData);
        					  	    							   
    		  }	   
             return data;
    	  }  
        
    }
    
    

    例如查询名字为Q的男生
    效果图

    在这里插入图片描述
    在这里插入图片描述

     当没有输入任何条件时,点击该筛选按钮,即显示所有的学生信息
    

    PS:插件推荐 windowbuilder

    该插件对于GUI设计有很大帮助,具体安装和下载可以查看别的教程

    展开全文
  • 不会吧不会吧,你还在买学生机吗? @阿里云高校学生计划

    写在前面


    本来打算写手把手的那种教程,有手就行,但是没有其他的账号了,不能复盘完全过程和截图了。
    在这里插入图片描述
    LAMP/LNMP 系列环境搭建:
    学生党白嫖服务器-不会吧不会吧,你还在买学生机吗?
    Apache安装配置(Windows和Linux)-有手就行
    Linux安装配置MySql-你学废了吗?
    PHP安装配置(Windows和Linux)-一篇就够了
    Nginx安装配置(Window和Linux)-包教包会
    Tomcat安装配置(Window和Linux)-保姆教程

    我知道有集成软件和宝塔什么的,但我想一步步来,知其然知其所以然,被支配的恐惧。

    在这里插入图片描述

    阿里云高校学生计划


    阿里云高校学生计划 https://developer.aliyun.com/adc/student/
    每日8点开始领取,暂没有找到活动时间,应该是长期的,同时如果已有阿里云服务器实例将不能参加,可以等到期后删除实例再来,记得收藏~

    1、登录并完成学生认证

    在这里插入图片描述

    2、测试

    测试答案,直接Ctrl+F查找即可

    • WEB2.0时代黑客攻击的主要目标集中在(A
      A. 互联网应用
      B. 穿透防火墙
      C. 破坏操作系统
      D. 计算机硬件

    • 以下常见的通讯协议中,不属于应用层协议的有(B
      A. FTP
      B. TCP/IP
      C. HTTP
      D. SMTP

    • 数据库管理系统是(B
      A. 操作系统的一部分
      B. 在操作系统支持下的系统软件
      C. 一种编译系统
      D. 一种操作系统

    • XaaS是(C)的缩写。
      A. Infrastructure as a service
      B. Patform as a service
      C. Anything as a service
      D. Containers as a Service

    • 逻辑题:B、C、X为不等的数,当B大于C时,X小于C;但是C绝不会大于B。下面描述正确的是(A
      A. X绝对不会大于B
      B. X绝对不会小于B
      C. X绝对不会小于C

    • 阿里云云服务器ECS是一种简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本。ECS属于 (C
      A. SaaS(软件即服务)
      B. PaaS(平台即服务)
      C. IaaS(基础设施即服务)
      D. DaaS(数据即服务)

    • HTTPS协议在互联网应用中起到的安全作用是(B
      A. 保存到WEB服务器上的数据会自动加密
      B. 确保浏览器与WEB服务器之间的数据传输安全
      C. 确保WEB服务器端的数据不会被篡改
      D. 减少SQL注入的风险

    • SQL语言的功能包括(B
      A. 关系规范化、数据操纵、数据控制
      B. 数据定义、数据操纵、数据控制
      C. 数据定义、关系规范化、数据控制
      D. 数据定义、关系规范化、数据操纵

    • 在数据库中,空值是指( C
      A. 数值0
      B. 空的字符串
      C. 未知的值
      D. 任何值

    • IaaS是(B)的缩写
      A. Platform as a service
      B. Infrastructure as a service
      C. Fuction as service
      D. Software as service

    • 阿里云云服务器ECS的英文全称是(A
      A. Elastic Compute Service
      B. Elastic Compute Server
      C. Elastic Container Service
      D. Elastic Computer service

    • PAAS是(A
      A. Platform as a service
      B. Infrastructure as a service
      C. Software as service
      D. Fuction as service

    • 开发软件时,对提高开发人员工作效率至关重要的是(B
      A. 操作系统的资源管理功能
      B. 先进的软件开发工具和环境
      C. 程序人员的数量
      D. 计算机的并行处理能力

    • 以下常见的通讯协议中,不属于应用层协议的有(B
      A. FTP
      B. TCP/IP
      C. HTTP
      D. SMTP

    • 计算机的软件系统可分为(D
      A. 程序和数据
      B. 操作系统和语言处理系统
      C. 程序、数据和文档
      D. 系统软件和应用软件

    • 软件系统的可维护性评价指标不包括 (C
      A. 可理解性
      B. 可测试性
      C. 可扩展性
      D. 可修改性

    • 云计算的优势是(D
      A. 一朵云
      B. 超高
      C. 超强
      D. 超大规模、按需服务

    • 云计算时代,客户应该如何应对互网联的安全风险?(A
      A. 建立完善的安全体系
      B. 部署入侵检测系统
      C. 委托第三方专业公司管理
      D. 部署DDoS防护系统

    • 云计算的核心思想是将大量用(A)连接的计算资源统一管理和调度
      A. 网络
      B. 电线
      C. 电缆
      D. 电话

    • 单机时代,保护电脑安全的主要方式是(C
      A.防火墙
      B.入侵检测
      C.杀毒软件
      D.WAF

    • 计算机诞生于(D)年代
      A. 2000年代
      B. 1980年代
      C. 1990年代
      D. 1960年代

    • 在计算机逻辑运算中,最基本的逻辑运算是(ACD
      A. 逻辑与
      B. 逻辑或
      C. 异或
      D. 逻辑非

    • 企业使用云计算的好处包括(ABCD
      A. 节约建立基础设施的成本
      B. 较强的灵活性和扩展性
      C. 缩短产品开发周期
      D. 简化运维管理

    • 万物互联时代的主要特征是(ABCDE
      A. 人人都是互联网用户
      B. 人和物随时在线
      C. 数据生活普及
      D. 安全成为强需求
      E. 每人都有一部智能手机

    • Linux 有哪几部分组成(ABC
      A. Kernel
      B. Shell
      C. 应用程序
      D. 虚拟机

    • 客户的业务迁移上云后,以下哪些安全还将由客户自己负责?(DEF
      A. 服务器硬件
      B. 路由器和交换机硬件
      C. 机房的温度
      D. 客户的数据
      E. 应用程序
      F. 安全组的配置

    • 使用哪些软件可以远程登陆一台Linux版本的ECS服务器? (ACD
      A. Xshell
      B. mstsc
      C. Putty
      D. SecureCRT

    3、完成

    通过测试后,即可0元购完成订单,购买的服务器有效时长是两个月,但是可以续期一次四个月,不过续期需要完成考试。再之后就只能乖乖付费了,怎么可能一直白嫖👀。
    在这里插入图片描述

    原创不易,请勿转载本不富裕的访问量雪上加霜
    博主首页:https://wzlodq.blog.csdn.net/
    微信公众号:唔仄lo咚锵
    如果文章对你有帮助,记得一键三连❤

    展开全文
  • 基于Servlet的学生管理系统

    万次阅读 多人点赞 2018-10-21 10:43:26
    一、缘起 ...四个月前,我曾经写过一个基于JSP的学生管理系统《基于JSP的学生管理系统》,这一次我又带来了一个基于Servlet的学生管理系统,在原有的基础上新增了其他功能,介系你没有van过的船新版本 ...

    一、缘起


    四个月前,我曾经写过一个基于JSP的学生管理系统《基于JSP的学生管理系统》由于要交作业的关系 ,这一次我又带来了一个基于Servlet的学生管理系统,在原有的基础上新增了其他功能,后端使用了经典MVC分层架构,前端使用了一些比较新颖的框架,介系你没有van过的船新版本


    二、使用到的技术


    1.前端

    2.后端

    • Servlet

    3.使用到的工具包

    4.数据库

    • MySQL 5.7.10

    4.本人电脑环境

    • 操作系统:Windows10
    • Java版本:1.8.0_172
    • TomCat:8.5
    • IDE:MyEclipse 2017 CI
    • 浏览器:Google Chrome 69 和Firefox


    三、项目相关


    1.项目下载

    项目已在GitHub上托管开源,请遵守MIT协议进行使用。我的GitHub

    2.项目安装

    详情请查看我项目GitHub下的ReadMe

    3.在线体验

    本项目已部署在我的服务器上,以供各位同学进行体验,若在体验过程发现有BUG,请务必在GitHub发出Issuse或者在下面评论留言,感谢您的反馈。在线体验
    由于超级管理员能够删除其他管理员账号,故这里只能给出普通管理员账号供大家使用,超级管理员和普通管理员的差别是普通管理员少了一个管理员管理模块。

    • 账号:李白
    • 密码:test1234

    请各位同学务必保持数据库整洁,在下线前务必删除体验新增的内容,以给接下来体验的人有个良好体验。
    也由于我的服务器只是一个性能一般的学生服务器,没有啥防护能力,求各位黑客大大放小弟服务器一条生路,如果服务器出现异常,在线体验功能只能够下线了。


    四、管理页面预览


    1.登录页面

    在这里插入图片描述

    2.主页面

    在这里插入图片描述

    3.学生添加功能

    在这里插入图片描述

    4.专业管理

    在这里插入图片描述

    5.学院管理

    在这里插入图片描述



    五、项目实现功能亮点


    1. 本项目使用了Ajax技术实现异步刷新,使一些固定的内容,如导航栏,顶部欢迎栏,不用每次跳转时重新刷新,减少了 渲染DOM时所需要的内存。
    2. 实现前后端分离,不再依赖服务器对JSP渲染,减少了耦合。
    3. 前端使用了比较新颖的框架,如VUE,组件库BootStrap等。
    4. 实现前端后端都具备数据校验,防止非法数据污染服务器。
    5. 实现下拉框二级联动,内容依据后台服务器内容进行加载。


    六、项目结构


    1.前端

    (1)登录页面布局

    在这里插入图片描述

    (2)主页面

    在这里插入图片描述

    (3)内容管理

    在这里插入图片描述

    2.后端

    (1)后端接口

    在这里插入图片描述

    3.数据库E-R图

    在这里插入图片描述


    七、关键功能实现


    1.如何实现Servlet返回JSON格式的数据?

    一般来说,Servlet并不像Spring那样有返回JSON数据的能力,所以我们只能依赖第三方的工具类,这里我推荐使用Google公司开发的GSON工具。它的用法很简单,只需要使用gson.toJson()方法即可,这个方法能够转换例如String字符串,List列表,Map键值对等,一般我们都会使用Map<String,Object>来进行存储,如以下步骤:
    我们在MajorManagementServlet.java这个servlet中

    package com.management.web.controller.major;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.google.gson.Gson;
    import com.management.entities.Major;
    import com.management.service.MajorService;
    import com.management.service.impl.MajorServiceImpl;
    import com.management.utils.PageUtils;
    
    /**
     * 展示全部专业
     *  需要传入参数:
     * 		request:
     * 			page(当前页)
     * @author CheungChingYin
     *
     */
    @WebServlet("/MajorManagementContent")
    public class MajorManagementServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    		HttpSession session = request.getSession();
    		if (session.getAttribute("admin") == null) {
    			response.sendRedirect(request.getContextPath() + "/Login");
    			return;
    		}
    		request.setCharacterEncoding("UTF-8");
    		if (session.getAttribute("admin") == null) {
    			response.sendRedirect(request.getContextPath() + "/Login");
    			return;
    		}
    		MajorService service = new MajorServiceImpl();
    		List<Major> majorList = service.searchAllMajor();
    		Integer listCount = majorList.size();
    		if(request.getParameter("page") == null){
    			return;
    		}
    		//分页功能
    		Integer page = Integer.parseInt(request.getParameter("page")); 
    		Integer prePage = PageUtils.prePageHandler(page);
    		Integer nextPage = PageUtils.nextPageHandler(page, listCount);
    		Integer pages = PageUtils.pagesHandler(listCount);
    		List<Integer> pageNum = PageUtils.pageHandler(page, listCount);
    		if(page == pages){
    			majorList = majorList.subList((page - 1) * 10, listCount);
    		}else{
    			majorList = majorList.subList((page - 1) * 10, page * 10);
    		}
    		response.setHeader("Content-Type", "application/json");
    		response.setCharacterEncoding("UTF-8");
    		PrintWriter out = response.getWriter();
    		Gson gson = new Gson();
    		Map<String,Object> map = new HashMap<String, Object>();
    		map.put("majorList", majorList);
    		map.put("allMajorCount", listCount);
    		map.put("prePage", prePage);
    		map.put("nextPage", nextPage);
    		map.put("pageNum", pageNum);
    		map.put("page", page);
    		
    		String res = gson.toJson(map);
    		out.print(res);
    	}
    	
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// TODO Auto-generated method stub
    		doGet(request, response);
    	}
    
    }
    
    

    当中有这样一段语句

    response.setHeader("Content-Type", "application/json");//设置响应头的内容类别为JSON,以便前端更好识别
    response.setCharacterEncoding("UTF-8");//设置相应格式为UTF-8,防止输出中文乱码
    PrintWriter out = response.getWriter();//获取response.getWriter(),方便最后把JSON内容输出
    

    完成以上内容后,我们在使用了一个Map来填装了数据,然后通过String res = gson.toJson(map);来转换成JSON格式,最后使用out.print(res);

    		Gson gson = new Gson();
    		Map<String,Object> map = new HashMap<String, Object>();
    		map.put("majorList", majorList);
    		map.put("allMajorCount", listCount);
    		map.put("prePage", prePage);
    		map.put("nextPage", nextPage);
    		map.put("pageNum", pageNum);
    		map.put("page", page);
    		
    		String res = gson.toJson(map);
    		out.print(res);
    

    最终获取的效果以JSON格式输出
    在这里插入图片描述
    在这里插入图片描述

    2.如何连接数据库?

    总所周知,使用JDBC查询数据库,有一个很经典的模板如下

    try {
    			Class.forName(driverClass);
    			connection = DriverManager.getConnection(url, user, password);
    			statement = connection.createStatement();
    			rs = statement.executeQuery(sql);
    			rowSet = new CachedRowSetImpl();
    			rowSet.populate(rs);
    
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}finally {
    			try {
    				rs.close();
    				statement.close();
    				connection.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    		}
    

    可是我们需要频繁地查询数据库,如果每一次这样写不就会很累?俗话说得好:“不要重复造轮子”,轮子只需要造一次就够了,所以我们应该把它抽象出来,单独成为一个工具类MySQLConnectionUtils

    package com.management.utils;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    import javax.sql.RowSet;
    import javax.sql.rowset.CachedRowSet;
    
    import com.sun.rowset.CachedRowSetImpl;
    
    /**
     * 数据库连接工具
     * @author CheungChingYin
     *
     */
    public class MySQLConnectionUtils {
    
    	// 用于连接数据库的工具类
    	public static CachedRowSetImpl mySQLResult(String sql) {
    		String path = MySQLConnectionUtils.class.getClassLoader().getResource("db.properties").getPath();
    		FileInputStream in = null;
    		Properties properties = new Properties();
    		
    		try {
    			in = new FileInputStream(path);
    		} catch (FileNotFoundException e1) {
    			e1.printStackTrace();
    		}
    		try {
    			properties.load(in);
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    
    		String user = properties.getProperty("jdbc.user");
    		String password = properties.getProperty("jdbc.password");
    		String driverClass = properties.getProperty("jdbc.driverClass");
    		String url = properties.getProperty("jdbc.jdbcUrl");
    		Connection connection = null;
    		Statement statement  = null;
    		ResultSet rs = null;
    		CachedRowSetImpl rowSet = null;
    
    		try {
    			Class.forName(driverClass);
    			connection = DriverManager.getConnection(url, user, password);
    			statement = connection.createStatement();
    			rs = statement.executeQuery(sql);
    			rowSet = new CachedRowSetImpl();
    			rowSet.populate(rs);
    
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}finally {
    			try {
    				rs.close();
    				statement.close();
    				connection.close();
    			} catch (SQLException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			
    		}
    
    		return rowSet;
    	}
    
    	public static Connection mySQLConnection() {
    
    		String path = MySQLConnectionUtils.class.getClassLoader().getResource("db.properties").getPath();
    		FileInputStream in = null;
    		Properties properties = new Properties();
    		
    		try {
    			in = new FileInputStream(path);
    		} catch (FileNotFoundException e1) {
    			e1.printStackTrace();
    		}
    		try {
    			properties.load(in);
    		} catch (IOException e1) {
    			e1.printStackTrace();
    		}
    
    		String user = properties.getProperty("jdbc.user");
    		String password = properties.getProperty("jdbc.password");
    		String driverClass = properties.getProperty("jdbc.driverClass");
    		String url = properties.getProperty("jdbc.jdbcUrl");
    
    		Connection connection = null;
    
    		try {
    
    			Class.forName(driverClass);
    			connection = DriverManager.getConnection(url, user, password);
    
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return connection;
    	}
    }
    
    

    db.properties相关内容

    jdbc.user=root
    jdbc.password=123456
    jdbc.driverClass=com.mysql.jdbc.Driver
    jdbc.jdbcUrl=jdbc\:mysql\://localhost\:3306/student?useUnicode\=true&characterEncoding\=utf-8
    jdbc.initPoolSize=5
    jdbc.maxPoolSize=10
    

    由于我们会很频繁地调用这个类,所以我们就需要考虑让它成为一个静态方法,以便于我们每次调用的时候不需要创建一个对象然后再使用。使用properties文件把数据库的一些信息,如地址、数据库账户、数据库密码存储,以便日后项目迁移需要修改数据库信息。
    在一开始,我的public static CachedRowSetImpl mySQLResult(String sql)方法的返回值类型是使用ResultSet的,如这样public static ResultSet mySQLResult(String sql),然后使用了一端时间后才发现,当发出一大堆数据库连接的时候,由于我没有关闭释放连接,就是在finally没有connection.close();,所以会造成数据库连接过多导致被数据库拒绝连接,出现一个叫做Can not connect to MySQL server Error: Too many connections的异常错误,发现这个问题后我立马在方法的finally块中加入了

    try {
    				rs.close();
    				statement.close();
    				connection.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    

    然后返回一个ResultSet结果集,虽然连接问题是解决了,可是新问题又出现了,控制台发出了一个异常java.sql.SQLException: Operation not allowed after ResultSet closed(结果集已关闭,无法操作。),如果我在返回结果集之前关闭了结果集,那就不能够操作结果集了;如果我不关闭结果集,数据库连接一直都会存在,然后重复操作几次又会出现数据库连接数过多,拒绝访问的异常了,那改怎么办?
    最终我在这篇博文上找到了答案《java开发中如何在ResultSet结果集关闭后,还能使用数据库数据。》,只需要返回类型使用CachedRowSetImpl即可,详细请查阅这篇文章。

    3.如何让用户输入的密码进行加密放到数据库中?

    说到数据加密,我们不得不提到Apache公司的开发的一个常用加密工具类commons-codec
    这个项目的密码是使用MD5进行加密的(也不能说是加密,因为它不可解密,只能说是一种认证,防止后台的的数据库操作员能够轻易地获得密码)
    在加入了commons-codec的JAR包后,我把加密方法做成了一个抽象方法,以便以后使用
    PasswordEncryptionUtils

    package com.management.utils;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    import org.apache.commons.codec.binary.Base64;
    
    /**
     * 密码加密
     * @author CheungChingYin
     *
     */
    public class PasswordEncryptionUtils {
    
    	/**
    	 * 通过MD5进行密码加密
    	 * @param password
    	 * @return
    	 */
    	public static String plainText2MD5Encrypt(String password){
    		try {
    			MessageDigest md = MessageDigest.getInstance("MD5");
    			byte[] output = md.digest(password.getBytes());
    			String ret = Base64.encodeBase64String(output);
    			return ret;
    		} catch (NoSuchAlgorithmException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			return null;
    		}
    		
    	}
    }
    
    

    像是管理员账号李白,密码是test1234,可是到了数据库后密码变成了这样
    在这里插入图片描述
    一串没有意义的乱码。
    所以在注册和登录的时候,一定要先把密码加密,不然最后会应为对不上数据库所存放的密码导致密码不正确。

    4.分页功能

    这一次的分页功能我是在后台完成的,为此我专门做了一个分页的工具PageUtils,其中的逻辑和我上一次的项目分页逻辑大致一致。

    package com.management.utils;
    
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * 分页工具
     * @author CheungChingYin
     *
     */
    public class PageUtils {
    
    	/**
    	 * 上一页逻辑
    	 * @param page
    	 * @return
    	 */
    	public static Integer prePageHandler(Integer page) {
    
    		Integer prePage;
    		if (page - 1 == 0) {//如果当前页-1为0,则表示当前页为第一页,
    			prePage = 1;//前一页只能为第一页
    		} else {
    			prePage = page - 1;
    		}
    		return prePage;
    	}
    
    	/**
    	 * 下一页逻辑
    	 * @param page
    	 * @param listCount
    	 * @return
    	 */
    	public static Integer nextPageHandler(Integer page, Integer listCount) {
    
    		Integer PAGESIZE = ConstantUtils.Page.PAGESIZE;
    		Integer pages = (listCount % PAGESIZE == 0) ? (listCount / PAGESIZE) : (listCount / PAGESIZE + 1);
    		Integer nextPage;
    		if (page == pages) {//如果当前页等于最大页数
    			nextPage = pages;//下一页只能等于最大页数
    		} else {
    			nextPage = page + 1;
    		}
    		return nextPage;
    	}
    
    	/**
    	 * 列出页码列表
    	 * @param page
    	 * @param listCount
    	 * @return
    	 */
    	public static List<Integer> pageHandler(Integer page,Integer listCount) {
    		
    		List<Integer> list = new LinkedList<Integer>();
    		Integer PAGESIZE = ConstantUtils.Page.PAGESIZE;
    		Integer PAGENUM = ConstantUtils.Page.PAGENUM;
    		
    		Integer pages = (listCount % PAGESIZE == 0) ? (listCount / PAGESIZE) : (listCount / PAGESIZE + 1);
    		Integer minPages = (page - PAGENUM > 0) ? (page - PAGENUM) : (1);//和上一页同理
    		Integer maxPages = (page + PAGENUM >= pages)?(pages):(page + PAGENUM);//与下一页同理
    		for(int i = minPages;i<= maxPages;i++){
    			list.add(i);//添加最小页到最大页之间的页码
    		}
    		return list;
    	}
    	
    	/**
    	 * 总共页数逻辑
    	 * @param listCount
    	 * @return
    	 */
    	public static Integer pagesHandler(Integer listCount){
    		
    		Integer PAGESIZE = ConstantUtils.Page.PAGESIZE;
    		Integer pages = (listCount % PAGESIZE == 0) ? (listCount / PAGESIZE) : (listCount / PAGESIZE + 1);
    		return pages;
    	}
    
    }
    
    

    在每次请求需要分页的时候,首先传入一个page参数代表当前页数,还有一个就是从数据库获得内容的总条数,从而计算出需要分多少页,类中的PAGESIZEPAGENUM其实是一个固定的常量,为了解耦才把常量抽取出来。

    package com.management.utils;
    
    /**
     * 相关常量
     * @author CheungChingYin
     *
     */
    public interface ConstantUtils {
    
    	public static class Page {
    		public static final Integer PAGESIZE = 10;//一页显示多少条资料
    		public static final Integer PAGENUM = 3;//页码展示数量
    	}
    }
    
    

    在每次需要用到分页功能的时候,都会有进行分页判断,以SearchStudent的片段代码为例

    	Integer page = Integer.parseUnsignedInt(request.getParameter("page"));//获取传来的参数当前页
    		Integer listCount = null;
    		if (search == null || page==null) {
    			return;
    		}
    		
    		if (search.matches("\\d+")) {
    			studentList = new LinkedList<Student>();
    			Student s = service.searchStudentById(search);
    			studentList.add(s);
    			listCount = studentList.size();
    		} else {
    			studentList = service.searchStudentByName(search);
    			listCount = studentList.size();
    			Integer pages = PageUtils.pagesHandler(listCount);
    			if(page == pages){//由于搜索结果如果有多个时候,是需要分页的,若当前页等于最大页
    				studentList = service.searchStudentByName(search).subList((page - 1) * 10, listCount);//列表只展示到最后一条,不然会越界
    			}else{
    				studentList = service.searchStudentByName(search).subList((page - 1) * 10, page * 10);//列表只能存10条数据,达到伪分页效果
    			}
    			
    		}
    		
    		Integer prePage = PageUtils.prePageHandler(page);
    		Integer nextPage = PageUtils.nextPageHandler(page, listCount);
    		
    		List<Integer> pageNum = PageUtils.pageHandler(page, listCount);
    		
    
    		map.put("studentList", studentList);
    		map.put("allStudentCount", listCount);
    		map.put("prePage", prePage);
    		map.put("nextPage", nextPage);
    		map.put("pageNum", pageNum);
    		map.put("page", page);
    		map.put("search",search);
    
    

    通过JSON把上一页、下一页、当前页、显示的页数(即超链接中显示的数字页数)传回前端,让前端自己处理即可。

    5.搜索功能如何判断搜索的是ID还是姓名?

    在这里插入图片描述
    同样以SearchStudent为例,通过前端传来了一个搜索内容search,我们只需要通过字符串自带的一个方法,String.matches()进行正则表达式判断,代码段中的"\\d+"指的是判断字符串是不是一位以上纯数字,如果返回判断是正确,则表明是学号ID搜索,只需要向service层调用searchStudentById()方法即可,由于搜索内容除了学号ID之外就只有姓名了,所以else是能是调用service层的searchStudentByName()方法。

    if (search.matches("\\d+")) {
    			studentList = new LinkedList<Student>();
    			Student s = service.searchStudentById(search);
    			studentList.add(s);
    			listCount = studentList.size();
    		} else {
    			studentList = service.searchStudentByName(search);
    			listCount = studentList.size();
    			Integer pages = PageUtils.pagesHandler(listCount);
    			if(page == pages){
    				studentList = service.searchStudentByName(search).subList((page - 1) * 10, listCount);
    			}else{
    				studentList = service.searchStudentByName(search).subList((page - 1) * 10, page * 10);
    			}
    			
    		}
    

    6.学生管理中的学院栏和专业栏如何实现二级联动表单?

    在这里插入图片描述
    这个就涉及到了JavaScript了,我的想法是这样的(以添加学生信息为例)

    1. 点击添加学生按钮的时候使用Ajax向接口/getCollege发出请求
    2. /getCollege接口返回所有学院的信息
    3. 使用JQuery把获得的信息做成<option>标签样式放在学院下拉框中
    4. 当用户选择其中一个学院时,触发change()事件
    5. 获得学院当前的value
    6. 带着学院value值向接口/getMajor请求相应的专业
    7. 接口/getMajor返回来的JSON通过JavaScript把信息放入专业下拉框中

    这样看起来貌似步骤很多,但其实有一些步骤是连起来做的
    以下代码源自StudentManagement.js代码片段
    步骤1~3代码

    /*
     * 添加按钮点击事件
     * 使用Ajax获得相对应的学院,并且添加到学院的<select>控件中
     */
    $("#stu-add-button").on("click", function() {
    	$.get("getCollege", function(data, status) {
    		var college = data;
    		$("#college").html("");
    		var res ="<option value=''>---请选择---</option>";
    		for (var i = 0; i < college.length; i++) {
    			res += "<option value='" + college[i].id + "'>" + college[i].name + "</option>";
    		}
    		$("#college").append(res);
    	});
    });
    

    步骤4~7代码

    /*
     * 学院按钮改变时
     * 当选中学院下拉菜单中的一项时,通过Ajax加载相对应的学院专业
     */
    $("#college").change(function() {
    	var collegeId = $(this).val();
    	$("#major option:not(:first)").remove();
    	$.get("getMajor?collegeId=" + collegeId, function(data, status) {
    		var major = data;
    		var res = "";
    		for (var i = 0; i < major.length; i++) {
    			res += "<option value='" + major[i].id + "'>" + major[i].name + "</option>";
    		}
    		$("#major").append(res);
    	});
    });
    

    7.如何实现主页中部分地方刷新?

    在这里插入图片描述
    像这样实现网页中部分位置刷新,其实只要用到JQuery中的load()方法即可,以下代码出自Ajax_Main.js

    $(".nav li a").click(function() {
    		var type = $(this).attr("value");
    		var address = $(this).attr("href");
    		$("a").removeClass("active")
    		$(this).addClass("active");
    		$('#contain').html("");
    		if(type != "logout"){
    			$('#contain').load(address);
    		}
    		switch (type) {
    		case 'StudentManagement':
    			requestStudentContent("StudentManagementContent?page=1");
    			break;
    		case 'logout':
    			if(confirm("确定退出吗")){
    				window.location.replace(address);
    			}
    		}
    		return false;
    	});
    

    指定一个id为containdiv对传来的地址进行刷新即可。

    8.如何按不同权限管理员展示不同的页面

    超级管理员比普通管理员登录时,侧栏会多出一个管理员管理功能,普通权限的管理员是没有的,效果如下
    张三是超级管理员,李白则是普通管理员
    在这里插入图片描述
    要实现这个功能,首先需要在登录成功的时候把获得的权限存放在session域中,在主页Ajax_Main.jsp中使用一个隐藏的<input>把值取出
    代码出自LoginServlet.java
    在这里插入图片描述
    代码出自Ajax_Main.jsp
    在这里插入图片描述
    只要页面在初始化的时候检测这个id为permission的输入框中的value,只要值不等于1的话,就把管理管理员这个超链接移除,代码出自Ajax_Main.js
    在这里插入图片描述
    仅仅靠前端是不保险的,有些了解我的代码,直接在页面上修改值不就能显示管理员管理了吗?所以说后端我们也需要验证权限,双份保障双重保险。
    Servlet映射管理员管理相应JSP那个接口(即AdministratorManagementUIServlet)做手脚
    先判断session中有没有admin,没有即表示是跳过登录页面进行访问的,所以直接重定向回登录页面。然后再判断存在session域中的permission,只有权限(permission)为1的时候才能够跳转到管理员管理的页面中。
    在这里插入图片描述

    9.如何实现cookie免登陆?

    方法很简单,只要在登录的时候,检查cookie和session是否都同时存在,如果,只要登录成功,检测多选框有没有选择(不要问我为啥不用单选框,因为多选框的展示效果比单选框好),如果选择了则写cookie,没有选择就按普通流程登录

    Created with Raphaël 2.2.0登录页打开是否有对应cookie登录成功输入用户名密码用户名和密码是否正确提示用户名或密码错误yesnoyesno

    跳转登录页面servletLoginUIServlet

    package com.management.web.UI;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     * 跳转到登录页面
     * @author CheungChingYin
     *
     */
    @WebServlet(description = "跳转到登录界面", urlPatterns = { "/Login" })
    public class LoginUIServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    
    		HttpSession session = request.getSession();
    		Cookie[] cookies = request.getCookies();
    		if(cookies != null){
    			for (Cookie cookie : cookies) {
    				if (cookie.getName().equals("JSESSIONID")) {// 判断是否存在第一次登录时存放的cookie
    					if (session.getAttribute("admin") != null) {// 判断服务器里面的存放的cookie是否存在
    						// 直接重定向到主界面
    						response.sendRedirect(request.getContextPath() + "/Home");
    						return;
    					}
    				}
    			}
    		}
    		// 如果检测不到cookie就转发到登录界面
    		request.getRequestDispatcher("/WEB-INF/jsp/Login.jsp").forward(request, response);
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    
    

    登录验证servletLoginUIServlet

    package com.management.web.controller.administrator;
    
    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import com.management.entities.Administrator;
    import com.management.service.AdministratorService;
    import com.management.service.impl.AdministratorServiceImpl;
    import com.management.utils.WebUtils;
    
    /**
     * 管理员登录功能
     * 需要传入参数
     * 	request:
     * 		登录界面表单:
     * 			user(管理员姓名)
     * 			password(管理员密码)
     * 			rememberMe(可选)(记住我选项)
     * 		
     * @author CheungChingYin
     *
     */
    @WebServlet("/LoginServlet")
    public class LoginServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		request.setCharacterEncoding("UTF-8");
    		Administrator admin = WebUtils.request2Bean(request, Administrator.class);//获得表单传来的参数
    		AdministratorService service = new AdministratorServiceImpl();
    		HttpSession session = request.getSession();
    		
    		String user = admin.getUser();
    		String password = admin.getPassword();
    		response.setHeader("Content-type","text/html;charset=UTF-8");
    
    		boolean loginResult = service.login(user, password);//检查用户名、密码能否通过登录
    		Integer permission = service.searchAdministratorByName(user).getPermission();
    		if (loginResult) {//登录通过执行事件
    			if (request.getParameter("remeberMe") != null && request.getParameter("remeberMe").equals("on")) {
    				//检查是否勾选了记住我,需要先检查获取是否为空,不然会报空指针异常
    				session.setAttribute("admin", user);
    				session.setAttribute("permission",permission);
    				session.setMaxInactiveInterval(7 * 24 * 3600);// Session保存7天
    				Cookie cookie = new Cookie("JSESSIONID", session.getId());
    				cookie.setMaxAge(7 * 24 * 3600);// cookie的有效期也为7天
    				cookie.setPath("/");
    				response.addCookie(cookie);//设置Cookie
    				response.getWriter().write("<script language='JavaScript'>alert('登录成功');window.location.href='"+request.getContextPath()+"/Home'</script>");
    			} else {
    				//没有勾选“记住我”,使用非cookie功能登录
    				session.setAttribute("admin", user);
    				session.setAttribute("permission",permission);
    				response.getWriter().write("<script language='JavaScript'>alert('登录成功');window.location.href='"+request.getContextPath()+"/Home'</script>");
    			}
    		} else {//登录失败
    			response.getWriter().write("<script language='JavaScript'>alert('您的用户名或密码有误,请重新输入或者注册');window.location.href='"+request.getContextPath()+"/Login'</script>");
    		}
    		
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    			throws ServletException, IOException {
    		
    		doGet(request, response);
    	}
    
    }
    
    

    10.存放JSP需要注意的问题

    由于在servlet中,每一个jsp页面都应该由相对应的servlet进行跳转,而不是让浏览器直接访问到。所以我们必须把所有的JSP页面都存放在WEB-INF目录下,只有这样才能不被外界直接访问到JSP,而要通过相应的Servlet进行跳转。而其他静态资源,如cssJavaScriptimages等的资源文件由于保护等级没有那么重要,所以可以直接把这些静态资源放在WebRoot目录下,以方便调用。
    在这里插入图片描述

    11.前端表单校验如何实现?

    在这里插入图片描述
    在前端的表单校验中,我使用了第三方插件nice-validator,这个插件是国人开发的,有中文文档,只要阅读了快速上手后就能够自己实现表单校验了。
    以专业添加表单为例,代码出自MajorManagement.js

    /*
     * 添加专业功能表单校验
     */
    $("#major-add-form").validator({
    	rules : {
    		nameValidate : [ /[\u4e00-\u9fa5_a-zA-Z_]+/, "专业名称必须是中文或者英文" ],
    	},
    	fields : {
    		'id' : "required;integer;remote(" + $("#path").val() + "/majorIdIsExist)",
    		'name' : "required;nameValidate",
    		'college_id' : "required"
    	},
    	/**
    	 * 新增专业表单的提交按钮点击事件
    	 * 提交表单
    	 */
    	valid : $("#major-add-input").click(function() {
    		$.post("AddMajor", $("#major-add-form").serialize(), function(data, status) {
    			if (status == "success") {
    				alert("添加成功!");
    				$("#major-add").modal('hide');
    				$(".modal-backdrop").remove();
    				var path = $("#path").val();
    				$('#contain').load(path + "/MajorManagement");
    			} else {
    				alert("服务器出现未知错误,添加失败!");
    			}
    		})
    	})
    });
    



    八、在开发的时候遇到的坑


    在开发前端页面的时候,有几个按钮设置了点击事件,而这些按钮是通过JavaScript语句动态创建的,导致这些按钮的点击事件失效了,无论怎样按都不能触发点击事件。
    这个好像是因为DOM渲染后,已经绑定好相应的点击事件,但是由于有一些元素如按钮,是通过JavaScript动态新建的,所以没有被绑定事件,导致无法触发点击事件。(由于本人对前端一知半解,所以如果有发现这一段话有错的同学请务必写评论纠正)

    解决方法:只需要使用JQuery的on()方法即可,详细使用方法可以参考这篇博文《js/jq 动态添加的元素不能触发绑定事件解决方案》


    九、开发感想


        这个作业花了我24天时间才完成,当然在当中也少不了有摸鱼 的时间,估计如果在没有课,不摸鱼的情况下大概12~16天就能够完成。这一次的代码估摸2000行应该是有的,开发难度还好,就是前端的问题比较多,因为自己不太熟悉前端框架,JQueryVueBootStrap这些前端框架我都是在用到的时候才学,在之前并没有系统性地学习过,用到啥功能就学啥,不求精通,只求能用。花了两个小时看了下Vue的文档,基本的功能就能够使用了,所以说不要怕学习新的东西,你越怕就越不想去学,花点心思了解一下,总会有收获的。
        这次开发总会想到各种奇奇怪怪的功能,有一些功能可能暂时实现不了,总想放弃,其实可以先放下这个问题,做点别的,有时候灵感一到,问题就会迎刃而解。还有,在开发之前一定要做一份计划书,不要像我这样一边开发一边想功能,有时候你写到顶层如Web层,想实现一些功能,发现服务层没有,服务层写的时候又发现dao层没有相应的方法,这样一层层地从高层向下“补救”是不值得推荐的,就算写得不详细,不要紧,只要有大致框架即可。
        就快毕业了,希望自己能在毕业之前能够做一些比较像样的项目,以至于到外面面试也不会太丢人,继续努力,“穷且益坚 不坠青云之志”!

    展开全文
  • 先就几个大家在学生时代都很迷茫,我也曾经迷茫过的问题,说一下自己的观点:1、现在开始学习编程,是不是晚了?如果以大四毕业找到一份GIS开发方面的工作,并对得起3K左右的月薪为目标的话, 从大四开...
  • Android学习路线(适合学生)

    千次阅读 多人点赞 2019-08-06 18:53:06
    写在前面:首先我是一名科班大学生,这是我个人觉得较好的学习路线,适合基础也适合进阶,如果您不喜欢直接关闭即可,欢迎指出其中的错误和给我提供一些建议。 文中书籍资源有些可以在 计算机书籍控 中找到 先...
  • 在校大学生能成为DuerOS 的独立开发者吗? 生动化你的表达——DuerOS中的SSML应用 用JavaScript打造AI应用-从Nodejs SDK 看DuerOS的技能开发 从Java SDK看DuerOS的技能开发 面向接口/协议?看DuerOS的技能开发 感知...
  • 如何在网上下载自己需要的资源

    千次阅读 2018-02-12 00:00:00
    本文来自作者 曹某某 在 GitChat 上分享 「如何在网上下载自己需要的资源」,「阅读原文」查看交流实录。「文末高能」编辑 | 哈比通过网络获取需要的软件、文档等资源是每个人必须掌握的技能。这篇文...
  • 学生宿舍管理系统的设计与实现(课程论文)

    万次阅读 多人点赞 2018-12-11 09:29:36
    摘 要:现如今高校大学生越来越多,寝室压力巨大,学生不好管理。学生宿舍管理系统对于一个学校来说是必不可少的组成部分。目前好多学校还停留在宿舍管理人员手工记录数据的最初阶段,手工记录对于规模小的学校来说...
  • redis在学生抢房应用中的实践小结

    千次阅读 2015-08-18 13:10:17
    背景简介最近一个月,我们做了一个学生抢房的项目。考虑到抢房有一定的并发量(其实并没有那么大,被批次给隔离开来了),我们在抢房的项目中采用了全量redis的做法,本文主要是关于这个项目中涉及到redis使用的一个...
  • 学生免费使用JetBrains的IntelliJ IDEA

    千次阅读 2020-01-27 21:12:16
    学生——一般正在学校、学堂或其他学习地方受教育的人。利用好自己身份的优势,你就可以享受到社会各界人士所羡慕嫉妒恨的待遇,在我个人博客中提到的阿里云学生服务器就是其中一。在这里,我告诉你,你还拥有一大...
  • 阿里云学生计划领取攻略

    千次阅读 2020-04-01 15:49:34
    阿里云学生计划题目答案分享 由于朋友需要,便整理了一下给出分享。笔者概念性东西不是很好,如有错误多多包涵 文章部分题目来自网友 ...在数据库中,空值是( C) A. 数值0 B. 空的字符串 C....
  • 写给教师同行和受我迫害的学生

    千次阅读 2014-11-28 13:54:22
    同事从QQ上给我发来消息: 我们身边总有些人在使用他那仅有的权利资源去迫害别人。比如我们的老师,父母!不上课他就让你不及格甚至毕不了业,他们从来不问你喜欢什么,他们只会以他们认为绝对正确的方式,以爱的...
  • 对准大三学生选专业方向的建议

    千次阅读 2014-06-30 11:01:08
    【CSDN私信:即将大二毕业...我想按您说的来,但是我实在不知道应该定什么方向。我先介绍下我自己的学习,学校大一学C++,大二学JAVA,暑假会去参加编程大赛,就是编一个软件去比赛。还有个机会去免费参加一个视频教学
  • IT学生解惑真经

    千次阅读 2013-07-02 09:52:52
    IT 学生解惑真经非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。--------韩愈《师说》在校的 IT学生有几百万都在为如何如何学习才能找到工作、融入社会而迷惑我们需要的不是灵丹妙药而是一本让你少走几年...
  • 用C语言写的学生成绩管理系统

    万次阅读 多人点赞 2017-06-08 17:08:35
    本程序说明: 1.各个界面效果还算可以。 2.本程序是把账号和密码放在 zhanghao.txt 文件中保存,可以增加用户,修改密码,即需要账号密码节点,存放在该文件中... 关注下面的公众号,将会有更多的学习资源免费...
  • MySQL数据库设计——以学生成绩数据库为例

    万次阅读 多人点赞 2017-07-04 08:40:02
    数据库是数据管理的有效技术,是计算机科学的重要分支,它能有效地帮助一个组织或者一个企业科学地管理各类信息资源. 目录 MySQL数据库设计以学生成绩数据库为例 目录 数据库设计步骤 基本概念 学生成绩数据库设计 ...
  • html+css基础,小学生看完都学会了

    千次阅读 多人点赞 2021-04-10 14:09:14
    html+css基础html 的介绍html 的基本结构vscode 的基本使用初始常用的 html 标签资源路径列表标签表格标签表单标签表单提交css的介绍css的引入方式css选择器css属性css元素溢出css显示特性盒子模型 html 的介绍 ...
  • ML之RL:强化学习Reinforcement Learning的简介、应用、经典案例、学习资源之详细攻略 目录 强化学习的简介 0、强化学习相关论文 1、强化学习的常用算法 1.1、策略学习 1.2、Q-Learning 2、强化学习...
  • 学生{id,name,age} ,学科{id,name} 分数{学生id,学科id,分数}B.学生{id,name,age} ,分数{学生id,学科名称,分数}C.分数{学生姓名,学科名称,分数}D.学科{id,name},分数{学生姓名,学科id,分数}解析:C,D肯定...
  • 经济学资源概览

    万次阅读 2005-02-27 22:06:00
    经济学资源概览经济学资源概览 这里所说的综合类经济学资源,是不局限于某一特定的研究领域的经济学资源。按此界定,一般经济学资源理所当然属于综合类经济学资源的范畴,它提供了许多当今世界上最优秀的经济学...
  • 构建学生请假审批流程

    千次阅读 2017-06-17 13:58:02
    构建学生请假审批流程标签(空格分隔): activiti1.绘制流程图:start->学生请假申请->班长审批->班主任审批->end,对这个流程图文件命名为:StudentLeaveProcess.bpmn,保存后自动生成同名的png文件。中间这三个节点...
  • 这个文章应该会是一个【资源】性质的文章,关于 准备学什么,需要学什么,希望和各位共勉。 一、编程能力 在这个博客中谈到过,【记录】一个深度学习算法工程师的成长之路(思考和方法以及计划),这里面还是直接拿...
  •  Koller才从教10年,所以学生还没有涌现出太多的牛人,这也是她不能跟Jordan比拟的地方,并且由于在stanford的关系,很多学生直接去硅谷赚大钱去了,而没有在学术界开江湖大帮派的影响,但在stanford这可能太难以...
  • 这是一封读着让我别有感觉的一封信。他在C++方面看的书比我多,他学习C++的历程也值得效仿,但他的学习方式也...【学生来信】贺老师: 您好! 自己在找东西的时候看到了您的博客,之前我也有一样的困惑,但是从没有去
  • 学生工作管理系统(C语言实现)

    千次阅读 2017-06-29 00:09:09
    学生信息管理系统是针对学校人事处的大量业务处理工作而开发的管理软件,主要用于学校学生信息管理,总体任务是实现学生信息的系统化、科学化、规范化和自动化,其主要任务是用计算机对学生的各种信息进行日常管理,...
  • 参考:https://www.ithome.com/html/it/345470.htm.参考:http://epaper.oeeee.com/epaper/H/html/2017-01/04/content_749.htm补充知识和阅读材料:--一份为高中生准备的机器学习与人工智能入门...
  • 基于php学生信息管理系统设计

    千次阅读 2019-04-13 23:42:47
    若干年前,各个学校的学生成绩管理基本上都是靠手工进行,随着学校的规模增大,有关学生信息管理工作所涉及的数据量越来越大,有的学校不得不靠增加人力、物力来进行学生信息管理。但手工管理具有效率底、易出错、检索...
  • 2021年美国大学生数学建模竞赛B题思路分析

    万次阅读 多人点赞 2021-02-04 20:28:18
    国家消防局(CFA):负责灭火、救援和应对澳大利亚维多利亚州大部分地区其他事故和 危险的志愿消防服务 应急行动中心(EOC):与应急有关的行动和活动,以及请求激活和部署资源(人员或设备) 的中央指挥和控制点)。...
  • 第一次玩服务器,并且有针对学生价格优惠的服务器,于是就搞了一个来玩。 我是购买的阿里云学生服务器。 1、首先搜索阿里云云翼计划,如下: 或者直接点击该网址进入云翼计划页面:云翼计划2018 进入后就可以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,407
精华内容 20,162
关键字:

学生资源指的是什么