精华内容
下载资源
问答
  • 2、调整管理后台记录显示为多重条件显示,按照上机时间降序,节次降序,机号升序显示,这样按照机号顺序可以及时查看哪台机器未提交记录。 --== 微机室上机记录管理系统 V1.2 ==-- 程序更新(2010年5月25日) ...
  • 2、调整管理后台记录显示为多重条件显示,按照上机时间降序,节次降序,机号升序显示,这样按照机号顺序可以及时查看哪台机器未提交记录。--== 微机室上机记录管理系统 V1.2 ==--程序更新(2010年5月25日)修正管理...

    【实例简介】

    --== 微机室上机记录管理系统 V1.3 ==--

    程序更新(2014年5月26日)

    1、修正管理员编辑记录时任课教师无法修改的问题;

    2、调整管理员后台记录显示为多重条件显示,按照上机时间降序,节次降序,机号升序显示,这样按照机号顺序可以及时查看哪台机器未提交记录。

    --== 微机室上机记录管理系统 V1.2 ==--

    程序更新(2010年5月25日)

    修正管理员编辑记录时节次无法修改的问题。

    --== 微机室上机记录管理系统 V1.1 ==--

    程序更新(2009年12月14日)

    修正管理员编辑记录时班级显示错误与提交错误的问题。

    --== 微机室上机记录管理系统 V

    【实例截图】

    【核心代码】

    上机记录管理系统V1.3

    ├── access.mdb

    ├── admin.asp

    ├── chenggong.asp

    ├── Connections

    │   └── shuju.asp

    ├── del.asp

    ├── edit.asp

    ├── image

    │   ├── index_logo.gif

    │   ├── index_logo.png

    │   ├── logo.gif

    │   ├── logo.png

    │   └── _notes

    │   ├── index_logo.gif.mno

    │   └── logo.gif.mno

    ├── index.asp

    ├── jieguo.asp

    ├── login.asp

    ├── _mmServerScripts

    │   ├── adojavas.inc

    │   ├── MMHTTPDB.asp

    │   ├── MMHTTPDB.js

    │   └── _notes

    │   └── dwsync.xml

    ├── _notes

    │   ├── admin.asp.mno

    │   ├── chenggong.asp.mno

    │   ├── del.asp.mno

    │   ├── edit.asp.mno

    │   ├── index.asp.mno

    │   ├── jieguo.asp.mno

    │   └── login.asp.mno

    ├── sorry.asp

    ├── 使用说明.txt

    ├── 启动 Internet Explorer 浏览器.lnk

    └── 备份空数据库.mdb

    6 directories, 30 files

    展开全文
  • 1、此网页只是实现了管理员登录和商品管理两个模块。 2、其余的模块比如供货商管理,用户管理模块原理是一样的,怎么实现就你们自己实现吧。 3、我这个后台还有两个功能没有完善,就是管理员用户密码的加密传输,...
  • # **技术栈** * 后端: Express + Mongodb + jsonwebtoken等等 * 前端: Vue.JS + ...- 管理员给用户开户,可以选择上机的时间 - 管理员查看订单,删除订单,搜索订单 - 管理员收藏歌曲,推荐到ktv推荐歌曲
  • imooc-lego管理员 本地运行 本地运行(启动模拟) npm start 本地运行(局部模拟) npm run dev-no-mock 测试机 http://182.92.168.192:8085/ 线上机 域名admin.imooc-lego.com IP 120.27.246.165:8000
  • 文章目录进程管理知识点进程概述进程的状态linux的三种进程启动进程1....作业控制上机任务:进程管理任务一、任务调度任务二、进程管理 进程管理 知识点 ​ 为了协调多个进程对各种计算机共享资源的访问,操作系统要...

    进程管理

    知识点

    ​ 为了协调多个进程对各种计算机共享资源的访问,操作系统要跟踪所有进程的活动,以及它们对系统资源的使用情况,从而实施对进程和资源的动态管理。

    进程概述

    • 进程是储存在磁盘上包含可执行机器指令和数据的静态实体
    • 进程是在操作系统中执行的特定任务的动态实体
    • 一个程序允许有多个进程
    • 每个运行中的程序至少由一个进程组成
    • linux每个进程与其他进程都是彼此独立的,都有自己独立的权限与职责

    进程的状态

    • 运行状态
    • 就绪状态
    • 封锁态(阻塞态)
      在这里插入图片描述

    linux的三种进程

    1.交互进程

    2.批处理进程

    3.守护进程*

    • 守护进程是指在后台运行而又没有终端或登录shell与之结合在一起的进程
    • 守护进程经常在程序启动时开始运行,在系统结束时停止。这些进程没有控制终端,所以称为在后台运行。

    启动进程

    1.at命令(定时执行)

    直接输入 at +时间 进入子模式,如:规定在2:00重启设备

    时间输入格式:时:分 日.月.年
    在这里插入图片描述

    注: 编辑完成at命令的指令序列后,必须回车换行确认,最后输入“CTRL+d”组合键结束当前输入

    #at命令可以只指定时间,也可以时间和日期一起指定
    at [-V] [-q queue] [-f file] [-mldv] time
    #-f 是吧已经编辑好的指令放到子模式里,再直接运行该文本文件(无需进入子模式)
    
    #查看作业
    at -c job1 [job2 job3 ...]
    #显示待执行作业
    atq 
    #查看队列(查看a队列)
    atq -q a
    
    #删除队列中的作业
    artm [-V] job1 [job2 job3...]
    

    atq:

    在这里插入图片描述

    2.batch命令(空闲时执行)

    语法格式和at相似,在此不一一列举

    #batch命令也可以指定时间,意为在该时间起的空闲时间执行任务
    batch  [-V]  [-q queue]  [-f file]  [-mv]  [time]
    

    3.cron命令(周期性实行)

    crontab [-u user] {-l|-r|-e}
    -l #列出用户目前的crontab
    -e #编辑用户目前的crontab
    -r #清空用户目前的crontab
    

    格式说明:
    在这里插入图片描述

    注:

    1. 星号(*):代表所搜可能的值
    2. 逗号:可以用逗号隔开的值指定一个列表范围
    3. 中杠 ( - ):可以用整数之间的中杠表示一个整数范围,如2-6

    管理进程

    1.ps命令 ( 查看进程状态 )

    ps [option]
    -aux #显示所有终端上所有用户有关进程的所有信息
    -efx #显示系统中所有进程的全面信息
    

    $ps aux 输出结果中的STAT列的可能标志

    标志意义说明
    S睡眠通常是在等待某个事件的发生,如一个信号或有输入可用
    R运行严格来说,应是“可运行”,即在运行队列中,处于正在执行或即将运行状态
    D不可中断的睡眠(等待)通常是在等待输入或输出完成
    T(terminate)停止通常是被shell作业控制所停止,或者进程正处于调试器的控制之下
    Z(zombie)僵尸进程通常是该进程已经死亡,但父进程没有调用wait类函数来释放该进程的资源
    N(nice)低优先级任务
    s进程是会话期首进程
    +进程属于前台进程组
    l进程是多线程的
    <高优先级任务

    2. top命令(动态显示进程状态)

    搬运:top命令详解

    top  [bciqsS] [d <时间间隔>] [n <times>]
    #在按q退出之前,top程序会一直进行下去
    

    3.kill命令(终止进程)

    ​ 通常终止一个前台进程可以使用[Ctrl+C]组合键。但是,对于一个后台进程就须用kill命令来终止。

    kill [-s信号|-p] 进程号
    kill -l [信号]
    killall -HUP cmd #结束某命令的所有进程
    

    4.作业控制

    命令作用
    &让作业直接在后台运行
    ctrl+z将前台作业挂起
    jobs显示当前所有作业
    bg[作业号]将挂起的作业切换到后台
    fg[作业号]将后台作业切换到前台

    上机任务:进程管理

    任务一、任务调度

    1、使用at命令完成如下操作:

    a、19:00执行reboot任务;

    at 19:00
    >reboot
    >[ctrl+d]
    

    b、2020年12月2日19:00执行备份操作,将/var/www文件夹打包到/root目录下,命名为www.bak.tar;

    at 19:00 2.12.20
    at >tar cvf /root/www.bak.tar /var/www
    

    c、查看当前已有的at计划任务列表;

    atq
    

    d、查看当前已有的at计划详细内容;

    #查看序列为4的计划
    at -c 4
    

    e、删除at计划的列表。

    atrm 4 5
    

    在这里插入图片描述

    2、使用crond完成如下操作:

    a、添加root用户的计划任务,在每年3、6、9、12月的1号上午6点完成备份操作,将/var/www文件夹打包到/root目录下,命名为www.bak.tar;

    crontab -u root -e
    #进入vi编辑器
    0 6 1 3,6,9,12 * tar cvf /root/www.bak.tar /var/www
    

    b、查看root用户的计划表;

    crontab -u root -l
    

    c、查看/var/spool/cron目录内查看用户的计划表;

    cat /var/spool/cron/root
    

    d、删除root用户计`划表。

    crontab -u root -r
    

    任务二、进程管理

    1、使用ps命令的“-ef”选项组合查看系统进程

    #显示系统所有进程的全面信息
    ps -ef
    

    在这里插入图片描述

    2、使用ps命令的“-aux”选项组合查看系统进程

    #显示所有终端上所有用户有关进程的全面信息
    ps -aux
    

    在这里插入图片描述

    3、在一个终端上使用“#ping 127.0.0.1”,在另一个终端上查看该进程并使用kill命令结束进程

    1. ctrl+alt+shift+f2 切换终端

    2. ping 127.0.0.1
      
    3. alt+f7 切换终端

    4. #查看当前进程
      ps -aux
      
    5. 找到ping 127.0.0.1的进程号

    在这里插入图片描述

    1. #终止进程
      kill 7017
      
    2. 再次查看系统当前进程,发现已经结束

    4、使用top查看系统进程

    top
    #如果不退出(q),将会一直刷新状态
    

    在这里插入图片描述

    5、在后台运行vi

    vim &
    

    在这里插入图片描述

    6、查看后台任务

    jobs
    

    在这里插入图片描述

    7、将vi切换到前台

    fg 1
    #然后vi编辑器就跳出来了
    

    8、将vi挂起

    ctrl+z

    9、将挂起的vi切换到后台运行

    bg 1
    
    展开全文
  • 系统管理: 1、通过ps命令的两种选项形式查看进程信息 [root@localhost ~]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.3 60652 7916 ? Ss 01:07 0:03 ...

    系统管理:

    1、通过ps命令的两种选项形式查看进程信息

    [root@localhost ~]# ps aux
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    root 1 0.0 0.3 60652 7916 ? Ss 01:07 0:03 /usr/lib/syste
    root 2 0.0 0.0 0 0 ? S 01:07 0:00 [kthreadd]
    root 3 0.0 0.0 0 0 ? S 01:07 0:04 [ksoftirqd/0]
    root 5 0.0 0.0 0 0 ? S< 01:07 0:00 [kworker/0:0H]
    root 7 0.0 0.0 0 0 ? S 01:07 0:00 [migration/0]
    root 8 0.0 0.0 0 0 ? S 01:07 0:00 [rcu_bh]
    root 9 0.0 0.0 0 0 ? S 01:07 0:00 [rcuob/0]
    root 10 0.0 0.0 0 0 ? S 01:07 0:00 [rcuob/1]
    root 11 0.0 0.0 0 0 ? S 01:07 0:00 [rcuob/2]

    ........

    root 92001 0.0 0.0 22652 1956 ? Ss 10:43 0:00 /usr/lib/syste

    root 92014 0.0 0.1 116248 2884 pts/0 Ss+ 10:43 0:00 /bin/bash
    root 92055 0.2 0.2 135348 4904 ? Ss 10:44 0:00 sshd: root@pts
    root 92059 0.0 0.1 116008 2760 pts/3 Ss 10:44 0:00 -bash
    root 92099 0.0 0.0 107892 612 ? S 10:45 0:00 sleep 60
    root 92100 0.0 0.0 123372 1396 pts/3 R+ 10:45 0:00 ps aux

    [root@localhost ~]# ps -elf
    F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
    4 S root 1 0 0 80 0 - 15163 ep_pol 01:07 ? 00:00:03 /us
    1 S root 2 0 0 80 0 - 0 kthrea 01:07 ? 00:00:00 [kt
    1 S root 3 2 0 80 0 - 0 smpboo 01:07 ? 00:00:04 [ks
    1 S root 5 2 0 60 -20 - 0 worker 01:07 ? 00:00:00 [kw
    1 S root 7 2 0 -40 - - 0 smpboo 01:07 ? 00:00:00 [mi
    1 S root 8 2 0 80 0 - 0 rcu_gp 01:07 ? 00:00:00 [rc
    1 S root 9 2 0 80 0 - 0 rcu_no 01:07 ? 00:00:00 [rc
    1 S root 10 2 0 80 0 - 0 rcu_no 01:07 ? 00:00:00 [rc
    1 S root 11 2 0 80 0 - 0 rcu_no 01:07 ? 00:00:00 [rc

    .......

    4 S root 92001 1 0 80 0 - 5663 poll_s 10:43 ? 00:00:00 /us
    4 S root 92014 90177 0 80 0 - 29062 n_tty_ 10:43 pts/0 00:00:00 /bi
    4 S root 92055 1407 0 80 0 - 33837 poll_s 10:44 ? 00:00:00 ssh
    4 S root 92059 92055 0 80 0 - 29002 wait 10:44 pts/3 00:00:00 -ba
    1 S root 92109 2 0 80 0 - 0 worker 10:46 ? 00:00:00 [kw
    0 S root 92117 943 0 80 0 - 26973 hrtime 10:47 ? 00:00:00 sle
    0 R root 92118 92059 0 80 0 - 30843 - 10:47 pts/3 00:00:00 ps

    2、通过top命令查看进程

    [root@localhost ~]# top
    top - 10:50:12 up 9:42, 5 users, load average: 0.07, 0.09, 0.06
    Tasks: 434 total, 3 running, 431 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem : 2035352 total, 146668 free, 730760 used, 1157924 buff/cache
    KiB Swap: 2097148 total, 2096660 free, 488 used. 1047584 avail Mem

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    883 root 20 0 269016 3612 2756 S 0.3 0.2 0:50.29 vmtoolsd
    2264 root 20 0 343988 11944 8704 R 0.3 0.6 0:51.19 vmtoolsd
    92138 root 20 0 130288 2116 1268 R 0.3 0.1 0:00.43 top
    1 root 20 0 60652 7916 2536 S 0.0 0.4 0:03.15 systemd
    2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
    3 root 20 0 0 0 0 S 0.0 0.0 0:04.68 ksoftirqd/0
    5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
    7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
    8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
    9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0
    10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/1
    11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/2
    12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/3
    13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/4
    14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/5

    3、通过pgrep命令查看sshd服务的进程号

    [root@localhost ~]# pgrep -l sshd
    1407 sshd
    90218 sshd
    92055 sshd

    4、查看系统进程树

    [root@localhost ~]# pstree -aup
    systemd,1 --switched-root --system --deserialize 21
    ├─ModemManager,897
    │ ├─{ModemManager},927
    │ └─{ModemManager},954
    ├─NetworkManager,1039 --no-daemon
    │ ├─dhclient,90705 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-eno16777736.pid -lf...
    │ ├─{NetworkManager},1057
    │ ├─{NetworkManager},1059
    │ └─{NetworkManager},1061
    ├─abrt-watch-log,889 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detected ernel BUG at list_del corruption list_add corruption ...
    ├─abrt-watch-log,891 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
    ├─abrtd,888 -d -s
    ├─accounts-daemon,920
    │ ├─{accounts-daemon},931
    │ └─{accounts-daemon},948
    ├─alsactl,878 -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00main rdaemon
    ├─at-spi-bus-laun,2037
    │ ├─dbus-daemon,2041 --config-file=/etc/at-spi2/accessibility.conf --nofork --print-address 3
    │ │ └─{dbus-daemon},2042
    │ ├─{at-spi-bus-laun},2038
    │ ├─{at-spi-bus-laun},2040
    │ └─{at-spi-bus-laun},2043
    ├─at-spi2-registr,2046 --use-gnome-session
    │ └─{at-spi2-registr},2049
    ├─atd,1416 -f
    ├─auditd,854 -n
    │ ├─audispd,861
    │ │ ├─sedispatch,865
    │ │ └─{audispd},866
    │ └─{auditd},860
    ├─avahi-daemon,900,avahi
    │ └─avahi-daemon,915
    ├─bluetoothd,879 -n
    ├─chronyd,893,chrony -u chrony
    ├─colord,1779,colord
    │ ├─{colord},1781
    │ └─{colord},1783
    ├─crond,1415 -n
    ├─cupsd,2127 -f
    ├─dbus-daemon,1891 --fork --print-pid 4 --print-address 6 --session
    │ └─{dbus-daemon},1892
    ├─dbus-daemon,924,dbus --system --address=systemd: --nofork --nopidfile --systemd-activation
    │ └─{dbus-daemon},940
    ├─dbus-launch,1890 --sh-syntax --exit-with-session
    ├─dconf-service,2142
    │ ├─{dconf-service},2145
    │ └─{dconf-service},2146
    ├─evolution-addre,2221
    │ ├─{evolution-addre},2226
    │ ├─{evolution-addre},2244
    │ ├─{evolution-addre},2251
    │ └─{evolution-addre},2252
    ├─evolution-calen,2247
    │ ├─{evolution-calen},2282
    │ ├─{evolution-calen},2286
    │ ├─{evolution-calen},2296
    │ └─{evolution-calen},2297
    ├─evolution-sourc,2178
    │ ├─{evolution-sourc},2179
    │ └─{evolution-sourc},2188
    ├─gconfd-2,2219
    ├─gdm,1418
    │ ├─gdm-simple-slav,1441 --display-id /org/gnome/DisplayManager/Displays/_0
    │ │ ├─Xorg,1464 :0 -background none -verbose -auth /run/gdm/auth-for-gdm-z9CyMo/database -seat seat0 -nolisten tcp vt1
    │ │ ├─gdm-session-wor,1871
    │ │ │ ├─gdm-session-wor,89917
    │ │ │ │ ├─{gdm-session-wor},89918
    │ │ │ │ └─{gdm-session-wor},89920
    │ │ │ ├─gnome-session,1882 --session gnome-classic
    │ │ │ │ ├─abrt-applet,2276
    │ │ │ │ │ └─{abrt-applet},2285
    │ │ │ │ ├─gnome-settings-,2059
    │ │ │ │ │ ├─{gnome-settings-},2067
    │ │ │ │ │ ├─{gnome-settings-},2073
    │ │ │ │ │ ├─{gnome-settings-},2078
    │ │ │ │ │ └─{gnome-settings-},2084
    │ │ │ │ ├─gnome-shell,2126
    │ │ │ │ │ ├─{gnome-shell},2131
    │ │ │ │ │ ├─{gnome-shell},2139
    │ │ │ │ │ ├─{gnome-shell},2141
    │ │ │ │ │ ├─{gnome-shell},2143
    │ │ │ │ │ └─{gnome-shell},2165
    │ │ │ │ ├─seapplet,2237
    │ │ │ │ ├─ssh-agent,2025 /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
    │ │ │ │ ├─tracker-miner-f,2267
    │ │ │ │ │ ├─{tracker-miner-f},2271
    │ │ │ │ │ ├─{tracker-miner-f},2274
    │ │ │ │ │ └─{tracker-miner-f},2278
    │ │ │ │ ├─{gnome-session},2045
    │ │ │ │ ├─{gnome-session},2047
    │ │ │ │ └─{gnome-session},2048
    │ │ │ ├─{gdm-session-wor},1872
    │ │ │ └─{gdm-session-wor},1873
    │ │ ├─{gdm-simple-slav},1453
    │ │ └─{gdm-simple-slav},1456
    │ ├─{gdm},1433
    │ └─{gdm},1438
    ├─gnome-keyring-d,1880 --daemonize --login
    │ ├─{gnome-keyring-d},1881
    │ ├─{gnome-keyring-d},2069
    │ ├─{gnome-keyring-d},2071
    │ └─{gnome-keyring-d},2075
    ├─gnome-shell-cal,2167
    │ ├─{gnome-shell-cal},2172
    │ ├─{gnome-shell-cal},2173
    │ ├─{gnome-shell-cal},2174
    │ └─{gnome-shell-cal},2235
    ├─gnome-terminal-,90177
    │ ├─bash,90184
    │ ├─bash,92014
    │ ├─gnome-pty-helpe,90183
    │ ├─{gnome-terminal-},90178
    │ ├─{gnome-terminal-},90179
    │ └─{gnome-terminal-},90180
    ├─goa-daemon,2108
    │ ├─{goa-daemon},2109
    │ ├─{goa-daemon},2111
    │ └─{goa-daemon},2112
    ├─goa-identity-se,2116
    │ ├─{goa-identity-se},2119
    │ └─{goa-identity-se},2123
    ├─gsd-printer,2133
    │ └─{gsd-printer},2136
    ├─gvfs-afc-volume,2118
    │ ├─{gvfs-afc-volume},2120
    │ └─{gvfs-afc-volume},2122
    ├─gvfs-goa-volume,2105
    │ └─{gvfs-goa-volume},2106
    ├─gvfs-gphoto2-vo,2097
    │ └─{gvfs-gphoto2-vo},2099
    ├─gvfs-mtp-volume,2101
    │ └─{gvfs-mtp-volume},2103
    ├─gvfs-udisks2-vo,2086
    │ ├─{gvfs-udisks2-vo},2087
    │ └─{gvfs-udisks2-vo},2094
    ├─gvfsd,1946
    │ └─{gvfsd},1947
    ├─gvfsd-burn,2284 --spawner :1.3 /org/gtk/gvfs/exec_spaw/1
    │ └─{gvfsd-burn},2295
    ├─gvfsd-fuse,1955 /run/user/0/gvfs -f -o big_writes
    │ ├─{gvfsd-fuse},1965
    │ ├─{gvfsd-fuse},1969
    │ ├─{gvfsd-fuse},1971
    │ └─{gvfsd-fuse},1974
    ├─gvfsd-trash,2242 --spawner :1.3 /org/gtk/gvfs/exec_spaw/0
    │ ├─{gvfsd-trash},2250
    │ └─{gvfsd-trash},2259
    ├─httpd,89753 -k start
    │ ├─httpd,89754,daemon -k start
    │ ├─httpd,89755,daemon -k start
    │ ├─httpd,89756,daemon -k start
    │ ├─httpd,89757,daemon -k start
    │ └─httpd,89758,daemon -k start
    ├─ibus-daemon,2149 --replace --xim --panel disable
    │ ├─ibus-dconf,2153
    │ │ ├─{ibus-dconf},2155
    │ │ ├─{ibus-dconf},2157
    │ │ └─{ibus-dconf},2159
    │ ├─ibus-engine-sim,2215
    │ │ ├─{ibus-engine-sim},2220
    │ │ └─{ibus-engine-sim},2223
    │ ├─{ibus-daemon},2150
    │ └─{ibus-daemon},2151
    ├─ibus-x11,2156 --kill-daemon
    │ ├─{ibus-x11},2160
    │ └─{ibus-x11},2164
    ├─ksmtuned,943 /usr/sbin/ksmtuned
    │ └─sleep,92249 60
    ├─libvirtd,1405
    │ ├─{libvirtd},1422
    │ ├─{libvirtd},1423
    │ ├─{libvirtd},1424
    │ ├─{libvirtd},1425
    │ ├─{libvirtd},1426
    │ ├─{libvirtd},1427
    │ ├─{libvirtd},1428
    │ ├─{libvirtd},1429
    │ ├─{libvirtd},1430
    │ └─{libvirtd},1431
    ├─lsmd,882,libstoragemgmt -d
    ├─lvmetad,740 -f
    ├─master,1624 -w
    │ ├─pickup,91699,postfix -l -t unix -u
    │ └─qmgr,1627,postfix -l -t unix -u
    ├─mission-control,2169
    │ ├─{mission-control},2175
    │ └─{mission-control},2176
    ├─nautilus,2186 --no-default-window
    │ ├─{nautilus},2200
    │ ├─{nautilus},2209
    │ └─{nautilus},2222
    ├─nm-dispatcher,92222
    │ ├─{nm-dispatcher},92223
    │ └─{nm-dispatcher},92224
    ├─polkitd,955,polkitd --no-debug
    │ ├─{polkitd},968
    │ ├─{polkitd},969
    │ ├─{polkitd},970
    │ ├─{polkitd},971
    │ └─{polkitd},972
    ├─pulseaudio,2065 --start
    │ ├─{pulseaudio},2070
    │ └─{pulseaudio},2072
    ├─rngd,906 -f
    ├─rsyslogd,895 -n
    │ ├─{rsyslogd},917
    │ └─{rsyslogd},918
    ├─rtkit-daemon,923,rtkit
    │ ├─{rtkit-daemon},951
    │ └─{rtkit-daemon},952
    ├─smartd,910 -n -q never
    ├─sshd,1407 -D
    │ ├─sshd,90218
    │ │ └─bash,90222
    │ └─sshd,92055
    │ └─bash,92059
    │ └─pstree,92250 -aup
    ├─systemd-journal,734
    ├─systemd-logind,914
    ├─systemd-udevd,746
    ├─tracker-store,2241
    │ ├─{tracker-store},2248
    │ ├─{tracker-store},2249
    │ ├─{tracker-store},2253
    │ ├─{tracker-store},2254
    │ ├─{tracker-store},2255
    │ ├─{tracker-store},2256
    │ └─{tracker-store},2257
    ├─tuned,896 -Es /usr/sbin/tuned -l -P
    │ ├─{tuned},986
    │ ├─{tuned},987
    │ ├─{tuned},991
    │ └─{tuned},993
    ├─udisksd,2088 --no-debug
    │ ├─{udisksd},2089
    │ ├─{udisksd},2091
    │ ├─{udisksd},2092
    │ └─{udisksd},2093
    ├─upowerd,1720
    │ ├─{upowerd},1722
    │ └─{upowerd},1723
    ├─vmtoolsd,883
    │ └─{vmtoolsd},937
    └─vmtoolsd,2264 -n vmusr

    5、使dd if=/dev/zero of=/root/file bs=1M count=8190 命令操作在前台运行

    [root@localhost ~]# dd if=/dev/zero of=/root/file bs=1M count=8190

    6、将第5题命令操作调入到后台并暂停

    ^Z
    [1]+ 已停止 dd if=/dev/zero of=/root/file bs=1M count=8190

    7、使dd if=/dev/zero of=/root/file2 bs=1M count=1024 命令操作在后台运行

    [root@localhost ~]# dd if=/dev/zero of=/root/file2 bs=1M count=1024 &
    [2] 92387

    8、查看后台的任务列表

    [root@localhost ~]# jobs -l
    [1]+ 92317 停止 dd if=/dev/zero of=/root/file bs=1M count=8190
    [2]- 92387 运行中 dd if=/dev/zero of=/root/file2 bs=1M count=1024 &
    [root@localhost ~]# 记录了1024+0 的读入
    记录了1024+0 的写出
    1073741824字节(1.1 GB)已复制,5.4253 秒,198 MB/秒

    [2]-  完成                  dd if=/dev/zero of=/root/file2 bs=1M count=1024

    9、恢复dd if=/dev/zero of=/root/file bs=1M count=8190 让其在后台继续运行

    [root@localhost ~]# bg 1
    [1]+ dd if=/dev/zero of=/root/file bs=1M count=8190 &
    [root@localhost ~]# 记录了8190+0 的读入
    记录了8190+0 的写出
    8587837440字节(8.6 GB)已复制,495.078 秒,17.3 MB/秒

    [1]+ 完成 dd if=/dev/zero of=/root/file bs=1M count=8190

    10、查询dd if=/dev/zero of=/root/file bs=1M count=8190 命令的进程并通过kill杀死

    [root@localhost ~]# dd if=/dev/zero of=/root/file bs=1M count=819000

    [root@localhost ~]# ps aux |grep dd 

    root      92453 14.6  0.0 108956  1672 pts/3    D+   11:12   0:20 dd if=/dev/zero of=/root/file bs=1M count=819000

    [root@localhost ~]# kill -9 92453

    [root@localhost ~]# dd if=/dev/zero of=/root/file bs=1M count=819000

    已杀死

    11、设置一次性计划任务在18:00时关闭系统,并查看任务信息

    [root@localhost ~]# service atd status
    Redirecting to /bin/systemctl status atd.service
    atd.service - Job spooling tools
    Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled)
    Active: active (running) since 五 2019-08-02 12:10:52 CST; 5 days ago
    Main PID: 1416 (atd)
    CGroup: /system.slice/atd.service
    └─1416 /usr/sbin/atd -f

    8月 02 12:10:52 localhost.localdomain systemd[1]: Starting Job spooling tool...
    8月 02 12:10:52 localhost.localdomain systemd[1]: Started Job spooling tools.
    Hint: Some lines were ellipsized, use -l to show in full.

    [root@localhost ~]# at 18:00 2019-8-8
    at> init 0
    at> <EOT>
    job 2 at Thu Aug 8 18:00:00 2019
    [root@localhost ~]# atq
    2 Thu Aug 8 18:00:00 2019 a root
    [root@localhost ~]# atrm 2
    [root@localhost ~]# atq

     

    12、以root身份设置周期性计划任务
    a) 每天晚上的24点时打包压缩 /etc/passwd /etc/shadow /etc/group /etc/gshadow 为 file.tar.gz

    b) 每周一的每隔五分钟列出磁盘使用状况

    c) 每天的8:30与互联网时间同步服务器pool.ntp.org同步时间

    [root@localhost ~]# crontab -e
    no crontab for root - using an empty one
    0 0 * * * tar -zcf file.tar.gz /etc/passwd /etc/shadow /etc/group /etc/gshadow
    */5 * * * 1 df -i /dev/sd*
    30 8 * * * ntpdate pool.ntp.org

    13、通过crontab命令查看root的计划任务,通过文件查看类工具列出/var/spool/cron下对应的文件内容

    [root@localhost ~]# crontab -l
    0 0 * * * tar -zcf file.tar.gz /etc/passwd /etc/shadow /etc/group /etc/gshadow
    */5 * * * 1 df -i /dev/sd*
    30 8 * * * ntpdate pool.ntp.org

    [root@localhost ~]# cat /var/spool/cron/root
    0 0 * * * tar -zcf file.tar.gz /etc/passwd /etc/shadow /etc/group /etc/gshadow
    */5 * * * 1 df -i /dev/sd*
    30 8 * * * ntpdate pool.ntp.org

     

    转载于:https://www.cnblogs.com/bbhymy/p/11322580.html

    展开全文
  • 用Node(Express)教你写KTV点歌系统,包括前台内容和后台管理系统,整合Express框架和Mongodb数据库服务器开发;教你用Vue.JS,ElementUI和iViewUI写出超漂亮的页面,随心点歌随心听 思维导图 ...

    最近手有点痒琢磨着做个啥,朝思暮想还是写个KTV点歌系统,模拟了一下KTV开户的思路,7天累死我了,不过技术点还挺多的,希望你可以看完(〜)〜

    用Node(Express)教你写KTV点歌系统,包括前台内容和后台管理系统,整合Express框架和Mongodb数据库服务器开发;教你用Vue.JS,ElementUI和iViewUI写出超漂亮的页面,随心点歌随心听

    思维导图

    19862811-2297ee5ad451d03f
    image

    技术栈

    • 后端: Express + Mongodb + jsonwebtoken等等

    • 前端: Vue.JS + ElementUI + iViewUI + Axios等等

    功能介绍

    本项目分前台开发,后台开发和服务器开发

    • 用户听歌需要登录(路由守卫)
    • 用户需要到管理员申请账号和密码
    • 用户登录听歌(风格点歌,语种点歌,明星点歌,热门歌曲等等...)
    • 剩余时长30分钟提醒,到时间自动下机
    • 管理员对歌曲的增删改查
    • 管理员给用户开户,可以选择上机的时间
    • 管理员查看订单,删除订单,搜索订单
    • 管理员收藏歌曲,推荐到ktv推荐歌曲
    • 等等...

    项目设计结构

    -- 服务器基本架构
    ktv-select_music-system
    ├── README.md
    ├── index.js  -- 后台文件入口
    ├── test.http  -- 测试文件
    ├── api  -- 路由文件
    │    ├── admin.js  -- 配置管理员的操作
    |    ├── music.js  -- 配置歌曲信息
    |    ├── user.js  -- 配置用户的相关操作
    |    └── safecode.js  -- 配置安全码
    ├── config -- 配置
    |    ├── Date.js  -- 配置日期格式化插件
    |    ├── delNoUse.js  -- 封装闲置删除闲置资源方法
    |    ├── http.js  -- 配置跨域
    |    ├── isBadAccount.js  -- 封装账户是否合法
    |    ├── newaccount.js  -- 封装随机开户方法
    |    ├── passport.js  -- 验证token是否合法
    |    ├── uploadImg.js  -- 封装上传图片方法
    |    └── uploadMusic.js  -- 封装上传歌曲方法
    ├── ktv-admin  --后台管理系统界面
    ├── ktv-client  --前台用户点歌项目界面
    ├── dbModel
    |    └── **  -- Mongodb数据库的一些模型
    ├── mongodb
    |    └── mongodb.js  -- 配置Mongodb,链接数据库 
    ├── secret
    |    ├── mongodbURI.js  -- Mongodb地址
    |    └── jwtkey.js  -- token的私钥
    ├── static -- 资源存放处
    |    ├── music  -- 歌曲上传目标文件夹 
    |    ├── poster  -- 歌曲海报上传目标文件夹
    └──  └── view  -- 配置404文件
    
    -- 后台管理系统架构
    ktv-admin
    ├── README.md
    ├── public 
    |    ├── index.html  -- vue挂载页面
    |    └── **  -- 你可以在这里链接少量静态资源
    ├── src  -- 开发文件夹
    |    ├── App.vue  -- Vue挂载根页面
    |    ├── main.js  -- Vue程序入口文件,挂载各种组件
    |    ├── router.js  -- Vue路由配置文件
    |    ├── store.js  -- Vuex的状态管理文件
    |    ├── assets  -- 静态资源文件夹
    |    ├── components  --公共组件
    |    |      └── nav.vue  -- 后台导航栏
    |    ├── plugins  --插件
    |    |      ├── axios.js   -- 配置跨域,拦截器等等 
    |    |      ├── Date.js   -- 格式化日期 
    |    |      └── wsmLoading.js   -- 加载动画Loading
    |    ├── stores  -- 状态管理文件夹
    |    |      └── adminStore.js  -- 管理员状态 
    |    ├── views  -- 页面文件夹
    |    |      ├── 404.vue   -- 404页面
    |    |      ├── adminlikes.vue   -- 管理员处理ktv收藏歌曲
    |    |      ├── allorders.vue   -- 订单管理
    |    |      ├── Home.vue   -- 后台根页面
    |    |      ├── Index.vue   -- 后台首页
    |    |      ├── managemusic.vue   -- 音乐管理
    |    |      ├── user_service.vue   -- 给用户开户
    |    |      └── login.vue   -- 后台登录
    └── babel.config.js  -- babel配置
    
    
    -- 前台用户听歌架构
    ktv-client
    ├── README.md
    ├── public 
    |    ├── index.html  -- vue挂载页面
    |    └── **  -- 你可以在这里链接少量静态资源
    ├── src  -- 开发文件夹
    |    ├── App.vue  -- Vue挂载根页面
    |    ├── main.js  -- Vue程序入口文件,挂载各种组件
    |    ├── router.js  -- Vue路由配置文件
    |    ├── store.js  -- Vuex的状态管理文件
    |    ├── assets  -- 静态资源文件夹
    |    ├── components  --公共组件
    |    |      ├── bottomNav.vue  -- 底部音乐控制区域
    |    |      └── topNav.vue  -- 顶部信息区域
    |    ├── config  --配置
    |    |      ├── addSong.js    --封装选取歌曲方法
    |    |      ├── isBadAccount.js    --验证账户合法性
    |    |      ├── isLogin.js    --是否登录
    |    |      ├── nextSong.js    --封装下一首歌曲方法
    |    |      └── prevSong.js    --封装上一首歌曲方法
    |    ├── plugins  --插件
    |    |      ├── axios.js   -- 配置跨域,拦截器等等 
    |    |      └── wsmLoading.js   -- 加载动画Loading
    |    ├── stores  -- 状态管理文件夹
    |    |      └── song.js  -- 存储歌曲信息 
    |    ├── views  -- 页面文件夹
    |    |      ├── 404.vue   -- 404页面
    |    |      ├── abc.vue   -- 拼音点歌
    |    |      ├── artist.vue   -- 明星点歌
    |    |      ├── Home.vue   -- 后台根页面
    |    |      ├── Index.vue   -- 后台首页
    |    |      ├── hot.vue   -- 热播歌曲
    |    |      ├── ktvlikes.vue   -- ktv推荐歌曲
    |    |      ├── selected.vue   -- 已选歌曲
    |    |      ├── style.vue   -- 风格点歌
    |    |      └── language.vue   -- 语种点歌
    ├── babel.config.js  -- babel配置
    └── vue.config.js  -- vue配置
    

    项目启动介绍

    1. 首先不要改变服务器端口,否则报错.

    2. 你需要在装有Node和Vue的环境中测试,如果其中一个没有请先下载(Node下载,Vue下载).

    3. 首先在最外层文件夹下载依赖:npm install 下载后端依赖,

    4. 接着进入ktv-client, npm install 下载用户前端依赖.

    5. 接着进入ktv-admin, npm install 下载管理员前端依赖.

    6. 以上工作完成后,使用命令npm run server 或者 node index &命令启动Node服务器,启动成功会显示:

      Server is running on port [8633].

      Mongodb is Connected.Please have a great coding.

    7. 进入ktv-client,打开命令板,使用命令npm run client启动前台用户项目,启动成功后用浏览器访问http://localhost:xxxx

    8. 进入ktv-admin,打开命令板,使用命令npm run admin启动后台管理系统项目,启动成功后用浏览器访问http://localhost:xxxx

    9. 本例中将Mongodb部署在本地电脑上,如果你仔细阅读了这篇文档,启动项目应该是很容易的。如果你把Mongodb部署在其他地方,请自行修改secret/mongodbURI.js配置文件信息。
      10.项目启动成功

    技术攻关

    Date方法

    由于脑袋不好使的原因加上js没有元素格式化日期的方法,就瞎掰一个(值得学习)

    Date.js

    
    /** 
    *
    *  @author: Mr_Wei 
    *  @version: 1.0.0 
    *  @description: 格式化日期
    *  @Date: 2019/10/16 09:32
    *
    */ 
    
    Date.prototype.format = function(format) {
        var o = {
            "M+": this.getMonth() + 1, //月份
            "d+": this.getDate(), //日
            "H+": this.getHours(), //小时
            "m+": this.getMinutes(), //分
            "s+": this.getSeconds(), //秒
            "q+": Math.floor((this.getMonth() + 3) / 3), //季度
            "f+": this.getMilliseconds() //毫秒
        };
        if (/(y+)/.test(format))
            format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o)
            if (new RegExp("(" + k + ")").test(format))
                format = format.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        return format;
    }
    
    export default Date.prototype.format
    
    
    然后我们使用其格式日期
    require(Date);
    // const now = new Date().format("yyyy/MM/dd HH:mm:ss.S");
    const now = new Date().format("yyyy/MM/dd HH:mm:ss");
    
    

    验证码(svg-captcha)

    svg-captcha验证码的运用,防止暴力破解密码,加强安全性.
    详细的文档地址:svg-captcha

    使用验证码

    // 后台生成验证码
    router.get("/getCaptcha", (req, res) => {
        var captcha = svgCaptcha.create({  
            // 翻转颜色  
            inverse: false,  
            // 字体大小  
            fontSize: 38,  
            // 噪声线条数  
            noise: 3,  
            // 宽度  
            width: 80,  
            // 高度  
            height: 32,  
          });  
          // 保存到session,忽略大小写  
          req.session = captcha.text.toLowerCase(); 
          console.log(req.session); //0xtg 生成的验证码
          //保存到cookie 方便前端调用验证
          res.cookie('captcha', req.session); 
          res.setHeader('Content-Type', 'image/svg+xml');
          res.send(String(captcha.data));
          res.end();
    })
    
    
    // 前台获取验证码
    --HTML
    <img width="80" style="background:#EEE9E9;margin-left:30px;" ref="captcha" height="32" src="http://localhost:3001/api/user/getCaptcha" @click="refreshCaptcha">
    
    --js
    // 获取验证码cookie
    getCookie(cname){
        var name = cname + "=";
        var ca = document.cookie.split(';');
        for(var i=0; i<ca.length; i++){
            var c = ca[i].trim();
            if (c.indexOf(name)==0) return c.substring(name.length,c.length);
        }
        return "";
    },
    // 刷新验证码
    refreshCaptcha(){
        this.$refs.captcha.src = "http://localhost:3001/api/user/getCaptcha?d=" + Math.random();
    },
    
    最后用 填写的验证码进行对比
    
    19862811-e9eb4ec44537719d
    image
    19862811-82a2021dc24b26c7
    image

    上传歌曲或图片

    formidable来处理文件上传信息,用起来方便,很友好,如果你没有接触过文件操作,赶紧收藏起来

    封装歌曲方法uploadMusic.js

    /** 
    *
    *  @author: Mr_Wei 
    *  @version: 1.0.0 
    *  @description: 封装上传音乐方法
    *  @Date: 2019/10/16 08:35
    *
    */ 
    
    const fs = require('fs');
    const path = require('path');
    const formidable = require('formidable');  // 文件处理库
    const formatTime = require('silly-datetime');  // 格式化数据
    
    module.exports = (req, res) => {
        
        let form = new formidable.IncomingForm();  //创建上传表单
        form.encoding = 'utf-8';  // 设置编码格式
        form.uploadDir = path.join(__dirname, '../static/music'); // 设置上传目录(这个目录必须先创建好)
        form.keepExtensions = true;  // 保留文件后缀名
        form.maxFieldsSize = 20 * 1024 *1024; // 设置文件大小
    
        /* 格式化form数据 */
        form.parse(req, (err, fields, files) => {
            let file = files.file;
            /* 获取异常 */
            if(err) {
                return res.status(500).json({'status': 500, result: '服务器内部错误'});
            }
            if(file.size > form.maxFieldsSize) {
                fs.unlink(file.path);
                return res.status(412).json({'status': 412, result: '音频不能超过20M'});
            }
    
            /* 存储后缀名 */
            let extName = '';
            switch (file.type) {
                case 'audio/mp3':
                    extName = 'mp3';
                    break;
            }
            if(extName.length == 0) {
                fs.unlink(file.path);
                return res.status(412).json({'status': 412, result: '只支持mp3格式音频'});
            }
            /* 拼接新的文件名 */
            let time = formatTime.format(new Date(), 'YYYYMMDDHHmmss');
            let num = Math.floor(Math.random() * 8999 + 10000);
            let songName = `${time}_${num}.${extName}`;
            let newPath = form.uploadDir + '/' + songName;
    
            /* 更改名字和路径 */
            fs.rename(file.path, newPath, (err) => {
                if(err) {
                    return res.status(500).json({'status': 500, result: '音频上传失败'});
                } else {
                    return res.send({'status': 200, 'msg': '音频上传成功', result: {src: songName}});
                }
            })
            
        })
    };
    
    19862811-d52e3aa177f9ed28
    image
    19862811-dab2d15d1f8d54d6
    image

    Vue、ElementUI分页使用

    关于ElementUI分页详细请见:ElementUI的Pagination分页学习

    上图

    -- html
    <el-pagination
        v-if='paginations.total > 0'
        :page-sizes="paginations.page_sizes"
        :page-size="paginations.page_size"
        :layout="paginations.layout"
        :total="paginations.total"
        :current-page.sync='paginations.page_index'
        @current-change='handleCurrentChange'
        @size-change='handleSizeChange'>
    </el-pagination>
    
    -- js
    data(){
        return{
            allUsers:[],  // 用来存储最终信息, 被显示的dom点调用
            allTableData:[],  // 用户承接分页设置的数据
            paginations: {   // 分页组件信息
                page_index: 1, // 当前位于哪页
                total: 0, // 总数
                page_size: 5, // 1页显示多少条
                page_sizes: [5, 10, 15, 20], //每页显示多少条
                layout: "total, sizes, prev, pager, next, jumper" // 翻页属性
            },
        }
    },
    methods:{
        // 获取当前页
        handleCurrentChange(page) {
            let sortnum = this.paginations.page_size * (page - 1);
            let table = this.allTableData.filter((item, index) => {
                return index >= sortnum;
            });
            // 设置默认分页数据
            this.getAllUsers = table.filter((item, index) => {
                return index < this.paginations.page_size;
            });
            this.getAllUsers = table.filter((item, index) => {
                return index < this.paginations.page_size;
            });
        },
        // 切换size
        handleSizeChange(page_size) {
            this.paginations.page_index = 1;
            this.paginations.page_size = page_size;
            this.getAllUsers = this.allTableData.filter((item, index) => {
                return index < page_size;
            });
        },
         // 总页数
        setPaginations() {
            this.paginations.total = this.allTableData.length;
            this.paginations.page_index = 1;
            this.paginations.page_size = 5;
            // 设置默认分页数据
            this.getAllUsers = this.allTableData.filter((item, index) => {
                return index < this.paginations.page_size;
            });
        },
    }
    
    19862811-04c35a3a847ff97c
    image

    没了吗?对,分页就是这么简单!你学会了吗?有些前端开发的同学总是对分页比较陌生,学会这个,让你不再产生烦恼!

    token和自定义验证合法性

    jsonwebtoken是对用户信息加密成不可逆向破解的token.关于passport-jwt,是用来对用户请求时所带的token信息进行过期验证,如果超过签证的合法时间,则会请前台发出token失效的信息,提示用户重新获取合法的token信息,否则无法继续请求加密的信息;

    用法

    - passport-jwt
    const key = require("../config/keys").KEYORSECRET;
    const JwtStrategy = require('passport-jwt').Strategy,
          ExtractJwt = require('passport-jwt').ExtractJwt;
    var opts = {}
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
    opts.secretOrKey = key;
    
    module.exports = passport => {
        passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
            UserInfo.findById(jwt_payload.id)
                    .then(user => {
                        if (user) {
                            return done(null, user);
                        } else {
                            return done(null, false);
                            // or you could create a new account
                        }
                    })
        }));
    }
    
    
    
    // 设置token
    // 规则
     const rule = {
        id:String(userinfo._id),
        username:userinfo.username,
        email:userinfo.email,
        date:user.date,
        signdate:userinfo.signdate,
        signcount:userinfo.signcount,
        avatar:userinfo.avatar,
        phone:userinfo.phone
    };
    
    // 签证加密
    // jwt.sign(规则, key(私钥), {配置:比如过期时长}, (err, token){ 响应程序 })
    jwt.sign(rule,key,{expiresIn:7200},(err, token) => {
        if(err) throw err;
        res.json({"token" : "Bearer " + token})
    })
    
    
    
    自定义验证方法
    /** 
    *
    *  @author: Mr_Wei 
    *  @version: 1.0.0 
    *  @description: 判断是否过期用户
    *  @Date: 2019/10/19 12:19
    *
    */ 
    const UserOrOrders = require("../dbModel/user");
    module.exports = async params => {
        
        
        const flag = await new Promise((resolve) => {
            if(params){
                const account = params.account;
                UserOrOrders.findOne({account})
                    .then(user => {
                        if(user){
                            if(new Date().getTime() > new Date(user.endTime).getTime()){
                                console.log("过期用户");
                                // 处理
                                return resolve(false);
                            }else{
                                console.log("合法用户");
                                return resolve(true);
                            }
                        }else{
                            return resolve(false);
                        }
                    })
            }else{
                console.log("不合法用户");
                return resolve(false);
            }
            
        }) 
        return flag;
    }
    
    
    
    
    使用:
    // 测试  isBadAccount(params)方法
    router.post("/test", passport.authenticate("jwt", {session:false}), async (req, res) => {
        // console.log(req.user)
        if(await isBadAccount(req.user)){
            // do something
            res.send("OK");
        }else{
            res.status(401).json({status:"401", result:"帐号过期,请联系管理员"})
        }
    })
    
    
    19862811-89c9a905311d2776
    image

    详细的文档地址:Passport-Jwt合法验证,token加密

    截图

    后台管理系统

    19862811-e6f25764dab87166
    image
    19862811-ddad97076769ed14
    image
    19862811-f5abc37c895721a6
    image
    19862811-e237384815681ca8
    image
    19862811-a75ec422b5649264
    image
    19862811-280a620766a76eae
    image
    19862811-4dc4aa4d4a199aa9
    image
    19862811-5dede2494ecdb54b
    image

    前台点歌界面

    19862811-5d6d09d710fdabe1
    image
    19862811-dee9ac59091922de
    image
    19862811-ac9bd9c4be69ebb7
    image
    19862811-cc226ea60ff898f3
    image
    19862811-af9c26de530828a7
    image
    19862811-916290b887dcd95c
    image

    源码在这里

    以上代码均已上传 github

    https://github.com/1046224544/ktv-select_music-system

    联系

    如果大家有兴趣,欢迎star. 欢迎大家加入我的前端交流群:866068198 ,一起交流学习前端技术。博主目前一直在自学Node中,技术有限,如果可以,会尽力给大家提供一些帮助,或是一些学习方法.

    • 群二维码
    19862811-c629f13621cf81ba
    image

    其他

    最后

    If you have some questions after you see this article, you can contact me or you can find some info by clicking these links.

    如果对你有帮助,请赏个star~ github地址

    展开全文
  • 9、恢复dd if=/dev/zero of=/root/file bs=1M count=8190 让其在后台继续运行 [root@localhost ~]# jobs -l [1]+ 2364 停止 dd if=/dev/zero of=/root/file bs=1M count=8190 [root@localhost ~]# bg 1 [1]+ dd if=/...
  • 进程和计划任务管理 程序 Ø保存在硬盘、光盘等介质中的可执行代码和数据 Ø是静态保存的代码 进程 Ø在CPU及内存中运行的程序代码 Ø是动态执行的代码 Ø父、子进程:每个进程可以创建一个或多个进程 操作系统的一...
  • 根据对后台管理系统需求分析的上述要求,后台管理系统的功能模块分为两个大的部分,用户管理端和题目管理端,其中用户端就是查看所有用户,对异常用户可以进行限制登陆,题目管理端包括题目的录入,题目的审核,...
  • 学生上机记录登记系统

    热门讨论 2011-11-18 09:48:24
    设计思路: 程序需开机自启动,启动后为全屏无菜单栏、工具栏等相关按钮,...同时鉴于个别学生乱填写的情况,添加了教师后台,教师后台可以编辑或删除不符合要求的记录。教师可通过数据库添加或修改管理员用户名和密码
  • 网络安全上机竞赛试题操作演示网络安全上机竞赛试题操作演示—难易度·简单入门BY IT民工2017-7-5第一题 考查网络基础知识解题思路 :通过ping 命令测试网站域名 ,获取IP地址 ,再通过IP地址判断其类型。...
  • '本书是计算机专业核心课程软件工程的教材,主要内容包括:软件工程概述、软件项目分析、需求分析、概要设计、详细设计、面向对象的分析与设计方法、用户界面设计、编码、软件质量与质量保证、项目计划与管理、软件...
  • Linux上机实验大全

    2019-06-22 21:20:35
    仅供参考,不可转载!!! 有任何问题可以留言小编,谢谢!!! 实验一 Linux的认识 ...虚拟机的启动、关闭,虚拟机的基本管理 2、系统登录和用户管理 1)用用户名root、密码linux登录系统 登录系统后修改...
  • 金蝶K3系统上机日志如何清除

    万次阅读 2019-04-11 15:35:27
    2、14.0wise以及以后版本,受国家发布的《会计信息化规范》要求,不允许软件提供上机目志删除功能不支持删除,只支持归档,或直接在账套管理中修改上机日志提醒参数;使用标准产品的日志归档功能,归档后日志仍保存...
  • 后台数据库 设计公交安全管理系统,推荐使用SQL Server,其它DBMS亦可。 数据库的有关语义如下: 公交公司有若干个车队,每个车队下有若干条线路; 公交公司有若干辆汽车,每辆车属于一条线路; 每个车队有一名...
  • No.3 通过上机实践加强理解Oracle9i数据库的安装与配置 2实践内容 1在虚拟机上练习安装Oracle9i数据库测试是否安装成功注虚拟机软件可用Vware软件注意其中的几个关键步骤详细参看课本29-37页写出安装成功后在Windows...
  • 机房管理系统源码

    2011-12-09 12:25:30
    学生上机管理,机房管理系统,数据库后台……功能齐全!
  • 数据库上机实验(一)

    千次阅读 2012-11-19 14:02:47
    这个学期学习了数据库这门课程,一共四次上机,8个上机试验,都比较基础,现在将几次上机试验以及个人做得结果写一下,希望能对刚学习的同学有帮助吧,教材《数据库系统概论》(第四版)高等教育出版社,可以参考这...
  • 第一周上机课作业

    2018-03-08 08:52:30
    后台服务及自动唤醒 这是最最最主要的原因. Android和iOS在后台服务策略之间的区别极大的影响了系统的表现. 举个例子: 我的Nexus5从CM11刷到了Lollipop, 非常流畅, 还和iPhone6 plus对比了刷微博, 完全看不出谁掉...
  • 李代平、张伯泉的《数据库习题解析与上机指导》上的习题解答
  • java上机心得报告2

    2017-09-21 20:10:19
    当然,和网站有关的HTML,也就是前端语言要会,还有后台action都要知道,最好学习一些框架,比如三大框架等。 这都是需要一些时间的,最好还是请教老师,能少走很多弯路。 java...
  • 17.2.23上机作业

    2017-02-23 11:10:19
    提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。 Linux Kernel 也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。 如果你学过计算机网络知道 OSI/RM ,就会...
  • 华为上机考试注意事项及编程技巧(精品)

    万次阅读 多人点赞 2018-03-25 14:49:07
    这是一篇关于华为招聘软件类职位上机考试的博客,主要介绍一下华为机考的流程、注意事项以及一些机试题中常用的编程技巧,写得有点长,但都是尽心尽力敲的,如果真的要参加华为招聘(或者类似公司的招聘),建议稍微...
  •  学生机房的管理,是一件琐碎、繁重的工作。以上机记录的填写为例,学校每学期都要印发大量的纸质的用于填写上机记录的表格,而教师每节课上课前都要组织学生认真填写,填写后,还要挨个检查,学期末,还要做好统计...
  • 首页、个人中心、学生管理、教师管理、班级信息管理、课程信息管理、机房信息管理、计算机管理、签到上机管理管理管理等功能; 2.教师 首页、个人中心、课程信息管理、学生管理、班级信息管理、机房信息管理、...
  • 上机考试软件(二)

    2008-11-03 21:05:09
    在这个实验性质的C/S模式机考软件项目中,我所负责的那部分模块的业务代码早已完成了(回顾一下我的任务:考试系统后台数据的管理,包括考场信息的生成,试卷的生成、批改),可一直缺少界面来实现这些功能。...
  • 数据库服务器是指管理数据库的各种软件工具(比如sqlplus,OEM等),实例,数据库3个部分。Oracle服务器主要由实例,数据库,程序全局区,前台进程组成。 12.启动Oracle数据库服务器是指在服务器的内存中创建一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,968
精华内容 1,187
关键字:

上机后台管理