├── .dockerignore ├── .env.example ├── .eslintrc ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .npmrc ├── .vscode ├── extensions.json └── settings.json ├── Dockerfile ├── LICENSE ├── README.md ├── app.config.ts ├── app.vue ├── assets ├── css │ ├── main.css │ └── preflight.css └── logo.svg ├── components ├── AccountItem.vue ├── AccountList.vue ├── AccountLoginModal.client.vue ├── CodeOrGestureSignModal.client.vue ├── CourseList.vue ├── Hero.vue ├── Log.vue ├── Operation.vue ├── QrCodeSignModal.client.vue ├── SettingModal.client.vue ├── SignHistory.vue ├── app │ ├── Footer.vue │ ├── Header.vue │ ├── Logo.vue │ ├── Nav.vue │ └── ThemeSwitcher.vue └── global │ ├── LoginCard.vue │ └── UserButton.vue ├── constants ├── cx.ts └── setting.ts ├── content └── help.md ├── ecosystem.config.js ├── layouts ├── default.vue └── page.vue ├── nuxt.config.ts ├── package.json ├── pages ├── 404.vue ├── account │ └── [uid].vue ├── auth │ └── login.vue ├── help.vue ├── index.vue └── profile.vue ├── plugins └── setTheme.client.ts ├── pnpm-lock.yaml ├── prisma └── schema.prisma ├── public ├── chaoxing-og.png ├── favicon.svg ├── img │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ └── cx.png ├── logo.svg ├── pwa-192x192.png ├── pwa-512x512.png └── pwa-64x64.png ├── server ├── api │ ├── auth │ │ ├── [...].ts │ │ └── signUp.post.ts │ └── cx │ │ ├── accounts │ │ ├── [uid] │ │ │ ├── monitor.post.ts │ │ │ ├── sign_all.post.ts │ │ │ ├── sign_by_code.post.ts │ │ │ ├── sign_by_gesture.post.ts │ │ │ ├── sign_by_qrcode.post.ts │ │ │ ├── sign_history.post.ts │ │ │ ├── unmonitor.post.ts │ │ │ └── update_setting.post.ts │ │ └── index.get.ts │ │ ├── courses │ │ ├── [cid].get.ts │ │ ├── [cid] │ │ │ ├── activities │ │ │ │ ├── [aid] │ │ │ │ │ └── sign.post.ts │ │ │ │ └── index.post.ts │ │ │ └── sign.post.ts │ │ └── index.get.ts │ │ ├── login.post.ts │ │ └── logout.post.ts ├── middleware │ ├── 0.prisma.ts │ ├── 1.auth.ts │ └── 2.cx.ts ├── plugins │ └── connect.ts ├── protocol │ ├── cx │ │ ├── cx.d.ts │ │ ├── im.test.ts │ │ ├── index.test.ts │ │ ├── index.ts │ │ └── pan.test.ts │ └── easemob │ │ ├── index.test.ts │ │ └── index.ts └── utils │ ├── db.ts │ ├── index.ts │ └── monitor.ts ├── stores ├── account.ts └── log.ts ├── tsconfig.json ├── types ├── account.d.ts └── index.d.ts ├── unocss.config.ts ├── utils ├── base64.ts ├── index.ts ├── is.ts └── request.ts └── vitest.config.ts /.dockerignore: -------------------------------------------------------------------------------- 1 | # node_modules 2 | .git 3 | .gitignore 4 | .nuxt 5 | .output 6 | .vscode 7 | .dockerignore 8 | .eslintignore 9 | .eslintrc 10 | .prettierrc 11 | .prettierignore 12 | *.md 13 | LICENSE -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | PORT=8050 2 | 3 | # Nuxt Auth 4 | AUTH_SECRET="chaoxing-sign" 5 | AUTH_ORIGIN="http://localhost:8050" 6 | NEXTAUTH_URL="http://localhost:8050" 7 | 8 | # Prisma 9 | DATABASE_URL="postgresql://username:password@localhost:5432/chaoxing" 10 | 11 | # APP 12 | NUXT_IM_INIT_CONNECT=false # 启动时是否自动重连 -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@antfu", 3 | "rules": { 4 | "no-console": "off", 5 | "new-cap": "off", 6 | "n/prefer-global/process": "off", 7 | "no-restricted-globals": "off" 8 | } 9 | } -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v3 14 | 15 | - name: Install pnpm 16 | uses: pnpm/action-setup@v2 17 | 18 | - name: Set node 19 | uses: actions/setup-node@v3 20 | with: 21 | node-version: 16.x 22 | cache: pnpm 23 | 24 | - name: Setup 25 | run: npm i -g @antfu/ni 26 | 27 | - name: Install 28 | run: nci 29 | 30 | - name: Build 31 | run: nr build 32 | 33 | - name: SSH Deploy 34 | uses: easingthemes/ssh-deploy@v4.1.10 35 | env: 36 | SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} 37 | ARGS: -avzr --delete 38 | SOURCE: .output 39 | REMOTE_HOST: ${{ secrets.REMOTE_HOST }} 40 | REMOTE_USER: root 41 | TARGET: /opt/1panel/apps/openresty/openresty/www/sites/cx.kuizuo.cn/server 42 | 43 | - name: SSH Commands 44 | uses: appleboy/ssh-action@master 45 | with: 46 | host: ${{ secrets.REMOTE_HOST }} 47 | username: root 48 | key: ${{ secrets.SSH_PRIVATE_KEY }} 49 | script: pm2 restart chaoxing-sign 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.log 3 | dist 4 | .output 5 | .nuxt 6 | .env 7 | .env.production 8 | .vercel 9 | data 10 | 11 | .DS_Store -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | shamefully-hoist=true 2 | strict-peer-dependencies=true -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "antfu.iconify", 4 | "antfu.unocss", 5 | "antfu.goto-alias", 6 | "csstools.postcss", 7 | "dbaeumer.vscode-eslint", 8 | "vue.volar" 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "prettier.enable": false, 3 | "editor.codeActionsOnSave": { 4 | "source.fixAll.eslint": "explicit" 5 | }, 6 | "files.associations": { 7 | "*.css": "postcss" 8 | }, 9 | "editor.formatOnSave": false 10 | } 11 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG NODE_VERSION=node:18-alpine 2 | FROM $NODE_VERSION AS build-stage 3 | 4 | WORKDIR /app 5 | RUN corepack enable 6 | 7 | COPY .npmrc package.json pnpm-lock.yaml ./ 8 | RUN pnpm install 9 | 10 | COPY . . 11 | RUN pnpm build 12 | 13 | FROM $NODE_VERSION AS production-stage 14 | 15 | WORKDIR /app 16 | COPY --from=build-stage /app/.output /app/.output 17 | 18 | ENV NODE_ENV=production 19 | ENV PORT=8050 20 | ENV AUTH_SECRET="chaoxing-sign" 21 | ENV AUTH_ORIGIN="http://localhost:8050" 22 | ENV NEXTAUTH_URL="http://localhost:8050" 23 | 24 | ENV DATABASE_URL="postgresql://username:password@localhost:5432/chaoxing" 25 | 26 | EXPOSE 8050 27 | 28 | CMD [ "node", "/app/.output/server/index.mjs" ] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023-PRESENT Kuizuo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🌟某星签到(网页版) 2 | 3 | size CI License 4 | 5 | 在这里你可以在摆脱客户端繁琐的签到流程,让签到不再是你的烦恼。 6 | 7 | ## ✨功能 8 | 9 | - [x] 普通签到 10 | - [x] 拍照签到 11 | - [x] 位置签到 12 | - [x] 手势签到 13 | - [x] 签到码签到 14 | - [x] 二维码签到 15 | - [x] 监听签到任务,自动完成 16 | - [x] 支持多用户批量签到 17 | 18 | [更多帮助](./content/help.md) 19 | 20 | ## 🛠 运行 21 | 22 | ```shell 23 | git clone https://github.com/kuizuo/chaoxing-sign.git 24 | cd chaoxing-sign 25 | pnpm install 26 | ``` 27 | 28 | 你需要一个 PostgreSQL 数据库地址(用于存储账号信息以及自动监控签到),然后将项目根目录下 `.env.example` 文件更改成 `.env` 并替换 `DATABASE_URL` 为数据库地址(通常是远程地址)。运行如下命令用于同步数据库: 29 | 30 | ```shell 31 | npx prisma db push 32 | ``` 33 | 34 | ```shell 35 | pnpm run dev 36 | ``` 37 | 38 | 打包 39 | 40 | ```shell 41 | pnpm run build 42 | pnpm run preview 43 | ``` 44 | 45 | ## 部署 46 | 47 | ### PM2 + Nginx (推荐) 48 | 49 | 本项目已经编写好了 `ecosystem.config.js` 文件,具体请根据实际情况修改环境变量,你可以直接使用 PM2 来启动项目。 50 | 51 | ```shell 52 | npm run start:pm2 53 | ``` 54 | 55 | 此时已经启动好了本地端口为 `8050` 的服务,要注意,如果你使用了 Nginx 的反向代理,那么你需要将 `AUTH_ORIGIN` 环境变量设置为你的域名,否则将无法正常使用。并在 Nginx 中添加如下配置: 56 | 57 | ```nginx 58 | location / { 59 | proxy_pass http://127.0.0.1:8050; 60 | } 61 | ``` 62 | 63 | 此外可能还需要配置 SSL 证书,因为要调用摄像头权限就必须是在安全环境下(即https下),否则你将无法使用扫一扫功能,这也是无奈之举。 64 | 65 | ### Docker 66 | 67 | 本项目已经编写好了 docker 相关文件,你可以直接使用 Docker 来启动项目。 68 | 69 | > ⚠️ 注意: 需要将 node_modules 复制到镜像内, 因为 prisma client 产物存在 node_modules 内. 70 | 71 | 如果你有自己的 postgresql (远程)数据库,那么你需要在 Dockerfile 中修改 `DATABASE_URL` 环境变量为你的数据库地址,执行下方命令即可构建镜像。 72 | 73 | ```shell 74 | docker buildx build . -t chaoxing-sign:latest 75 | ``` 76 | 77 | ### Vercel or Netlify(不推荐) 78 | 79 | 由于采用 Nuxt.js 框架,所以非常容易部署在 Vercel 或 Netlify 等平台上,但还是不推荐部署,理由如下: 80 | 81 | Vercel 或 Netlify 的服务器设立在国外,用户需要通过一些特殊手段能够访问,并且由于某星的服务器设立在国内,数据请求需要多一道障碍来访问,将导致响应速度过慢,网站体验效果极其不佳,已亲测,因此不推荐使用(无奈之举)。 82 | 83 | ## 🤝 免责声明 84 | 85 | 本项目仅作为个人技术专研,仅供学习参考。不得用于商业用途。 86 | 87 | ## 📝 License 88 | 89 | MIT License © 2023-PRESENT Kuizuo -------------------------------------------------------------------------------- /app.config.ts: -------------------------------------------------------------------------------- 1 | export default defineAppConfig({ 2 | title: '某星签到助手', 3 | description: '摆脱客户端繁琐的签到流程,让签到不再是你的烦恼。', 4 | keywords: 5 | 'chaoxing, sign, 超星, 签到, 拍照签到, 手势签到, 位置签到, 签到码签到, 二维码签到', 6 | author: { 7 | name: 'kuizuo', 8 | link: 'https://github.com/kuizuo', 9 | }, 10 | nuxtIcon: { 11 | size: '20px', 12 | class: 'icon', 13 | }, 14 | }) 15 | -------------------------------------------------------------------------------- /app.vue: -------------------------------------------------------------------------------- 1 | 53 | 54 | 72 | -------------------------------------------------------------------------------- /assets/css/main.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --app-header-height: 48px; 3 | --app-footer-height: 48px; 4 | 5 | --primary-color: #e70012; 6 | } 7 | 8 | .page-enter-active, 9 | .page-leave-active { 10 | transition: all 0.4s; 11 | } 12 | .page-enter-from, 13 | .page-leave-to { 14 | transform: translateY(20px); 15 | opacity: 0; 16 | } 17 | 18 | .layout-enter-active , 19 | .layout-leave-active { 20 | transition: all 0.1s ease-out; 21 | transition: all 0.4s; 22 | } 23 | .layout-enter-from, 24 | .layout-leave-to { 25 | transform: translateY(-20px); 26 | opacity: 0; 27 | } -------------------------------------------------------------------------------- /assets/css/preflight.css: -------------------------------------------------------------------------------- 1 | /* 2 | 1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) 3 | 2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) 4 | */ 5 | 6 | *, 7 | ::before, 8 | ::after { 9 | box-sizing: border-box; /* 1 */ 10 | border-width: 0; /* 2 */ 11 | border-style: solid; /* 2 */ 12 | border-color: #e5e7eb; /* 2 */ 13 | } 14 | 15 | /* 16 | 1. Use a consistent sensible line-height in all browsers. 17 | 2. Prevent adjustments of font size after orientation changes in iOS. 18 | 3. Use a more readable tab size. 19 | 4. Use the user's configured `sans` font-family by default. 20 | */ 21 | 22 | html { 23 | line-height: 1.5; /* 1 */ 24 | -webkit-text-size-adjust: 100%; /* 2 */ 25 | -moz-tab-size: 4; /* 3 */ 26 | -o-tab-size: 4; 27 | tab-size: 4; /* 3 */ 28 | font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; /* 4 */ 29 | } 30 | 31 | /* 32 | 1. Remove the margin in all browsers. 33 | 2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. 34 | */ 35 | 36 | body { 37 | margin: 0; /* 1 */ 38 | line-height: inherit; /* 2 */ 39 | } 40 | 41 | /* 42 | 1. Add the correct height in Firefox. 43 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 44 | 3. Ensure horizontal rules are visible by default. 45 | */ 46 | 47 | hr { 48 | height: 0; /* 1 */ 49 | color: inherit; /* 2 */ 50 | border-top-width: 1px; /* 3 */ 51 | } 52 | 53 | /* 54 | Add the correct text decoration in Chrome, Edge, and Safari. 55 | */ 56 | 57 | abbr:where([title]) { 58 | -webkit-text-decoration: underline dotted; 59 | text-decoration: underline dotted; 60 | } 61 | 62 | /* 63 | Remove the default font size and weight for headings. 64 | */ 65 | 66 | h1, 67 | h2, 68 | h3, 69 | h4, 70 | h5, 71 | h6 { 72 | font-size: inherit; 73 | font-weight: inherit; 74 | } 75 | 76 | /* 77 | Reset links to optimize for opt-in styling instead of opt-out. 78 | */ 79 | 80 | a { 81 | color: inherit; 82 | text-decoration: inherit; 83 | } 84 | 85 | /* 86 | Add the correct font weight in Edge and Safari. 87 | */ 88 | 89 | b, 90 | strong { 91 | font-weight: bolder; 92 | } 93 | 94 | /* 95 | 1. Use the user's configured `mono` font family by default. 96 | 2. Correct the odd `em` font sizing in all browsers. 97 | */ 98 | 99 | code, 100 | kbd, 101 | samp, 102 | pre { 103 | font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* 1 */ 104 | font-size: 1em; /* 2 */ 105 | } 106 | 107 | /* 108 | Add the correct font size in all browsers. 109 | */ 110 | 111 | small { 112 | font-size: 80%; 113 | } 114 | 115 | /* 116 | Prevent `sub` and `sup` elements from affecting the line height in all browsers. 117 | */ 118 | 119 | sub, 120 | sup { 121 | font-size: 75%; 122 | line-height: 0; 123 | position: relative; 124 | vertical-align: baseline; 125 | } 126 | 127 | sub { 128 | bottom: -0.25em; 129 | } 130 | 131 | sup { 132 | top: -0.5em; 133 | } 134 | 135 | /* 136 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 137 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 138 | 3. Remove gaps between table borders by default. 139 | */ 140 | 141 | table { 142 | text-indent: 0; /* 1 */ 143 | border-color: inherit; /* 2 */ 144 | border-collapse: collapse; /* 3 */ 145 | } 146 | 147 | /* 148 | 1. Change the font styles in all browsers. 149 | 2. Remove the margin in Firefox and Safari. 150 | 3. Remove default padding in all browsers. 151 | */ 152 | 153 | button, 154 | input, 155 | optgroup, 156 | select, 157 | textarea { 158 | font-family: inherit; /* 1 */ 159 | font-size: 100%; /* 1 */ 160 | font-weight: inherit; /* 1 */ 161 | line-height: inherit; /* 1 */ 162 | color: inherit; /* 1 */ 163 | margin: 0; /* 2 */ 164 | padding: 0; /* 3 */ 165 | } 166 | 167 | /* 168 | Remove the inheritance of text transform in Edge and Firefox. 169 | */ 170 | 171 | button, 172 | select { 173 | text-transform: none; 174 | } 175 | 176 | /* 177 | 1. Correct the inability to style clickable types in iOS and Safari. 178 | 2. Remove default button styles. 179 | */ 180 | 181 | button, 182 | /* [type='button'], */ 183 | [type='reset'], 184 | [type='submit'] { 185 | -webkit-appearance: button; /* 1 */ 186 | background-color: transparent; /* 2 */ 187 | background-image: none; /* 2 */ 188 | } 189 | 190 | /* 191 | Use the modern Firefox focus style for all focusable elements. 192 | */ 193 | 194 | :-moz-focusring { 195 | outline: auto; 196 | } 197 | 198 | /* 199 | Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) 200 | */ 201 | 202 | :-moz-ui-invalid { 203 | box-shadow: none; 204 | } 205 | 206 | /* 207 | Add the correct vertical alignment in Chrome and Firefox. 208 | */ 209 | 210 | progress { 211 | vertical-align: baseline; 212 | } 213 | 214 | /* 215 | Correct the cursor style of increment and decrement buttons in Safari. 216 | */ 217 | 218 | ::-webkit-inner-spin-button, 219 | ::-webkit-outer-spin-button { 220 | height: auto; 221 | } 222 | 223 | /* 224 | 1. Correct the odd appearance in Chrome and Safari. 225 | 2. Correct the outline style in Safari. 226 | */ 227 | 228 | [type='search'] { 229 | -webkit-appearance: textfield; /* 1 */ 230 | outline-offset: -2px; /* 2 */ 231 | } 232 | 233 | /* 234 | Remove the inner padding in Chrome and Safari on macOS. 235 | */ 236 | 237 | ::-webkit-search-decoration { 238 | -webkit-appearance: none; 239 | } 240 | 241 | /* 242 | 1. Correct the inability to style clickable types in iOS and Safari. 243 | 2. Change font properties to `inherit` in Safari. 244 | */ 245 | 246 | ::-webkit-file-upload-button { 247 | -webkit-appearance: button; /* 1 */ 248 | font: inherit; /* 2 */ 249 | } 250 | 251 | /* 252 | Add the correct display in Chrome and Safari. 253 | */ 254 | 255 | summary { 256 | display: list-item; 257 | } 258 | 259 | /* 260 | Removes the default spacing and border for appropriate elements. 261 | */ 262 | 263 | blockquote, 264 | dl, 265 | dd, 266 | h1, 267 | h2, 268 | h3, 269 | h4, 270 | h5, 271 | h6, 272 | hr, 273 | figure, 274 | p, 275 | pre { 276 | margin: 0; 277 | } 278 | 279 | fieldset { 280 | margin: 0; 281 | padding: 0; 282 | } 283 | 284 | legend { 285 | padding: 0; 286 | } 287 | 288 | ol, 289 | ul, 290 | menu { 291 | list-style: none; 292 | margin: 0; 293 | padding: 0; 294 | } 295 | 296 | /* 297 | Prevent resizing textareas horizontally by default. 298 | */ 299 | 300 | textarea { 301 | resize: vertical; 302 | } 303 | 304 | /* 305 | 1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) 306 | 2. Set the default placeholder color to the user's configured gray 400 color. 307 | */ 308 | 309 | input::-moz-placeholder, textarea::-moz-placeholder { 310 | opacity: 1; /* 1 */ 311 | color: #9ca3af; /* 2 */ 312 | } 313 | 314 | input::placeholder, 315 | textarea::placeholder { 316 | opacity: 1; /* 1 */ 317 | color: #9ca3af; /* 2 */ 318 | } 319 | 320 | /* 321 | Set the default cursor for buttons. 322 | */ 323 | 324 | button, 325 | [role="button"] { 326 | cursor: pointer; 327 | } 328 | 329 | /* 330 | Make sure disabled buttons don't get the pointer cursor. 331 | */ 332 | 333 | :disabled { 334 | cursor: default; 335 | } 336 | 337 | /* 338 | 1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) 339 | 2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) 340 | This can trigger a poorly considered lint error in some tools but is included by design. 341 | */ 342 | 343 | img, 344 | svg, 345 | video, 346 | canvas, 347 | audio, 348 | iframe, 349 | embed, 350 | object { 351 | display: block; /* 1 */ 352 | vertical-align: middle; /* 2 */ 353 | } 354 | 355 | /* 356 | Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) 357 | */ 358 | 359 | img, 360 | video { 361 | max-width: 100%; 362 | height: auto; 363 | } -------------------------------------------------------------------------------- /assets/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /components/AccountItem.vue: -------------------------------------------------------------------------------- 1 | 118 | 119 | 225 | 226 | 254 | -------------------------------------------------------------------------------- /components/AccountList.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 95 | -------------------------------------------------------------------------------- /components/AccountLoginModal.client.vue: -------------------------------------------------------------------------------- 1 | 64 | 65 | 112 | -------------------------------------------------------------------------------- /components/CodeOrGestureSignModal.client.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 60 | 61 | 81 | -------------------------------------------------------------------------------- /components/CourseList.vue: -------------------------------------------------------------------------------- 1 | 52 | 53 | 155 | 156 | 161 | -------------------------------------------------------------------------------- /components/Hero.vue: -------------------------------------------------------------------------------- 1 | 18 | -------------------------------------------------------------------------------- /components/Log.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 44 | -------------------------------------------------------------------------------- /components/Operation.vue: -------------------------------------------------------------------------------- 1 | 131 | 132 | 156 | 157 | 162 | -------------------------------------------------------------------------------- /components/QrCodeSignModal.client.vue: -------------------------------------------------------------------------------- 1 | 130 | 131 | 177 | -------------------------------------------------------------------------------- /components/SettingModal.client.vue: -------------------------------------------------------------------------------- 1 | 46 | 47 | 168 | 169 | 179 | -------------------------------------------------------------------------------- /components/SignHistory.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 |