diff --git a/app/Modules/Admin/Http/Controllers/IndexController.php b/app/Modules/Admin/Http/Controllers/IndexController.php index 97145769bc5706165f963af994ebd77721d90302..59d9697f0804f7d81a0d4ddabcb339a601de22e3 100644 --- a/app/Modules/Admin/Http/Controllers/IndexController.php +++ b/app/Modules/Admin/Http/Controllers/IndexController.php @@ -47,11 +47,22 @@ class IndexController extends BaseController * * @return \Illuminate\Http\JsonResponse */ - public function update(Request $request){ - if ($this->service->updateAdmin($request)){ + public function update(Request $request) + { + if ( $this->service->updateAdmin($request) ) { return $this->successJson([], $this->service->getError()); - }else{ + } else { return $this->errorJson($this->service->getError()); } } + + /** + * 版本历史记录 + * + * @return mixed + */ + public function versionLogs() + { + return $this->successJson($this->service->versionLogs()); + } } diff --git a/app/Modules/Admin/Http/Controllers/System/VersionController.php b/app/Modules/Admin/Http/Controllers/System/VersionController.php index d79ae3e70f536b436d5954d6be3ea573e1c6db0a..768cfdb4db17d88e7c6d8fc60a3a55863a89716c 100644 --- a/app/Modules/Admin/Http/Controllers/System/VersionController.php +++ b/app/Modules/Admin/Http/Controllers/System/VersionController.php @@ -3,7 +3,7 @@ namespace App\Modules\Admin\Http\Controllers\System; use App\Modules\Admin\Http\Controllers\BaseController; -use App\Modules\Admin\Http\Requests\System\FriendlinkRequest; +use App\Modules\Admin\Http\Requests\System\VersionRequest; use App\Modules\Admin\Services\VersionService; class VersionController extends BaseController @@ -13,12 +13,12 @@ class VersionController extends BaseController $this->service = $versionService; } - public function create(FriendlinkRequest $request) + public function create(VersionRequest $request) { return $this->createService($request); } - public function update(FriendlinkRequest $request) + public function update(VersionRequest $request) { return $this->updateService($request); } diff --git a/app/Modules/Admin/Http/Requests/System/VersionRequest.php b/app/Modules/Admin/Http/Requests/System/VersionRequest.php index 1165aa5170ef2bff13dae8c2d54908751747c885..33e84159ba4cb13f50ac7029608e5e7c92965fba 100644 --- a/app/Modules/Admin/Http/Requests/System/VersionRequest.php +++ b/app/Modules/Admin/Http/Requests/System/VersionRequest.php @@ -20,31 +20,36 @@ class VersionRequest extends BaseRequest public function rules() { return [ - 'version_name' => [ + 'version_name' => [ 'required', 'max:256', - 'unique:' . $this->instance->getTable() . ',version_name' . $this->validate_id + 'unique:' . $this->instance->getTable() . ',version_name' . $this->validate_id, ], - 'version_number' => [ + 'version_number' => [ 'required', + 'unique:' . $this->instance->getTable() . ',version_number' . $this->validate_id, + ], + 'publish_date' => [ + 'date_format:Y-m-d H:i:s' ], 'version_content' => [ 'required', ], - 'version_sort' => [ - 'number', + 'version_sort' => [ + 'min:0', ], - 'is_check' => [ - 'required', - ] ]; } public function messages() { return [ - 'version_name.required' => '请输入版本名称!', - 'version_number.required' => '请输入版本号!', + 'version_name.required' => '请输入版本名称!', + 'version_name.unique' => '版本名称已存在,请更换!', + 'version_number.required' => '请输入版本号!', + 'version_number.unique' => '版本号已存在,请更换!', + 'publish_date.date_format' => '请选择有效的发布时间!', + 'version_content.required' => '请输入版本内容!', ]; } } diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js b/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js index 09086a398035a742ac5cab8ca8e76a1abecf9599..ba853a43860127da18c806a7c187d1cff0276d31 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js +++ b/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js @@ -24,3 +24,13 @@ export function updateAdmin(data) { data, }) } + + +// 版本历史记录 +export function versionLogs(data) { + return request({ + url: '/versionLogs', + method: 'get', + data, + }) +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/versions.js b/app/Modules/Admin/Resources/vue-element-admin/api/versions.js new file mode 100644 index 0000000000000000000000000000000000000000..0abb5508998118cee6aac38370b3e6f06f1990d5 --- /dev/null +++ b/app/Modules/Admin/Resources/vue-element-admin/api/versions.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/versions', + method: 'get', + params + }); +} + +export function create(data) { + return request({ + url: '/versions/create', + method: 'post', + data + }); +} + +export function update(data) { + return request({ + url: '/versions/update', + method: 'put', + data + }); +} + +export function setDel(data) { + return request({ + url: '/versions/delete', + method: 'delete', + data + }); +} + +export function changeFiledStatus(data) { + return request({ + url: '/versions/changeFiledStatus', + method: 'put', + data + }) +} diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue index 29d112b71c489635790810d6eeb2eed60bca7dcd..b76937c38dc9418e61ad86eb3d7f470f028bdbb5 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue @@ -1,14 +1,17 @@ - + diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue index cbd00645eebb0014b7a4a4b9b5dee272c49d1aa5..0c5c40d89a72e388afacd319af3edabc2e3c6d9c 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue @@ -13,16 +13,21 @@ - + - + + + + + + @@ -32,13 +37,14 @@ diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Timeline.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Timeline.vue index ba90b3d27b9edc7c2ba054b4e3b5a7c18cb6e609..8b9e405f9b307e8bc5dcb009b423cdfe333b4527 100644 --- a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Timeline.vue +++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Timeline.vue @@ -1,43 +1,43 @@ - - - - - {{ item.title }} - {{ item.content }} - - - - + + + + + {{ item.title }} + {{ item.content }} + + + + diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/versions/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/versions/components/detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..2962e6f2c4e8fd12e5816faeaeb3380a6455ffc7 --- /dev/null +++ b/app/Modules/Admin/Resources/vue-element-admin/views/versions/components/detail.vue @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/versions/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/versions/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..7b29a90e4cae04a9242985d32e2fe09ee810734e --- /dev/null +++ b/app/Modules/Admin/Resources/vue-element-admin/views/versions/index.vue @@ -0,0 +1,267 @@ + + + + + + {{ $t('table.search') }} + + + 批量删除 + + + {{ $t('table.add') }} + + + {{ $t('table.export') }} + + + + + + + + + + + + + + + + + + {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }} + + + + + + + 编辑 + 删除 + + + + + + + + + + + diff --git a/app/Modules/Admin/Routes/web.php b/app/Modules/Admin/Routes/web.php index 4f398be3674a82d1409ddb6b8a5e72be85dee346..786801e49036208a359928db02b96ec90394e0f7 100644 --- a/app/Modules/Admin/Routes/web.php +++ b/app/Modules/Admin/Routes/web.php @@ -38,6 +38,8 @@ Route::prefix('admin')->group(function() { Route::put('updateAdmin', 'IndexController@update'); // 按照日志类型的统计图数据 Route::get('logsStatistics', 'IndexController@logsStatistics'); + // 版本的历史记录 + Route::get('versionLogs', 'IndexController@versionLogs'); // 月份表列表 Route::get('get_month_lists', 'IndexController@getMonthList'); // 文件上传 diff --git a/app/Modules/Admin/Services/IndexService.php b/app/Modules/Admin/Services/IndexService.php index d41e49a0f08d4c710c7202b73ae0d8c3ddee3bc0..21ac641b6980324cd3a5872ba89ff4a995eb3a02 100644 --- a/app/Modules/Admin/Services/IndexService.php +++ b/app/Modules/Admin/Services/IndexService.php @@ -7,6 +7,7 @@ use App\Modules\Admin\Entities\Log\AdminLog; use App\Modules\Admin\Entities\Rabc\Admin; use App\Modules\Admin\Entities\System\Banner; use App\Modules\Admin\Entities\System\Friendlink; +use App\Modules\Admin\Entities\System\Version; use Illuminate\Support\Facades\Cache; class IndexService extends BaseService @@ -64,7 +65,7 @@ class IndexService extends BaseService $time_interval_key = "logs-statistics's-time-interval"; $time_interval = Cache::get($time_interval_key, $default_time_interval); // 通过缓存进行读写 - return Cache::remember('logs-statistics', $time_interval, function() use ($time_interval, $time_interval_key){ + return Cache::remember('logs-statistics', $time_interval, function() use ($time_interval, $time_interval_key) { $default_data = [ 'xAxis' => [ 'data' => [], @@ -102,14 +103,11 @@ class IndexService extends BaseService $default_data['xAxis']['data'][$i] = date('Y-m-d H:i', $end_time); // $default_data['data_lists']['GET'][$i] = - $default_data['data_lists']['POST'][$i] - = $default_data['data_lists']['PUT'][$i] - = $default_data['data_lists']['DELETE'][$i] - = 0; + $default_data['data_lists']['POST'][$i] = $default_data['data_lists']['PUT'][$i] = $default_data['data_lists']['DELETE'][$i] = 0; if ( $list ) { foreach ($list as $v) { - if ($v->created_time >= $end_time && $v->created_time <= $time){ + if ( $v->created_time >= $end_time && $v->created_time <= $time ) { $has_records = true; if ( $v->log_method == 'GET' ) { // ++$default_data['data_lists']['GET'][$i]; @@ -129,7 +127,7 @@ class IndexService extends BaseService } // 当没有记录是,时间间隔慢慢往上扩大两倍,实现统计图效果 - if (!$has_records){ + if ( !$has_records ) { Cache::put($time_interval_key, $time_interval * 2); } @@ -148,9 +146,19 @@ class IndexService extends BaseService { $update['admin_name'] = $request->input('admin_name'); $password = $request->input('password', ''); - if (!empty($password)){ + if ( !empty($password) ) { $update['password'] = $password; } return $request->user()->update($update); } + + /** + * 版本历史记录 + * + * @return mixed + */ + public function versionLogs() + { + return Version::getInstance()->select('version_name', 'version_number', 'version_content', 'publish_date')->orderBy('version_sort', 'ASC')->orderBy('version_id', 'ASC')->get(); + } } diff --git a/app/Modules/Admin/Services/VersionService.php b/app/Modules/Admin/Services/VersionService.php index 1858dcc6b35cdb8b5b3182e4fc2d4855a6cee7cd..4bbd4cdd7edb818940f9805b44f0a156cda6916c 100644 --- a/app/Modules/Admin/Services/VersionService.php +++ b/app/Modules/Admin/Services/VersionService.php @@ -21,6 +21,8 @@ class VersionService extends BaseService ->whereOr('version_number', 'LIKE', '%' . trim($search) . '%'); } }; + $params['order'] = 'version_sort'; + $params['order_sort'] = 'ASC'; return parent::lists($params); // TODO: Change the autogenerated stub } } diff --git a/package-lock.json b/package-lock.json index f470bdf6ef091b664e2aa894bdefca95c2d6860f..5e757018e08ad2e9e83d80e3ae8846ace10cba35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1555,6 +1555,22 @@ "integrity": "sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==", "dev": true }, + "@toast-ui/editor": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@toast-ui/editor/-/editor-2.5.1.tgz", + "integrity": "sha512-LVNo/YaNItUemEaRFvFAVn7w/0U7yxEheMdn6GEGxqo727rRZD1MH7OTDVq6NeQ+P93VwFpa0i9GGRBhNNEbPQ==", + "requires": { + "@types/codemirror": "0.0.71", + "codemirror": "^5.48.4" + }, + "dependencies": { + "codemirror": { + "version": "5.59.1", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-5.59.1.tgz", + "integrity": "sha512-d0SSW/PCCD4LoSCBPdnP0BzmZB1v3emomCUtVlIWgZHJ06yVeBOvBtOH7vYz707pfAvEeWbO9aP6akh8vl1V3w==" + } + } + }, "@types/babel__core": { "version": "7.1.12", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.12.tgz", @@ -8232,6 +8248,11 @@ "assert-plus": "^1.0.0" } }, + "github-markdown-css": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/github-markdown-css/-/github-markdown-css-4.0.0.tgz", + "integrity": "sha512-mH0bcIKv4XAN0mQVokfTdKo2OD5K8WJE9+lbMdM32/q0Ie5tXgVN/2o+zvToRMxSTUuiTRcLg5hzkFfOyBYreg==" + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -10856,6 +10877,14 @@ "set-immediate-shim": "~1.0.1" } }, + "katex": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.6.0.tgz", + "integrity": "sha1-EkGOCRIcBckgQbazuftrqyE8tvM=", + "requires": { + "match-at": "^0.1.0" + } + }, "keypress": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", @@ -12035,6 +12064,80 @@ "uc.micro": "^1.0.5" } }, + "markdown-it-abbr": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz", + "integrity": "sha1-1mtTZFIcuz3Yqlna37ovtoZcj9g=" + }, + "markdown-it-deflist": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-deflist/-/markdown-it-deflist-2.1.0.tgz", + "integrity": "sha512-3OuqoRUlSxJiuQYu0cWTLHNhhq2xtoSFqsZK8plANg91+RJQU1ziQ6lA2LzmFAEes18uPBsHZpcX6We5l76Nzg==" + }, + "markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=" + }, + "markdown-it-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-2.0.0.tgz", + "integrity": "sha1-FOnE9o/xLPNU+jZa43gnboEEypQ=" + }, + "markdown-it-ins": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-ins/-/markdown-it-ins-2.0.0.tgz", + "integrity": "sha1-papqMPHi9x6Ul1Z8/f9A8f3mdIM=" + }, + "markdown-it-katex": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-katex/-/markdown-it-katex-2.0.3.tgz", + "integrity": "sha1-17hqGuoLnWSW+rTnkZoY/e9YnDk=", + "requires": { + "katex": "^0.6.0" + } + }, + "markdown-it-mark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-mark/-/markdown-it-mark-2.0.0.tgz", + "integrity": "sha1-RqGqlHEFrtgYiXjgoBYXnkBPQsc=" + }, + "markdown-it-sub": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-sub/-/markdown-it-sub-1.0.0.tgz", + "integrity": "sha1-N1/WAm6ufdywEkl/ZBEZXqHjr+g=" + }, + "markdown-it-sup": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-sup/-/markdown-it-sup-1.0.0.tgz", + "integrity": "sha1-y5yf+RpSVawI8/09YyhuFd8KH8M=" + }, + "markdown-it-task-lists": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz", + "integrity": "sha512-TxFAc76Jnhb2OUu+n3yz9RMu4CwGfaT788br6HhEDlvWfdeJcLUsxk1Hgw2yJio0OXsxv7pyIPmvECY7bMbluA==" + }, + "markdown-it-toc-and-anchor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/markdown-it-toc-and-anchor/-/markdown-it-toc-and-anchor-4.2.0.tgz", + "integrity": "sha512-DusSbKtg8CwZ92ztN7bOojDpP4h0+w7BVOPuA3PHDIaabMsERYpwsazLYSP/UlKedoQjOz21mwlai36TQ04EpA==", + "requires": { + "clone": "^2.1.0", + "uslug": "^1.0.4" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + } + } + }, + "match-at": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/match-at/-/match-at-0.1.1.tgz", + "integrity": "sha512-h4Yd392z9mST+dzc+yjuybOGFNOZjmXIPKWjxBd1Bb23r4SmDOsk2NYCU2BMUBGbSpZqwVsZYNq26QS3xfaT3Q==" + }, "matcher": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/matcher/-/matcher-1.1.1.tgz", @@ -12477,6 +12580,11 @@ "commander": "*" } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -18133,6 +18241,11 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, + "unorm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz", + "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -18280,6 +18393,14 @@ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", "dev": true }, + "uslug": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/uslug/-/uslug-1.0.4.tgz", + "integrity": "sha1-uaIvCRTgqGFAYz2swwLl9PpFBnc=", + "requires": { + "unorm": ">= 1.0.0" + } + }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -18501,6 +18622,48 @@ } } }, + "vue-markdown": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/vue-markdown/-/vue-markdown-2.2.4.tgz", + "integrity": "sha512-hoTX/W1UIdHZrp/b0vpHSsJXAEfWsafaQLgtE2VX4gY8O/C3L2Gabqu95gyG429rL4ML1SwGv+xsPABX7yfFIQ==", + "requires": { + "highlight.js": "^9.12.0", + "markdown-it": "^6.0.1", + "markdown-it-abbr": "^1.0.3", + "markdown-it-deflist": "^2.0.1", + "markdown-it-emoji": "^1.1.1", + "markdown-it-footnote": "^2.0.0", + "markdown-it-ins": "^2.0.0", + "markdown-it-katex": "^2.0.3", + "markdown-it-mark": "^2.0.0", + "markdown-it-sub": "^1.0.0", + "markdown-it-sup": "^1.0.0", + "markdown-it-task-lists": "^2.0.1", + "markdown-it-toc-and-anchor": "^4.1.2" + }, + "dependencies": { + "linkify-it": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-1.2.4.tgz", + "integrity": "sha1-B3NSbDF8j9E71TTuHRgP+Iq/iBo=", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "markdown-it": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-6.1.1.tgz", + "integrity": "sha1-ztA39Ec+6fUVOsQU933IPJG6knw=", + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "~1.2.2", + "mdurl": "~1.0.1", + "uc.micro": "^1.0.1" + } + } + } + }, "vue-router": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.0.2.tgz", diff --git a/package.json b/package.json index 2415bee7bd463af1e56d3703d218f9ce3a562dcd..da26d0f2a991a9ef377d20ef95549f1a158166d6 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ ] }, "dependencies": { + "@toast-ui/editor": "^2.2.0", "axios": "0.18.1", "clipboard": "2.0.4", "codemirror": "5.45.0", @@ -33,9 +34,11 @@ "element-ui": "2.13.2", "file-saver": "2.0.1", "fuse.js": "3.4.4", + "github-markdown-css": "^4.0.0", "js-cookie": "2.2.0", "jsonlint": "1.6.3", "jszip": "3.2.1", + "moment": "^2.29.1", "node-sass": "^4.14.1", "normalize.css": "7.0.0", "nprogress": "0.2.0", @@ -49,6 +52,7 @@ "vue-count-to": "1.0.13", "vue-i18n": "^7.3.2", "vue-image-crop-upload": "^2.5.0", + "vue-markdown": "^2.2.4", "vue-router": "3.0.2", "vue-splitpane": "1.0.4", "vuedraggable": "2.20.0",
{{ item.content }}