├── src
├── store
│ ├── index.js
│ ├── common
│ │ └── save.js
│ └── user
│ │ └── index.js
├── utils
│ ├── key.js
│ ├── time.js
│ ├── color.js
│ ├── auth.js
│ ├── oauth-provider.js
│ ├── role.js
│ ├── device-os.js
│ ├── message-type.js
│ ├── ua.js
│ └── backend-plugin.js
├── plugins
│ ├── mitt.js
│ ├── index.js
│ ├── vuetify.js
│ └── p5-banner.js
├── api
│ ├── teacher
│ │ └── index.js
│ ├── attachment
│ │ └── index.js
│ ├── message
│ │ └── index.js
│ ├── access
│ │ └── index.js
│ ├── backend-plugin.js
│ ├── oauth
│ │ └── index.js
│ ├── user
│ │ └── index.js
│ ├── index.js
│ ├── course
│ │ ├── creation.js
│ │ └── index.js
│ ├── student
│ │ └── index.js
│ └── correct
│ │ └── index.js
├── views
│ ├── common
│ │ ├── personal
│ │ │ ├── AboutView.vue
│ │ │ ├── StatisticView.vue
│ │ │ ├── SecurityView.vue
│ │ │ └── InfoView.vue
│ │ ├── course
│ │ │ ├── CourseView.vue
│ │ │ ├── CourseDetailView.vue
│ │ │ ├── CourseSectionView.vue
│ │ │ └── CourseInfoView.vue
│ │ ├── HomeView.vue
│ │ └── PersonalCenterView.vue
│ ├── plugin
│ │ ├── PluginMainView.vue
│ │ ├── VuePluginView.vue
│ │ ├── FrontendPluginView.vue
│ │ └── BackendPluginView.vue
│ ├── MainView.vue
│ ├── oauth
│ │ ├── bind
│ │ │ └── GitHubOAuthBindView.vue
│ │ └── GitHubOAuthCallbackView.vue
│ ├── teacher
│ │ ├── TaskCorrectView.vue
│ │ ├── correct
│ │ │ └── TaskBatchCorrectView.vue
│ │ ├── TeacherCourseView.vue
│ │ ├── course
│ │ │ └── CourseCreateView.vue
│ │ └── StudentPerformanceView.vue
│ └── LoginView.vue
├── components
│ ├── plugin
│ │ ├── backend
│ │ │ ├── body
│ │ │ │ ├── TheJsonContent.vue
│ │ │ │ └── TheFormDataContent.vue
│ │ │ ├── response
│ │ │ │ ├── TheResponseJsonContent.vue
│ │ │ │ └── TheResponseHeaderContent.vue
│ │ │ ├── request
│ │ │ │ ├── TheRequestHeaderContent.vue
│ │ │ │ ├── TheRequestParamContent.vue
│ │ │ │ └── TheRequestBodyContent.vue
│ │ │ ├── TheRequestResult.vue
│ │ │ └── TheRequestContent.vue
│ │ ├── CustomPluginCard.vue
│ │ └── CustomCodeEditor.vue
│ ├── TheP5Banner.vue
│ ├── CustomFloatBackButton.vue
│ ├── personal
│ │ ├── statistic
│ │ │ └── StatisticEntryCard.vue
│ │ ├── about
│ │ │ └── TheInstallAppCard.vue
│ │ ├── info
│ │ │ ├── TheUserBasicInfoCard.vue
│ │ │ ├── TheEmailModifyCard.vue
│ │ │ ├── TheAccountBindCard.vue
│ │ │ └── TheAvatarModifyCard.vue
│ │ └── security
│ │ │ ├── TheLogoutCard.vue
│ │ │ ├── TheDeviceListCard.vue
│ │ │ └── ThePasswordModifyCard.vue
│ ├── home
│ │ ├── ThePluginListCard.vue
│ │ └── TheMessageListCard.vue
│ ├── CustomAttachmentCard.vue
│ ├── CustomDeviceCard.vue
│ ├── CustomMessageCard.vue
│ ├── CustomHorizontalCourseCard.vue
│ ├── course
│ │ └── CustomCourseStructureList.vue
│ └── TheHeader.vue
├── main.js
├── assets
│ ├── img
│ │ ├── frontend-plugin-cover.svg
│ │ ├── vue-plugin-cover.svg
│ │ └── backend-plugin-cover.svg
│ └── scss
│ │ └── global.scss
├── App.vue
└── router
│ └── index.js
├── .imgbotconfig
├── .env.production
├── .env.development
├── .browserslistrc
├── public
├── default.jpg
└── logo.svg
├── postcss.config.js
├── vercel.json
├── .editorconfig
├── jsconfig.json
├── .gitignore
├── index.html
├── eslint.config.js
├── .github
└── dependabot.yml
├── README.md
├── tailwind.config.js
├── LICENSE
├── package.json
├── vite.config.mjs
└── components.d.ts
/src/store/index.js:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.imgbotconfig:
--------------------------------------------------------------------------------
1 | {
2 | "schedule": "daily"
3 | }
--------------------------------------------------------------------------------
/.env.production:
--------------------------------------------------------------------------------
1 | VITE_BACKEND_BASE_URL='https://api.goopper.top'
--------------------------------------------------------------------------------
/.env.development:
--------------------------------------------------------------------------------
1 | VITE_BACKEND_BASE_URL='http://100.116.150.108:8889/'
--------------------------------------------------------------------------------
/.browserslistrc:
--------------------------------------------------------------------------------
1 | > 1%
2 | last 2 versions
3 | not dead
4 | not ie 11
5 |
--------------------------------------------------------------------------------
/public/default.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hedwa/platform-frontend/HEAD/public/default.jpg
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | };
7 |
--------------------------------------------------------------------------------
/src/utils/key.js:
--------------------------------------------------------------------------------
1 | export const LOCAL_STORAGE_TOKEN_KEY = 'G-Token';
2 |
3 | export const AUTHORIZATION_HEADER_KEY = 'G-Authorization';
--------------------------------------------------------------------------------
/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "rewrites": [
3 | {
4 | "source": "/(.*)",
5 | "destination": "/"
6 | }
7 | ]
8 | }
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.{js,jsx,ts,tsx,vue}]
2 | indent_style = space
3 | indent_size = 2
4 | trim_trailing_whitespace = true
5 | insert_final_newline = true
6 |
--------------------------------------------------------------------------------
/src/plugins/mitt.js:
--------------------------------------------------------------------------------
1 | import mitt from 'mitt';
2 |
3 | // mitt is a tiny 200 bytes functional event emitter / pubsub.
4 | // It is fast, and has no dependencies.
5 | export default mitt();
--------------------------------------------------------------------------------
/src/api/teacher/index.js:
--------------------------------------------------------------------------------
1 | import { request } from '..';
2 |
3 | export function getTeacherList() {
4 | return request({
5 | url: '/teacher',
6 | method: 'get'
7 | });
8 | }
--------------------------------------------------------------------------------
/src/views/common/personal/AboutView.vue:
--------------------------------------------------------------------------------
1 |
2 |
4 | 记录查询 5 |
6 |7 | 教学记录查询入口 8 |
9 |4 | 安装应用程序 5 |
6 |7 | 将本网站作为应用程序安装到本设备 8 |
9 |4 | 基本信息 5 |
6 |7 | 基本信息由平台创建账户时自动录入,无需修改也不允许修改 8 |
9 |12 | {{ OS.name }} 13 |
14 |15 | 最近开始活跃时间:{{ localDatetime }} 16 |
17 |18 | 浏览器版本:{{ device.deviceInfo.browser }}.{{ device.deviceInfo.version }} 19 |
20 |28 | 加载用户信息中 29 |
30 |4 | 退出登陆 5 |
6 |7 | 退出当前登陆状态并前往登陆页 8 |
9 |4 | 邮箱 5 |
6 |7 | 用于登陆平台的邮箱,如果想要修改请输入合法的邮箱并点击保存按钮 8 |
9 |66 | 无请求体 67 |
68 |17 | {{ section.desc }} 18 |
19 |47 | 本章节没有任务 48 |
49 |{{ response.code }}
36 |{{ response.message }}
37 |{{ response.code }}
53 |{{ response.message }}
54 |25 | {{ courseInfo.name }} 26 |
27 |36 | {{ courseInfo.desc }} 37 |
38 | 39 |4 | 登陆设备 5 |
6 |7 | 当前账户存在会话(登陆状态)的设备 8 |
9 |30 | {{ targetOS.name }} 31 |
32 |33 | 最近开始活跃时间:{{ targetDevice.device.date }} 34 |
35 |36 | 浏览器版本:{{ targetDevice.deviceInfo.browser }}.{{ targetDevice.deviceInfo.version }} 37 |
38 |20 | 授课老师 : {{ course.teacher }} 21 |
22 |24 | {{ course.desc }} 25 |
26 |4 | 密码 5 |
6 |7 | 此处可以修改登陆账户所需要的密码 8 |
9 |4 | 账号关联 5 |
6 |7 | 将账户关联至第三方平台,您可以随时更改此设置 8 |
9 |27 | {{ bind.bind.bindUsername }} 28 |
29 |5 | 头像 6 |
7 |9 | 这是你当前使用的头像 10 |
11 |12 | 如果想要修改头像,请点击头像并上传你的自定义完成头像的修改 13 |
14 |19 | 学生答案: 20 |
21 |57 | 无评语 58 |
59 |83 | 无附件 84 |
85 |13 | 全选 14 |
15 | 16 |72 | 当前课程没有章节 73 |
74 |75 | 无课程 76 |
77 |83 | 暂时没有学生成绩数据 84 |
85 | 86 | 87 |38 | 暂时没有消息 39 |
40 |101 | {{ targetMessage.title }} 102 |
103 | 108 |112 | 您的作业已经被批改,请查看批改结果 113 |
114 |115 | 发送日期:{{ sendDate }} 116 |
117 |