1)采用MVC架构模式

客户端:
A.   包VIEW(视图、界面层):只负责界面的显示。
B.   包BUSINESS(业务逻辑层):核心业务的处理。
C.   包DATA  (数据访问层):读写数据、接收发送数据。

服务器:
A. 包view(视图、界面层):只负责界面的显示。
B. 包business(业务逻辑层):核心业务的处理。
C. 包data  (数据访问层):读写数据、接收发送数据。

结构构成:

客户端

服务端

(目前服务器还没有研究仅仅完成客户端的部分内容)

逻辑编写

逻辑结构设计
用户表(QQ号、密码、签名、头像编号、昵称、性别、生日、星座、血型、学历、电话、邮箱、所在地)
分组表(组号、组名、创建时间、QQ号)
好友表(好友QQ号、QQ号、所属分组号、添加时间、是否上线)
聊天记录表(记录编号、发送者QQ号、接受者QQ号、发送时间、信息编号)
聊天内容(信息编号、内容、字体类型、字体大小、字体颜色)
登录信息表(登录编号、登录IP、端口号、登录时间、是否在线、QQ号)
QQ群(群编号、群名称、创建时间)
用户与群关系(关系编号、QQ号、群编号)

表1:用户与群的关系(User_Group)

字段名称 说明 是否为空
ugno 关系编号
qq QQ号
gno 群编号

表2:用户信息表(UserInfo)

字段名称 说明 是否为空
QQ QQ号
pwd 密码
sign 签名
photoID 头像编号
nickname 昵称
char 性别
birthday 生日
constellation 星座
bloodType 血型
diploma 学历
telephone 电话
email 邮件
address 地址

** 2017年12月29日作与老九学堂**

(未完待续)

学会JavaSwing构建程序界面后,小伙伴们最大的困惑可能是“为什么我们做出来的界面那么丑、不跟市面流行的程序界面一样呢?”

像这个界面,我们发现标题栏跟默认状态不一样,关闭按钮的样式也变了。
实现的方法其实很简单,使用setUndecorated(true);取消窗体装饰,其他效果通过图片完成即可。
下面的代码实现了无标题栏窗体,使用背景拉伸的技术为处于上部分的面板设置了背景图片;实现了关闭按钮的鼠标经过以及鼠标单击事件;实现了鼠标拖拽新标题栏移动整个窗体的功能。
其他功能及特效大家可以自行实现。

Constants.java

/**
 * @Description: 用来保存常量 
 * @author: 老九学堂·窖头   
 * @date:   2017年12月25日 下午2:47:31   
 * @version V1.0 
 * @Copyright: 2017 http://www.xuetang9.com Inc. All rights reserved.
 */
public class Constants {
    /** 全局字体名称 */
    public static String SysFontName = "宋体";
    /** 登录窗体的宽 */
    public static int Width_LoginFrame = 387;
    /** 登录窗体的高 */
    public static int Height_LoginFrame = 266;
}

LoginFrame.java

/**
 * @Description: 登录界面 
 * @author: 老九学堂·窖头   
 * @date:   2017年12月25日 下午2:40:07   
 * @version V1.0 
 * @Copyright: 2017 http://www.xuetang9.com Inc. All rights reserved.
 */
public class LoginFrame extends JFrame{
    private JPanel pnlTop = new TopPanel("images/sknin1.jpg");
    private JPanel pnlMiddle = new JPanel();
    private JPanel pnlBottom = new JPanel();
    private JPanel contentPane = null;
    private BorderLayout contentPaneLayout = null;  //内容面板的边框布局
    private Point mousePressedPoint;    //点击pnlTop面板时记录下的鼠标坐标

    public LoginFrame(){
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);   //关闭窗体时什么也不做
        setTitle("登录电脑管家"); //设置窗体标题
        setSize(Constants.Width_LoginFrame, Constants.Height_LoginFrame);       //这里的窗体大小可以参考图片素材的大小(界面素材需复制到images文件夹下)
        initComponents();       //调用自定义方法初始化窗体上的组件
        setLocationRelativeTo(null);    //设置窗体居中
        setUndecorated(true);           //设置窗体无装饰为真
    }

    private void initComponents() {
        contentPane = new JPanel();
        contentPaneLayout = new BorderLayout();
        contentPane.setLayout(contentPaneLayout);

        /**********************  start of 设置pnlTop相关控件  *************************/
        JLabel lblTitle = new JLabel("   登录电脑管家");
        lblTitle.setFont(new Font(Constants.SysFontName, Font.PLAIN, 14));
        lblTitle.setForeground(Color.WHITE);
        //网格包布局
        GridBagLayout pnlTopLayout = new GridBagLayout();
        pnlTop.setLayout(pnlTopLayout);
        pnlTop.add(lblTitle);
        JLabel lblClose = new JLabel();
        lblClose.setIcon(new ImageIcon("images/close.png"));
        pnlTop.add(lblClose);       
        //设置网格包布局的规则
        GridBagConstraints grConstraints = new GridBagConstraints();
        grConstraints.insets = new Insets(0, 0, 0,245);//设置四方向边距    
        pnlTopLayout.setConstraints(lblTitle, grConstraints);//为控件设置新规则
        //越过布局设置控件的宽高
        pnlTop.setPreferredSize(new Dimension(Constants.Width_LoginFrame, 30));
        contentPane.add(pnlTop, BorderLayout.NORTH);

        lblClose.addMouseListener(new MouseAdapter() {//关闭按钮图片替换
            ImageIcon icon = new ImageIcon("images/close.png");
            @Override
            public void mouseEntered(MouseEvent e) {
                lblClose.setIcon(null);
                lblClose.setForeground(Color.RED);
                lblClose.setText("X");  //没有其他图片素材,使用X字母模拟实现切换效果
                lblClose.setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
            }
            @Override
            public void mouseExited(MouseEvent e) {
                lblClose.setIcon(icon);
            }
            @Override
            public void mouseClicked(MouseEvent e) {
                int result = JOptionPane.showConfirmDialog(null, "确认关闭吗?", "窗口关闭",JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE);
                if(result == 0) System.exit(0);
            }
        });

        pnlTop.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                //鼠标点击时先记录鼠标的坐标
                mousePressedPoint = e.getPoint();
            }
        });
        pnlTop.addMouseMotionListener(new MouseAdapter() {          
            @Override
            public void mouseDragged(MouseEvent e) {
                //获得窗体当前的坐标
                Point p = getLocation();
                //设置窗体坐标:当前坐标+鼠标移动后的当前坐标-鼠标原坐标  == 当前坐标+鼠标移动距离
                setLocation((int)(p.getX() + e.getX() - mousePressedPoint.getX()), (int)(p.getY() + e.getY() - mousePressedPoint.getY()));              
            }
        });
        /**********************  end of 设置pnlTop相关控件  *************************/

        this.setContentPane(contentPane);
    }


    class TopPanel extends JPanel{//重写上部面板(实现了背景图片拉伸效果)
        private ImageIcon background;
        public TopPanel(String backImagePath) {
            if(null == backImagePath) return;
            background = new ImageIcon(backImagePath);

        }
        @Override
        protected void paintComponent(Graphics g) {//重绘组件
            if(background == null) return;
            //拉伸图片
            g.drawImage(background.getImage(), 0, 0, Constants.Width_LoginFrame, background.getIconHeight(), null);
        }
    }



    public static void main(String[] args) {
        new LoginFrame().setVisible(true);
    }
}

QQ电脑管家界面效果及素材下载

  对于java的awt/swing来说,纯手工界面布局,代码对于新手而言相对复杂。另外使用大量时间调整界像素比较磨人,可以在eclipse上安装windowBuilder插件后使用可视化的方式降低开发难度,提升开发效率。
  1.安装插件,可以有两种方式:一种是直接在eclipse的插件商店中搜索安装。另外一种方式是下载WindowBuilder离线包安装。
   1.1 首先是插件商店中安装,这种方式需要依赖网络,优势是不用单行插件兼容性问题,这些事情都由eclipse本省来解决。在eclipse的菜单栏中选择Help – Eclipse MarketPlace…(图1)

图1
打开eclipse商店(图2),

图2
在商店中搜索windowbuilder ,会出现WindowBuilder插件(图3)

图3
点击插件区域的install按钮,进行安装。会进入确认安装界面(图4)

图4
点击红色区域确认安装,接下来会出现协议确认界面(图5)。

图5
同意协议,并且点击完成。会进入插件安装界面(图6),等待安装结束重启即可。

图6
  1.2 通过离线安装包安装,离线安装包下载地址可以在官网获取。
http://www.eclipse.org/windowbuilder/download.php
选择自己eclipse对应的版本下载,点击对应下载链接即可(图7)。

下载好离线包后,选择Help – Install New SoftWare(图8)

弹出本地安装选择框(图9)。

选择离线文件(图9)完成后填写名称,下一步

弹出install界面

选择相关内容,下一步
弹出协议确认,后续内容和网络安装一致。
完成后重启eclipse即可。

二、使用插件绘制窗体,在Eclipe菜单中File – New -Other 。

WindowBuilder – Swing Designer – JFrame。

具体的过程是这样的:我们服务器上使用wordpress搭建了一个wiki系统。昨天的某个时刻未知原因其中的wp Editor.md插件无法正常使用,顶部工具栏丢失,没有右侧的实时显示功能。针对这个问题进行了很多尝试依旧没有解决,之后想着使用新插件替代之。直接在wordpress的插件中搜索markdown ,安装了一个pods插件。pods插件上来就是一个字段管理、可以新建字段也可以基于以前的字段。然后点了一下基于现有字段,觉得没有必要把他建立的数据做了一个删除操作。然后,噩梦就开始了,所有的文章消失不见。这就开启了我们的数据找回之路。

在过程中出现 #符号时,是在shell下操作。出现mysql>时,是需要登录mysql在数据库中操作。
大致步骤如下:
1、查看是否启用日志
命令:

mysql>show variables like 'log_%';

结果:

+----------------------------------------+------------------------------------------------+| Variable_name                          | Value                                          |+----------------------------------------+------------------------------------------------+| log_bin                                | ON                                             || log_bin_basename                       | /usr/local/mysql/var/mysql-bin                 |……| log_timestamps                         | UTC                                            || log_warnings                           | 2                                              |+----------------------------------------+------------------------------------------------+

分析: 红色部分信息log_bin的值为on表示已经启用日志。

2、mysql配置文件,查看是否开启了mysqlbinlog 日志,linux服务器下日期文件位于/etc/my.cnf。
命令:

#  cat  /etc/my.cnf

结果:

[client]#password   = your_passwordport        = 3306socket      = /tmp/mysql.sock[mysqld]port        = 3306socket      = /tmp/mysql.sockdatadir = /usr/local/mysql/var......

分析: 红色部分信息datadir的值(/usr/local/mysql/var)为数据文件所在的文件夹

3、查看当前日志文件
命令:

mysql> show master status;

结果:

+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000013 | 93260078 |              |                  |                   |+------------------+----------+--------------+------------------+-------------------+

分析:其中 mysql-bin.000013 为当前备份的文件名。注意,文件存放在数据文件中。

4、以时间为终点导出对应数据库的操作SQL。
命令:

/usr/local/mysql/bin/mysqlbinlog --no-defaults  --stop-datetime="2017-12-22 06:00:00" --database=wordpress_wik  /usr/local/mysql/var/mysql-bin.000012 > data.sql

结果:

WARNING: The option --database has been used. It may filter parts of transactions, but will include the GTIDs in any case. If you want to exclude or include transactions, you should use the options --exclude-gtids or --include-gtids, respectively, instead.查看到data.sql文件

分析:已经产生当前数据库操操作的DDL日志文件。

5、导出问题表中的数据
命令:

more data.sql | grep --ignore-case -E 'insert|update|delete' -A2 -B2 | grep wiki_posts > wiki.sql

结果:

--, 查看到wiki.sql文件

分析:已经从整个数据库文件过滤出wiki_post表操作记录

6、 在每条数据库操作后添加分号(;),将数据中的异常数据(0000-00-00 00:00:00)修改为(1987-01-01 00:00:00)
使用vim打开,使用vim命令
命令:

%s/$/;
%s/0000-00-00/1970-01-01

结果:

看到每行后的分号, 以及修改成功的数据

分析:添加成功

7、备份现有库中的数据
命令:

mysqldump  -uroot -p'密码' wordpress_wiki >wiki.sql

结果:

queryOK

分析:数据备份完成

8、清空问题表中的数据
命名:

truncate table wiki_post

结果:

Query OK

分析:表中数据清理完成

9、执行操作数据
命令:

 mysql -uroot -p'密码' -Dwordpress_wik --max_allowed_packet=50M --force -f  < ./wiki.sql

结果:

等待命令执行结束

分析:数据操作成功

此时文章已经找回

构造方法

** 必须满足以下的语法规则**

  • 方法名与类名相同。
  • 不要返回类型(例如return、void等)。
  • 不能被static、final、native、abstract和synchronized修饰,不能被子类继承。

如果在一个类里不写默认构造时,那么系统会默认创建一个无参构造,这个构造器会把所有有属性参数设置为默认值
如果类中至少有一个构造器,但没有提供无参构造时,在实例化对象时不提狗参数就会被认为不合法

private修饰构造方法时

  • 构造方法被private修饰时,意味着只能在当前类中访问它
  • 当前类的其他构造方法中可以通过this语句调用
  • 还可以在当前类的成员方法中使用new调用。

MVC模型

MVC全名是Model View Controller,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。

MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:
  • Model(模型)表示应用程序核心(比如数据库记录列表)。
    1. Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
    2. 通常模型对象负责在数据库中存取数据。
  • View(视图)显示数据(数据库记录)。
    1. View(视图)是应用程序中处理数据显示的部分。
    2. 通常视图是依据模型数据创建的。
  • Controller(控制器)处理输入(写入数据库记录)。
    1. Controller(控制器)是应用程序中处理用户交互的部分。
    2. 通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

                                -by 看到不懂啊
##———————————————2017-12-24 星期日——————————————————–

AWT与Swing的关系

它的名字缩写是(Abstract Window Toolkit),是基于 Windows 的重量级组件。
AWT和Swing都是java中的包。
AWT(Abstract Window Toolkit):抽象窗口工具包,早期编写图形界面应用程序的包。

Swing :为解决 AWT 存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。

AWT和Swing的实现原理不同:

AWT的图形函数与操作系统提供的图形函数有着一一对应的关系。也就是说,当我们利用 AWT构

件图形用户界面的时候,实际上是在利用操作系统的图形库。

不同的操作系统其图形库的功能可能不一样,在一个平台上存在的功能在另外一个平台上则可能不存在。

为了实现Java语言所宣称的”一次编译,到处运行”的概念,AWT不得不通过牺牲功能来实现平台无关

性。因此,AWT 的图形功能是各操作系统图形功能的“交集”。

因为AWT是依靠本地方法来实现功能的,所以AWT控件称为“重量级控件”。

而Swing ,不仅提供了AWT 的所有功能,还用纯粹的Java代码对AWT的功能进行了大幅度的扩充。

例如:并不是所有的操作系统都提供了对树形控件的支持, Swing则利用了AWT中所提供的基本作图方

法模拟了一个树形控件。

由于 Swing是用纯粹的Java代码来实现的,因此Swing控件在各平台通用。

因为Swing不使用本地方法,故Swing控件称为“轻量级控件”。

AWT和Swing之间的区别

   1)AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。
   2)AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。
   在实际应用中,应该使用AWT还是Swing取决于应用程序所部署的平台类型。例如:
   1)对于一个嵌入式应用,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT当然成了嵌入式Java的第一选择。
   2)在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素。所以在标准版的Java中则提倡使用Swing, 也就是通过牺牲速度来实现应用程序的功能。

注意:在java中,AWT包的名称是java.awt,Swing包的名称是javax.swing。

在AMT组件中分为两大类,这两类的基类分别是Component和MenuComponent,其中,

MenuComponent是所有与菜单相关组件的父类,Component则是除菜单外其他AMT组件的父类,它表示

一个能以图形化方式显示出来,并可与用户交互的对象。

Component类通常被称为组件,根据Component的不同作用,可将其分为基本组件类和容器类。基本

组件类是按钮,文本框之类的,容器类则是通过Component的子类Container实例化的对象。

Container又分为Window和Pannel,Window又分为Frame和Dialog,Frame是窗体,Dialog是对

话框。Panel是中间容器。

下面是我一些总结出来的方法;
首先定义一个窗口,比如说是某个程序的登录界面把。我这里是简单版的QQ登录界面
一共三步

public class LoginFrame excends JFrame{
【步骤一】
//private ******            你要添加的按钮。标签。文字。背景。。等
//private ******
//private ******
//private ******
【步骤二】
public LoginFrame(){
//在默认构造里面定义窗口标题、窗口大小

//设置窗口关闭时的动作

//接下来开始把上面你定义东西一一写在这里。不过方便起见,一般我们把这个步骤单独写在一个    方法中,然后在这里调用。

//initComponents()                      //这里先调用方法,然后往下写方法内容
}

【步骤三】
//以下部分是方法
private void initComponents(){
     /**定义步骤大体如下;

     * 1.获得内容面板对象(在最上面你定义的那些东西)

     * 2.将内容面板的布局设置定义为 NULL.(这里不设置null的话可能会有默认值。谁知道 *******它把内容面板默认定义成多少呢)

     * 3.获得contentPane对象,并转换成JPanel类型,方便操作。

     * 4.为每个控件设置边界和背景颜色等等
     */
}
【最后在这里测试运行】
public static void main(String[] ages){
//先实例化一下
Loginframe abc = new Loginframe();
abc.setVisible(true);                   //这句话应该是运存的意思
}
}

以下是简易代码

public class Loginframe extends JFrame  {//extends是继承的意思.JFRAME是新版本
//定义了一些标签,按钮,单选和复选框,文本框(明文和密文)
private JCheckBox abc = new JCheckBox("记住密码");      //定义一个复选框
private JCheckBox adb = new JCheckBox("自动登录");      //定义一个复选框
private JLabel lblQQID = new JLabel("QQ号码");        //定义一个标签
private JLabel lblQQPwd = new JLabel("QQ密码");       //定义一个标签
//标签明文文本框
private JTextField txtQQID = new JTextField();      //登录QQ文本框
//标签密文文本框
private JPasswordField txtPwd = new JPasswordField();   //QQ密码文本框
//按钮
private JButton btnLogin = new JButton("登录");       //定义了一个按钮
private JComboBox jcb = new JComboBox();        //这里定义了一个下拉菜单
private JLabel lblRegNewId = new JLabel("<u>申请号码</u>"); 
private JLabel lblForgetPwd = new JLabel("忘记密码");   
    /**
*是标签的用法
*是网页标签。可以指向一个网页
*<u>*****</u> 是让中间的文字有下划线功能
*//LEFT、RIGHT、CENTER、LEADING 、TRAILING等参数表示label/jlabel中内容对齐方式:*****左对齐、右对齐、居中、靠顶对齐、靠下对齐
**/

//默认构造
public Loginframe(){
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setTitle("QQ用户登录");                 //窗口标题
    setSize(300, 600);                      //窗口的大小
    initComponents();                       //调用自定义方法初始窗体组件
}

public void initComponents(){
    JPanel contentPane = (JPanel)getContentPane();
    contentPane.setLayout(null);
    lblQQID.setBounds(45, 140, 150, 20);
    lblQQPwd.setBounds(45, 180, 150, 20);
    txtQQID.setBounds(45,160,150,20);
    txtPwd.setBounds(45,200,150,20);
    image.setBounds(0, 0, 300, 130);
    image2.setBounds(0,0,300,600);
    abc.setBounds(45,230,80,20);
    abc.setOpaque(false);
    /**
    *setOpaque(true) 不透明
    *setOpaque(flase) 透明
    **/
    adb.setBounds(45,255,80,20);
    adb.setOpaque(false);
    btnLogin.setBounds(85,333,80,20);
    lblRegNewId.setBounds(45, 390, 80, 20);
    lblForgetPwd.setBounds(45, 410, 80, 20);
    jcb.addItem("");
    jcb.addItem("我在线上");
    jcb.addItem("隐身");
    jcb.addItem("离开");
    jcb.addItem("切勿打扰");
    jcb.setSelectedItem("请勿打扰");
    /**
    *SelectedItem是默认已经存在的对象.比如jcb.setSelectedItem("忙碌");这样是不行
    *的,因为上面没有定义(add)
    **/
    jcb.setBounds(85,355,80,20);
    //设置标签文本的颜色
    lblRegNewId.setForeground(Color.RED);
    lblForgetPwd.setForeground(Color.RED);
    /**
    *setForeground是设置前景颜色的意思
    *格式是setFoeeground(Color fg);
    **/
    //设置鼠标经过时为手的形状  Cursor: 光标对象
    lblRegNewId.setCursor(new Cursor(Cursor.HAND_CURSOR));
    lblForgetPwd.setCursor(new Cursor(Cursor.HAND_CURSOR)); 
    /**
    *Cursor.HEAD_CURSOR         //鼠标经过显示手
    *Cursor.DEFAULT_CURSOR      //鼠标经过显示箭头
    **/
    //添加部分
    contentPane.add(lblQQID);
    contentPane.add(lblQQPwd);
    contentPane.add(txtQQID);
    contentPane.add(txtPwd);
    contentPane.add(abc);
    contentPane.add(adb);
    contentPane.add(btnLogin);
    contentPane.add(jcb);
    contentPane.add(lblRegNewId);
    contentPane.add(lblForgetPwd);
}

public static void main(String[] ages){
Loginframe  LoginFrame = new Loginframe();
LoginFrame.setVisible(true)             //使可视化组建f(如窗口、面板等)可见
}
}

以下是运行结果


如果有哪些地方写的不规范、有BUG、没有缩进等不好的地方,请多指教我这个菜鸟

专业版的intellij可以免费试用30天。为了以后开发方便,找了个破解方案。
选择菜单Configure->Manage License,填上http://idea.iteblog.com/key.php,如图所示:

点击Activate,然后就搞定了。

不过总觉得这么做不是很厚道啊,毕竟人家花了很多心血做了优秀的产品。所以,经费充裕的小伙伴们,还是花点小钱买个正版吧。。。

 C/C++主要用于PC软件开发、底层开发、单片机和嵌入式系统;如:QQ、Windows、英雄联盟、Linux、Unix。
 Java和C#不但可以用来开发软件,还可以用来开发网站后台程序;后续我们介绍的Eclipse就是采用Java开发。Windows的MSDN网站使用的就是C#技术。咱们常用京东、淘宝等网站就是使用Java开发。
 PHP技术主要用于Web网站开发,属于服务端脚本语言。比如一些门户网站、服务号。比如我们老九学堂的服务号的二次开发就是采用的PHP。
 JavaScript 主要负责网站的前端工作(现在也有公司使用 Node.js 开发网站后台)。