TLCL之第一章(3)


6. 重定向

cat - 连接文件
sort - 排序文本行
uniq - 报道或省略重复行
grep - 打印匹配行
wc - 打印文件中换行符,字和字节个数
head - 输出文件第一部分
tail - 输出文件最后一部分
tee - 从标准输入读取数据,并同时写到标准输出和文件


标准输入、输出和错误

默认情况下,标准输出和标准错误都连接到平面,而不是保存到磁盘文件。许多程序有一个叫做标准输入(stdin)的设备得到输入,默认情况下,标准输入连接到键盘。

标准输出重定向

使用”>“重定向符后接文件名将标准输出重定向到除屏幕以外的另一个文件。当使用">"重定向符来输出结果时,目标总是从开头被重写。所以要清空一个文件可以使用:
”> file_name“#如果文件不存在,这也创建了一个文件
追加文件可以使用”>>“

标准错误重定向

标准错误重定向没有专用的重定向操作符。虽然我们已经将这些文件流的前三个称作标准输入、输出和错误,shell内部分别将其称为文件描述符0、1和2。shell使用文件提供了一种表示法来重定向文件。因为标准错误和文件描述符2一样,我们用这种表示法来重定向标准错误:
ls -l /bin/usr 2> ls-error.tx
文件描述符2,紧挨着重定向操作符之前,来执行重定向标准 错误到文件ls-error.txt

重定向标准输出和错误到同一个文件

将输出和错误重定向到一个文件中:
ls -l /bin/usr > ls-out.txt 2>&1
顺序不能变
第二种方法:
ls -l /bin/usr &> ls-output.txt

处理不需要的输出

系统通过重定向输出结果到一个叫做"/dev/null"的特殊文件将我们不想要结果扔掉。这个文件叫做位存储桶,他可以接受输入,它对输入不做任何处理。

标准输入重定向
cat - 连接文件

cat 命令读取一个或多个文件,然后复制它们到标准输出:
cat [file]
cat可以接受不止一个文件作为参数,所以它也可以用来把文件连接起来。
如果cat没有给出任何参数,它会从标准输入读取数据。
cat < filename
使用”<“重定向操作符,可以把标准输入源从键盘改到文件

管道用法

ls /bin /usr/bin | sort |less

uniq - 报道或忽略重复行

uniq命令经常和sort命令结合在一起使用。uniq从标准输入或单个文件名参数接受数据有序列表,默认情况下,从数据列表中删除任何重复行。
如果想看到重复的数据,可以在uniq命令后面加上“-d”

wc - 打印行数、字数和字节数

wc命令是用来显示文件所包含的行数、字数和字节数。选项“-l”限制命令只能输出行数。

grep - 打印匹配行

grep pattern [file…]
当grep遇到一个文件中的匹配“模式”,它会打印出包含这个类型的行。
选项“-i”使得grep忽略大小写,“-v”会告诉grep只打印不匹配的行。

head/tail - 打印文件开头部分/结尾部分

默认情况下,两个命令都打印10行,可以通过“-n“指定行数
head -n 5#打印5行
tail的”-f“选项允许你实时地浏览文件。

tee - 从stdin读取数据,并同时输出到stdout和文件

tee程序从标准输入读入数据,并且同时复制数据到标准输出和一个或多个文件
tee ls.txt


7. 从shell眼中看世界

echo - 显示一行文本

字符展开

echo是一个shell内建命令,可以完成非常简单的任务,他将他的文本参数打印到标准输出中。
echo this is a test
echo *
这样不会显示隐藏文件
echo ~
打印家目录

算术表达式展开

算术表达式展开使用这种格式:
$((expression))
echo $((2+2)) #4
算术表达式只支持整数,但是能执行很多不同的操作。

算术操作符

操作符说明
+
-
*
/
%取余
**取幂

在算术表达式中空格并不重要

花括号展开

花括号展开模式可能报刊一个开头部分叫做报头,一个结尾部分叫做附言。花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一个整数区间,或者单个的字符的区间。这种模式不能嵌入空白字符。
echo Number_{1…5}
Number_1 Number_2 Number_3 Number_4 Number_5

参数展开

echo $USER
me

命令替换

命令替换允许我们把一个命令的输出作为一个展开模式来使用:
echo $(ls)#相当于echo `ls` (这里是倒引号)
这里相当于执行了ls

引用

echo this is a [空格] test
this is a test(没有空格)
echo the total is $100.0
the total is 00.0
参数展开把$1的值替换为一个空字符串因为1是没有定义的变量

双引号

如果把文本放在双引号中,shell使用的特殊字符,都失去它们的特殊含义,被当作普通字符来看待,有几个例外:$,\,`(倒引号)。这意味着单词分割、路径名展开、波浪线展开和花括号展开都将失效,然而参数展开、算术展开和命令替换仍然执行。

注意:在默认情况下,单词分割机制会在单词中寻找空格,制表符,和换行符,并把它们看作单词之间的界定符。这意味着无引用的空格,制表符和换行符都不是文本的一部分,它们只作为分隔符使用。加上双引号之后,单词分割被禁止,内嵌的空格也不会被当作界定符,

单引号

如果我们要禁止所有的展开,我们要使用单引号。

转义字符

有时候我们只想引用单个字符,我们可以在字符之前加上一个反斜杠,在这里叫转义字符。经常在双引号中使用转义字符,来有选择地阻止展开。

转义序列

转义序列含义
\a响铃
\b退格符
\n新的一行
\r回车符
\t制表符

echo命令带上’-e‘选项能够解释转义序列。你可以把转义写放在$’ ‘里面。
echo -e “\a”
echo $’\a’


8. 键盘高级操作技巧

clear - 清空屏幕
history - 显示历史列表内容

命令行编辑
注意,下面一些按键组合(尤其使用alt键的组合),可能会被GUI拦截来触发其它的功能,当使用虚拟控制台时,所有的按键都应该正确地工作。

移动光标
光标移动命令

按键效果
ctrl-a移动光标到行首
ctrl-e移动光标到行尾
ctrl-f光标前移一个字符
ctrl-b光标后移一个字符
alt-f光标前移一个字
alt-b光标后移一个字
alt-l清空屏幕,移动光标到左上角

修改文本
文本编辑命令

按键效果
ctrl-d删除光标位置的字符
ctrl-t光标位置的字符和光标前面的字符互换位置
alt-t光标位置的字和其前面的字互换位置
alt-l把光标位置到字尾的 字符转换成小写字母
alt-u把从光标位置到字尾的字符转换成大写字母

剪切和粘贴文本
剪切和粘贴命令

按键效果
ctrl-k剪切从光标到行尾的文本
ctrl-u剪切从光标到行首的文本
alt-d剪切光标到词尾的文本
alt-backspace剪切从光标到词头的文本
ctrl-y把剪切环中的文本粘贴到光标位置

搜索历史命令

history | grep /usr/bin
搜索和/usr/bin这一目录相关的
!88#展开第88个命令

历史命令

按键效果
ctrl-p移动到上一个历史条目
ctrl-n移动到下一个历史条目
alt-<移动到历史列表开头
alt->移动到历史列表结尾,即当前命令行
ctrl-r反向增量搜索
alt-p反向搜索,非增量搜索
alt-n向前搜索,非增量
ctrl-o执行历史列表中的当前项,并移到下一个。

历史命令展开

通过使用"!"字符,shell为历史列表中的命令,提供了一个特殊的展开类型,我们已经知道一个感叹号后面加上一个数字。

历史展开命令

序列效果
!!重复最后一次执行的命令
!number重复历史列表中第number行的命令
!string重复最近历史列表中,以这个字符串开头的命令
!?string重复最近历史列表中,包含这个字符串的命令

应该谨慎使用”!string"和"!?string"格式,除非你完全确信历史列表条目的内容。


9. 权限

Unix传统中的操作系统不同于哪些MS-DOS传统中的系统,区别在于他们不仅是多任务系统,而且也是多用户系统。

id - 显示用户身份号
chmod - 更改文件模式
umask - 设置默认的文件权限
su - 以另一个用户的身份来运行shell
sudo - 以另一个的身份来执行命令
chown - 更改文件所有者
chgrp - 更改文件组所有权
passwd - 更改用户密码

读取、写入和执行

foo.txt
ls -l foo.txt
-rw-r–r-- 1 sunjianyang staff 0 3 14 20:16 foo.txt

文件类型

属性文件类型
-一个普通文件
d一个目录
l一个符号链接
c一个字符设备文件
b一个块设备文件

剩下的九个字符叫做文件模式,代表着文件所有者、文件组所有者和其他人的读、写和执行权限。

chmod - 更改文件模式

注意只有文件所有者或超级用户才能更改文件或目录的模式。
chmod支持两种不同的方法来更改文件模式:八进制数字表示法或符号表示法。也就是用一个八进制数表示一组3位,一共需要3组八进制数。

chmod命令符号表示法

符号含义
uuser的简写,意思是文件或目录的所有者
g用户组
oothers的简写,意思是其他所有的人
aall的简写,是上面3个的联合

如果没有指定字符,则默认是all,执行+字符,表示加上一个权限,-表示减去一个权限。=字符表示只有指定的权限可用,其他所有的权限都会被删除。
u+x 表示为文件所有者添加可执行权限

umask - 设置默认权限

当创建一个文件时,umask命令控制着文件的默认权限。umask命令使用八进制表示法来表达从文件模式属性中删除一个位掩码。
umask
#0022
foo.txt
ls -l foo.txt
-rw-r–r-- 1 sunjianyang staff 0 3 14 20:31 foo.txt
umask 0000
ls -l foo.txt
-rw-rw-rw- 1 sunjianyang staff 0 3 14 20:32 foo.txt
掩码中若出现一个数字1,则删除文件模式中和这个1在相同位置的属性。

通常看到一个八进制掩码用三位数来表示,但是从技术层面上讲,用四位数字来表示它更确切些,因为除了读取、写入和执行权限之外,还有其他较少用到的权限设置。
其中之一 – setuid(八进制4000),当应用到一个可执行文件时,它把有效用户ID从真正用户设置成程序所有者的ID,这种操作通常会应用到一些由超级用户所拥有的程序。当一个普通用户运行一个程序,这个程序由根目录用户(root)所有,并且设置了setuid位,这个程序运行时具有超级用户的特权,这样程序就可以访问普通用户禁止访问的文件和目录。这样会引起安全方面的问题。
第二个 – setgid(八进制2000),这个相似于setuid位,把有效用户组ID从真正的用户组ID更改为文件所有者的组ID。如果设置了一个目录的setgid位,则目录中新创建的文件具有这个目录用户组的所有权,而不是文件创建者所属用户组的所有权。对于共享目录来说,当一个普通用户组中的成员,需要访问共享目录中的所有文件,而不是管文件所有者的主用户组时,那么设置setgid位很有用处。
第三个 – sticky(八进制1000)。如果一个目录设置了sticky位,那么它能阻止用户删除或重命名文件(可以创建文件,添加内容),除非用户是这个目录的所有者,或者是文件所有者,或是超级用户。这个经常用来控制访问共享目录,比方说/tmp。
授予一个程序setuid权限
chmod u+s program #-rwsr-xr-x
授予一个目录setgid权限
chmod g+s dir #drwxrwsr-x
授予一个目录sticky权限
chmod +t dir #drwxrwxrwt

更改身份

在不同的时候,我们会发现很有必要具有另一个用户的身份。经常地,我们想要得到超级用户权限,来执行一些管理任务,但是也有可能”变成“另一个普通用户,比如说测试一个账号。有三种方式,可以拥有多重身份:

  1. 注销系统并以其他用户身份重新登录系统
  2. 使用su命令
  3. 使用sudo命令

su - 以其他用户身份和组ID运行一个shell

su [-[l]] [user]
如果包含”-l“选项,那么会为指定用户启动一个需要登录的shell。这意味着会加载此用户的shell环境,并且工作目录会更改到这个用户的家目录。这通常是我们所需要的。如果不指定用户,那么就假定是超级用户。注意,选项 -l 可以缩写为 -,这是经常用到的形式。
以这种方式使用su命令,也可以只执行单个命令,而不是启动一个新的可交互的shell:
su -c ‘command’
使用这种模式,命令传递到一个新的shell中执行。把命令用单引号引起来很重要,因为我们不想命令在我们的shell中展开,但需要在新shell中展开。
su -c ‘ls -l /root/*’

sudo - 以另一个用户身份执行命令

管理员能够配置sudo命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控的方式来执行命令,尤其是,只有一个用户可以执行一个或多个特殊命令时。另一个重要差异是sudo命令不要求超级用户密码。使用sudo命令时,用户使用自己的密码来认证。
sudo不需要重新启动一个shell,也不会加载一个用户的shell运行环境。这意味着命令不必用单引号引起来。
默认情况下,Ubuntu不允许用户登录到root账号(因为不能为root账号设置密码),而是使用sudo命令授予普通用户超级用户权限。

sudo -s
进入超级权限

chown - 更改文件所有者和用户组

chown 命令用来更改文件或目录的所有者和用户组。使用这个命令需要超级用户权限。
chown [owner][:[group]] file…
chown可以根据这个命令的第一个参数更改文件所有者和/或文件用户组。

chown参数实例

参数作用
bob把文件所有者从当前属主更改为用户bob
bob:users把文件所有者更改为用户bob,文件用户组更改为用户组users
:admins把文件用户组更改为组admins,文件所有者不变
bob:文件所有者更改为用户bob,文件用户组更改为用户bob登录系统时所属的用户组

如果想把这个目录还有子目录及文件需要同时送给其他人,可以使用选项-R。

chgrp - 更改用户组所有权

在旧版Unix系统中,chown命令只能更改文件所有权,而不是用户组所有权。


linux创建用户,分配权限

  1. 添加用户

useradd [-options] username

useradd一些选项

选项作用
-ccomment指定一段注释性描述
-d指定用户的主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录
-g指定用户所属的用户组
-G指定用户所属的附加组
-s指定用户的登录shell
-u指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号

示例:
useradd -d /home/goal username
useradd -d /www -s /usr/bin/passwd username

  1. 修改密码,passwd命令为一个用户设置密码,但它实际上是一个修改密码的程序。只有超级用户和用户自己可以修改密码。

passwd [-options] username

passwd的一些选项

选项含义
-l锁定口令,即禁用账号
-u口令解锁
-d使用账号无口令
-f强迫用户下次登录时修改口令
  1. 删除用户,使用userdel命令

userdel -r username #将用户的主目录一起删除
没有此选项,则不删除主目录

  1. 修改账号

usermod [-options] username
常用的选项和useradd一样,含义也一样。
示例:
usermod -s /bin/bash username #其中/bin/bash和username应取相应的shell路径文件名及用户名。
usermod -g nobody username #将用户username的组设为nobody,nobody意味着没有任何权限。
另外, 设置账号的有效期
如果使用了影子口令,则可以使用如下命令来修改一个账号的有效期:
usermod -e MM/DD/YY username
如果把该用户有效期设为过去的时间,就可以暂时禁止该用户登录系统。

  1. 增加一个新用户组使用groupadd命令

groupadd [-options] usergroup

groupadd的一些选项

选项含义
-g GID指定新用户组的组标识号(GID)
-o一般与-g选项同时使用,标识新用户组的GID可以与系统已有用户组的GID相同

groupadd -g 101 group2

  1. 删除用户组

groupdel usergroup

  1. 修改用户组

groupmod [-options] usergroup

groupmod的一些选项

选项含义
-g GID为用户组指定新的组标识号
-o与-g同时使用时,用户组的新GID可以与系统已有用户组的GID相同
-n newname将用户组的名字改为新名字
  1. 如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换

newgrp othergroup
将当前用户切换到othergroup用户组,前提条件是othergroup用户组确实是该用户的主组或附加组。

  1. 让普通用户拥有root权限

步骤:

  1. root登录
  2. useradd username
  3. passwd username
  4. 修改/etc/passwd,把用户名的ID和ID组修改为0
  1. 让普通用户拥有sudo权限

步骤:

  1. root登录
  2. useradd username
  3. passwd username
  4. chmod u+w /etc/sudoers
  5. vim /etc/sudoers
  6. 在文件中root ALL=(ALL) ALL下一行添加username ALL=(ALL) ALL
  7. 保存,退出文件
  8. chmod u-w /etc/sudoers

这样普通用户就可以通过sudo -s 使用root权限了

  1. 读、写、执行权限说明
  • 所谓写权限,也就是对文件修改和删除的权限,如果目录的写权限也对你开放了,则可以创建、删除或修改该目录下的任何文件或目录,即使该文件和子目录不属于你。
  • 对目录有只读权限的用户,不能用cd进入该目录,还必须同时有执行许可才可以进入该目录。
  • 必须同时拥有读和执行权限才可以使用ls这样的程序列出目录内容清单。
  • 只对目录有执行权限的用户,想访问该目录下有读权限的文件,必须知道该文件名才可以访问。
  1. /etc/passwd文件说明
#普通的passwd文件部分内容:
root:x:0:0:root:/root:/bin/bash 

bin:x:1:1:bin:/bin: 

daemon:x:2:2:daemon:/sbin:
...
lanf:x:500:500::/home/hujm:/bin/bash
... 

在这个文件里只有一个普通账号lanf,其他都是系统或系统服务的进程需要的账号,包括我们非常熟悉的root这个超级账号。在passwd文件里,每一行被冒号(:)分成7个部分:
用户名:密码:UID:GID:描述信息:主目录:登录shell

  1. 用户名,是passwd文件里个记录行唯一的有”唯一性“要求的域。
  2. 密码,现在由于使用shadow口令,在面区域只有一个x字符。
  3. UID,系统用来表示文件归属,确定各种权限的标志。
  4. GID,用户默认的组ID,这个ID可以在文件/etc/group里查到对应的组名。
  5. 身份描述,就是用户的身份说明,可以为空
  6. 主目录,用户的主目录
  7. 登录shell,用户登录时系统提供的shell

注意:UID和GID小于500的一般都是系统自己保留,不作普通用户和组的标识。所以新增加的用户和组一般都是大于500.

  1. /etc/group文件说明
root:x:0:root,hujm,hjm 

bin:x:1:root,bin,daemon 

daemon:x:2:root,bin,daemon 

它总共分4个部分:
组名:密码域:GID:组员列表
如果一个组的组员默认登录组是某组,那么在组员列表里将不现实这个组员的账号:
useradd -g /www username
在/www中将不显示username,而只是在passwd文件中的GID将其设置为对应的GID。
如果使用:
usermod -G /www,/w1 username
就可以看见了


10. 进程

ps - 报告当前进程快照
top - 显示任务
jobs - 列出活跃的任务
bg - 把一个任务放到后台执行
fg - 把一个任务放到前台执行
kill - 给一个进程发送信号
killall - 杀死指定名字的进程
shutdown - 关机或重启系统

进程是怎样工作的

当系统启动的时候,内核先把一些他自己的活动初始化为进程,然后运行一个叫做init的程序,依次地,再运行一系列的称为init脚本的shell脚本(位于/etc),它们可以启动所有的系统服务。其中许多系统服务以守护程序的形式存在,守护程序仅在后台运行,没有任何用户接口。这样即使我们没有登录系统,至少系统也在忙于执行一些例行事务。
在进程方案中,一个进程可以发动另一个程序被表述为一个父进程可以产生一个子进程。

查看进程

查看进程,最常使用的命令是ps(process status)。ps程序有许多选项
ps [options] [–help]

选项含义
-A列出所有进程
-w显示加宽,可以显示较多的资讯
-au显示较详细的资讯
-aux显示所有包含其他使用者的进程

一些常见用法:

ps -u username #显示指定用户信息
ps -ef #显示所有命令,包括命令行

它最简单的使用形式:
ps
PID TTY TIME CMD
5198 pts/1 00:00:00 bash
10129 pts/1 00:00:00 ps
ps不会显示很多进程,只是列出与当前终端会话相关的进程。
TTY是Teletype的简写,是指进程的控制终端。TIME字段显示进程所消耗的CPU时间数量。
加上”x“(没有”-“)选项,告诉ps命令,展示所有进程。在TTY一栏中出现的”?“,表示没有终端控制。
加上”x“后,输出结果中,会多一列STAT,也就是state简写。它揭示了进程当前的状态:

进程状态

状态含义
R运行中
S正在睡眠
D不可中断睡眠
T已停止
Z一个死进程或僵尸进程
<一个高优先级进程
N地优先级进程

进程状态信息之后,可能还跟随其他的字符。这表示各种外来进程的特性。
另一个流行的选项组合是"aux"(没有-),这会给我们更多信息。
这个选项组合,能够显示属于每个用户的进程信息,使用这个选项,可以唤醒"BSD风格"的输出结果。

BSD风格的ps命令列的标题

标题含义
USER用户ID.进程的所有者
%CPU以百分比表示CPU使用率
%MEM以百分比表示内存使用率
VSZ虚拟内存大小
RSS进程占用的物理内存的大小,以千字节为单位
START进程启动的时间

用top命令动态查看进程

虽然ps命令能够展示许多计算机运行状态的信息,但是它只是提供ps命令执行时刻的机器状态快照。为了看到更多动态的信息,我们使用top命令:
top
top程序以进程活动顺序显示连续更新系统进程列表(默认情况下,每3秒更新一次),top显示结果由两部分组成:最上面是系统概要,下面是进程列表,以CPU的使用率排序。

控制进程

为了启动一个程序并让他立即在后台运行,我们在程序命令之后,加上”&“字符:
xlogo &

命令jobs可以列出活跃的任务。

为了让后台运行的进程返回前台,我们使用fg命令
fg %jobspec
如果只有一个任务,jobspec可选

输入ctrl+z可以停止一个前台进程。
使用fg命令,可以恢复程序到前台运行,或者用bg命令把程序移到后台。

信号

kill命令被用来“杀死”程序,这样我们就可以终止需要杀死的程序。
kill 12345
指定想要终止的进程PID,或jobspec
这个kill命令不是真的杀死程序,而是给程序发送信号。信号是操作系统和程序之间进行通信时所采用的几种方式之一,在使用ctrl+c和ctrl+z的过程中,我们已经看到信号的实际用法。当终端接受其中一个按键组合后,它会给在前端运行的程序发送一个信号。在使用ctrl+c的情况下,会发送一个叫做INT(Interrupt)的信号。当使用ctrl-z时,则发送一个叫做TSPT(Terminal Stop)的信号。

通过kill命令给进程发送信号

kill命令被用来给程序发送信号
kill [-signal] PID…
如果在命令行中没有指定信号,那么默认情况下,发送TERM信号。

常用信号

编号名字含义
1HUP挂起
2INT中断
9KILL杀死
15TERM终止
18CONT继续,在一个停止信号后,这个信号会恢复进程的运行
19STOP停止

kill -1 12345
kill -HUP 12345
进程和文件一样,拥有所有者,所以为了能够通过kill命令来给进程发送信号,你必须是进程的所有者(或是超级用户)。

通过killall命令给多个进程发送信号

可以通过killall给匹配特定程序或用户名的多个进程发送信号:
killall [-u user][-signal] name…

更多进程相关的命令

命令名命令描述
pstree输出一个树型结构的进程列表
vmstat输出一个系统资源使用快照
xload一个图形界面程序
tload和xload很像
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值