首先看一下FTP软件的整体代码框架,具体内容如下
1、首先介绍程序的主入口FTPMain.java,采用了一个漂亮的外观风格
package com.oyp.ftp;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.UIManager;
import com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel;
public class FTPMain {
/**
* 本应用的程序入口
*/
public static void main(String args[]) {
//导致 runnable 的 run 方法在 EventQueue 的指派线程上被调用。
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
try {
//使用 LookAndFeel 对象设置当前的默认外观。
UIManager.setLookAndFeel(new NimbusLookAndFeel());//设置一个非常漂亮的外观
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
FTPClientFrame client_Frame = new FTPClientFrame();
client_Frame.setVisible(true);
} catch (Exception ex) {
Logger.getLogger(FTPClientFrame.class.getName()).log(
Level.SEVERE, null, ex);
}
}
});
}
}
2、介绍界面的主程序代码FTPClientFrame.java
package com.oyp.ftp;
import java.awt.AWTException;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JSeparator;
import javax.swing.JSplitPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.UIManager;
import com.oyp.ftp.panel.ftp.FtpPanel;
import com.oyp.ftp.panel.local.LocalPanel;
import com.oyp.ftp.panel.manager.FtpSiteDialog;
import com.oyp.ftp.panel.queue.DownloadPanel;
import com.oyp.ftp.panel.queue.QueuePanel;
import com.oyp.ftp.panel.queue.UploadPanel;
import com.oyp.ftp.utils.FtpClient;
import com.oyp.ftp.utils.SiteInfoBean;
import com.sun.java.swing.plaf.nimbus.*;
public class FTPClientFrame extends javax.swing.JFrame {
FtpClient ftpClient;
private JPasswordField PassField;
private JButton cutLinkButton;
FtpPanel ftpPanel;
LocalPanel localPanel;
private JTextField portTextField;
private JTextField serverTextField;
private JTextField userTextField;
private QueuePanel queuePanel;
private UploadPanel uploadPanel;
private DownloadPanel downloadPanel;
private JSplitPane jSplitPane1;
private JButton linkButton;
private final LinkToAction LINK_TO_ACTION; // 连接到 按钮的动作处理器
private final CutLinkAction CUT_LINK_ACTION; // 断开 按钮的动作处理器
private SystemTray systemTray;
private JToggleButton shutdownButton;
private final ImageIcon icon = new ImageIcon(getClass().getResource(
"/com/oyp/ftp/res/trayIcon.png"));
public FTPClientFrame() {
LINK_TO_ACTION = new LinkToAction(this, "连接到", null);
CUT_LINK_ACTION = new CutLinkAction(this, "断开", null);
initComponents();
initSystemTray();
}
/**
* 初始化系统托盘的方法
*/
private void initSystemTray() {
if (SystemTray.isSupported())
systemTray = SystemTray.getSystemTray();
TrayIcon trayIcon = new TrayIcon(icon.getImage());
PopupMenu popupMenu = new PopupMenu("托盘菜单");
// 创建显示主窗体菜单项
MenuItem showMenuItem = new MenuItem("显示主窗体");
showMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
FTPClientFrame.this.setExtendedState(JFrame.NORMAL);
FTPClientFrame.this.setVisible(true);
}
});
// 创建退出菜单项
MenuItem exitMenuItem = new MenuItem("退出");
exitMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
popupMenu.add(showMenuItem);
popupMenu.addSeparator();
popupMenu.add(exitMenuItem);
trayIcon.setPopupMenu(popupMenu);
try {
systemTray.add(trayIcon);
} catch (AWTException e) {
e.printStackTrace();
}
}
/**
* 初始化程序界面的方法
*/
private void initComponents() {
setIconImage(icon.getImage());
java.awt.GridBagConstraints gridBagConstraints;
JPanel jPanel1 = new JPanel();
JToolBar jToolBar1 = new JToolBar();
JButton linkTo = new JButton();
cutLinkButton = new JButton();
JPanel jPanel4 = new JPanel();
JLabel jLabel1 = new JLabel();
serverTextField = new JTextField();
JLabel jLabel2 = new JLabel();
userTextField = new JTextField();
JLabel jLabel3 = new JLabel();
PassField = new JPasswordField();
JLabel jLabel6 = new JLabel();
portTextField = new JTextField();
linkButton = new JButton();
JSplitPane jSplitPane2 = new JSplitPane();
jSplitPane1 = new JSplitPane();
ftpPanel = new FtpPanel(this); // 初始化FTP远程资源面板
localPanel = new LocalPanel(this); // 初始化本地资源管理面板
uploadPanel = new UploadPanel(); // 初始化上传队列面板
downloadPanel = new DownloadPanel(); // 初始化下载队列面板
queuePanel = new QueuePanel(this); // 初始化队列面板
JTabbedPane jTabbedPane1 = new JTabbedPane();
JMenuBar MenuBar = new JMenuBar();
JMenu fileMenu = new JMenu();
JMenuItem ftpManageMenuItem = new JMenuItem();
JSeparator jSeparator1 = new JSeparator();
JMenuItem linkToMenuItem = new javax.swing.JMenuItem();
JMenuItem cutMenuItem = new javax.swing.JMenuItem();
JSeparator jSeparator2 = new javax.swing.JSeparator();
JMenuItem exitMenuItem = new javax.swing.JMenuItem();
JMenuItem uploadMenuItem = new javax.swing.JMenuItem();
JSeparator jSeparator3 = new javax.swing.JSeparator();
JMenuItem createFolderMenuItem = new javax.swing.JMenuItem();
JMenuItem renameMenuItem = new javax.swing.JMenuItem();
JMenuItem delMenuItem = new javax.swing.JMenuItem();
JMenu ftpMenu = new javax.swing.JMenu();
JMenuItem downMenuItem = new javax.swing.JMenuItem();
JSeparator jSeparator6 = new javax.swing.JSeparator();
JMenuItem ftpDelMenuItem = new javax.swing.JMenuItem();
JMenuItem ftpRenameMenuItem = new javax.swing.JMenuItem();
JMenuItem newFolderMenuItem = new javax.swing.JMenuItem();
JMenu helpMenu = new javax.swing.JMenu();
JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
JMenuItem bugMenuItem = new javax.swing.JMenuItem();
// setTitle("基于Socket的FTP软件Java实现");
setTitle("Java语言实现简单FTP软件__欧阳鹏设计");
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowOpened(java.awt.event.WindowEvent evt) {
formWindowOpened(evt);
}
public void windowIconified(final WindowEvent e) {
setVisible(false);
}
});
addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
formComponentResized(evt);
}
});
getContentPane().setLayout(new java.awt.GridBagLayout());
jPanel1.setLayout(new java.awt.GridLayout(0, 1));
jToolBar1.setRollover(true);
jToolBar1.setFloatable(false);
linkTo.setText("连接到");
linkTo.setFocusable(false);
linkTo.setAction(LINK_TO_ACTION);
jToolBar1.add(linkTo);
cutLinkButton.setText("断开");
cutLinkButton.setEnabled(false);
cutLinkButton.setFocusable(false);
cutLinkButton.setAction(CUT_LINK_ACTION);
jToolBar1.add(cutLinkButton);
jPanel1.add(jToolBar1);
shutdownButton = new JToggleButton();
shutdownButton.setText("自动关机");
shutdownButton.setToolTipText("队列完成后,自动关闭计算机");
shutdownButton.setFocusable(false);
jToolBar1.add(shutdownButton);
jPanel4.setBorder(javax.swing.BorderFactory.createEtchedBorder());
jPanel4.setLayout(new javax.swing.BoxLayout(jPanel4,
javax.swing.BoxLayout.LINE_AXIS));
jLabel1.setText("主机地址:");
jPanel4.add(jLabel1);
serverTextField.setText("192.168.1.100");
serverTextField.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
LinkFTPKeyPressed(evt);
}
});
jPanel4.add(serverTextField);
jLabel2.setText("用户名:");
jPanel4.add(jLabel2);
userTextField.setText("oyp");
userTextField.setMaximumSize(new java.awt.Dimension(200, 2147483647));
userTextField.setPreferredSize(new java.awt.Dimension(100, 21));
userTextField.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
LinkFTPKeyPressed(evt);
}
});
jPanel4.add(userTextField);
jLabel3.setText("密码:");
jPanel4.add(jLabel3);
PassField.setText("oyp");
PassField.setMaximumSize(new java.awt.Dimension(200, 2147483647));
PassField.setPreferredSize(new java.awt.Dimension(100, 21));
PassField.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
LinkFTPKeyPressed(evt);
}
});
jPanel4.add(PassField);
jLabel6.setText("端口:");
jPanel4.add(jLabel6);
portTextField.setText("21");
portTextField.setMaximumSize(new java.awt.Dimension(100, 2147483647));
portTextField.setPreferredSize(new java.awt.Dimension(50, 21));
portTextField.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
LinkFTPKeyPressed(evt);
}
});
jPanel4.add(portTextField);
linkButton.setText("连接");
linkButton.setFocusable(false);
linkButton.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
linkButton.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
linkButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
linkButtonActionPerformed(evt);
}
});
jPanel4.add(linkButton);
jPanel1.add(jPanel4);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0; //指定包含组件的显示区域开始边的单元格,其中行的第一个单元格为 gridx=0。
gridBagConstraints.gridy = 0; //指定位于组件显示区域的顶部的单元格,其中最上边的单元格为 gridy=0。
//当组件的显示区域大于它所请求的显示区域的大小时使用此字段。
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; //在水平方向而不是垂直方向上调整组件大小。
gridBagConstraints.weightx = 1.0; //指定如何分布额外的水平空间。
getContentPane().add(jPanel1, gridBagConstraints);
jSplitPane2.setBorder(null);
jSplitPane2.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane2.setResizeWeight(1.0);
jSplitPane2.setContinuousLayout(true);
jSplitPane1.setDividerLocation(400);
jSplitPane1.setDividerSize(10);
jSplitPane1.setOneTouchExpandable(true);
jSplitPane1.setRightComponent(ftpPanel);
jSplitPane1.setLeftComponent(localPanel);
jSplitPane2.setLeftComponent(jSplitPane1);
jTabbedPane1.setMinimumSize(new java.awt.Dimension(40, 170));
jTabbedPane1.addTab("队列", queuePanel);// 添加队列面板
jTabbedPane1.addTab("上传队列", uploadPanel);// 添加上传面板
jTabbedPane1.addTab("下载队列", downloadPanel);// 添加下载面板
jSplitPane2.setBottomComponent(jTabbedPane1);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; //在水平方向和垂直方向上同时调整组件大小。
gridBagConstraints.weightx = 1.0; //指定如何分布额外的水平空间。
gridBagConstraints.weighty = 1.0; //指定如何分布额外的垂直空间。
getContentPane().add(jSplitPane2, gridBagConstraints);
fileMenu.setMnemonic('f');
fileMenu.setText("站点(F)");
ftpManageMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_S,
java.awt.event.InputEvent.CTRL_MASK));
ftpManageMenuItem.setText("FTP站点管理(S)");
ftpManageMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// System.out.println("action");
FtpSiteDialog dialog = new FtpSiteDialog(FTPClientFrame.this);
dialog.setVisible(true);
}
});
fileMenu.add(ftpManageMenuItem);
fileMenu.add(jSeparator1);
linkToMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_C,
java.awt.event.InputEvent.CTRL_MASK));
linkToMenuItem.setText("连接到...(C)");
linkToMenuItem.setAction(LINK_TO_ACTION);
fileMenu.add(linkToMenuItem);
cutMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_Z,
java.awt.event.InputEvent.CTRL_MASK));
cutMenuItem.setText("断开(Z)");
cutMenuItem.setAction(CUT_LINK_ACTION);
fileMenu.add(cutMenuItem);
fileMenu.add(jSeparator2);
exitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(
java.awt.event.KeyEvent.VK_X,
java.awt.event.InputEvent.CTRL_MASK));
exitMenuItem.setText("退出(X)");
exitMenuItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
fileMenu.add(exitMenuItem);
MenuBar.add(fileMenu);
JMenu localMenu = new JMenu();
localMenu.setMnemonic('l');
localMenu.setText("本地(L)");
uploadMenuItem.setMnemonic('U');
uploadMenuItem.setText("上传(U)");
uploadMenuItem.setAction(localPanel.getActionMap().get("uploadAction"));
localMenu.add(uploadMenuItem);
localMenu.add(jSeparator3);
createFolderMenuItem.setMnemonic('C');
createFolderMenuItem.setText("新建文件夹(C)");
createFolderMenuItem.setAction(localPanel.getActionMap().get(
"createFolderAction"));
localMenu.add(createFolderMenuItem);
renameMenuItem.setMnemonic('R');
renameMenuItem.setText("重命名(R)");
renameMenuItem.setAction(localPanel.getActionMap().get("renameAction"));
localMenu.add(renameMenuItem);
delMenuItem.setMnemonic('D');
delMenuItem.setText("删除(D)");
delMenuItem.setAction(localPanel.getActionMap().get("delAction"));
localMenu.add(delMenuItem);
JMenuItem localrefreshMenuItem = new JMenuItem();
localrefreshMenuItem.setMnemonic('R');
localrefreshMenuItem.setText("刷新(R)");
localrefreshMenuItem.setAction(localPanel.getActionMap().get(
"refreshAction"));
localMenu.add(localrefreshMenuItem);
MenuBar.add(localMenu);
ftpMenu.setMnemonic('r');
ftpMenu.setText("远程(R)");
downMenuItem.setMnemonic('U');
downMenuItem.setText("下载(U)");
downMenuItem.setAction(ftpPanel.getActionMap().get("downAction"));
ftpMenu.add(downMenuItem);
ftpMenu.add(jSeparator6);
ftpDelMenuItem.setMnemonic('D');
ftpDelMenuItem.setText("删除(D)");
ftpDelMenuItem.setAction(ftpPanel.getActionMap().get("delAction"));
ftpMenu.add(ftpDelMenuItem);
ftpRenameMenuItem.setMnemonic('R');
ftpRenameMenuItem.setText("重命名(R)");
ftpRenameMenuItem
.setAction(ftpPanel.getActionMap().get("renameAction"));
ftpMenu.add(ftpRenameMenuItem);
newFolderMenuItem.setMnemonic('C');
newFolderMenuItem.setText("新建文件夹(C)");
newFolderMenuItem.setAction(ftpPanel.getActionMap().get(
"createFolderAction"));
ftpMenu.add(newFolderMenuItem);
JMenuItem refreshMenuItem = new JMenuItem();
refreshMenuItem.setMnemonic('R');
refreshMenuItem.setText("刷新(R)");
refreshMenuItem.setAction(ftpPanel.getActionMap().get("refreshAction"));
ftpMenu.add(refreshMenuItem);
MenuBar.add(ftpMenu);
helpMenu.setText("帮助(H)");
aboutMenuItem.setMnemonic('a');
aboutMenuItem.setText("关于(A)");
aboutMenuItem.addActionListener(new AboutItemAction(this));
helpMenu.add(aboutMenuItem);
bugMenuItem.setMnemonic('u');
bugMenuItem.setText("错误报告(U)");
bugMenuItem.addActionListener(new BugItemAction());
helpMenu.add(bugMenuItem);
MenuBar.add(helpMenu);
setJMenuBar(MenuBar);
java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit()
.getScreenSize();
setBounds((screenSize.width - 800) / 2, (screenSize.height - 600) / 2,
800, 700);
}
public JToggleButton getShutdownButton() {
return shutdownButton;
}
/**
* 窗体装载的事件处理方法
*/
private void formWindowOpened(java.awt.event.WindowEvent evt) {
jSplitPane1.setDividerLocation(0.50);
localPanel.getLocalDiskComboBox().setSelectedIndex(1);
localPanel.getLocalDiskComboBox().setSelectedIndex(0);
}
/**
* 窗体大小调整的事件处理方法
*/
private void formComponentResized(java.awt.event.ComponentEvent evt) {
jSplitPane1.setDividerLocation(0.50);
}
/**
* 连接按钮的事件处理方法
*/
private void linkButtonActionPerformed(java.awt.event.ActionEvent evt) {
try {
String server = serverTextField.getText(); // 获取服务器地址
if (server == null) {
return;
}
String portStr = portTextField.getText(); // 获取端口号
if (portStr == null) {
portStr = "21";
}
int port = Integer.parseInt(portStr.trim());
String userStr = userTextField.getText(); // 获取用户名
userStr = userStr == null ? "" : userStr.trim();
String passStr = PassField.getText(); // 获取密码
passStr = passStr == null ? "" : passStr.trim();
cutLinkButton.doClick();
ftpClient = new FtpClient();
ftpClient.openServer(server.trim(), port); // 连接服务器
ftpClient.login(userStr, passStr); // 登录服务器
ftpClient.binary(); // 使用二进制传输模式
if (ftpClient.serverIsOpen()) { // 如果连接成功
CUT_LINK_ACTION.setEnabled(true); // 设置断开按钮可用
} else { // 否则
CUT_LINK_ACTION.setEnabled(false); // 设置断开按钮不可用
return; // 并结束事件处理
}
// 设置本地资源管理面板的FTP连接信息
localPanel.setFtpClient(server, port, userStr, passStr);
// 设置上传按钮可用
localPanel.getActionMap().get("uploadAction").setEnabled(true);
ftpPanel.setFtpClient(ftpClient);// 设置FTP资源管理面板的FTP连接信息
// 设置下载按钮可用
ftpPanel.getActionMap().get("downAction").setEnabled(true);
ftpPanel.refreshCurrentFolder();// 刷新FTP资源管理面板的当前文件夹
queuePanel.startQueue(); // 启动任务队列线程
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 连接FTP相关的文本框 和密码框的回车事件
*/
private void LinkFTPKeyPressed(java.awt.event.KeyEvent evt) {
if (evt.getKeyChar() == '\n') {
linkButton.doClick();
}
}
public LocalPanel getLocalPanel() {
return localPanel;
}
public FtpPanel getFtpPanel() {
return ftpPanel;
}
public QueuePanel getQueuePanel() {
return queuePanel;
}
public UploadPanel getUploadPanel() {
return uploadPanel;
}
public DownloadPanel getDownloadPanel() {
return downloadPanel;
}
public FtpClient getFtpClient() {
return ftpClient;
}
/**
* 设置FTP连接信息的方法,由FTP站点管理器调用
*/
public void setLinkInfo(SiteInfoBean bean) {
serverTextField.setText(bean.getServer()); // 设置主机地址
portTextField.setText(bean.getPort() + ""); // 设置端口号
userTextField.setText(bean.getUserName()); // 设置用户名
PassField.setText(""); // 密码清空
PassField.requestFocus(); // 密码框请求焦点
}
}
整体界面如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Java
# FTP
# 主界面
# iis创建用户隔离模式FTP站点的方法
# 如何编写一个创建FTP站点的函数?
# Java语言实现简单FTP软件 FTP上传下载管理模块实现(11)
# Java语言实现简单FTP软件 FTP远程文件管理模块实现(10)
# Java语言实现简单FTP软件 FTP本地文件管理模块实现(9)
# Java语言实现简单FTP软件 FTP连接管理模块实现(8)
# Java语言实现简单FTP软件 FTP软件远程窗口实现(6)
# Java语言实现简单FTP软件 FTP软件效果图预览之下载功能(2)
# Java语言实现简单FTP软件 FTP协议分析(1)
# Java语言实现简单FTP软件 辅助功能模块FTP站点管理实现(12)
# 连接到
# 上传
# 单元格
# 资源管理
# 重命名
# 端口号
# 菜单项
# 第一个
# 主程序
# 采用了
# 管理器
# 看一下
# 错误报告
# 具体内容
# 不可用
# 大家多多
# 清空
# 文本框
# 自动关机
# 自动关闭
相关文章:
移民网站制作流程,怎么看加拿大移民官网?
营销式网站制作方案,销售哪个网站招聘效果最好?
宝塔新建站点报错如何解决?
如何快速搭建高效WAP手机网站吸引移动用户?
微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?
建站之星后台密码遗忘?如何快速找回?
如何规划企业建站流程的关键步骤?
建站之星3.0如何解决常见操作问题?
如何在阿里云服务器自主搭建网站?
网站制作软件有哪些,制图软件有哪些?
如何有效防御Web建站篡改攻击?
建站之星微信建站一键生成小程序+多端营销系统
小型网站制作HTML,*游戏网站怎么搭建?
建站上市公司网站建设方案与SEO优化服务定制指南
广州营销型建站服务商推荐:技术优势与SEO优化解析
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
如何在VPS电脑上快速搭建网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
活动邀请函制作网站有哪些,活动邀请函文案?
如何用免费手机建站系统零基础打造专业网站?
如何做网站制作流程,*游戏网站怎么搭建?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何在IIS中配置站点IP、端口及主机头?
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
定制建站价位费用解析与套餐推荐全攻略
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
建站主机选虚拟主机还是云服务器更好?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
如何在阿里云虚拟服务器快速搭建网站?
网站微信制作软件,如何制作微信链接?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
建站上传速度慢?如何优化加速网站加载效率?
三星网站视频制作教程下载,三星w23网页如何全屏?
制作农业网站的软件,比较好的农业网站推荐一下?
如何在建站之星绑定自定义域名?
如何用低价快速搭建高质量网站?
制作门户网站的参考文献在哪,小说网站怎么建立?
如何快速搭建支持数据库操作的智能建站平台?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
如何在IIS中新建站点并配置端口与物理路径?
如何选择美橙互联多站合一建站方案?
北京网站制作网页,网站升级改版需要多久?
宝塔建站后网页无法访问如何解决?
高端云建站费用究竟需要多少预算?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
建站三合一如何选?哪家性价比更高?
南平网站制作公司,2025年南平市事业单位报名时间?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何挑选优质建站一级代理提升网站排名?
*请认真填写需求信息,我们会在24小时内与您取得联系。