| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852 |
- <template>
- <view class="set-user-info-container">
- <!-- 标题 -->
- <view class="page-title">完善个人信息</view>
- <scroll-view class="form-scroll" scroll-y>
- <!-- 头像上传 -->
- <view class="avatar-section">
- <view class="avatar-wrapper" @click="chooseAvatar">
- <image v-if="formData.avatar" :src="formData.avatar" class="avatar-image" mode="aspectFill" />
- <view v-else class="avatar-placeholder">
- <image src="/static/images/login/user.png" class="avatar-image" mode="aspectFill" style="width: 80%; height: 80%;" />
- </view>
- </view>
- <view class="avatar-tip">
- <text class="tip-text">点击上传头像</text>
- <text class="required-mark">*</text>
- </view>
- <view v-if="errors.avatar" class="error-tip">{{ errors.avatar }}</view>
- </view>
- <!-- 表单字段 -->
- <view class="form-section">
- <!-- 真实姓名 -->
- <view class="form-item">
- <view class="form-label">
- <text>真实姓名</text>
- <text class="required-mark">*</text>
- </view>
- <input v-model="formData.realName" class="form-input" placeholder="请输入真实姓名"
- @blur="validateField('realName')" />
- <view v-if="errors.realName" class="error-tip">{{ errors.realName }}</view>
- </view>
- <!-- 从业时间 -->
- <view class="form-item">
- <view class="form-label">
- <text>从业时间</text>
- <text class="required-mark">*</text>
- </view>
- <picker mode="date" :value="formData.practiceYear" :start="startDate" :end="endDate"
- @change="onPracticeYearChange">
- <view class="picker-view">
- <text :class="formData.practiceYear ? 'picker-text' : 'picker-placeholder'">
- {{ formData.practiceYear ? formatDate(formData.practiceYear) : '请选择从业时间' }}
- </text>
- <text class="picker-arrow">›</text>
- </view>
- </picker>
- <view v-if="errors.practiceYear" class="error-tip">{{ errors.practiceYear }}</view>
- </view>
- <!-- 专业领域 -->
- <view class="form-item">
- <view class="form-label">
- <text>专业领域</text>
- <text class="required-mark">*</text>
- </view>
- <picker mode="selector" :range="professionalFields" :value="professionalFieldIndex"
- @change="onProfessionalFieldChange">
- <view class="picker-view">
- <text :class="formData.professionalField ? 'picker-text' : 'picker-placeholder'">
- {{ formData.professionalField || '请选择专业领域' }}
- </text>
- <text class="picker-arrow">›</text>
- </view>
- </picker>
- <view v-if="errors.professionalField" class="error-tip">{{ errors.professionalField }}</view>
- </view>
- <!-- 法律场景 -->
- <view class="form-item">
- <view class="form-label">
- <text>法律场景</text>
- <text class="required-mark">*</text>
- </view>
- <view class="picker-view" @click="showLegalScenarioModal = true">
- <view class="picker-text-ellipsis">
- <text :class="formData.legalScenarios && formData.legalScenarios.length > 0 ? 'picker-text' : 'picker-placeholder'">
- {{ getLegalScenarioText() || '请选择法律场景' }}
- </text>
- </view>
- <text class="picker-arrow">›</text>
- </view>
- <view v-if="errors.legalScenario" class="error-tip">{{ errors.legalScenario }}</view>
- </view>
- <!-- 联系地址 -->
- <view class="form-item">
- <view class="form-label">
- <text>联系地址</text>
- <text class="required-mark">*</text>
- </view>
- <input v-model="formData.address" class="form-input" placeholder="请输入常用联系地址"
- @blur="validateField('address')" />
- <view v-if="errors.address" class="error-tip">{{ errors.address }}</view>
- </view>
- <!-- 律师事务所名称 -->
- <view class="form-item">
- <view class="form-label">
- <text>律师事务所名称</text>
- <text class="required-mark">*</text>
- </view>
- <picker
- mode="selector"
- :range="firmList"
- range-key="firmName"
- :value="lawFirmIndex"
- @change="onLawFirmChange"
- >
- <view class="picker-view">
- <text :class="formData.lawFirmName ? 'picker-text' : 'picker-placeholder'">
- {{ formData.lawFirmName || '请选择律师事务所名称' }}
- </text>
- <text class="picker-arrow">›</text>
- </view>
- </picker>
- <view v-if="errors.lawFirmName" class="error-tip">{{ errors.lawFirmName }}</view>
- </view>
- <!-- 律师事务所收款账号 -->
- <view class="form-item">
- <view class="form-label">
- <text>律师事务所收款账号</text>
- <text class="required-mark">*</text>
- </view>
- <picker
- mode="selector"
- :range="paymentAccountList"
- :value="paymentAccountIndex"
- @change="onPaymentAccountChange"
- >
- <view class="picker-view">
- <text :class="formData.paymentAccount ? 'picker-text' : 'picker-placeholder'">
- {{ formData.paymentAccount || '请选择律师事务所收款账号' }}
- </text>
- <text class="picker-arrow">›</text>
- </view>
- </picker>
- <view v-if="errors.paymentAccount" class="error-tip">{{ errors.paymentAccount }}</view>
- </view>
-
- <!-- 律师资格证 -->
- <view class="form-item">
- <view class="form-label">
- <text>律师资格证</text>
- <text class="required-mark">*</text>
- </view>
- <view class="certificate-upload" @click="chooseCertificate">
- <image v-if="formData.certificate" :src="formData.certificate" class="certificate-image"
- mode="aspectFit" />
- <view v-else class="certificate-placeholder">
- <text class="certificate-icon">🏔️</text>
- <text class="certificate-text">点击上传图片</text>
- </view>
- </view>
- <view v-if="errors.certificate" class="error-tip">{{ errors.certificate }}</view>
- </view>
- </view>
- </scroll-view>
- <!-- 提交按钮 -->
- <view class="submit-section">
- <button class="submit-btn" @click="handleSubmit">提交信息</button>
- </view>
-
- <!-- 法律场景多选弹窗 -->
- <view class="modal-overlay" v-if="showLegalScenarioModal" @click="showLegalScenarioModal = false">
- <view class="legal-scenario-modal" @click.stop>
- <view class="modal-header">
- <view class="modal-title">选择您擅长的法律场景</view>
- <text class="cancel-btn" @click="showLegalScenarioModal = false">取消</text>
- </view>
- <view class="scenario-tags">
- <view
- v-for="(scenario, index) in legalScenarios"
- :key="index"
- class="scenario-tag"
- :class="{ 'selected': isLegalScenarioSelected(scenario) }"
- @click="toggleLegalScenario(scenario)"
- >
- {{ scenario }}
- </view>
- </view>
- <button class="confirm-btn" @click="confirmLegalScenarios">选好了</button>
- </view>
- </view>
- </view>
- </template>
- <script>
- import upload from '@/utils/upload'
- import { updateUserProfile, uploadAvatar } from '@/api/system/user'
- import { getFirmList, getLegalProblemScenarioList, getExpertiseAreaList } from '@/api/setUserInfo'
- import { getToken } from '@/utils/auth'
- import config from '@/config'
- export default {
- data() {
- return {
- formData: {
- avatar: '',
- realName: '',
- practiceYear: '',
- professionalField: '',
- legalScenarios: [], // 改为数组支持多选
- address: '',
- paymentAccount: '',
- lawFirmName: '',
- certificate: ''
- },
- errors: {},
- startDate: '1950-01-01', // 最早可选日期
- endDate: '', // 最晚可选日期(今天)
- professionalFields: ['刑事法律', '民事法律', '商事法律', '行政法律', '知识产权', '劳动法律', '其他'],
- professionalFieldIndex: -1,
- legalScenarios: ['家庭生活', '职场工作', '邻里与社区', '网络与数字', '交通出行', '居住与物业', '消费与服务'],
- showLegalScenarioModal: false,
- firmList: [], // 律师事务所列表
- lawFirmIndex: -1,
- paymentAccountList: [], // 收款账号列表
- paymentAccountIndex: -1,
- baseUrl: config.baseUrl
- }
- },
- onLoad() {
- // 设置最晚可选日期为今天
- const today = new Date()
- const year = today.getFullYear()
- const month = String(today.getMonth() + 1).padStart(2, '0')
- const day = String(today.getDate()).padStart(2, '0')
- this.endDate = `${year}-${month}-${day}`
- // 加载律师事务所列表
- // this.getPageInfo()
- },
- methods: {
- getPageInfo() {
- getFirmList().then(res => {
- if (res.data && res.data.length > 0) {
- this.firmList = res.data
- // 提取收款账号列表(假设每个律师事务所都有收款账号字段)
- this.paymentAccountList = res.data.map(item => item.paymentAccount || item.account || '').filter(account => account)
- }
- }).catch(() => {
- // 如果接口失败,使用默认数据
- this.firmList = []
- this.paymentAccountList = []
- })
- },
-
- // 律师事务所选择
- onLawFirmChange(e) {
- this.lawFirmIndex = e.detail.value
- const selectedFirm = this.firmList[e.detail.value]
- if (selectedFirm) {
- this.formData.lawFirmName = selectedFirm.firmName || selectedFirm.name || ''
- // 如果选择的律师事务所有收款账号,自动填充
- if (selectedFirm.paymentAccount || selectedFirm.account) {
- this.formData.paymentAccount = selectedFirm.paymentAccount || selectedFirm.account
- // 找到对应的收款账号索引
- const accountIndex = this.paymentAccountList.indexOf(this.formData.paymentAccount)
- if (accountIndex > -1) {
- this.paymentAccountIndex = accountIndex
- }
- }
- this.errors.lawFirmName = ''
- }
- },
-
- // 收款账号选择
- onPaymentAccountChange(e) {
- this.paymentAccountIndex = e.detail.value
- this.formData.paymentAccount = this.paymentAccountList[e.detail.value] || ''
- this.errors.paymentAccount = ''
- },
- // 选择头像
- chooseAvatar() {
- uni.chooseImage({
- count: 1,
- sizeType: ['compressed'],
- sourceType: ['album', 'camera'],
- success: (res) => {
- const tempFilePath = res.tempFilePaths[0]
- this.uploadAvatarFile(tempFilePath)
- }
- })
- },
- // 上传头像
- uploadAvatarFile(filePath) {
- this.$modal.loading('上传中...')
- uni.uploadFile({
- url: 'http://192.168.2.54:8899/file/upload',
- filePath: filePath,
- name: 'avatarfile',
- header: {
- 'Authorization': 'Bearer ' + (getToken() || '')
- },
- success: (res) => {
- try {
- const result = JSON.parse(res.data)
- if (result.code === 200) {
- this.$modal.closeLoading()
- this.formData.avatar = this.baseUrl + result.imgUrl
- this.errors.avatar = ''
- } else {
- this.$modal.closeLoading()
- this.$modal.msgError(result.msg || '上传失败')
- }
- } catch (e) {
- this.$modal.closeLoading()
- this.$modal.msgError('上传失败')
- }
- },
- fail: (error) => {
- this.$modal.closeLoading()
- this.$modal.msgError('上传失败')
- }
- })
- },
- // 选择律师资格证
- chooseCertificate() {
- uni.chooseImage({
- count: 1,
- sizeType: ['compressed'],
- sourceType: ['album', 'camera'],
- success: (res) => {
- const tempFilePath = res.tempFilePaths[0]
- this.uploadCertificateFile(tempFilePath)
- }
- })
- },
- // 上传资格证
- uploadCertificateFile(filePath) {
- this.$modal.loading('上传中...')
- upload({
- url: '/system/user/profile/certificate',
- name: 'certificate',
- filePath: filePath
- }).then(res => {
- this.$modal.closeLoading()
- this.formData.certificate = this.baseUrl + res.imgUrl
- this.errors.certificate = ''
- }).catch(() => {
- this.$modal.closeLoading()
- })
- },
- // 从业时间选择
- onPracticeYearChange(e) {
- this.formData.practiceYear = e.detail.value
- this.errors.practiceYear = ''
- },
-
- // 格式化日期显示
- formatDate(dateStr) {
- if (!dateStr) return ''
- const date = new Date(dateStr)
- const year = date.getFullYear()
- const month = String(date.getMonth() + 1).padStart(2, '0')
- const day = String(date.getDate()).padStart(2, '0')
- return `${year}年${month}月${day}日`
- },
- // 专业领域选择
- onProfessionalFieldChange(e) {
- this.professionalFieldIndex = e.detail.value
- this.formData.professionalField = this.professionalFields[e.detail.value]
- this.errors.professionalField = ''
- },
- // 获取法律场景显示文本
- getLegalScenarioText() {
- if (!this.formData.legalScenarios || this.formData.legalScenarios.length === 0) {
- return ''
- }
- return this.formData.legalScenarios.join('、')
- },
-
- // 判断法律场景是否已选中
- isLegalScenarioSelected(scenario) {
- return this.formData.legalScenarios && this.formData.legalScenarios.includes(scenario)
- },
-
- // 切换法律场景选择状态
- toggleLegalScenario(scenario) {
- if (!this.formData.legalScenarios) {
- this.formData.legalScenarios = []
- }
- const index = this.formData.legalScenarios.indexOf(scenario)
- if (index > -1) {
- // 已选中,取消选择
- this.formData.legalScenarios.splice(index, 1)
- } else {
- // 未选中,添加选择
- this.formData.legalScenarios.push(scenario)
- }
- },
-
- // 确认法律场景选择
- confirmLegalScenarios() {
- if (this.formData.legalScenarios && this.formData.legalScenarios.length > 0) {
- this.errors.legalScenario = ''
- }
- this.showLegalScenarioModal = false
- },
- // 验证单个字段
- validateField(field) {
- this.errors[field] = ''
- const value = this.formData[field]
- if (!value || value.trim() === '') {
- switch (field) {
- case 'realName':
- this.errors.realName = '请填写真实姓名'
- break
- case 'address':
- this.errors.address = '请填写联系地址'
- break
- case 'paymentAccount':
- this.errors.paymentAccount = '请选择律师事务所收款账号'
- break
- case 'lawFirmName':
- this.errors.lawFirmName = '请选择律师事务所名称'
- break
- }
- }
- },
- // 验证所有字段
- validateForm() {
- this.errors = {}
- let isValid = true
- if (!this.formData.avatar) {
- this.errors.avatar = '请上传头像'
- isValid = false
- }
- if (!this.formData.realName || this.formData.realName.trim() === '') {
- this.errors.realName = '请填写真实姓名'
- isValid = false
- }
- if (!this.formData.practiceYear) {
- this.errors.practiceYear = '请选择从业时间'
- isValid = false
- }
- if (!this.formData.professionalField) {
- this.errors.professionalField = '请选择专业领域'
- isValid = false
- }
- if (!this.formData.legalScenarios || this.formData.legalScenarios.length === 0) {
- this.errors.legalScenario = '请选择法律场景'
- isValid = false
- }
- if (!this.formData.address || this.formData.address.trim() === '') {
- this.errors.address = '请填写联系地址'
- isValid = false
- }
- if (!this.formData.paymentAccount || this.formData.paymentAccount.trim() === '') {
- this.errors.paymentAccount = '请选择律师事务所收款账号'
- isValid = false
- }
- if (!this.formData.lawFirmName || this.formData.lawFirmName.trim() === '') {
- this.errors.lawFirmName = '请选择律师事务所名称'
- isValid = false
- }
- if (!this.formData.certificate) {
- this.errors.certificate = '请上传律师资格证'
- isValid = false
- }
- return isValid
- },
- // 提交表单
- handleSubmit() {
- if (!this.validateForm()) {
- this.$modal.msgError('请完善所有必填信息')
- return
- }
- this.$modal.loading('提交中...')
- updateUserProfile(this.formData).then(() => {
- this.$modal.closeLoading()
- this.$modal.msgSuccess('提交成功')
- setTimeout(() => {
- uni.navigateBack()
- }, 1500)
- }).catch(() => {
- this.$modal.closeLoading()
- })
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- page {
- background-color: #F9FAFC;
- }
- input,.picker-view {
- background-color: #fff !important;
- width: 676rpx;
- height: 103rpx;
- background: #FFFFFF;
- box-shadow: 0rpx 2rpx 11rpx 0rpx rgba(0, 0, 0, 0.06);
- border-radius: 23rpx 23rpx 23rpx 23rpx;
- }
- .set-user-info-container {
- min-height: 100vh;
- padding-bottom: 120rpx;
- }
- .page-title {
- font-size: 36rpx;
- font-weight: bold;
- color: #333;
- text-align: center;
- padding: 40rpx 0 30rpx;
- // background-color: #fff;
- }
- .form-scroll {
- height: calc(100vh - 200rpx);
- padding: 0 30rpx;
- }
- .avatar-section {
- // background-color: #F9FAFC;
- padding: 40rpx 0;
- margin-bottom: 20rpx;
- border-radius: 16rpx;
- display: flex;
- flex-direction: column;
- align-items: center;
- }
- .avatar-wrapper {
- position: relative;
- width: 160rpx;
- height: 160rpx;
- border-radius: 50%;
- overflow: hidden;
- // background-color: #f0f0f0;
- margin-bottom: 20rpx;
- }
- .avatar-image {
- width: 100%;
- height: 100%;
- }
- .avatar-placeholder {
- width: 100%;
- height: 100%;
- display: flex;
- align-items: center;
- justify-content: center;
- // background-color: #f0f0f0;
- }
- .avatar-icon {
- font-size: 80rpx;
- color: #ccc;
- }
- .camera-icon {
- position: absolute;
- bottom: 0;
- right: 0;
- width: 48rpx;
- height: 48rpx;
- background-color: #4a90e2;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
- border: 3rpx solid #fff;
- }
- .camera-text {
- font-size: 24rpx;
- }
- .avatar-tip {
- display: flex;
- align-items: center;
- font-size: 28rpx;
- color: #4a90e2;
- }
- .tip-text {
- margin-right: 4rpx;
- }
- .required-mark {
- color: #ff4d4f;
- font-size: 28rpx;
- }
- .form-section {
- // background-color: #fff;
- border-radius: 16rpx;
- padding: 30rpx;
- margin-bottom: 20rpx;
- }
- .form-item {
- margin-bottom: 40rpx;
- &:last-child {
- margin-bottom: 0;
- }
- }
- .form-label {
- font-size: 28rpx;
- color: #333;
- margin-bottom: 20rpx;
- display: flex;
- align-items: center;
- }
- .form-input {
- width: 100%;
- height: 80rpx;
- background-color: #f8f9fa;
- border-radius: 12rpx;
- padding: 0 24rpx;
- font-size: 28rpx;
- color: #333;
- box-sizing: border-box;
- }
- .picker-view {
- width: 100%;
- height: 80rpx;
- background-color: #f8f9fa;
- border-radius: 12rpx;
- padding: 0 24rpx;
- display: flex;
- align-items: center;
- justify-content: space-between;
- box-sizing: border-box;
- }
- .picker-text {
- font-size: 28rpx;
- color: #333;
- }
- .picker-placeholder {
- font-size: 28rpx;
- color: #999;
- }
- .picker-text-ellipsis {
- flex: 1;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- margin-right: 20rpx;
- }
- .picker-arrow {
- font-size: 40rpx;
- color: #999;
- font-weight: 300;
- }
- .certificate-upload {
- width: 100%;
- height: 300rpx;
- border: 2rpx dashed #ddd;
- border-radius: 12rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- background-color: #fafafa;
- box-sizing: border-box;
- }
- .certificate-image {
- width: 100%;
- height: 100%;
- border-radius: 12rpx;
- }
- .certificate-placeholder {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- }
- .certificate-icon {
- font-size: 80rpx;
- margin-bottom: 20rpx;
- }
- .certificate-text {
- font-size: 28rpx;
- color: #999;
- }
- .error-tip {
- font-size: 24rpx;
- color: #ff4d4f;
- margin-top: 10rpx;
- padding: 8rpx 16rpx;
- background-color: #fff2f0;
- border-radius: 8rpx;
- display: inline-block;
- }
- .submit-section {
- position: fixed;
- bottom: 0;
- left: 0;
- right: 0;
- padding: 20rpx 30rpx;
- padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
- background-color: #fff;
- box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
- }
- .submit-btn {
- width: 100%;
- height: 88rpx;
- background: linear-gradient(135deg, #4a90e2 0%, #5ba0f2 100%);
- color: #fff;
- font-size: 32rpx;
- border-radius: 16rpx;
- border: none;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- uni-button:after {
- border: none !important;
- }
- .modal-overlay {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: rgba(0, 0, 0, 0.5);
- // display: flex;
- // align-items: center;
- // justify-content: center;
- z-index: 1000;
- }
- .legal-scenario-modal {
- width: 100%;
- background: #fff;
- border-radius: 24rpx 24rpx 0 0;
- padding: 40rpx 30rpx 30rpx;
- max-height: 80vh;
- display: flex;
- flex-direction: column;
- position: fixed;
- left: 0;
- bottom: 0;
- }
- .modal-header {
- position: relative;
- display: flex;
- justify-content: center;
- align-items: center;
- margin-bottom: 40rpx;
- padding: 0 60rpx;
- }
- .modal-title {
- font-size: 32rpx;
- font-weight: bold;
- color: #333;
- text-align: center;
- }
- .cancel-btn {
- font-size: 28rpx;
- color: #999;
- position: absolute;
- right: 30rpx;
- top: 50%;
- transform: translateY(-50%);
- }
- .scenario-tags {
- display: flex;
- flex-wrap: wrap;
- gap: 20rpx;
- margin-bottom: 40rpx;
- max-height: 50vh;
- overflow-y: auto;
- }
- .scenario-tag {
- min-width: 200rpx;
- height: 70rpx;
- background-color: #f5f5f5;
- border-radius: 45rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 28rpx;
- color: #666;
- flex: 0 0 calc(33.333% - 14rpx);
- box-sizing: border-box;
- transition: all 0.3s;
- }
- .scenario-tag.selected {
- background:#ECF1FE;
- color: #2652C2;
- }
- .confirm-btn {
- width: 100%;
- height: 88rpx;
- background: linear-gradient(135deg, #4a90e2 0%, #5ba0f2 100%);
- color: #fff;
- font-size: 32rpx;
- border-radius: 16rpx;
- border: none;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- </style>
|