diff --git a/core/pagination.py b/core/pagination.py new file mode 100644 index 0000000..7730729 --- /dev/null +++ b/core/pagination.py @@ -0,0 +1,9 @@ +# -*- coding: UTF-8 -*- +from rest_framework import pagination +from rest_framework.response import Response + +class PagePaginationWithPageCount(pagination.PageNumberPagination): + def get_paginated_response(self, data): + response = super().get_paginated_response(data) + response.data['page_count'] = self.page.paginator.num_pages + return response diff --git a/dsite/settings.py b/dsite/settings.py index d77f5da..18defa2 100644 --- a/dsite/settings.py +++ b/dsite/settings.py @@ -1,9 +1,17 @@ from .settings_default import * + REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', ), + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' + ], + + # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', + 'DEFAULT_PAGINATION_CLASS': 'core.pagination.PagePaginationWithPageCount', + 'PAGE_SIZE': 10 } diff --git a/frontend/dist/css/app.0786e41a.css b/frontend/dist/css/app.0786e41a.css new file mode 100644 index 0000000..4543340 --- /dev/null +++ b/frontend/dist/css/app.0786e41a.css @@ -0,0 +1 @@ +.summit-recipe[data-v-16b31338]{width:100%}.el-pagination{margin:10px 0 0 0}.el-row{margin-bottom:20px;&:last-child{margin-bottom:0}}.el-col,.grid-content{border-radius:4px}.grid-content{min-height:36px}.row-bg{padding:10px 0;background-color:#f9fafc}.content{padding:20px 10px}.re-generate{margin:20px 0;width:100%}.el-tag#meal a:link,.el-tag#meal a:visited{text-decoration:none}.el-tag#meal a:active,.el-tag#meal a:hover{text-decoration:underline}.el-tag{margin:0 5px 0 0}.el-tag+.el-tag{margin:5px 0 0 0} \ No newline at end of file diff --git a/frontend/dist/css/app.6a1f0595.css b/frontend/dist/css/app.6a1f0595.css deleted file mode 100644 index f54ed00..0000000 --- a/frontend/dist/css/app.6a1f0595.css +++ /dev/null @@ -1 +0,0 @@ -.summit-recipe[data-v-16b31338]{width:100%}.el-row{margin-bottom:20px;&:last-child{margin-bottom:0}}.el-col,.grid-content{border-radius:4px}.grid-content{min-height:36px}.row-bg{padding:10px 0;background-color:#f9fafc}.content{padding:20px 10px}.re-generate{margin:20px 0;width:100%}.el-tag#meal a:link,.el-tag#meal a:visited{text-decoration:none}.el-tag#meal a:active,.el-tag#meal a:hover{text-decoration:underline}.el-tag{margin:0 5px 0 0}.el-tag+.el-tag{margin:5px 0 0 0} \ No newline at end of file diff --git a/frontend/dist/index.html b/frontend/dist/index.html index 040a623..74b3601 100644 --- a/frontend/dist/index.html +++ b/frontend/dist/index.html @@ -1 +1 @@ -frontend
\ No newline at end of file +frontend
\ No newline at end of file diff --git a/frontend/dist/js/app.b14de476.js b/frontend/dist/js/app.b14de476.js deleted file mode 100644 index e4ad425..0000000 --- a/frontend/dist/js/app.b14de476.js +++ /dev/null @@ -1,2 +0,0 @@ -(function(e){function t(t){for(var c,a,i=t[0],l=t[1],b=t[2],p=0,f=[];p\n \n\n\n\n","import { render } from \"./App.vue?vue&type=template&id=2969681c\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","import ElementPlus from 'element-plus'\nimport 'element-plus/lib/theme-chalk/index.css'\nimport locale from 'element-plus/lib/locale/lang/zh-cn'\n\nexport default (app) => {\n app.use(ElementPlus, { locale })\n}\n","\n\n\n\n","\n\n\n\n","import { render } from \"./input_recipe.vue?vue&type=template&id=16b31338&scoped=true\"\nimport script from \"./input_recipe.vue?vue&type=script&lang=js\"\nexport * from \"./input_recipe.vue?vue&type=script&lang=js\"\n\nimport \"./input_recipe.vue?vue&type=style&index=0&id=16b31338&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-16b31338\"\n\nexport default script","\n\n\n","import { render } from \"./recipe_list.vue?vue&type=template&id=6cda357a\"\nimport script from \"./recipe_list.vue?vue&type=script&lang=js\"\nexport * from \"./recipe_list.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","import { render } from \"./home.vue?vue&type=template&id=2f7ecc30\"\nimport script from \"./home.vue?vue&type=script&lang=js\"\nexport * from \"./home.vue?vue&type=script&lang=js\"\n\nimport \"./home.vue?vue&type=style&index=0&id=2f7ecc30&lang=css\"\nscript.render = render\n\nexport default script","\n\n\n\n","import { render } from \"./recipeDetail.vue?vue&type=template&id=091caa05\"\nimport script from \"./recipeDetail.vue?vue&type=script&lang=js\"\nexport * from \"./recipeDetail.vue?vue&type=script&lang=js\"\n\nimport \"./recipeDetail.vue?vue&type=style&index=0&id=091caa05&lang=css\"\nscript.render = render\n\nexport default script","\n\n\n\n\n","\n\n\n\n\n","import { render } from \"./week_recipe.vue?vue&type=template&id=3121e8ee\"\nimport script from \"./week_recipe.vue?vue&type=script&lang=js\"\nexport * from \"./week_recipe.vue?vue&type=script&lang=js\"\n\nimport \"./week_recipe.vue?vue&type=style&index=0&id=3121e8ee&lang=css\"\nscript.render = render\n\nexport default script","import { render } from \"./weekRecipe.vue?vue&type=template&id=5a47131a\"\nimport script from \"./weekRecipe.vue?vue&type=script&lang=js\"\nexport * from \"./weekRecipe.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","\n\n\n","\n\n\n\n\n","import { render } from \"./daily_recipe_detail.vue?vue&type=template&id=3aa7671a\"\nimport script from \"./daily_recipe_detail.vue?vue&type=script&lang=js\"\nexport * from \"./daily_recipe_detail.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","import { render } from \"./dailyRecipeDetail.vue?vue&type=template&id=a73306e8\"\nimport script from \"./dailyRecipeDetail.vue?vue&type=script&lang=js\"\nexport * from \"./dailyRecipeDetail.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","import { createRouter, createWebHistory } from 'vue-router'\nimport Home from '@/views/home.vue'\nimport RecipeDetail from '@/views/recipeDetail.vue'\nimport WeekRecipe from '@/views/weekRecipe.vue'\nimport DailyRecipeDetail from '@/views/dailyRecipeDetail.vue'\n\nconst routes = [\n {\n path: '/',\n name: 'Home',\n component: Home,\n },\n {\n path: '/recipe/:id',\n name: \"RecipeDetail\",\n component: RecipeDetail\n },\n {\n path: '/week-recipe/',\n name: \"WeekRecipe\",\n component: WeekRecipe\n },\n {\n path: '/daily-recipe/:id',\n name: \"DailyRecipeDetail\",\n component: DailyRecipeDetail\n },\n];\n\nconst router = createRouter({\n history: createWebHistory(),\n routes,\n});\n\nexport default router;\n","import { createApp } from 'vue'\nimport App from './App.vue'\nimport 'bootstrap/dist/css/bootstrap.min.css'\nimport installElementPlus from './plugins/element'\nimport ElementPlus from 'element-plus'\n// import 'element-plus/lib/theme-chalk/index.css'\nimport router from './router'\n\nconst app = createApp(App)\ninstallElementPlus(app)\napp.use(ElementPlus)\napp.use(router).mount('#app')\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./home.vue?vue&type=style&index=0&id=2f7ecc30&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./recipeDetail.vue?vue&type=style&index=0&id=091caa05&lang=css\"","const type_map = {\n vegetable: '青菜',\n meat: '肉',\n soup: '汤',\n};\nconst rate_map = {\n 1: '🍚',\n 2: '🍚 🍚',\n 3: '🍚 🍚 🍚',\n 4: '🍚 🍚 🍚 🍚',\n 5: '🍚 🍚 🍚 🍚 🍚',\n};\nconst difficulty_map = {\n 1: '⭐',\n 2: '⭐ ⭐',\n 3: '⭐ ⭐ ⭐',\n 4: '⭐ ⭐ ⭐ ⭐',\n 5: '⭐ ⭐ ⭐ ⭐ ⭐',\n};\nfunction formatRecipeType(recipe_type) {\n return type_map[recipe_type];\n}\nfunction formatRate(rate) {\n return rate_map[rate];\n}\nfunction formatDifficulty(difficulty) {\n return difficulty_map[difficulty];\n}\n\n\nmodule.exports = {\n RECIPE_TYPE_VEGETABLE: 'vegetable',\n RECIPE_TYPE_META: 'meat',\n RECIPE_TYPE_SOUP: 'soup',\n formatRecipeType,\n formatDifficulty,\n formatRate,\n}\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./week_recipe.vue?vue&type=style&index=0&id=3121e8ee&lang=css\"","module.exports = {\n publicPath: process.env.VUE_APP_BASEURL\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/dist/js/app.df0986dc.js b/frontend/dist/js/app.df0986dc.js new file mode 100644 index 0000000..cf71a6f --- /dev/null +++ b/frontend/dist/js/app.df0986dc.js @@ -0,0 +1,2 @@ +(function(e){function t(t){for(var c,u,i=t[0],l=t[1],o=t[2],p=0,f=[];p\n \n\n\n\n","import { render } from \"./App.vue?vue&type=template&id=2969681c\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","import ElementPlus from 'element-plus'\nimport 'element-plus/lib/theme-chalk/index.css'\nimport locale from 'element-plus/lib/locale/lang/zh-cn'\n\nexport default (app) => {\n app.use(ElementPlus, { locale })\n}\n","\n\n\n\n","\n\n\n\n","import { render } from \"./input_recipe.vue?vue&type=template&id=16b31338&scoped=true\"\nimport script from \"./input_recipe.vue?vue&type=script&lang=js\"\nexport * from \"./input_recipe.vue?vue&type=script&lang=js\"\n\nimport \"./input_recipe.vue?vue&type=style&index=0&id=16b31338&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-16b31338\"\n\nexport default script","\n\n\n\n\n","import { render } from \"./recipe_list.vue?vue&type=template&id=40bc726c\"\nimport script from \"./recipe_list.vue?vue&type=script&lang=js\"\nexport * from \"./recipe_list.vue?vue&type=script&lang=js\"\n\nimport \"./recipe_list.vue?vue&type=style&index=0&id=40bc726c&lang=css\"\nscript.render = render\n\nexport default script","import { render } from \"./home.vue?vue&type=template&id=2f7ecc30\"\nimport script from \"./home.vue?vue&type=script&lang=js\"\nexport * from \"./home.vue?vue&type=script&lang=js\"\n\nimport \"./home.vue?vue&type=style&index=0&id=2f7ecc30&lang=css\"\nscript.render = render\n\nexport default script","\n\n\n\n","import { render } from \"./recipeDetail.vue?vue&type=template&id=091caa05\"\nimport script from \"./recipeDetail.vue?vue&type=script&lang=js\"\nexport * from \"./recipeDetail.vue?vue&type=script&lang=js\"\n\nimport \"./recipeDetail.vue?vue&type=style&index=0&id=091caa05&lang=css\"\nscript.render = render\n\nexport default script","\n\n\n\n\n","\n\n\n\n\n","import { render } from \"./week_recipe.vue?vue&type=template&id=3121e8ee\"\nimport script from \"./week_recipe.vue?vue&type=script&lang=js\"\nexport * from \"./week_recipe.vue?vue&type=script&lang=js\"\n\nimport \"./week_recipe.vue?vue&type=style&index=0&id=3121e8ee&lang=css\"\nscript.render = render\n\nexport default script","import { render } from \"./weekRecipe.vue?vue&type=template&id=5a47131a\"\nimport script from \"./weekRecipe.vue?vue&type=script&lang=js\"\nexport * from \"./weekRecipe.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","\n\n\n","\n\n\n\n\n","import { render } from \"./daily_recipe_detail.vue?vue&type=template&id=3aa7671a\"\nimport script from \"./daily_recipe_detail.vue?vue&type=script&lang=js\"\nexport * from \"./daily_recipe_detail.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","import { render } from \"./dailyRecipeDetail.vue?vue&type=template&id=a73306e8\"\nimport script from \"./dailyRecipeDetail.vue?vue&type=script&lang=js\"\nexport * from \"./dailyRecipeDetail.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","import { createRouter, createWebHistory } from 'vue-router'\nimport Home from '@/views/home.vue'\nimport RecipeDetail from '@/views/recipeDetail.vue'\nimport WeekRecipe from '@/views/weekRecipe.vue'\nimport DailyRecipeDetail from '@/views/dailyRecipeDetail.vue'\n\nconst routes = [\n {\n path: '/',\n name: 'Home',\n component: Home,\n },\n {\n path: '/recipe/:id',\n name: \"RecipeDetail\",\n component: RecipeDetail\n },\n {\n path: '/week-recipe/',\n name: \"WeekRecipe\",\n component: WeekRecipe\n },\n {\n path: '/daily-recipe/:id',\n name: \"DailyRecipeDetail\",\n component: DailyRecipeDetail\n },\n];\n\nconst router = createRouter({\n history: createWebHistory(),\n routes,\n});\n\nexport default router;\n","import { createApp } from 'vue'\nimport App from './App.vue'\nimport 'bootstrap/dist/css/bootstrap.min.css'\nimport installElementPlus from './plugins/element'\nimport ElementPlus from 'element-plus'\n// import 'element-plus/lib/theme-chalk/index.css'\nimport router from './router'\n\nconst app = createApp(App)\ninstallElementPlus(app)\napp.use(ElementPlus)\napp.use(router).mount('#app')\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./home.vue?vue&type=style&index=0&id=2f7ecc30&lang=css\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./recipeDetail.vue?vue&type=style&index=0&id=091caa05&lang=css\"","const type_map = {\n vegetable: '青菜',\n meat: '肉',\n soup: '汤',\n};\nconst rate_map = {\n 1: '🍚',\n 2: '🍚 🍚',\n 3: '🍚 🍚 🍚',\n 4: '🍚 🍚 🍚 🍚',\n 5: '🍚 🍚 🍚 🍚 🍚',\n};\nconst difficulty_map = {\n 1: '⭐',\n 2: '⭐ ⭐',\n 3: '⭐ ⭐ ⭐',\n 4: '⭐ ⭐ ⭐ ⭐',\n 5: '⭐ ⭐ ⭐ ⭐ ⭐',\n};\nfunction formatRecipeType(recipe_type) {\n return type_map[recipe_type];\n}\nfunction formatRate(rate) {\n return rate_map[rate];\n}\nfunction formatDifficulty(difficulty) {\n return difficulty_map[difficulty];\n}\n\n\nmodule.exports = {\n RECIPE_TYPE_VEGETABLE: 'vegetable',\n RECIPE_TYPE_META: 'meat',\n RECIPE_TYPE_SOUP: 'soup',\n formatRecipeType,\n formatDifficulty,\n formatRate,\n}\n","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./week_recipe.vue?vue&type=style&index=0&id=3121e8ee&lang=css\"","module.exports = {\n publicPath: process.env.VUE_APP_BASEURL\n}\n"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/src/components/recipe_list.vue b/frontend/src/components/recipe_list.vue index a0ec729..f56f2cc 100644 --- a/frontend/src/components/recipe_list.vue +++ b/frontend/src/components/recipe_list.vue @@ -30,6 +30,17 @@ + + + +