首页 > 编程语言 >记事本桌面应用程序开发。

记事本桌面应用程序开发。

时间:2023-09-06 19:12:48浏览次数:43  
标签:VK 桌面 KeyEvent 程序开发 add JMenuItem new 记事本 ta

这里是一个菜鸟独立开发的一个记事本桌面应用程序。主要的内容是通过swing与awt等包的内容进行的开发

我这个人比较随意,可能会比较乱,有问题希望可以谅解一下并且指出一下问题方便接下来的修改


import javax.swing.*;
import javax.swing.filechooser.*;
import javax.swing.text.*;
import javax.swing.undo.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.io.*;
import java.net.URI;
import java.text.SimpleDateFormat;
import java.util.Date;


public class oneman extends JFrame implements ActionListener {

boolean wordWrapEnabled = true; //判断换行功能与按钮是否对应上
UndoManager undoManager; //管理撤销功能的成员变量
int curr;
JTextField NewTextField; //添加一个新的文本框
JTextArea ta;
JDialog gotoDialog;//转到 功能的对话框
JScrollPane jsp;

JMenuItem jm11; //这里是五个菜单项的命名规律,数字1开头的就是第一个菜单项的功能,按照顺序从上往下排序
JMenuItem jm12;
JMenuItem jm13;
JMenuItem jm14;
JMenuItem jm15;
JMenuItem jm16;
JMenuItem jm17;
JMenuItem jm18;


JMenuItem jm2;
JMenuItem jm21;
JMenuItem jm22;
JMenuItem jm23;
JMenuItem jm24;
JMenuItem jm25;
JMenuItem jm26;
JMenuItem jm27;
JMenuItem jm28;
JMenuItem jm29;
JMenuItem jm211;
JMenuItem jm212;
JMenuItem times;

JCheckBoxMenuItem jm31;

JMenuItem jm32;

JDialog fontDialog;
JSlider fontSizeSlider;


JMenuItem jm41;
JMenuItem jm42;
JMenuItem jm51;
JMenuItem jm52;
JMenuItem jm53;

public oneman() {
this.setSize(690, 520);
this.setTitle("记事本");
ta = new JTextArea();
ta.setLineWrap(wordWrapEnabled); //设置自动换行 默认关闭
ta.setWrapStyleWord(true); //设置换行不断字
jsp = new JScrollPane(ta);
this.add(jsp);


JMenuBar jMenuBar = new JMenuBar();
this.setJMenuBar(jMenuBar);
this.setVisible(true);


undoManager = new UndoManager();//初始化
ta.getDocument().addUndoableEditListener(undoManager);

JMenu fileMeun = new JMenu("文件(F)");
fileMeun.setMnemonic(KeyEvent.VK_F);
fileMeun.addActionListener(this);
jMenuBar.add(fileMeun);

JMenu eiirMenu = new JMenu("編輯(E)");
eiirMenu.setMnemonic(KeyEvent.VK_E);
eiirMenu.addActionListener(this);
jMenuBar.add(eiirMenu);

JMenu option = new JMenu("格式(O)");
option.setMnemonic(KeyEvent.VK_O);
option.addActionListener(this);
jMenuBar.add(option);

JMenu lookMenu = new JMenu("查看(V)");
lookMenu.setMnemonic(KeyEvent.VK_V);
lookMenu.addActionListener(this);
jMenuBar.add(lookMenu);

JMenu helpMeun = new JMenu("帮助(H)");
helpMeun.setMnemonic(KeyEvent.VK_H);
helpMeun.addActionListener(this);
jMenuBar.add(helpMeun);


jm11 = new JMenuItem("新建(N)");
jm11.setMnemonic(KeyEvent.VK_N);
jm11.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
jm11.addActionListener(this);
fileMeun.add(jm11);

jm12 = new JMenuItem("新窗口(W)");
jm12.setMnemonic(KeyEvent.VK_W);
jm12.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK));
jm12.addActionListener(this);
fileMeun.add(jm12);


jm13 = new JMenuItem("打开(O)");
jm13.setMnemonic(KeyEvent.VK_O);
jm13.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
jm13.addActionListener(this);
fileMeun.add(jm13);

jm14 = new JMenuItem("保存(S)");
jm14.setMnemonic(KeyEvent.VK_S);
jm14.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
jm14.addActionListener(this);
fileMeun.add(jm14);


jm15 = new JMenuItem("另存为(A)");
jm15.setMnemonic(KeyEvent.VK_A);
jm15.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK | InputEvent.SHIFT_MASK));
jm15.addActionListener(this);
fileMeun.add(jm15);

fileMeun.addSeparator();

jm16 = new JMenuItem("页面设置(U)");
jm16.setMnemonic(KeyEvent.VK_U);
jm16.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK));
jm16.addActionListener(this);
fileMeun.add(jm16);

jm17 = new JMenuItem("打印(P)");
jm17.setMnemonic(KeyEvent.VK_P);
jm17.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
jm17.addActionListener(this);
fileMeun.add(jm17);

fileMeun.addSeparator();

jm18 = new JMenuItem("退出(X)");
jm18.addActionListener(this);
fileMeun.add(jm18);

//t第2列功能
jm2 = new JMenuItem("撤销(U)");
jm2.setMnemonic(KeyEvent.VK_U);
jm2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
jm2.addActionListener(this);
eiirMenu.add(jm2);


eiirMenu.addSeparator();

jm21 = new JMenuItem("剪切(T)");
jm21.setMnemonic(KeyEvent.VK_T);
jm21.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
jm21.addActionListener(this);
eiirMenu.add(jm21);


jm22 = new JMenuItem("复制(C)");
jm22.setMnemonic(KeyEvent.VK_C);
jm22.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
jm22.addActionListener(this);
eiirMenu.add(jm22);


jm23 = new JMenuItem("粘贴(P)");
jm23.setMnemonic(KeyEvent.VK_P);
jm23.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
jm23.addActionListener(this);
eiirMenu.add(jm23);


jm24 = new JMenuItem("删除(L)");
jm24.setMnemonic(KeyEvent.VK_L);
jm24.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, InputEvent.CTRL_MASK));
jm24.addActionListener(this);
eiirMenu.add(jm24);


eiirMenu.addSeparator();

jm25 = new JMenuItem("使用bing搜索");
jm25.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.CTRL_MASK));
jm25.addActionListener(this);
eiirMenu.add(jm25);


eiirMenu.addSeparator();

jm26 = new JMenuItem("查找(F)");
jm26.setMnemonic(KeyEvent.VK_F);
jm26.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK));
jm26.addActionListener(this);
eiirMenu.add(jm26);


jm27 = new JMenuItem("查找上一个(N)");
jm27.setMnemonic(KeyEvent.VK_N);
jm27.setAccelerator(KeyStroke.getKeyStroke((char) KeyEvent.VK_F3));
jm27.addActionListener(this);
eiirMenu.add(jm27);

jm28 = new JMenuItem("查找下一个(V)");
jm28.setMnemonic(KeyEvent.VK_V);
jm28.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3, InputEvent.SHIFT_MASK));
jm28.addActionListener(this);
eiirMenu.add(jm28);

jm29 = new JMenuItem("替换(R)");
jm29.setMnemonic(KeyEvent.VK_R);
jm29.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
jm29.addActionListener(this);
eiirMenu.add(jm29);


jm211 = new JMenuItem("转到(G)");
jm211.setMnemonic(KeyEvent.VK_G);
jm211.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
jm211.addActionListener(this);
eiirMenu.add(jm211);

eiirMenu.addSeparator();

jm212 = new JMenuItem("全选(A)");
jm212.setMnemonic(KeyEvent.VK_A);
jm212.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
jm212.addActionListener(this);
eiirMenu.add(jm212);


times = new JMenuItem("日期/时间(D)");
times.setMnemonic(KeyEvent.VK_F5);
times.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, InputEvent.CTRL_MASK));
times.addActionListener(this);
eiirMenu.add(times);


// 创建切换按钮
jm31 = new JCheckBoxMenuItem("自动换行(W)");
jm31.setSelected(wordWrapEnabled);
jm31.setMnemonic(KeyEvent.VK_W);
jm31.addActionListener(this);
option.add(jm31);

jm32 = new JMenuItem("字体(F)");
jm32.setMnemonic(KeyEvent.VK_F);
jm32.addActionListener(this);
option.add(jm32);



JMenuItem jm41 = new JMenuItem("缩放(Z)");
lookMenu.add(jm41);
JMenuItem jm42 = new JMenuItem("状态栏(S)");
lookMenu.add(jm42);

JMenuItem jm51 = new JMenuItem("查看帮助(H)");
helpMeun.add(jm51);
JMenuItem jm52 = new JMenuItem("发送反馈(F)");
helpMeun.add(jm52);
helpMeun.addSeparator();
JMenuItem jm53 = new JMenuItem("关于记事本(A)");
helpMeun.add(jm53);


this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);

}


@Override
public void actionPerformed(ActionEvent actionEvent) {
FileNameExtensionFilter filter = new FileNameExtensionFilter("*.txt", "txt");
if (actionEvent.getSource() == jm11) {
this.setTitle("无标题 - 记事本");
ta.setText("");
} else if (actionEvent.getSource() == jm12) { //打开新窗口
oneman om = new oneman();
} else if (actionEvent.getSource() == jm13) { //新建功能
JFileChooser fileChooser = new JFileChooser("d:");
fileChooser.setFileFilter(filter);
fileChooser.showOpenDialog(this);
File file = fileChooser.getSelectedFile();
this.setTitle(file.getName() + " - 记事本");
//实现打开文件读取文件内容功能
BufferedReader reader = null;
String str = null;
String[] sum = null;
try {
reader = new BufferedReader(new FileReader(file));
while ((str = reader.readLine()) != null) {
System.out.println(str);
ta.append(str);
}
} catch
(Exception e1) {
e1.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
} else if (actionEvent.getSource() == jm14) { //保存功能
JFileChooser fileChooser = new JFileChooser("d:");
fileChooser.setFileFilter(filter);
fileChooser.setDialogTitle("保存");
fileChooser.showSaveDialog(this);
File file = fileChooser.getSelectedFile();
if (file.getName().endsWith(".txt") == false)
file = new File(file.toString() + ".txt");
String str = ta.getText();
//保存
BufferedWriter bw = null;
FileWriter fw = null;
try {
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
System.out.println(str); //查看输入内容是否有问题
System.out.println(file); //查看文件路径
bw.write(str);
bw.newLine();
bw.flush();

} catch (Exception e1) {
e1.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
} catch (Exception e1) {
e1.printStackTrace();
}
}
} else if (actionEvent.getSource() == jm15) { //另存为
JFileChooser fileChooser = new JFileChooser("d:");
fileChooser.setFileFilter(filter);
fileChooser.setDialogTitle("另存为");
fileChooser.showSaveDialog(this);
File file = fileChooser.getSelectedFile();
if (file.getName().endsWith(".txt") == false)
file = new File(file.toString() + ".txt");
String str = ta.getText();
//保存
BufferedWriter bw = null;
FileWriter fw = null;
try {
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
bw.write(str);
bw.newLine();
bw.flush();

} catch (Exception e1) {
e1.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
if (fw != null) {
fw.close();
}
} catch (Exception e1) {
e1.printStackTrace();
}
}


} else if (actionEvent.getSource() == jm16) { //页面设置
//添加页面设置对话框
PrinterJob printerJob = PrinterJob.getPrinterJob();
PageFormat pageFormat = printerJob.pageDialog(printerJob.defaultPage());

//将页面设置应用到文本区域中
ta.setFont(new Font("Arial", Font.PLAIN, 12));
ta.setMargin(new Insets(10, 10, 10, 10));

repaint();

} else if (actionEvent.getSource() == jm17) { //打印
PrinterJob printerJob = PrinterJob.getPrinterJob();
PageFormat pageFormat = printerJob.pageDialog(printerJob.defaultPage());

//设置打印的内容
Printable printable = new Printable() { //实验打印的方法
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex > 0) {
return NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

//设置打印的字体大小
Font font = new Font("Arial", Font.PLAIN, 12);
g2d.setFont(font);

//获取文本的内容
String str = ta.getText();

//将文本内容按行划分
String[] lines = str.split("\\n");

//显示每页的行数
int linehang = (int) (pageFormat.getImageableX() / g2d.getFontMetrics().getHeight());

//当前页面起始行
int stratline = pageIndex * linehang;

//当前页面结束行
int endline = Math.min(stratline + linehang, lines.length); //拿起始页加行数与换行后比较哪个小

//绘制每行文本内容
int y = 0;
for (int i = stratline; i < endline; i++) {
String line = lines[i];
g2d.drawString(line, 0, y);
y += g2d.getFontMetrics().getHeight();
}

return PAGE_EXISTS;
}
};
printerJob.setPrintable(printable, pageFormat);

if (printerJob.printDialog()) {
try {
printerJob.print();
} catch (Exception e1) {
e1.printStackTrace();
}
}

} else if (actionEvent.getSource() == jm18) {
System.exit(0);
} else if (actionEvent.getSource() == jm2) { //撤销功能
try {
undoManager.undo();
} catch (Exception e1) {
e1.printStackTrace();
}
} else if (actionEvent.getSource() == jm21) { //剪切
ta.cut();
} else if (actionEvent.getSource() == jm22) { //复制
ta.copy();
} else if (actionEvent.getSource() == jm23) { //粘贴
ta.paste();
} else if (actionEvent.getSource() == jm24) { //删除
int stats = ta.getSelectionStart();
int end = ta.getSelectionEnd();
if (stats != end) {
ta.replaceRange("", stats, end); //将中间的内容替换为空,形成删除功能
}
} else if (actionEvent.getSource() == jm25) { //打开bing进行搜索
String site = "https://cn.bing.com/?mkt=zh-CN";
try {
Desktop desktop = Desktop.getDesktop();
if (desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) {
URI uri = new URI(site);
desktop.browse(uri);
}
} catch (Exception e1){
e1.printStackTrace();
}
} else if (actionEvent.getSource() == jm26) {

// 创建标签和文本框
JLabel label = new JLabel("Line Number:");
JTextField textField = new JTextField();

// 创建按钮
JButton okButton = new JButton("OK");
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取用户输入的行数
String lineNumberString = textField.getText();

try {
int lineNumber = Integer.parseInt(lineNumberString);

// 跳转到指定行数
int pos = ta.getLineStartOffset(lineNumber - 1);
ta.setCaretPosition(pos);
} catch (NumberFormatException ex) {
ex.printStackTrace();
} catch (BadLocationException ex) {
ex.printStackTrace();
}

// 关闭对话框
gotoDialog.dispose();
}
});
} else if (actionEvent.getSource() == jm27) { //查找上一个
String text = ta.getText();
String seachString = ta.getSelectedText(); //获取选中的字符
if (seachString != null && !seachString.isEmpty()) {
curr = text.lastIndexOf(seachString, curr - 1);
} else {
JOptionPane.showMessageDialog(null, "Not Found");
}
} else if (actionEvent.getSource() == jm28) { //查找下一个
String text = ta.getText();
String searchString = ta.getSelectedText();
if (searchString != null && !searchString.isEmpty()) {
curr = text.indexOf(searchString, curr + 1);
if (curr >= 0) {
ta.setSelectionStart(curr);
ta.setSelectionEnd(curr + searchString.length());
} else {
JOptionPane.showMessageDialog(null, "Not found");
}
}
} else if (actionEvent.getSource() == jm29) { //替换功能
System.out.println("替换" );
String text = ta.getText();
String selectedText = ta.getSelectedText();
String searchString;
if (selectedText != null && !selectedText.isEmpty()) {
searchString = selectedText;
} else {
searchString = JOptionPane.showInputDialog("Find:");
}
if (searchString != null && !searchString.isEmpty()) {
String replaceString = JOptionPane.showInputDialog("请输入替换后的内容:"); //替换后的内容
if (replaceString != null) {
String newText = text.replace(searchString, replaceString);
ta.setText(newText);
}
}
} else if (actionEvent.getSource()==jm211) {

// 创建对话框
gotoDialog = new JDialog();
gotoDialog.setTitle("转到");
gotoDialog.setSize(300, 150);
gotoDialog.setLocationRelativeTo(null);
gotoDialog.setLayout(new BorderLayout());

// 创建标签和文本框
JLabel label = new JLabel("请输入行号:");
JTextField textField = new JTextField();

// 创建按钮
JButton okButton = new JButton("确定");
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取用户输入的行数
String lineNumberString = textField.getText();

try {
int lineNumber = Integer.parseInt(lineNumberString);
// 跳转到指定行数 行数为下标-1
int pos = ta.getLineStartOffset(lineNumber - 1);
ta.setCaretPosition(pos); //移动鼠标光标到输入行数处
} catch (NumberFormatException ex) {
ex.printStackTrace();
} catch (BadLocationException ex) {
ex.printStackTrace();
}

// 关闭对话框
gotoDialog.dispose();
}
});

// 添加组件到对话框
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(2, 1));
panel.add(label);
panel.add(textField);
gotoDialog.add(panel, BorderLayout.CENTER);
gotoDialog.add(okButton, BorderLayout.SOUTH);

// 显示对话框
gotoDialog.setVisible(true);
} else if (actionEvent.getSource() == jm212) {
System.out.println("全选");
ta.selectAll();
String str = ta.getSelectedText();
System.out.println(str);
} else if (actionEvent.getSource()== times) {
System.out.println("时间");
Date da = new Date();
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); //设置日期的格式
String time = ft.format(da); //接收时间
ta.append(time); //将时间输出在内容后面不会覆盖内容
} else if (actionEvent.getSource()==jm31) { //自动换行
wordWrapEnabled = jm31.isSelected();
ta.setLineWrap(wordWrapEnabled);
} else if (actionEvent.getSource()==jm32) { //调整字体
fontDialog = new JDialog();
fontDialog.setTitle("字体调整");
fontDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
fontDialog.setSize(300, 200);
fontDialog.setLayout(new FlowLayout());

fontSizeSlider = new JSlider(JSlider.HORIZONTAL, 8, 72, 12); //创建一个滑动条
fontSizeSlider.setMajorTickSpacing(10);
fontSizeSlider.setMinorTickSpacing(2);
fontSizeSlider.setPaintTicks(true);
fontSizeSlider.setPaintLabels(true);

JButton applyButton = new JButton("确认");
applyButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) { //添加一个判断,判断用户是否确认更改字体大小
int fontSize = fontSizeSlider.getValue();
Font currentFont = ta.getFont(); //获取字体大小
Font newFont = new Font(currentFont.getName(), currentFont.getStyle(), fontSize);
ta.setFont(newFont);
fontDialog.dispose();
}
});
fontDialog.add(fontSizeSlider);
fontDialog.add(applyButton);

// 设置对话框为模态(即禁止与其他窗口的交互)
fontDialog.setModal(true);

// 设置对话框相对于文本区域居中显示
fontDialog.setLocationRelativeTo(ta);

fontDialog.setVisible(true);

}
}
public static void main(String[] args) {
oneman oma = new oneman();
}
}



第一次写博客,不清楚应该讲些什么,目前这个记事本应用程序还有最后面两个菜单项没有完成,还要等到后面有空闲时间了再继续完善。

标签:VK,桌面,KeyEvent,程序开发,add,JMenuItem,new,记事本,ta
From: https://www.cnblogs.com/shochituya/p/17683139.html

相关文章

  • “省钱”才上云桌面?
    这几年,云桌面发展特别快,越来越多的学校、企业、政府机构都开始用它取代PC。但不少客户却把它当作节省成本的选择,甚至要我们计算出,具体能比PC方案省下多少,然后再作打算。其实,对于云桌面这样的产品而言,省钱并非其核心价值。在讨论这点之前,我们先来回答下上云桌面到底能不能省钱。......
  • 云桌面跟PC相比能有哪些不一样的体验?
    随着云计算时代的到来,大家在选择办公电脑时纠结的不再是该选择台式机还是该选择笔记本的,而是在纠结该选择青椒云云桌面办公呢还是选择传统PC的模式来办公的,云桌面到底能给我们带来哪些不一样的体验呢,为什么很多人在办公时开始选择青椒云桌面来办公而不再是传统PC的。首先集......
  • centos7安装桌面-GNOME
    CENTOS7安装桌面系统GNOME桌面#yum安装#更新已安装软件yumupgrade-y#安装额外yum源yuminstallepel-release-y#安装XWindowSystemyumgroupinstall"XWindowSystem"-y#安装Xfce4yumgroupinstallXfce-y#安装中文字体和输入法yuminstallcjkuni-ukai......
  • [重要] 如何在桌面上生成一个指定网址的快捷方式
    方法一:要在桌面上生成一个指定网址的快捷方式,可以按照以下步骤进行操作:首先,打开你的浏览器,并确保已经访问了你想要创建快捷方式的网址。在浏览器中,将鼠标悬停在地址栏上的网址上,然后点击并拖动该网址。将鼠标拖动到你的桌面上的空白区域,然后松开鼠标。这样,浏览器会自动......
  • 小程序可以跨端,那么能实现跨桌面应用小程序吗?
    QtGroup在提及2023年有桌面端应用程序开发热门趋势时,曾经提及三点:关注用户体验:无论您是为桌面端、移动端,还是为两者一起开发应用程序,有一点是可以确定的:随着市场竞争日益激烈,对产品的期望值不断升高,终端用户的标准也在不断提高。简而言之,现在我们需要修缮那些华而不实的东西......
  • docker桌面端安装mysql
    参考 https://www.yzktw.com.cn/post/735256.html1,搜索Images,mysql,选择合适的版本pull2,Images,中点击三角箭头,run,会弹出新建Containers弹框Containersname,随便写Ports需要写0Volumes选安装地址EnvironmentVarialbes需要加上密码MYSQL_ROOT_PASSWORD: 123456 3,运行......
  • uniapp小程序隐私协议弹窗组件。自2023年9月15日起,对于涉及处理用户个人信息的小程序
    上代码 隐私组件代码直接复制就能用 <template> <viewclass="zero-privacy":class="[{'zero-bottom':position=='bottom'}]"v-if="showPrivacy"> <viewclass="zero-privacy-container":style="{&#......
  • 微信小程序开发基础知识一
    小程序和普通前端网页开发的区别1、运行环境:微信小程序是在微信内部运行的,而普通前端网页是在浏览器中运行的。这意味着微信小程序必须依赖微信提供的运行时环境,而普通前端网页可以在不同的浏览器上运行。因此,微信小程序开发需要专门的开发工具和技术栈。2、开发语言:微信小程序主......
  • 微信小程序开发部署发布流程
    微信小程序开发部署发布流程最近因为有比赛,所以在进行敏捷小程序开发,由于我比较菜,不会JS原生,所以选择了符合技术栈的技术路线。MPFlutter框架+dart语言的开发。这样就可以符合“同时产出小程序与APP”的需求。1.微信小程序申请微信公众平台(qq.com)进行申请,注册,认证。按照......
  • 小程序快速备案助手代备案小程序开发
    小程序快速备案助手代备案小程序开发用户注册与登录:用户可以通过手机号或其他方式进行注册和登录,以便进行备案相关操作。备案信息填写:用户可以填写小程序的备案信息,包括小程序名称、小程序服务类目、域名等。备案材料上传:用户可以上传备案所需的材料,如营业执照、身份证等。备案进度......