自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 资源 (2)
  • 收藏
  • 关注

原创 MySQL面试有这一篇就够了

MySQL面试常见知识点1、 MySQL常用的存储引擎有什么?它们有什么区别?InnoDBInnoDB是MySQL的默认存储引擎,支持事务、行锁和外键等操作。MyISAMMyISAM是MySQL5.1版本前的默认存储引擎,MyISAM的并发性比较差,不支持事务和外键等操 作,默认的锁的粒度为表级锁。InnoDBMyISAM外键支持不支持事务支持不支持锁支持表锁和行锁支持表锁可恢复性根据事务日志进行恢复无事务日志表结构数据和索

2022-05-05 08:54:41 2414 28

原创 阿里云服务器中挖矿病毒解决办法(已实践)

1、cpu过高,中病毒了2、进入Linux连接阿里云服务器3、使用top命令动态查看cpu占用率两种情况1、未发现占用率很高的进程,跳到第七步2、发现了占用率很高的进程,使用kill -9 pid 杀死进程会发现病毒继续出现,没用,跳到第四步4、查看病毒文件地址输入 ls -l /proc/{病毒PID}/exe 查看病毒路径5、进入病毒文件,将其统统删除6、kill 杀死进程,完成,再次查看cpu,无病毒进程搞定7、如果阿里云服务器中显示c.

2022-02-13 15:51:31 7529 14

原创 IO练习:获取文件中的数据,数据排序,将排序后的数据写入文件。

💕前面的话💞本篇是关于IO流的一个练习题:获取文件中的数据,然后进行数据排序,将排序后的数据写入文件中。✨欢迎关注🖱点赞🎀收藏⭐留言✒😘系列专栏:java学习🎨现在的播种,以后的收货🀄如果觉得博主的文章还不错的话,请三连支持一下博主哦package IO;import java.io.*;import java.util.*;import java.util.Map.Entry;public class TestIO { static HashMap<String,

2022-05-18 17:00:20 566 10

原创 必背的线程池知识你知道了吗?

线程池原理1、为什么要使⽤线程池使⽤线程池主要有以下三个原因:创建/销毁线程需要消耗系统资源,线程池可以复⽤已创建的线程。控制并发的数量。并发数量过多,可能会导致资源消耗过多,从⽽造成服务器 崩溃。(主要原因)可以对线程做统⼀管理。2 线程池的原理Java中的线程池顶层接⼝是 Executor 接⼝, ThreadPoolExecutor 是这个接⼝的实 现类。我们先看看 ThreadPoolExecutor 类。2.1 ThreadPoolExecutor提供的构造⽅法⼀共有四个构

2022-05-12 09:48:51 548 26

原创 【原理篇】再次带你进入多线程的世界

1、Java内存模型基础知识1.1并发编程模型的两个关键问题线程间如何通信?即:线程之间以何种机制来交换信息线程间如何同步?即:线程以何种机制来控制不同线程间操作发⽣的相对顺序有两种并发模型可以解决这两个问题:消息传递并发模型共享内存并发模型这两种模型之间的区别如下表所示:在Java中,使⽤的是共享内存并发模型。1.2 Java内存模型的抽象结构1.2.1 运⾏时内存的划分先谈⼀下运⾏时数据区,下⾯这张图相信⼤家⼀点都不陌⽣:对于每⼀个线程来说,栈都是私有的,⽽堆是共有的

2022-05-10 15:23:44 386 10

原创 【基础篇】一篇文章带你了解多线程的魅力

1、 Java多线程⼊⻔类和接⼝1.1Thread类和Runnable接⼝JDK提供了 Thread 类和 Runnalble 接⼝来让我们 实现⾃⼰的“线程”类。继承 Thread 类,并重写 run ⽅法;实现 Runnable 接⼝的 run ⽅法;1.1.1继承Thread类⾸先是继承 Thread 类:public static class MyThread extends Thread{ @Override public void run() {

2022-05-08 14:58:10 638 18

原创 剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x)

2022-03-04 17:37:45 8112 1

原创 剑指 Offer 06. 从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { publi

2022-03-04 17:36:26 316

原创 LeetCode基础之动态规划——62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. 向下

2022-02-28 23:17:34 177

原创 LeetCode基础之动态规划——55. 跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例 1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例 2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一

2022-02-28 00:10:14 82

原创 LeetCode基础之动态规划——213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2)

2022-02-27 23:52:12 74

原创 LeetCode基础之回溯——22. 括号生成

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]代码class Solution { List<String> res=new ArrayList<>(); public List<String> generatePa

2022-02-26 23:30:31 8415

原创 【谷粒商城】npm install 报错问题

1、node.js 与 node-sass之间版本问题 例如 node12 使用 npm install [email protected]即可2、没装python以及环境配置下载python3.0以上的 一键配置即可 https://www.python.org/downloads/3、 卸载残留问题你可能按着评论区或视频的东西安装试过了,要注意执行我上面代码时要先清依赖残留,否则安装不上npm rebuild node-sassnpm uninstall node-sass

2022-02-26 20:01:52 651 1

原创 LeetCode基础之递归 / 回溯——40. 组合总和 II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。 示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]]示例 2:输入: candidates = [2,5,2,1,

2022-02-25 23:25:47 5052

原创 LeetCode基础之递归 / 回溯——39. 组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。示例 1:输入:candidates = [2,3,6,7], targ

2022-02-25 23:22:11 3711

原创 LeetCode基础之递归 / 回溯——90. 子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。示例 1:输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]示例 2:输入:nums = [0]输出:[[],[0]]代码class Solution { List<List<Integer>> res=new ArrayList&l

2022-02-24 22:44:35 82

原创 LeetCode基础之递归 / 回溯——78. 子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。示例 1:输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例 2:输入:nums = [0]输出:[[],[0]]代码class Solution { List<List<Integer>> res=new ArrayL

2022-02-24 22:42:33 104

原创 LeetCode基础之广度优先搜索 / 深度优先搜索——130. 被围绕的区域

给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。示例 1:输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]解释:被

2022-02-24 22:38:49 183

原创 LeetCode基础之广度优先搜索 / 深度优先搜索——572. 另一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。示例 1:输入:root = [3,4,5,1,2], subRoot = [4,1,2]输出:true示例 2:输入:root = [3,4,5,1,2,null,null,null,nul

2022-02-23 00:19:27 76

原创 LeetCode基础之广度优先搜索 / 深度优先搜索——117. 填充每个节点的下一个右侧节点指针 II

给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。示例:输入:root = [1,2,3,4,5,null,7]输出:[1,#,2,3,#,4,5,7,#]解释:给定二叉树如图 A 所示,你的函数应该填充它

2022-02-22 23:48:50 97

原创 LeetCode基础之广度优先搜索 / 深度优先搜索——547. 省份数量

有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。示例 1:输入:isC

2022-02-21 23:36:12 252

原创 LeetCode基础之广度优先搜索 / 深度优先搜索——200. 岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1示例 2:输入:grid = [

2022-02-21 23:23:27 111

原创 LeetCode基础之滑动窗口——713. 乘积小于K的子数组

给定一个正整数数组 nums和整数 k 。请找出该数组内乘积小于 k 的连续的子数组的个数。示例 1:输入: nums = [10,5,2,6], k = 100输出: 8解释: 8个乘积小于100的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。需要注意的是 [10,5,2] 并不是乘积小于100的子数组。示例 2:输入: nums = [1,2,3], k = 0输出: 0代码class Solut

2022-02-20 23:24:34 421

原创 LeetCode基础之滑动窗口——209. 长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]输出:1示例

2022-02-20 23:21:16 74

原创 LeetCode基础之双指针——986. 区间列表的交集

给定两个由一些 闭区间 组成的列表,firstList 和 secondList ,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj, endj] 。每个区间列表都是成对 不相交 的,并且 已经排序 。返回这 两个区间列表的交集 。形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b 。两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3]

2022-02-20 00:12:29 548

原创 LeetCode基础之双指针——11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例 1:输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例 2:输入:he

2022-02-19 23:38:02 80

原创 LeetCode基础之双指针——15. 三数之和

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]思路首先对数组进行排序,方便我们后续找不重复的三元组我们可以先确定

2022-02-18 23:25:25 305

原创 LeetCode基础之双指针——82. 删除排序链表中的重复元素 II

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。示例 1:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3]输出:[2,3]思路 1 --> 1 --> 1 --> 2 --> 3head next1.则需要移动next直到出现与当前head.value不相等的情况(含null)2.并且此时的head已经不

2022-02-18 22:30:57 58

原创 LeetCode基础之 二分法——162. 寻找峰值

峰值元素是指其值严格大于左右相邻值的元素。给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。示例 1:输入:nums = [1,2,3,1]输出:2解释:3 是峰值元素,你的函数应该返回其索引 2。示例 2:输入:nums = [1,2,1,3,5,6,4]输出:1 或 5 解释:你的函数可以返回索引 1,其峰值元素为 2; 或者返回索引 5, 其峰值元素为 6。代码class Solu

2022-02-17 23:02:56 298

原创 LeetCode基础之 二分法——153. 寻找旋转排序数组中的最小值

已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。给你一个元素值 互不相同 的数

2022-02-17 23:00:03 231

原创 LeetCode基础之 二分法——74. 搜索二维矩阵

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。示例 1:输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3输出:true示例 2:输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13输出:false代码c

2022-02-17 00:00:51 143

原创 LeetCode基础之 二分法——33. 搜索旋转排序数组

整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。给你 旋转后 的数组 nums 和一

2022-02-16 23:35:57 640

原创 LeetCode基础之 二分法——34. 在排序数组中查找元素的第一个和最后一个位置

给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。示例 1:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]示例 2:输入:nums = [5,7,7,8,8,10], target = 6输出:[-1,-1]示例 3:输入:nums = [], target = 0输出:[-1,-1]思路1、首先,在

2022-02-16 22:30:36 540

原创 LeetCode算法入门之 位运算——136. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4思路 1. 交换律:a ^ b ^ c = a ^ c ^ b 2. 任何数于0异或为任何数 0 ^ n = n 3. 相同的数异或为0: n ^ n= 0例如:1 ^ 3 ^ 2 ^ 3 ^ 2 等价于1 ^ 3 ^ 3 ^ 2 ^ 2 等价于 1 ^ 0 ^ 0

2022-02-15 23:14:56 588

原创 LeetCode算法入门之 位运算——190. 颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。提示:1、请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。2、在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。示例 1:输入:n = 0000001010010100000111101

2022-02-15 22:59:24 142

原创 LeetCode算法入门之 位运算——231. 2 的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。示例 1:输入:n = 1输出:true解释:20 = 1示例 2:输入:n = 16输出:true解释:24 = 16示例 3:输入:n = 3输出:false示例 4:输入:n = 4输出:true示例 5:输入:n = 5输出:false思路2^xn

2022-02-14 22:58:21 497

原创 LeetCode算法入门之 位运算——191. 位1的个数

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。 提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。 示例 1:输入:00000

2022-02-14 22:24:11 165

原创 LeetCode算法入门之 动态规划——120. 三角形最小路径和

给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。示例 1:输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]输出:11解释:如下面简图所示: 2 3 4 6 5 74 1 8 3自顶向下的

2022-02-14 00:17:31 205

原创 LeetCode算法入门之 动态规划——198. 打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示例 2:

2022-02-13 23:43:38 162

原创 LeetCode算法入门之 动态规划——70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶思路n值输出n=11n=22n=33n=45n=5

2022-02-13 22:59:59 277

Mybatis-study.rar

狂神说Mybatis 学习代码

2021-11-25

超市收银管理系统.rar

简洁的收银系统,与数据库连接实现增删改查,订单管理,商品管理,员工管理,统计数据收银,登录等功能

2021-06-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除