diff --git a/basic/.gitignore b/basic/.gitignore index 28419e445d2c858b27cc9bf8e58769b14307ac4e..f599776ef928188588a314a8061a45b0e45da4b8 100644 --- a/basic/.gitignore +++ b/basic/.gitignore @@ -33,4 +33,5 @@ tests/_output/* tests/_support/_generated #vagrant folder -/.vagrant \ No newline at end of file +/.vagrant +/web/uploads diff --git a/basic/README.md b/basic/README.md index b93a740e6857fa1957202f0e144bd1ccc881f790..a5937e88dc906d48e5d24635e0d871bd3c66ed64 100644 --- a/basic/README.md +++ b/basic/README.md @@ -1,233 +1,17 @@ -

- - - -

Yii 2 Basic Project Template

-
-

+Необходима база данных, в mysql с названием yii2basic +Также нужен pdo_mysql -Yii 2 Basic Project Template is a skeleton [Yii 2](http://www.yiiframework.com/) application best for -rapidly creating small projects. +Применение миграций +php yii migrate -The template contains the basic features including user login/logout and a contact page. -It includes all commonly used configurations that would allow you to focus on adding new -features to your application. +Запуск +php yii serve --port=8088 -[![Latest Stable Version](https://img.shields.io/packagist/v/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic) -[![Total Downloads](https://img.shields.io/packagist/dt/yiisoft/yii2-app-basic.svg)](https://packagist.org/packages/yiisoft/yii2-app-basic) -[![build](https://github.com/yiisoft/yii2-app-basic/workflows/build/badge.svg)](https://github.com/yiisoft/yii2-app-basic/actions?query=workflow%3Abuild) +Команды Api: + /api/total + /api/view?id=[id картинки] + /api/list?page=[номер страницы] //1 страница содержит информацию 10 картинок -DIRECTORY STRUCTURE -------------------- - - assets/ contains assets definition - commands/ contains console commands (controllers) - config/ contains application configurations - controllers/ contains Web controller classes - mail/ contains view files for e-mails - models/ contains model classes - runtime/ contains files generated during runtime - tests/ contains various tests for the basic application - vendor/ contains dependent 3rd-party packages - views/ contains view files for the Web application - web/ contains the entry script and Web resources - - - -REQUIREMENTS ------------- - -The minimum requirement by this project template that your Web server supports PHP 7.4. - - -INSTALLATION ------------- - -### Install via Composer - -If you do not have [Composer](http://getcomposer.org/), you may install it by following the instructions -at [getcomposer.org](http://getcomposer.org/doc/00-intro.md#installation-nix). - -You can then install this project template using the following command: - -~~~ -composer create-project --prefer-dist yiisoft/yii2-app-basic basic -~~~ - -Now you should be able to access the application through the following URL, assuming `basic` is the directory -directly under the Web root. - -~~~ -http://localhost/basic/web/ -~~~ - -### Install from an Archive File - -Extract the archive file downloaded from [yiiframework.com](http://www.yiiframework.com/download/) to -a directory named `basic` that is directly under the Web root. - -Set cookie validation key in `config/web.php` file to some random secret string: - -```php -'request' => [ - // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation - 'cookieValidationKey' => '', -], -``` - -You can then access the application through the following URL: - -~~~ -http://localhost/basic/web/ -~~~ - - -### Install with Docker - -Update your vendor packages - - docker-compose run --rm php composer update --prefer-dist - -Run the installation triggers (creating cookie validation code) - - docker-compose run --rm php composer install - -Start the container - - docker-compose up -d - -You can then access the application through the following URL: - - http://127.0.0.1:8000 - -**NOTES:** -- Minimum required Docker engine version `17.04` for development (see [Performance tuning for volume mounts](https://docs.docker.com/docker-for-mac/osxfs-caching/)) -- The default configuration uses a host-volume in your home directory `.docker-composer` for composer caches - - -CONFIGURATION -------------- - -### Database - -Edit the file `config/db.php` with real data, for example: - -```php -return [ - 'class' => 'yii\db\Connection', - 'dsn' => 'mysql:host=localhost;dbname=yii2basic', - 'username' => 'root', - 'password' => '1234', - 'charset' => 'utf8', -]; -``` - -**NOTES:** -- Yii won't create the database for you, this has to be done manually before you can access it. -- Check and edit the other files in the `config/` directory to customize your application as required. -- Refer to the README in the `tests` directory for information specific to basic application tests. - - -TESTING -------- - -Tests are located in `tests` directory. They are developed with [Codeception PHP Testing Framework](http://codeception.com/). -By default, there are 3 test suites: - -- `unit` -- `functional` -- `acceptance` - -Tests can be executed by running - -``` -vendor/bin/codecept run -``` - -The command above will execute unit and functional tests. Unit tests are testing the system components, while functional -tests are for testing user interaction. Acceptance tests are disabled by default as they require additional setup since -they perform testing in real browser. - - -### Running acceptance tests - -To execute acceptance tests do the following: - -1. Rename `tests/acceptance.suite.yml.example` to `tests/acceptance.suite.yml` to enable suite configuration - -2. Replace `codeception/base` package in `composer.json` with `codeception/codeception` to install full-featured - version of Codeception - -3. Update dependencies with Composer - - ``` - composer update - ``` - -4. Download [Selenium Server](http://www.seleniumhq.org/download/) and launch it: - - ``` - java -jar ~/selenium-server-standalone-x.xx.x.jar - ``` - - In case of using Selenium Server 3.0 with Firefox browser since v48 or Google Chrome since v53 you must download [GeckoDriver](https://github.com/mozilla/geckodriver/releases) or [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver/downloads) and launch Selenium with it: - - ``` - # for Firefox - java -jar -Dwebdriver.gecko.driver=~/geckodriver ~/selenium-server-standalone-3.xx.x.jar - - # for Google Chrome - java -jar -Dwebdriver.chrome.driver=~/chromedriver ~/selenium-server-standalone-3.xx.x.jar - ``` - - As an alternative way you can use already configured Docker container with older versions of Selenium and Firefox: - - ``` - docker run --net=host selenium/standalone-firefox:2.53.0 - ``` - -5. (Optional) Create `yii2basic_test` database and update it by applying migrations if you have them. - - ``` - tests/bin/yii migrate - ``` - - The database configuration can be found at `config/test_db.php`. - - -6. Start web server: - - ``` - tests/bin/yii serve - ``` - -7. Now you can run all available tests - - ``` - # run all available tests - vendor/bin/codecept run - - # run acceptance tests - vendor/bin/codecept run acceptance - - # run only unit and functional tests - vendor/bin/codecept run unit,functional - ``` - -### Code coverage support - -By default, code coverage is disabled in `codeception.yml` configuration file, you should uncomment needed rows to be able -to collect code coverage. You can run your tests and collect coverage with the following command: - -``` -#collect coverage for all tests -vendor/bin/codecept run --coverage --coverage-html --coverage-xml - -#collect coverage only for unit tests -vendor/bin/codecept run unit --coverage --coverage-html --coverage-xml - -#collect coverage for unit and functional tests -vendor/bin/codecept run functional,unit --coverage --coverage-html --coverage-xml -``` - -You can see code coverage output under the `tests/_output` directory. +Страницы: + /file/upload - загрузка картинок + /file/index - список картинок diff --git a/basic/config/db.php b/basic/config/db.php index bc75e616f39a3841d11f193a9f86f17c6eea5088..3e7f9aae4ded37f0e7d72c6b70ca7f148716e30e 100644 --- a/basic/config/db.php +++ b/basic/config/db.php @@ -4,7 +4,7 @@ return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', - 'password' => '', + 'password' => 'admin123', 'charset' => 'utf8', // Schema cache options (for production environment) diff --git a/basic/config/web.php b/basic/config/web.php index 632ef20ccbaa350c3e053e7dc4d82d60adb7bebd..124e70fdec8ed742bd87e8554771c5629bab685c 100644 --- a/basic/config/web.php +++ b/basic/config/web.php @@ -13,8 +13,10 @@ $config = [ ], 'components' => [ 'request' => [ - // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation 'cookieValidationKey' => 'OsrMbvjpP9SCngWzSP4-2HnMMSFODuBl', + 'parsers' => [ + 'application/json' => 'yii\web\JsonParser', + ] ], 'cache' => [ 'class' => 'yii\caching\FileCache', @@ -42,14 +44,19 @@ $config = [ ], ], 'db' => $db, - /* 'urlManager' => [ 'enablePrettyUrl' => true, + 'enableStrictParsing' => false, 'showScriptName' => false, 'rules' => [ + ['class' => 'yii\rest\UrlRule', 'controller' => 'api'], ], + ] + ], + 'controllerMap' => [ + 'api' => [ + 'class' => 'app\controllers\ApiController', ], - */ ], 'params' => $params, ]; diff --git a/basic/controllers/ApiController.php b/basic/controllers/ApiController.php new file mode 100644 index 0000000000000000000000000000000000000000..3226fdd7c37688355e0f503f8bb529ccb3a08f45 --- /dev/null +++ b/basic/controllers/ApiController.php @@ -0,0 +1,55 @@ +count(); + return ['total' => $count]; + } + + public function actionList($page = 1) + { + $limit = 10; + $offset = ($page - 1) * $limit; + + $images = Image::find() + ->orderBy(['created_at' => SORT_DESC]) + ->limit($limit) + ->offset($offset) + ->all(); + + $list = []; + foreach ($images as $image) { + $list[] = [ + 'id' => $image->id, + 'path' => 'uploads/' . $image->filename, + ]; + } + + return ['page' => $page, 'list' => $list]; + } + + public function actionView($id) + { + $image = Image::findOne($id); + if ($image) { + return ['id' => $image->id, 'path' => $image->filename]; + } else { + return ['error' => 'Изображение не найдено.']; + } + } +} \ No newline at end of file diff --git a/basic/controllers/FileController.php b/basic/controllers/FileController.php new file mode 100644 index 0000000000000000000000000000000000000000..a771de92ce2273655888234d698193bac3c4e1d6 --- /dev/null +++ b/basic/controllers/FileController.php @@ -0,0 +1,55 @@ + $query, + 'pagination' => [ + 'pageSize' => 10, + ], + 'sort' => [ + 'defaultOrder' => [ + 'id' => SORT_ASC, + ] + ], + ]); + + return $this->render('index', ['dataProvider' => $dataProvider]); + } + + public function actionView($id) + { + $image = Image::findOne($id); + if (!$image) { + throw new NotFoundHttpException('The requested page does not exist.'); + } + + return $this->render('view', ['src' => '/uploads/' . $image->filename]); + } + + public function actionUpload() + { + $model = new UploadForm(); + if (Yii::$app->request->isPost) { + $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles'); + if ($model->upload()) { + Yii::$app->getSession()->setFlash('success', 'Изображения загружены!'); + return $this->redirect(['upload']); + } + } + return $this->render('upload', ['model' => $model]); + } +} \ No newline at end of file diff --git a/basic/controllers/SiteController.php b/basic/controllers/SiteController.php index 67c3f50f88ec42d301a2da2509032eec6cc62cc6..b9d982fe6586908c1414b494dd988fba02ce3b0b 100644 --- a/basic/controllers/SiteController.php +++ b/basic/controllers/SiteController.php @@ -61,7 +61,7 @@ class SiteController extends Controller */ public function actionIndex() { - return $this->render('index'); + return $this->redirect('file/upload/'); } /** diff --git a/basic/migrations/m230328_011637_create_image_table.php b/basic/migrations/m230328_011637_create_image_table.php new file mode 100644 index 0000000000000000000000000000000000000000..27295df0f23b42a000ad8fec28d62e6b1c0eed88 --- /dev/null +++ b/basic/migrations/m230328_011637_create_image_table.php @@ -0,0 +1,29 @@ +createTable('image', [ + 'id' => $this->primaryKey(), + 'filename' => $this->string(255)->notNull(), + 'created_at' => $this->dateTime()->notNull(), + ]); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + $this->dropTable('image'); + } +} diff --git a/basic/models/Image.php b/basic/models/Image.php new file mode 100644 index 0000000000000000000000000000000000000000..6b55c9d9d77f4795ae2b1fb26bdf72f3bfd10384 --- /dev/null +++ b/basic/models/Image.php @@ -0,0 +1,16 @@ +filename; + } +} \ No newline at end of file diff --git a/basic/models/UploadForm.php b/basic/models/UploadForm.php new file mode 100644 index 0000000000000000000000000000000000000000..f23a45eef7fecce421e1f928af9b18feeedf9bc6 --- /dev/null +++ b/basic/models/UploadForm.php @@ -0,0 +1,50 @@ + false, 'extensions' => 'png, jpg, jpeg, gif', 'maxFiles' => 5], + ]; + } + + public function upload() + { + if ($this->validate()) { + foreach ($this->imageFiles as $file) { + $fileName = strtolower(Inflector::transliterate($file->baseName)); + $filePath = 'uploads/' . $fileName . '.' . $file->extension; + if (!file_exists("uploads/")){ + mkdir("uploads/", 0777); + } + $counter = 0; + while (file_exists($filePath)){ + $counter++; + $fileName = $fileName . 'uniq' . $counter; + $filePath = 'uploads/' . $fileName . '.' . $file->extension; + } + $file->saveAs($filePath); + $model = new Image(); + $model->filename = $fileName . '.' . $file->extension; + $model->created_at = date('Y-m-d H:i:s'); + $model->save(); + } + return true; + } else { + return false; + } + } + +} diff --git a/basic/views/file/index.php b/basic/views/file/index.php new file mode 100644 index 0000000000000000000000000000000000000000..e3e894f2da56f0d6630be360e6c06375119a944a --- /dev/null +++ b/basic/views/file/index.php @@ -0,0 +1,37 @@ +title = 'PicHost view'; +?> +
+ $dataProvider, + 'columns' => [ + ['class' => 'yii\grid\SerialColumn'], + + 'filename', + 'created_at:datetime', + [ + 'attribute' => 'Preview', + 'format' => 'html', + 'value' => function ($model) { + return Html::img(Yii::getAlias('@web/uploads/' . $model->filename), ['width' => '100']); + }, + ], + [ + 'class' => 'yii\grid\ActionColumn', + 'template' => '{view}', + 'buttons' => [ + 'view' => function ($url, $model) { + return Html::a('View', ['view', 'id' => $model->id], ['class' => 'btn btn-primary']); + }, + ], + ], + ], + ]) ?> +
diff --git a/basic/views/file/upload.php b/basic/views/file/upload.php new file mode 100644 index 0000000000000000000000000000000000000000..6ca7cfb8d5282986839d2765aa4d1b50eebee0ea --- /dev/null +++ b/basic/views/file/upload.php @@ -0,0 +1,19 @@ +title = 'PicHost'; +?> +
+ ['enctype' => 'multipart/form-data']]) ?> +

Загрузите файлы

+ session->hasFlash('success') ?> +
+ field($model, 'imageFiles[]')->fileInput(['class' => "form-control py-6", 'multiple' => true, 'accept' => 'image/*']) ?> + +
+ +
diff --git a/basic/views/file/view.php b/basic/views/file/view.php new file mode 100644 index 0000000000000000000000000000000000000000..c7d4a2509c79707bba1dbd72f1c6767f9d94484e --- /dev/null +++ b/basic/views/file/view.php @@ -0,0 +1,10 @@ +title = 'PicHost'; +?> +
+ +
diff --git a/basic/views/layouts/main.php b/basic/views/layouts/main.php index c204435c041e2c917c4110461e3d901b0516fe88..2de0a7468da0235e34810d6d3122d1d213c979db 100644 --- a/basic/views/layouts/main.php +++ b/basic/views/layouts/main.php @@ -32,26 +32,15 @@ $this->registerLinkTag(['rel' => 'icon', 'type' => 'image/x-icon', 'href' => Yii