From 7a940a118effb2bc6bc9ecfd177e50eeab22a7a9 Mon Sep 17 00:00:00 2001 From: Elucidator-xrb Date: Sun, 16 Oct 2022 11:01:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?update=20=E4=BB=BB=E5=8A=A1=E4=B8=80?= =?UTF-8?q?=E6=8A=A5=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...41\344\270\200\346\212\245\345\221\212.md" | 177 ++++++++++++++++-- 1 file changed, 163 insertions(+), 14 deletions(-) diff --git "a/document/\344\273\273\345\212\241\344\270\200\346\212\245\345\221\212.md" "b/document/\344\273\273\345\212\241\344\270\200\346\212\245\345\221\212.md" index d485201..914f81e 100644 --- "a/document/\344\273\273\345\212\241\344\270\200\346\212\245\345\221\212.md" +++ "b/document/\344\273\273\345\212\241\344\270\200\346\212\245\345\221\212.md" @@ -1,18 +1,47 @@ # 任务一实验报告 +- [任务一实验报告](#任务一实验报告) + - [一、开发环境与技术说明](#一开发环境与技术说明) + - [Web服务器](#web服务器) + - [开发语言](#开发语言) + - [数据库](#数据库) + - [软件依赖](#软件依赖) + - [后端](#后端) + - [前端](#前端) + - [二、数据库表定义](#二数据库表定义) + - [用户信息表(user_account)](#用户信息表user_account) + - [待审批用户表](#待审批用户表) + - [三、数据库使用方法](#三数据库使用方法) + - [1.连接数据库](#1连接数据库) + - [2.增](#2增) + - [3.删](#3删) + - [4.改](#4改) + - [5.查](#5查) + - [四、功能截图](#四功能截图) + - [1.登录界面](#1登录界面) + - [2.注册界面](#2注册界面) + - [3.管理界面](#3管理界面) + ## 一、开发环境与技术说明 +### Web服务器 + +并未部署网站于服务器上,且数据库在个人主机上,所以源代码应该无法运行。 + +- 若想查看网站效果,需要在个人主机上启动前后端服务器,所以不妨联系`20373585 夏瑞斌`启动服务器,然后便可通过ip地址`http://10.128.55.86:5173/`访问(应该得在局域网内,不懂计网) +- 若想本地运行源代码,需安装下文依赖,将在本地数据库建立相应两张表,并将django连接的数据库改为本地数据库 + ### 开发语言 前端:Vue3 后端:Django -### DBMS +### 数据库 MySQL 8.0 -### 具体依赖 +### 软件依赖 #### 后端 @@ -23,12 +52,10 @@ MySQL 8.0 #### 前端 -- node.js v16.17.0 (官网下载的包再添加环境变量;`node -v`查看) -- npm 8.15.0 (node.js的包管理软件,应该自带;`npm -v`查看) -- cnpm (按菜鸟教程所说搞了个cnpm,[使用淘宝 NPM 镜像](https://www.runoob.com/nodejs/nodejs-npm.html#taobaonpm)) -- vue 3.2.39 (应该是使用`cnpm install vue@next`装的vue3;`npm list vue`查看) -- vite 3.1.3(新型前端构建工具,pycharm终端输入`npm init vite@latest frontend -- --template vue`,按提示安装`create-vite@latest`,再按提示完成`cd frontend`、`npm install`即安装完毕,`vite -v`查看) - +- node.js v16.17.0 +- npm 8.15.0 +- vue 3.2.39 +- vite 3.1.3 - element-plus(`npm install element-plus --save`) - icon(`npm install @element-plus/icons-vue`) - router(`npm install vue-router@4`) @@ -36,30 +63,152 @@ MySQL 8.0 - axios(`npm install axios@0.26.1`) - universal-cookie(`npm i universal-cookie`) - integrations(`npm i @vueuse/integrations`) +- vuex(`npm install vuex@next --save`)、 +- windicss(`npm i -D vite-plugin-windicss windicss`) ## 二、数据库表定义 +用户填写注册信息后,将数据填入“待审批用户表”中;以管理员身份登录系统后进行审批并赋予权限,审批通过则加入“用户信息表”中。 + +#### 用户信息表(user_account) + +| 数据项名字 | 数据类型 | 约束 | 备注 | +| ---------- | ---------------- | ----------- | ------------------------- | +| CodeName | char(30) | primary key | 代号;相当于用户名 | +| Password | char(20) | not null | | +| Permission | tinyint unsigned | not null | 值越小,权限越高;最小为0 | +| Class | char(20) | | 职业分类 | +| Region | char(30) | | 地区 | +| Race | char(20) | | 种族 | +| Mail | char(20) | | 邮件地址 | +#### 待审批用户表 + +| 数据项名字 | 数据类型 | 约束 | 备注 | +| ----------- | ---------------- | ----------- | ------------------ | +| CodeName | char(30) | primary key | 代号;相当于用户名 | +| Password | char(20) | not null | | +| Permission | tinyint unsigned | | 待管理员分配 | +| Class | char(20) | | 职业分类 | +| Region | char(30) | | 地区 | +| Race | char(20) | | 种族 | +| Description | text | | 备注 | ## 三、数据库使用方法 -### 连接数据库 +### 1.连接数据库 `/backend/__init__.py`:添加`pymysql`模块 +```python +import pymysql + +pymysql.install_as_MySQLdb() +``` + `/db_project/settings`:调整`DATABASES`字典`default`内容,连接到本地MySQL +```python +from . import privacy as pv +# 本地写了个privacy.py存出相关数据库用户信息,不传到库中 +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.mysql', + 'NAME': 'arknights', + 'HOST': pv.db_host, + 'PORT': 3306, + 'USER': pv.db_user, + 'PASSWORD': pv.db_password[pv.db_user], + } +} +``` + 具体调用(如`/backend/views.py`):`django.db`模块的`connection`对象 -### 增 +```python +from django.db import connection + +# ... +with connection.cursor() as cursor: + sql = 'xxx" + try: + cursor.execute(sql) + one = cursor.fetchone() + pass + except: + pass +return result +``` + +### 2.增 + +- 用户填完注册信息后,将相关信息写入“待审批用户表” +- 将“待审批用户表”中通过审核并赋予权限的信息写入“用户信息表” + +```python +def add_into_queue(CodeName, Password, Class, Region, Race, Description): + try: + with connection.cursor() as cursor: + sql = "select * from user_account where CodeName = '{}'".format(CodeName) + cursor.execute(sql) + if cursor.fetchone() is not None: + return fail('该用户已存在') + sql = "select * from account_approve_queue where CodeName = '{}'".format(CodeName) + cursor.execute(sql) + if cursor.fetchone() is not None: + return fail('该用户已在申请队列中') + sql = "insert into account_approve_queue values('{}','{}',{},'{}','{}','{}','{}')" \ + .format(CodeName, Password, 2, Class, Region, Race, Description) + print(sql) + cursor.execute(sql) + return success('注册成功,请等待审核') + except: + return fail('注册失败QWQ') +``` + +### 3.删 + +- 审核不通过的注册申请信息从“待审批用户表”中 + +```python +def reject(name): + try: + with connection.cursor() as cursor: + sql = "delete from account_approve_queue where CodeName = '{}' ".format(name) + cursor.execute(sql) + return success('拒绝该用户的注册申请') + except: + return JsonResponse({'request': FAIL_DATA}) +``` + +### 4.改 + +- 管理员审核“待审批用户表”时,可以对注册信息进行修改 + +```python +def modify_application(CodeName, Permission, Class, Region, Race, Description): + try: + sql = "update account_approve_queue Set Permission = {},Class = '{}',Region = '{}',Race = '{}',Description = " \ + "'{}' where CodeName = '{}'".format(Permission, Class, Region, Race, Description, CodeName) + print(sql) + with connection.cursor() as cursor: + cursor.execute(sql) + return success('申请用户信息修改成功~') + except: + return fail('修改失败了') +``` + +### 5.查 + +- 每次前后端的信息交互都会涉及查表,它无处不在 -### 删 +## 四、功能截图 -### 改 +### 1.登录界面 -### 查 +### 2.注册界面 +### 3.管理界面 -## 四、功能截图 From 37b7b661e809ac37e953e257744727e1e6eb2c21 Mon Sep 17 00:00:00 2001 From: Elucidator-xrb Date: Sun, 16 Oct 2022 11:48:15 +0800 Subject: [PATCH 2/3] remove Avatar, fine tuning for code style --- backend/tools.py | 80 +++++++++++++++++++++++------------------------- backend/views.py | 3 +- 2 files changed, 40 insertions(+), 43 deletions(-) diff --git a/backend/tools.py b/backend/tools.py index 865f96d..2a717f7 100644 --- a/backend/tools.py +++ b/backend/tools.py @@ -6,7 +6,7 @@ JWT_SECRET_KEY = "123" FAIL_DATA = {'flag': 'no', 'msg': 'fail'} NOT_ALLOWED_DATA = {'flag': 'no', 'msg': 'not allowed'} -user_account = ['CodeName', 'Password', 'Permission', 'Class', 'Region', 'Race', 'Avatar', 'Mail'] +user_account = ['CodeName', 'Password', 'Permission', 'Class', 'Region', 'Race', 'Mail'] account_approve_queue = ['CodeName', 'Password', 'Permission', 'Class', 'Region', 'Race', 'Description'] @@ -40,15 +40,16 @@ def get_jwt(username, role_data='default'): def judge(token, std): test = str.encode(token)[2:-1] + result = jwt.decode(test, JWT_SECRET_KEY, algorithms='HS256', options={"verify_signature": False}) + name = result.get('data').get('username') + print(name) + + sql = 'select * from user_account where CodeName = \'' + name + "\'" try: - result = jwt.decode(test, JWT_SECRET_KEY, algorithms='HS256', options={"verify_signature": False}) - name = result.get('data').get('username') - print(name) with connection.cursor() as cursor: - sql = 'select * from user_account where CodeName = \'' + name + "\'" cursor.execute(sql) one = cursor.fetchone() - return one[2] <= std + return one[2] <= std except: return False @@ -61,9 +62,9 @@ def token2name(token): # 注册对应函数 def check_user(CodeName, password): - with connection.cursor() as cursor: - sql = "select * from user_account where CodeName = '{}'".format(CodeName) - try: + sql = "select * from user_account where CodeName = '{}'".format(CodeName) + try: + with connection.cursor() as cursor: cursor.execute(sql) one = cursor.fetchone() if one is None: @@ -74,25 +75,26 @@ def check_user(CodeName, password): return success('登录成功', result) else: return fail('密码错误') - except: - return fail('未知错误') + except: + return fail('未知错误') def add_into_queue(CodeName, Class, Region, Race, Description, Password): + sql_check_user = "select * from user_account where CodeName = '{}'".format(CodeName) + sql_check_application = "select * from account_approve_queue where CodeName = '{}'".format(CodeName) + sql_insert = "insert into account_approve_queue values('{}','{}',{},'{}','{}','{}','{}')" \ + .format(CodeName, Password, 2, Class, Region, Race, Description) try: with connection.cursor() as cursor: - sql = "select * from user_account where CodeName = '{}'".format(CodeName) - cursor.execute(sql) + cursor.execute(sql_check_user) if cursor.fetchone() is not None: return fail('该用户已存在') - sql = "select * from account_approve_queue where CodeName = '{}'".format(CodeName) - cursor.execute(sql) + + cursor.execute(sql_check_application) if cursor.fetchone() is not None: return fail('该用户已在申请队列中') - sql = "insert into account_approve_queue values('{}','{}',{},'{}','{}','{}','{}')" \ - .format(CodeName, Password, 2, Class, Region, Race, Description) - print(sql) - cursor.execute(sql) + + cursor.execute(sql_insert) return success('注册成功,请等待审核') except: return fail('注册失败QWQ') @@ -113,8 +115,8 @@ def all_users(): def modify_user(CodeName, permission): + sql = "update user_account Set Permission = {} where CodeName = '{}'".format(permission, CodeName) try: - sql = "update user_account Set Permission = {} where CodeName = '{}'".format(permission, CodeName) with connection.cursor() as cursor: cursor.execute(sql) return success('成功修改') @@ -123,8 +125,8 @@ def modify_user(CodeName, permission): def delete_user(CodeName): + sql = "delete from user_account where CodeName = '{}'".format(CodeName) try: - sql = "delete from user_account where CodeName = '{}'".format(CodeName) with connection.cursor() as cursor: cursor.execute(sql) return success('成功删除') @@ -133,51 +135,48 @@ def delete_user(CodeName): def one_user(token): + name = token2name(token) + print("one_user", name) + sql = 'select * from user_account where CodeName = \'' + name + "\'" try: - name = token2name(token) - print("one_user", name) with connection.cursor() as cursor: - sql = 'select * from user_account where CodeName = \'' + name + "\'" cursor.execute(sql) one = cursor.fetchone() - data = {} for i in enumerate(user_account): data[i[1]] = one[i[0]] - return success('获取用户信息成功', data) - + return success('获取用户信息成功', data) except: return fail('获取用户信息失败') # 请求表对应函数 def reject(name): + sql = "delete from account_approve_queue where CodeName = '{}' ".format(name) try: with connection.cursor() as cursor: - sql = "delete from account_approve_queue where CodeName = '{}' ".format(name) cursor.execute(sql) - return success('拒绝该用户的注册申请') + return success('拒绝该用户的注册申请') except: return JsonResponse({'request': FAIL_DATA}) -def consent(CodeName, Permission): +def consent(CodeName): print(CodeName) try: with connection.cursor() as cursor: sql1 = "select * from account_approve_queue where CodeName = '{}' ".format(CodeName) - print(sql1) cursor.execute(sql1) + one = cursor.fetchone() - CodeName = one[0] - sql2 = "insert into user_account values('{}','{}',{},'{}','{}','{}','{}','{}')" \ - .format(one[0], one[1], one[2], one[3], one[4], one[5], "", "") - print(sql2) + sql2 = "insert into user_account values('{}','{}',{},'{}','{}','{}','{}')" \ + .format(one[0], one[1], one[2], one[3], one[4], one[5], "") cursor.execute(sql2) + + CodeName = one[0] sql3 = "delete from account_approve_queue where CodeName = '{}' ".format(CodeName) - print(sql3) cursor.execute(sql3) - return success('同意该用户的申请') + return success('同意该用户的申请') except: return JsonResponse({'request': FAIL_DATA}) @@ -193,14 +192,13 @@ def all_applications(): if i != 'Password': data[i[1]] = item[i[0]] dict_list.append(data) - return dict_list + return dict_list def modify_application(CodeName, Permission, Class, Region, Race, Description): - try: - sql = "update account_approve_queue Set Permission = {},Class = '{}',Region = '{}',Race = '{}',Description = " \ + sql = "update account_approve_queue Set Permission = {},Class = '{}',Region = '{}',Race = '{}',Description = " \ "'{}' where CodeName = '{}'".format(Permission, Class, Region, Race, Description, CodeName) - print(sql) + try: with connection.cursor() as cursor: cursor.execute(sql) return success('申请用户信息修改成功~') diff --git a/backend/views.py b/backend/views.py index 637cadb..5b9a963 100644 --- a/backend/views.py +++ b/backend/views.py @@ -74,11 +74,10 @@ def application_reject(request): def application_consent(request): token = request.POST.get("token") name = request.POST.get("CodeName") - Permission = request.POST.get("Permission") allowance = judge(token, 1) print("application_consent", name) if allowance: - return consent(name, Permission) + return consent(name) else: return fail('无访问权限') From 02b4e85bdfe9eafc2341e3e3111af597367bd800 Mon Sep 17 00:00:00 2001 From: Elucidator-xrb Date: Sun, 16 Oct 2022 12:46:30 +0800 Subject: [PATCH 3/3] refract and complete , update .gitignore --- .gitignore | 2 ++ document/info/Race.xlsx | Bin 11376 -> 11614 bytes document/info/Region.xlsx | Bin 11655 -> 11798 bytes frontend/src/views/register.vue | 53 ++++++++++++++++++++++++++++---- 4 files changed, 49 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 896dfa9..d4c8b09 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,5 @@ pnpm-debug.log* package.json package-lock.json + +~$* diff --git a/document/info/Race.xlsx b/document/info/Race.xlsx index e82731c570bba63dcef9fdfbb626f5c9e1ef93d8..d03014f5ef6e7588c7dca4d07fc818d7fd88c1ed 100644 GIT binary patch delta 5137 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 diff --git a/document/info/Region.xlsx b/document/info/Region.xlsx index 06d4678710c36450903c1e482a5090039108bc95..302a1f624d2849d31d83284faa3cbc6f5943b0f8 100644 GIT binary patch delta 4492 zcmY+Ic{CK>`^RT7W6d^W8CzuRV+m!+nnK9FCXBI^7DL$w6Jv?&V@tA@T_{O3QDol< zSt`le*fPz8jITbw@9*3d*hw6uh!2%Aw+A;?+xM?s0jX% z5@%##LzK3Nnn;TFrm#@Y6ewqRO0RJ&rsEQL@|qT z^vc{PenEQYzp^(X*?XSnb7cwOvj)z?A$M`7!F&*@PZ$>Zka$T?MrJ?(iZ2%4=2NrW zOV=7exFzh#xo7O!Y;%ku8&Z-Wqu2S>wy@&hPOp(ZY}pgw*3@XQ@jLm@m>9ho=g28e z|2d~^M`*~7*2ZPrB7ItIKJt}EOX=o_kYTe&Q0cS95b8wmA3CeL_#s}D_lfnI&Xj=W z1qCE^fI=W&VQnHLN*D@6=&RCK5ioBvyJRliyLrgEv{M4htt6F0`vIU zncwZ)S@?Bo8DrY?(j27WquD^G~7K&CAL!*MfNmk-5GrK zP1(5fwFjC#MLT+1V%O_nSEU*bQIbwt#JJ7%SW*1ksNAY~greO%fyzJ9@l2aM6EW2& zB|IE}i|8i57VZ{mO;_1zAzoMh84ww8$U!&asY%rvp*yPfXBr1eU3wGsW%PtgvL21I zdq(UlYuGI(=M4u!8-Q30hQHWhRspe0_TA8&W&{B8m52&#V)(>aCC<1l)(FPp1IKKl zON*pAS}kU|#Byfyv)oU0-qCkinXso@pVP;MMAgK)vb!|HkCG^<<+##b-f+ty`^;+^ z66mMZSuS>z!>RD?*bL6t+Snjo*|2+h<;3B_u5&9>#gO|9%x7&IlN;m^tj{6h=a)6> z)yLJb7dqYAF!@llKF?$w0wWPL3-V26P*%Sf%pP zXVyG-LJK-$o}?)1uJ_k z_l91)yjMi7e%f^#+hLaPbT9yLbOiWoYVzDuX4TnZ>$rad9yvA@G`!o} z&#AF{6TH>0X!OE7%r82Xwoy3zC9aJJUwzcSzeHW@AKv|ONZo&V^lH$pOlFef#0$s8 zfaVh%JE4~Rx>bB_eB~Xf#7`oVy5{k}YbPmb5Mbg7df(Cr&cjmgtUu}#CP)s5{K$rPV|22##q>YZ0O7fb+c z{G9%-5v5%KgW~43zAdK@iSOVm<%$iD84@z1H6mye3dw6_;V8KGwRe%J|MUMaNZj_b zx?|#22I+H-C$&`{_&naoLT{VwALC_V8MU~!Y^Rx;Mqa4rOp_Wfne!~iW)`_{lspH4 zy4Hm_Uv4p*#X{xv%V8qj=pV#fDN@~4U!tzzrnLSrIyne`5i?TH#C9&0Imr~=(%#89 ziiTz8O1abzxWNsX!?^vQI3>6{nN9OVrv$mWfX11J$Lmr1D+wy|TKyRMjMbf-l#W3Y zwkz%Jt2~3WM1hUF(dJTG76kE&n1X>!W&9z(#8=ce+jM>*xv0?>J!(k;C*1!M!`WWx zil=6;;hhHDF2>D5r!ShEy~+@GIVUCp8E&7yCIGF5@ssOZ(ED22XNT_)V48ZKiP*BM zuy~tgMafcze8YhI+yvg!O8Y+FTa8X=DjXMBP#$X@k(FDCA3-hGNlVZutAaJ1^?Moh zwLK= zxOq#^o|gaVd5cAJFQ3lM{&m-n#iJ{&U+6g1AgM%$9qx{Gop*;Un$w8KLnEuZ+SLm> zcODejVMboCux;(_(w5Apj(ObW4m?S66Jw8YoR`th!Iz<+CK&CLC+W3bo1$?1r9hxA={C|GRmcVA6P? zY2X?uJWKK#P35LUvtk`;+dE%Xf0o&R7;7IeCygTnBFR+VxM5+(*FYHNCiD9lKGDfN zZvJu=9r`Z{Zo%zEC3g%fGkX<{uSmUFqUq5p}jSG|n}`

1eQPQC zS^ifT87_+0W#SN2VrSY-B4#k15=E5~j_y$e4O?sIvACSyX&WS@&T7%xT6g%oTQK(L zzG6$6R!P~1=FxJh>xLE2jVGaTh)+7d=p(gqZdHk1FmVG_-w~a_%q#1^Cdvzu^7wvx zy{Y>BiTv9uZ6?T?fRy#lmcHEyK(B%CdS_gl_gVL)%O=Y9Db~(Y+*4s;Iu@%jh^mZb zNXMp4UBqOyEQD}qTXdKsMbdVwsC@Fl`qH_N+HM;fg%g0W+_%|pf?SUtv>Iru7H_Bd9_S65A!hJKBHckp_LBY2{-Ephx@)%o=j*Z2ybk~=NjB#94C;Ebyg zL$@fajM3KP+J$R61|Jn4C&KISPaQLdc%M601(z4>vsOzx64!uyT!xRwf342XqD*Uq z`VwBO&dyppBpu8uYd4izGy6w(b9Xf%ZbwE@>6BBqPOB~ zv=BHlM;c0nfXoxWJRN8A8b6(8e9b`<4d9&3_-4$KX)Hre!`LLM0n5;MGx&nY&?5AA zwz;tWTUs@3b~l7>%=jnjU32rFhp@JmQ6DY+?bLN>D$pHx@5Ew^bdweQ1s328&?u9b z|31^Idy)&L>!Y3IE7Jb%c?SHvCKl|sU3$0|;rD&2&x)jv@%B$mAM#HFl=Fg7oou4b zHa!yrE428x7&uSJTR5Im6%IDB34XmMoYm5AGujSqPPc>ZN+!LpsAwIF0sXqD5%*nf z4Cx@67k7VisP=teFuNBf?IF^oKJ9!@5+UtPdq!KS{+wDZ=+w0zcDNet&%7J{PhXDR zXw0i!q&og+)Q)#*76gS05#?T~^L($mGwEZC>9WAHTP}A9y&J>Nu#!l(AHQN>;On^W zzebMj%*z6qFc-v@Wx>y^yF zbA*JZG*%c+*BjzdHEY5{9ZZDN$*Wz`X_fyg*eXM7Kxm9K0x<&D9#CNFwP8qbnXGxgCT6$FYh$+Ct5v%)o2%O!t z7e8>g;>f-IIxURjpLQQA4gxZFiHS6a9JiF)L@uNP{*Fh_wF-2Pr?k5znhEXa?gt*z zXRBmOV3W~%&V;(ckU0#l0_-5}-O&4^ES;Jjo4&+OU^3l4G7K_=n#VcKNeaoZC9#p& zG?UEq1TH8msVnCKF5Lj8C5Qq_5a~)Sdz_)(X&F{Z0-#c{W5ag5@o_T?23VSc8Q=gY z@fnyAqPF06Xv4ZL9>9>t>jMLAf9{81tfTes4 zEV)dN5W2(R8U?Q3X+!x z_B2k=#lGk^wCgU?E4PBXv8f5eFW3+l{it0d6PEK-p*hfq^d8T{XAurjM|wuH)?dBT z?+>O_7u=^B%Y=FUs@dfgg~SQ5SWcn^EdMONEMnbViM2>1b!_m4t zNe$0_6s64YE9idU*!?lvR8?5%?EtbAFnt#T^)-FG>Dm^AEo`Nw@^h38Lht&L=j3q@ zquxxjCwG^KH(h{eqKtl~05CHH10RUY84~UQ;ippz)Sfq(=@~5CPvVWcb0VExF AjQ{`u delta 4347 zcmY*dbyO5g_ugQMrNmtcS-N}amhM(zQAt4*qy+&%mJ;b&L_k2g6r{V$6_Ev$?rxB7 z_rv%1o$o!r`Qy%<`^-G|+&j-X6G>)oAC*lILbSZCl{PT5gpBA38v=7D1+a=kAJ0j?NonSsXzc^#pHfW61*p=9A zLVM$fBrHBms?V9~da_%VZrvlc8*BVsKw3Mo?FV;+L7X0h@mjd4>=!Fc7`SE7xpK+wt{8m5+GlEv@ zX2P4)o9PeG^eGzL6i;{jpe#`R{WIEy^lnuQ#KlHd|WO&2^84k~B*GVLB|-OWyRZ z!iD-cFSuvyZ5^3C4jDN>l2d0V7W!SHlZ0*cR$eh0RNecqY3QX9b-8hZ(qh)Q zivHavX1B_H1Xz4T-X#eSE5|7~r`+-=Xyr41Fu(|Y)#f$e=G(Fz^U!H>_gJoRvsUh6 zBDUG6Q8YrMv!*C^9Y2p>3mT>({y-UNokCT#%dR!@Te>0ZJIfm5zA1#jPbrrCd4bO- zJPjrb46i&S5d}d{i0D*khyZ{vevB{~3)*=Bc_VZewIOTTLi9CGZ8FU8h`CC$xv;@$ zH(Hd1`c7_*bkRnm7lOL5i`*em3NvjfCb#LM5y+%Ldt6P+(lWnU zAu)v8k)x{8aEO86m1zCB_>5F58Mz|6W?5FQUX)Y2X&gB%)p;o-QndO&UG?&i6ixk* zGJ7K-$}X6nUYIR0&sTX~$hxk<$mRi$3x5nSC?OiX(5z-*k+&4fv

RP)&pKO@EIa(gnUp;^MBSbEt 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 - - - + - - - + @@ -73,6 +69,7 @@ import {useRouter} from "vue-router"; import {register} from "../api/manager"; import {NOTATION} from "../composable/utils"; import {reactive} from "@vue/reactivity"; +import { ref } from "vue"; const router = useRouter() @@ -117,6 +114,50 @@ const onSubmit = () => { } } +const region_options = ref([ + { zhcn: '炎', eng: 'Yan'}, + { zhcn: '哥伦比亚', eng: 'Columbia'}, + { zhcn: '卡西米尔', eng: 'Kazimierz'}, + { zhcn: '谢拉格', eng: 'Kjerag'}, + { zhcn: '拉特兰', eng: 'Laterano'}, + { zhcn: '莱塔尼亚', eng: 'Leithanien'}, + { zhcn: '雷姆必拓', eng: 'Rim Billiton'}, + { zhcn: '萨米', eng: 'Sami'}, + { zhcn: '米诺斯', eng: 'Minos'}, + { zhcn: '玻利瓦尔', eng: 'Bolívar'}, + { zhcn: '萨尔贡', eng: 'Sargon'}, + { zhcn: '叙拉古', eng: 'Siracusa'}, + { zhcn: '维多利亚', eng: 'Victoria'}, + { zhcn: '卡兹戴尔', eng: 'Kazdel'}, + { zhcn: '伊比利亚', eng: 'Iberia'}, + { zhcn: '阿戈尔', eng: 'Ægir'} +]) + +const race_options = ref([ + { zhcn: '龙', eng: 'Lung'}, + { zhcn: '黎博利', eng: 'Liberi'}, + { zhcn: '鲁珀', eng: 'Lupo'}, + { zhcn: '鬼', eng: 'Oni'}, + { zhcn: '阿达克利斯', eng: 'Archosauria'}, + { zhcn: '萨科塔', eng: 'Sankta'}, + { zhcn: '萨卡兹', eng: 'Sarkaz'}, + { zhcn: '菲林', eng: 'Feline'}, + { zhcn: '瓦伊凡', eng: 'Vouivre'}, + { zhcn: '德拉克', eng: 'Draco'}, + { zhcn: '沃尔珀', eng: 'Vulpo'}, + { zhcn: '杜林', eng: 'Durin'}, + { zhcn: '札拉克', eng: 'Zalak'}, + { zhcn: '库兰塔', eng: 'Kuranta'}, + { zhcn: '卡特斯', eng: 'Cautus'}, + { zhcn: '卡普里尼', eng: 'Caprinae'}, + { zhcn: '佩洛', eng: 'Perro'}, + { zhcn: '丰蹄', eng: 'Forte'}, + { zhcn: '乌萨斯', eng: 'Ursus'}, + { zhcn: '阿斯兰', eng: 'Aslan'}, + { zhcn: '麒麟', eng: 'Kylin'}, + { zhcn: '阿戈尔', eng: 'Ægir'} +]) +