feat(mobile recipe list / recipe create / week recipe page): [A] 增加移动版页面

[A] 增加移动版页面

Signed-off-by: Ching <loooching@gmail.com>
This commit is contained in:
Ching 2021-10-07 04:13:15 +08:00
parent 07568e4337
commit 97f7345aa6
18 changed files with 628 additions and 102 deletions

View File

@ -1,5 +1,16 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
],
"plugins": [
[
"import",
{
"libraryName": "vant",
"libraryDirectory": "es",
"style": true
}
]
]
}

View File

@ -1 +1 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>frontend</title><link href="/css/app.0786e41a.css" rel="preload" as="style"><link href="/css/chunk-vendors.8823d44d.css" rel="preload" as="style"><link href="/js/app.06e83add.js" rel="preload" as="script"><link href="/js/chunk-vendors.bb844861.js" rel="preload" as="script"><link href="/css/chunk-vendors.8823d44d.css" rel="stylesheet"><link href="/css/app.0786e41a.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but frontend doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.bb844861.js"></script><script src="/js/app.06e83add.js"></script></body></html>
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/favicon.ico"><title>frontend</title><link href="/css/app.0786e41a.css" rel="preload" as="style"><link href="/css/chunk-vendors.8823d44d.css" rel="preload" as="style"><link href="/js/app.06e83add.js" rel="preload" as="script"><link href="/js/chunk-vendors.da99e88d.js" rel="preload" as="script"><link href="/css/chunk-vendors.8823d44d.css" rel="stylesheet"><link href="/css/app.0786e41a.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but frontend doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script src="/js/chunk-vendors.da99e88d.js"></script><script src="/js/app.06e83add.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,9 @@
"bootstrap": "^5.1.1",
"core-js": "^3.6.5",
"element-plus": "^1.0.2-beta.28",
"vant": "^3.2.4",
"vue": "^3.2.2",
"vue-cli-plugin-vant": "^1.0.1",
"vue-router": "^4.0.11"
},
"devDependencies": {
@ -22,7 +24,7 @@
"@vue/cli-service": "~4.5.0",
"@vue/compiler-sfc": "^3.0.5",
"babel-eslint": "^10.1.0",
"dotenv-webpack": "^7.0.3",
"babel-plugin-import": "^1.13.3",
"eslint": "^6.8.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-vue": "^7.17.0",
@ -2093,6 +2095,34 @@
"node": ">= 8"
}
},
"node_modules/@vant/icons": {
"version": "1.7.1",
"resolved": "https://registry.nlark.com/@vant/icons/download/@vant/icons-1.7.1.tgz?cache=0&sync_timestamp=1631954488381&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vant%2Ficons%2Fdownload%2F%40vant%2Ficons-1.7.1.tgz",
"integrity": "sha1-Sa5CAwK1WB5U5olIkeWgW8dun4c="
},
"node_modules/@vant/lazyload": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/@vant/lazyload/download/@vant/lazyload-1.4.0.tgz",
"integrity": "sha1-4FKTJpF9jLImTuLk6wjxoDqrLB0=",
"license": "MIT",
"dependencies": {
"@vant/use": "^1.3.2"
}
},
"node_modules/@vant/popperjs": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/@vant/popperjs/download/@vant/popperjs-1.1.0.tgz?cache=0&sync_timestamp=1617712371368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vant%2Fpopperjs%2Fdownload%2F%40vant%2Fpopperjs-1.1.0.tgz",
"integrity": "sha1-tO3uW7+m+xhwWYbjE9T9XxeUKg8=",
"dependencies": {
"@popperjs/core": "^2.9.2"
}
},
"node_modules/@vant/use": {
"version": "1.3.2",
"resolved": "https://registry.npmmirror.com/@vant/use/download/@vant/use-1.3.2.tgz?cache=0&sync_timestamp=1632970350432&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40vant%2Fuse%2Fdownload%2F%40vant%2Fuse-1.3.2.tgz",
"integrity": "sha1-1PIy8EQN88BYxlA3rm8g69DAatM=",
"license": "MIT"
},
"node_modules/@vue/babel-helper-vue-jsx-merge-props": {
"version": "1.2.1",
"resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz?cache=0&sync_timestamp=1602851122331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-jsx-merge-props%2Fdownload%2F%40vue%2Fbabel-helper-vue-jsx-merge-props-1.2.1.tgz",
@ -3613,6 +3643,16 @@
"object.assign": "^4.1.0"
}
},
"node_modules/babel-plugin-import": {
"version": "1.13.3",
"resolved": "https://registry.nlark.com/babel-plugin-import/download/babel-plugin-import-1.13.3.tgz",
"integrity": "sha1-nbu6fRrHK9QSkXqDDUReAJQdJtc=",
"dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/runtime": "^7.0.0"
}
},
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.2.2",
"resolved": "https://registry.nlark.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.2.2.tgz?cache=0&sync_timestamp=1622023904181&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-polyfill-corejs2%2Fdownload%2Fbabel-plugin-polyfill-corejs2-0.2.2.tgz",
@ -6107,15 +6147,6 @@
"node": ">=10"
}
},
"node_modules/dotenv-defaults": {
"version": "2.0.2",
"resolved": "https://registry.nlark.com/dotenv-defaults/download/dotenv-defaults-2.0.2.tgz",
"integrity": "sha1-az7C5DGar7cJQKvactOFZ3Dud6w=",
"dev": true,
"dependencies": {
"dotenv": "^8.2.0"
}
},
"node_modules/dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.nlark.com/dotenv-expand/download/dotenv-expand-5.1.0.tgz",
@ -6123,21 +6154,6 @@
"dev": true,
"license": "BSD-2-Clause"
},
"node_modules/dotenv-webpack": {
"version": "7.0.3",
"resolved": "https://registry.nlark.com/dotenv-webpack/download/dotenv-webpack-7.0.3.tgz?cache=0&sync_timestamp=1622697504782&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv-webpack%2Fdownload%2Fdotenv-webpack-7.0.3.tgz",
"integrity": "sha1-9Q7Dxwg6aexgduEQVmcgADt7EHs=",
"dev": true,
"dependencies": {
"dotenv-defaults": "^2.0.2"
},
"engines": {
"node": ">=10"
},
"peerDependencies": {
"webpack": "^4 || ^5"
}
},
"node_modules/duplexer": {
"version": "0.1.2",
"resolved": "https://registry.nlark.com/duplexer/download/duplexer-0.1.2.tgz",
@ -13850,6 +13866,20 @@
"spdx-expression-parse": "^3.0.0"
}
},
"node_modules/vant": {
"version": "3.2.4",
"resolved": "https://registry.npmmirror.com/vant/download/vant-3.2.4.tgz",
"integrity": "sha1-DZ/QxYoJ1WuRxNVBD+4M25icjrg=",
"dependencies": {
"@vant/icons": "^1.7.1",
"@vant/lazyload": "^1.3.0",
"@vant/popperjs": "^1.1.0",
"@vant/use": "^1.3.1"
},
"peerDependencies": {
"vue": "^3.0.0"
}
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.nlark.com/vary/download/vary-1.1.2.tgz",
@ -13914,6 +13944,11 @@
"dev": true,
"license": "MIT"
},
"node_modules/vue-cli-plugin-vant": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/vue-cli-plugin-vant/download/vue-cli-plugin-vant-1.0.1.tgz",
"integrity": "sha1-uPobVa/U2q8UDUHZa+NW5F2Pt78="
},
"node_modules/vue-eslint-parser": {
"version": "7.10.0",
"resolved": "https://registry.nlark.com/vue-eslint-parser/download/vue-eslint-parser-7.10.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.10.0.tgz",
@ -16411,6 +16446,32 @@
}
}
},
"@vant/icons": {
"version": "1.7.1",
"resolved": "https://registry.nlark.com/@vant/icons/download/@vant/icons-1.7.1.tgz?cache=0&sync_timestamp=1631954488381&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vant%2Ficons%2Fdownload%2F%40vant%2Ficons-1.7.1.tgz",
"integrity": "sha1-Sa5CAwK1WB5U5olIkeWgW8dun4c="
},
"@vant/lazyload": {
"version": "1.4.0",
"resolved": "https://registry.npmmirror.com/@vant/lazyload/download/@vant/lazyload-1.4.0.tgz",
"integrity": "sha1-4FKTJpF9jLImTuLk6wjxoDqrLB0=",
"requires": {
"@vant/use": "^1.3.2"
}
},
"@vant/popperjs": {
"version": "1.1.0",
"resolved": "https://registry.npm.taobao.org/@vant/popperjs/download/@vant/popperjs-1.1.0.tgz?cache=0&sync_timestamp=1617712371368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vant%2Fpopperjs%2Fdownload%2F%40vant%2Fpopperjs-1.1.0.tgz",
"integrity": "sha1-tO3uW7+m+xhwWYbjE9T9XxeUKg8=",
"requires": {
"@popperjs/core": "^2.9.2"
}
},
"@vant/use": {
"version": "1.3.2",
"resolved": "https://registry.npmmirror.com/@vant/use/download/@vant/use-1.3.2.tgz?cache=0&sync_timestamp=1632970350432&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40vant%2Fuse%2Fdownload%2F%40vant%2Fuse-1.3.2.tgz",
"integrity": "sha1-1PIy8EQN88BYxlA3rm8g69DAatM="
},
"@vue/babel-helper-vue-jsx-merge-props": {
"version": "1.2.1",
"resolved": "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz?cache=0&sync_timestamp=1602851122331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-jsx-merge-props%2Fdownload%2F%40vue%2Fbabel-helper-vue-jsx-merge-props-1.2.1.tgz",
@ -17589,6 +17650,16 @@
"object.assign": "^4.1.0"
}
},
"babel-plugin-import": {
"version": "1.13.3",
"resolved": "https://registry.nlark.com/babel-plugin-import/download/babel-plugin-import-1.13.3.tgz",
"integrity": "sha1-nbu6fRrHK9QSkXqDDUReAJQdJtc=",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.0.0",
"@babel/runtime": "^7.0.0"
}
},
"babel-plugin-polyfill-corejs2": {
"version": "0.2.2",
"resolved": "https://registry.nlark.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.2.2.tgz?cache=0&sync_timestamp=1622023904181&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-polyfill-corejs2%2Fdownload%2Fbabel-plugin-polyfill-corejs2-0.2.2.tgz",
@ -19586,30 +19657,12 @@
"integrity": "sha1-Bhr2ZNGff02PxuT/m1hM4jety4s=sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==",
"dev": true
},
"dotenv-defaults": {
"version": "2.0.2",
"resolved": "https://registry.nlark.com/dotenv-defaults/download/dotenv-defaults-2.0.2.tgz",
"integrity": "sha1-az7C5DGar7cJQKvactOFZ3Dud6w=",
"dev": true,
"requires": {
"dotenv": "^8.2.0"
}
},
"dotenv-expand": {
"version": "5.1.0",
"resolved": "https://registry.nlark.com/dotenv-expand/download/dotenv-expand-5.1.0.tgz",
"integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
"dev": true
},
"dotenv-webpack": {
"version": "7.0.3",
"resolved": "https://registry.nlark.com/dotenv-webpack/download/dotenv-webpack-7.0.3.tgz?cache=0&sync_timestamp=1622697504782&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv-webpack%2Fdownload%2Fdotenv-webpack-7.0.3.tgz",
"integrity": "sha1-9Q7Dxwg6aexgduEQVmcgADt7EHs=",
"dev": true,
"requires": {
"dotenv-defaults": "^2.0.2"
}
},
"duplexer": {
"version": "0.1.2",
"resolved": "https://registry.nlark.com/duplexer/download/duplexer-0.1.2.tgz",
@ -25756,6 +25809,17 @@
"spdx-expression-parse": "^3.0.0"
}
},
"vant": {
"version": "3.2.4",
"resolved": "https://registry.npmmirror.com/vant/download/vant-3.2.4.tgz",
"integrity": "sha1-DZ/QxYoJ1WuRxNVBD+4M25icjrg=",
"requires": {
"@vant/icons": "^1.7.1",
"@vant/lazyload": "^1.3.0",
"@vant/popperjs": "^1.1.0",
"@vant/use": "^1.3.1"
}
},
"vary": {
"version": "1.1.2",
"resolved": "https://registry.nlark.com/vary/download/vary-1.1.2.tgz",
@ -25809,6 +25873,11 @@
"integrity": "sha1-2oKXdjc6rUJp/CO1e7OqBDvGd0Q=sha512-ctG5mynJIyGLFBhS2JpzXmBWT3JRXwzMm5AoANUmBlbZHTruct1xQF2OKM/mfJv6tSfqCcEfgH8rGCAY5ca83Q==",
"dev": true
},
"vue-cli-plugin-vant": {
"version": "1.0.1",
"resolved": "https://registry.npm.taobao.org/vue-cli-plugin-vant/download/vue-cli-plugin-vant-1.0.1.tgz",
"integrity": "sha1-uPobVa/U2q8UDUHZa+NW5F2Pt78="
},
"vue-eslint-parser": {
"version": "7.10.0",
"resolved": "https://registry.nlark.com/vue-eslint-parser/download/vue-eslint-parser-7.10.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.10.0.tgz",

View File

@ -15,6 +15,7 @@
"bootstrap": "^5.1.1",
"core-js": "^3.6.5",
"element-plus": "^1.0.2-beta.28",
"vant": "^3.2.4",
"vue": "^3.2.2",
"vue-router": "^4.0.11"
},
@ -24,10 +25,12 @@
"@vue/cli-service": "~4.5.0",
"@vue/compiler-sfc": "^3.0.5",
"babel-eslint": "^10.1.0",
"babel-plugin-import": "^1.13.3",
"eslint": "^6.8.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-vue": "^7.17.0",
"vue-cli-plugin-element-plus": "~0.0.13"
"vue-cli-plugin-element-plus": "~0.0.13",
"vue-cli-plugin-vant": "^1.0.1"
},
"eslintConfig": {
"root": true,

View File

@ -0,0 +1,87 @@
<template>
<van-list
v-model:loading="loading"
:finished="finished"
finished-text="没有更多了"
@load="onLoad"
class="recipe-list"
>
<van-cell center v-for:="recipe in recipes" size="large" clickable>
<template #title>
<van-tag class="recipe-type-tag" plain type="primary">{{
constants.formatRecipeType(recipe.recipe_type)
}}</van-tag>
<span class="recipe-name"> {{ recipe.name }}</span>
</template>
<template #value>
{{ recipe.difficulty }} <van-icon name="star" /> · {{ recipe.rate }}
<van-icon name="like" />
</template>
</van-cell>
</van-list>
</template>
<script>
import { Cell, List, Tag, Collapse, CollapseItem, Icon } from 'vant';
import axios from 'axios';
import config from '@/config/index.js';
import constants from '@/utils/constants';
export default {
name: 'RecipeMobileRecipeList',
components: {
[Cell.name]: Cell,
[List.name]: List,
[Tag.name]: Tag,
[Collapse.name]: Collapse,
[CollapseItem.name]: CollapseItem,
[Icon.name]: Icon,
},
data: function() {
return {
loading: false,
finished: false,
page_count: 0,
total_count: 0,
page: 0,
recipes: [],
constants: constants,
is_link: true,
activeNames: ['1'],
};
},
mounted() {},
methods: {
onLoad() {
this.getRecipes(this.page + 1);
this.page += 1;
if (this.page === this.page_count) {
this.finished = true;
}
},
getRecipes(page) {
axios
.get(config.publicPath + '/recipe/recipe/?page=' + page)
.then(
(response) => (
(this.page_count = response.data.page_count),
(this.total_count = response.data.count),
this.recipes.push(...response.data.results),
(this.page = page),
(this.loading = false)
)
);
},
},
};
</script>
<style>
.recipe-type-tag {
margin: 0 10px 0px 0px;
padding-bottom: 0px;
}
.recipe-list {
height: 50%;
}
</style>

View File

@ -0,0 +1,30 @@
<template>
<van-tabbar route fixed placeholder class="recipe-tabar">
<van-tabbar-item to="/recipe-mobile/week-recipe/" icon="calendar-o">
每周菜谱
</van-tabbar-item>
<van-tabbar-item to="/recipe-mobile/" icon="orders-o">
菜谱列表
</van-tabbar-item>
<van-tabbar-item to="/recipe-mobile/recipe/create/" icon="records">
创建菜谱
</van-tabbar-item>
</van-tabbar>
</template>
<script>
import { Tabbar, TabbarItem } from 'vant';
export default {
name: 'RecipeMobileTabbar',
components: {
[Tabbar.name]: Tabbar,
[TabbarItem.name]: TabbarItem,
},
data: function() {
return {};
},
mounted() {},
methods: {},
};
</script>

View File

@ -79,32 +79,11 @@ import axios from 'axios';
import router from '@/router/index';
import config from '@/config/index';
function formatDate(row, column, cellValue) {
if (cellValue === undefined) {
return;
}
var date_ = new Date(cellValue * 1000);
var days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
return days[date_.getDay()];
}
function formatMeal(row, column, cellValue) {
var data = ['/ '];
if (cellValue === undefined) {
return;
}
for (let i = 0; i < cellValue.length; i++) {
data.push(cellValue[i].name + ' / ');
}
return data;
}
export default {
name: 'WeekRecipe',
data: function() {
return {
daily_recipes: [],
formatDate,
formatMeal,
};
},
mounted() {
@ -125,6 +104,14 @@ export default {
editDailyRecipe(row) {
router.push({ name: 'DailyRecipeDetail', params: { id: row.id } });
},
formatDate(row, column, cellValue) {
if (cellValue === undefined) {
return;
}
var date_ = new Date(cellValue * 1000);
var days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
return days[date_.getDay()];
},
},
};
</script>

View File

@ -4,9 +4,12 @@ import 'bootstrap/dist/css/bootstrap.min.css'
import installElementPlus from './plugins/element'
import ElementPlus from 'element-plus'
// import 'element-plus/lib/theme-chalk/index.css'
// import Vant from 'vant';
// import 'vant/lib/index.css';
import router from './router'
const app = createApp(App)
installElementPlus(app)
app.use(ElementPlus)
// app.use(Vant)
app.use(router).mount('#app')

View File

@ -3,6 +3,9 @@ import Home from '@/views/home.vue'
import RecipeDetail from '@/views/recipeDetail.vue'
import WeekRecipe from '@/views/weekRecipe.vue'
import DailyRecipeDetail from '@/views/dailyRecipeDetail.vue'
import RecipeMobileHome from '@/views/recipe-mobile/Home.vue'
import RecipeMobileRecipeCreate from '@/views/recipe-mobile/RecipeCreate.vue'
import RecipeMobileWeekRecipe from '@/views/recipe-mobile/WeekRecipe.vue'
const routes = [
{
@ -25,6 +28,23 @@ const routes = [
name: "DailyRecipeDetail",
component: DailyRecipeDetail
},
// mobile recipe
{
path: '/recipe-mobile/',
name: "RecipeMobileHome",
component: RecipeMobileHome
},
{
path: '/recipe-mobile/recipe/create/',
name: "RecipeMobileRecipeCreate",
component: RecipeMobileRecipeCreate
},
{
path: '/recipe-mobile/week-recipe/',
name: "RecipeMobileWeekRecipe",
component: RecipeMobileWeekRecipe
},
];
const router = createRouter({

View File

@ -1,5 +1,5 @@
const type_map = {
vegetable: '菜',
vegetable: '菜',
meat: '肉',
soup: '汤',
};

View File

@ -0,0 +1,29 @@
1<template>
<recipe_list />
<tabbar />
</template>
<script>
// import { Tabbar, TabbarItem } from 'vant';
import recipe_list from '@/components/recipe-mobile/recipe-list.vue';
import tabbar from '@/components/recipe-mobile/tabbar.vue';
export default {
name: 'RecipeMobileHome',
components: {
tabbar,
recipe_list,
},
data: function() {
return {};
},
mounted() {},
methods: {},
};
</script>
<style>
body {
background-color: #f7f8fa;
}
</style>

View File

@ -0,0 +1,117 @@
<template>
<van-form @submit="onSubmit" class="recipe-create-form">
<van-cell-group class="recipe-create" inset border>
<van-field
v-model="name"
name="name"
label="菜名"
placehoder="鱼香茄子..."
:rules="[{ required: true, message: '请填写菜名' }]"
/>
<van-field name="reicpe_type" label="类型">
<template #input>
<van-radio-group v-model="recipe_type" direction="horizontal">
<van-radio name="meat" shape="square"></van-radio>
<van-radio name="vegetable" shape="square"></van-radio>
<van-radio name="soup" shape="square"></van-radio>
</van-radio-group>
</template>
</van-field>
<van-field name="rate" label="评分">
<template #input>
<van-rate v-model="rate" void-icon="like-o" icon="like"></van-rate>
</template>
</van-field>
<van-field name="difficulty" label="难度">
<template #input>
<van-rate v-model="difficulty" color="#ffd21e"></van-rate>
</template>
</van-field>
</van-cell-group>
<van-cell-group class="recipe-create" inset border>
<van-field
v-model="note"
rows="2"
auto-size
label="备注"
type="textarea"
/>
</van-cell-group>
<div class="recipe-create">
<van-button
round
type="primary"
block
plain
@click="onSubmit"
:loading="loading"
>提交</van-button
>
</div>
</van-form>
<tabbar />
</template>
<script>
import tabbar from '@/components/recipe-mobile/tabbar.vue';
import { Form, Field, CellGroup, Radio, RadioGroup, Rate, Button } from 'vant';
import axios from 'axios';
import config from '@/config/index';
import router from '@/router/index';
import constants from '@/utils/constants.js';
export default {
name: 'RecipeMobileRecipeCreate',
components: {
[Form.name]: Form,
[Field.name]: Field,
[CellGroup.name]: CellGroup,
[Radio.name]: Radio,
[RadioGroup.name]: RadioGroup,
[Rate.name]: Rate,
[Button.name]: Button,
tabbar,
},
data: function() {
return {
name: null,
recipe_type: null,
rate: 0,
difficulty: 0,
note: null,
loading: false,
};
},
mounted() {},
methods: {
onSubmit() {
if (!this.name) {
return;
}
this.loading = true;
let data = {
name: this.name,
recipe_type: this.recipe_type
? this.recipe_type
: constants.RECIPE_TYPE_META,
difficulty: this.difficulty ? this.difficulty : 1,
rate: this.rate ? this.rate : 1,
note: this.note ? this.note : null,
};
axios
.post(config.publicPath + '/recipe/recipe/', data)
.then(
(response) => (response, router.push({ name: 'RecipeMobileHome' }))
);
},
},
};
</script>
<style>
.recipe-create {
margin: 20px 16px;
}
</style>

View File

@ -0,0 +1,131 @@
<template>
<van-pull-refresh v-model="loading" @refresh="onRefresh">
<van-cell-group
inset
v-for:="daily_recipe in daily_recipes"
:title="formatDate(daily_recipe.date)"
class="daily_recipes"
>
<van-row>
<van-col span="3">
<van-grid :column-num="1">
<van-grid-item text="肉" class="recipe_type"></van-grid-item>
</van-grid>
</van-col>
<van-col span="21">
<van-grid :column-num="3">
<van-grid-item
v-for:="recipe in daily_recipe.meat"
:text="recipe.name"
/>
</van-grid>
</van-col>
</van-row>
<van-row>
<van-col span="3">
<van-grid :column-num="1">
<van-grid-item text="菜" class="recipe_type"></van-grid-item>
</van-grid>
</van-col>
<van-col span="21">
<van-grid :column-num="3">
<van-grid-item
v-for:="recipe in daily_recipe.vegetable"
:text="recipe.name"
/>
</van-grid>
</van-col>
</van-row>
<van-row v-if="daily_recipe.soup.length > 0">
<van-col span="3">
<van-grid :column-num="1">
<van-grid-item text="汤" class="recipe_type"></van-grid-item>
</van-grid>
</van-col>
<van-col span="21">
<van-grid :column-num="1">
<van-grid-item
v-for:="recipe in daily_recipe.soup"
:text="recipe.name"
/>
</van-grid>
</van-col>
</van-row>
</van-cell-group>
</van-pull-refresh>
<tabbar />
</template>
<script>
import tabbar from '@/components/recipe-mobile/tabbar.vue';
import {
Tag,
Cell,
CellGroup,
Col,
Row,
Button,
Grid,
GridItem,
PullRefresh,
} from 'vant';
import axios from 'axios';
import config from '@/config/index';
// import router from '@/router/index';
// import constants from '@/utils/constants.js';
export default {
name: 'RecipeMobileWeekRecipe',
components: {
[CellGroup.name]: CellGroup,
[Cell.name]: Cell,
[Col.name]: Col,
[Row.name]: Row,
[Tag.name]: Tag,
[Grid.name]: Grid,
[GridItem.name]: GridItem,
[Button.name]: Button,
[PullRefresh.name]: PullRefresh,
tabbar,
},
data: function() {
return {
daily_recipes: [],
loading: false,
};
},
mounted() {
axios
.get(config.publicPath + '/recipe/week-recipe/')
.then((response) => (this.daily_recipes = response.data));
},
methods: {
formatDate(date) {
if (date === undefined) {
return;
}
var date_ = new Date(date * 1000);
var days = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'];
return days[date_.getDay()];
},
onRefresh() {
axios
.post(config.publicPath + '/recipe/week-recipe/')
.then(
(response) => (
(this.daily_recipes = response.data), (this.loading = false)
)
);
},
},
};
</script>
<style>
.recipe_type .van-grid-item__content {
background-color: #f2f3f5;
/* font-size: var(--van-font-size-lg); */
}
.daily_recipes:last-child {
margin-bottom: 20px;
}
</style>

View File

@ -864,7 +864,7 @@
"@babel/types" "^7.4.4"
"esutils" "^2.0.2"
"@babel/runtime@^7.11.0", "@babel/runtime@^7.8.4":
"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.0", "@babel/runtime@^7.8.4":
"integrity" "sha1-/RfRa/34eObdAtGXU6OfqKjZyEo="
"resolved" "https://registry.nlark.com/@babel/runtime/download/@babel/runtime-7.15.4.tgz?cache=0&sync_timestamp=1630618785994&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fruntime%2Fdownload%2F%40babel%2Fruntime-7.15.4.tgz"
"version" "7.15.4"
@ -962,7 +962,7 @@
"resolved" "https://registry.nlark.com/@nodelib/fs.stat/download/@nodelib/fs.stat-1.1.3.tgz?cache=0&sync_timestamp=1622792655362&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40nodelib%2Ffs.stat%2Fdownload%2F%40nodelib%2Ffs.stat-1.1.3.tgz"
"version" "1.1.3"
"@popperjs/core@^2.10.1", "@popperjs/core@^2.4.4":
"@popperjs/core@^2.10.1", "@popperjs/core@^2.4.4", "@popperjs/core@^2.9.2":
"integrity" "sha1-co7NlasgequKmk5CHwQi2zKSMr4="
"resolved" "https://registry.nlark.com/@popperjs/core/download/@popperjs/core-2.10.1.tgz?cache=0&sync_timestamp=1630646750615&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40popperjs%2Fcore%2Fdownload%2F%40popperjs%2Fcore-2.10.1.tgz"
"version" "2.10.1"
@ -1146,6 +1146,30 @@
"anymatch" "^3.0.0"
"source-map" "^0.6.0"
"@vant/icons@^1.7.1":
"integrity" "sha1-Sa5CAwK1WB5U5olIkeWgW8dun4c="
"resolved" "https://registry.nlark.com/@vant/icons/download/@vant/icons-1.7.1.tgz?cache=0&sync_timestamp=1631954488381&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40vant%2Ficons%2Fdownload%2F%40vant%2Ficons-1.7.1.tgz"
"version" "1.7.1"
"@vant/lazyload@^1.3.0":
"integrity" "sha1-4FKTJpF9jLImTuLk6wjxoDqrLB0="
"resolved" "https://registry.npmmirror.com/@vant/lazyload/download/@vant/lazyload-1.4.0.tgz"
"version" "1.4.0"
dependencies:
"@vant/use" "^1.3.2"
"@vant/popperjs@^1.1.0":
"integrity" "sha1-tO3uW7+m+xhwWYbjE9T9XxeUKg8="
"resolved" "https://registry.npm.taobao.org/@vant/popperjs/download/@vant/popperjs-1.1.0.tgz?cache=0&sync_timestamp=1617712371368&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vant%2Fpopperjs%2Fdownload%2F%40vant%2Fpopperjs-1.1.0.tgz"
"version" "1.1.0"
dependencies:
"@popperjs/core" "^2.9.2"
"@vant/use@^1.3.1", "@vant/use@^1.3.2":
"integrity" "sha1-1PIy8EQN88BYxlA3rm8g69DAatM="
"resolved" "https://registry.npmmirror.com/@vant/use/download/@vant/use-1.3.2.tgz?cache=0&sync_timestamp=1632970350432&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40vant%2Fuse%2Fdownload%2F%40vant%2Fuse-1.3.2.tgz"
"version" "1.3.2"
"@vue/babel-helper-vue-jsx-merge-props@^1.2.1":
"integrity" "sha1-MWJKelBfsU2h1YAjclpMXycOaoE=sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA=="
"resolved" "https://registry.npm.taobao.org/@vue/babel-helper-vue-jsx-merge-props/download/@vue/babel-helper-vue-jsx-merge-props-1.2.1.tgz?cache=0&sync_timestamp=1602851122331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fbabel-helper-vue-jsx-merge-props%2Fdownload%2F%40vue%2Fbabel-helper-vue-jsx-merge-props-1.2.1.tgz"
@ -1988,6 +2012,14 @@
dependencies:
"object.assign" "^4.1.0"
"babel-plugin-import@^1.13.3":
"integrity" "sha1-nbu6fRrHK9QSkXqDDUReAJQdJtc="
"resolved" "https://registry.nlark.com/babel-plugin-import/download/babel-plugin-import-1.13.3.tgz"
"version" "1.13.3"
dependencies:
"@babel/helper-module-imports" "^7.0.0"
"@babel/runtime" "^7.0.0"
"babel-plugin-polyfill-corejs2@^0.2.2":
"integrity" "sha1-6RJHheb9lPlLYYp5VOVpMFO/Uyc="
"resolved" "https://registry.nlark.com/babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.2.2.tgz?cache=0&sync_timestamp=1622023904181&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fbabel-plugin-polyfill-corejs2%2Fdownload%2Fbabel-plugin-polyfill-corejs2-0.2.2.tgz"
@ -3412,25 +3444,11 @@
dependencies:
"is-obj" "^2.0.0"
"dotenv-defaults@^2.0.2":
"integrity" "sha1-az7C5DGar7cJQKvactOFZ3Dud6w="
"resolved" "https://registry.nlark.com/dotenv-defaults/download/dotenv-defaults-2.0.2.tgz"
"version" "2.0.2"
dependencies:
"dotenv" "^8.2.0"
"dotenv-expand@^5.1.0":
"integrity" "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
"resolved" "https://registry.nlark.com/dotenv-expand/download/dotenv-expand-5.1.0.tgz"
"version" "5.1.0"
"dotenv-webpack@^7.0.3":
"integrity" "sha1-9Q7Dxwg6aexgduEQVmcgADt7EHs="
"resolved" "https://registry.nlark.com/dotenv-webpack/download/dotenv-webpack-7.0.3.tgz?cache=0&sync_timestamp=1622697504782&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdotenv-webpack%2Fdownload%2Fdotenv-webpack-7.0.3.tgz"
"version" "7.0.3"
dependencies:
"dotenv-defaults" "^2.0.2"
"dotenv@^8.2.0":
"integrity" "sha1-Bhr2ZNGff02PxuT/m1hM4jety4s=sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g=="
"resolved" "https://registry.nlark.com/dotenv/download/dotenv-8.6.0.tgz"
@ -8496,6 +8514,16 @@
"spdx-correct" "^3.0.0"
"spdx-expression-parse" "^3.0.0"
"vant@^3.2.4":
"integrity" "sha1-DZ/QxYoJ1WuRxNVBD+4M25icjrg="
"resolved" "https://registry.npmmirror.com/vant/download/vant-3.2.4.tgz"
"version" "3.2.4"
dependencies:
"@vant/icons" "^1.7.1"
"@vant/lazyload" "^1.3.0"
"@vant/popperjs" "^1.1.0"
"@vant/use" "^1.3.1"
"vary@~1.1.2":
"integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
"resolved" "https://registry.nlark.com/vary/download/vary-1.1.2.tgz"
@ -8525,6 +8553,11 @@
"resolved" "https://registry.npm.taobao.org/vue-cli-plugin-element-plus/download/vue-cli-plugin-element-plus-0.0.13.tgz"
"version" "0.0.13"
"vue-cli-plugin-vant@^1.0.1":
"integrity" "sha1-uPobVa/U2q8UDUHZa+NW5F2Pt78="
"resolved" "https://registry.npm.taobao.org/vue-cli-plugin-vant/download/vue-cli-plugin-vant-1.0.1.tgz"
"version" "1.0.1"
"vue-eslint-parser@^7.10.0":
"integrity" "sha1-6k5LEP0QqjXIp5rHg0iNirzSm+g="
"resolved" "https://registry.nlark.com/vue-eslint-parser/download/vue-eslint-parser-7.10.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-eslint-parser%2Fdownload%2Fvue-eslint-parser-7.10.0.tgz"
@ -8724,7 +8757,7 @@
"source-list-map" "^2.0.0"
"source-map" "~0.6.1"
"webpack@^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^3.0.0 || ^4.1.0 || ^5.0.0-0", "webpack@^4 || ^5", "webpack@^4.0.0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.1.0 || ^5.0.0-0", "webpack@^4.4.0", "webpack@>=2", "webpack@>=2.0.0 <5.0.0", "webpack@>=4.0.0":
"webpack@^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^2.0.0 || ^3.0.0 || ^4.0.0", "webpack@^3.0.0 || ^4.1.0 || ^5.0.0-0", "webpack@^4.0.0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.1.0 || ^5.0.0-0", "webpack@^4.4.0", "webpack@>=2", "webpack@>=2.0.0 <5.0.0", "webpack@>=4.0.0":
"integrity" "sha1-v5tEBOogoHNgXgoBHRiNd8tq1UI=sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q=="
"resolved" "https://registry.nlark.com/webpack/download/webpack-4.46.0.tgz?cache=0&sync_timestamp=1630682912330&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fwebpack%2Fdownload%2Fwebpack-4.46.0.tgz"
"version" "4.46.0"

View File

@ -1,6 +1,7 @@
import random
from django.db import models
from django.utils.timezone import now
from django.utils.timezone import now, localtime
import datetime
from utils import const
import utils
@ -104,3 +105,18 @@ class DailyRecipe(models.Model):
data['date'] = utils.timestamp_of(utils.day_start(date))
data['id'] = self.id
return data
@classmethod
def get_week_recipe_data(cls):
today = localtime()
week_start = (today - datetime.timedelta(days=today.weekday())).date()
week_end = week_start + datetime.timedelta(days=6)
daily_recipes = cls.objects.filter(
date__gte=week_start,
date__lte=week_end,
).order_by('date')
data = [{}] * (7 - len(daily_recipes))
for daily_recipe in daily_recipes:
data.append(daily_recipe.serialize())
return data

View File

@ -53,21 +53,11 @@ class WeekRecipeListAPI(rest_framework.generics.ListAPIView,
)
daily_recipe.generate_recipe()
recipes.append(daily_recipe.recipes.values_list('id', flat=True))
return Response({}, status=status.HTTP_201_CREATED, headers={})
return Response(recipe.models.DailyRecipe.get_week_recipe_data(),
status=status.HTTP_201_CREATED, headers={})
def get(self, request, *args, **kwargs):
today = localtime()
week_start = (today - datetime.timedelta(days=today.weekday())).date()
week_end = week_start + datetime.timedelta(days=6)
daily_recipes = recipe.models.DailyRecipe.objects.filter(
date__gte=week_start,
date__lte=week_end,
).order_by('date')
data = [{}] * (7 - len(daily_recipes))
for daily_recipe in daily_recipes:
data.append(daily_recipe.serialize())
data = recipe.models.DailyRecipe.get_week_recipe_data()
return Response(data)