提供两个样例,主要注意<el-form-item>
中的prop
样例一
1 | <template> |
样例二
1 | <template> |
提供两个样例,主要注意<el-form-item>
中的prop
1 | <template> |
1 | <template> |
1 | :deep(.el-scrollbar__wrap ){ |
收集客户需求,明确项目功能,设计较为详细的实体关系图。
推荐:ProcessOn
确定开发框架、数据库、服务器等技术选型,这些选择应该与项目需求相匹配,同时也要考虑团队成员技术能力和经验。
推荐:RuoYi-Vue3
根据需求分析结果,设计数据库模型,表结构,表关系。
推荐:dbdiagram.io
将项目划分为多个小模块,并为每个模块的前后端设计api。
推荐:Apifox
根据需求分析结果,设计原型模型,包括UI界面设计等。
推荐:Pixso
根据需求分析、技术选型、原型设计和数据库设计等结果,开始编写代码,包括前端代码和后端代码等。
推荐:前端Vue3+ElementPlus开发,后端SpringBoot+MybatisPlus开发
在编码过程中,需要不断进行代码调试和测试,以确保程序的正确性和稳定性。
推荐:Junit
完成测试后,将程序部署到服务器上,并进行上线运行,同时需要进行系统监控和数据备份等工作。
推荐:云服务器+Docker
程序上线后,需要进行运维和维护工作,包括性能监控、安全维护、bug修复等。
(例子待完善)
1 | <style scoped> |
npm或者yarn安装
npm install echarts
yarn add echarts
1 | import { |
1 | <template> |
(完)
云服务器Docker部署SpringBoot+Redis(Ubuntu)
参考文件夹结构
1 | MyTest01 |
拉取以下两个镜像
1 | docker pull openjdk:17 |
在redisDocker.sh
脚本写入以下内容,然后bash运行
脚本意思是将redis数据映射到主机
1 | #!/bin/bash |
添加如下配置到application.yml
1 | spring: |
写一个简单的测试如下
1 | package com.example.myweb01springboot.controller; |
然后maven打包成jar,参考文件夹结构,将jar放入指定位置。
将以下内容写入javaDocker.sh
脚本并bash运行
脚本意思是,向名为MySQLTest01的容器建立网络链接(单向的),它的名字(IP,主机名)为db,于是此容器可以通过db:3306访问MySQLTest01容器的mysql服务。
1 | #!/bin/bash |
开放云服务器安全组入站规则8081
端口,浏览器访问云服务器IP:8081/Home/Kmo
验证。
(完)
云服务器Docker部署SpringBoot+MySQL(Ubuntu)
参考文件夹结构
1 | MyTest01 |
拉取以下两个镜像
1 | docker pull openjdk:17 |
在mysqlDocker.sh
脚本写入以下内容,然后bash运行
脚本意思是将mysql数据映射到主机并设置密码为xxxx,
1 | #!/bin/bash |
在云服务器安全组开放入站规则3306
端口
此时可以用你喜欢的数据库连接软件来连接这个mysql容器,并创建test01
数据库和一张student
表,结构随意,随便插入几条数据。
添加如下配置到application.yml
补充你的云服务器IP和刚才设置的密码
1 | spring: |
写一个简单的测试如下
1 | package com.example.myweb01springboot.controller; |
然后本地运行打开浏览器访问localhost:8081/Home/Kmo
验证是否从远程数据库取得连接。
然后在application.yml
中将url的服务器IP改成db
1 | spring: |
然后maven打包成jar,参考文件夹结构,将jar放入指定位置。
将以下内容写入javaDocker.sh
脚本并bash运行
脚本意思是,向名为MySQLTest01的容器建立网络链接(单向的),它的名字(IP,主机名)为db,于是此容器可以通过db:3306访问MySQLTest01容器的mysql服务。
1 | #!/bin/bash |
开放云服务器安全组入站规则8081
端口,浏览器访问云服务器IP:8081/Home/Kmo
验证。
结束后记得关闭云服务器的3306
入站规则
(完)
无论是path还是name,都需要在路由配置中指定每个路径对应的组件。将配置都写到一个配置文件中,然后在vue的main.js中挂载配置它,具体流程是这样的:
1 | // router/index.js |
1 | // main.js |
发送方
1 | <script setup lang="ts"> |
接收方
1 | <script setup lang="ts"> |
发送方
1 | <script setup lang="ts"> |
接收方
1 | <script setup lang="ts"> |
Vue-ts-优雅的响应式对象数组(reactive型数组)
绘制如下画面,每一行绑定的数据都是独立的,并且还需要完成”增加行”按钮。
1 | <el-button @click="addLine">增加行</el-button> |
1 | interface IselectOptionItem { |
往数组添加元素时,不使用selectOptionItem
而是{...selectOptionItem}
,区别是前者是引用,而后置是复制,如果写前者,那么数组里的元素都指向一个对象,那么就会出现下拉框的值一起联动。
基本的通信架构有2种形式:
java.net.InetAddress
可以互动IP
前两个为构造器,后三个为方法不事先建立连接,发送方直接发送,不管对面状态,是不可靠连接。但是通信效率高,适合诸如视频直播、语音通话等。单个数据包最大限制为64KB。
事先通过三次握手建立连接,可靠连接,四次挥手断开连接,在不可靠信道做到可靠连接
三次握手是要Client和Server知道对方可以’收’和’发’
第一次握手:S知道C可以发
第二次握手:C知道S可以收发
第三次握手:S知道C可以收发
之后传输数据时,C也不断向S发送确认消息,S需要回复确认,如果没有,那么C会采取重发等措施。
S和C都需要先创建数据包类,用来接收信息。
S代码如下
1 | public class Server { |
S会在socket.receive一直等待C的消息,同时通过packet也可以查看发送方的一些信息。
C代码如下
1 | public class Client { |
你可能会好奇为什么S可以在循环外创建packet重复使用而C每次循环都要创建新的?
因为C每次发送的信息长度是未知的,而packet创建需要给出length所以C每次发送都需要重新创建,同时S对C发送的消息长度也是未知的,但是由于UDP对数据包有64KB上限制约,所以我们可以直接创建个64KB大的packet来接收,然后截断字节就可以。
TCP中C由Socket类创建,而S由ServerSocket类创建,然后通过accept方法再次获得Socket类。
S代码如下
1 | public static void main(String[] args) throws Exception { |
S会在accept等待C
C代码如下
1 | public class Client { |
通过高级流包装原始流,方便编程,这里用的是数据流,将字符串以UTF-8的编码形式传输。
一个S应对多个C的TCP通信,S需要线程池,每个通信都抛给子线程处理即可。在ServerSocket.accept到一个C的适合,就把这个socket抛到子线程。
C除了需要发送信息,还需要接收信息,并且两个行为需要持续开启,所以C需要多线程,一个从用户键盘读取信息发送,一个从S接收其他C发送的信息。
S除了线程池外,还需要一个子线程都能访问共享数组,来保存所有socket,子线程收到对应的C的消息,就抄一份发给所有socket。