精华内容
下载资源
问答
  • 同学录项目分析

    千次阅读 2007-12-02 09:56:00
    同学录系统分析、 系统的结构图 本班通告班级信息 班级信息(班长、副班长、成员、老师) 访问次数排行(成员、访问次数、最后次访问时间) 
     
    
                                                                     同学录系统分析
    一、 本系统的结构图                 本班通告
    班级信息      班级信息(班长、副班长、成员、老师)
                           访问次数排行(成员、访问次数、最后一次访问时间)
               母校最新注册班级(班级、创建时间)
     
    本班相册(照片标题、上传人、照片类型、管理)
     
                留言薄(标题、留言人、内容
    同学录
     
                班级管理(驱逐成员给全体成员发信、班级通告、辞职
     
                通讯录(账号、姓名、个人电话、手机、家庭地址)
    二、 本系统的页面功能
    1、 注册页面
    包括的内容如下:(实体为:学生
    账号(用来创建一个文件夹唯一
    真实姓名(not null)
    昵称(null)
    个人密码(not null)
    重复密码(not null)
    你的生日
    密码丢失提示问题(not null)
    提示答案(not null)
    通讯地址(not null)
    Email(not null)
    家庭住址(null)
    固定电话
    个人手机
    QQ(null)
    2、 加入班级页面
    3、窗体顶端
    请您使用刚才注册的用户名和密码登录同学录创建和加入班级(下面用户有两种权利:创建班级和加入别的班级)
    实体为:班级
    班级名
    班级级别(入学年份)
    班级所属学校
    实体为:学校
    学校名
    学校地址
    学校网址
    学校所属地区(省、市、县)
    实体为:学生
    学生账号
    所属班
    所属班长
    实体为:老师
    老师账号
    所属班
    第一步:选择学校所在市
    第二步:选择学校所在地区
    第三步:选择学校类型(大学、大专、中学、中专、小学、幼儿园)
    第四:输入学校关键字(用来查找有此关键字的学校)
    选择或创建完班级后,选择身份(老师,学生)
    3、进入个人页面
    加入班级成功后:请您使用用户名和密码登录同学录您的班级
    包括:(1)我要留言---留言薄
         (2)上传照片—本班相册
         (3)邮件列表
         (4)个人信息
         (5)修改个人资料
         (6)班级管理(只有班长才有权利
         (7)注销身份
         (8)退出
         4、后台管理
                  (1)查询注册班级数
                  (2)分析用户行为
                  (3)删除班级(班级包括的所有内容)
                  (4)个人相关:密码修改
                  (5)退出登录
    三、流程图
    4、窗体底端
     
     
    用户登录
                                              登录成功
     
                                班级普通成员       班级班长
     
     
     
     

             个人资料的修改     留言给同学发邮件
                       上传照片                        注销身份
                       删除自己上传的照片
                                                       班级管理
                                             
     

                                     驱逐成员      发布班级通告      辞职                                       
    四、数据库设计
    1、      Class所包含字段如下:
    ClassName   班级名      唯一varchar(30)
    CreateTime 创建日期           smalldatetime
    ClassHead 班长               外健varchar(30)
    TotalNumber 总人数                 int
    Parent 所属学校      varchar(30)默认为河南中医学院
    2、      Register注册表
    UserName 用户名          主健 varchar(30)
    PassWord 密码        (大于六位小于十六位)varchar(20)
    RealName 真实姓名        varchar(10)
    BirthDay 出生日期        char(8)
    Sex 性别                      char(1)(1代表男,2代表女)
    Email 邮箱                    varchar(50)
    Tel 电话        varchar(15)
    Address 家庭地址 varchar(50)
    Type 身份类别(老师、学生)char(1)(3代表老师)
    Work 职业       varchar(20)
    RegTime 注册时间 smalldatetime
    3、      Register2 注册表2
    UserName 用户名      主健 varchar(30)
    PassWord 密码                 varchar(20)
    VCount 访问次数          int
    LastVisit 最后一次访问时间    Smalldatetime
    ClassName 所属班级       外建 varchar(30)
    Flag 是否为班长 char(1)(0代表是)
    4、      Essay 留言薄
    ID 自动编号 int 主健
    Title 留言标题 varchar(30)
    Content 留言内容         varchar(100)
    UserName 用户名      varchar(30)
    ClassName 所属班级   外建 varchar(30)
    Time 留言时间        smalldatetime
    5、      Photos相册
    ID 自动编号     int 主健
    PhotoTitle 照片标题 varchar(20)
    PhotoType 照片类型      varchar(20)
    PhotoContent 照片说明 varchar(100)
    PhotoUrl 上传位置        varchar(100)
    PhotoTime 上传时间       smalldatetime
    UserName 上传人      varchar(30)
              ClassName 所属班级    外建varchar(30)
     


    1
    、同学录的系统分析
    (一)可行性分析
    1
    .经济可行性
    2
    .技术可行性
    (二)需求分析
    、同学录的设计
    (一)概要设计
    1
    .页面设计
    2
    .数据库设计
    (二)详细设计
    1
    .主页面设计
    2
    .班级留言版
    3
    .班级论坛(BBS
    4
    .班级相册
    5
    .同学资料
    6
    .娱乐前沿
    7
    .同学录帮助
    三、同学录的实现
    (一)开发工具的选用及介绍
    1
    ASP的引入
    2
    .数据库的引入
    (二)页面及核心代码的实现
    1
    .主页面的实现
    2
    .功能页面及代码的实现
    四、系统测试
    (一)软件测试的目的和方法
    (二)子系统测试
    1
    、测试方法
    2
    、测试报告
    3
    、测试结果
    五、同学录的安装
    (一)运行环境要求
    (二)安装设置

    参考文献
    1涪陵在线同学录有哪些特点?
       1.本同学录主要适用于涪陵区内所有学校的校友、同学交流。也欢迎其它地区的学校或班级注册加入。
       2.所有页面进行了全面的设计,界面友好,操作简便,美观大方!
       3.丰富的班级栏目,更易与您的同学沟通、交流。
       4.班级开放级别定制功能,可以免受班外同学的干扰。
       5.强大的虚拟形象功能。
       6.班委功能,使班级管理轻松自如。

    2如何加入涪陵在线同学录?
      新用户请按下面步骤注册:
       1.点击同学录首页登陆区注册按钮,按照系统提示准确填入相关信息。注意有*号的项目是必须填写的,高级选项可以暂不填写,注册时请输入您的真实姓名,对于不真实的注册,我们一经发现会立刻删除。
       2.注册成功后,您可以从同学录首页处登录进入同学录功能区,然后选择注册或加入您的班级(每个人最可以注册或者加入三个班级)。注意应首先选择学校,如果还没有您的学校,请与我们联系立即开通(023-87881188)。
       3.以后每次登录后,同学录会列出您所注册过的班级,您可以在此进行留言、上载照片、发表评论、查询同学或校友等等活动,充分体验涪陵在线同学录给您带来的诸多快乐。

    3如何成为班委成员?
      目前在涪陵在线同学录中要成为班委成员有以下方法:
      注册班级后,您可以在班级管理中查看班委任职情况,如果发现有空余职位,而且您访问本班多于十次,那么您可以自己申请成为班委成员。
      如果班内班委职务没有空缺,那么你只有在他们辞职或他们愿意将班委职务移交给你的时候,你才能成为班委成员。

    4班委成员有哪些权力?
      1.可以把不是本班成员或者不受欢迎的人赶出班级。
      2.可以删除有害信息或过时留言。
      3.可以修改照片的说明,类型或删除该照片和该照片的评论。
      4.可以修改本班级的基本信息和班级开放等级。
      5.如果加入班级时需要密码或审核,那么由班级管理员负责提供班级密码或审核是否可以加入。
      正副班长除拥有以上所有权力外,还可以任免其他班委,其他班委的权限由正副班长来管理。

    5发现有重复的班级,怎么办?
      由于注册班级时的不规范,可能会出现重复的班级,请各位注册时尽量使用统一的名字,而对于不规范名称的班级,我们会定期删除!同时,建议大家把人气较少的班级向系统管理员提出申请合并成一个班级,这样便于管理。

    6个人密码忘记了怎么办?
      当您忘记了系统登录时的密码,您可以通过以下方式取回您的密码:
      回答问题:系统会问根据您注册时输入的密码提示信息询问您一个问题,如果您能正确回答,你可以重新设置密码。如果在你的个人资料中没有填写相关的信息,你可以管理员联系修改密码。

    7如何修改个人资料?
      您可以在登录后在页面的导航栏找到修改资料项进行修改。

    8访问次数是如何统计的?
      在同学录中存在两种访问次数:访问涪陵在线同学录次数和班级到访次数。其中班级到访次数累计您对应所注册班级的访问次数。

    9如何注销班级成员身份?
      登陆后转到你所在的班级,在页面右侧班级功能区中选择从班级注销即可。

    10为什么注册时系统说我的邮件地址不正确?
      地址中请不要使用全角的符号,将其改为半角即可。同时请使用正确合法的电子邮件地址。

    11班级指数是如何计算的?
      目前班级指数的计算方法是(班级成员数+班级访问次数/4),这个计数反映班级的人气。
    功能简介:
    1、非常漂亮的同学录界面;
    2、班级留言功能;
    3、班级论坛功能,仿动网论坛的界面,而且具有大部分相应的功能;
    4、班级相册功能,具有上传分类、照片评论、浏览排行等功能;
    5、个人菜单功能,具有个人邮箱、修改资料、个人日记等功能;
    6、强大后台管理,仿照动网论坛的后台界面,同时具有数据库管理功能。
    友联同学录功能介绍
     
     
    班级通讯簿
    包括本班成员通讯录、附加通讯录、教师通讯录等
    班级相册
    您的班级照片
    班级聊天室
    本班的聊天室
    访问日志
    本班同学的最近访问时间以及累计访问本班的次数记录
    邮件群发
    您可以通过这里给全班同学发邮件,可以自行添加其他Email
    班级管理
    班级管理员管理本班事务的地方
    投 诉
    对于管理员管理不善以及有违法等相关事情发生时,可以在此向管理员投诉。
    班级留言簿
    本班成员可以留言讨论的地方,是您和同学之间交流的最好原地。
     
    提供彩色留言和各种有趣的小头像,让你们的沟通更具特色。
    班级投票箱
    由管理员设置的班级投票,同时大家可以针对投票进行讨论。
    快速寻人
    输入同学的真实姓名,看看他在哪里?
    寻人公告
    或许有人在找你,你可以发布自己的寻人公告
    News看点
    最新的校园,教育,留学的动态,与您生活息息相关。
    答 录 机
    您和同学或者友联其他朋友可以通过答录机单独交流
    管理员功能
    群发留言
    最近有什么活动?用这个方式最快捷的告诉您的同学
    设置访问条件
    管理员可以设置加入班级成员的条件,还有非本班成员查看您的照片的条件,
     
    以及访客是否可以在贵班留言的条件
    成员管理
    管理员管理本班成员,以及提升或免职付管理员的地方
    权利移交
    正管理员将自己的身份交给别的成员
    设置投票
    正付管理员可以设置班级的投票,看看大家的意见如何?
    班级改名
    正管理员可以修改班级的名称
    班级合并
    或许您注册了重复的班级,那么就将这个班级合并到您的正式班级去吧。
    联系站长
    为了和管理员最方便快捷的沟通,这里可是站长直接办公的地方。
     
    有什么意见和建议不要客气,直接给站长留言好了。
    界面风格在程序上已经做成模块化,界面和代码完全分离,陆续将有不同界面风格的CC同学录
    推出,满足不同层次的用户需要(如怀旧版,秋叶版,圣诞版,蓝色海洋版等),以期达到最大限度
    个性化需要的目的
    2)留言(支持表情头像UBB)
    3)相片上传(方便上传相片文件)
    4)形象中心:用户头像个性化选择设定(卡通头像,用户自己上传的头像,虚拟形象)
    5)
    历史留言和成员地址以word形式下载
    6)
    投票调查插件
    7)
    站内短信
    8)
    提供插件接口,自由定义插件
    现已加上CC 单班同学录 V0312(书页版) 升级文件
    默认管理员帐号是:admin,密码:classadmin
     
    展开全文
  • 学生同学录管理系统

    千次阅读 2006-12-05 00:42:00
    学生同学录管理系统[问题描述] 实现学生通讯录管理的几个操作功能(新建、插入、删除、从文件中读取、写入文件和查询、屏幕输出等功能)。通讯录中学生的信息有学号、姓名、出生日期、性别、电话和地址等。[内容]1、...

                     学生同学录管理系统

    [问题描述]

    实现学生通讯录管理的几个操作功能(新建、插入、删除、从文件中读取、写入文件和查询、屏幕输出等功能)。通讯录中学生的信息有学号、姓名、出生日期、性别、电话和地址等。

    [内容]

    1、利用链式存储结构来实现

    2、系统的菜单功能项如下:

    1----新建学生通讯录

    2----向学生通讯录插入学生信息

    3----在通讯录删除学生信息

    4----在文件中读取通讯录信息

    5----向文件中写入学生通讯录信息

    6----在通讯录中查询学生信息

    7----在屏幕中输出全部学生信息

    8----退出

    代码如下:

    //通讯录.h

    #include<iostream>

    #include<fstream>

    #include<string>

    #include<iomanip>

    using namespace std;

    struct DataType                              //定义所有信息

    {

        char number[20];              //学号

        char name[20];                //姓名

        char birthday[20];            //生日

        char sex[6];                  //性别

        char telephone[10];           //电话号码

        char address[20];             //地址

    };

    struct student                           //定义学生信息

    {

        DataType data;

        student *next;                

    };

    class txl

    {

    private:

        student *head;          //头指针

        student *currptr;       //当前指针

    public:

        txl();

        ~txl();

        void Creat();                       //新建学生通讯录

        void Insert();                    //向学生通讯录插入学生信息

        void Delete();                    //在通讯录删除学生信息

        void WriteFile();             //从文件中读取通讯录的信息

        void ReadFile();                     //向文件写入学生通讯录信息

        void Search();                      //在通讯录中查询学生信息

        void Display();                    //在屏幕中输出全部学生信息

        void Exit();                       //退出

    };

    //通讯录.cpp

     

    #include"通讯录.h"

    txl::txl()                          //构造函数

    {

        head=currptr=NULL;

    };

    txl::~txl()                         //释构函数

    {

        student *temp=head;                  //释放空间

        while(temp)

        {

           delete temp;

        }

    } 

     

    //新建学生通讯录

    //  功能:采用头插入的方式建琏,并询问是否保存到文件

    //  参数:无

    //返回值:无

    void txl::Creat()                                  

    {

        cout<<"你想要建立多少个学生的通讯录:";

        int i,n;

        cin>>n;   

        for(i=0;i<n;i++)                        //输入学生信息

        {

            currptr=new student;

           cout<<"请输入学生的学号:";

           cin>>currptr->data.number;

           cout<<"请输入学生的姓名:";

            cin>>currptr->data.name;

           cout<<"请输入学生的生日:";

           cin>>currptr->data.birthday;

           cout<<"请输入学生的性别:";

           cin>>currptr->data.sex;    

           cout<<"请输入学生的电话号码:";

           cin>>currptr->data.telephone;

           cout<<"请输入学生的地址:";

           cin>>currptr->data.address;

           currptr->next=head;                   //头插入建琏

           head=currptr;

        }

    };

     

    //向学生通讯录插入学生信息

    //  功能:采用头插入的方式把结点插进去,并询问是否保存到文件

    //  参数:无

    //返回值:无

    void txl::Insert()                            

    {

        cout<<"你想要在哪个位置插入:";

        int k,n=0;                               //k记录插入位置,n记录琏表长度

        cin>>k;

        student *p=head,*q=NULL,*t=head;

        while(t)

        {

           t=t->next;

           n++;

        }

        if(k>n+1||k<1)                          //不存在此位置,不能存入

        {

           cout<<"此位置不合法";                             

        }

        else{

        currptr=new student;

        cout<<"请输入你要插入的学生的信息!"<<endl;              //需插入的学生信息

        cout<<"请输入学生的学号:";

        cin>>currptr->data.number;

        cout<<"请输入学生的姓名:";

        cin>>currptr->data.name;

        cout<<"请输入学生的生日:";

        cin>>currptr->data.birthday;

        cout<<"请输入学生的性别(male/female)";

        cin>>currptr->data.sex;    

        cout<<"请输入学生的电话号码:";

        cin>>currptr->data.telephone;

        cout<<"请输入学生的地址:";

        cin>>currptr->data.address;

        if(k==1)                                      //建琏

        {

           currptr->next=head;

           head=currptr;

        }

        else

        {

          for(int i=1;i<k;i++)

          {

           q=p;

           p=p->next;

          }

          q->next=currptr;

          currptr->next=p;

        }

        }

    }

     

    //在通讯录删除学生信息

    //  功能:删除结点,并询问是否从文件中删除(采用覆盖原有文件的形式)

    //  参数:无

    //返回值:无

    void txl::Delete()                  

    {

        if(head!=NULL)                      //琏表存在时就做删除操作

        {

           cout<<"你想要在哪个位置删除:";

           int k,n=0;                                 //k记录删除位置,n记录琏表长度

           student *p=head,*q=head->next,*t=head;

           cin>>k;

           while(t)

           {

             t=t->next;

             n++;

           }

           if(k>n||k<1)

              cout<<"This position don't exist!"<<endl;           //所要删除位置超出范围

           else

           {

              if(k==1)

                 head=head->next;

              else

              {

                  for(int i=1;i<k-1;i++)

                  {

                     p=q;

                     q=q->next;

                  }

                  if(q==NULL)p=NULL;

                  else

                     p->next=q->next;

              }

           }

        }

    }

     

    //向文件写入学生通讯录信息

    //  功能:把琏表中的结点都保存到文件中

    //  参数:琏表的一个结点

    //返回值:无

    void txl::WriteFile()                    

    {

        student *s=head;

        ofstream fop;

        fop.open("通讯录.dat",ios::binary|ios::trunc);           //以二进制形式打开文件//覆盖原来的文件且重新保存删除后的内容

        if(!fop)

        {

           cout<<"通讯录.dat can't open!"<<endl;

           abort();

        }

        char Y_N;

        cout<<"Would you like to save it in file(Y/N)";    //询问是否保存到文件中

        cin>>Y_N;

        while(Y_N!='Y'&&Y_N!='y'&&Y_N!='N'&&Y_N!='n')   //使输入为yesno

        {

           cout<<"Please input 'Y' or 'N'";

           cin>>Y_N;

        }

        if(Y_N=='Y'||Y_N=='y')                              //保存

        {

           while(s)

           {

               while(fop.write((char *)&s->data,sizeof(s->data)))

               {

                  s=s->next;

                  flush(cout);

               }

           }

           cout<<"Successfully Save File!"<<endl;

        }

        fop.close();

    }

     

    //从文件中读取通讯录的信息

    //  功能:从文件中读取内容,并建琏

    //  参数:无

    //返回值:无

    void txl::ReadFile()                     

    {

        currptr=new student;

        ifstream fip("通讯录.dat",ios::in|ios::binary);              //以二进制形式打开文件

        while(fip.read((char *)&currptr->data,sizeof(currptr->data)))

        {

           currptr->next=head;

           head=currptr;

           currptr=new student;

        }

        fip.close();

        delete currptr;

    }

     

    //在通讯录中查询学生信息

    //  功能:按姓名或学号的形式查找

    //  参数:无

    //返回值:无

    void txl::Search()                     

    {

        cout<<"你可以通过以下方式查询:"<<endl;

        cout<<"1、按学号查询"<<endl;

        cout<<"2、按姓名查询"<<endl;

        cout<<"你想要按什么方式查询(1 or 2)";

        char ch;

        cin>>ch;

        cout<<"你要查询的信息是:";

        while(ch!='1'&&ch!='2')

        {

           cout<<endl;

           cout<<"操作错误,请重新输入:";

           cin>>ch;

        }

        student *cu=head;

        if(ch=='1')                                    //按学号查询

        {

           char num[20];

           cin>>num;

           while(cu!=NULL)

           {

               if(strcmp(cu->data.number,num)==0)     //判断是否是所查学号

               {

                  cout<<"你要找的学生信息为:"<<endl;

                  cout<<cu->data.number<<"   "<<cu->data.name<<"   "<<cu->data.birthday<<"   "<<cu->data.sex<<"   "

                      <<cu->data.telephone<<"   "<<cu->data.address<<endl;

                  break;

               }

               cu=cu->next;

           }

           if(cu==NULL)

               cout<<"不存在这个学生!"<<endl;

        }

        else                                           //按姓名查询

        {

           char na[20];

           cin>>na;

           while(cu!=NULL)

           {

               if(strcmp(cu->data.name,na)==0)          //判断是否是所查姓名

               {

                  cout<<"你要找的学生信息为:"<<endl;

                  cout<<cu->data.number<<"    "<<cu->data.name<<"   "<<cu->data.birthday<<"   "<<cu->data.sex<<"   "

                      <<cu->data.telephone<<"   "<<cu->data.address<<endl;

                  break;

               }

               cu=cu->next;

           }

           if(cu==NULL)                                     //查询不到

               cout<<"不存在这个学生!"<<endl;

        }

    }

     

    //在屏幕中输出全部学生信息

    //  功能:输出琏表的每一个内容

    //  参数:无

    //返回值:无

    void txl::Display()                   

    {

        if(head==NULL)

           cout<<"通讯录里没有内容!/n/n";

        else{

        student *k=head;

        cout<<setiosflags(ios::left)<<setw(10)<<"学号"<<setiosflags(ios::left)<<setw(10)<<"姓名"

           <<setiosflags(ios::left)<<setw(10)<<"生日"<<setiosflags(ios::left)<<setw(6)<<"性别"

           <<setiosflags(ios::left)<<setw(10)<<"电话号码"<<setiosflags(ios::left)<<setw(10)

           <<"地址"<<endl;                  //设置左对齐输出

        while(k)

        {

            cout<<setiosflags(ios::left)<<setw(10)<<k->data.number<<setw(10)<<setiosflags(ios::left)

               <<k->data.name<<setw(10)<<setiosflags(ios::left)<<k->data.birthday<<setw(6)

               <<setiosflags(ios::left)<<k->data.sex<<setw(10)<<setiosflags(ios::left)

               <<k->data.telephone<<setw(10)<<setiosflags(ios::left)<<k->data.address<<endl;

           k=k->next;

        }

        cout<<endl;

        }

    }

    //  功能:告知结束运行系统

    //  参数:无

    //返回值:无

    void txl::Exit()                       //退出

    {

        WriteFile();            //询问是否保存对文件的修改

        cout<<"感谢使用本系统!"<<endl;

        exit(1);                 //命令整个程序退出;

    }

    //main.cpp

    #include<iostream>

    #include"通讯录.h"

    using namespace std;

    int main()

    {

        cout<<"****************欢迎使用学生通讯录管理系统****************"<<endl;

            cout<<"#========================================================#"<<endl;

        cout<<"#*********在这个管理系统中,我们可以做以下的操作*********#"<<endl;

        cout<<"#*********1、新建学生通讯录******************************#"<<endl;

        cout<<"#*********2、向学生通讯录插入学生信息********************#"<<endl;

        cout<<"#*********3、在通讯录删除学生信息************************#"<<endl;

        cout<<"#*********4、在通讯录中查询学生信息**********************#"<<endl;

        cout<<"#*********5、在屏幕中输出全部学生信息********************#"<<endl;

        cout<<"#*********6、退出(并保存修改)****************************#"<<endl;

        cout<<"#========================================================#"<<endl;

        char ch;

        txl t;

        t.ReadFile();                          //读取文件里的信息

        cout<<"已从文件中读取内容了!/n";

        do{

            cout<<"********************************************************/n";

           cout<<"**1、新建//2、插入//3、删除//4、查询//5、显示//6、退出**"<<endl;

           cout<<"********************************************************/n";

           cout<<"What do you want to do:";

            cin>>ch;

            while(ch>'6'||ch<'1')                                 //使选择范围在1~6

           {

               cout<<"Error operation!Please input again:";

               cin>>ch;

           }

           switch(ch)

           {

           case '1':t.Creat();break;                     //1、新建学生通讯录

           case '2':cout<<"现在学生的信息如下:"<<endl;

               t.Display();

               t.Insert();break;          //2、向学生通讯录插入学生信息

            case '3':cout<<"现在学生的信息如下:"<<endl;

               t.Display();

               t.Delete();break;           //3、在通讯录删除学生信息                                   

            case '4':cout<<"现在学生的信息如下:"<<endl;

               t.Display();

               t.Search();break;                       //5、在通讯录中查询学生信息

            case '5':t.Display();break;                     //6、在屏幕中输出全部学生信息

            case '6':t.Exit();break;                        //7、退出

           }

        }while(1);

        return 0;

    }

     
    展开全文
  • 看到校友录一同学的留言,想起来首诗《面朝大海 春暖花开》。可惜外面的世界是想像中的世界,外面的生活却不是想像中的生活。走想走的路,做想做的事。若真能率性而为,岂不快哉!身无余力,心向往之!面朝大海 ...

      看到校友录一位同学的留言,想起来一首诗《面朝大海 春暖花开》。可惜外面的世界是想像中的世界,外面的生活却不是想像中的生活。走想走的路,做想做的事。若真能率性而为,岂不快哉!身无余力,心向往之!

    面朝大海 春暖花开

    海子诗

    从明天起,做一个幸福的人
    喂马,劈柴,周游世界。
    从明天起,关心粮食和蔬菜,
    从明天起,和每一个亲人通信,
    告诉他们我的幸福,
    那幸福的闪电告诉我的,我将告诉他们。


    给每一座山每一条河取一个温暖的名字,
    陌生人,我也为你祝福,
    愿你有个灿烂的前程,
    愿你有情人终成眷属,
    愿你在尘世中获得幸福,
    我只愿面朝大海,春暖花开。

    展开全文
  • Android开发中,类似下图的搜索功能非常常见今天,我将手把手教大家实现款 封装了 历史搜索记录功能 & 样式 的Android 自定义搜索框 开源库,希望你们会喜欢。 已在Github开源:地址:SearchView,欢迎 Star ! ...

    前言

    • Android开发中,类似下图的搜索功能非常常见

    搜索功能

    • 今天,我将手把手教大家实现一款 封装了 历史搜索记录功能 & 样式Android 自定义搜索框 开源库,希望你们会喜欢。

    示意图

    已在Github开源:地址:SearchView,欢迎 Star


    目录

    示意图


    1. 简介

    一款封装了 历史搜索记录功能 & 样式Android自定义搜索框

    已在Github开源:地址:SearchView,欢迎 Star

    示意图


    2. 需求场景

    • 在开始coding前, 理解好用户的需求场景 有助于我们更好地设计 & 实现功能
    • 需求场景如下

    示意图


    3. 业务流程图

    根据场景,梳理出来的功能业务流程图如下:

    示意图


    4. 功能需求

    根据功能的业务流程图,得出功能需求如下

    4.1 功能列表

    示意图

    4.2 功能原型图

    示意图

    4.3 示意图

    示意图


    5. 总体设计

    下面,将根据功能需求给出特定的技术解决方案

    5.1 总体解决方案

    示意图

    5.2 项目结构说明

    • 项目工程示意图

    示意图

    先下载Demo再阅读,效果会更好:Carson_Ho的Github地址:Search_Layout

    • 结构说明
    文件类型 作用
    SearchView.java 搜索框所有功能的实现
    RecordSQLiteOpenHelper.java 创建、管理数据库 & 版本控制
    EditText_Clear.java 自定义EdiText,丰富了自定义样式 & 一键删除
    ICallBack.java 点击搜索按键后的接口回调方法
    bCallBack.java 点击返回按键后的接口回调方法
    SearchListView.java 解决ListView & ScrollView的嵌套冲突
    search_layout.xml 搜索框的布局

    6. 功能详细设计

    下面将给出详细的功能逻辑

    6.1 关键字搜索

    • 描述:根据用户输入的搜索字段进行结果搜索
    • 原型图

    注:关键字搜索功能是因人而异的,所以本源码仅留出接口供开发者实现,不作具体实现

    示意图

    • 源码分析

    分析1:EditText_Clear.java

    • 作用:自定义EdiText,与系统自带的EdiText对比:多了左侧图片 & 右侧图片设置、一键清空EdiText内容功能
    • 具体代码如下:
    public class EditText_Clear extends android.support.v7.widget.AppCompatEditText {
        /**
         * 步骤1:定义左侧搜索图标 & 一键删除图标
         */
        private Drawable clearDrawable,searchDrawable;
    
        public EditText_Clear(Context context) {
            super(context);
            init();
            // 初始化该组件时,对EditText_Clear进行初始化 ->>步骤2
        }
    
        public EditText_Clear(Context context, AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public EditText_Clear(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        /**
         * 步骤2:初始化 图标资源
         */
        private void init() {
            clearDrawable = getResources().getDrawable(R.drawable.delete);
            searchDrawable = getResources().getDrawable(R.drawable.search);
    
            setCompoundDrawablesWithIntrinsicBounds(searchDrawable, null,
                    null, null);
            // setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)介绍
            // 作用:在EditText上、下、左、右设置图标(相当于android:drawableLeft=""  android:drawableRight="")
            // 注1:setCompoundDrawablesWithIntrinsicBounds()传入的Drawable的宽高=固有宽高(自动通过getIntrinsicWidth()& getIntrinsicHeight()获取)
            // 注2:若不想在某个地方显示,则设置为null
            // 此处设置了左侧搜索图标
    
            // 另外一个相似的方法:setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)介绍
            // 与setCompoundDrawablesWithIntrinsicBounds()的区别:可设置图标大小
              // 传入的Drawable对象必须已经setBounds(x,y,width,height),即必须设置过初始位置、宽和高等信息
              // x:组件在容器X轴上的起点 y:组件在容器Y轴上的起点 width:组件的长度 height:组件的高度
        }
    
    
        /**
         * 步骤3:通过监听复写EditText本身的方法来确定是否显示删除图标
         * 监听方法:onTextChanged() & onFocusChanged()
         * 调用时刻:当输入框内容变化时 & 焦点发生变化时
         */
    
        @Override
        protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
            super.onTextChanged(text, start, lengthBefore, lengthAfter);
            setClearIconVisible(hasFocus() && text.length() > 0);
            // hasFocus()返回是否获得EditTEXT的焦点,即是否选中
            // setClearIconVisible() = 根据传入的是否选中 & 是否有输入来判断是否显示删除图标->>关注1
        }
    
        @Override
        protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
            super.onFocusChanged(focused, direction, previouslyFocusedRect);
            setClearIconVisible(focused && length() > 0);
            // focused = 是否获得焦点
            // 同样根据setClearIconVisible()判断是否要显示删除图标
        }
    
        /**
         * 关注1
         * 作用:判断是否显示删除图标
         */
        private void setClearIconVisible(boolean visible) {
            setCompoundDrawablesWithIntrinsicBounds(searchDrawable, null,
                    visible ? clearDrawable : null, null);
        }
    
        /**
         * 步骤4:对删除图标区域设置点击事件,即"点击 = 清空搜索框内容"
         * 原理:当手指抬起的位置在删除图标的区域,即视为点击了删除图标 = 清空搜索框内容
         */
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                // 原理:当手指抬起的位置在删除图标的区域,即视为点击了删除图标 = 清空搜索框内容
                case MotionEvent.ACTION_UP:
                    Drawable drawable = clearDrawable;
                    if (drawable != null && event.getX() <= (getWidth() - getPaddingRight())
                            && event.getX() >= (getWidth() - getPaddingRight() - drawable.getBounds().width())) {
                        setText("");
                    }
                    // 判断条件说明
                    // event.getX() :抬起时的位置坐标
                    // getWidth():控件的宽度
                    // getPaddingRight():删除图标图标右边缘至EditText控件右边缘的距离
                    // 即:getWidth() - getPaddingRight() = 删除图标的右边缘坐标 = X1
                    // getWidth() - getPaddingRight() - drawable.getBounds().width() = 删除图标左边缘的坐标 = X2
                    // 所以X1与X2之间的区域 = 删除图标的区域
                    // 当手指抬起的位置在删除图标的区域(X2=<event.getX() <=X1),即视为点击了删除图标 = 清空搜索框内容
                    // 具体示意图请看下图
                    break;
            }
            return super.onTouchEvent(event);
        }
    
    
    }
    

    示意图

    对于含有一键清空功能 & 更多自定义样式的EditText自定义控件具体请看我的另外一个简单 & 好用的开源组件:Android自定义EditText:手把手教你做一款含一键删除&自定义样式的SuperEditText

    分析2:SearchListView.java

    • 作用:解决 ListView & ScrollView 的嵌套冲突
    • 具体代码如下:
    public class Search_Listview extends ListView {
        public Search_Listview(Context context) {
            super(context);
        }
    
        public Search_Listview(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public Search_Listview(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        // 通过复写其onMeasure方法,达到对ScrollView适配的效果
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                    MeasureSpec.AT_MOST);
            super.onMeasure(widthMeasureSpec, expandSpec);
        }
    
    }
    

    分析3: search_layout.xml

    • 作用:搜索框的布局
    • 具体代码如下:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:focusableInTouchMode="true"
        android:orientation="vertical">
    
        <LinearLayout
            android:id="@+id/search_block"
            android:layout_width="match_parent"
            android:layout_height="10dp"
            android:orientation="horizontal"
            android:paddingRight="10dp"
            >
    
            // 返回按钮
            <ImageView
                android:layout_width="38dp"
                android:layout_height="38dp"
                android:layout_gravity="center_vertical"
                android:padding="10dp"
                android:src="@drawable/back" />
    
            // 搜索框(采用上面写的自定义EditText
            <scut.carson_ho.searchview.EditText_Clear
                android:id="@+id/et_search"
                android:layout_width="0dp"
                android:layout_height="fill_parent"
                android:layout_weight="264"
                android:background="@null"
                android:drawablePadding="8dp"
                android:gravity="start|center_vertical"
                android:imeOptions="actionSearch"
                android:singleLine="true"
                // 最后2行 = 更换输入键盘按钮:换行 ->>搜索
                />
            
        </LinearLayout>
    
        // 下方搜索记录布局 = ScrollView+Listview
        <ScrollView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical">
    
                    // Listview布局(采用上述讲解的SearchListView,解决了与ScrollView的冲突)
                    <scut.carson_ho.searchview.SearchListView
                        android:id="@+id/listView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">
    
                    </scut.carson_ho.searchview.SearchListView>
    
                <TextView
                    android:id="@+id/tv_clear"
                    android:layout_width="match_parent"
                    android:layout_height="40dp"
                    android:background="#F6F6F6"
                    android:gravity="center"
                    android:visibility="invisible"
                    android:text="清除搜索历史" />
            </LinearLayout>
        </ScrollView>
    </LinearLayout>
    
    

    分析4:ICallBack.java、bCallBack.java

    • 作用:搜索按键、返回按键回调接口
    • 具体代码如下:
    /**
     * ICallBack.java
     */
    public interface ICallBack {
        void SearchAciton(String string);
    
    }
    
    /**
     * bCallBack.java
     */
    public interface bCallBack {
        void BackAciton();
    }
    

    分析5:SearchView.java

    • 作用:涵盖搜索框中所有功能,此处主要讲解 关键字搜索 功能实现
    • 具体代码如下:
    
    /**
       * 步骤1:初始化成员变量
       */
    
        // 搜索框组件
        private EditText et_search; // 搜索按键
        private LinearLayout search_block; // 搜索框布局
        private ImageView searchBack; // 返回按键
    
        // 回调接口
        private  ICallBack mCallBack;// 搜索按键回调接口
        private  bCallBack bCallBack; // 返回按键回调接口
    
        // ListView列表 & 适配器
        private SearchListView listView;
        private BaseAdapter adapter;
    
       /**
         * 步骤2:绑定 搜索框 组件
         */
        
        private void initView(){
            
            // 1. 绑定R.layout.search_layout作为搜索框的xml文件
            LayoutInflater.from(context).inflate(R.layout.search_layout,this);
            
            // 2. 绑定搜索框EditText
            et_search = (EditText) findViewById(R.id.et_search);
    
            // 3. 搜索框背景颜色
            search_block = (LinearLayout)findViewById(R.id.search_block);
       
            // 4. 历史搜索记录 = ListView显示
            listView = (Search_Listview) findViewById(R.id.listView);
            
            // 5. 删除历史搜索记录 按钮
            tv_clear = (TextView) findViewById(R.id.tv_clear);
            tv_clear.setVisibility(INVISIBLE); // 初始状态 = 不可见
            
        }
    
    /**
        * 步骤3
        * 监听输入键盘更换后的搜索按键
        * 调用时刻:点击键盘上的搜索键时
        */
            et_search.setOnKeyListener(new View.OnKeyListener() {
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                        
                        // 点击搜索按键后,根据输入的搜索字段进行查询
                        // 注:由于此处需求会根据自身情况不同而不同,所以具体逻辑由开发者自己实现,此处仅留出接口
                        if (!(mCallBack == null)){
                            mCallBack.SearchAciton(et_search.getText().toString());
                        }
                        Toast.makeText(context, "需要搜索的是" + et_search.getText(), Toast.LENGTH_SHORT).show();
                        
                       
                    }
                    return false;
                }
            });
    
     /**
         * 步骤4:回调接口
         */
    
    // 搜索按键回调接口
    public interface ICallBack {
        void SearchAciton(String string);
    }
    
    // 返回按键接口回调
        public void setOnClickBack(bCallBack bCallBack){
            this.bCallBack = bCallBack;
    
        }
    

    6.2 实时显示历史搜索记录

    • 描述:包括 最近搜索记录 & 相似搜索记录
    • 原型图

    示意图

    • 源码分析

    分析1:RccordSQLiteOpenHelper.java

    • 作用:创建、管理数据库 & 版本控制

    该数据库用于存储用户的搜索历史记录

    • 具体代码如下:

    对于Android SQLlite数据库的操作请看文章:Android:SQLlite数据库操作最详细解析

    
    // 继承自SQLiteOpenHelper数据库类的子类
    public class RecordSQLiteOpenHelper extends SQLiteOpenHelper {
    
        private static String name = "temp.db";
        private static Integer version = 1;
    
        public RecordSQLiteOpenHelper(Context context) {
            super(context, name, null, version);
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 打开数据库 & 建立一个名为records的表,里面只有一列name来存储历史记录:
            db.execSQL("create table records(id integer primary key autoincrement,name varchar(200))");
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
    
    

    分析2:SearchView.java

    • 作用:涵盖搜索框中所有功能,此处主要讲解 实时显示历史搜索记录 功能实现
    • 具体代码如下:
       /**
         * 步骤1:初始化变量
         */
        // 用于存放历史搜索记录
        private RecordSQLiteOpenHelper helper ;
        private SQLiteDatabase db;
    
        // ListView列表 & 适配器
        private SearchListView listView;
        listView = (SearchListView) findViewById(R.id.listView);
        private BaseAdapter adapter;
    
        // 实例化数据库SQLiteOpenHelper子类对象
        helper = new RecordSQLiteOpenHelper(context);
    
    /**
      * 步骤2:搜索框的文本变化实时监听
      */
            et_search.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
    
                }
    
                // 输入文本后调用该方法
                @Override
                public void afterTextChanged(Editable s) {
                    // 每次输入后,模糊查询数据库 & 实时显示历史搜索记录
                    // 注:若搜索框为空,则模糊搜索空字符 = 显示所有的搜索历史
                    String tempName = et_search.getText().toString();
                    queryData(tempName); // ->>关注1
    
                }
            });
    
    /**
       * 步骤3:搜索记录列表(ListView)监听
       * 即当用户点击搜索历史里的字段后,会直接将结果当作搜索字段进行搜索
       */
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    // 获取用户点击列表里的文字,并自动填充到搜索框内
                    TextView textView = (TextView) view.findViewById(android.R.id.text1);
                    String name = textView.getText().toString();
                    et_search.setText(name);
                    Toast.makeText(context, name, Toast.LENGTH_SHORT).show();
                }
            });
    
    
    /**
       * 关注1
       * 模糊查询数据 & 显示到ListView列表上
       */
        private void queryData(String tempName) {
    
            // 1. 模糊搜索
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name like '%" + tempName + "%' order by id desc ", null);
            // 2. 创建adapter适配器对象 & 装入模糊搜索的结果
            adapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, cursor, new String[] { "name" },
                    new int[] { android.R.id.text1 }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
            // 3. 设置适配器
            listView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            
            System.out.println(cursor.getCount());
            // 当输入框为空 & 数据库中有搜索记录时,显示 "删除搜索记录"按钮
            if (tempName.equals("") && cursor.getCount() != 0){
                tv_clear.setVisibility(VISIBLE);
            }
            else {
                tv_clear.setVisibility(INVISIBLE);
            };
    
        }
    

    6.3 删除历史搜索记录

    • 描述:清空所有历史搜索记录
    • 原型图

    示意图

    • 源码分析
      /**
         * 步骤1:初始化变量
         */
          private TextView tv_clear;  // 删除搜索记录按键
          tv_clear = (TextView) findViewById(R.id.tv_clear);
          tv_clear.setVisibility(INVISIBLE);// 初始状态 = 不可见
    
    /**
      * 步骤2:设置"清空搜索历史"按钮
      */
            tv_clear.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                    // 清空数据库->>关注2
                    deleteData();
                    // 模糊搜索空字符 = 显示所有的搜索历史(此时是没有搜索记录的) & 显示该按钮的条件->>关注3
                    queryData("");
                }
            });
    
    /**
      * 关注2:清空数据库
      */
        private void deleteData() {
    
            db = helper.getWritableDatabase();
            db.execSQL("delete from records");
            db.close();
            tv_clear.setVisibility(INVISIBLE);
        }
    
     /**
         * 关注3
         * 模糊查询数据、显示到ListView列表上 & 确定显示 “删除历史按钮”条件
         */
        private void queryData(String tempName) {
            // 步骤1、2、3上面已经提到了,直接看步骤4
            // 1. 模糊搜索
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name like '%" + tempName + "%' order by id desc ", null);
            // 2. 创建adapter适配器对象 & 装入模糊搜索的结果
            adapter = new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, cursor, new String[] { "name" },
                    new int[] { android.R.id.text1 }, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
            // 3. 设置适配器
            listView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
    
            // 4. 当输入框为空 & 数据库中有搜索记录时,才显示 "删除搜索记录"按钮
            if (tempName.equals("") && cursor.getCount() != 0){
                tv_clear.setVisibility(VISIBLE);
            }
            else {
                tv_clear.setVisibility(INVISIBLE);
            };
    
        }
    

    6.4 保存历史搜索记录

    • 描述:将用户输入的搜索字段保存到数据库中
    • 原型图

    示意图

    • 源码分析
    /**
      * 监听输入键盘更换后的搜索按键
      * 调用时刻:点击键盘上的搜索键时
      */
            et_search.setOnKeyListener(new View.OnKeyListener() {
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_DOWN) {
                        // 步骤1已经讲解过,直接看步骤2
    
                        // 1. 点击搜索按键后,根据输入的搜索字段进行查询
                        // 注:由于此处需求会根据自身情况不同而不同,所以具体逻辑由开发者自己实现,此处仅留出接口
                        if (!(mCallBack == null)){
                         mCallBack.SearchAciton(et_search.getText().toString());
                        }
                        Toast.makeText(context, "需要搜索的是" + et_search.getText(), Toast.LENGTH_SHORT).show();
    
                        // 2. 点击搜索键后,对该搜索字段在数据库是否存在进行检查(查询)->> 关注3
                        boolean hasData = hasData(et_search.getText().toString().trim());
                        // 3. 若存在,则不保存;若不存在,则将该搜索字段保存(插入)到数据库,并作为历史搜索记录
                        if (!hasData) {
                            insertData(et_search.getText().toString().trim()); // ->>关注4
                            queryData("");
                        }
                    }
                    return false;
                }
            });
    
    /**
      * 关注3
      * 检查数据库中是否已经有该搜索记录
      */
        private boolean hasData(String tempName) {
            // 从数据库中Record表里找到name=tempName的id
            Cursor cursor = helper.getReadableDatabase().rawQuery(
                    "select id as _id,name from records where name =?", new String[]{tempName});
            //  判断是否有下一个
            return cursor.moveToNext();
        }
    
    /**
      * 关注4
      * 插入数据到数据库,即写入搜索字段到历史搜索记录
      */
        private void insertData(String tempName) {
            db = helper.getWritableDatabase();
            db.execSQL("insert into records(name) values('" + tempName + "')");
            db.close();
        }
    

    7. 具体使用

    示意图


    8. 贡献代码

    • 希望你们能和我一起完善这款简单 & 好用的SearchView控件,具体请看:贡献说明
    • 关于该开源项目的意见 & 建议可在Issue上提出。欢迎 Star

    9. 总结

    • 相信你一定会喜欢上 这款简单 & 好用的SearchView控件

    已在Github上开源:SearchView,欢迎 Star

    • 下一篇文章我将继续进行一些有趣的自定义View实例讲解,感兴趣的同学可以继续关注carson_ho的微信公众号
      示意图
      示意图

    更多简单好用的开源库:简单 & 好用的开源组件:
    自定义EditText:手把手教你做一款含一键删除&自定义样式的SuperEditText


    请 帮顶 或 评论点赞!因为你的鼓励是我写作的最大动力!

    展开全文
  • 【开发记录】Linux常用命令记录(

    千次阅读 多人点赞 2019-09-12 14:16:40
    有时候很难记得清楚,同时方便新来的同学查阅。(将不停的追加和完善) 1)查看CPU情况 cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep "physical id" 2)查看内存大小 cat /...
  • 实例讲解,感兴趣的同学可以继续关注 carson_ho的微信公众号 更多简单好用的开源库:简单 & 好用的开源组件: 自定义EditText:手把手教你做款含一键删除&自定义样式的SuperEditText #请点赞!因为你的...
  • 推动整体水平的提高(不帮助这部分同学解决问题,学习氛围提高不上来,班级整体学习量、学习的深度都会打折扣,影响每同学大学的成色。) 解决重点关注问题的措施 团队建设及合作学习活动:基本按“组...
  • 讲道理,谈到【找工作】这个问题,我就很焦虑。。。。。。看到这个省略号了嘛?这就是我的心, ???? 尤其是在就业一年比一年难的情况下,经历过好多次心态崩裂,也问过很多人,来总结一下如果想成为个【深度学习...
  • 记录次win10美化之路

    万次阅读 多人点赞 2020-06-06 09:30:25
    步:寻找壁纸 壁纸这个问题,当然是要去P站啦(当然是Pixiv啦,在想什么啦) 因为是美化向,所以壁纸的风格建议是不要太辣眼睛。这里的辣眼睛是指颜色不要太多,色差不要太大,我这里找的图是一张颜色集中在...
  • 今天,我同学买的电脑到了,是华为的笔记本,里面自带的是deepin系统,然后赠送了个U盘,里面是windows系统,可以插入U盘安装,还是很人性化的,人性到我插入我自己的电脑后以启动盘的方式启动直接自动删除了我...
  • 今天遇到个问题 要求查询表中的各个专业非最高分的同学的成绩 找了很多资料 找到了一些解法 但是感觉不好理解 select * from score a where sno in (select sno from score group by sno having count(*)>1) --...
  • 最近在使用新版 Pytorch 0.4.0(听说1.0版本马上就要出了…)训练 GAN 的时候遇到了这样个BUG,RuntimeError: Expected object of type torch.DoubleTensor but found type torch.cuda.FloatTensor for argument #...
  • 《RabbitMQ实战指南》笔误及改进记录

    万次阅读 热门讨论 2017-12-12 20:09:51
    2017年12月上旬笔者的一本新书——《RabbitMQ实战指南》上架,里面的校稿都是自己独自完成的,一共进行了15遍,但还是会有漏网之鱼。本篇博文用来记录现在发现的一些笔误,一是给购书的朋友一个参考,以防被笔误所...
  • 本人目前工作情况是前端,对应的WEB后端是C语言实现的后端。没错,就是C语言,可把我惊呆了,纳尼,...或许是因为后端实现语言是C语言吧,发现部分同学对前端一些知识不甚了解,在此根据本人一年多的工作情况大约列下。
  • 最近使用vscode远程连接服务器的时候碰到了卡顿、频繁掉线的问题,在公司大神的...安装其他版本可能解决这个问题,我这里使用的是git自带的ssh版本,不想折腾的同学可以仿照下面的步骤进行。 解决方法 下载安装git 网
  • 步步用python制作游戏外挂

    万次阅读 2017-10-26 11:51:41
    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂。。。。 我打开了4399小...
  • 随想:开发一流Android SDK

    万次阅读 多人点赞 2016-12-10 13:59:32
    篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 自从前段时间离职后,因为个人的事情一直没有选择再工作,也导致原有的文章并没有按时产出.最近个人的事情整理的也差不多了,恰好有不少朋友来问有关SDK开发...
  • 七印部落送给大家的《启示

    千次阅读 2011-05-09 20:00:00
    2010年10月7日,因为《人人都是产品经理》而认识的编辑徐同学找到我,说华中科技大学出版社刚刚引进了一本书,叫《Inspired: How To Create Products Customers Love》,问我有没有兴趣翻译。 启示:...
  •  例介绍如何让Word2007自动提取Excel成绩表中的数据批量制作成绩单,这个神奇的通知单自己会从Excel成绩表中提取学生的姓名、学号、各科成绩等等,然后按老师指定的格式自动制作全班同学的成绩通知单!...
  • HTML Help WorkShop制作chm图解

    万次阅读 热门讨论 2019-08-13 13:49:57
    位做共享软件做得很成功的同行说过:“个好的共享软件,首先操作要简单容易上手,其次一定附带...前段时间本人做了个图片处理软件,免费给一些同学和朋友使用,很多人的反馈是不知道怎么用,于是本人花时间...
  • 记录次购买二手Mac的心路历程(上篇)

    千次阅读 热门讨论 2019-04-15 16:16:55
    由于自己公司开发也一直用的苹果,也深知 Mac 较 Windows 电脑在做技术开发上具有先天的优势,所以还是决定入手台Mackbook Pro。看了一下官网价格,大都在万以上,如果高配的话甚至 2 万以上,感觉还是比较贵...
  • 虽然自己算是个能写的人,或许这算是种不算才华的才华,写博文的意义通常不会在于去描述自己怎样,怎样。通常在某些时候对自己来说,可以回顾自己学习的过程,呈现其中的一些思路,并其学习的过程分享出来。 ...
  • 如何步步的用python制作游戏外挂

    千次阅读 2018-09-04 17:33:00
    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂。。。。 我打开了4399小游戏网,点...
  • 帖记录小程序从思路到开发结束的全过程。 个微信小程序的的诞生 记得七月底回家时候,我老姐说:“哎呀现在这个记忆力越来越差了,连你的生日都记不住了”,咱也不知道是真的记忆力退化还是选择性的记忆退化...
  • win10安装win7虚拟机记录

    千次阅读 2017-11-19 08:52:26
    在win10操作系统上安装win7虚拟机的实践记录,希望对其他同学有所帮助
  • 这次我们将总结使用树莓派制作一个空调红外遥控器的过程。 准备工具 红外接收管(参考型号HS0038B) 红外发射管(参考型号TSAL6200) 遥控器(或能使用万能遥控器的手机) 用作开关的三极管、限流电阻(非必须、...
  • 首先这篇文章是针对小白的,大神可以绕路,大神可以绕路,大神可以绕路,重要的事情说三遍!也不要问我太多高精尖的问题,我... 旧主板上是没有m2接口的,所以购买了NVMe固态的小伙伴可能还需要购买块PCIE转接卡,...
  • 联系信箱:feixiaoxing @163.com】 最近,amazon网站上出现了一本书《自制编译器》,我觉得挺好的,分享给大家。相关地址单击这里。图书的作者是一位日本人,写的很仔细。其实,图灵出版社还引入了一些列的自制...

空空如也

空空如也

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

如何制作一本同学录