Windows Server通过宝塔面板安装 Snipe-IT资产管理系统

一、安装宝塔面板

1、下载宝塔面板

  地址:https://www.bt.cn/new/download.html

2、安装

  根据提示安装即可。

二、宝塔面板初始配置

1、启动

  双击桌面上的宝塔面板图标,执行程序。

2、初始配置

(1)域名

  可以不填,如果需要,后期可以再补充。
  如果在局域网使用,可以直接使用IP Address访问宝塔面板的管理界面。当然也可以通过修改hosts文件来达到域名访问宝塔面板的目的,但不需要在此处设置。除非在互联网上需要直接访问宝塔面板的管理界面(相信出于安全的考虑,一般没人这么做)并且购买有域名可用,否则此处都可以不填。

(2)端口

  默认是8888,如果与服务器上的其他程序冲突,可以在此处更改。一般冲突时会有提示。

(3)安全入口

  登录宝塔面板的管理界面时,默认地址是http://ip地址:端口号/安全入口的格式。
例如:

http://127.0.0.1:8888/**admin**

  此处的安全入口即为admin,可以根据自己意思改成其他的,比如default,那登录地址就变为:

http://127.0.0.1:8888/default

(4)授权IP

  可访问宝塔面板管理界面的IP地址白名单。

(5)用户名

  登录宝塔面板管理界面的用户名,根据需要自己设置,但不能使用admin

(6)密码

  登录宝塔面板管理界面的密码。

3、访问面板的管理界面

(1)本机访问

  如果在安装宝塔面板的本机(通常是服务器)访问,可以直接使用http://127.0.0.1:端口号/安全入口的格式直接在浏览器中打开。
  也可以使用http://localhost:端口号/安全入口的地址直接在浏览器中打开。如果是使用localhost代替127.0.0.1访问失败,可以在hosts中做一下解析。

(2)在其他电脑上远程访问

  跟上面的“通过本机”访问一样,只不过把IP Address改为安装宝塔面板的机器(服务器)的IP Address即可。

三、登录宝塔面板的管理界面

  直接输入初始配置中帐号密码登录即可。



  登录后会推荐一些应用,可以直接叉掉,后期自行安装。

四、在宝塔面板中安装应用

1、安装并设置PHP

(1)安装

  ①按上图所示在宝塔面板的管理界面中点击软件商店——运行环境,找到PHP-7.4,点击后面的安装,会弹出如下两图所示的确认对话框。

  ②依次点击安装确定按钮,继续到下一步,开始安装。

  ③安装完成后会提示当前没有任务!,如下图。

  按F5键刷新页面,出现如下图所示的界面,即为安装完毕,并且已经执行。


  **注意:此处之所以选择安装PHP7.4的版本,是因为下面需要安装的phpMyAdmin需要该版本的支持。而单独安装目前宝塔面板中较新的PHP8.0和PHP8.1两个版本会均会导致phpMyAdmin安装失败。实际操作中发现如果单独只安装PHP7.4版本,后面安装Snipe-IT时,又会导致网页不能打开。
所以下面需要重复以上步骤再安装PHP8.1版本。所以同时安装PHP7.4和PHP8.1版本。

(2)重复以上步骤安装PHP8.1版本,步骤略。

(3)设置

  在上图中找到安装好的PHP8.1,点击后面的设置,进入到PHP设置界面。
说明:
  PHP8.1是为Snipe-IT准备的,所以只需要对应设置PHP8.1即可。而PHP7.4是为phpMyAdmin服务的,没有此要求,可以不设置。

①解禁部分必需的PHP函数

  查询网上的资料说,PHP包管理工具Composer需要使用部分被禁用掉的有风险的函数,包括putenv、proc_open、pcntl_signal、proc_get_status,需要对这些函数解除禁用。
  a.在设置界面中点击禁用函数

b.依次找到上面所说的几个函数,点击后面的删除,把对应的函数删除掉。如果找不到某个函数,说明该函数没有在禁用列表中,可以不予理会。

②安装扩展


  点击安装扩展,在扩展中找到fileinfo,点击后面的安装即可。这个版本是默认已经安装好的,可以忽略本步骤。

③将PHP安装目录添加到PATH路径中去

  安装路径位于宝塔面板安装目录中的php\xx目录中。其中xx是PHP的版本号,比如本例中的PHP版本8.1,则此处的xx81,本例中的宝塔面板安装在d:\software中,则PHP的完整路径为d:\SoftWare\BtSoft\php\81(前面安装的php74并不是给Snipe-IT使用的,所以不需要添加到path环境变量中,而且这影响到下面Key的生成)。
  在服务器中右击此电脑——属性——高级系统设置——高级标签页——环境变量——系统变量——双击path——在编辑环境变量对话框中添加d:\SoftWare\BtSoft\php\81,最后依次点击确定完成操作。
通常需要重启电脑或注销一下用户才能使用该环境变量生效。

2、安装WEB运行环境Nginx

(1)安装

与前面安装PHP的步骤相同,具体如下图,不一一详述。


3、安装MySQL

方法同上。



  需要注意的是,在安装过程中要选择一下需要安装的MySQL的版本号,如下图,这儿选择8.0版本。


222.PNG

4、安装phpMyAdmin

  phpMyAdmin是一款WEB端的MySQL管理工具。如果不需要访问MySQL数据库,可以不安装。
  安装方法与上面应用相同,如下图。


  安装过程中注意选择版本,我个人习惯使用最新版本,如下图。

  注意:如果phpMyAdmin安装过程结束刷新后,phpMyAdmin还是出现如图所示的样子,说明安装没有成功,这时候就要查看一下安装日志示中的报错提示是否是因为前面安装了phpMyAdmin不支持的php版本。

五、下载Snipe-IT,并在宝塔面板中做相应设置

1、下载Snipe-IT

  Snipe-IT是一款开源的软件,发布在github上。下载方法有两种。分别是直接到github.com上下载压缩包,或是通过git命令的方式进行下载。

(1)直接在github.com上下载

  按下图所示直接访问https://github.com/snipe/snipe-it,按下图所示直接下载zip包。

说明:
  这儿要说一下,压缩包解压之前,需要先确定安装位置。Linux中一般网站都是存放在/www/wwwroot/下,而Windows使用IIS则一般是将网站放在c:\inetpub\wwwroot目录中。这儿结合两种情况以及Windows本身的规则和磁盘占用情况,在D盘新建d:\wwwroot文件夹用来存入网站。然后再新建d:\wwwroot\snipe-it文件夹。然后将下载的压缩包解压到d:\wwwroot\snipe-it中去。注意,压缩包打开时,里面嵌套了一层文件夹,只需要把文件夹中的所有文件解压到相应位置即可,不需要连最上层的嵌套文件夹一起解压。具体路径如下图。

说明:
  此处的d:\wwwroot\snipe-it并不是最终的安装文件夹。

(2)使用git命令下载

说明:
   Git是一个程序员常用的项目版本控制系统,可以直接对github等开源代码托管网站进行上传、下载、同步、比较等操作。有图形界面和命令行界面。此处没有必要安装一个完整的Git系统,只需要下载个便携版本即可。

①下载安装Git

  下载地址:https://git-scm.com/download/win
  根据Windows的版本来选择对应的32位或是64位的便携版本。如下图

  下载得到的是一个类似于PortableGit-2.36.1-64-bit.7z.exe的自解压的压缩包。
  直接双击或是用WinRAR之类的压缩软件直接打开,均可以执行解压操作。不管解压后这个目录具体的位置放在哪里,都要把这个目录中的cmd文件夹添加到windows的环境变量path中去,这样可以在cmd环境中的任何位置直接执行git.exe命令。
  临时添加的话可以在cmd中使用以下代码实现:

path %path%;D:\SoftWare\PortableGit\cmd

  其中D:\SoftWare\PortableGit\cmd根据Git实际的安装位置进行修改。

②通过git命令下载Snipe-IT

  直接在CMD命令行中执行以下命令

git clone https://github.com/snipe/snipe-it d:\wwwroot\snipe-it

  其中的d:\wwwroot\snipe-it仅是本例中的地址,具体可根据需要来决定。
  该命令执行后,正常情况下会出现类似下面的安装过程。

C:\Users\Administrator>git clone https://github.com/snipe/snipe-it d:\wwwroot\snipe-it
Cloning into 'd:\wwwroot\snipe-it'...
remote: Enumerating objects: 144604, done.
remote: Counting objects: 100% (1339/1339), done.
remote: Compressing objects: 100% (444/444), done.
remote: Total 144604 (delta 952), reused 1259 (delta 895), pack-reused 143265
Receiving objects: 100% (144604/144604), 142.61 MiB | 1.01 MiB/s, done.
Resolving deltas: 100% (95529/95529), done.
Updating files: 100% (6536/6536), done.

C:\Users\Administrator>

  但因为GitHub网站在国内有时会不能访问或访问缓慢等情况,有可能导致下载不成功的情况出现。这种情况请调整网络环境。

2、在宝塔面板中添加网站

(1)宝塔面板中点击如下图如示的网站,切换到网站管理界面。


(2)点击上图中的添加网站,弹出如下图的添加网站的界面。
  大多数内容参照下图中的设置。

  ①域名
  此处必须填写,不可以省略。使用什么域名、IP地址以及使用什么端口来访问这个网站就由此处填写什么来决定。当然,域名和IP地址必须是真实有效的。
  如何填写,在文本框中未填写任何内容时有很详细的说明。如果没有域名就填写IP地址加端口号的格式。

  ①备注
  理论上来说是随便填写,但最好填写一些有用的信息,比如网站的用途、说明等

  ②根目录
  参照Snipe-IT下载时的实际存放安装位置选择,本例中是d:\wwwroot\snipe。宝塔面板会根据这儿填写的内容自动创建对应的文件夹,并在文件夹中生成.htaccess.user.ini404.htmlindex.html四个文件,如下图。

注意:
  此处输入的路径并不是下载时所使用的d:\wwwroot\snipe-it。就是因为如果直接使用snipe-it时,宝塔面板自动生成的.htaccess.user.ini404.htmlindex.html四个文件会覆盖掉下载路径中的同名文件。

  ③FTP
  出于管理的需要可以创建,但不是必须。本例中因为前面并没有安装FTP,同时实际使用中有其他的办法对文件进行管理,所以选择不创建

  ④数据库
  Snipe-IT支持MySQL,在创建站点时可以同时为该站点创建数据库,所以按如图所示选择即可。
  代码集中有utf-8及utf8mb4的选项,utf-8是utf8mb4的子集,为了避免实际使用过程中出现不可预知的情况,直接选择utf8mb4,从网络上所查询的资料来看,实际使用过程中使用utf-8似乎也可以。

  ⑤数据库设置用户名、密码
  为数据库创建用户,并设置用户名、密码。这个根据自己的喜欢来做就可以了。

  ⑥程序类型
  没什么好说的,这儿不让改。

  ⑦PHP版本
  基本上,我们在上面安装了什么版本的php,这儿就选择什么版本。

  ⑧网站分类
  如果不是网站很多的话,这儿无所谓选不选。而且前面并没有创建多个网站分类,本例中这儿也没什么好选的。

(3)提交
  以上内容填写好后,点提交按钮,如果出现以下界面说明网站创建成功。

直接叉掉上图的提示框后可以继续其他操作。

(4)将新建网站自动生成的snipe文件夹删除,并将d:\wwwroot\snipe-it改为d:\wwwroot\snipe

3、确认数据库是否建立成功

在添加网站时可以同时建立数据库,在此我们点击“数据库”,查看数据库是否建立成功。



  如果数据库未建立成功,可以手工在此处为刚建立的网站建立数据库。

4、安装Composer

  Composer 是 PHP5.3以上 的一个依赖管理工具。根据在网上找到的资料,需要安装。

(1)升级Composer

  宝塔面板中已经集成了Composer的下载安装操作,我们只需要在宝塔面板中下载安装即可。
  ①在宝塔面板中点击网站,然后点击对应网站后面的设置,如下图。


  在弹出的界面中点击Ccomposer,然后点击下图界面中的升级Composer,先将Composer升级到最新版本。

  如果有新的版本,就会执行升级,否则会提示当前已经是最新的版本

(2)安装Composer

  依次按上图所示填入或选择各项内容。
  ①PHP版本:自动选择即可,如果选择PHP-81会报错。
  ②执行参数:选择Install
  ③补充命令:填入--no-dev --prefer-source --ignore-platform-reqs
  ④镜像源:默认阿里源(mirrors.alyyun.com)即可。
  ⑤执行目录:默认为当前网站目录,具体是什么意思不太清楚,因为实际Composer安装的位置并不在网站目录中。我最终是通过搜索最终在宝塔面板的安装目录中的panel\script里同找到composer.phar文件。
  最后点击执行会弹出 如下界面。


  此处等待一会后会自动开始安装,如下图。

  安装完成后,叉掉安装界面即可。

六、其它一些设置

1、设置目录权限

  从网上的搜索到的资料是需要将网站目录中的public\uploads和的所有者给www用户,同时赋予www用户对于该目录的完全权限,其他用户则只保留读与执行的权限。
  该资料的背景中在CentOS7中进行Snipe-IT的安装,具体到Windows中使用宝塔面板进行安装,需要根据具体情况处理。

(1)查看Nginx是用什么用户运行

  宝塔面板中点击软件商店,在已安装中找到Nginx,点击后面的设置,如下图。


  在弹出的界面中(如下图),选择运行用户,查看运行用户是管理员还是'www用户。本例中是管理员用户,个人理解只要保证管理员用户能对public\uploads`文件夹具体完全读写权限,其他用户(组)具有读与执行权限即可。

(2)修改权限


  在服务器上,直接在Windows中找到网站目录中的public\uploads文件夹。

  在文件夹上右击,选择属性,在弹出的文件夹属性对话框中选择安全标签页。按照上面的要求做以下几项操作:
  ①给administrators组赋于读取、写入、执行的权限。
  一般来说,默认不需要修改。
  ②添加everyone用户,并赋予该用户读取与执行权限,取消写入权限。

  具体的操作只是普通的Windows操作,不作详细步骤说明。

2、创建并修改配置文件

(1)创建配置文件

  直接在网站目录中找到.env.example文件,将该文件复制一份,并改名为.env。需要注意的是,如果在资源管理器中直接进行修改,会提示“必须键入文件名”的提示,如下图。这是因为Windows中把文件名最后一个.后面的视做扩展名,最后一个.前面的视作文件名,而这个文件最后一个.前面没有任何字符,Windows认为该文件没有文件名,而这是不被允许的。


  此时可以进入到CMD中进行修改,具体命令参见下方。
  具体到命令中涉及到的路径,根据实际网站路径来确认。

Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>d:

D:\>cd D:\wwwroot\snipe

D:\wwwroot\snipe>copy .env.example .env
已复制         1 个文件。

D:\wwwroot\snipe>

(2)修改配置文件

①编辑方法介绍

  直接对新生成的.env文件进行编辑,可以直接使用记事本或是其他文本编辑器对该文件编辑,也可以直接在宝塔面板的文件中对该文件进行编辑。


  在上图所示界面中双击.env文件,即可对该文件进行编辑,如下图。具体操作细节略。

②修改内容

  见以下代码中注释部分。

# --------------------------------------------
# REQUIRED: BASIC APP SETTINGS
# --------------------------------------------
APP_ENV=production
APP_DEBUG=false
APP_KEY=ChangeMe
APP_URL=xxx.xxx.xxx.xxx                              #网站域名
APP_TIMEZONE='Asia/Shanghai'                         #默认时区
APP_LOCALE=zh-cn                                     #默认语言
MAX_RESULTS=500

# --------------------------------------------
# REQUIRED: UPLOADED FILE STORAGE SETTINGS
# --------------------------------------------
PRIVATE_FILESYSTEM_DISK=local
PUBLIC_FILESYSTEM_DISK=local_public

#PRIVATE_FILESYSTEM_DISK=s3_private
#PUBLIC_FILESYSTEM_DISK=s3_public

# --------------------------------------------
# REQUIRED: DATABASE SETTINGS
# --------------------------------------------
DB_CONNECTION=mysql
DB_HOST=127.0.0.1                                            #数据库服务器地址
DB_DATABASE=null                                             #数据库名称
DB_USERNAME=null                                             #数据库用户名
DB_PASSWORD=null                                             #数据库密码
DB_PREFIX=null
DB_DUMP_PATH='D:\\SoftWare\\BtSoft\\mysql\\MySQL8.0\\bin'    # mysqldump.exe文件路径
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci

# --------------------------------------------
# OPTIONAL: SSL DATABASE SETTINGS
# --------------------------------------------
DB_SSL=false
DB_SSL_IS_PAAS=false
DB_SSL_KEY_PATH=null
DB_SSL_CERT_PATH=null
DB_SSL_CA_PATH=null
DB_SSL_CIPHER=null
……

说明 :
  数据库服务器地址:网上查到的资料是,这儿要写清楚网站访问的url,只有通过此处填写的url访问Snipe-it才可以看到上传的图片。但实际测试过程中我发现,在内网中(外网没有测试),此处留空才可以看到正确的图片。
  关于DB_DUMP_PATH项,是为了指明mysqldump.exe文件的位置。此处很重要,如果路径不对,则使用备份功能时会报错。mysqldump.exe是mysql中的一个可执行文件,具体位置根据安装的mysql版本不同会有些区别。一个笨方法就是直接通过文件搜索找到该文件的位置,将路径填入此处。本例中的MySQL也是通过宝塔面板安装的。具体路径如上面代码中所示。注意,填写时,分隔符应该使用\\,而不是单个的\,此处与正常路径表达方式不一样。

3、生成Key

(1)先在php安装目录(d:\SoftWare\BtSoft\php\74)中新建composer.bat批处理文件,内容如下:

@echo off
php D:\SoftWare\BtSoft\panel\script\composer.phar

(2)在cmd中切换d:\wwwroot\snipe为当前文件夹,并执行生成key的命令。

Microsoft Windows [版本 10.0.14393]
(c) 2016 Microsoft Corporation。保留所有权利。

C:\Users\Administrator>d:

D:\>cd wwwroot\snipe

D:\wwwroot\snipe>php artisan key:generate
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > yes

Application key set successfully.

D:\wwwroot\snipe>

注意:
  代码中的php artisan key:generate一行中的php是指PHP安装目录中的php.exe文件,此处一定要保证执行的是php8.1版本安装目录中的php.exe程序。这个在前面讲到php安装时,只添加PHP8.1版本的安装目录到PATH环境变量,就是为了保证此处的命令执行。

(3)确认key是否生成成功

  打印网站目录中的.env文件,查看APP_KEY=项后面是否如下面代码中的内容,如果是即说明key生成成功。

# --------------------------------------------
# REQUIRED: BASIC APP SETTINGS
# --------------------------------------------
APP_ENV=production
APP_DEBUG=false
APP_KEY=base64:tIcOuGKfI5Nt0UqeRqxxxh7nUyyy3ytF+//O2yM7wX0=
APP_URL=127.0.0.1
APP_TIMEZONE='Asia/Shanghai'
APP_LOCALE=zh-cn
MAX_RESULTS=500

(4)关于key

  我在网上找了关于php artisan key:generate命令以及这个Key的作用,但大多数都是照搬自官网的解释,引用如下:

在部署项目的时候必须执行,尤其是从 git 上拉下来的项目,需要手动配置 .env 文件。
php artisan key:generate,项目中所有的的 OpenSSL 加密都是依赖它生成的,包括 Cookie,Session,还有 JWT 这些组件。
所以如果你有生产环境和开发环境,最好都使用命令生成 key,避免重复,而且 key 一旦泄露项目就危险了。
话又说回来,如果没有配置 app_key 项目是运行不起来的。
生成后的key位置在.env里面。

  我本人对php并不了解,上面的这段话也不是很理解。总结就是这个key没有不行。如果有人能帮我详细说一下是什么意思,非常感谢。

4、设置网站的运行目录

  (1)在宝塔面板中点击网站,如下图,再点击相应网站后面的设置


  (2)在弹出的界面中点击网站目录,然后将运行目录改为如下图的public

  (3)最后点击后面的保存按钮。

5、对网站配置文件进行配置

  在上图中点击配置文件,然后如下图输入以下代码。最后点击保存按钮即可。


  此处需要注意是上图中绿框中的代码fastcgi_pass 127.0.0.1:20081;,此处20081端口并不是固定的。如果填写了不正确的端口,会导致网站不能访问。
  正确的端口可通过如下方法查询。

  在宝塔面板中点击软件商店——已安装,找到Nginx,然后点击右边的文件夹图标,会跳转到如下界面。

  在上图所示界面中,依次打开D:/SoftWare/BtSoft/nginx/conf/php文件夹,找到81.conf文件(根据所使用的php版本来决定是哪个文件,本例中Snipe-IT使用的是php8.1版本的php,所以找到81.conf文件),直接双击,打开该文件,如下图。

  如上图红框中的内容所示,此处端口即20081,将此端口按上面所述填入到配置文件的相应位置即可。

server 
{
    listen 99;
    server_name 10.5.2.11 127.0.0.1; 
    index index.php index.html index.htm default.php default.htm default.html;
    root d:/wwwroot/snipe/public/;

    location ~ \.php$ {
        root d:/wwwroot/snipe/public/;
        try_files $uri $uri/ =404;
        fastcgi_pass   127.0.0.1:20081;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
    
     location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
     {
        expires 30d;
        error_log off;
        access_log /temp/null;
     }

    location ~ .*\.(js|css)?$
    {
        expires 12h;
        error_log off;
        access_log /temp/null;
    }
    

    #反代清理缓存配置
    location ~ /purge(/.*) {
        proxy_cache_purge cache_one $1$is_args$args;
    }
    
    #proxy 反向代理
    include proxy/10.5.2.11/*.conf;


    #REWRITE-START
    include rewrite/10.5.2.11/*.conf;
    #REWRITE-END

    #redirect 重定向
    include redirect/10.5.2.11/*.conf;

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }

    access_log  D:/SoftWare/BtSoft/wwwlogs/10.5.2.11.log;
    error_log  D:/SoftWare/BtSoft/wwwlogs/10.5.2.11.error.log;
}

6、设置伪静态

(1)在上图所示界面中点击伪静态,在文本框中输入如下图所示代码,最后点击保存


  以上代码如下,可复制。

if (-f $request_filename/index.html){
    rewrite (.*) $1/index.html break;
}
if (-f $request_filename/index.php){
    rewrite (.*) $1/index.php;
}
if (!-f $request_filename){
    rewrite (.*) /index.php;
}

  实测,如果伪静态中不设置该段代码,保留空白,网站也可以运行,但在导入数据时会报错。

七、安装Snipe-IT

  以上的工作做完,就可以正式安装Snipe-IT了。

  1、直接在浏览器中访问建站时录入的域名(如下图)。


  本例中为http://xxx.xxx.xxx.xxx:99/setup,出于安全考虑,此处具体的IP地址做了打码处理。
  如果前面安装没有问题,此时访问以上url后会出现以下界面。

  此处对Snipe-IT的安装环境做了一个检测,本例中最后一项的Email必须在点击Sent Test做发送测试成功才会显示代表通过的
  Email的相关配置在.env中,具体参见下面。
  打开.env文件,找到如下的配置内容,进行对应的修改即可。
  不配置Email相关内容,此处点击Send Test也会测试失败,但并不会影响Snipe-IT的安装与使用。

# --------------------------------------------
# REQUIRED: OUTGOING MAIL SERVER SETTINGS
# --------------------------------------------
MAIL_DRIVER=smtp
MAIL_HOST=email-smtp.us-west-2.amazonaws.com    #服务器地址
MAIL_PORT=587                                   #SMTP端口
MAIL_USERNAME=YOURUSERNAME                      #用户名
MAIL_PASSWORD=YOURPASSWORD                      #密码
MAIL_ENCRYPTION=null                            #是否加密,如果是null代表不加密,否则可以根据加密方式填写,比如ssl
MAIL_FROM_ADDR=you@example.com                  #发送邮件的地址
MAIL_FROM_NAME='Snipe-IT'                       #发送邮件显示的发送人
MAIL_REPLYTO_ADDR=you@example.com               #接受邮件的地址
MAIL_REPLYTO_NAME='Snipe-IT'                    #接受邮件的接收人
MAIL_AUTO_EMBED_METHOD='attachment' 

  2、点击以上界面的中的Next:Create Database Tables进入下一步,在数据库中创建表,如下图。


  3、继续点击上图中右下角的general.setup_migrations)create_user,为Snipe-IT创建用户,如下图。

  图中红框框起来的部分是必填项目。
  (1)站点名称:为这个系统起个名称,这个名称会显示在主页上。系统安装完成后仍旧可以修改。
  (2)默认语言:如果是中文用户,此处改为Chinese Simplified。系统安装完成后仍旧可以修改。
  (3)默认货币:如果要选择人民币,此处输入RMB.系统安装完成后仍旧可以修改。
  (4)生成自动递增的资产标签:我的理解是资产编号自动加1,所以此处我是勾选的。仅供参考。系统安装完成后仍旧可以修改。
  (5)完整多企业支持:我的理解可以一套系统服务于多个企业主体,建立多个账套。根据需要选择是否打勾。系统安装完成后仍旧可以修改。
  (6)前缀(可选):我还不太清楚具体使用中前缀的相关情况。系统安装后仍旧可以修改。
  (7)电子邮件域名:电子邮件地址中@符号后面的部分。
  (8)电子邮件格式:根据喜好选一个吧。
  (9)名字:
  (10)姓氏:
  (11)邮箱:绑定这个帐户的邮箱,以后系统中的相关信息可以发送到该邮箱。
  (12)用户名:就是用户名,这个要好好起个。该用户默认将是超级用户。
  (13)密码:
  (14)确认密码:
  (15)Email my credentials to the email address above:此帐户建立后,将相关凭据发到上面填写的对应的电子邮箱中。
  4、点击上图下方的Next:Save User,进入系统,如下图。

  至此,所有安装步骤完成。

八、关于一些自定义的功能。

  Snipe是一个开源软件,可能对代码进行一些修改实现一些简单的功能。以下是几个摸索出来的地方可以进行一些简单修改。

1、中文修改

  网站默认目录下的resources\lang\zh-cn\general.php文件中定义了大量的中文翻译,对于翻译不准确的地方,可以在这儿进行修改。改的时候,直接修改中文部分就行了,=>前面的部分不要动。
  比如:把借出修改为领用
  比如:在查看用户中的打印所有已分配资产中的管理员签字改为部门主管签名。(下面代码中已经改了)

return [
    'accessories'           => '附属品',
    'activated'             => '已激活',
    'accessory'             => '附属品',
    'accessory_report'      => '配件报告',
    'action'                => '操作',
    'activity_report'       => '活动报告',
    'address'               => '地址',
    'admin'                 => '管理员',
    'administrator'         => '管理员',
    'add_seats'             => '已增加空位',
    'all_assets'            => '所有资产',
    'all'                   => '所有',
    'archived'              => '已存档',
    'asset_models'          => '资产型号',
    'asset_model'           => '模型',
    'asset'                 => '资产',
    'asset_report'          => '资产报备',
    'asset_tag'             => '资产标签',
    'asset_tags'            => '资产标签',
    'assets_available'      => '可用资产',
    'accept_assets'         => '接受资产:名称',
    'accept_assets_menu'    => '接受资产',
    'audit'                 => '审计',
    'audit_report'          => '审核日志',
    'assets'                => '资产',
    'assigned_to'           => '借出给:name的资产',
    'avatar_delete'         => '删除头像',
    'avatar_upload'         => '上传头像',
    'back'                  => '后退',
    'bad_data'              => '未发现任何东西,是否数据错误?',
    'bulkaudit'             => '批量审核',
    'bulkaudit_status'      => '盘点状态',
    'bulk_checkout'         => '批量借出',
    'bulk_edit'             => '批量编辑',
    'bulk_delete'           => '批量删除',
    'bulk_actions'          => '批量操作',
    'bulk_checkin_delete'   => '批量签入 & 删除',
    'bystatus'              => '按状态',
    'cancel'                => '取消',
    'categories'            => '目录',
    'category'              => '类别:',
    'change'                => '归还/借出',
    'changeemail'           => '更改邮箱',
    'changepassword'        => '修改密码',
    'checkin'               => '归还',
    'checkin_from'          => '输入来源',
    'checkout'              => '借出',
    'checkouts_count'       => '签出',
    'checkins_count'        => '签入',
    'user_requests_count'   => '请求',
    'city'                  => '城市',
    'click_here'            => '点击此处',
    'clear_selection'       => '清除选择',
    'companies'             => '公司',
    'company'               => '公司',
    'component'             => '组件',
    'components'            => '组件',
    'complete'              => '完成',
    'consumable'            => '消耗品',
    'consumables'           => '消耗品',
    'country'               => '国家',
    'create'                => '新增',
    'created'               => '项目已创建',
    'created_asset'         => '新建资产',
    'created_at'            => '新增于',
    'created_by'            => '创建者',
    'record_created'        => '记录已创建',
    'updated_at'            => '更新日期',
    'currency'              => 'RMB', // this is deprecated
    'current'               => '当前',
    'current_password'      => '当前密码',
    'customize_report'      => '自定义报告',
    'custom_report'         => '自定义资产报表',
    'dashboard'             => '控制面板',
    'days'                  => '天数',
    'days_to_next_audit'    => '距离下一次盘点的天数',
    'date'                  => '日期',
    'debug_warning'         => '警告!',
    'debug_warning_text'    => '此应用程序运行在生产模式下的调试状态。如果您的应用程序可以被外部访问,这会使敏感数据暴露。通过将 <code>.env</code> 文件中的<code>APP_DEBUG</code> 值设置为 <code>false</code>来 禁用调试模式。',
    'delete'                => '刪除',
    'delete_confirm'        => '是否确定删除此项',
    'deleted'               => '已删除',
    'delete_seats'          => '已移除空位',
    'deletion_failed'       => '删除失败',
    'departments'           => '部门',
    'department'            => '部门',
    'deployed'              => '已分配',
    'depreciation'          => '折旧',
    'depreciations'         => '折旧',
    'depreciation_report'   => '折旧报告',
    'details'               => '详细信息',
    'download'              => '下载',
    'download_all'          => '下载全部',
    'editprofile'           => '修改简介',
    'eol'                   => '寿命',
    'email_domain'          => '邮件域',
    'email_format'          => '电子邮件格式',
    'employee_number'       => '员工号码',
    'email_domain_help'     => '这在导入时用以生成电子邮件地址',
    'error'                 => '错误',
    'example'               => '示例︰ ',
    'filastname_format'         => '缩写名 姓,例如(jsmith@example.com)',
    'firstname_lastname_format' => '名 姓,例如 (jane.smith@example.com)',
    'firstname_lastname_underscore_format' => '名 姓,例如(jane_smith@example.com)',
    'lastnamefirstinitial_format' =>  '姓氏首字母(smithj@example.com)',
    'firstintial_dot_lastname_format' => '缩写名 姓,例如(jsmith@example.com)',
    'first'                 => '首页',
    'firstnamelastname'     => '名 姓,例如 (jane.smith@example.com)',
    'lastname_firstinitial' => '姓 缩写名, 例如 (smith_j@example.com)',
    'firstinitial.lastname' => '缩写名 姓,例如(jsmith@example.com)',
    'firstnamelastinitial'  => '名 姓,例如 (jane.smith@example.com)',
    'first_name'            => '名字',
    'first_name_format'     => '名,例如 (jane@example.com)',
    'files'                 => '文件',
    'file_name'             => '文件',
    'file_type'             => '文件类型',
    'filesize'              => '文件大小',
    'file_uploads'          => '文件上传',
    'file_upload'           => '文件上传',
    'generate'              => '生成',
    'generate_labels'       => '生成标签',
    'github_markdown'      => '该字段可以使用 <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown语法</a>',
    'groups'                => '分组',
    'gravatar_email'        => 'Gravatar头像邮件地址',
    'gravatar_url'          => '<a href="http://gravatar.com"><small>在 Gravatar.com</small></a> 更改您的头像。',
    'history'               => '历史记录',
    'history_for'           => '历史记录',
    'id'                    => '编号',
    'image'                 => '图片',
    'image_delete'          => '删除图片',
    'image_upload'          => '上传图片',
    'filetypes_accepted_help'    => '可接受的文件类型是 :types. 最大允许上传大小为 :size.|可接受的文件类型是 :types. 最大允许上传大小为 :size.',
    'filetypes_size_help'   => '允许最大上传文件的大小为 :size.',
    'image_filetypes_help'  => '接受jpg,png,gif和svg类型的文件。文件大小应小于 :size。',
    'import'                => '导入',
    'importing'             => '正在导入…',
    'importing_help'        => '您可以通过CSV文件导入资产、配件、许可证、组件、消耗品和用户。 <br><br>CSV 应以逗号分隔和格式化,并且在文档</a> 中与 <a href="https://snipe-it.readme.io/docs/importing" target="_new">样本CSV中的标头匹配。',
    'import-history'        => '导入历史记录',
    'asset_maintenance'        => '资产维修',
    'asset_maintenance_report' => '资产维修报表',
    'asset_maintenances'       => '资产维修',
    'item'                  => '条目',
    'item_name'             => '物品名称',
    'insufficient_permissions' => '没有足够的权限',
    'kits'                  => '预定义的 Kits',
    'language'              => '语言',
    'last'                  => '最后页',
    'last_login'            => '上一次登陆:',
    'last_name'             => '姓氏',
    'license'               => '授权许可',
    'license_report'        => '授权许可报告',
    'licenses_available'    => '可用许可',
    'licenses'              => '许可证',
    'list_all'              => '列出全部',
    'loading'               => '正在加载... 请稍候...',
    'lock_passwords'        => '此字段值将不会保存到演示安装中。',
    'feature_disabled'      => '演示模式下禁用此功能',
    'location'              => '位置',
    'locations'             => '地理位置',
    'logo_size'             => '方形标志使用Logo + 文本看起来最好。标志最大显示尺寸为 50px 高 x 500px 宽度。  ',
    'logout'                => '注销',
    'lookup_by_tag'     => '查找资产标签',
    'maintenances'          => '维护',
    'manage_api_keys'       => '管理 API 密钥',
    'manufacturer'          => '制造商',
    'manufacturers'         => '制造商',
    'markdown'              => '该字段可以使用 <a href="https://help.github.com/articles/github-flavored-markdown/">Github flavored markdown</a>',
    'min_amt'               => 'Min. QTY',
    'min_amt_help'          => '在触发警报之前应该可用的最小物品数。如果您不希望收到低库存的警报,请将最小数量留空。',
    'model_no'              => '型号',
    'months'                => '月数',
    'moreinfo'              => '更多信息',
    'name'                  => '名称',
    'new_password'          => '新密码',
    'next'                  => '下一页',
    'next_audit_date'       => '下一次盘点时间',
    'last_audit'            => '上一次盘点',
    'new'                   => '新!',
    'no_depreciation'       => '永久',
    'no_results'            => '没有结果',
    'no'                    => '否',
    'notes'                 => '备注',
    'order_number'          => '订单号',
    'page_menu'             => '显示菜单项',
    'pagination_info'       => '显示全部',
    'pending'               => '待定',
    'people'                => '组织成员',
    'per_page'              => '每页搜索结果',
    'previous'              => '前一页',
    'processing'            => '处理中',
    'profile'               => '您的个人资料',
    'purchase_cost'                              => '采购价格',
    'purchase_date'         => '购买日期',
    'qty'                   => '数量',
    'quantity'              => '数量',
    'quantity_minimum'      => '您有 :count 件物品低于或即将低于最低数量',
    'quickscan_checkin'     => '快速扫描归还',
    'quickscan_checkin_status'      => '归还状态',
    'ready_to_deploy'       => '待分配',
    'recent_activity'       => '最近操作活动',
    'remaining'             => '剩余',
    'remove_company'        => '移除公司关联',
    'reports'               => '报告',
    'restored'              => '恢复',
    'restore'               => '还原',
    'requestable_models'    => '可申领的型号',
    'requested'             => '已申请',
    'requested_date'        => '申领日期',
    'requested_assets'      => '已申领资产',
    'requested_assets_menu' => '已申领资产',
    'request_canceled'      => '取消请求',
    'save'                  => '保存',
    'select'                => '选择',
    'select_all'            => '全选',
    'search'                => '搜索',
    'select_category'       => '选择一个类别',
    'select_department'     => '选择一个部门',
    'select_depreciation'   => '选择失效类型',
    'select_location'       => '选择地点',
    'select_manufacturer'   => '选择生产商',
    'select_model'          => '选择型号',
    'select_supplier'       => '选择供货商',
    'select_user'           => '选择用户',
    'select_date'           => '选择日期 (YYYY-MM-DD)',
    'select_statuslabel'    => '选择状态',
    'select_company'        => '选择公司',
    'select_asset'          => '选择资产',
    'settings'              => '设置',
    'show_deleted'          => '查看已删除',
    'show_current'          => '查看当前',
    'sign_in'               => '登录',
    'signature'             => '签名',
    'signed_off_by'         => '部门主管签名',
    'skin'                  => '主题',
    'slack_msg_note'        => '将发送一条slack消息',
    'slack_test_msg'        => '哦哈!看起来 Slack 已经成功应用到 Snipe-IT 了!',
    'some_features_disabled' => '演示模式: 此安装将禁用某些功能。',
    'site_name'             => '站点名称',
    'state'                 => '省份',
    'status_labels'         => '状态标签',
    'status'                => '状态',
    'accept_eula'           => '接受协议',
    'supplier'              => '供应商',
    'suppliers'             => '供应商',
    'sure_to_delete'    => '是否确认要删除',
    'submit'                => '提交',
    'target'                => '目标',
    'toggle_navigation'     => 'Toogle 导航',
    'time_and_date_display' => '时间和日期显示',
    'total_assets'          => '共计资产',
    'total_licenses'        => '共计许可证',
    'total_accessories'     => '总配件',
    'total_consumables'     => '总耗材',
    'type'                  => '类型',
    'undeployable'          => '无法被分配',
    'unknown_admin'         => '未知管理员',
    'username_format'       => '用户名格式',
    'username'              => '用户名',
    'update'                => '更新',
    'upload_filetypes_help'      => '允许的文件类型是 png, gif, jpg, jpeg, doc, doc, pdf, xls, xlsx, txt, lic, xml, zip, rtf 和 rar. 允许的最大上传大小是 :size.',
    'uploaded'              => '已上传',
    'user'                  => '用户',
    'accepted'              => '已接受',
    'declined'              => '已拒绝',
    'unaccepted_asset_report' => '未接受的资产',
    'users'                 => '用户',
    'viewall'               => '查看全部',
    'viewassets'            => '查看资产分配',
    'viewassetsfor'         => '查看:name名下资产',
    'website'               => '站点',
    'welcome'               => '欢迎您,:name',
    'years'                 => '年',
    'yes'                   => '是',
    'zip'                   => 'Zip',
    'noimage'               => '图片未上传或图片无法找到。',
    'token_expired'         => '表单会话已过期,请重新提交',
    'login_enabled'         => '登录已启用',
    'audit_due'             => '到期审计',
    'audit_overdue'         => '过期审计',
    'accept'                => '接受 :asset',
    'i_accept'              => '我接受',
    'i_decline'             => '我拒绝',
    'accept_decline'        => '接受/拒绝',
    'sign_tos'              => '请在下面登录以表明您同意服务条款:',
    'clear_signature'       => '清除签名',
    'show_help'             => '显示帮助',
    'hide_help'             => '隐藏帮助',
    'view_all'              => '查看全部',
    'hide_deleted'          => '隐藏已删除',
    'email'                 => '邮箱',
    'do_not_change'         => '不要更改',
    'bug_report'            => '报告错误',
    'user_manual'           => '用户手册',
    'setup_step_1'          => '第 1 步',
    'setup_step_2'          => '第 2 步',
    'setup_step_3'          => '第 3 步',
    'setup_step_4'          => '第 4 步',
    'setup_config_check'    => '配置检查',
    'setup_create_database' => '创建数据库表',
    'setup_create_admin'    => '创建管理员用户',
    'setup_done'            => '完成!',
    'bulk_edit_about_to'    => '您将要编辑以下内容: ',
    'checked_out'           => '已借出',
    'checked_out_to'        => '借出至',
    'fields'                => '字段',
    'last_checkout'         => '上次借出',
    'due_to_checkin'        => '以下:count 件物品将很快归还:',
    'expected_checkin'      => '预计归还日期',
    'reminder_checked_out_items' => '这是当前借出给您的物品的提醒。 如果你觉得这个列表不准确(有些东西缺失,或者你认为你从未收到的东西),请给:reply_to_name发送电子邮件,邮箱地址为::reply_to_address。',
    'changed'               => '已修改',
    'to'                    => '至',
    'report_fields_info'    => '<p>选择您想要在自定义报告中包含的字段,然后单击生成. 该文件(custom-asset-report-YYYY-mm-dd.csv)将自动下载,您可以使用 Excel打开它。</p>
            <p>如果您只想导出某些资产,使用下面的选项来微调您的结果。</p>',
    'range'                 => '范围',
    'bom_remark'            => '向这个CSV文件添加一个BOM(字节顺序标记)',
    'improvements'          => '改进',
    'information'           => '信息',
    'permissions'           => '权限',
    'managed_ldap'          => '(通过 LDAP 管理)',
    'export'                => '导出',
    'ldap_sync'             => 'LDAP 同步',
    'ldap_user_sync'        => 'LDAP 用户同步',
    'synchronize'           => '同步',
    'sync_results'          => '同步结果',
    'license_serial'        => '序列号/产品密钥',
    'invalid_category'      => '无效的类别',
    'dashboard_info'        => '这是您的仪表板。有很多类似的,但这个就是您的。',
    '60_percent_warning'    => '60% 完成 (警告)',
    'dashboard_empty'       => '看起来你还没有添加任何东西,所以我们没有什么东西可以显示。 现在就开始添加一些资产、配件、耗材或许可证吧!',
    'new_asset'             => '新建资产',
    'new_license'           => '新建许可证',
    'new_accessory'         => '新建配件',
    'new_consumable'        => '新建耗材',
    'collapse'              => '收起',
    'assigned'              => '已分配',
    'asset_count'           => '资产计数',
    'accessories_count'     => '配件计数',
    'consumables_count'     => '耗材计数',
    'components_count'      => '组件计数',
    'licenses_count'        => '许可证计数',
    'notification_error'    => '错误:',
    'notification_error_hint' => '请检查下面的表单以了解错误',
    'notification_success'  => '成功:',
    'notification_warning'   => '警告:',
    'notification_info'      => '信息:',
    'asset_information'     => '资产信息',
    'model_name'            => '型号名称:',
    'asset_name'            => '资产名称:',
    'consumable_information' => '耗材信息:',
    'consumable_name'       => '耗材名称:',
    'accessory_information' => '配件信息:',
    'accessory_name'       => '配件名称:',
    'clone_item'            => '克隆物品',
    'checkout_tooltip' => '借出此物品',
    'checkin_tooltip' => '归还此物品',
    'checkout_user_tooltip' => '借出此物品给一个用户',
    'maintenance_mode'      => '该服务暂时无法用于系统更新。请稍后再试。',
    'maintenance_mode_title' => '系统暂时不可用',
    'ldap_import'           => '用户密码不应由LDAP管理。(这允许您发送忘记密码的请求。)',
    'purge_not_allowed'     => '在 .env 文件中已禁用清除已删除数据。 请联系支持人员或您的系统管理员。',
    'backup_delete_not_allowed'     => '.env 文件中已禁用删除备份。 请联系支持人员或您的系统管理员。',
    'additional_files'           => '附加文件',
    'shitty_browser'        => 'No signature detected. If you are using an older browser, please use a more modern browser to complete your asset acceptance.',
];

2、标签文字修改

  默认的标签如下图。网站默认目录下的resources\views\hardware\labels.blade.php文件中可以对标签格式做一些修改。


  比如修改每一行前面的字段名,或是增加一个自己想打印的字段,如下图。增加了财务编号字段。

  具体修改的内容大约在120行左右开始,具体的行数随着Snipe-IT的升级,不同的版本可能会有变化。此处需要了解一点php和html知识,具体不说详述。

3、借出单表格打印宽度调整

  在查看用户界面的右侧,有一个“打印所有已分配资产”,如下图。


  该功能打印借用单供用户签字,如下图。

  上图中有两个问题:
  (1)表格每一行末尾的签名列位置偏小,实际操作中空间不足,导致用户签名无法签下。
  (2)表格下方部门主管签名(原来为管理员签名,后因为在resource\long\zh-cn\general.php中做了修改)竖排,不符合国人阅读及审美习惯。
  可以通过网站目录下的resources\views\users\print.blade.php进行调整。
调整后效果如下图。

resources\views\users\print.blade.php代码如下:

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>{{ trans('general.assigned_to', ['name' => $show_user->present()->fullName()]) }}</title>
    <style>
        body {
            font-family: "Arial, Helvetica", sans-serif;
        }
        table.inventory {
            border: solid #000;
            border-width: 1px 1px 1px 1px;
            width: 100%;
        }

        @page {
            size: A4;
        }
        table.inventory th, table.inventory td {
            border: solid #000;
            border-width: 0 1px 1px 0;
            padding: 3px;
            font-size: 12px;
        }

        .print-logo {
            max-height: 40px;
        }

    </style>
</head>
<body>

@if ($snipeSettings->logo_print_assets=='1')
    @if ($snipeSettings->brand == '3')

        <h2>
            @if ($snipeSettings->logo!='')
                <img class="print-logo" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}">
            @endif
            {{ $snipeSettings->site_name }}
        </h2>
    @elseif ($snipeSettings->brand == '2')
        @if ($snipeSettings->logo!='')
            <img class="print-logo" src="{{ url('/') }}/uploads/{{ $snipeSettings->logo }}">
        @endif
    @else
        <h2>{{ $snipeSettings->site_name }}</h2>
    @endif
@endif

<h2>{{ trans('general.assigned_to', ['name' => $show_user->present()->fullName()]) }}</h4>

    @if ($assets->count() > 0)
        @php
            $counter = 1;
        @endphp
        <table class="inventory">
            <thead>
            <tr>
                <th colspan="8">{{ trans('general.assets') }}</th>
            </tr>
            </thead>
            <thead>
            <tr>
                <th style="width: 20px;"></th>
                <th style="width: 5%;">{{ trans('admin/hardware/table.asset_tag') }}</th>
                <th style="width: 10%;">{{ trans('general.name') }}</th>
                <th style="width: 10%;">{{ trans('general.category') }}</th>
                <th style="width: 30%;">{{ trans('admin/hardware/form.model') }}</th>
                <th style="width: 15%;">{{ trans('admin/hardware/form.serial') }}</th>
                <th style="width: 20%;">{{ trans('admin/hardware/table.checkout_date') }}</th>
                <th data-formatter="imageFormatter" style="width: 30%;">{{ trans('general.signature') }}</th>
            </tr>
            </thead>

            @foreach ($assets as $asset)

                <tr>
                    <td>{{ $counter }}</td>
                    <td>{{ $asset->asset_tag }}</td>
                    <td>{{ $asset->name }}</td>
                    <td>{{ $asset->model->category->name }}</td>
                    <td>{{ $asset->model->name }}</td>
                    <td>{{ $asset->serial }}</td>
                    <td>
                        {{ $asset->last_checkout }}</td>
                    <td>
                        @if (($asset->assetlog->first()) && ($asset->assetlog->first()->accept_signature!=''))
                            <img style="width:auto;height:100px;" src="{{ asset('/') }}display-sig/{{ $asset->assetlog->first()->accept_signature }}">
                        @endif
                    </td>
                </tr>
                @if($settings->show_assigned_assets)
                    @php
                        $assignedCounter = 1;
                    @endphp
                    @foreach ($asset->assignedAssets as $asset)

                        <tr>
                            <td>{{ $counter }}.{{ $assignedCounter }}</td>
                            <td>{{ $asset->asset_tag }}</td>
                            <td>{{ $asset->name }}</td>
                            <td>{{ $asset->model->category->name }}</td>
                            <td>{{ $asset->model->name }}</td>
                            <td>{{ $asset->serial }}</td>
                            <td>{{ $asset->last_checkout }}</td>
                            <td><img style="width:auto;height:100px;" src="{{ asset('/') }}display-sig/{{ $asset->assetlog->first()->accept_signature }}"></td>
                        </tr>
                        @php
                            $assignedCounter++
                        @endphp
                    @endforeach
                @endif
                @php
                    $counter++
                @endphp
            @endforeach
        </table>
    @endif

    @if ($licenses->count() > 0)
        <br><br>
        <table class="inventory">
            <thead>
            <tr>
                <th colspan="4">{{ trans('general.licenses') }}</th>
            </tr>
            </thead>
            <thead>
            <tr>
                <th style="width: 20px;"></th>
                <th style="width: 40%;">{{ trans('general.name') }}</th>
                <th style="width: 50%;">{{ trans('admin/licenses/form.license_key') }}</th>
                <th style="width: 10%;">{{ trans('admin/hardware/table.checkout_date') }}</th>
            </tr>
            </thead>
            @php
                $lcounter = 1;
            @endphp

            @foreach ($licenses as $license)

                <tr>
                    <td>{{ $lcounter }}</td>
                    <td>{{ $license->name }}</td>
                    <td>
                        @can('viewKeys', $license)
                            {{ $license->serial }}
                        @else
                            <i class="fa-lock" aria-hidden="true"></i> {{ str_repeat('x', 15) }}
                        @endcan
                    </td>
                    <td>{{  $license->pivot->created_at }}</td>
                </tr>
                @php
                    $lcounter++
                @endphp
            @endforeach
        </table>
    @endif


    @if ($accessories->count() > 0)
        <br><br>
        <table class="inventory">
            <thead>
            <tr>
                <th colspan="4">{{ trans('general.accessories') }}</th>
            </tr>
            </thead>
            <thead>
            <tr>
                <th style="width: 20px;"></th>
                <th style="width: 40%;">{{ trans('general.name') }}</th>
                <th style="width: 50%;">{{ trans('general.category') }}</th>
                <th style="width: 10%;">{{ trans('admin/hardware/table.checkout_date') }}</th>
            </tr>
            </thead>
            @php
                $acounter = 1;
            @endphp

            @foreach ($accessories as $accessory)
                @if ($accessory)
                    <tr>
                        <td>{{ $acounter }}</td>
                        <td>{{ ($accessory->manufacturer) ? $accessory->manufacturer->name : '' }} {{ $accessory->name }} {{ $accessory->model_number }}</td>
                        <td>{{ $accessory->category->name }}</td>
                        <td>{{ $accessory->pivot->created_at }}</td>
                    </tr>
                    @php
                        $acounter++
                    @endphp
                @endif
            @endforeach
        </table>
    @endif

    @if ($consumables->count() > 0)
        <br><br>
        <table class="inventory">
            <thead>
            <tr>
                <th colspan="4">{{ trans('general.consumables') }}</th>
            </tr>
            </thead>
            <thead>
            <tr>
                <th style="width: 20px;"></th>
                <th style="width: 40%;">{{ trans('general.name') }}</th>
                <th style="width: 50%;">{{ trans('general.category') }}</th>
                <th style="width: 10%;">{{ trans('admin/hardware/table.checkout_date') }}</th>
            </tr>
            </thead>
            @php
                $ccounter = 1;
            @endphp

            @foreach ($consumables as $consumable)
                @if ($consumable)
                    <tr>
                        <td>{{ $ccounter }}</td>


                        <td>
                        @if ($consumable->deleted_at!='')
                            <td>{{ ($consumable->manufacturer) ? $consumable->manufacturer->name : '' }}  {{ $consumable->name }} {{ $consumable->model_number }}</td>
                            @else
                            {{ ($consumable->manufacturer) ? $consumable->manufacturer->name : '' }}  {{ $consumable->name }} {{ $consumable->model_number }}
                            @endif
                            </td>
                            <td>{{ ($consumable->category) ? $consumable->category->name : ' invalid/deleted category' }} </td>
                            <td>{{  $consumable->pivot->created_at }}</td>
                    </tr>
                    @php
                        $ccounter++
                    @endphp
                @endif
            @endforeach
        </table>
    @endif

    <br>
    <br>
    <br>
    <table>
        <tr>
            <td style="width: 15%;">{{ trans('general.signed_off_by') }}:</td>
            <td style="width: 30px;">________________________</td>
            <td style="width: 18%;"></td>
            <td style="width: 7%;">{{ trans('general.date') }}:</td>
            <td style="width: 30%;">_________________________</td>
        </tr>
    </table>

</body>
</html>

  稍微有点html基础的,看起来应该不困难,此处不详述了。

九、参考资料

  CentOS7结合宝塔面板安装/升级IT资产管理系统Snipe-IT

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容