魔趣吧官方商城
广告招商,需要请点击
点击投放广告
完全免费的字体下载网站
魔趣吧站长

[DiscuzQ资源] Discuz!Q 首版本安装教程文档

[复制链接]
查看: 82|回复: 0
发表于 2020-3-12 16:12:41 | 显示全部楼层 |阅读模式
安装方法
$ b, M3 `5 m# P; J# a服务器环境为: PHP 7.2+ 和 MySQL 5.6+, 并且需要安装 Composer。Composer加速,可配置腾讯云镜像; D) y& U% \' ^# X(ww w.m oq u8.c om)
# \! w0 Q7 g1 O# W1 ~$ U! m" z(w w w.m oqu 8.c om)
背景故事
Discuz! Q项目由于是从 0 到 1,介于我们的目标,如果从第一行代码开始编写,是极为庞大的工程。想想Discuz!X,代码量依赖 10 多年的时间的积累,才完善出各种工具类、自己的框架及插件机制等。
在此背景下,我们必须借助开源的力量,才得以快速构建出Discuz! Q。以下是整个Discuz! Q中所用到的技术栈,在此特别感谢他们
安装服务器要求
Discuz! Q 对系统有一些要求,请确保你的服务器满足以下要求:

    % l9 B" m$ ]: b4 T( M! n
  • PHP >= 7.2.0
    : G+ h* z" F5 C; c/ f. b
  • BCMath PHP 拓展
    ' C8 t% {* I6 r  o& @/ H7 u
  • Ctype PHP 拓展
    0 a3 J9 w8 z) T& _/ K8 `
  • JSON PHP 拓展: g0 P! w* M  J* p7 |(w ww.m oqu8.c o  m)
  • Mbstring PHP 拓展4 D5 c7 v# l0 m4 f0 W(ww w.m oq u8.c om)
  • OpenSSL PHP 拓展" [- h) P! @/ r9 G(www.m oqu8.c om)
  • PDO PHP 拓展
    8 v2 U3 c7 P% G4 C+ u! c* Z! B# J
  • Tokenizer PHP 拓展
    ! [7 l$ m; V- ]3 h  X# s
  • XML PHP 拓展
    8 A% \# f+ t4 f" V
安装 Discuz! Q
7 `& h- P  `. ]8 k2 {- I. `! ?. `+ l
. u6 L4 T4 Y  J+ f4 F) YDiscuz! Q 使用 Composer 来管理项目依赖。因此,在使用 Discuz! Q 之前,请确保你的机器已经安装了 Composer。. w9 _% B5 u: ?! g9 G; B7 E(w w w.m oq u8.c om)
通过站点启动安装
首先,部署好服务器环境:
然后打开 http://{您的域名}/install 进入安装界面,按照页面提示进行安装。

3 M0 I* ]% i1 n配置公共路径
安装完 Discuz! Q 之后,你应该配置你的 web 服务的文档目录指向 public 路径。该路径下的 index.php 文件作为所有接口控制器, index.html 作为所有前端 HTTP 请求控制器。

& d+ F4 O* |. |7 m配置文件
Discuz! Q 的所有配置文件存放在 config 目录下。每个选项都有文档标注,便于通过文件查看并熟悉对你有用的选项。
目录权限
在安装 Discuz! Q 后,你可能需要配置一些权限。 storage 目录在你的 web 服务下应该是可写的权限,否则 Discuz! Q 将无法运行。
应用密钥
安装好 Discuz! Q 之后的下一步是设置你的应用密钥为随机字符串。如果你通过 Composer 或者 Discuz! Q 安装器安装的,这个密钥已经通过 php disco key:generate 命令为你设置好了。
通常,这个字符串应该是 32 个字符长度。这个密钥将会设置在 config.php 文件中。如果应用密钥还没有设置,你的用户会话和其他的加密数据将会不安全
其他配置
Discuz! Q 几乎不需要除上面所说的其他什么配置了。打开你的站点开始你建站之旅然而,你可能会想要再次查看 config/config.php 文件和它的注释说明。它包含一些你希望根据你应用来更改的选项,诸如: timezone 和 locale 。
* P) E/ }& N& T& T( F* l(w w w.m oqu 8.c om)
Web 服务器配置优雅链接Apache
Discuz! Q 中包含了一个 public/.htaccess 文件,通常用于在资源路径中隐藏 index.php 的前端控制器。在用 Apache 为 Discuz! Q 提供服务之前,确保启用了 mod_rewrite 模块,这样 .htaccess 文件才能被服务器解析。
如果 Discuz! Q 附带的 .htaccess 文件不起作用,尝试下面的方法替代:
  1. Options +FollowSymLinks -Indexes
  2. RewriteEngine On
  3. RewriteCond %{HTTP:Authorization} .
  4. RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
  5. RewriteCond %{REQUEST_FILENAME} !-d
  6. RewriteCond %{REQUEST_FILENAME} !-f
  7. RewriteRule ^ index.php [L]
复制代码

% T8 h7 L* A% O( o. ]' Y% A3 G复制代码
8 |- [% v9 @& ?% h# S6 C2 E(ww  w.m oqu  8.c om)
Nginx
如果你使用 Nginx ,在你的站点配置中加入以下配置,建义开启 https 和 http2 ,所有的请求将会引导至 index.html 前端控制器和后端 index.php API控制器:
  1. listen 443 ssl http2;
  2. server_name www.xxx.com;
  3. root /home/wwww;
  4. ssl_certificate /xxx/server.crt;
  5. ssl_certificate_key /xxx/server.key;
  6. ssl_session_cache shared:SSL:1m;
  7. ssl_session_timeout  5m;
  8. ssl_prefer_server_ciphers   on;
  9. ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256::!MD5;
  10. ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
  11. add_header Strict-Transport-Security "max-age=31536000";
  12. add_header X-Frame-Options "SAMEORIGIN";
  13. add_header X-XSS-Protection "1; mode=block";
  14. add_header X-Content-Type-Options "nosniff";
  15. index index.html;
  16. location /install {
  17.         try_files $uri $uri/ /index.php?$query_string;
  18. }
  19. location /api {
  20.     try_files $uri $uri/ /index.php?$query_string;
  21. }
  22. location / {
  23.     try_files $uri $uri/ /index.html;
  24. }
  25. location = /favicon.ico { access_log off; log_not_found off; }
  26. location = /robots.txt  { access_log off; log_not_found off; }
  27. error_page 404 /index.php;
复制代码
8 F+ t: B# _3 `6 `7 V& |(ww w.m oq u8.c om)
配置信息
2 A0 P; i- u* ?! C* c. I# r
& V8 e" r" \/ S3 n
  1. <?php
  2. return [
  3.     'debug' => true,
  4.     'locale' => 'zh-CN',
  5.     'fallback_locale' => 'zh-CN',
  6.     'timezone' => 'Asia/Shanghai',
  7.     'key' => 'base64:JtNRiS14Mopb+HNi3ztxi6259im9DTDBJXOzLDbcquw=',
  8.     'cipher' => 'AES-256-CBC',
  9.     'site_url' => 'DummySiteUrl',
  10.     'database' =>
  11.         [
  12.             'driver' => 'mysql',
  13.             'host' => 'DummyDbHost',
  14.             'port' => 'DummyDbPort',
  15.             'database' => 'DummyDbDatabase',
  16.             'username' => 'DummyDbUsername',
  17.             'password' => 'DummyDbPassword',
  18.             'charset' => 'utf8mb4',
  19.             'collation' => 'utf8mb4_unicode_ci',
  20.             'prefix' => 'DummyDbPrefix',
  21.             'prefix_indexes' => true,
  22.             'strict' => true,
  23.             'options' => extension_loaded('pdo_mysql') ? array_filter([
  24.                 PDO::MYSQL_ATTR_SSL_CA => '',
  25.             ]) : [],
  26.         ],
  27.     'redis' => [
  28.         'client' => 'phpredis',
  29.         'options' => [
  30.             'cluster' => 'redis',
  31.             'prefix' => Str::slug('discuz', '_').'_database_'
  32.         ],
  33.         'default' => [
  34.             'url' => '',
  35.             'host' => '127.0.0.1',
  36.             'password' => '123',
  37.             'port' => 6379,
  38.             'database' => 0
  39.         ],
  40.         'cache' => [
  41.             'url' => '',
  42.             'host' => '127.0.0.1',
  43.             'password' => '123',
  44.             'port' => 6379,
  45.             'database' => 1
  46.         ],
  47.     ],
  48.     //缓存系统配置
  49.     'cache' => [
  50.         'default' => 'file', //如果配置的 redis 可用, 会自动切换为redis
  51.         'stores' => [
  52.             'file' => [
  53.                 'driver' => 'file',
  54.                 'path' => storage_path('cache/data'),
  55.             ],
  56.             'redis' => [
  57.                 'driver' => 'redis',
  58.                 'connection' => 'cache',
  59.             ],
  60.         ],
  61.         'prefix' => 'discuz_cache',
  62.     ],
  63.     //文件系统配置
  64.     'filesystems' => [
  65.         'default' => 'local',
  66.         'cloud' => '',
  67.         'disks' => [
  68.             'local' => [
  69.                 'driver' => 'local',
  70.                 'root' => storage_path('app'),
  71.             ],
  72.             'public' => [
  73.                 'driver' => 'local',
  74.                 'root' => storage_path('app/public'),
  75.                 'url' => 'public',
  76.                 'visibility' => 'public',
  77.             ],
  78.             'avatar' => [
  79.                 'driver' => 'local',
  80.                 'root' => storage_path('app/public/avatars'),
  81.                 'url' => 'avatar',
  82.                 'visibility' => 'public',
  83.             ],
  84.             'attachment' => [
  85.                 'driver' => 'local',
  86.                 'root'   => storage_path('app/public/attachment'),
  87.                 'url'    => 'attachment'
  88.             ],
  89.             'cos' => [
  90.                 'driver' => 'cos',
  91.                 'region' => 'ap-beijing', //设置一个默认的存储桶地域
  92.                 'schema' => 'https', //协议头部,默认为http
  93.                 'bucket' => 'test-1251011534',
  94.                 'read_from_cdn' => false, //是否从cdn读取,如果为true , 设置cdn地址
  95.                 'credentials'=> [
  96.                     'secretId'  => 'COS_SECRETID',  //"云 API 密钥 SecretId";
  97.                     'secretKey' => 'COS_SECRETKEY', //"云 API 密钥 SecretKey";
  98.                     'token' => 'token' //"临时密钥 token";
  99.                 ]
  100.             ]
  101.         ]
  102.     ],
  103.     'queue' => [
  104.         'default' => 'redis',
  105.         'connections' => [
  106.             'redis' => [
  107.                 'driver' => 'redis',
  108.                 'connection' => 'default',
  109.                 'queue' => 'REDIS_QUEUE',
  110.                 'retry_after' => 90,
  111.                 'block_for' => null,
  112.             ]
  113.         ]
  114.     ],
  115.     'excel' => [
  116.         'root' => storage_path('public/exports')
  117.     ],
  118.     //加载ServiceProvider
  119.     'providers' => [
  120.         App\Formatter\FormatterServiceProvider::class,
  121.         App\Providers\EventServiceProvider::class,
  122.         App\Providers\SettingsServiceProvider::class,
  123.         App\Providers\CategoryServiceProvider::class,
  124.         App\Providers\UserServiceProvider::class,
  125.         App\Providers\ThreadServiceProvider::class,
  126.         App\Providers\PostServiceProvider::class,
  127.         App\Providers\OrderServiceProvider::class,
  128.         App\Providers\UserWalletLogsServiceProvider::class,
  129.         App\Providers\UserWalletCashServiceProvider::class,
  130.         App\Providers\UserWalletServiceProvider::class,
  131.     ],
  132.     'sms' => [
  133.         // HTTP 请求的超时时间(秒)
  134.         'timeout' => 5.0,
  135.         // 默认发送配置
  136.         'default' => [
  137.             // 网关调用策略,默认:顺序调用
  138.             'strategy' => Overtrue\EasySms\Strategies\OrderStrategy::class,
  139.             // 默认可用的发送网关
  140.             'gateways' => [
  141.                 'qcloud'
  142.             ],
  143.         ],
  144.         // 可用的网关配置
  145.         'gateways' => [
  146.             'errorlog' => [
  147.                 'file' => storage_path('log/easy-sms.log')
  148.             ],
  149.             'qcloud' => [
  150.                 'sdk_app_id' => 'xxx', // SDK APP ID
  151.                 'app_key' => 'xxxx', // APP KEY
  152.                 'sign_name' => 'xxx', // 短信签名,如果使用默认签名,该字段可缺省(对应官方文档中的sign)
  153.             ],
  154.         ],
  155.     ]
  156. ];
复制代码
API 说明* ]* K# J) a8 H* r7 Z(w ww.m oqu8.c o  m)
jsonapi.orgDiscuz! Q 使用的是 jsonapi.org 定义的格式,使用 tobscure/json-api 包的实现。
! E0 ]% F( I, i7 C) K7 m4 d* t路由分别对应
    6 N! _' I* |3 G(w ww.m oqu8.c o  m)
  • 以psr-2基础命名规则外,下面为实践中相关命名规则
    4 @5 I/ ?* `% q7 t) h$ T
  • 以user为例, 路由和路由名称为小写复数按功能以.分开
    9 W# Q- X2 ]" ?
  • 控制器按功能,列表为复数,其它单条担任可为单数驼峰命名4 r) z- ~9 S1 c(w w w.m oqu 8.c om)
  • 序列化模型名为单数驼峰命名, n( z7 t! Z( p; s3 W; y0 Z(w ww.m oqu8.c om)
  • 数据库模型以单数驼峰命名
    ' U8 k, P8 g# L
  • 表名以复数命名/ \1 k0 M1 X; \# _# V(ww w.m oq u8.c om)
下面为具体增删改查路由例子:

) S# j, y, J* T
  1. $route->get('/users', 'users.index', ListUsersController::class);
  2. $route->get('/users/{id}', 'users.resource', ResourceUserController::class);
  3. $route->post('/users', 'users.create', CreateUserController::class);
  4. $route->patch('/users/{id}', 'users.update', UpdateUserController::class);
  5. $route->delete('/users/{id}', 'users.delete', DeleteUserController::class);
复制代码
列表数据
继承 Discuz\Api\Controller\AbstractListController 需要指定 $serializer 要用于序列化模型的 data 方法,并实现返回模型集合的方法。该 data 方法接收 Request 对象和 tobscure/json-api Document。

. D  T, L" T4 I! T
  1. class ListUsersController extends AbstractListController
  2. {
  3.     public $serializer = UserSerializer::class;
  4.     public function data(ServerRequestInterface $request, Document $document)
  5.     {
  6.         return User::all();
  7.     }
  8. }
复制代码

8 ]8 b5 {' T5 O1 j/ d/ d  J单条数据
同列表数据一样继承 Discuz\Api\Controller\AbstractResourceController 并实现相关属性和方法,接收参数一样

* w- r* v0 F* d* r9 M0 P
  1. class ResourceUserController extends AbstractResourceController
  2. {
  3.     public $serializer = UserSerializer::class;
  4.     public function data(ServerRequestInterface $request, Document $document)
  5.     {
  6.         $body = $request->getQueryParams();
  7.         $id = $body->get('id');
  8.         return User::findOrFail($id);
  9.     }
  10. }
复制代码
创建数据
继承 Discuz\Api\Controller\AbstractCreateController。这与单条数据相同,但响应状态代码将自动设置为 201 Created。您可以通过以下方式访问传入的 JSON:API POST传过来的数据可通过 $request->getParsedBody() 来取到 json 数组,并通过 Laravel Arr 类来获取数组相关信息
  1. class CreateUserController extends AbstractCreateController
  2. {
  3.     public $serializer = UserSerializer::class;
  4.     public function data(ServerRequestInterface $request, Document $document)
  5.     {
  6.         $attributes = Arr::get($request->getParsedBody(), 'data.attributes');
  7.         return User::create([
  8.             'name' => Arr::get($attributes, 'name')
  9.         ]);
  10.     }
  11. }
复制代码
更新数据
继承 Discuz\Api\Controller\AbstractResourceController 同单条数据一样,现相关属性和方法,接收参数一样,返回相关数据,获取同创建数据一样
  1. class UpdateUserController extends AbstractCreateController
  2. {
  3.     public $serializer = UserSerializer::class;
  4.     public function data(ServerRequestInterface $request, Document $document)
  5.     {
  6.         $attributes = Arr::get($request->getParsedBody(), 'data.attributes', []);
  7.         $body = $request->getQueryParams();
  8.         $attributes = $body->get('id');
  9.         $user = User::findOrFail($id);
  10.         $user->name = $attributes['name'];
  11.         $user->save();
  12.         return $user;
  13.     }
  14. }
复制代码
删除数据
继承 Discuz\Api\Controller\AbstractDeleteController 实现delete 方法,该方法接收 Request,默认返回空 204 No Content 响应。
  1. class DeleteUserController extends AbstractDeleteController
  2.     public function delete(ServerRequestInterface $request)
  3.     {
  4.         $id = Arr::get($request->getQueryParams(), 'id');
  5.         User::findOrFail($id)->delete();
  6.     }
  7. }
复制代码
& [5 G* ]1 |% L( t5 }6 O8 {(w w w.m oqu 8.c om)
序列化模型说明
继承 Discuz\Api\Serializer\AbstractSerializer 实现 getDefaultAttributes 方法,该方法接收数据库模型,写好 type 属性
  1. class UserSerializer extends AbstractSerializer
  2. {
  3.     protected $type = 'user';
  4.     public function getDefaultAttributes($model)
  5.     {
  6.         return [
  7.             'id' => $model->id,
  8.             'username' => $model->username,
  9.             'email' => $model->email
  10.         ];
  11.     }
  12. }
复制代码

# \8 W" {9 g  s% ^
) R+ I& {4 @' o6 [5 c; [自定义返回类型
实现接口 Psr\Http\Server\RequestHandlerInterface
* u/ x  s) q$ f: ]. H(ww  w.m oqu  8.c om)
  1. <?php
  2. namespace Discuz\Api\Controller;
  3. use Psr\Http\Server\RequestHandlerInterface;
  4. class AbstractSerializeController implements RequestHandlerInterface
  5. {
  6.     public function handle(ServerRequestInterface $request): ResponseInterface
  7.     {
  8.         return new HtmlResponse();
  9.     }
  10. }
复制代码

魔趣吧版权声明1,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2,本文内容仅代表作者本人观点,不代表本网站立场,作者文责自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3,本文内容,包括但不限于源码、文字、图片等,仅供参考使用,本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容
4,如您认为本文内容侵犯了您的权益,请与我们联系!我们将在5个工作日内做出处理!本站保留全部修改、解释、更新本声明的权利魔趣吧

魔趣吧,全网领先的建站资源下载基地!Discuz模板、Discuz插件、素材、特效,源码,建站,就上魔趣吧!!
魔趣吧唯一官方网站:https://www.moqu8.com,唯一官方客服QQ:1218894030,请谨防假冒网站和骗子冒充本站!
回复

使用道具 举报/反馈

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表
魔趣吧在线客服
关闭
欢迎来到魔趣吧
如果你有建站技术问题、仿站需求、模板插件修改需求,请联系我们的技术支持!高效率,低价格的帮你搞定!
请认准魔趣吧唯一官网:www.moqu8.com,谨防假冒网站!
建站技术支持(收费)
资源互换/合作
魔趣吧在线客服
抗击疫情,魔趣吧VIP限时大降价X

抗击疫情,魔趣吧VIP限时大降价

抗击疫情,助力站长!魔趣吧VIP限时大降价,限时活动,不容错过!...

立即抢福利!
魔趣吧
做感动人心的好资源站

关于魔趣吧|魔趣建站

魔趣吧,志在打造全国最大的建站资源共享平台。 本站提供海量免费的建站资源,包括WordPress模板、Discuz精仿模板、PHPWind模板、phpcms模板、Discuz精仿插件、帝国cms模板、织梦模板等上万精品模板!同时,提供各种建站素材、JS特效、整站程序源码!
服务中文站长,传播分享精神!建站,就来魔趣吧!!
2015-2020  支持:魔趣吧 ( 豫ICP备15026783号-4 )  
HTTPS安全认证
|网站地图 已运行天