├── .bowerrc ├── .env.example ├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── .node-version ├── .phpstorm.meta.php ├── LICENSE ├── README.md ├── _ide_helper.php ├── app ├── BaseModel.php ├── Console │ └── Kernel.php ├── Design.php ├── Exceptions │ └── Handler.php ├── Http │ ├── Controllers │ │ ├── AdminController.php │ │ ├── Auth │ │ │ ├── ForgotPasswordController.php │ │ │ ├── LoginController.php │ │ │ ├── RegisterController.php │ │ │ └── ResetPasswordController.php │ │ ├── BaseController.php │ │ ├── CommonController.php │ │ ├── Controller.php │ │ ├── DevController.php │ │ ├── DonateController.php │ │ ├── HomeController.php │ │ ├── IconController.php │ │ ├── JobController.php │ │ ├── SplashController.php │ │ └── VoteController.php │ ├── Kernel.php │ └── Middleware │ │ ├── EncryptCookies.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php ├── Platforms │ ├── Android │ │ ├── Icon.php │ │ └── Splash.php │ ├── BaseAsset.php │ ├── BaseIcon.php │ ├── BaseSplash.php │ ├── Cordova │ │ └── Icon.php │ ├── Platform.php │ ├── Quasar │ │ └── Icon.php │ ├── WebApp │ │ └── Icon.php │ ├── Windows │ │ └── Icon.php │ ├── WindowsPhone │ │ └── Icon.php │ ├── iOS │ │ ├── Icon.php │ │ └── Splash.php │ ├── macOS │ │ └── Icon.php │ └── watchOS │ │ └── Icon.php ├── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php ├── Requirement.php ├── Services │ ├── BaseService.php │ ├── DesignService.php │ ├── Security.php │ ├── SplashService.php │ └── Util.php ├── Splash.php ├── Subscription.php ├── User.php └── library │ └── class.geetestlib.php ├── artisan ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── constants.php ├── database.php ├── filesystems.php ├── geetest.php ├── hashing.php ├── logging.php ├── mail.php ├── queue.php ├── services.php ├── session.php ├── uuid.php └── view.php ├── crontab.sample ├── database ├── .gitignore ├── factories │ └── UserFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ ├── 2015_01_09_003010_create_designs_table.php │ ├── 2015_01_24_110812_FolderInDesigns.php │ ├── 2015_01_24_140029_RemoveFileInDesigns.php │ ├── 2015_02_06_223012_create_subscription_table.php │ ├── 2015_08_19_212402_add_platform.php │ ├── 2016_01_21_001526_platform_nullable.php │ ├── 2016_01_23_112432_design_sizes.php │ ├── 2016_05_02_101619_design-bg-color.php │ ├── 2016_11_23_003237_design_android_folder.php │ ├── 2016_12_30_005301_design_radius_field.php │ ├── 2017_02_21_112542_design_android_name.php │ ├── 2017_07_01_011532_requirement_table.php │ ├── 2017_07_01_013830_create_cache_table.php │ ├── 2017_07_07_174231_requirement_status.php │ ├── 2019_01_31_101451_create_splash_table.php │ ├── 2019_01_31_104316_splash_uuid.php │ └── 2019_08_29_010731_designs_ios_old_formats.php └── seeds │ └── DatabaseSeeder.php ├── deploy.sh ├── gulpfile.js ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── css │ ├── all.css │ ├── app.css │ ├── bootstrap-material-design.min.css │ ├── loading-bar.min.css │ ├── main.css │ ├── main.css.map │ └── main.less ├── dist │ └── spa-mat │ │ ├── css │ │ ├── 28dc6382.58b2f089.css │ │ ├── 3cd81c0b.56e91f79.css │ │ └── app.ba5d04be.css │ │ ├── fonts │ │ ├── KFOkCnqEu92Fr1MmgVxIIzQ.e9dbbe8a.woff │ │ ├── KFOlCnqEu92Fr1MmEU9fBBc-.de8b7431.woff │ │ ├── KFOlCnqEu92Fr1MmSU5fBBc-.a1471d1d.woff │ │ ├── KFOlCnqEu92Fr1MmWUlfBBc-.cf6613d1.woff │ │ ├── KFOlCnqEu92Fr1MmYUtfBBc-.8c2ade50.woff │ │ ├── KFOmCnqEu92Fr1Mu4mxM.bafb105b.woff │ │ ├── flUhRq6tzZclQEJ-Vdg-IuiaDsNa.c38ebd3c.woff │ │ ├── flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.8a9a261c.woff2 │ │ ├── mdi.45911874.woff2 │ │ └── mdi.4b882ad4.woff │ │ ├── index.html │ │ ├── js │ │ ├── 28dc6382.91fed69b.js │ │ ├── 3cd81c0b.2613b2d9.js │ │ ├── 4b47640d.21cfc388.js │ │ ├── 71580cb4.957f6b88.js │ │ ├── app.e4e07aff.js │ │ ├── runtime.9d1fceb2.js │ │ └── vendor.0cab4efc.js │ │ └── statics │ │ ├── devices │ │ ├── huaweiP30pro.png │ │ ├── iPad.png │ │ ├── iPhone8.png │ │ ├── iPhone8Plus.png │ │ ├── iPhoneSE.png │ │ ├── iPhoneX.png │ │ ├── iPhoneXR.png │ │ ├── oneplus5.png │ │ └── oneplus7Pro.png │ │ ├── icon.png │ │ └── icons │ │ ├── apple-icon-152x152.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── icon-128x128.png │ │ ├── icon-192x192.png │ │ ├── icon-256x256.png │ │ ├── icon-384x384.png │ │ ├── icon-512x512.png │ │ └── ms-icon-144x144.png ├── favicon.ico ├── files │ └── .gitignore ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 ├── img │ ├── AliPay_sm.png │ ├── WeChatPay_sm.png │ ├── android.png │ ├── eye.png │ ├── folder.png │ ├── guide │ │ ├── android_1.jpg │ │ ├── android_2.jpg │ │ ├── android_3.jpg │ │ ├── android_4.jpg │ │ ├── ios_1.jpg │ │ ├── ios_2.jpg │ │ ├── ios_3.jpg │ │ └── ios_4.jpg │ ├── ios8.png │ ├── iphone6.png │ ├── iphonescreenshot.png │ ├── iphonex.png │ ├── launcher.png │ ├── loading.gif │ ├── mac.jpg │ ├── nexus5.png │ ├── opt.png │ ├── osx.png │ ├── splash │ │ └── demo.mp4 │ ├── watch.png │ ├── webapp.png │ └── windowsphone.png ├── index.php ├── js │ ├── all.js │ ├── app.js │ ├── app │ │ ├── admin.ctrl.js │ │ ├── constant.js │ │ ├── core.service.js │ │ ├── directive.js │ │ ├── home.ctrl.js │ │ ├── icon.ctrl.js │ │ ├── root.ctrl.js │ │ └── vote.ctrl.js │ ├── lib │ │ ├── html5shiv.min.js │ │ ├── ie10-viewport-bug-workaround.js │ │ ├── loading-bar.min.js │ │ ├── material.min.js │ │ └── respond.min.js │ └── main.js ├── robots.txt ├── views │ ├── admin │ │ ├── dashboard.html │ │ └── index.html │ └── icon │ │ ├── detail.android.html │ │ ├── detail.custom.html │ │ ├── detail.ios.html │ │ ├── detail.iwatch.html │ │ ├── detail.mac.html │ │ ├── detail.phonegap.html │ │ ├── detail.quasar.html │ │ ├── detail.webapp.html │ │ ├── detail.windowsphone.html │ │ ├── download.html │ │ └── generate.html └── web.config ├── resources ├── assets │ ├── js │ │ ├── app.js │ │ ├── bootstrap.js │ │ └── components │ │ │ └── ExampleComponent.vue │ └── sass │ │ ├── _variables.scss │ │ └── app.scss ├── lang │ └── en │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php ├── ui │ ├── .babelrc │ ├── .editorconfig │ ├── .eslintignore │ ├── .eslintrc.js │ ├── .gitignore │ ├── .postcssrc.js │ ├── .stylintrc │ ├── README.md │ ├── package.json │ ├── quasar.conf.js │ ├── src │ │ ├── App.vue │ │ ├── assets │ │ │ └── sad.svg │ │ ├── common.js │ │ ├── components │ │ │ ├── .gitkeep │ │ │ ├── DownloadDialog.vue │ │ │ ├── LoadingModal.vue │ │ │ ├── Splash │ │ │ │ ├── DeviceBox.vue │ │ │ │ ├── DeviceObject.vue │ │ │ │ ├── ObjectList.vue │ │ │ │ └── ObjectSetting.vue │ │ │ └── UploadDialog.vue │ │ ├── const.js │ │ ├── css │ │ │ ├── _variable.scss │ │ │ ├── app.styl │ │ │ ├── helper.scss │ │ │ ├── main.scss │ │ │ └── themes │ │ │ │ ├── common.variables.styl │ │ │ │ ├── variables.ios.styl │ │ │ │ └── variables.mat.styl │ │ ├── i18n │ │ │ ├── en-us │ │ │ │ └── index.js │ │ │ └── index.js │ │ ├── index.template.html │ │ ├── layouts │ │ │ └── SplashLayout │ │ │ │ ├── Header.vue │ │ │ │ ├── Index.vue │ │ │ │ ├── LeftDrawer.vue │ │ │ │ └── RightDrawer.vue │ │ ├── mixins │ │ │ ├── Key.js │ │ │ ├── Singleton.js │ │ │ └── Splash.js │ │ ├── models │ │ │ ├── Base.js │ │ │ ├── Objects │ │ │ │ ├── BaseObject.js │ │ │ │ ├── Image.js │ │ │ │ └── index.js │ │ │ ├── Scene.js │ │ │ └── index.js │ │ ├── pages │ │ │ ├── Error404.vue │ │ │ └── Splash │ │ │ │ └── Index.vue │ │ ├── plugins │ │ │ ├── .gitkeep │ │ │ ├── ad.js │ │ │ ├── axios.js │ │ │ ├── i18n.js │ │ │ └── vuelidate.js │ │ ├── router │ │ │ ├── index.js │ │ │ └── routes.js │ │ ├── statics │ │ │ ├── devices │ │ │ │ ├── huaweiP30pro.png │ │ │ │ ├── iPad.png │ │ │ │ ├── iPhone8.png │ │ │ │ ├── iPhone8Plus.png │ │ │ │ ├── iPhoneSE.png │ │ │ │ ├── iPhoneX.png │ │ │ │ ├── iPhoneXR.png │ │ │ │ ├── oneplus5.png │ │ │ │ └── oneplus7Pro.png │ │ │ ├── icon.png │ │ │ └── icons │ │ │ │ ├── apple-icon-152x152.png │ │ │ │ ├── favicon-16x16.png │ │ │ │ ├── favicon-32x32.png │ │ │ │ ├── icon-128x128.png │ │ │ │ ├── icon-192x192.png │ │ │ │ ├── icon-256x256.png │ │ │ │ ├── icon-384x384.png │ │ │ │ ├── icon-512x512.png │ │ │ │ └── ms-icon-144x144.png │ │ └── store │ │ │ ├── Splash │ │ │ ├── actions.js │ │ │ ├── getters.js │ │ │ ├── index.js │ │ │ ├── mutations.js │ │ │ └── state.js │ │ │ └── index.js │ └── yarn.lock └── views │ ├── about.blade.php │ ├── changelog.blade.php │ ├── comment.blade.php │ ├── donate.blade.php │ ├── emails │ ├── auth │ │ └── reminder.blade.php │ └── icon.php │ ├── error │ └── 404.php │ ├── faq.blade.php │ ├── guides │ ├── android.blade.php │ ├── ios.blade.php │ ├── iwatch.blade.php │ ├── phonegap.blade.php │ └── webapp.blade.php │ ├── home.blade.php │ ├── icon.blade.php │ ├── master.blade.php │ ├── splash.blade.php │ ├── splash │ └── demo.blade.php │ ├── vote.blade.php │ └── welcome.blade.php ├── routes ├── api.php ├── channels.php ├── console.php └── web.php ├── server.php ├── storage ├── app │ ├── .gitignore │ └── public │ │ └── .gitignore ├── debugbar │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── CreatesApplication.php ├── Feature │ └── ExampleTest.php ├── TestCase.php └── Unit │ └── ExampleTest.php ├── webpack.mix.js └── yarn.lock /.bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory": "public/bower" 3 | } -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | LOG_CHANNEL=stack 8 | 9 | DB_CONNECTION=mysql 10 | DB_HOST=127.0.0.1 11 | DB_PORT=3306 12 | DB_DATABASE=homestead 13 | DB_USERNAME=homestead 14 | DB_PASSWORD=secret 15 | 16 | BROADCAST_DRIVER=log 17 | CACHE_DRIVER=file 18 | SESSION_DRIVER=file 19 | SESSION_LIFETIME=120 20 | QUEUE_DRIVER=sync 21 | 22 | REDIS_HOST=127.0.0.1 23 | REDIS_PASSWORD=null 24 | REDIS_PORT=6379 25 | 26 | MAIL_DRIVER=smtp 27 | MAIL_HOST=smtp.mailtrap.io 28 | MAIL_PORT=2525 29 | MAIL_USERNAME=null 30 | MAIL_PASSWORD=null 31 | MAIL_ENCRYPTION=null 32 | 33 | PUSHER_APP_ID= 34 | PUSHER_APP_KEY= 35 | PUSHER_APP_SECRET= 36 | PUSHER_APP_CLUSTER=mt1 37 | 38 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 39 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 40 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [zhanghuanchong] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | custom: # Replace with a single custom sponsorship URL 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /public/bower 5 | /public/ads.txt 6 | /asset 7 | /storage/*.key 8 | /vendor 9 | /.idea 10 | /.vscode 11 | /.vagrant 12 | Homestead.json 13 | Homestead.yaml 14 | npm-debug.log 15 | yarn-error.log 16 | .env 17 | 18 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 11.11.0 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 图标工场 2 | 3 | 移动应用图标生成工具,一键生成所有尺寸的应用图标。 4 | 5 | https://icon.wuruihong.com 6 | 7 | ### 功能 8 | 9 | * 生成不同移动平台(iOS/Android/Web App/Cordova/...)的应用图标,一键生成,快捷导入 10 | * App 启动图(Launch Image/Splash)生成工具,支持 iOS/Android 11 | 12 | ### 技术栈 13 | 14 | * Laravel 5.6 15 | * Angular 1 + Material Design 16 | * Vue / Quasar Framework 17 | 18 | ### TODO 19 | 20 | * App 启动图 21 | * 支持鼠标拖动、缩放 22 | * 支持插入文本 23 | * 生成应用商店屏幕截图 24 | 25 | ### Contributors 26 | 27 | Primary author: 28 | * https://github.com/zhanghuanchong 29 | 30 | Other contributors: 31 | * https://github.com/kuaifan 32 | 33 | ### License 34 | 35 | AGPL协议 36 | 37 | * 欢迎 PR 38 | * 基于本项目开发的项目,请自觉开源 39 | -------------------------------------------------------------------------------- /app/BaseModel.php: -------------------------------------------------------------------------------- 1 | command('inspire') 28 | // ->hourly(); 29 | } 30 | 31 | /** 32 | * Register the commands for the application. 33 | * 34 | * @return void 35 | */ 36 | protected function commands() 37 | { 38 | $this->load(__DIR__.'/Commands'); 39 | 40 | require base_path('routes/console.php'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | pre_process(static::USER_ID); 23 | Session::put('gtserver', $status); 24 | echo $GtSdk->get_response_str(); 25 | } 26 | 27 | private function verifyCode() 28 | { 29 | $GtSdk = new GeetestLib(CAPTCHA_ID, PRIVATE_KEY); 30 | $challenge = Input::get('geetest_challenge'); 31 | $validate = Input::get('geetest_validate'); 32 | $seccode = Input::get('geetest_seccode'); 33 | 34 | if (Session::get('gtserver') == 1) { 35 | return $GtSdk->success_validate($challenge, $validate, $seccode, static::USER_ID); 36 | } 37 | return $GtSdk->fail_validate($challenge, $validate, $seccode); 38 | } 39 | 40 | public function postLogin() 41 | { 42 | $pwd = Input::get('password'); 43 | if ($pwd != '') { 44 | return $this->failed('密码错误!'); 45 | } 46 | if (!$this->verifyCode()) { 47 | return $this->failed('验证失败!'); 48 | } 49 | return $this->success(); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/LoginController.php: -------------------------------------------------------------------------------- 1 | middleware('guest')->except('logout'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/RegisterController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 41 | } 42 | 43 | /** 44 | * Get a validator for an incoming registration request. 45 | * 46 | * @param array $data 47 | * @return \Illuminate\Contracts\Validation\Validator 48 | */ 49 | protected function validator(array $data) 50 | { 51 | return Validator::make($data, [ 52 | 'name' => 'required|string|max:255', 53 | 'email' => 'required|string|email|max:255|unique:users', 54 | 'password' => 'required|string|min:6|confirmed', 55 | ]); 56 | } 57 | 58 | /** 59 | * Create a new user instance after a valid registration. 60 | * 61 | * @param array $data 62 | * @return \App\User 63 | */ 64 | protected function create(array $data) 65 | { 66 | return User::create([ 67 | 'name' => $data['name'], 68 | 'email' => $data['email'], 69 | 'password' => Hash::make($data['password']), 70 | ]); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ResetPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('guest'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Http/Controllers/BaseController.php: -------------------------------------------------------------------------------- 1 | $success, 23 | 'message' => $message, 24 | 'data' => $data, 25 | )); 26 | } 27 | 28 | protected function success($data = null, $message = null) 29 | { 30 | return $this->json(true, $message, $data); 31 | } 32 | 33 | protected function failed($message = null, $data = null) 34 | { 35 | return $this->json(false, $message, $data); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Http/Controllers/CommonController.php: -------------------------------------------------------------------------------- 1 | hasFile('file')) { 19 | return $this->failed('文件未找到!'); 20 | } 21 | 22 | $file = $request->file('file'); 23 | if (!$file->isValid()) { 24 | return $this->failed('文件上传失败,请联系管理员!'); 25 | } 26 | 27 | $size = $file->getClientSize(); 28 | if ($size > 10485760 /* 1024 * 1024 * 10 */) { 29 | return $this->failed('请压缩文件至 10M 以下后重试。'); 30 | } 31 | 32 | $files_folder = public_path('files'); 33 | $folder = $files_folder . '/temp'; 34 | if (!file_exists($folder) && !@mkdir($folder, 0777, TRUE) && !is_dir($folder)) { 35 | return $this->failed('文件保存失败!'); 36 | } 37 | 38 | $id = str_random(16); 39 | $ext = $file->getClientOriginalExtension(); 40 | $file->move($folder, $id . '.' . $ext); 41 | 42 | return $this->success('/files/temp/' . $id . '.' . $ext); 43 | } 44 | } -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | success($ips); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/Http/Controllers/DonateController.php: -------------------------------------------------------------------------------- 1 | $id 40 | ]); 41 | } 42 | 43 | public function iconWithID($id) 44 | { 45 | return Redirect::to('/icon?utm_source=' . $id); 46 | } 47 | 48 | public function changeLog() 49 | { 50 | return View::make('changelog'); 51 | } 52 | 53 | public function about() 54 | { 55 | return View::make('about'); 56 | } 57 | 58 | public function faq() 59 | { 60 | return View::make('faq'); 61 | } 62 | 63 | public function guide($platform) 64 | { 65 | $platforms = Config::get('constants.platforms'); 66 | return View::make('guides/' . $platform, [ 67 | 'platform' => $platforms[$platform] 68 | ]); 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /app/Http/Controllers/JobController.php: -------------------------------------------------------------------------------- 1 | subDay())->get()->each(function (Design $design) { 22 | $design->delete(); 23 | }); 24 | } 25 | 26 | public function deleteExpiredDesignCaches() 27 | { 28 | // 删除1小时前的Cache 29 | Design::where('created_at', '<', Carbon::now()->subHour())->get()->each(function (Design $design) { 30 | $design->deleteCache(); 31 | }); 32 | } 33 | 34 | public function deleteExpiredSplashFiles() 35 | { 36 | //////////////////// Splash ///////////////////// 37 | // 删除1天前的所有数据 38 | Splash::where('created_at', '<', Carbon::now()->subDay())->get()->each(function (Splash $splash) { 39 | $splash->delete(); 40 | }); 41 | } 42 | 43 | public function deleteExpiredSplashCaches() 44 | { 45 | // 删除1小时前的Cache 46 | Splash::where('created_at', '<', Carbon::now()->subHour())->get()->each(function (Splash $splash) { 47 | $splash->deleteCache(); 48 | }); 49 | } 50 | 51 | public function removeOldSplashFiles() 52 | { 53 | $before = Carbon::now()->subDay()->getTimestamp(); 54 | $folder = Carbon::now()->format('Ym'); 55 | $dirs = \File::directories(public_path('files') . '/' . $folder . '/'); 56 | foreach ($dirs as $dir) { 57 | $time = \File::lastModified($dir); 58 | if ($time < $before) { 59 | \File::deleteDirectory($dir); 60 | var_dump($dir); 61 | } 62 | } 63 | } 64 | 65 | public function removeMagickTmp() 66 | { 67 | $output = []; 68 | exec('rm -rf /tmp/magick-* 2>&1', $output); 69 | var_dump($output); 70 | } 71 | } -------------------------------------------------------------------------------- /app/Http/Controllers/SplashController.php: -------------------------------------------------------------------------------- 1 | folder = date('Ym'); 21 | $splash->config = $request->get('scene'); 22 | $splash->user_agent = $request->server('HTTP_USER_AGENT'); 23 | $splash->ip = $request->getClientIp(); 24 | $splash->save(); 25 | 26 | $splash->getService()->generate(); 27 | 28 | return $this->success($splash->uuid); 29 | } 30 | 31 | public function regenerate($uuid) 32 | { 33 | $splash = Splash::whereUuid($uuid)->firstOrFail(); 34 | $splash->getService()->generate(); 35 | 36 | return $this->success($splash->uuid); 37 | } 38 | 39 | public function download($uuid, $regenerate = false) 40 | { 41 | /** @var Splash $splash */ 42 | $splash = Splash::whereUuid($uuid)->first(); 43 | if (!$splash) { 44 | return '原图已过期!'; 45 | } 46 | 47 | try { 48 | $path = $splash->getService()->package($regenerate); 49 | } catch (\Exception $e) { 50 | return '打包失败!' . $e->getMessage(); 51 | } 52 | 53 | if (!$path) { 54 | return '文件未找到!'; 55 | } 56 | return Response::download($path); 57 | } 58 | 59 | public function demo() 60 | { 61 | return View::make('splash/demo'); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/Http/Controllers/VoteController.php: -------------------------------------------------------------------------------- 1 | title = Input::get('title'); 16 | $r->vote = 0; 17 | $r->status = Requirement::STATUS_NEW; 18 | $r->save(); 19 | 20 | return $this->success($r); 21 | } 22 | } -------------------------------------------------------------------------------- /app/Http/Kernel.php: -------------------------------------------------------------------------------- 1 | [ 31 | \App\Http\Middleware\EncryptCookies::class, 32 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 33 | \Illuminate\Session\Middleware\StartSession::class, 34 | // \Illuminate\Session\Middleware\AuthenticateSession::class, 35 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 36 | // \App\Http\Middleware\VerifyCsrfToken::class, 37 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 38 | ], 39 | 40 | 'api' => [ 41 | 'throttle:60,1', 42 | 'bindings', 43 | ], 44 | ]; 45 | 46 | /** 47 | * The application's route middleware. 48 | * 49 | * These middleware may be assigned to groups or used individually. 50 | * 51 | * @var array 52 | */ 53 | protected $routeMiddleware = [ 54 | 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 55 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 56 | 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 57 | 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 58 | 'can' => \Illuminate\Auth\Middleware\Authorize::class, 59 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 60 | 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 61 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 62 | ]; 63 | } 64 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | check()) { 21 | return redirect('/home'); 22 | } 23 | 24 | return $next($request); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 36, 22 | 'folder' => 'drawable-ldpi', 23 | 'name' => 'ic_launcher', 24 | ], 25 | [ 26 | 'size' => 48, 27 | 'folder' => 'drawable-mdpi', 28 | 'name' => 'ic_launcher', 29 | ], 30 | [ 31 | 'size' => 48, 32 | 'scale' => 1.5, 33 | 'folder' => 'drawable-hdpi', 34 | 'name' => 'ic_launcher', 35 | ], 36 | [ 37 | 'size' => 48, 38 | 'scale' => 2, 39 | 'folder' => 'drawable-xhdpi', 40 | 'name' => 'ic_launcher', 41 | ], 42 | [ 43 | 'size' => 48, 44 | 'scale' => 3, 45 | 'folder' => 'drawable-xxhdpi', 46 | 'name' => 'ic_launcher', 47 | ], 48 | [ 49 | 'size' => 48, 50 | 'scale' => 4, 51 | 'folder' => 'drawable-xxxhdpi', 52 | 'name' => 'ic_launcher', 53 | ], 54 | [ 55 | 'size' => 512, 56 | 'name' => 'playstore-icon', 57 | ], 58 | ]; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /app/Platforms/BaseAsset.php: -------------------------------------------------------------------------------- 1 | getSizes(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/Platforms/BaseSplash.php: -------------------------------------------------------------------------------- 1 | 'iOS', 25 | 'iwatch' => 'watchOS', 26 | 'android' => 'Android', 27 | 'webapp' => 'WebApp', 28 | 'phonegap' => 'Cordova', 29 | 'windowsphone' => 'WindowsPhone', 30 | 'mac' => 'macOS', 31 | 'quasar' => 'Quasar', 32 | ]; 33 | } 34 | -------------------------------------------------------------------------------- /app/Platforms/Quasar/Icon.php: -------------------------------------------------------------------------------- 1 | 128, 16 | 'name' => 'logo', 17 | ], 18 | [ 19 | 'size' => 152, 20 | 'folder' => 'icons', 21 | 'name' => 'apple-icon-152x152', 22 | ], 23 | [ 24 | 'size' => 16, 25 | 'folder' => 'icons', 26 | 'name' => 'favicon-16x16', 27 | ], 28 | [ 29 | 'size' => 32, 30 | 'folder' => 'icons', 31 | 'name' => 'favicon-32x32', 32 | ], 33 | [ 34 | 'size' => 128, 35 | 'folder' => 'icons', 36 | 'name' => 'icon-128x128', 37 | ], 38 | [ 39 | 'size' => 192, 40 | 'folder' => 'icons', 41 | 'name' => 'icon-192x192', 42 | ], 43 | [ 44 | 'size' => 256, 45 | 'folder' => 'icons', 46 | 'name' => 'icon-256x256', 47 | ], 48 | [ 49 | 'size' => 386, 50 | 'folder' => 'icons', 51 | 'name' => 'icon-384x384', 52 | ], 53 | [ 54 | 'size' => 512, 55 | 'folder' => 'icons', 56 | 'name' => 'icon-512x512', 57 | ], 58 | [ 59 | 'size' => 144, 60 | 'folder' => 'icons', 61 | 'name' => 'ms-icon-144x144', 62 | ], 63 | ]; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/Platforms/WebApp/Icon.php: -------------------------------------------------------------------------------- 1 | 76, 22 | 'scale' => 1, 23 | 'name' => 'apple-touch-icon-76x76' 24 | ], 25 | [ 26 | 'size' => 60, 27 | 'scale' => 2, 28 | 'name' => 'apple-touch-icon-120x120' 29 | ], 30 | [ 31 | 'size' => 76, 32 | 'scale' => 2, 33 | 'name' => 'apple-touch-icon-152x152' 34 | ], 35 | [ 36 | 'size' => 60, 37 | 'scale' => 3, 38 | 'name' => 'apple-touch-icon-180x180' 39 | ], 40 | [ 41 | 'size' => 29, 42 | 'scale' => 2, 43 | 'name' => 'android-touch-icon' 44 | ], 45 | ]; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/Platforms/Windows/Icon.php: -------------------------------------------------------------------------------- 1 | 71, 22 | 'name' => 'Square71x71Logo' 23 | ], 24 | [ 25 | 'size' => 99, 26 | 'name' => 'Square99x99Logo' 27 | ], 28 | [ 29 | 'size' => 170, 30 | 'name' => 'Square170x170Logo' 31 | ], 32 | [ 33 | 'size' => 150, 34 | 'name' => 'Logo' 35 | ], 36 | [ 37 | 'size' => 210, 38 | 'name' => 'Logo210x210' 39 | ], 40 | [ 41 | 'size' => 360, 42 | 'name' => 'Logo360x360' 43 | ], 44 | [ 45 | 'size' => 44, 46 | 'name' => 'SmallLogo' 47 | ], 48 | [ 49 | 'size' => 62, 50 | 'name' => 'SmallLogo62x62' 51 | ], 52 | [ 53 | 'size' => 106, 54 | 'name' => 'SmallLogo106x106' 55 | ], 56 | [ 57 | 'size' => 50, 58 | 'name' => 'StoreLogo' 59 | ], 60 | [ 61 | 'size' => 70, 62 | 'name' => 'StoreLogo70x70' 63 | ], 64 | [ 65 | 'size' => 120, 66 | 'name' => 'StoreLogo120x120' 67 | ], 68 | ]; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/Platforms/macOS/Icon.php: -------------------------------------------------------------------------------- 1 | 16, 22 | 'scale' => 1, 23 | 'folder' => 'AppIcon.appiconset', 24 | 'idiom' => 'mac', 25 | ], 26 | [ 27 | 'size' => 16, 28 | 'scale' => 2, 29 | 'folder' => 'AppIcon.appiconset', 30 | 'idiom' => 'mac', 31 | ], 32 | [ 33 | 'size' => 32, 34 | 'scale' => 1, 35 | 'folder' => 'AppIcon.appiconset', 36 | 'idiom' => 'mac', 37 | ], 38 | [ 39 | 'size' => 32, 40 | 'scale' => 2, 41 | 'folder' => 'AppIcon.appiconset', 42 | 'idiom' => 'mac', 43 | ], 44 | [ 45 | 'size' => 128, 46 | 'scale' => 1, 47 | 'folder' => 'AppIcon.appiconset', 48 | 'idiom' => 'mac', 49 | ], 50 | [ 51 | 'size' => 128, 52 | 'scale' => 2, 53 | 'folder' => 'AppIcon.appiconset', 54 | 'idiom' => 'mac', 55 | ], 56 | [ 57 | 'size' => 256, 58 | 'scale' => 1, 59 | 'folder' => 'AppIcon.appiconset', 60 | 'idiom' => 'mac', 61 | ], 62 | [ 63 | 'size' => 256, 64 | 'scale' => 2, 65 | 'folder' => 'AppIcon.appiconset', 66 | 'idiom' => 'mac', 67 | ], 68 | [ 69 | 'size' => 512, 70 | 'scale' => 1, 71 | 'folder' => 'AppIcon.appiconset', 72 | 'idiom' => 'mac', 73 | ], 74 | [ 75 | 'size' => 512, 76 | 'scale' => 2, 77 | 'folder' => 'AppIcon.appiconset', 78 | 'idiom' => 'mac', 79 | ], 80 | ]; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /app/Platforms/watchOS/Icon.php: -------------------------------------------------------------------------------- 1 | 24, 22 | 'scale' => 2, 23 | 'folder' => 'AppIcon.appiconset', 24 | 'idiom' => 'watch', 25 | 'role' => 'notificationCenter', 26 | 'subtype' => '38mm' 27 | ], 28 | [ 29 | 'size' => 27.5, 30 | 'scale' => 2, 31 | 'folder' => 'AppIcon.appiconset', 32 | 'idiom' => 'watch', 33 | 'role' => 'notificationCenter', 34 | 'subtype' => '42mm' 35 | ], 36 | [ 37 | 'size' => 29, 38 | 'scale' => 2, 39 | 'folder' => 'AppIcon.appiconset', 40 | 'idiom' => 'watch', 41 | 'role' => 'companionSettings' 42 | ], 43 | [ 44 | 'size' => 29, 45 | 'scale' => 3, 46 | 'folder' => 'AppIcon.appiconset', 47 | 'idiom' => 'watch', 48 | 'role' => 'companionSettings' 49 | ], 50 | [ 51 | 'size' => 40, 52 | 'scale' => 2, 53 | 'folder' => 'AppIcon.appiconset', 54 | 'idiom' => 'watch', 55 | 'role' => 'appLauncher', 56 | 'subtype' => '38mm' 57 | ], 58 | [ 59 | 'size' => 44, 60 | 'scale' => 2, 61 | 'folder' => 'AppIcon.appiconset', 62 | 'idiom' => 'watch', 63 | 'role' => 'longLook', 64 | 'subtype' => '42mm' 65 | ], 66 | [ 67 | 'size' => 86, 68 | 'scale' => 2, 69 | 'folder' => 'AppIcon.appiconset', 70 | 'idiom' => 'watch', 71 | 'role' => 'quickLook', 72 | 'subtype' => '38mm' 73 | ], 74 | [ 75 | 'size' => 98, 76 | 'scale' => 2, 77 | 'folder' => 'AppIcon.appiconset', 78 | 'idiom' => 'watch', 79 | 'role' => 'quickLook', 80 | 'subtype' => '42mm' 81 | ], 82 | ]; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | 'imagick', 19 | ]); 20 | } 21 | 22 | /** 23 | * Register any application services. 24 | * 25 | * @return void 26 | */ 27 | public function register() 28 | { 29 | // 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Providers/AuthServiceProvider.php: -------------------------------------------------------------------------------- 1 | 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | * 22 | * @return void 23 | */ 24 | public function boot() 25 | { 26 | $this->registerPolicies(); 27 | 28 | // 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'App\Listeners\EventListener', 18 | ], 19 | ]; 20 | 21 | /** 22 | * Register any events for your application. 23 | * 24 | * @return void 25 | */ 26 | public function boot() 27 | { 28 | parent::boot(); 29 | 30 | // 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | mapApiRoutes(); 39 | 40 | $this->mapWebRoutes(); 41 | 42 | // 43 | } 44 | 45 | /** 46 | * Define the "web" routes for the application. 47 | * 48 | * These routes all receive session state, CSRF protection, etc. 49 | * 50 | * @return void 51 | */ 52 | protected function mapWebRoutes() 53 | { 54 | Route::middleware('web') 55 | ->namespace($this->namespace) 56 | ->group(base_path('routes/web.php')); 57 | } 58 | 59 | /** 60 | * Define the "api" routes for the application. 61 | * 62 | * These routes are typically stateless. 63 | * 64 | * @return void 65 | */ 66 | protected function mapApiRoutes() 67 | { 68 | Route::prefix('api') 69 | ->middleware('api') 70 | ->namespace($this->namespace) 71 | ->group(base_path('routes/api.php')); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /app/Requirement.php: -------------------------------------------------------------------------------- 1 | 'array', 40 | ]; 41 | 42 | public function getService() 43 | { 44 | return new SplashService($this); 45 | } 46 | 47 | public function getPlatformAttribute() 48 | { 49 | return $this->config['platforms'] ?? []; 50 | } 51 | 52 | public function delete() 53 | { 54 | $this->getService()->deleteFolder(); 55 | parent::delete(); 56 | } 57 | 58 | public function deleteCache() 59 | { 60 | $this->getService()->deleteCache(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /app/Subscription.php: -------------------------------------------------------------------------------- 1 | belongsTo(Design::class); 42 | } 43 | 44 | public function sendZip() 45 | { 46 | $design = $this->design; 47 | try { 48 | $path = $design->getService()->package(); 49 | } catch (\Exception $e) { 50 | return; 51 | } 52 | $data = array( 53 | 'path' => $path 54 | ); 55 | Mail::send('emails.icon', $data, function(Message $message) use ($path, $design) 56 | { 57 | $subject = '批量生成应用图标:' . $design->original_name; 58 | $message->to($this->mail)->subject($subject); 59 | $message->attach($path); 60 | }); 61 | } 62 | 63 | } -------------------------------------------------------------------------------- /app/User.php: -------------------------------------------------------------------------------- 1 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 30 | Illuminate\Contracts\Http\Kernel::class, 31 | App\Http\Kernel::class 32 | ); 33 | 34 | $app->singleton( 35 | Illuminate\Contracts\Console\Kernel::class, 36 | App\Console\Kernel::class 37 | ); 38 | 39 | $app->singleton( 40 | Illuminate\Contracts\Debug\ExceptionHandler::class, 41 | App\Exceptions\Handler::class 42 | ); 43 | 44 | /* 45 | |-------------------------------------------------------------------------- 46 | | Return The Application 47 | |-------------------------------------------------------------------------- 48 | | 49 | | This script returns the application instance. The instance is given to 50 | | the calling script so we can separate the building of the instances 51 | | from the actual running of the application and sending responses. 52 | | 53 | */ 54 | 55 | return $app; 56 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "description": "The Laravel Framework.", 4 | "keywords": ["framework", "laravel"], 5 | "license": "MIT", 6 | "type": "project", 7 | "require": { 8 | "php": "^7.1.3", 9 | "Chumper/Zipper": "^1.0", 10 | "barryvdh/laravel-ide-helper": "^2.4", 11 | "doctrine/dbal": "~2.3", 12 | "emadadly/laravel-uuid": "^1.2", 13 | "fideloper/proxy": "^4.0", 14 | "intervention/image": "^2.4", 15 | "jenssegers/agent": "^2.6", 16 | "laravel/framework": "5.6.*", 17 | "laravel/tinker": "^1.0", 18 | "ext-imagick": "*", 19 | "ext-json": "*" 20 | }, 21 | "require-dev": { 22 | "roave/security-advisories": "dev-master", 23 | "barryvdh/laravel-debugbar": "^3.1", 24 | "filp/whoops": "^2.0", 25 | "fzaninotto/faker": "^1.4", 26 | "mockery/mockery": "^1.0", 27 | "nunomaduro/collision": "^2.0", 28 | "phpunit/phpunit": "^7.0" 29 | }, 30 | "autoload": { 31 | "classmap": [ 32 | "database/seeds", 33 | "database/factories" 34 | ], 35 | "psr-4": { 36 | "App\\": "app/" 37 | } 38 | }, 39 | "autoload-dev": { 40 | "psr-4": { 41 | "Tests\\": "tests/" 42 | } 43 | }, 44 | "extra": { 45 | "laravel": { 46 | "dont-discover": [ 47 | ] 48 | } 49 | }, 50 | "scripts": { 51 | "post-root-package-install": [ 52 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 53 | ], 54 | "post-create-project-cmd": [ 55 | "@php artisan key:generate" 56 | ], 57 | "post-autoload-dump": [ 58 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 59 | "@php artisan package:discover" 60 | ], 61 | "ide": [ 62 | "@php artisan ide-helper:generate", 63 | "@php artisan ide-helper:meta", 64 | "@php artisan ide-helper:eloquent", 65 | "@php artisan ide-helper:models -W" 66 | ], 67 | "im": [ 68 | "@php artisan ide-helper:models -W" 69 | ] 70 | }, 71 | "config": { 72 | "preferred-install": "dist", 73 | "sort-packages": true, 74 | "optimize-autoloader": true 75 | }, 76 | "minimum-stability": "dev", 77 | "prefer-stable": true 78 | } 79 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | 'cluster' => env('PUSHER_APP_CLUSTER'), 40 | 'encrypted' => true, 41 | ], 42 | ], 43 | 44 | 'redis' => [ 45 | 'driver' => 'redis', 46 | 'connection' => 'default', 47 | ], 48 | 49 | 'log' => [ 50 | 'driver' => 'log', 51 | ], 52 | 53 | 'null' => [ 54 | 'driver' => 'null', 55 | ], 56 | 57 | ], 58 | 59 | ]; 60 | -------------------------------------------------------------------------------- /config/constants.php: -------------------------------------------------------------------------------- 1 | '图标工场', 6 | 'slogan' => '移动应用图标/启动图生成工具,一键生成所有尺寸的应用图标/启动图', 7 | 'version' => '4.0', 8 | 'platforms' => [ 9 | 'ios' => 'iOS', 10 | 'android' => 'Android', 11 | ], 12 | 13 | ); 14 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "sftp", "s3", "rackspace" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_ACCESS_KEY_ID'), 61 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 62 | 'region' => env('AWS_DEFAULT_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | 'url' => env('AWS_URL'), 65 | ], 66 | 67 | ], 68 | 69 | ]; 70 | -------------------------------------------------------------------------------- /config/geetest.php: -------------------------------------------------------------------------------- 1 | 'bcrypt', 19 | 20 | ]; 21 | -------------------------------------------------------------------------------- /config/logging.php: -------------------------------------------------------------------------------- 1 | env('LOG_CHANNEL', 'stack'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Log Channels 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Here you may configure the log channels for your application. Out of 24 | | the box, Laravel uses the Monolog PHP logging library. This gives 25 | | you a variety of powerful log handlers / formatters to utilize. 26 | | 27 | | Available Drivers: "single", "daily", "slack", "syslog", 28 | | "errorlog", "custom", "stack" 29 | | 30 | */ 31 | 32 | 'channels' => [ 33 | 'stack' => [ 34 | 'driver' => 'stack', 35 | 'channels' => ['single'], 36 | ], 37 | 38 | 'single' => [ 39 | 'driver' => 'single', 40 | 'path' => storage_path('logs/laravel.log'), 41 | 'level' => 'debug', 42 | ], 43 | 44 | 'daily' => [ 45 | 'driver' => 'daily', 46 | 'path' => storage_path('logs/laravel.log'), 47 | 'level' => 'debug', 48 | 'days' => 7, 49 | ], 50 | 51 | 'slack' => [ 52 | 'driver' => 'slack', 53 | 'url' => env('LOG_SLACK_WEBHOOK_URL'), 54 | 'username' => 'Laravel Log', 55 | 'emoji' => ':boom:', 56 | 'level' => 'critical', 57 | ], 58 | 59 | 'syslog' => [ 60 | 'driver' => 'syslog', 61 | 'level' => 'debug', 62 | ], 63 | 64 | 'errorlog' => [ 65 | 'driver' => 'errorlog', 66 | 'level' => 'debug', 67 | ], 68 | ], 69 | 70 | ]; 71 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | ], 21 | 22 | 'ses' => [ 23 | 'key' => env('SES_KEY'), 24 | 'secret' => env('SES_SECRET'), 25 | 'region' => 'us-east-1', 26 | ], 27 | 28 | 'sparkpost' => [ 29 | 'secret' => env('SPARKPOST_SECRET'), 30 | ], 31 | 32 | 'stripe' => [ 33 | 'model' => App\User::class, 34 | 'key' => env('STRIPE_KEY'), 35 | 'secret' => env('STRIPE_SECRET'), 36 | ], 37 | 38 | ]; 39 | -------------------------------------------------------------------------------- /config/uuid.php: -------------------------------------------------------------------------------- 1 | 'uuid', 16 | 17 | ]; 18 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => realpath(storage_path('framework/views')), 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /crontab.sample: -------------------------------------------------------------------------------- 1 | 12 * * * * wget --no-check-certificate -q --spider https://icon.wuruihong.com/job/delete-expired-design-files 2 | 14 * * * * wget --no-check-certificate -q --spider https://icon.wuruihong.com/job/delete-expired-design-caches 3 | 16 * * * * wget --no-check-certificate -q --spider https://icon.wuruihong.com/job/delete-expired-splash-files 4 | 18 * * * * wget --no-check-certificate -q --spider https://icon.wuruihong.com/job/delete-expired-splash-caches 5 | 22 */4 * * * wget --no-check-certificate -q --spider https://icon.wuruihong.com/job/remove-old-splash-files 6 | 3 2 * * * wget --no-check-certificate -q --spider https://icon.wuruihong.com/job/remove-magick-tmp -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | define(App\User::class, function (Faker $faker) { 17 | return [ 18 | 'name' => $faker->name, 19 | 'email' => $faker->unique()->safeEmail, 20 | 'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 21 | 'remember_token' => str_random(10), 22 | ]; 23 | }); 24 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->string('password'); 21 | $table->rememberToken(); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('users'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token'); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('password_resets'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2015_01_09_003010_create_designs_table.php: -------------------------------------------------------------------------------- 1 | string('id', 36); 17 | $table->string('file', 100); 18 | $table->string('ext', 20); 19 | $table->string('original_name', 200); 20 | $table->string('mime_type', 200); 21 | $table->string('user_agent', 200)->nullable(); 22 | $table->string('ip', 20)->nullable(); 23 | $table->timestamps(); 24 | $table->softDeletes(); 25 | 26 | $table->primary('id'); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | * 33 | * @return void 34 | */ 35 | public function down() 36 | { 37 | Schema::dropIfExists('designs'); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /database/migrations/2015_01_24_110812_FolderInDesigns.php: -------------------------------------------------------------------------------- 1 | char('folder', 8)->after('id'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('designs', function($table){ 28 | $table->dropColumn('folder'); 29 | }); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2015_01_24_140029_RemoveFileInDesigns.php: -------------------------------------------------------------------------------- 1 | dropColumn('file'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('designs', function($table){ 28 | $table->string('file', 100)->after('folder'); 29 | }); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2015_02_06_223012_create_subscription_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 17 | $table->string('mail', 200); 18 | $table->string('design_id', 36); 19 | $table->string('user_agent', 200)->nullable(); 20 | $table->string('ip', 20)->nullable(); 21 | $table->timestamps(); 22 | $table->softDeletes(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('subscriptions'); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2015_08_19_212402_add_platform.php: -------------------------------------------------------------------------------- 1 | string('platform', 255)->default('ios,android')->after('mime_type'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('designs', function($table){ 28 | $table->dropColumn('platform'); 29 | }); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2016_01_21_001526_platform_nullable.php: -------------------------------------------------------------------------------- 1 | text('sizes')->nullable()->after('platform'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('designs', function($table) { 28 | $table->dropColumn('sizes'); 29 | }); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2016_05_02_101619_design-bg-color.php: -------------------------------------------------------------------------------- 1 | text('bg_color')->nullable()->after('sizes'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('designs', function($table) { 28 | $table->dropColumn('bg_color'); 29 | }); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2016_11_23_003237_design_android_folder.php: -------------------------------------------------------------------------------- 1 | text('android_folder')->nullable()->after('bg_color'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('designs', function($table) { 28 | $table->dropColumn('android_folder'); 29 | }); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2016_12_30_005301_design_radius_field.php: -------------------------------------------------------------------------------- 1 | float('radius')->default(0)->nullable()->after('android_folder'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('designs', function (Blueprint $table) { 28 | $table->dropColumn('radius'); 29 | }); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2017_02_21_112542_design_android_name.php: -------------------------------------------------------------------------------- 1 | string('android_name')->nullable()->after('android_folder'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('designs', function (Blueprint $table) { 28 | $table->dropColumn('android_name'); 29 | }); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2017_07_01_011532_requirement_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 17 | 18 | $table->text('title'); 19 | $table->integer('vote')->default(0); 20 | $table->boolean('valid')->default(false); 21 | 22 | $table->timestamps(); 23 | $table->softDeletes(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::drop('requirements'); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /database/migrations/2017_07_01_013830_create_cache_table.php: -------------------------------------------------------------------------------- 1 | string('key')->unique(); 18 | $table->text('value'); 19 | $table->integer('expiration'); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::drop('cache'); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /database/migrations/2017_07_07_174231_requirement_status.php: -------------------------------------------------------------------------------- 1 | dropColumn('valid'); 17 | $table->string('status')->default('new'); 18 | }); 19 | } 20 | 21 | /** 22 | * Reverse the migrations. 23 | * 24 | * @return void 25 | */ 26 | public function down() 27 | { 28 | Schema::table('requirements', function (Blueprint $table) { 29 | $table->dropColumn('status'); 30 | $table->boolean('valid')->default(false); 31 | }); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2019_01_31_101451_create_splash_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('folder', 20); 19 | $table->json('config')->nullable(); 20 | $table->string('user_agent')->nullable(); 21 | $table->string('ip')->nullable(); 22 | $table->timestamps(); 23 | $table->softDeletes(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('splash'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2019_01_31_104316_splash_uuid.php: -------------------------------------------------------------------------------- 1 | uuid('uuid')->after('id'); 17 | }); 18 | } 19 | 20 | /** 21 | * Reverse the migrations. 22 | * 23 | * @return void 24 | */ 25 | public function down() 26 | { 27 | Schema::table('splash', function (Blueprint $table) { 28 | $table->dropColumn('uuid'); 29 | }); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/migrations/2019_08_29_010731_designs_ios_old_formats.php: -------------------------------------------------------------------------------- 1 | dropTimestamps(); 18 | }); 19 | 20 | Schema::table('designs', static function (Blueprint $table) { 21 | $table->string('ios_level', 20)->nullable()->after('bg_color'); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::table('designs', static function (Blueprint $table) { 34 | $table->dropColumn('ios_level'); 35 | }); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call(UsersTableSeeder::class); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | git pull 3 | 4 | composer install 5 | 6 | php artisan migrate --force 7 | php artisan view:clear 8 | php artisan route:clear 9 | php artisan config:clear 10 | php artisan clear-compiled 11 | # 12 | service php-fpm-71 reload 13 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var gulp = require('gulp'), 3 | minifyCss = require('gulp-minify-css'), 4 | uglify = require('gulp-uglify'), 5 | ngAnnotate = require('gulp-ng-annotate'), 6 | concat = require('gulp-concat'), 7 | del = require('del'), 8 | merge = require('merge2'); 9 | 10 | var path = { 11 | dest: './public/', 12 | js_min: [ 13 | 'public/js/lib/material.min.js', 14 | 'public/js/lib/loading-bar.min.js', 15 | 'public/bower/ng-dialog/js/ngDialog.min.js', 16 | 'public/bower/angular-aria/angular-aria.min.js', 17 | 'public/bower/angular-cookies/angular-cookies.min.js', 18 | 'public/bower/tinycolor/dist/tinycolor-min.js', 19 | 'public/bower/angular-material/angular-material.min.js', 20 | 'public/bower/md-color-picker/dist/mdColorPicker.min.js' 21 | ], 22 | js_src: [ 23 | 'public/js/main.js', 24 | 'public/js/app/constant.js', 25 | 'public/js/app/directive.js', 26 | 'public/js/app/core.service.js', 27 | 'public/js/app/root.ctrl.js' 28 | ], 29 | css_src: [ 30 | 'public/css/bootstrap-material-design.min.css', 31 | 'public/css/loading-bar.min.css', 32 | 'public/bower/ng-dialog/css/ngDialog.min.css', 33 | 'public/bower/ng-dialog/css/ngDialog-theme-default.min.css', 34 | 'public/bower/angular-material/angular-material.min.css', 35 | 'public/bower/md-color-picker/dist/mdColorPicker.min.css', 36 | 'public/css/main.css' 37 | ] 38 | }; 39 | 40 | gulp.task('css', function() { 41 | return gulp.src(path.css_src) 42 | .pipe(minifyCss()) 43 | .pipe(concat('all.css')) 44 | .pipe(gulp.dest(path.dest + 'css/')); 45 | }); 46 | 47 | gulp.task('js', function () { 48 | return merge( 49 | gulp.src(path.js_min), 50 | gulp.src(path.js_src) 51 | .pipe(ngAnnotate()) 52 | .pipe(uglify()) 53 | ) 54 | .pipe(concat('all.js')) 55 | .pipe(gulp.dest(path.dest + 'js/')); 56 | }); 57 | 58 | gulp.task('clean', function() { 59 | return new Promise((resolve => { 60 | del.bind(null, [ 61 | path.dest 62 | ]); 63 | resolve(); 64 | })) 65 | }); 66 | 67 | gulp.task('build', gulp.series('clean', gulp.parallel(['css', 'js']))); 68 | 69 | gulp.task('default', gulp.parallel('build')); 70 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.18", 14 | "bootstrap": "^4.0.0", 15 | "cross-env": "^5.1", 16 | "del": "1.1.1", 17 | "graceful-fs": "4.x", 18 | "gulp": "^4.0.2", 19 | "gulp-concat": "^2.6.0", 20 | "gulp-minify-css": "^1.2.0", 21 | "gulp-ng-annotate": "^1.1.0", 22 | "gulp-uglify": "1.2.0", 23 | "jquery": "^3.2", 24 | "laravel-mix": "^2.0", 25 | "lodash": "^4.17.13", 26 | "merge2": "^1.0.2", 27 | "natives": "^1.1.6", 28 | "popper.js": "^1.12", 29 | "stringstream": "^1.0.0", 30 | "vue": "^2.5.7" 31 | }, 32 | "dependencies": {} 33 | } 34 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Feature 14 | 15 | 16 | 17 | ./tests/Unit 18 | 19 | 20 | 21 | 22 | ./app 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Handle Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/css/loading-bar.min.css: -------------------------------------------------------------------------------- 1 | #loading-bar,#loading-bar-spinner{pointer-events:none;-webkit-pointer-events:none;-webkit-transition:350ms linear all;-moz-transition:350ms linear all;-o-transition:350ms linear all;transition:350ms linear all}#loading-bar-spinner.ng-enter,#loading-bar-spinner.ng-leave.ng-leave-active,#loading-bar.ng-enter,#loading-bar.ng-leave.ng-leave-active{opacity:0}#loading-bar-spinner.ng-enter.ng-enter-active,#loading-bar-spinner.ng-leave,#loading-bar.ng-enter.ng-enter-active,#loading-bar.ng-leave{opacity:1}#loading-bar .bar{-webkit-transition:width 350ms;-moz-transition:width 350ms;-o-transition:width 350ms;transition:width 350ms;background:#29d;position:fixed;z-index:10002;top:0;left:0;width:100%;height:2px;border-bottom-right-radius:1px;border-top-right-radius:1px}#loading-bar.light .bar{background-color:#fff}#loading-bar .peg{position:absolute;width:70px;right:0;top:0;height:2px;opacity:.45;-moz-box-shadow:#29d 1px 0 6px 1px;-ms-box-shadow:#29d 1px 0 6px 1px;-webkit-box-shadow:#29d 1px 0 6px 1px;box-shadow:#29d 1px 0 6px 1px;-moz-border-radius:100%;-webkit-border-radius:100%;border-radius:100%}#loading-bar.light .peg{-moz-box-shadow:#fff 6px 0 6px 6px;-ms-box-shadow:#fff 6px 0 6px 6px;-webkit-box-shadow:#fff 6px 0 6px 6px;box-shadow:#fff 6px 0 6px 6px}#loading-bar-spinner{display:block;position:fixed;z-index:10002;top:10px;left:10px}#loading-bar-spinner .spinner-icon{width:14px;height:14px;border:2px solid transparent;border-top-color:#29d;border-left-color:#29d;border-radius:50%;-webkit-animation:loading-bar-spinner .4s linear infinite;-moz-animation:loading-bar-spinner .4s linear infinite;-ms-animation:loading-bar-spinner .4s linear infinite;-o-animation:loading-bar-spinner .4s linear infinite;animation:loading-bar-spinner .4s linear infinite}#loading-bar-spinner.light .spinner-icon{border-top-color:#fff;border-left-color:#fff}@-webkit-keyframes loading-bar-spinner{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes loading-bar-spinner{0%{-moz-transform:rotate(0);transform:rotate(0)}100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes loading-bar-spinner{0%{-o-transform:rotate(0);transform:rotate(0)}100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes loading-bar-spinner{0%{-ms-transform:rotate(0);transform:rotate(0)}100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes loading-bar-spinner{0%{transform:rotate(0)}100%{transform:rotate(360deg)}} -------------------------------------------------------------------------------- /public/dist/spa-mat/css/28dc6382.58b2f089.css: -------------------------------------------------------------------------------- 1 | .loading-modal .modal-content{padding:20px}.loading-modal .modal-content .loading{margin:20px 0 0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.loading-modal-ad-ins{display:inline-block;margin:0 auto;width:300px;height:250px}.download-dialog .modal-body.modal-scroll{max-height:300px}.download-dialog-ad-ins{display:block;margin:0 auto;width:336px;height:280px}.splash-layout-header{overflow-x:auto}.splash-layout-header .q-toolbar{min-width:680px}.splash-layout-header .q-field-label{width:auto;padding-right:0}.splash-layout-header .q-field-content{width:auto}.splash-layout-header .q-option-label{margin-left:4px}.splash-layout-left-drawer .q-list.devices{padding:0;margin-left:-10px;margin-right:-10px}.splash-layout-left-drawer .q-list.devices .q-item{padding:8px 10px 5px}.splash-layout-left-drawer .q-list.devices .q-item-image{width:40px;min-width:40px}.splash-layout-left-drawer .ps-container{padding:10px;height:calc(100vh - 52px)}.splash-layout-left-drawer .q-field .q-if-inner>.relative-position{width:100%}.objects-list .q-item{padding:8px 0;cursor:pointer}.objects-list .q-item.selected{background:hsla(0,0%,58.8%,.4)}.objects-list .q-item.tip{font-size:12px;color:silver;text-align:center;cursor:default;background:#fff}.objects-list .q-item .q-item-side{margin-left:8px;width:40px;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex}.objects-list .q-item .q-item-side>img{max-width:40px;max-height:31px}.objects-list .q-item .q-item-side.q-item-side-right{width:auto;min-width:27px;margin-left:3px;margin-right:4px}.objects-list .q-item .q-item-main{margin-left:6px}.objects-list .flip-list-move{-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.object-setting-tab{height:300px;margin-top:auto}.splash-layout-right-drawer .q-layout-drawer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.splash-layout-right-drawer .tabs-layers .ps-container{height:calc(100vh - 67px);overflow:auto}.splash-layout-right-drawer.selected .tabs-layers .ps-container{height:calc(100vh - 367px)} -------------------------------------------------------------------------------- /public/dist/spa-mat/css/3cd81c0b.56e91f79.css: -------------------------------------------------------------------------------- 1 | .device-object{position:absolute;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.device-object.inactive{opacity:.5}.device-object.active{cursor:move;outline:3px solid rgba(2,123,227,.5)}.device-object.no-interact{pointer-events:none}.device-object img{-webkit-user-drag:none}.splash-device-box{-webkit-transition:all .3s;transition:all .3s;background:#fff;-webkit-box-shadow:0 0 20px silver;box-shadow:0 0 20px silver;position:absolute}.splash-device-box .device-border{position:absolute;left:0;top:0;outline:1px solid #666;-webkit-box-shadow:#666 0 0 30px;box-shadow:0 0 30px #666;pointer-events:none}.splash-page-index{background:#ccc}.splash-page-index>.ps-container{width:100%;height:calc(100vh - 50px)}.splash-page-index>.ps-container .center-container{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;height:100%} -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/KFOkCnqEu92Fr1MmgVxIIzQ.e9dbbe8a.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/KFOkCnqEu92Fr1MmgVxIIzQ.e9dbbe8a.woff -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.de8b7431.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/KFOlCnqEu92Fr1MmEU9fBBc-.de8b7431.woff -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.a1471d1d.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/KFOlCnqEu92Fr1MmSU5fBBc-.a1471d1d.woff -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.cf6613d1.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/KFOlCnqEu92Fr1MmWUlfBBc-.cf6613d1.woff -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/KFOlCnqEu92Fr1MmYUtfBBc-.8c2ade50.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/KFOlCnqEu92Fr1MmYUtfBBc-.8c2ade50.woff -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/KFOmCnqEu92Fr1Mu4mxM.bafb105b.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/KFOmCnqEu92Fr1Mu4mxM.bafb105b.woff -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.c38ebd3c.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNa.c38ebd3c.woff -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.8a9a261c.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/flUhRq6tzZclQEJ-Vdg-IuiaDsNcIhQ8tQ.8a9a261c.woff2 -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/mdi.45911874.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/mdi.45911874.woff2 -------------------------------------------------------------------------------- /public/dist/spa-mat/fonts/mdi.4b882ad4.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/fonts/mdi.4b882ad4.woff -------------------------------------------------------------------------------- /public/dist/spa-mat/index.html: -------------------------------------------------------------------------------- 1 | 图标工场
-------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/huaweiP30pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/huaweiP30pro.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/iPad.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/iPhone8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/iPhone8.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/iPhone8Plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/iPhone8Plus.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/iPhoneSE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/iPhoneSE.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/iPhoneX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/iPhoneX.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/iPhoneXR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/iPhoneXR.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/oneplus5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/oneplus5.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/devices/oneplus7Pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/devices/oneplus7Pro.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icon.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/apple-icon-152x152.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/favicon-16x16.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/favicon-32x32.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/icon-128x128.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/icon-192x192.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/icon-256x256.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/icon-384x384.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/icon-512x512.png -------------------------------------------------------------------------------- /public/dist/spa-mat/statics/icons/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/dist/spa-mat/statics/icons/ms-icon-144x144.png -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/favicon.ico -------------------------------------------------------------------------------- /public/files/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /public/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/img/AliPay_sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/AliPay_sm.png -------------------------------------------------------------------------------- /public/img/WeChatPay_sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/WeChatPay_sm.png -------------------------------------------------------------------------------- /public/img/android.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/android.png -------------------------------------------------------------------------------- /public/img/eye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/eye.png -------------------------------------------------------------------------------- /public/img/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/folder.png -------------------------------------------------------------------------------- /public/img/guide/android_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/guide/android_1.jpg -------------------------------------------------------------------------------- /public/img/guide/android_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/guide/android_2.jpg -------------------------------------------------------------------------------- /public/img/guide/android_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/guide/android_3.jpg -------------------------------------------------------------------------------- /public/img/guide/android_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/guide/android_4.jpg -------------------------------------------------------------------------------- /public/img/guide/ios_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/guide/ios_1.jpg -------------------------------------------------------------------------------- /public/img/guide/ios_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/guide/ios_2.jpg -------------------------------------------------------------------------------- /public/img/guide/ios_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/guide/ios_3.jpg -------------------------------------------------------------------------------- /public/img/guide/ios_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/guide/ios_4.jpg -------------------------------------------------------------------------------- /public/img/ios8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/ios8.png -------------------------------------------------------------------------------- /public/img/iphone6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/iphone6.png -------------------------------------------------------------------------------- /public/img/iphonescreenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/iphonescreenshot.png -------------------------------------------------------------------------------- /public/img/iphonex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/iphonex.png -------------------------------------------------------------------------------- /public/img/launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/launcher.png -------------------------------------------------------------------------------- /public/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/loading.gif -------------------------------------------------------------------------------- /public/img/mac.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/mac.jpg -------------------------------------------------------------------------------- /public/img/nexus5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/nexus5.png -------------------------------------------------------------------------------- /public/img/opt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/opt.png -------------------------------------------------------------------------------- /public/img/osx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/osx.png -------------------------------------------------------------------------------- /public/img/splash/demo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/splash/demo.mp4 -------------------------------------------------------------------------------- /public/img/watch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/watch.png -------------------------------------------------------------------------------- /public/img/webapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/webapp.png -------------------------------------------------------------------------------- /public/img/windowsphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/public/img/windowsphone.png -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | define('LARAVEL_START', microtime(true)); 11 | 12 | /* 13 | |-------------------------------------------------------------------------- 14 | | Register The Auto Loader 15 | |-------------------------------------------------------------------------- 16 | | 17 | | Composer provides a convenient, automatically generated class loader for 18 | | our application. We just need to utilize it! We'll simply require it 19 | | into the script here so that we don't have to worry about manual 20 | | loading any of our classes later on. It feels great to relax. 21 | | 22 | */ 23 | 24 | require __DIR__.'/../vendor/autoload.php'; 25 | 26 | /* 27 | |-------------------------------------------------------------------------- 28 | | Turn On The Lights 29 | |-------------------------------------------------------------------------- 30 | | 31 | | We need to illuminate PHP development, so let us turn on the lights. 32 | | This bootstraps the framework and gets it ready for use, then it 33 | | will load up this application so that we can run it and send 34 | | the responses back to the browser and delight our users. 35 | | 36 | */ 37 | 38 | $app = require_once __DIR__.'/../bootstrap/app.php'; 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Run The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once we have the application, we can handle the incoming request 46 | | through the kernel, and send the associated response back to 47 | | the client's browser allowing them to enjoy the creative 48 | | and wonderful application we have prepared for them. 49 | | 50 | */ 51 | 52 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 53 | 54 | $response = $kernel->handle( 55 | $request = Illuminate\Http\Request::capture() 56 | ); 57 | 58 | $response->send(); 59 | 60 | $kernel->terminate($request, $response); 61 | -------------------------------------------------------------------------------- /public/js/app/admin.ctrl.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 'use strict'; 3 | angular.module('rhIcon') 4 | .controller('AdminCtrl', function($scope, $http, CoreService) { 5 | $scope.validated = false; 6 | 7 | $scope.login = function () { 8 | if (!$scope.validated) { 9 | return; 10 | } 11 | $scope.validated.password = $scope.password; 12 | $http.post('/admin/login', $scope.validated).success(function (r) { 13 | CoreService.resCallback(r, function (d) { 14 | console.log(d); 15 | }); 16 | }); 17 | }; 18 | }); 19 | })(); -------------------------------------------------------------------------------- /public/js/app/constant.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 'use strict'; 3 | angular.module('rhIcon') 4 | .constant('$platforms', { 5 | ios: { 6 | name: 'iOS', 7 | folder: 'ios/AppIcon.appiconset' 8 | }, 9 | android: { 10 | name: 'Android', 11 | folder: 'android' 12 | }, 13 | windowsphone: { 14 | name: 'Windows Phone', 15 | folder: 'windowsphone' 16 | }, 17 | mac: { 18 | name: 'macOS', 19 | folder: 'mac/AppIcon.appiconset' 20 | }, 21 | iwatch: { 22 | name: 'iWatch', 23 | folder: 'iwatch/AppIcon.appiconset' 24 | }, 25 | webapp: { 26 | name: 'Web App', 27 | folder: 'webapp' 28 | }, 29 | phonegap: { 30 | name: 'PhoneGap (Cordova)', 31 | folder: 'phonegap' 32 | }, 33 | quasar: { 34 | name: 'Quasar', 35 | folder: 'quasar' 36 | }, 37 | custom: { 38 | name: '自定义', 39 | folder: 'custom' 40 | } 41 | }); 42 | })(); 43 | -------------------------------------------------------------------------------- /public/js/app/core.service.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 'use strict'; 3 | angular.module('rhIcon') 4 | .service('CoreService', function(){ 5 | this.resCallback = function(response, successCallback, failCallback){ 6 | try { 7 | var json = response; 8 | if (typeof(response) == 'string') { 9 | json = JSON.parse(response); 10 | } 11 | if (!json.success) { 12 | swal({ 13 | title : json.message, 14 | type : 'error', 15 | confirmButtonText : '确定' 16 | }, failCallback); 17 | } else { 18 | if (typeof(successCallback) == 'function') { 19 | successCallback(json.data); 20 | } 21 | } 22 | } catch (e) { 23 | failCallback(true, e); 24 | console.log(response); 25 | console.log(e); 26 | throw e; 27 | } 28 | }; 29 | }); 30 | })(); -------------------------------------------------------------------------------- /public/js/app/directive.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 'use strict'; 3 | angular.module('rhIcon') 4 | .directive('focusLast', function ($timeout) { 5 | return { 6 | restrict : 'A', 7 | link : function($scope, el) { 8 | if ($scope.$last) { 9 | $timeout(function () { 10 | el.focus().select(); 11 | }); 12 | } 13 | } 14 | }; 15 | }); 16 | })(); -------------------------------------------------------------------------------- /public/js/app/root.ctrl.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 'use strict'; 3 | angular.module('rhIcon') 4 | .controller('RootCtrl', function($scope, $state, $platforms){ 5 | $scope.$platforms = $platforms; 6 | 7 | $scope.stateCls = function (state) { 8 | if (window.state == state) { 9 | return 'active'; 10 | } 11 | return $state.is(state) ? 'active' : ''; 12 | }; 13 | }); 14 | })(); -------------------------------------------------------------------------------- /public/js/app/vote.ctrl.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 'use strict'; 3 | angular.module('rhIcon') 4 | .controller('VoteCtrl', function($scope, $state, $http){ 5 | $scope.newRequirement = ''; 6 | 7 | $scope.submit = function () { 8 | $http.post('/vote', { 9 | title: $scope.newRequirement 10 | }).success(function () { 11 | swal('', '提交成功!审核通过后就可以投票了', 'success'); 12 | }); 13 | }; 14 | }); 15 | })(); -------------------------------------------------------------------------------- /public/js/lib/html5shiv.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @preserve HTML5 Shiv 3.7.2 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed 3 | */ 4 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.2",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b)}(this,document); -------------------------------------------------------------------------------- /public/js/lib/ie10-viewport-bug-workaround.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014 Twitter, Inc. 4 | * Licensed under the Creative Commons Attribution 3.0 Unported License. For 5 | * details, see http://creativecommons.org/licenses/by/3.0/. 6 | */ 7 | 8 | // See the Getting Started docs for more information: 9 | // http://getbootstrap.com/getting-started/#support-ie10-width 10 | 11 | (function () { 12 | 'use strict'; 13 | if (navigator.userAgent.match(/IEMobile\/10\.0/)) { 14 | var msViewportStyle = document.createElement('style') 15 | msViewportStyle.appendChild( 16 | document.createTextNode( 17 | '@-ms-viewport{width:auto!important}' 18 | ) 19 | ) 20 | document.querySelector('head').appendChild(msViewportStyle) 21 | } 22 | })(); 23 | -------------------------------------------------------------------------------- /public/js/main.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 'use strict'; 3 | angular.module('rhIcon', [ 4 | 'ui.router', 5 | 'ui.bootstrap', 6 | 'angular-loading-bar', 7 | 'ngAnimate', 8 | 'ngDialog', 9 | 'ngMaterial', 10 | 'ngCookies', 11 | 'mdColorPicker' 12 | ]).config(function( cfpLoadingBarProvider){ 13 | cfpLoadingBarProvider.lightTheme = true; 14 | }).run(function($rootScope, cfpLoadingBar){ 15 | $rootScope.$on('$stateChangeStart', function() { 16 | cfpLoadingBar.start(); 17 | }); 18 | 19 | $rootScope.$on('$stateChangeSuccess', function() { 20 | cfpLoadingBar.complete(); 21 | }); 22 | }).run(function ($rootScope, $state, $stateParams) { 23 | $rootScope.$state = $state; 24 | $rootScope.$stateParams = $stateParams; 25 | }); 26 | 27 | $.material.init(); 28 | })(); 29 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/views/admin/dashboard.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

管理后台

4 | 5 |
6 |
7 | -------------------------------------------------------------------------------- /public/views/admin/index.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |

管理后台

4 |
5 |
6 | 7 |
8 | 9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 | 19 |
20 |
21 |
22 |
23 |
24 | 25 | 26 | 42 | -------------------------------------------------------------------------------- /public/views/icon/detail.custom.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
6 | 7 |
8 | 9 |
10 | -------------------------------------------------------------------------------- /public/views/icon/download.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 9 | 12 | 13 |
14 | 15 | 16 | 立即下载 17 | 18 |
-------------------------------------------------------------------------------- /public/views/icon/generate.html: -------------------------------------------------------------------------------- 1 |
2 | 该图标尚未生成或者已经过期. 即将为您重新生成:
3 | 7 |
-------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /resources/assets/js/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * First we will load all of this project's JavaScript dependencies which 4 | * includes Vue and other libraries. It is a great starting point when 5 | * building robust, powerful web applications using Vue and Laravel. 6 | */ 7 | 8 | require('./bootstrap'); 9 | 10 | window.Vue = require('vue'); 11 | 12 | /** 13 | * Next, we will create a fresh Vue application instance and attach it to 14 | * the page. Then, you may begin adding components to this application 15 | * or customize the JavaScript scaffolding to fit your unique needs. 16 | */ 17 | 18 | Vue.component('example-component', require('./components/ExampleComponent.vue')); 19 | 20 | const app = new Vue({ 21 | el: '#app' 22 | }); 23 | -------------------------------------------------------------------------------- /resources/assets/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | 2 | window._ = require('lodash'); 3 | window.Popper = require('popper.js').default; 4 | 5 | /** 6 | * We'll load jQuery and the Bootstrap jQuery plugin which provides support 7 | * for JavaScript based Bootstrap features such as modals and tabs. This 8 | * code may be modified to fit the specific needs of your application. 9 | */ 10 | 11 | try { 12 | window.$ = window.jQuery = require('jquery'); 13 | 14 | require('bootstrap'); 15 | } catch (e) {} 16 | 17 | /** 18 | * We'll load the axios HTTP library which allows us to easily issue requests 19 | * to our Laravel back-end. This library automatically handles sending the 20 | * CSRF token as a header based on the value of the "XSRF" token cookie. 21 | */ 22 | 23 | window.axios = require('axios'); 24 | 25 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 26 | 27 | /** 28 | * Next we will register the CSRF Token as a common header with Axios so that 29 | * all outgoing HTTP requests automatically have it attached. This is just 30 | * a simple convenience so we don't have to attach every token manually. 31 | */ 32 | 33 | let token = document.head.querySelector('meta[name="csrf-token"]'); 34 | 35 | if (token) { 36 | window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; 37 | } else { 38 | console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); 39 | } 40 | 41 | /** 42 | * Echo exposes an expressive API for subscribing to channels and listening 43 | * for events that are broadcast by Laravel. Echo and event broadcasting 44 | * allows your team to easily build robust real-time web applications. 45 | */ 46 | 47 | // import Echo from 'laravel-echo' 48 | 49 | // window.Pusher = require('pusher-js'); 50 | 51 | // window.Echo = new Echo({ 52 | // broadcaster: 'pusher', 53 | // key: process.env.MIX_PUSHER_APP_KEY, 54 | // cluster: process.env.MIX_PUSHER_APP_CLUSTER, 55 | // encrypted: true 56 | // }); 57 | -------------------------------------------------------------------------------- /resources/assets/js/components/ExampleComponent.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 24 | -------------------------------------------------------------------------------- /resources/assets/sass/_variables.scss: -------------------------------------------------------------------------------- 1 | 2 | // Body 3 | $body-bg: #f5f8fa; 4 | 5 | // Typography 6 | $font-family-sans-serif: "Raleway", sans-serif; 7 | $font-size-base: 0.9rem; 8 | $line-height-base: 1.6; 9 | -------------------------------------------------------------------------------- /resources/assets/sass/app.scss: -------------------------------------------------------------------------------- 1 | 2 | // Fonts 3 | @import url("https://fonts.googleapis.com/css?family=Raleway:300,400,600"); 4 | 5 | // Variables 6 | @import "variables"; 7 | 8 | // Bootstrap 9 | @import '~bootstrap/scss/bootstrap'; 10 | 11 | .navbar-laravel { 12 | background-color: #fff; 13 | box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04); 14 | } 15 | -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Passwords must be at least six characters and match the confirmation.', 17 | 'reset' => 'Your password has been reset!', 18 | 'sent' => 'We have e-mailed your password reset link!', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that e-mail address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/ui/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", { 5 | "modules": false, 6 | "loose": false, 7 | "useBuiltIns": "usage" 8 | } 9 | ], 10 | [ 11 | "@babel/preset-stage-2", { 12 | "modules": false, 13 | "loose": false, 14 | "useBuiltIns": true, 15 | "decoratorsLegacy": true 16 | } 17 | ] 18 | ], 19 | "plugins": [ 20 | [ 21 | "@babel/transform-runtime", { 22 | "polyfill": false, 23 | "regenerator": false 24 | } 25 | ] 26 | ], 27 | "comments": false 28 | } 29 | -------------------------------------------------------------------------------- /resources/ui/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /resources/ui/.eslintignore: -------------------------------------------------------------------------------- 1 | /dist 2 | -------------------------------------------------------------------------------- /resources/ui/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | parserOptions: { 4 | parser: 'babel-eslint', 5 | sourceType: 'module' 6 | }, 7 | env: { 8 | browser: true 9 | }, 10 | extends: [ 11 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention 12 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. 13 | 'plugin:vue/essential', 14 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 15 | 'standard' 16 | ], 17 | // required to lint *.vue files 18 | plugins: [ 19 | 'vue' 20 | ], 21 | globals: { 22 | 'ga': true, // Google Analytics 23 | 'cordova': true, 24 | '__statics': true 25 | }, 26 | // add your custom rules here 27 | 'rules': { 28 | // allow async-await 29 | 'generator-star-spacing': 'off', 30 | 31 | // allow paren-less arrow functions 32 | 'arrow-parens': 0, 33 | 'one-var': 0, 34 | 35 | 'import/first': 0, 36 | 'import/named': 2, 37 | 'import/namespace': 2, 38 | 'import/default': 2, 39 | 'import/export': 2, 40 | 'import/extensions': 0, 41 | 'import/no-unresolved': 0, 42 | 'import/no-extraneous-dependencies': 0, 43 | 44 | // allow debugger during development 45 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /resources/ui/.gitignore: -------------------------------------------------------------------------------- 1 | .quasar 2 | .DS_Store 3 | .thumbs.db 4 | node_modules 5 | /dist 6 | /src-cordova/node_modules 7 | /src-cordova/platforms 8 | /src-cordova/plugins 9 | /src-cordova/www 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | -------------------------------------------------------------------------------- /resources/ui/.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | plugins: [ 5 | // to edit target browsers: use "browserslist" field in package.json 6 | require('autoprefixer') 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /resources/ui/.stylintrc: -------------------------------------------------------------------------------- 1 | { 2 | "blocks": "never", 3 | "brackets": "never", 4 | "colons": "never", 5 | "colors": "always", 6 | "commaSpace": "always", 7 | "commentSpace": "always", 8 | "cssLiteral": "never", 9 | "depthLimit": false, 10 | "duplicates": true, 11 | "efficient": "always", 12 | "extendPref": false, 13 | "globalDupe": true, 14 | "indentPref": 2, 15 | "leadingZero": "never", 16 | "maxErrors": false, 17 | "maxWarnings": false, 18 | "mixed": false, 19 | "namingConvention": false, 20 | "namingConventionStrict": false, 21 | "none": "never", 22 | "noImportant": false, 23 | "parenSpace": "never", 24 | "placeholder": false, 25 | "prefixVarsWithDollar": "always", 26 | "quotePref": "single", 27 | "semicolons": "never", 28 | "sortOrder": false, 29 | "stackedProperties": "never", 30 | "trailingWhitespace": "never", 31 | "universal": "never", 32 | "valid": true, 33 | "zeroUnits": "never", 34 | "zIndexNormalize": false 35 | } 36 | -------------------------------------------------------------------------------- /resources/ui/README.md: -------------------------------------------------------------------------------- 1 | # Quasar App 2 | 3 | > WIP 4 | -------------------------------------------------------------------------------- /resources/ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "icon-factory-ui", 3 | "version": "1.0.0", 4 | "description": "图标工场 - 移动应用图标生成工具,一键生成所有尺寸的应用图标", 5 | "productName": "图标工场", 6 | "cordovaId": "com.wuruihong.icon", 7 | "author": "Hans Zhang ", 8 | "private": true, 9 | "scripts": { 10 | "lint": "eslint --ext .js,.vue src", 11 | "test": "echo \"No test specified\" && exit 0", 12 | "dev": "quasar dev -t mat -m spa", 13 | "build": "quasar build -t mat -m spa" 14 | }, 15 | "dependencies": { 16 | "await-to-js": "^2.1.1", 17 | "axios": "^0.19.0", 18 | "marvel-devices.css": "^1.0.0", 19 | "moment": "^2.23.0", 20 | "perfect-scrollbar": "^1.4.0", 21 | "qs": "^6.6.0", 22 | "screenfull": "^4.0.1", 23 | "uuid": "^3.3.2", 24 | "vue-google-adsense": "^1.4.5", 25 | "vue-i18n": "^7.3.3", 26 | "vue-perfect-scrollbar": "^0.1.0", 27 | "vue-script2": "^2.0.3", 28 | "vuedraggable": "^2.23.0", 29 | "vuelidate": "^0.7.4", 30 | "vuex-persistedstate": "^2.5.4" 31 | }, 32 | "devDependencies": { 33 | "babel-eslint": "^8.2.1", 34 | "eslint": "^4.18.2", 35 | "eslint-config-standard": "^11.0.0", 36 | "eslint-friendly-formatter": "^4.0.1", 37 | "eslint-loader": "^2.0.0", 38 | "eslint-plugin-import": "^2.9.0", 39 | "eslint-plugin-node": "^6.0.1", 40 | "eslint-plugin-promise": "^3.7.0", 41 | "eslint-plugin-standard": "^3.0.1", 42 | "eslint-plugin-vue": "^4.3.0", 43 | "fstream": "^1.0.12", 44 | "js-yaml": "^3.13.1", 45 | "node-sass": "^4.10.0", 46 | "quasar-cli": "^0.17.0", 47 | "sass-loader": "^7.1.0", 48 | "strip-ansi": "=3.0.1", 49 | "webpack-bundle-analyzer": "^3.3.2", 50 | "webpack-dev-server": "^3.1.11" 51 | }, 52 | "engines": { 53 | "node": ">= 8.9.0", 54 | "npm": ">= 5.6.0", 55 | "yarn": ">= 1.6.0" 56 | }, 57 | "browserslist": [ 58 | "> 1%", 59 | "last 2 versions", 60 | "not ie <= 10" 61 | ] 62 | } 63 | -------------------------------------------------------------------------------- /resources/ui/src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 19 | -------------------------------------------------------------------------------- /resources/ui/src/components/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/components/.gitkeep -------------------------------------------------------------------------------- /resources/ui/src/components/DownloadDialog.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 81 | 82 | 96 | -------------------------------------------------------------------------------- /resources/ui/src/components/LoadingModal.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 40 | 41 | 61 | -------------------------------------------------------------------------------- /resources/ui/src/components/Splash/DeviceBox.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 58 | 59 | 76 | -------------------------------------------------------------------------------- /resources/ui/src/components/Splash/ObjectSetting.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 64 | 65 | 71 | -------------------------------------------------------------------------------- /resources/ui/src/const.js: -------------------------------------------------------------------------------- 1 | export default { 2 | } 3 | -------------------------------------------------------------------------------- /resources/ui/src/css/_variable.scss: -------------------------------------------------------------------------------- 1 | $primary: #027be3; 2 | $light-primary: rgba(2, 123, 227, 0.5); -------------------------------------------------------------------------------- /resources/ui/src/css/app.styl: -------------------------------------------------------------------------------- 1 | // app global css 2 | -------------------------------------------------------------------------------- /resources/ui/src/css/main.scss: -------------------------------------------------------------------------------- 1 | .mdi-inactive { 2 | color: #ccc; 3 | } 4 | 5 | .q-tab.horizontal { 6 | flex-direction: row; 7 | min-height: 52px; 8 | 9 | .q-tab-label-parent { 10 | margin-top: 0; 11 | margin-left: 6px; 12 | } 13 | } 14 | 15 | .on-left { 16 | margin-right: 8px; 17 | } 18 | 19 | .q-field.field-content-center { 20 | .q-field-content { 21 | text-align: center; 22 | } 23 | } 24 | 25 | .q-field.field-content-right { 26 | .q-field-content { 27 | text-align: right; 28 | } 29 | } 30 | 31 | .q-field { 32 | position: relative; 33 | 34 | .right-label { 35 | position: absolute; 36 | top: 0; 37 | right: 0; 38 | line-height: 28px; 39 | font-weight: bold; 40 | color: var(--q-color-primary); 41 | 42 | .q-btn { 43 | margin-top: -2px; 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /resources/ui/src/css/themes/common.variables.styl: -------------------------------------------------------------------------------- 1 | // App Shared Variables 2 | // -------------------------------------------------- 3 | // To customize the look and feel of this app, you can override 4 | // the Stylus variables found in Quasar's source Stylus files. Setting 5 | // variables before Quasar's Stylus will use these variables rather than 6 | // Quasar's default Stylus variable values. Stylus variables specific 7 | // to the themes belong in either the variables.ios.styl or variables.mat.styl files. 8 | 9 | // Check documentation for full list of Quasar variables 10 | 11 | 12 | // App Shared Color Variables 13 | // -------------------------------------------------- 14 | // It's highly recommended to change the default colors 15 | // to match your app's branding. 16 | 17 | $primary = #027be3 18 | $secondary = #26A69A 19 | $tertiary = #555 20 | 21 | $neutral = #E0E1E2 22 | $positive = #21BA45 23 | $negative = #DB2828 24 | $info = #31CCEC 25 | $warning = #F2C037 26 | -------------------------------------------------------------------------------- /resources/ui/src/css/themes/variables.ios.styl: -------------------------------------------------------------------------------- 1 | // App Shared Variables 2 | // -------------------------------------------------- 3 | // Shared Stylus variables go in the common.variables.styl file 4 | @import 'common.variables' 5 | 6 | // iOS only Quasar variables overwrites 7 | // ----------------------------------------- 8 | -------------------------------------------------------------------------------- /resources/ui/src/css/themes/variables.mat.styl: -------------------------------------------------------------------------------- 1 | // App Shared Variables 2 | // -------------------------------------------------- 3 | // Shared Stylus variables go in the common.variables.styl file 4 | @import 'common.variables' 5 | 6 | // Material only Quasar variables overwrites 7 | // ----------------------------------------- 8 | -------------------------------------------------------------------------------- /resources/ui/src/i18n/en-us/index.js: -------------------------------------------------------------------------------- 1 | // This is just an example, 2 | // so you can safely delete all default props below 3 | 4 | export default { 5 | failed: 'Action failed', 6 | success: 'Action was successful' 7 | } 8 | -------------------------------------------------------------------------------- /resources/ui/src/i18n/index.js: -------------------------------------------------------------------------------- 1 | import enUS from './en-us' 2 | 3 | export default { 4 | 'en-us': enUS 5 | } 6 | -------------------------------------------------------------------------------- /resources/ui/src/index.template.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <%= htmlWebpackPlugin.options.productName %> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | -------------------------------------------------------------------------------- /resources/ui/src/layouts/SplashLayout/Index.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 37 | 38 | 40 | -------------------------------------------------------------------------------- /resources/ui/src/mixins/Key.js: -------------------------------------------------------------------------------- 1 | export default { 2 | data () { 3 | return { 4 | key: +new Date() 5 | } 6 | }, 7 | methods: { 8 | keyed () { 9 | this.key = +new Date() 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /resources/ui/src/mixins/Singleton.js: -------------------------------------------------------------------------------- 1 | import moment from 'moment' 2 | import _ from 'lodash' 3 | 4 | const time = moment.unix() 5 | const name = `singleton-component-${time}` 6 | 7 | export default { 8 | name, 9 | data () { 10 | return { 11 | visible: false, 12 | origin: null, 13 | entity: null 14 | } 15 | }, 16 | methods: { 17 | show () {}, 18 | _preShow () {}, 19 | _show (arg = {}) { 20 | this._preShow(arg) 21 | this.visible = true 22 | this.origin = arg 23 | if (!('_cb' in arg)) { 24 | this.entity = _.cloneDeep(arg) 25 | } else { 26 | this.entity = null 27 | } 28 | this.show(arg) 29 | }, 30 | hide () {}, 31 | _preHide () {}, 32 | _hide (arg = {}) { 33 | this._preHide(arg) 34 | this.visible = false 35 | this.entity = null 36 | this.hide(arg) 37 | } 38 | }, 39 | mounted () { 40 | this.$root.$on(`show-${this.$options.name}`, this._show) 41 | this.$root.$on(`hide-${this.$options.name}`, this._hide) 42 | }, 43 | beforeDestroy () { 44 | this.$root.$off(`show-${this.$options.name}`, this._show) 45 | this.$root.$off(`hide-${this.$options.name}`, this._hide) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /resources/ui/src/mixins/Splash.js: -------------------------------------------------------------------------------- 1 | export default { 2 | computed: { 3 | splash () { 4 | return this.$store.state.Splash 5 | }, 6 | scene () { 7 | return this.$store.state.Splash.scene 8 | }, 9 | baseScale () { 10 | const width = this.splash.width 11 | const height = this.splash.height 12 | const short = Math.min(width, height) 13 | let baseScale = short / 375 14 | 15 | const rate = width / height 16 | if (rate >= 1) { 17 | baseScale *= 0.625 18 | } else if (rate >= 0.75) { 19 | baseScale *= 0.75 20 | } else if (rate >= 0.66) { 21 | baseScale *= 0.875 22 | } 23 | 24 | return baseScale 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /resources/ui/src/models/Base.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import guid from 'uuid/v4' 3 | 4 | /** 5 | * @class Base 6 | * @property {string} id guid 7 | * @property {string} proto 8 | * @property {boolean} hidden 9 | */ 10 | export default class Base { 11 | /** 12 | * @param {object} options 13 | * @constructor 14 | */ 15 | constructor (options = {}) { 16 | _.assignIn(this, { 17 | id: guid(), 18 | proto: 'Base', 19 | hidden: false 20 | }, options) 21 | } 22 | 23 | clone () { 24 | const n = _.clone(this) 25 | n.id = guid() 26 | return n 27 | } 28 | 29 | get description () { 30 | return this.proto 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /resources/ui/src/models/Objects/BaseObject.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import Base from '../Base' 3 | 4 | /** 5 | * @extends Base 6 | * @property {float} left 7 | * @property {float} top 8 | * @property {float} width 9 | * @property {float} height 10 | * @property {float} scale 11 | * @property {number} version 12 | */ 13 | export default class BaseObject extends Base { 14 | /** 15 | * @param {object} options 16 | * @constructor 17 | */ 18 | constructor (options = {}) { 19 | super(options) 20 | _.assignIn(this, { 21 | proto: 'BaseObject', 22 | left: 50, 23 | top: 50, 24 | width: undefined, 25 | height: undefined, 26 | scale: 1, 27 | version: 0 28 | }, options) 29 | } 30 | 31 | position () { 32 | return { 33 | left: this.left, 34 | top: this.top 35 | } 36 | } 37 | 38 | size () { 39 | return { 40 | width: this.width, 41 | height: this.height 42 | } 43 | } 44 | 45 | get description () { 46 | return '对象' 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /resources/ui/src/models/Objects/Image.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import BaseObject from './BaseObject' 3 | 4 | /** 5 | * @extends BaseObject 6 | * @property {string} url - Image url 7 | */ 8 | export default class Image extends BaseObject { 9 | /** 10 | * @param {object} options 11 | * @constructor 12 | */ 13 | constructor (options = {}) { 14 | super(options) 15 | _.assignIn(this, { 16 | proto: 'Image', 17 | url: null 18 | }, options) 19 | } 20 | 21 | get description () { 22 | return '图片' 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /resources/ui/src/models/Objects/index.js: -------------------------------------------------------------------------------- 1 | const files = require.context('.', false, /\.js/) 2 | const entries = {} 3 | 4 | files.keys().forEach(key => { 5 | if (key === './index.js') return 6 | entries[key.replace(/(\.\/|\.js)/g, '')] = files(key).default 7 | }) 8 | 9 | export default entries 10 | -------------------------------------------------------------------------------- /resources/ui/src/models/Scene.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import Base from './Base' 3 | 4 | /** 5 | * @extends Base 6 | * @property {string} backgroundColor '#ffffff' 7 | * @property {array} platforms ['ios', 'android'] 8 | * @property {array} orientations ['portrait', 'landscape'] 9 | */ 10 | export default class Scene extends Base { 11 | /** 12 | * @param {object} options 13 | * @constructor 14 | */ 15 | constructor (options = {}) { 16 | super(options) 17 | _.assignIn(this, { 18 | proto: 'Scene', 19 | backgroundColor: '#ffffff', 20 | platforms: ['ios', 'android'], 21 | orientations: ['portrait', 'landscape'], 22 | hidden: false, 23 | objects: [] 24 | }, options) 25 | } 26 | 27 | clone () { 28 | const n = super.clone() 29 | n.objects = this.objects.map(v => v.clone()) 30 | return n 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /resources/ui/src/models/index.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import Base from './Base' 3 | import Scene from './Scene' 4 | import Objects from './Objects' 5 | 6 | const classes = { 7 | Base, 8 | Scene, 9 | ...Objects 10 | } 11 | 12 | function deserialize (object) { 13 | if (!object || !object.proto) { 14 | return object 15 | } 16 | const proto = object.proto 17 | if (!classes[proto]) { 18 | return object 19 | } 20 | const inst = new classes[proto](object) 21 | _.forEach(inst, v => { 22 | if (_.isArray(v)) { 23 | _.forEach(v, (_v, _k) => { 24 | v[_k] = deserialize(_v) 25 | }) 26 | } 27 | }) 28 | return inst 29 | } 30 | 31 | export { 32 | deserialize 33 | } 34 | -------------------------------------------------------------------------------- /resources/ui/src/pages/Error404.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 23 | -------------------------------------------------------------------------------- /resources/ui/src/plugins/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/plugins/.gitkeep -------------------------------------------------------------------------------- /resources/ui/src/plugins/ad.js: -------------------------------------------------------------------------------- 1 | import Script2 from 'vue-script2' 2 | import Ads from 'vue-google-adsense' 3 | 4 | export default ({ Vue }) => { 5 | Vue.use(Script2) 6 | Vue.use(Ads.Adsense) 7 | } 8 | -------------------------------------------------------------------------------- /resources/ui/src/plugins/axios.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | export default ({ Vue }) => { 4 | Vue.prototype.$axios = axios 5 | } 6 | -------------------------------------------------------------------------------- /resources/ui/src/plugins/i18n.js: -------------------------------------------------------------------------------- 1 | import VueI18n from 'vue-i18n' 2 | import messages from 'src/i18n' 3 | 4 | export default ({ app, Vue }) => { 5 | Vue.use(VueI18n) 6 | 7 | // Set i18n instance on app 8 | app.i18n = new VueI18n({ 9 | locale: 'en-us', 10 | fallbackLocale: 'en-us', 11 | messages 12 | }) 13 | } 14 | -------------------------------------------------------------------------------- /resources/ui/src/plugins/vuelidate.js: -------------------------------------------------------------------------------- 1 | import vuelidate from 'vuelidate' 2 | 3 | export default ({ Vue }) => { 4 | Vue.use(vuelidate) 5 | } 6 | -------------------------------------------------------------------------------- /resources/ui/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueRouter from 'vue-router' 3 | 4 | import routes from './routes' 5 | 6 | Vue.use(VueRouter) 7 | 8 | /* 9 | * If not building with SSR mode, you can 10 | * directly export the Router instantiation 11 | */ 12 | 13 | export default function (/* { store, ssrContext } */) { 14 | const Router = new VueRouter({ 15 | scrollBehavior: () => ({ y: 0 }), 16 | routes, 17 | 18 | // Leave these as is and change from quasar.conf.js instead! 19 | // quasar.conf.js -> build -> vueRouterMode 20 | mode: process.env.VUE_ROUTER_MODE, 21 | base: process.env.VUE_ROUTER_BASE 22 | }) 23 | 24 | return Router 25 | } 26 | -------------------------------------------------------------------------------- /resources/ui/src/router/routes.js: -------------------------------------------------------------------------------- 1 | 2 | const routes = [ 3 | { 4 | path: '/splash', 5 | component: () => import('layouts/SplashLayout/Index.vue'), 6 | children: [ 7 | { path: '', component: () => import('pages/Splash/Index.vue') } 8 | ] 9 | }, 10 | { 11 | path: '/', 12 | redirect: '/splash' 13 | } 14 | ] 15 | 16 | // Always leave this as last one 17 | if (process.env.MODE !== 'ssr') { 18 | routes.push({ 19 | path: '*', 20 | component: () => import('pages/Error404.vue') 21 | }) 22 | } 23 | 24 | export default routes 25 | -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/huaweiP30pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/huaweiP30pro.png -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/iPad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/iPad.png -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/iPhone8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/iPhone8.png -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/iPhone8Plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/iPhone8Plus.png -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/iPhoneSE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/iPhoneSE.png -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/iPhoneX.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/iPhoneX.png -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/iPhoneXR.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/iPhoneXR.png -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/oneplus5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/oneplus5.png -------------------------------------------------------------------------------- /resources/ui/src/statics/devices/oneplus7Pro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/devices/oneplus7Pro.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icon.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/apple-icon-152x152.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/favicon-16x16.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/favicon-32x32.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/icon-128x128.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/icon-192x192.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/icon-256x256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/icon-256x256.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/icon-384x384.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/icon-512x512.png -------------------------------------------------------------------------------- /resources/ui/src/statics/icons/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/osvlabs/icon-workshop/be012ce35b6bf34cc9630ac538fb1f338170bc5a/resources/ui/src/statics/icons/ms-icon-144x144.png -------------------------------------------------------------------------------- /resources/ui/src/store/Splash/actions.js: -------------------------------------------------------------------------------- 1 | import Scene from '../../models/Scene' 2 | 3 | export function init (context) { 4 | const scene = new Scene() 5 | context.commit('init') 6 | context.commit('update', { 7 | scene 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /resources/ui/src/store/Splash/getters.js: -------------------------------------------------------------------------------- 1 | /* 2 | export function someGetter (state) { 3 | } 4 | */ 5 | -------------------------------------------------------------------------------- /resources/ui/src/store/Splash/index.js: -------------------------------------------------------------------------------- 1 | import state from './state' 2 | import * as getters from './getters' 3 | import * as mutations from './mutations' 4 | import * as actions from './actions' 5 | 6 | export default { 7 | namespaced: true, 8 | state, 9 | getters, 10 | mutations, 11 | actions 12 | } 13 | -------------------------------------------------------------------------------- /resources/ui/src/store/Splash/mutations.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | import { DEFAULT_STATE } from './state' 3 | 4 | export function update (state, o) { 5 | _.assignIn(state, o) 6 | } 7 | 8 | export function updateChild (state, o) { 9 | _.assignIn(state[o.key], o.value) 10 | } 11 | 12 | export function addObject (state, o) { 13 | state.scene.objects.push(o) 14 | state.object = o 15 | } 16 | 17 | export function updateObject (state, o) { 18 | const old = _.find(state.scene.objects, {id: o.id}) 19 | if (old) { 20 | _.assignIn(old, o) 21 | } 22 | } 23 | 24 | export function updateObjects (state, objects) { 25 | state.scene.objects = objects 26 | } 27 | 28 | export function removeObject (state, o) { 29 | const index = _.findIndex(state.scene.objects, { id: o.id }) 30 | if (index >= 0) { 31 | state.scene.objects.splice(index, 1) 32 | } 33 | if (state.object && state.object.id === o.id) { 34 | setCurrentObject(state, null) 35 | } 36 | } 37 | 38 | export function setCurrentObject (state, o) { 39 | state.object = o 40 | } 41 | 42 | export function init (state) { 43 | _.assignIn(state, DEFAULT_STATE) 44 | } 45 | -------------------------------------------------------------------------------- /resources/ui/src/store/Splash/state.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash' 2 | 3 | const DEFAULT_STATE = { 4 | object: null, 5 | orientation: 'portrait', 6 | device: 'iphone6', 7 | width: 375, 8 | height: 667, 9 | scale: 1, 10 | autoScale: true, 11 | draggingObject: null 12 | } 13 | 14 | export { 15 | DEFAULT_STATE 16 | } 17 | 18 | export default _.defaults({ 19 | scene: null 20 | }, DEFAULT_STATE) 21 | -------------------------------------------------------------------------------- /resources/ui/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import createPersistedState from 'vuex-persistedstate' 4 | import Scene from '../models/Scene' 5 | import { deserialize } from '../models' 6 | import Splash from './Splash' 7 | 8 | if (window.location.hostname !== 'localhost') { 9 | const redirect = 'http://icon.wuruihong.com' 10 | if (window.parent === window) { 11 | window.location.href = redirect 12 | } 13 | 14 | try { 15 | const hostname = window.parent.location.hostname 16 | if (!['localhost', 'icon.local', 'icon.wuruihong.com'].includes(hostname)) { 17 | window.location.href = redirect 18 | } 19 | } catch (e) { 20 | console.log(e) 21 | window.location.href = redirect 22 | } 23 | } 24 | 25 | Vue.use(Vuex) 26 | 27 | /* 28 | * If not building with SSR mode, you can 29 | * directly export the Store instantiation 30 | */ 31 | 32 | const store = new Vuex.Store({ 33 | modules: { 34 | Splash 35 | }, 36 | plugins: [ 37 | createPersistedState({ 38 | getState (key, storage, value) { 39 | try { 40 | const saved = (value = storage.getItem(key)) && typeof value !== 'undefined' 41 | ? JSON.parse(value) 42 | : undefined 43 | if (saved.Splash && saved.Splash.scene) { 44 | saved.Splash.scene = deserialize(saved.Splash.scene) 45 | } 46 | return saved 47 | } catch (err) {} 48 | 49 | return undefined 50 | } 51 | }) 52 | ] 53 | }) 54 | 55 | if (!store.state.Splash.scene) { 56 | store.state.Splash.scene = new Scene() 57 | } 58 | 59 | export default store 60 | -------------------------------------------------------------------------------- /resources/views/comment.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | -------------------------------------------------------------------------------- /resources/views/donate.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | 3 | @section('head') 4 | 25 | @endsection 26 | 27 | @section('container') 28 |
29 |

捐助我们

30 |

感谢您使用“图标工场”提供的服务。我们承诺应用图标(不含其他服务)生成功能永久免费,您可以自由使用,并且我非常乐意您能将它推荐给朋友们。

31 |

如果您感觉到图标工场能带来帮助,希望您能进行捐赠,这将是图标工场未来持续改进的保障。捐助的资金将用于:

32 | 37 |

在捐赠时您可以给我们留言,附上最想添加的新功能(可以用短链接形式附上详情需求),我们会根据需求度尽快开发上线。

38 | 39 | 49 | 50 |

捐赠者列表

51 |

所有捐赠者、金额、留言都会在下面列出,感谢您的支持。

52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
捐赠时间金额捐赠人捐赠方式留言
2019-09-02 15:32:0820.00元*瑞红微信
72 |
73 | 76 | @endsection 77 | -------------------------------------------------------------------------------- /resources/views/emails/auth/reminder.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Password Reset

8 | 9 |
10 | To reset your password, complete this form: {{ URL::to('password/reset', array($token)) }}.
11 | This link will expire in {{ Config::get('auth.reminder.expire', 60) }} minutes. 12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /resources/views/emails/icon.php: -------------------------------------------------------------------------------- 1 | 2 |

欢迎使用由“睿鸿游戏”开发的应用图标生成工具!

3 | 7 |

为您生成的图标已打包并在附在该邮件中,请查看。欢迎回信提供宝贵意见!

8 | -------------------------------------------------------------------------------- /resources/views/error/404.php: -------------------------------------------------------------------------------- 1 | 2 | 3 |

页面未找到! 即将跳转到首页...

4 |
getMessage(); ?>
5 | -------------------------------------------------------------------------------- /resources/views/faq.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | @section('container') 3 |
4 |
5 |
6 |

常见问题

7 |
8 |
Q: iOS 生成的图标:PNG透明背景原图片,生成后为什么变成了白色背景效果图标?
9 |
10 |
    11 |
  • A: iOS 图标不支持透明图层。生成时会默认添加白色背景。背景颜色可以在“可选参数”中设置。
  • 12 |
13 |
14 |
15 |
16 |
Q: 请问 iOS 不可以生成圆角么?
17 |
18 |
    19 |
  • A: iOS 系统会自动添加圆角。推荐上传正方形(不含圆角)的图片。生成的图片也全是正方形的,可以直接拖放到 Xcode 里(以及上传到 AppStore Connect)。
  • 20 |
21 |
22 |
23 |
24 |
25 | @if(!App::environment('local')) 26 | 27 | 31 | 34 | @endif 35 |
36 |
37 |
38 | 41 | @endsection 42 | -------------------------------------------------------------------------------- /resources/views/guides/android.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | @section('container') 3 |
4 |
5 |
6 |

使用教程 - {{ $platform }}

7 |

第一步:上传并生成图片

8 | 9 |

第二步:下载图标

10 | 11 |

第三步:集成到Android Studio

12 |

覆盖项目目录下 app/src/main/res 中的相应文件夹。你也可以在 Android Studio 中覆盖这个文件。

13 | 14 |

第四步:编译完成

15 |

Enjoy!

16 | 17 |
18 | 19 |
20 | @if(!App::environment('local')) 21 | 22 | 26 | 29 | @endif 30 |
31 |
32 | @include('comment', ['name' => 'android']) 33 |
34 | 35 | 38 | @endsection -------------------------------------------------------------------------------- /resources/views/guides/ios.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | @section('container') 3 |
4 |
5 |
6 |

使用教程 - {{ $platform }}

7 |

第一步:上传并生成图片

8 | 9 |

第二步:下载图标

10 | 11 |

第三步:集成到Xcode

12 |

删除项目文件Assets.xcassets中原有的AppIcon,将下载的压缩包中的AppIcon.appiconset拖放进去。你也可以在Finder中覆盖这个文件。

13 | 14 |

第四步:编译完成

15 |

Enjoy!

16 | 17 |
18 | 19 |
20 | @if(!App::environment('local')) 21 | 22 | 26 | 29 | @endif 30 |
31 |
32 | @include('comment', ['name' => 'ios']) 33 |
34 | 35 | 38 | @endsection -------------------------------------------------------------------------------- /resources/views/guides/iwatch.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | @section('container') 3 |
4 |
5 |
6 |

使用教程 - {{ $platform }}

7 |

程序猿正在拼(wo)命(niu)写教程,请稍候...

8 |
9 | 10 |
11 | @if(!App::environment('local')) 12 | 13 | 17 | 20 | @endif 21 |
22 |
23 | @include('comment', ['name' => 'iwatch']) 24 |
25 | 26 | 29 | @endsection -------------------------------------------------------------------------------- /resources/views/guides/phonegap.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | @section('container') 3 |
4 |
5 |
6 |

使用教程 - {{ $platform }}

7 |

程序猿正在拼(wo)命(niu)写教程,请稍候...

8 |
9 | 10 |
11 | @if(!App::environment('local')) 12 | 13 | 17 | 20 | @endif 21 |
22 |
23 | @include('comment', ['name' => 'phonegap']) 24 |
25 | 26 | 29 | @endsection -------------------------------------------------------------------------------- /resources/views/guides/webapp.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | @section('container') 3 |
4 |
5 |
6 |

使用教程 - {{ $platform }}

7 |

程序猿正在拼(wo)命(niu)写教程,请稍候...

8 |
9 | 10 |
11 | @if(!App::environment('local')) 12 | 13 | 17 | 20 | @endif 21 |
22 |
23 | @include('comment', ['name' => 'webapp']) 24 |
25 | 26 | 29 | @endsection -------------------------------------------------------------------------------- /resources/views/splash/demo.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | @section('container') 3 |
4 |

启动图生成工具视频演示

5 | 6 | @if(!App::environment('local')) 7 |
8 |
9 | 10 | 11 | 15 | 18 |
19 |
20 | 21 | 22 | 26 | 29 |
30 |
31 | @endif 32 | 33 | 34 |
35 | 38 | @endsection 39 | -------------------------------------------------------------------------------- /resources/views/vote.blade.php: -------------------------------------------------------------------------------- 1 | @extends('master') 2 | @section('container') 3 |
4 |
5 |
6 |

需求投票

7 |

为你最想要的需求投上一票(每人3票)!你也可以提交一个新的需求。我们将优先开发票数得最多的需求。

8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | 17 | 19 | 20 | 22 | 23 |
24 |
25 |
26 |
27 |
28 |
29 | @if(!App::environment('local')) 30 | 31 | 35 | 38 | @endif 39 |
40 |
41 |
42 | @endsection 43 | 44 | @section('scripts') 45 | 48 | 49 | @endsection -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | get('/user', function (Request $request) { 17 | return $request->user(); 18 | }); 19 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 16 | }); 17 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 18 | })->describe('Display an inspiring quote'); 19 | -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/app/public/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/debugbar/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 20 | 21 | Hash::driver('bcrypt')->setRounds(4); 22 | 23 | return $app; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | let mix = require('laravel-mix'); 2 | 3 | /* 4 | |-------------------------------------------------------------------------- 5 | | Mix Asset Management 6 | |-------------------------------------------------------------------------- 7 | | 8 | | Mix provides a clean, fluent API for defining some Webpack build steps 9 | | for your Laravel application. By default, we are compiling the Sass 10 | | file for the application as well as bundling up all the JS files. 11 | | 12 | */ 13 | 14 | mix.js('resources/assets/js/app.js', 'public/js') 15 | .sass('resources/assets/sass/app.scss', 'public/css'); 16 | --------------------------------------------------------------------------------