Merge branch 'main' into dependabot/npm_and_yarn/npm_and_yarn-46be7da7dc

This commit is contained in:
m1ng 2025-05-28 10:17:46 +08:00 committed by GitHub
commit b75777a10a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
27 changed files with 6712 additions and 5546 deletions

117
.github/CODE_OF_CONDUCT.md vendored Normal file
View file

@ -0,0 +1,117 @@
# Contributor Covenant Code of Conduct
>
> 改编自 [Contributor Covenant](https://www.contributor-covenant.org/zh-cn/version/2/1/code_of_conduct/code_of_conduct.md)
## 我们的承诺
身为社区成员、贡献者和领袖,我们承诺使社区参与者不受骚扰,无论其年龄、体型、可见或不可见的缺陷、族裔、性征、性别认同和表达、经验水平、教育程度、社会与经济地位、国籍、相貌、种族、种姓、肤色、宗教信仰、性倾向或性取向如何。
***我们承诺以有助于建立开放、友善、多样化、包容、健康社区的方式行事和互动。***
## 我们的准则
<details>
<summary>有助于为我们的社区创造积极环境的行为例子包括但不限于:</summary>
* 表现出对他人的同情和善意
* 尊重不同的主张、观点和感受
* 提出和大方接受建设性意见
* 承担责任并向受我们错误影响的人道歉
* 注重社区共同诉求,而非个人得失
</details>
<details>
<summary>不当行为例子包括:</summary>
* 使用情色化的语言或图像,及性引诱或挑逗
* 嘲弄、侮辱或诋毁性评论,以及人身或政治攻击
* 公开或私下的骚扰行为
* 未经他人明确许可,公布他人的私人信息,如物理或电子邮件地址
* 其他有理由认定为违反职业操守的不当行为
</details>
## 责任和权力
社区领袖有责任解释和落实我们所认可的行为准则,并妥善公正地对他们认为不当、威胁、冒犯或有害的任何行为采取纠正措施。
社区领导有权力和责任删除、编辑或拒绝或拒绝与本行为准则不相符的评论comment、提交commits、代码、维基wiki编辑、议题issues或其他贡献并在适当时机知采取措施的理由。
## 适用范围
本行为准则适用于所有社区场合,也适用于在公共场所代表社区[^1]时的个人。
[^1]:代表社区的情形包括使用官方电子邮件地址、通过官方社交媒体帐户发帖或在线上或线下活动中担任指定代表。
辱骂、骚扰或其他不可接受的行为可通过 [插入联系方式] 向负责监督的社区领袖报告。
所有投诉都将得到及时和公平的审查和调查。
## 处理方针
社区领袖将遵循下列社区处理方针来明确他们所认定违反本行为准则的行为的处理方式:
<details>
<summary>展开查看</summary>
### 1. 纠正
<details>
<summary></summary>
**社区影响**:使用不恰当的语言或其他在社区中被认定为不符合职业道德或不受欢迎的行为。
**处理意见**:由社区领袖发出非公开的书面警告,明确说明违规行为的性质,并解释举止如何不妥。或将要求公开道歉。
</details>
### 2. 警告
<details>
**社区影响**:单个或一系列违规行为。
**处理意见**:警告并对连续性行为进行处理。在指定时间内,不得与相关人员互动,包括主动与行为准则执行者互动。这包括避免在社区场所和外部渠道中的互动。违反这些条款可能会导致临时或永久封禁。
<summary></summary>
</details>
### 3. 临时封禁
<details>
**社区影响**: 严重违反社区准则,包括持续的不当行为。
**处理意见**: 在指定时间内,暂时禁止与社区进行任何形式的互动或公开交流。在此期间,不得与相关人员进行公开或私下互动,包括主动与行为准则执行者互动。违反这些条款可能会导致永久封禁。
<summary></summary>
</details>
### 4. 永久封禁
<details>
<summary></summary>
**社区影响**:行为模式表现出违反社区准则,包括持续的不当行为、骚扰个人或攻击或贬低某个类别的个体。
**处理意见**:永久禁止在社区内进行任何形式的公开互动
</details>
</details>
## 参见
* 本行为准则改编自 [Contributor Covenant][homepage] 2.1 版, 参见 [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]。
* 社区处理方针灵感来源于 [Mozilla's code of conduct enforcement ladder][Mozilla CoC]。
* 有关本行为准则的常见问题的答案,参见 [https://www.contributor-covenant.org/faq][FAQ]。
* 其他语言翻译参见 [https://www.contributor-covenant.org/translations][translations]。

View file

@ -2,7 +2,7 @@ name: main
on:
push:
branches: ["main", "dev", "feature-*"]
branches: ["main"]
paths-ignore: # 忽略的文件
- "README.md"
- "LICENSE"
@ -19,6 +19,15 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Use Latest Corepack
run: |
echo "Before: corepack version => $(corepack --version || echo 'not installed')"
npm install -g corepack@latest
echo "After : corepack version => $(corepack --version)"
corepack enable
corepack prepare pnpm@latest --activate
echo "pnpm version => $(pnpm --version || echo 'pnpm not installed')"
- uses: docker/build-push-action@v6
with:
context: .
@ -34,6 +43,15 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Use Latest Corepack
run: |
echo "Before: corepack version => $(corepack --version || echo 'not installed')"
npm install -g corepack@latest
echo "After : corepack version => $(corepack --version)"
corepack enable
corepack prepare pnpm@latest --activate
echo "pnpm version => $(pnpm --version || echo 'pnpm not installed')"
- name: Login
uses: docker/login-action@v2
with:
@ -62,5 +80,5 @@ jobs:
key: ${{ secrets.ACCESS_TOKEN }}
envs: BRANCH_NAME
script: |
cd ${{ github.ref == 'refs/heads/main' && secrets.REMOTE_PATH || secrets.REMOTE_PATH_DEVELOPMENT }}
docker compose up --force-recreate -d --pull=always
cd ${{secrets.REMOTE_PATH}}
docker compose up --force-recreate -d --pull=always

View file

@ -35,6 +35,10 @@ export default defineConfig({
changeOrigin: true,
rewrite: path => path.replace(/^\/active/, ""),
},
"/saturday": {
target: "http://localhost:4000",
rewrite: path => path.replace(/^\/saturday/, ""),
},
}
}
}

View file

@ -14,53 +14,54 @@
"active": "openapi-ts -f openapi-ts.active.config.ts"
},
"dependencies": {
"@astrojs/react": "^3.6.2",
"@astrojs/rss": "^4.0.7",
"@astrojs/tailwind": "^5.1.1",
"@astrojs/vue": "^4.5.1",
"@fullcalendar/core": "^6.1.15",
"@fullcalendar/daygrid": "^6.1.15",
"@fullcalendar/icalendar": "^6.1.15",
"@fullcalendar/react": "^6.1.15",
"@astrojs/react": "^3.6.3",
"@astrojs/rss": "^4.0.11",
"@astrojs/tailwind": "^5.1.5",
"@astrojs/vue": "^4.5.3",
"@fullcalendar/core": "^6.1.17",
"@fullcalendar/daygrid": "^6.1.17",
"@fullcalendar/icalendar": "^6.1.17",
"@fullcalendar/react": "^6.1.17",
"@headlessui/vue": "^1.7.23",
"@heroui/react": "2.7.6",
"@logto/browser": "^2.2.18",
"@heroui/react": "2.6.14",
"@stylistic/eslint-plugin": "^2.8.0",
"@stylistic/eslint-plugin": "^2.13.0",
"astro": "^4.16.18",
"framer-motion": "^11.9.0",
"dayjs": "^1.11.13",
"framer-motion": "^11.18.2",
"ical.js": "^1.5.0",
"md5": "^2.3.0",
"openapi-fetch": "^0.12.2",
"openapi-fetch": "^0.12.5",
"qrcode": "^1.5.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"rehype": "^13.0.2",
"sharp": "^0.33.5",
"tailwindcss": "^3.4.13",
"tailwindcss": "^3.4.17",
"unist-util-visit": "^5.0.0",
"uuid": "10.0.0",
"vue": "^3.5.10"
"vue": "^3.5.13"
},
"devDependencies": {
"@astrojs/markdown-remark": "^5.2.0",
"@cspell/eslint-plugin": "^8.14.4",
"@eslint/js": "^9.11.1",
"@hey-api/openapi-ts": "^0.53.5",
"@astrojs/markdown-remark": "^5.3.0",
"@cspell/eslint-plugin": "^8.19.2",
"@eslint/js": "^9.25.1",
"@hey-api/openapi-ts": "^0.53.12",
"@types/eslint__js": "^8.42.3",
"@types/md5": "^2.3.5",
"@types/qrcode": "^1.5.5",
"@types/react": "^18.3.10",
"@types/react-dom": "^18.3.0",
"@types/react": "^18.3.20",
"@types/react-dom": "^18.3.6",
"@types/uuid": "10.0.0",
"eslint": "^8.57.1",
"eslint-import-resolver-typescript": "^3.6.3",
"eslint-plugin-astro": "^1.2.4",
"eslint-plugin-import": "^2.30.0",
"globals": "^15.9.0",
"husky": "^9.1.6",
"lint-staged": "^15.2.10",
"openapi-typescript": "^7.4.1",
"typescript": "^5.6.2",
"eslint-import-resolver-typescript": "^3.10.1",
"eslint-plugin-astro": "^1.3.1",
"eslint-plugin-import": "^2.31.0",
"globals": "^15.15.0",
"husky": "^9.1.7",
"lint-staged": "^15.5.1",
"openapi-typescript": "^7.6.1",
"typescript": "^5.8.3",
"typescript-eslint": "8.7.0"
},
"lint-staged": {

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,7 @@ import HeaderNavigation from "./HeaderNavigation"
<nav class="nav">
<div class="flex items-center justify-center">
<div class="max-w-[1005px] w-full">
<div class="w-full flex items-center">
<HeaderNavigation client:load />
</div>
</div>

View file

@ -20,14 +20,14 @@ export default function App() {
name: "关于我们",
},
{
link: "/join-us",
name: "加入我们",
link: "/repair",
name: "维修",
},
]
return (
<Navbar onMenuOpenChange={setIsMenuOpen} height="48px">
<NavbarContent className="flex justify-between items-center">
<Navbar onMenuOpenChange={setIsMenuOpen} height="48px" className="">
<NavbarContent className="flex justify-between items-center px-0 md:px-[22px]">
<NavbarBrand className="flex gap-4">
<img
src="https://oss.nbtca.space/CA-logo.svg"

View file

@ -7,7 +7,11 @@ import type LogtoClient from "@logto/browser"
const logtoClient = ref<LogtoClient>()
const onSignIn = async () => {
logtoClient.value?.signIn(import.meta.env.PUBLIC_LOGTO_CALLBACK_URL)
console.log(window.location.pathname)
logtoClient.value?.signIn({
redirectUri: import.meta.env.PUBLIC_LOGTO_CALLBACK_URL,
postRedirectUri: window.location.pathname,
})
}
const onSignOut = async () => {
logtoClient.value?.signOut(import.meta.env.PUBLIC_LOGTO_REDIRECT_URL)
@ -34,9 +38,9 @@ onMounted(() => {
})
</script>
<template>
<div class="flex items-center justify-center w-12">
<div class="flex items-center justify-center">
<div @click="onSignIn" v-if="isAuthenticated === false" class="">
<a class="nav-item-content px-2 hover:text-[#2997ff] text-nowrap cursor-pointer">登入</a>
<a class="nav-item-content hover:text-[#2997ff] text-nowrap cursor-pointer">登入</a>
</div>
<div class="flex items-center" v-if="isAuthenticated">
<Menu as="div" class="relative inline-block text-left">

View file

@ -0,0 +1,17 @@
---
import NavigationUser from "./NavigationUser.vue"
---
<script>
const button = document.getElementById("repair-header")
button.addEventListener("click", () => {
window.location.href = "/repair"
})
</script>
<div class="box-border border-b sticky top-0 bg-white/80 backdrop-blur z-20 h-12">
<div class="h-full flex items-center justify-between text-lg max-w-[1024px] mx-auto px-[22px]">
<span id="repair-header" class="font-semibold select-none cursor-default">维修</span>
<NavigationUser client:load />
</div>
</div>

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 433 KiB

View file

@ -123,14 +123,14 @@ import hayasaka from "../_assets/hayasaka.jpg"
<div class="h-full bg-white rounded-2xl overflow-hidden flex flex-col items-center justify-center p-6 xl:p-8">
<div class="font-bold text-center">
<div>
扫一扫,
遇到问题?
</div>
<div>
获取免费维修。
线上预约维修。
</div>
</div>
<div class="mt-4">
<a href="/repair/mini-program" class="text-base ">查看报修小程序{" >"}</a>
<a href="/repair" class="text-base ">预约维修{" >"}</a>
</div>
</div>
<div class="h-full bg-white rounded-2xl overflow-hidden flex flex-col items-center justify-center p-6 xl:p-8">

View file

@ -2,22 +2,29 @@
<script>
import { makeLogtoClient } from "../utils/auth"
import LogtoClient from "@logto/browser"
const callbackHandler = async (logtoClient: LogtoClient) => {
const callbackHandler = async (logtoClient) => {
console.log("callbackHandler")
try {
await logtoClient.handleSignInCallback(window.location.href)
if (!logtoClient.isAuthenticated) {
console.log("User not authenticated")
window.location.assign("/")
return
}
// Handle successful sign-in
window.location.assign("/")
}
catch (error) {
console.log(error)
window.location.assign("/")
}
}
const logtoClient = makeLogtoClient()
callbackHandler(logtoClient)
console.log("Callback page loaded")
try {
const logtoClient = makeLogtoClient()
callbackHandler(logtoClient)
}
catch (error) {
console.log(error)
}
</script>

View file

@ -1,442 +1,478 @@
---
layout: "../../layouts/MarkdownPost.astro"
title: "宁波理工学院觅食指南ver1.1"
pubDate: 2024-09-16
description: "好饿...."
author: "星璃I_e_d_"
cover:
url: "https://oss.nbtca.space/blog/clas/LwYtOGPxEFNUpji-vexMSQ.jpeg?x-oss-process=image/resize,h_512,m_lfit"
square: ""
alt: "cover"
tags: ["生活", "吃饭", "介绍", "觅食指南", "攻略"]
theme: "white"
featured: true
---
# 目录
- [前言以及须知](#前言以及须知)
- [校内部分](#校内部分)
- [老食堂一楼](#老食堂一楼)
- [老食堂二楼](#老食堂二楼)
- [新食堂一楼](#新食堂一楼)
- [新食堂二楼](#新食堂二楼)
- [其他](#其他)
- [图书馆部分感谢Ineedi编辑的此部分](#图书馆部分感谢ineedi编辑的此部分)
- [新楼楼下的商业街](#新楼楼下的商业街)
- [校外篇](#校外篇)
- [商业街](#商业街)
- [小推车](#小推车)
- [附近走走就能到的东裕夜市](#附近走走就能到的东裕夜市)
- [后记](#后记)
- [v1.0后记](#v10后记)
- [v1.1后记](#v11后记)
# 前言以及须知
本指南意在分享一些本人在宁理吃过的好吃的美食和一些需要避开的店家;
食客StarLink-SoraIneedi
余打广东而来,平时吃的重口不多,比较好清淡,
重口爱好的可能不太可以用来当做参考;
这里是2号食客坐标浙江吃辣区的衢州但本人不吃辣略微偏咸口不吃葱蒜辣所以一些比较浓重口感的菜可能需要自己去尝试
没提过的店家就是没吃过;
所有评测皆为本人主观意见,采取十分制,仅供参考;
如果以上都OK的话那就正式开始吧
# 校内部分
我们学校目前在开的有两个食堂我为了习惯会叫老食堂和新食堂即24幢旁边的为老食堂微校园旁边的为新食堂
另外有两条商业街即30幢附近的那一条和新楼即四期底下的两条另外还有隐藏的小吃店——SC一楼的烘焙店真的还活着吗和26幢附近的炒饭店。以及——图书馆楼下的那一小片美食区。
## 老食堂一楼
### 1.大众窗口
并没有吃过几次,但是印象很深的是他那个葱油鸡,还不错;省钱的可以去这里吃,缺点好像是不能手机支付;
**主观评分8.0**
### 2.黄焖鸡米饭
旧一我觉得最神中神的一个窗口,即使我吃微辣都觉得辣的要死还是会爱吃这个,喜欢重口的更不用说,一定要去试一试;
**主观评分9.5**
### 3.孔明村香锅
种类可以,香锅的味道也很不错,偶尔会有小吃送(砂糖桔什么的),如果新二没有同类型的店的话我吃香锅一般都会去这里吃,但是新二有了;
**主观评分9.0**
### 4.兰州拉面
拉面和刀削面都做的很好面汤的味道很浓厚啊有个水饺也很喜欢吃10块钱就能买到一碗确实带几块牛肉面还好吃的牛肉面要什么自行车.jpg
**主观评分8.5**
### 5.蜜雪冰城
看客流量便知,顺带一提奶茶真的很甜,我会选择五分糖甚至三分糖或者不要糖;
**主观评分9.0**
**其他没怎么吃过也没印象的直接跳过,欢迎补充;**
## 老食堂二楼
### 1.盖浇饭
在我心目中老食堂的唯一真神一肉一素8.8还能加饭,然后他最牛逼的是你可以点半份菜,也就是说完全可以点四种不同的半份菜然后吃得种类丰富还不怎么花钱。
我大一上还在24幢的时候就天天靠吃这个省钱一个月伙食只需600块即可而且辣子鸡质量在线就是偶尔会被辣到总之神。
**主观评分9.5**
### 2.自选窗口
和隔壁盖浇饭一样的价格一样的内容,只不过用碟子装,所以很容易凉。平时盖浇饭人多了又不想排队的话就去自选好了,人少会快一点;
**主观评分8.5**
### 3.小兔子
图一个方便10块钱一个香辣鸡腿堡和一杯可乐如果不是十二点十五下课急着吃午饭或者偶尔心血来潮会吃的话我一般不会吃这个但味道确实不错
**主观评分8.5**
### 4.重庆小面
15块的牛肉拌面很好吃。其他的话青菜荷包蛋面也还行
**主观评分8.5**
### 5.盖浇饭那里的烤鱼
香的,额外能加小菜也很不错。缺点就是得凑齐三个人或者四个人去吃,而且鱼骨很多,得细嚼慢咽,冬天可以每周去吃一两次解解馋;
**主观评分8.5**
### 6.后面那个隔间饭店
校内想多人聚餐貌似也只能去那里了,菜品还可以吧,没什么印象;
**主观评分8.0**
### 7.小王烧烤
校内烧烤好像就这间了,缺点也是贵,其他都很好;
**主观评分8.5**
## 新食堂一楼
### 1.大伙
新一省钱的神,每周一到周五中午都会有一个纯肉菜和肉素菜打折,而且饭可以二两二两的打,省钱吃的可以去这里吃,抛开钱的问题本身饭菜质量也还过得去,依旧是葱油鸡做的还可以,豆角炒肉也还不错,辣子鸡和旧二的相比起来就差很多,因为他这个鸡是油炸的,所以我吃起来不太喜欢;
**主观评分8.5**
### ~~2.炒菜机器人:~~
新一我最不推荐的一个窗口。炒出来的粉和饭油都多的要死调味也是完全没有的感觉吃一次我都感觉自己要变成机器人了xD;
~~2024.6月增补:好似~~
**主观评分5.0**
### 3.面食
中规中矩,价格也还可以,味道和重庆小面比的话会差一点;
**主观评分8.0**
### 4.甜品粥铺
鸡蛋饼就像是我妈妈做的一样,好吃。还有粥有饺子什么的,偶尔会去吃一下;
**主观评分8.5**
### 5.自选
味道很不错,我喜欢的是豆角炒肉和青菜豆腐,这两个菜吃起来有种回到家的感觉。然后蜜汁鸡腿和肉丸也比较合我的口味,喜欢辣的可以试试小炒肉和那个辣椒牛柳,我是被辣到了;
**主观评分9.0**
### 6.库迪咖啡
和外面的是一样的,有米的时候偶尔回去喝一喝,还算可以;
**主观评分: 8.5**
## 新食堂二楼
**关于新二的一些提醒:新二是我们学校迭代最快的食堂,很多摊位可能一个学期过去就似了,所以这部分还烦请各位自己去验证。**
### 1.黑哥麻辣香锅
曾经我以为旧一的香锅就已经是最好的了直到新二来了个黑哥。咳咳说回正题黑哥强在种类的丰富他这里的白肠是我最喜欢吃的一个肉菜肥瘦的参杂刚刚好还有不少旧一没有的种类我们新式的黑哥已经爆杀了老式的孔明在这里一顿14块的香锅完全能做到有肉有菜还能吃得饱算是性价比战神了。想尝试辣的也可以自己加他放在自助的那个辣椒油奇辣无比。我试一次就已经不敢试了。
**主观评分9.5**
### ~~2.维卡斯:~~
我是没想到这个似了的东西还能回来。是的孩子们,我回来了。吃过一次,感觉味道不如小兔子,这一点就仁者见仁智者见智了;
**2024年9月增补不是我放个暑假回来你又似了**
**主观评分8.0**
### 3.缙云烧饼
豆腐脑很好吃,摊主会问你加酱油还是加糖,小汤圆和饺子都很不错,我心里最清淡的那一档,想家的时候就会去吃;
**主观评分8.5**
### 4.有家面馆
只吃过鸡蛋拌面和麻酱拌面,都挺不错,就是很快凉掉,所以要快点吃;
**主观评分8.0**
### 5.鸡香记烤肉饭
都还可以,我比较常吃的是那个沙姜鸡,汁用来拌饭很好吃,烤肉饭也尚且出于过得去的说法,但是和其他比就稍逊一色;
**主观评分8.0**
### ~~6.韩式烤肉拌饭:~~
......量大管饱,但是那个窗口还挺重口的,所以我不怎么去;
2024年9月增补你怎么也似了
**主观评分8.0**
### 7.嵊州小吃
相当于沙县,但东西很多,炒面炒粉都很不错,油再稍微少一点点就好了。粥也很好,我生病的时候就喜欢喊别人帮忙去那里打碗粥带回来给我喝;
**主观评分8.5**
### 8.板煮演艺
这个窗口确实挺好吃的,但是科技味也很明显,比如说那个鸡肉就完全吃不出鸡肉的味道,抛开吃不出食材本身的味道不谈的话调味还是非常不错的,我要吃的话一般只吃他那里的铁板饭,意大利面什么的就算了吧;
**主观评分8.5**
### 9.铁锅炖
又一个量大管饱的......但是食材种类会多很多14块里头蟹棒土豆粉还有一堆东西可以吃的很饱很饱但是有忌口的话就还是建议慎点吧不然就浪费了....
**主观评分7.5**
## 其他
其他几个新开的例如浓汁浇米饭,~~宁海麦饼(似了),港式烧腊饭(似了)~~ 都还没吃过,故此不提;
### 30幢的商业街
在去年的时候去过一次,有家快餐店卖的鸡排饭还不错,就是地理位置太过于偏远,所以一般不怎么去;其他的话完全没有吃过,所以略;
2024年9月增补前几天去看了一眼现在好像都是以做外卖为主了店里甚至没地方做
### 26幢的炒饭铺子~~鱼粉(似了)~~
以前在24幢的时候经常去鱼粉吃过一两次汤很好喝炒饭的话不会油腻而且分量足是我喜欢的那一档。但是因为离得太远现在也很少去了。(主要还是那里有一家我最喜欢的店似了————————但是以另外一种形式打赢了复活赛,关于这一家店我会在校外篇进行详细的说明)
2024年9月增补开了一家一鸣真鲜奶连锁店没什么好说的
**主观评价9.0**
## 图书馆部分感谢Ineedi编辑的此部分
提示图书馆的餐饮座位区有吉祥馄饨店内的座椅妞·斯达特门口的一组桌椅以及十足边上的目测50人左右的餐饮区有米内部有两张双人桌也算。如果你下午第一第二节课的时间段没有课再考虑坐在餐饮区用餐否则推荐打包或者外卖因为你不一定能抢到位置。
星巴克外面的桌椅属于星巴克店铺,不归于图书馆
### 1.京面
菜品是面和抄手所以别想着去那里吃饭因为真没有饭。碗大量足面口感也可以出餐快。之前如果有去那里兼职可以享受9折折扣当然价格也不是很贵一碗普通的面13块拿下
**个人评分8.8**
### 2.熊厉害温州瘦肉丸
如店铺名所示,
**个人评分**
### 3.芙蓉树下
火锅类,不是两个人一起点尽量不要去
**个人评分:**
### 4.春哥小吃
一个店面分的两家不同的摊,左边的肠粉是被广东佬点名批评的不正宗(既然写了是广式石磨肠粉就别给我默认加酸豆角和炸黄豆.jpg——星璃附.),右边的卷饼出餐速度不是很快,尽量把握好时间
**个人评分8.0**
### 5.妞·斯达特烘焙
图书馆楼下的面包店,面包做出来还行,不会甜的发腻,店员的态度可能会不太好,要小心
**个人评分8.0**
### 6.有米UMI
是新开的店,卖的卷饼/小吃/酸辣粉/粥,把原来的粥铺顶掉了(被顶掉的那家是最喜欢去吃的,老板娘人很好,可惜现在见不着了)
**新店由于还没吃过暂时不做评价**
### 7.吉祥馄饨
2023年顶掉了之前的CoCo但说实话做的还行碗大小适中馄饨量足馅多汤少所有菜品均价22算是能接受的范围。味道不会特别咸
**个人评分8.8**
### 8.十足+9.星巴克
这两个地方什么样子就不用我多说了
以上就是图书馆楼下店铺的相关信息
## 新楼楼下的商业街
去年新开的商业街这里有许多种类不同的饭馆而且在外面也有许多座椅能够就坐共同特点都是贵在这里吃饭一般就不要想着个位数能够吃饱这件事了怎么说都得10块甚至12块起步
### 1.美兹美名厨
新楼算是比较便宜的那一档了一肉两素12块吃起来还行不少人都喜欢去那里吃的我不喜欢的原因主要是不够清淡
**主观评分8.5**
### 2.希食东
神秘的名字,但是真的很好吃,我喜欢吃他那个咖喱土豆饼蛋包饭,味道很好,咖喱不会辣,和饭拌匀了之后很好吃,炸土豆饼端上来的时候还很热,小心烫嘴。蛋包饭的蛋也很滑嫩,总的来说算是一分钱一分货的典范;
**主观评分9.0**
### ~~3.螺蛳粉:~~
我没有吃过他的螺蛳粉,但是他的肠粉很好吃,很滑很嫩,不会像图书馆那样只是挂这个广东石磨肠粉的名号做出来的其实是宁波肠粉,其他没吃过;
**2024.6月增补:似了,我还想吃他家的肠粉呢**
**主观评分8.5**
### 4.天天小吃
宵夜首选5块钱的手抓饼还挺好吃的能够让老板娘多加生菜和酱料都是免费的杂粮煎饼太脆了没有那么喜欢
**主观评分8.5**
### 5.嗨一锅
贵,自从点了一份三十块的麻辣烫就再也不想去吃第二次;\*_主观评分8.0_
### 6.伊佳基
微信小程序注册一个会员再下单累积积分可以减免。这个也没什么好说的快餐但是挺便宜13块可以买两个汉堡也可以买一个汉堡一个鸡腿一杯可乐有时候早上五节课加上下午还有课的时候就好吃这个来省时间
**主观评分8.5**
### 7.上海生煎
偶尔想吃一顿好的早餐的时候会去,喜欢奶黄包和南瓜馒头。午晚饭可以吃他们家的炒粉面饭,都很好吃,油不算特别多,十块钱的价格还挺便宜;
**主观评分8.5**
### 8.原来新二的麻辣香锅麻辣烫
香锅油太多了,不喜欢,麻辣烫还好,但是价格和黑哥一比就是寄;
**主观评分8.0**
### 9.西北楼
又一个一分钱一分货的典范吃这个起码15块起步所以我很少吃但确实挺不错。
**主观评分8.5**
### 10.卤a卤
算是还不错的卤品和面馆,时不时会有一些优惠套餐啥的,吃起来还不错,我也只吃过一两次所以略
### 11.炸鸡腿店(就是靠近米诺剪发的那一家)
只买炸鸡腿鸡翅啥的10块钱两个鸡腿还挺好吃
**主观评分8.5**
### 2024年9月补充
暑假回来后新楼楼下开了几间新店:重庆小面,沙县小吃,吉祥馄饨啥的,没吃过所以略
# 校外篇
## 商业街
**学校目前的校外主要是新楼附近的一排商业商铺,已经开了不少店铺了,种类很多,但是价格普遍比较贵,笔者也只是偶尔去吃了一下,所以这一段的话欢迎有能者来补充。**
### 1.金拱门
就很普通的麦,和朋友去过不少次,挺好的(喜欢麦的有福了)
### 2.霸王茶姬
贵但是好喝,偶尔心情好的时候会去点;
### 3.铜炉鸡锅
和朋友聚餐可以吃这个,有点辣,但是很好吃,饭可以无限加,因为菜真的很下饭
### 以下是我没吃过的,所以只简单报一下
韩式烤肉自助managercoffee乌鸡米线一间忘了名字的朝鲜菜面包店酒吧啥的特别多.....欢迎大家自己去探索......
## 小推车
学校的小推车集中于17幢和东门两个地方一般在晚上11点之后出摊但地点也不一定是这里但会以这里为范围活动想吃宵夜可以去碰碰运气以下是我吃过的。
### 1.UU炒饭
油比较多味道挺香的10块钱起步炒年糕方便面米线炒饭都有
### 2.东门的烤冷面
烤冷面真好吃啊。
可惜这个阿姨不卖肠粉了。
狼牙土豆和铁板豆腐双拼也很不错啊。
可惜这个阿姨不卖肠粉了。
但我还是喜欢去她那里吃烤冷面。
### 以下是没有吃过的,我会列出来,种类也很多
鸡柳炸串鸡蛋汉堡烤肠烤串还有烧烤和另一家烤冷面啥的多的时候5,6辆小推车一般都能找得到你想吃的宵夜的
## 附近走走就能到的东裕夜市
这个地方能吃的东西也是巨多,我目前只在那边吃过自助烤肉和东北菜,从北门出去一直往北走就能到,十几分钟的路程,这个也烦请自己组队去尝试吧。
# 后记
## v1.0后记
终于大概的把这个东西写完了....
但是我们学校吃的地方和馆子实在是太多我没有精力和金钱去一个一个的尝试但至少校内的两个食堂和新楼楼下的店目前开着的都稍微试过了一下便把想写的写出来了。再一次感受到了我们学校吃饭是有多么种类丰富Orz
**总之**,这个指南是以纯粹的个人主观感受写出来的,然后的话,学校的餐馆变化还是蛮快的,可能每个学期都会有点不一样,那就还请其他人来接手把这篇指南继续写下去了。
署名Starlink-Sora
于浙大宁波理工学院
2024年07月23日
## v1.1后记
为什么我一个暑假回来又多了这么多店啊!!!!??????????
Ied学长要毕业了所以现在这篇文档就只有我在撰写了如果有错误的话还烦请指出谢谢。
~~真好。~~
增补了一些东西如果后人想接手的话可以直接QQ私讯我问我要原1.0的doc和1.1的markdown
署名Starlink-Sora
于浙大宁波理工学院
2024年09月16日
---
layout: "../../layouts/MarkdownPost.astro"
title: "宁波理工学院觅食指南ver1.3"
pubDate: 2025-05-13
description: "好饿...."
author: "星璃I_e_d_"
cover:
url: "https://oss.nbtca.space/blog/clas/LwYtOGPxEFNUpji-vexMSQ.jpeg?x-oss-process=image/resize,h_512,m_lfit"
square: ""
alt: "cover"
tags: ["生活", "吃饭", "介绍", "觅食指南", "攻略"]
theme: "white"
featured: true
---
# 目录
- [前言以及须知](#前言以及须知)
- [校内部分](#校内部分)
- [老食堂一楼](#老食堂一楼)
- [老食堂二楼](#老食堂二楼)
- [新食堂一楼](#新食堂一楼)
- [新食堂二楼](#新食堂二楼)
- ~~[图书馆部分感谢Ineedi编辑的此部分](#图书馆部分感谢ineedi编辑的此部分)~~
- [新楼楼下的商业街](#新楼楼下的商业街)
- [校外篇](#校外篇)
- [商业街](#商业街)
- [小推车](#小推车)
- [附近走走就能到的东裕夜市](#附近走走就能到的东裕夜市)
- [后记](#后记)
- [v1.0后记](#v10后记)
- [v1.1后记](#v11后记)
- [v1.2后记](#v12后记)
- [v1.3后记](#v13后记)
# 前言以及须知:
本指南意在分享一些本人在宁理吃过的好吃的美食和一些需要避开的店家;
余打广东而来,平时吃的重口不多,比较好清淡,
重口爱好的可能不太可以用来当做参考;
这里是2号食客坐标浙江吃辣区的衢州但本人不吃辣略微偏咸口不吃葱蒜辣所以一些比较浓重口感的菜可能需要自己去尝试
没提过的店家就是没吃过;
所有评测皆为本人主观意见,采取十分制,仅供参考;
如果以上都OK的话那就正式开始吧
# 校内部分:
我们学校目前在开的有两个食堂我为了习惯会叫老食堂和新食堂即24幢旁边的为老食堂微校园旁边的为新食堂
另外有两条商业街即30幢附近的那一条和新楼即四期底下的两条另外还有隐藏的小吃店——SC一楼的烘焙店真的还活着吗和26幢附近的炒饭店。以及——图书馆楼下的那一小片美食区。
## 老食堂一楼:
### 1.大众窗口:
并没有吃过几次,但是印象很深的是他那个葱油鸡,还不错;省钱的可以去这里吃,缺点好像是不能手机支付;
**主观评分8.0**
### 2.黄焖鸡米饭:
旧一我觉得最神中神的一个窗口,即使我吃微辣都觉得辣的要死还是会爱吃这个,喜欢重口的更不用说,一定要去试一试;
**主观评分9.5**
### 3.孔明村香锅:
种类可以,香锅的味道也很不错,偶尔会有小吃送(砂糖桔什么的),如果新二没有同类型的店的话我吃香锅一般都会去这里吃,但是新二有了;
**主观评分9.0**
### 4.兰州拉面:
拉面和刀削面都做的很好面汤的味道很浓厚啊有个水饺也很喜欢吃10块钱就能买到一碗确实带几块牛肉面还好吃的牛肉面要什么自行车.jpg
**主观评分8.5**
### 5.蜜雪冰城:
看客流量便知,顺带一提奶茶真的很甜,我会选择五分糖甚至三分糖或者不要糖;
**主观评分9.0**
**其他没怎么吃过也没印象的直接跳过,欢迎补充;**
## 老食堂二楼:
### 1.盖浇饭:
在我心目中老食堂的唯一真神一肉一素8.8还能加饭,然后他最牛逼的是你可以点半份菜,也就是说完全可以点四种不同的半份菜然后吃得种类丰富还不怎么花钱。
我大一上还在24幢的时候就天天靠吃这个省钱一个月伙食只需600块即可而且辣子鸡质量在线就是偶尔会被辣到总之神。
**主观评分9.5**
### 2.自选窗口:
和隔壁盖浇饭一样的价格一样的内容,只不过用碟子装,所以很容易凉。平时盖浇饭人多了又不想排队的话就去自选好了,人少会快一点;
**主观评分8.5**
### 3.小兔子:
图一个方便10块钱一个香辣鸡腿堡和一杯可乐如果不是十二点十五下课急着吃午饭或者偶尔心血来潮会吃的话我一般不会吃这个但味道确实不错
**主观评分8.5**
### ~~4.重庆小面:~~
15块的牛肉拌面很好吃。其他的话青菜荷包蛋面也还行
2025年3月11日增补你怎么似了
### ~~4.啫啫煲:~~
~~这学期校内新开的的铺子,吃过一两次,没有水汪汪(因为煲的时候不加水),还可以,量不少的,但因为没有加水所以吃到最后会特别特别腻,但还好他有那个竹蔗茅根水,所以也不会算特别腻~~
2025年5月13日增补你怎么半个学期都没活下来
**主观评分9.0**
### 5.盖浇饭那里的烤鱼:
香的,额外能加小菜也很不错。缺点就是得凑齐三个人或者四个人去吃,而且鱼骨很多,得细嚼慢咽,冬天可以每周去吃一两次解解馋;
**主观评分8.5**
### 6.后面那个隔间饭店:
校内想多人聚餐貌似也只能去那里了,菜品还可以吧,没什么印象;
2025.03.11增补:铁板豆腐好吃
**主观评分8.0**
### 7.小王烧烤:
校内烧烤好像就这间了,缺点也是贵,其他都很好;
**主观评分8.5**
## 新食堂一楼:
### 1.大伙:
新一省钱的神,每周一到周五中午都会有一个纯肉菜和肉素菜打折,而且饭可以二两二两的打,省钱吃的可以去这里吃,抛开钱的问题本身饭菜质量也还过得去,依旧是葱油鸡做的还可以,豆角炒肉也还不错,辣子鸡和旧二的相比起来就差很多,因为他这个鸡是油炸的,所以我吃起来不太喜欢;
**主观评分8.5**
### ~~2.炒菜机器人:~~
新一我最不推荐的一个窗口。炒出来的粉和饭油都多的要死调味也是完全没有的感觉吃一次我都感觉自己要变成机器人了xD;
2024.6月增补:好似
**主观评分5.0**
### 3.面食:
中规中矩,价格也还可以,味道和重庆小面比的话会差一点;
**主观评分8.0**
### ~~4.甜品粥铺:~~
鸡蛋饼就像是我妈妈做的一样,好吃。还有粥有饺子什么的,偶尔会去吃一下;
2025年5月13日增补你怎么也似了
**主观评分8.5**
### 5.自选:
味道很不错,我喜欢的是豆角炒肉和青菜豆腐,这两个菜吃起来有种回到家的感觉。然后蜜汁鸡腿和肉丸也比较合我的口味,喜欢辣的可以试试小炒肉和那个辣椒牛柳,我是被辣到了;
**主观评分9.0**
### 6.库迪咖啡:
和外面的是一样的,有米的时候偶尔回去喝一喝,还算可以;
**主观评分: 8.5**
## 新食堂二楼:
**关于新二的一些提醒:新二是我们学校迭代最快的食堂,很多摊位可能一个学期(甚至可能半个学期)过去就似了,所以这部分还烦请各位自己去验证。**
### 1.黑哥麻辣香锅:
曾经我以为旧一的香锅就已经是最好的了直到新二来了个黑哥。咳咳说回正题黑哥强在种类的丰富他这里的白肠是我最喜欢吃的一个肉菜肥瘦的参杂刚刚好还有不少旧一没有的种类我们新式的黑哥已经爆杀了老式的孔明在这里一顿14块的香锅完全能做到有肉有菜还能吃得饱算是性价比战神了。想尝试辣的也可以自己加他放在自助的那个辣椒油奇辣无比。我试一次就已经不敢试了。
**主观评分9.5**
### ~~2.维卡斯:~~
我是没想到这个似了的东西还能回来。是的孩子们,我回来了。吃过一次,感觉味道不如小兔子,这一点就仁者见仁智者见智了;
**2024年9月增补不是我放个暑假回来你又似了**
**主观评分8.0**
### 3.缙云烧饼:
豆腐脑很好吃,摊主会问你加酱油还是加糖,小汤圆和饺子都很不错,我心里最清淡的那一档,想家的时候就会去吃;
**主观评分8.5**
### 4.有家面馆:
只吃过鸡蛋拌面和麻酱拌面,都挺不错,就是很快凉掉,所以要快点吃;
**主观评分8.0**
### 5.鸡香记烤肉饭:
都还可以,我比较常吃的是那个沙姜鸡,汁用来拌饭很好吃,烤肉饭也尚且出于过得去的说法,但是和其他比就稍逊一色;
**主观评分8.0**
### ~~6.韩式烤肉拌饭:~~
......量大管饱,但是那个窗口还挺重口的,所以我不怎么去;
2024年9月增补你怎么也似了
**主观评分8.0**
### 7.嵊州小吃:
相当于沙县,但东西很多,炒面炒粉都很不错,油再稍微少一点点就好了。粥也很好,我生病的时候就喜欢喊别人帮忙去那里打碗粥带回来给我喝;
**主观评分8.5**
### 8.板煮演艺:
这个窗口确实挺好吃的,但是科技味也很明显,比如说那个鸡肉就完全吃不出鸡肉的味道,抛开吃不出食材本身的味道不谈的话调味还是非常不错的,我要吃的话一般只吃他那里的铁板饭,意大利面什么的就算了吧;
**主观评分8.5**
### ~~~~9.铁锅炖:~~
又一个量大管饱的......但是食材种类会多很多14块里头蟹棒土豆粉还有一堆东西可以吃的很饱很饱但是有忌口的话就还是建议慎点吧不然就浪费了....
2025年5月13日增补似了
**主观评分7.5**
### 10.浓汁浇米饭:
汁好多。感觉可以叫汤了。味道也还过得去偶尔会来吃一下拿个肉片饭也不算特别贵13块就能吃得饱。算是中规中矩吧。
**主观评分8.5**
### 11.比奇堡(有点忘了是不是叫这个名字)
24年末新开的店主要是买披萨之前吃过一两回他那个小份的我吃就刚好饱但是对一般人来说份量其实有点少大份的话一个人吃又可能多了两个人吃又可能少了但无论怎么说还是挺好吃的不过他那个披萨种类有些算是意大利人看了会震怒的那种我也不爱吃所以我算不算是意大利原教旨披萨主义者开玩笑的反正偶尔还是可以吃一下的。
**主观评分:8.0**
### 12.妈妈味道卤肉饭
也是新开的店,卤味挺足饭量挺多,因为汁都沉底了所以吃到最后可能会很腻,不是很适合我这种吃淡口的。
**主观评分8.0**
### 其他:
其他几个新开的例如黄焖鸡,~~宁海麦饼(似了),港式烧腊饭(似了)~~ 都还没吃过,故此不提;
## 30幢的商业街
在去年的时候去过一次,有家快餐店卖的鸡排饭还不错,就是地理位置太过于偏远,所以一般不怎么去;其他的话完全没有吃过,所以略;
#### 2024年9月增补
前几天去看了一眼,现在好像都是以做外卖为主了,店里甚至没地方坐???
## ~~26幢的炒饭铺子鱼粉似了~~
~~以前在24幢的时候经常去鱼粉吃过一两次汤很好喝炒饭的话不会油腻而且分量足是我喜欢的那一档。但是因为离得太远现在也很少去了。(主要还是那里有一家我最喜欢的店似了————————但是以另外一种形式打赢了复活赛,关于这一家店我会在校外篇进行详细的说明)~~
2024年9月增补开了一家一鸣真鲜奶连锁店没什么好说的
**主观评价9.0**
## ~~图书馆部分感谢Ineedi编辑的此部分~~
~~提示图书馆的餐饮座位区有吉祥馄饨店内的座椅妞·斯达特门口的一组桌椅以及十足边上的目测50人左右的餐饮区有米内部有两张双人桌也算。如果你下午第一第二节课的时间段没有课再考虑坐在餐饮区用餐否则推荐打包或者外卖因为你不一定能抢到位置。~~
~~星巴克外面的桌椅属于星巴克店铺,不归于图书馆~~
### ~~1.京面:~~
~~菜品是面和抄手所以别想着去那里吃饭因为真没有饭。碗大量足面口感也可以出餐快。之前如果有去那里兼职可以享受9折折扣当然价格也不是很贵一碗普通的面13块拿下~~
**~~个人评分8.8~~**
### ~~2.熊厉害温州瘦肉丸:~~
~~如店铺名所示,~~
**~~个人评分~~**
### ~~3.芙蓉树下:~~
~~火锅类,不是两个人一起点尽量不要去~~
**~~个人评分:~~**
### ~~4.春哥小吃~~
~~一个店面分的两家不同的摊,左边的肠粉是被广东佬点名批评的不正宗(既然写了是广式石磨肠粉就别给我默认加酸豆角和炸黄豆.jpg——星璃附.),右边的卷饼出餐速度不是很快,尽量把握好时间~~
**~~~~个人评分8.0~~**
### ~~5.妞·斯达特烘焙~~
~~图书馆楼下的面包店,面包做出来还行,不会甜的发腻,店员的态度可能会不太好,要小心~~
**~~个人评分8.0~~**
### ~~6.有米UMI~~
~~是新开的店,卖的卷饼/小吃/酸辣粉/粥,把原来的粥铺顶掉了(被顶掉的那家是最喜欢去吃的,老板娘人很好,可惜现在见不着了)~~
**~~新店由于还没吃过暂时不做评价~~**
### ~~7.吉祥馄饨~~
~~2023年顶掉了之前的CoCo但说实话做的还行碗大小适中馄饨量足馅多汤少所有菜品均价22算是能接受的范围。味道不会特别咸~~
**~~个人评分8.8~~**
### ~~8.十足+9.星巴克~~
~~这两个地方什么样子就不用我多说了~~
~~以上就是图书馆楼下店铺的相关信息~~
### 2025.03.11增补:
去年学校不知道搞什么鬼东西把图书馆楼下这一片全关了,只留下了星巴克,所以这一部分就没有了,不知道日后这一片会用来干什么。
## 新楼楼下的商业街:
去年新开的商业街这里有许多种类不同的饭馆而且在外面也有许多座椅能够就坐共同特点都是贵在这里吃饭一般就不要想着个位数能够吃饱这件事了怎么说都得10块甚至12块起步
### 1.美兹美名厨:
新楼算是比较便宜的那一档了一肉两素12块吃起来还行不少人都喜欢去那里吃的我不喜欢的原因主要是不够清淡
**主观评分8.5**
### 2.希食东:
神秘的名字,但是真的很好吃,我喜欢吃他那个咖喱土豆饼蛋包饭,味道很好,咖喱不会辣,和饭拌匀了之后很好吃,炸土豆饼端上来的时候还很热,小心烫嘴。蛋包饭的蛋也很滑嫩,总的来说算是一分钱一分货的典范;
**主观评分9.0**
### ~~3.螺蛳粉:~~
~~我没有吃过他的螺蛳粉,但是他的肠粉很好吃,很滑很嫩,不会像图书馆那样只是挂这个广东石磨肠粉的名号做出来的其实是宁波肠粉,其他没吃过;~~
**2024.6月增补:似了,我还想吃他家的肠粉呢**
**主观评分8.5**
### 4.天天小吃:
宵夜首选5块钱的手抓饼还挺好吃的能够让老板娘多加生菜和酱料都是免费的杂粮煎饼太脆了没有那么喜欢
**主观评分8.5**
### ~~5.嗨一锅:~~
~~贵,自从点了一份三十块的麻辣烫就再也不想去吃第二次;~~
2025.03.11增补:好似,叫你卖恁贵
**~~主观评分8.0~~**
### 6.伊佳基:
微信小程序注册一个会员再下单累积积分可以减免。这个也没什么好说的快餐但是挺便宜13块可以买两个汉堡也可以买一个汉堡一个鸡腿一杯可乐有时候早上五节课加上下午还有课的时候就好吃这个来省时间
**主观评分8.5**
### 7.上海生煎:
偶尔想吃一顿好的早餐的时候会去,喜欢奶黄包和南瓜馒头。午晚饭可以吃他们家的炒粉面饭,都很好吃,油不算特别多,十块钱的价格还挺便宜;
**主观评分8.5**
### 8.原来新二的麻辣香锅麻辣烫:
香锅油太多了,不喜欢,麻辣烫还好,但是价格和黑哥一比就是寄;
**主观评分8.0**
### 9.西北楼:
又一个一分钱一分货的典范吃这个起码12块起步所以我很少吃但确实挺不错。量超级多我每次都要让他少加面和饭不然会吃得很饱
**主观评分8.5**
### 10.卤a卤
算是还不错的卤品和面馆,时不时会有一些优惠套餐啥的,吃起来还不错,我也只吃过一两次所以略
### 11.炸鸡腿店(就是靠近米诺剪发的那一家):
只买炸鸡腿鸡翅啥的10块钱两个鸡腿还挺好吃
**主观评分8.5**
### 12.重庆小面:
这家可比原来老食堂那家的份量多的去了。但也是一分钱一分货,量大,好吃,还可以。我比较喜欢吃。
**主观评分8.0**
### 13.葛胖家肉夹馍
虽然店名叫肉夹馍也确实卖肉夹馍但是我一般是去吃他那里的油泼面13一份还挺好吃别的没吃过可以点点套餐啥的不过这样就要15块以上一餐了。
**主观评分9.0**
### 14.沪上阿姨
明明每天看着好像也没什么客流量的说但是为什么你还能活着不过我也没喝过一两次所以也就不怎么评价了。对他的唯一印象是很贵喝杯东西10块钱以上起步
### 15.重庆小面
麻酱拌面好吃捏
**主观评分8.5**
### 16.南京灌汤包
好清淡好清淡,最爱吃馄饨,其次是灌汤包,他家的肉粽也很不错
**主观评分9.0**
### 17.塔斯汀
和外面的连锁店一样,略。
**主观评分9.0**
### 2024年9月补充
暑假回来后新楼楼下开了几间新店:重庆小面,沙县小吃,吉祥馄饨啥的,没吃过所以略
### 2025年3月补充
一个寒假回来之后这里变动又有很多,笔者依旧没有全吃完,所以在本文中没有提到的店(如烧鸭面,闽味小吃啥的)就要烦请读者自行尝试了。
# 校外篇
**学校目前的校外主要是新楼附近的一排商业商铺,已经开了不少店铺了,种类很多,但是价格普遍比较贵,笔者也只是偶尔去吃了一下,所以这一段的话欢迎有能者来补充。**
## 商业街:
小北门多了超级多的商业铺子!根本吃不完!!
### 1.金拱门:
就很普通的麦,和朋友去过不少次,挺好的(喜欢麦的有福了)
### 2.霸王茶姬:
贵但是好喝,偶尔心情好的时候会去点;
### 3.铜炉鸡锅:
和朋友聚餐可以吃这个,有点辣,但是很好吃,饭可以无限加,因为菜真的很下饭
### 4.KFC
学校也有kfc了
但是还在装修
### 以下是我没吃过的,所以只简单报一下
韩式烤肉自助managercoffee乌鸡米线潜水艇三明治锅包肉菠萝包一间忘了名字的朝鲜菜面包店酒吧啥的特别多.....欢迎大家自己去探索......
## 小推车:
学校的小推车集中于17幢和东门两个地方一般在晚上11点之后出摊但地点也不一定是这里但会以这里为范围活动想吃宵夜可以去碰碰运气以下是我吃过的。
#### 2025.03.11增补:
现在出摊时间会变早了,可能六七点就能看见他们出摊
### 1.UU炒饭
油比较多味道挺香的10块钱起步炒年糕方便面米线炒饭都有
### 2.东门的烤冷面:
烤冷面真好吃啊。
可惜这个阿姨不卖肠粉了。
狼牙土豆和铁板豆腐双拼也很不错啊。
可惜这个阿姨不卖肠粉了。
但我还是喜欢去她那里吃烤冷面。
### 3.后街鸡柳
这个大叔买的鸡柳和蘑菇都很好吃,除了这俩之外还有炸虾,炸鸡翅啥的,但是感觉就没有鸡柳和蘑菇那么好吃了
### 以下是没有吃过的,我会列出来,种类也很多
鸡蛋汉堡烤肠烤串还有烧烤和另一家烤冷面啥的多的时候5,6辆小推车一般都能找得到你想吃的宵夜的
## 附近走走就能到的东裕夜市
这个地方能吃的东西也是巨多,我目前只在那边吃过自助烤肉和东北菜,从北门出去一直往北走就能到,十几分钟的路程,这个也烦请自己组队去尝试吧。
# 后记
## v1.0后记
终于大概的把这个东西写完了....
但是我们学校吃的地方和馆子实在是太多我没有精力和金钱去一个一个的尝试但至少校内的两个食堂和新楼楼下的店目前开着的都稍微试过了一下便把想写的写出来了。再一次感受到了我们学校吃饭是有多么种类丰富Orz
**总之**,这个指南是以纯粹的个人主观感受写出来的,然后的话,学校的餐馆变化还是蛮快的,可能每个学期都会有点不一样,那就还请其他人来接手把这篇指南继续写下去了。
署名Starlink-Sora
于浙大宁波理工学院
2024年07月23日
## v1.1后记
为什么我一个暑假回来又多了这么多店啊!!!!??????????
Ied学长要毕业了所以现在这篇文档就只有我在撰写了如果有错误的话还烦请指出谢谢。
~~真好。~~
增补了一些东西如果后人想接手的话可以直接QQ私讯我问我要原1.0的doc和1.1的markdown
署名Starlink-Sora
于浙大宁波理工学院
2024年09月16日
## V1.2后记
一个寒假回来之后又多了不少没见过的店,而且由于小北门的商业又扩大了不少,所以今后会多出很多很多店铺,这下子我们宁理学子有有更多种类的饭菜可以吃了,赢!
同上增补以及修改了一些错字和别的什么的依旧是如果后人想接手的话可以问我要源markdown。
我才发现自己没留QQ号码wwwwww
不过还是加入计协交流群吧,可以在那里找到我
计协交流群906370401
署名Starlink-Sora
于浙大宁波理工学院
2025年03月11日
## v1.3后记
2个月两个月又多了一万家铺子并没有那么多lol
根本评鉴不完!!!
署名Starlink-Sora
于浙大宁波理工学院
2025年05月13日

View file

@ -28,7 +28,7 @@ tags: ["随笔"]
# 计算机协会纲要
> 既欲伸张理想于天地,则必先有方寸
> [📖](https://github.com/nbtca/documents/blob/main/%E6%A1%A3%E6%A1%88/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%8D%8F%E4%BC%9A%E7%BA%B2%E8%A6%81)
> [📖](https://github.com/nbtca/documents/blob/main/archived/2024/计算机协会纲要.md)
# 路在何方

View file

@ -0,0 +1,105 @@
---
layout: "../../../../../layouts/MarkdownPost.astro"
title: "Install the Archlinux (SpeedRun Version)"
pubDate: 2025-03-28
description: "arch速通纪录请在专业人士指导下操作XD"
author: "小明"
cover:
url: "https://www.svgrepo.com/show/349296/arch-linux.svg"
alt: "cover"
tags: ["技术"]
---
# 🚀 Arch Linux Dual Boot Guide (Speedrun Version)
## **1. Prepare Windows**
- **Shrink Windows Partition**
- Open `diskmgmt.msc`, shrink `C:` by **50GB+** (Unallocated Space).
- **Check Boot Mode**
- Press `Win + R`, type `msinfo32`, check **BIOS Mode**:
- **UEFI** → Continue with UEFI
- **Legacy (MBR)** → Use MBR installation
---
## **2. Boot into Arch Live USB**
- Create USB:
```sh
dd if=archlinux.iso of=/dev/sdX bs=4M status=progress
```
- Boot from USB in BIOS.
---
## **3. Partition the Disk**
```sh
lsblk # Identify your disk (e.g., /dev/nvme0n1)
cfdisk /dev/nvme0n1
```
- **Keep Windows partitions**
- Create **Linux Root Partition** (`ext4`, **50GB+**)
- **(Optional)** Create Swap Partition (8GB)
---
## **4. Format & Mount**
```sh
mkfs.ext4 /dev/nvme0n1p3
mount /dev/nvme0n1p3 /mnt
mkdir -p /mnt/boot/efi
mount /dev/nvme0n1p1 /mnt/boot/efi # Use Windows' EFI partition
```
*(If Swap)*
```sh
mkswap /dev/nvme0n1p4
swapon /dev/nvme0n1p4
```
---
## **5. Install Arch**
```sh
pacstrap /mnt base linux linux-firmware vim
genfstab -U /mnt >> /mnt/etc/fstab
arch-chroot /mnt
```
---
## **6. Basic Config**
```sh
ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
hwclock --systohc
echo "LANG=en_US.UTF-8" > /etc/locale.conf
echo "archlinux" > /etc/hostname
passwd # Set root password
```
---
## **7. Install & Configure GRUB**
```sh
pacman -S grub efibootmgr os-prober
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
os-prober
grub-mkconfig -o /boot/grub/grub.cfg
```
---
## **8. Finish Installation**
```sh
exit
umount -R /mnt
reboot
```
- **Select Arch Linux from GRUB** 🎉
- If Windows is missing from GRUB:
```sh
os-prober
grub-mkconfig -o /boot/grub/grub.cfg
```
---
## **Done!** 🚀

View file

@ -0,0 +1,164 @@
import { useEffect, useState } from "react"
import type { components } from "../../types/saturday"
import { saturdayClient } from "../../utils/client"
import { Textarea, Input, Chip } from "@heroui/react"
import type { PublicMember } from "../../store/member"
import dayjs from "dayjs"
import { EventStatus, UserEventAction } from "../../types/event"
type PublicEvent = components["schemas"]["PublicEvent"]
type EventLog = components["schemas"]["EventLog"]
function EventLogItem(props: {
eventLog: EventLog
actor?: PublicMember
}) {
return (
<div className="py-1 flex items-center">
{/* <div className="mr-4 h-10 bg-red-400 flex flex-col items-center gap-2">
</div> */}
<div>
<div className="flex items-center">
<div className="mr-4">
{
UserEventAction.find(v => v.action === props.eventLog.action)?.text || props.eventLog.action
}
</div>
<div className="flex items-center">
{
props.actor?.avatar
? <img src={props.actor?.avatar} alt="actor avatar" className="w-6 aspect-square rounded-full" />
: <></>
}
<span className="text-gray-600 ml-2">
{
props.actor ? props.actor.alias : ""
}
</span>
</div>
</div>
<div className="flex gap-2 items-center mt-1 text-gray-600">
{dayjs(props.eventLog.gmtCreate).format("YYYY-MM-DD HH:mm")}
</div>
</div>
</div>
)
}
function EventStatusChip(props: {
status: string
}) {
switch (props.status) {
case EventStatus.open:
return <Chip></Chip>
case EventStatus.accepted:
return <Chip></Chip>
case EventStatus.committed:
return <Chip color="primary"></Chip>
case EventStatus.closed:
return <Chip color="success"></Chip>
case EventStatus.cancelled:
return <Chip></Chip>
}
}
const filterEventLog = (event: PublicEvent) => {
const eventLogs = event.logs
const filteredLogs: (EventLog & { actor?: PublicMember })[] = []
// find the first log that action is "create"
const createLog = eventLogs.find(log => log.action === "create")
filteredLogs.push(createLog)
// find the first log that action is "cancel"
const cancelLog = eventLogs.find(log => log.action === "cancel")
if (cancelLog) {
filteredLogs.push(cancelLog)
return filteredLogs
}
// find the last log that action is "accept"
const acceptLog = eventLogs.findLast(log => log.action === "accept")
if (acceptLog) {
filteredLogs.push({
...acceptLog,
actor: event.member,
})
}
// find the last log that action is "close"
const closeLog = eventLogs.findLast(log => log.action === "close")
if (closeLog) {
filteredLogs.push({
...closeLog,
actor: event.closedBy,
})
}
return filteredLogs
}
export default function EventDetail(props: {
eventId?: number
}) {
const [event, setEvent] = useState<PublicEvent | undefined>()
const fetchAndSetEvent = async (eventId: number) => {
const { data } = await saturdayClient.GET("/events/{EventId}", {
params: {
path: {
EventId: eventId,
},
},
})
setEvent(data)
}
useEffect(() => {
const url = new URL(window.location.href)
const eventId = props.eventId ?? url.searchParams.get("eventId")
if (!eventId) {
return
}
fetchAndSetEvent(eventId as unknown as number)
}, [])
return (
event
? (
<section className="box-border mb-24">
<div className="section-content mt-8">
<h2 className="text-2xl font-bold"></h2>
<div className="flex gap-2 items-center">
<span>
#{event.eventId}
</span>
<EventStatusChip status={event.status}></EventStatusChip>
</div>
</div>
<div className="section-content my-8 flex flex-col gap-4">
<Textarea
label="问题描述"
readOnly
name="description"
value={event.problem || ""}
/>
<Input
label="型号"
type="text"
value={event.model || ""}
readOnly
>
</Input>
<div className="bg-gray-100 rounded-xl text-sm px-3 py-2 mt-2 ">
<div className="text-xs font-semibold text-gray-600 mb-1">
</div>
{
filterEventLog(event).map((v, index) => {
return (
<EventLogItem key={index} actor={v.actor} eventLog={v} />
)
})
}
</div>
</div>
</section>
)
: <div></div>
)
}

View file

@ -0,0 +1,238 @@
import { SITE_URL } from "../../consts"
import { useEffect, useState } from "react"
import { makeLogtoClient } from "../../utils/auth"
import type { UserInfoResponse } from "@logto/browser"
import { Alert, Form, Input, Button, Textarea } from "@heroui/react"
import { saturdayClient } from "../../utils/client"
import type { components } from "../../types/saturday"
import QRCode from "qrcode"
import EventDetail from "./EventDetail"
type TicketFormData = {
model?: string
phone?: string
qq?: string
description?: string
}
function LoginHintAlert(props: {
onLogin: () => void
}) {
return (
<div className="section-content my-8">
<div className="flex items-center justify-center w-full">
<Alert
className="items-center"
endContent={(
<Button color="primary" size="sm" variant="flat" onPress={props.onLogin}>
</Button>
)}
>
</Alert>
</div>
</div>
)
}
function TicketForm(props: {
userInfo?: UserInfoResponse
onSubmit: (form: TicketFormData) => Promise<void>
}) {
const [loading, setLoading] = useState<boolean>()
const [formData, setFormData] = useState<TicketFormData>({})
const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
setLoading(true)
await props.onSubmit(formData)
setLoading(false)
}
const onLogin = async () => {
makeLogtoClient().signIn({
redirectUri: import.meta.env.PUBLIC_LOGTO_CALLBACK_URL,
postRedirectUri: window.location.pathname,
})
}
return (
<section className="box-border mb-24">
{
props.userInfo?.sub
? <></>
: <LoginHintAlert onLogin={onLogin}></LoginHintAlert>
}
<div className="section-content my-8">
<h2 className="text-2xl font-bold"></h2>
<div>
</div>
</div>
<div className="section-content w-full">
<Form
className="w-full flex flex-col gap-4"
onSubmit={onSubmit}
>
<div className="text-sm font-bold mx-1">
</div>
<Textarea
label="问题描述"
placeholder="告诉我们你遇到的问题"
errorMessage="问题描述不能为空"
required
name="description"
value={formData.description || ""}
onChange={(e) => {
setFormData({ ...formData, description: e.target.value })
}}
isRequired
/>
<div className="w-full">
<Input
label="型号"
type="text"
placeholder="你的设备型号"
value={formData.model || ""}
onChange={(e) => {
setFormData({ ...formData, model: e.target.value })
}}
description="填写设备型号,帮助我们更快的定位问题"
/>
</div>
<div className="text-sm font-bold mx-1 mt-2">
</div>
<Input
label="邮箱"
placeholder="example@nbtca.space"
isRequired
type="email"
value={props.userInfo?.email || ""}
readOnly
description="我们会向此邮箱发送维修相关的通知"
/>
<Input
label="电话号码"
placeholder="必填"
errorMessage="电话号码不能为空"
isRequired
type="phone"
name="phone"
value={formData.phone || ""}
maxLength={11}
onChange={(e) => {
setFormData({ ...formData, phone: e.target.value })
}}
/>
<Input
label="QQ"
placeholder="你的QQ号"
value={formData.qq || ""}
onChange={(e) => {
setFormData({ ...formData, qq: e.target.value })
}}
/>
<Button type="submit" color="primary" className="my-4 w-full" isLoading={loading}>
</Button>
</Form>
</div>
</section>
)
}
type PublicEvent = components["schemas"]["PublicEvent"]
function TicketFormCreated(props: {
event: PublicEvent
}) {
const [svg, setSvg] = useState<string>()
useEffect(() => {
const url = new URL(`/repair/ticket-detail`, SITE_URL)
url.searchParams.append("eventId", props.event.eventId.toString())
QRCode.toString(url.toString()).then((res) => {
setSvg(res)
})
})
return (
<section className="box-border w-full mt-8">
<div className="section-content">
<Alert hideIcon color="success" variant="faded">
<div className="flex items-center gap-8">
<div className="h-28 lg:h-40 aspect-square">
<div className="h-full" dangerouslySetInnerHTML={{ __html: svg }}></div>
</div>
<div>
<div className="flex items-center gap-2">
<div className="text-brand text-nowrap text-lg lg:text-2xl font-bold">
</div>
</div>
<div className="mt-1 text-gray-600 lg:text-lg">
<div>
</div>
<div>
</div>
</div>
</div>
</div>
</Alert>
</div>
<EventDetail eventId={props.event?.eventId}></EventDetail>
</section>
)
}
export default function App() {
const [userInfo, setUserInfo] = useState<UserInfoResponse>()
const [event, setEvent] = useState<PublicEvent | undefined>()
useEffect(() => {
const check = async () => {
const createRepairPath = "/repair/create-ticket"
const authenticated = await makeLogtoClient().isAuthenticated()
if (!authenticated) {
window.location.href = `/repair/login-hint?redirectUrl=${createRepairPath}`
return
}
const res = await makeLogtoClient().getIdTokenClaims()
setUserInfo(res)
}
check()
}, [])
const onSubmit = async (formData: TicketFormData) => {
const logtoToken = await makeLogtoClient().getAccessToken()
try {
const res = await saturdayClient.POST("/client/event", {
headers: {
Authorization: `Bearer ${logtoToken}`,
},
body: {
Problem: formData.description,
model: formData.model,
phone: formData.phone,
qq: formData.qq,
},
})
setEvent(res.data as unknown as PublicEvent)
}
catch (error) {
console.log(error)
}
}
return (
<>
{
event?.eventId
? <TicketFormCreated event={event}></TicketFormCreated>
: <TicketForm userInfo={userInfo} onSubmit={onSubmit}></TicketForm>
}
</>
)
}

View file

@ -0,0 +1,12 @@
---
import BaseLayout from "../../layouts/BaseLayout.astro"
import RepairHeader from "../../components/header/RepairHeader.astro"
import TicketForm from "./TicketForm"
---
<BaseLayout primaryTitle="Create Ticket">
<RepairHeader></RepairHeader>
<div>
<TicketForm client:only="react"></TicketForm>
</div>
</BaseLayout>

View file

@ -0,0 +1,83 @@
---
import BaseLayout from "../../layouts/BaseLayout.astro"
import hayasaka from "../_assets/hayasaka.jpg"
import repairDayOnSite from "../_assets/repair_day_on_site.jpeg"
import { Button } from "@heroui/react"
import RepairHeader from "../../components/header/RepairHeader.astro"
---
<script>
// @ts-check
import { makeLogtoClient } from "../../utils/auth"
const button = document.getElementById("create-ticket-button")
button.addEventListener("click", async () => {
const logtoClient = makeLogtoClient()
const createRepairPath = "/repair/create-ticket"
const authenticated = await logtoClient.isAuthenticated()
if (!authenticated) {
window.location.href = `/repair/login-hint?redirectUrl=${createRepairPath}`
return
}
window.location.href = createRepairPath
})
</script>
<BaseLayout>
<section class="box-border">
<RepairHeader></RepairHeader>
<div class="container mx-auto pt-16 pb-20">
<div class="flex flex-col items-center justify-center">
<img src={hayasaka.src} alt="" class="h-48 md:h-auto md:w-1/2 object-cover" />
<div class="mt-12 text-lg lg:text-2xl font-bold">我们提供免费的电脑维修服务</div>
<div class="mt-4 text-gray-500 text-center lg:text-lg">
<div>
从<strong>清理磁盘</strong>到<strong>加装硬件</strong>再到<strong>环境配置</strong>
</div>
<div>
我们都帮你搞定。
</div>
</div>
<div class="mt-6">
<Button
id="create-ticket-button"
className="bg-blue-500 text-white"
radius="full"
>进行预约
</Button>
</div>
</div>
</div>
<div class="w-full bg-white pb-24 flex flex-col gap-12">
<div class="component">
<div class="relative h-[521px] sm:h-[396px] md:h-[561px] mt-4 w-full my-0 xs:rounded-2xl overflow-hidden">
<img src={repairDayOnSite.src} alt="" class="w-full h-full object-cover object-bottom-right" />
<div class="absolute bottom-0 left-0 text-white font-bold p-4 text-xl flex items-center gap-2">
理工维修日
<svg width="23" height="22" viewBox="0 0 23 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.9998 6.04438C22.9698 4.81543 22.5749 3.62319 21.8654 2.61935C21.1558 1.6155 20.1637 0.845446 19.0152 0.407155C17.8667 -0.0311353 16.6138 -0.117845 15.4159 0.15806C14.218 0.433964 13.1292 1.06001 12.2881 1.95654L9.80055 4.70897C9.09069 5.49362 8.84036 5.08415 8.42884 4.69594C3.47217 0.0257864 -2.93372 6.51078 1.47633 11.4134L8.22583 18.9197L11.2806 15.5184C10.3522 15.6164 9.41428 15.4701 8.55984 15.0939C7.374 14.574 6.57978 13.6275 6.16826 12.9944C5.67239 12.2317 5.47829 11.3387 5.33084 10.3394C5.21836 9.57872 4.91932 9.05882 4.54004 8.65621C4.06036 8.14157 3.40641 7.82375 2.70538 7.76457C2.79582 7.24026 3.06807 6.76458 3.47431 6.42103C3.88056 6.07748 4.39484 5.88803 4.92687 5.88594C5.23782 5.88279 5.54591 5.94558 5.83082 6.07019C6.11573 6.1948 6.371 6.37839 6.57978 6.60886C7.11406 7.22135 7.67029 7.67677 8.32391 7.95593C9.93087 8.64181 11.1037 6.92711 11.6002 6.3784L14.8875 2.76107C15.5473 2.03541 16.607 2.37904 16.9719 2.53405L13.1071 6.79679C13.0827 6.82374 13.0644 6.85558 13.0534 6.89019C13.0424 6.92479 13.0389 6.96135 13.0432 6.99741C13.0475 7.03347 13.0595 7.06819 13.0783 7.09924C13.0971 7.1303 13.1223 7.15697 13.1523 7.17745C13.203 7.21186 13.2643 7.22692 13.3251 7.21986C13.3859 7.21281 13.4422 7.18413 13.4836 7.13904L16.9328 3.35642C17.4396 2.80017 18.1556 2.80085 18.9986 3.20552L14.4719 8.22205C14.4287 8.26989 14.4063 8.33293 14.4096 8.39731C14.4128 8.46169 14.4416 8.52213 14.4894 8.56533C14.5372 8.60853 14.6003 8.63096 14.6647 8.62768C14.729 8.6244 14.7895 8.59568 14.8327 8.54784L18.4766 4.51007C18.9121 4.02584 19.6391 4.17742 20.4272 4.54985L15.9342 9.53414C15.8942 9.57834 15.8735 9.63659 15.8765 9.69608C15.8795 9.75558 15.9061 9.81143 15.9503 9.85136C15.9945 9.89128 16.0527 9.91202 16.1122 9.90899C16.1717 9.90597 16.2276 9.87944 16.2675 9.83524L18.882 6.94494C19.4197 6.34891 20.1995 6.53341 20.8476 6.87292L9.31222 19.8457L9.18603 19.9876L10.9953 22L21.2831 10.5582C22.3949 9.4045 23.043 7.76662 22.9978 6.04438" fill="white" />
</svg>
</div>
</div>
<div class="mt-4 font-semibold px-4 xs:px-2 text-base xs:text-lg text-gray-400">
<div>
在接受预约之外,我们每月举办 <span class="text-black">理工维修日</span>,定时定点提供维修。
</div>
<div>
在<a href="/calendar" class="mx-0.5">协会公共日历</a>上查看最近的维修日
</div>
</div>
</div>
</div>
</section>
</BaseLayout>
<script>
// @ts-check
import { makeLogtoClient } from "../../utils/auth"
makeLogtoClient().getIdTokenClaims().then((res) => {
console.log(res)
})
</script>

View file

@ -0,0 +1,47 @@
---
import BaseLayout from "../../layouts/BaseLayout.astro"
import RepairHeader from "../../components/header/RepairHeader.astro"
import { Button } from "@heroui/react"
---
<script>
import { makeLogtoClient } from "../../utils/auth"
const button = document.getElementById("login-button")
button.addEventListener("click", async () => {
const logtoClient = makeLogtoClient()
const urlParams = new URLSearchParams(window.location.search)
const redirectUrl = urlParams.get("redirectUrl") || "/"
const isAuthenticated = await logtoClient.isAuthenticated()
if (isAuthenticated) {
window.location.href = redirectUrl
}
logtoClient.signIn({
redirectUri: import.meta.env.PUBLIC_LOGTO_CALLBACK_URL,
postRedirectUri: redirectUrl,
})
})
</script>
<BaseLayout primaryTitle="Create Ticket">
<RepairHeader></RepairHeader>
<section class="min-h-[70vh]">
<div class="section-content my-16 flex flex-col gap-8">
<div>
<div>
<div class="text-xl font-bold">登入账号后继续操作</div>
<div class="text-sm text-gray-700">
前往 auth.app.nbtca.space
</div>
</div>
<div class="mt-4">
<div class="text-gray-700">为了验证身份以及记录维修信息,请在登入帐号之后继续操作。</div>
<div class="mt-1 text-gray-700">你也可以点击下方登入按钮后注册账户。</div>
</div>
</div>
<div class="mt-4">
<Button id="login-button" color="primary">登入</Button>
</div>
</div>
</section>
</BaseLayout>

View file

@ -1,23 +0,0 @@
---
import BaseLayout from "../../layouts/BaseLayout.astro"
import RepairMiniProgramQRCode from "../_assets/repair_mini_program_qr_code.jpg"
---
<BaseLayout primaryTitle="关于">
<div class="min-h-screen bg-white flex flex-col items-center">
<div class="py-32 flex flex-col items-center">
<div class="text-3xl lg:text-5xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-pink-500 to-violet-500">
NBT 电脑维修小程序
</div>
<div class="text-center text-xl lg:text-2xl text-[#004f8e] font-bold mt-8 mb-10">
<div>
微信扫码
</div>
<div>
获取免费维修
</div>
</div>
<img src={RepairMiniProgramQRCode.src} alt="" class="w-64 aspect-square" />
</div>
</div>
</BaseLayout>

View file

@ -0,0 +1,12 @@
---
import BaseLayout from "../../layouts/BaseLayout.astro"
import RepairHeader from "../../components/header/RepairHeader.astro"
import EventDetail from "./EventDetail"
---
<BaseLayout primaryTitle="Create Ticket">
<RepairHeader></RepairHeader>
<div>
<EventDetail client:only="react"></EventDetail>
</div>
</BaseLayout>

78
src/types/event.ts Normal file
View file

@ -0,0 +1,78 @@
export interface Status {
status: string
text: string
icon: string
}
export interface Action {
action: string
text: string
icon: string
}
export enum EventStatus {
open = "open",
accepted = "accepted",
committed = "committed",
closed = "closed",
cancelled = "cancelled",
}
export const UserEventStatus: Status[] = [
{
status: EventStatus.open,
text: "待处理",
icon: "status_initial.svg",
},
{
status: EventStatus.accepted,
text: "维修中",
icon: "status_ongoing.svg",
},
{
status: EventStatus.committed,
text: "维修中",
icon: "status_ongoing.svg",
},
{
status: EventStatus.closed,
text: "已完成",
icon: "status_complete.svg",
},
{
status: EventStatus.cancelled,
text: "已取消",
icon: "status_cancelled.svg",
},
]
export enum EventAction {
create = "create",
accept = "accept",
commit = "commit",
close = "close",
cancel = "cancel",
}
export const UserEventAction: Action[] = [
{
action: EventAction.create,
text: "事件创建",
icon: "event_create.svg",
},
{
action: EventAction.accept,
text: "维修开始",
icon: "status_ongoing.svg",
},
{
action: EventAction.close,
text: "维修完成",
icon: "status_complete.svg",
},
{
action: EventAction.cancel,
text: "事件取消",
icon: "status_cancelled.svg",
},
]

View file

@ -1,7 +1,14 @@
import LogtoClient from "@logto/browser"
export const makeLogtoClient = () =>
new LogtoClient({
endpoint: import.meta.env.PUBLIC_LOGTO_ENDPOINT,
appId: import.meta.env.PUBLIC_LOGTO_APP_ID,
})
let logtoClient: LogtoClient | undefined = undefined
export const makeLogtoClient = () => {
if (logtoClient === undefined) {
logtoClient = new LogtoClient({
endpoint: import.meta.env.PUBLIC_LOGTO_ENDPOINT,
appId: import.meta.env.PUBLIC_LOGTO_APP_ID,
scopes: ["email", "custom_data", "roles"],
})
}
return logtoClient
}

View file

@ -1,15 +1,13 @@
import createClient from "openapi-fetch"
import type { paths as saturdayPaths } from "../types/saturday"
// import type { paths as activePaths } from "../types/active"
import { ApiClient } from "./active"
export const saturdayClient = createClient<saturdayPaths>({
baseUrl: "https://api.nbtca.space/v2/",
baseUrl: import.meta.env.PROD ? "https://api.nbtca.space/v2/" : "/saturday",
})
// export const activeClient = createClient<activePaths>({
// baseUrl: "https://active.nbtca.space/",
// })
export const activeClient = new ApiClient({
BASE: "https://active.nbtca.space",
// BASE: "/active",
})
export * from "./active/types.gen"

View file

@ -1,11 +1,14 @@
import { heroui } from "@heroui/react"
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}",
"./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}",
],
content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}", "./node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}"],
theme: {
screens: {
xs: "416px",
sm: "734px",
md: "1068px",
lg: "1441px",
},
extend: {
colors: {
brand: "#004b86",