From 7e45498fc2a255ba780e32339e9c508f7ec781bb Mon Sep 17 00:00:00 2001 From: zer0Black <694429613@qq.com> Date: Tue, 5 Apr 2022 23:25:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=88=B02.4.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jero-web/README.md | 2 +- jero-web/package.json | 4 +- .../src/components/JVxeCells/JVxeFileCell.vue | 21 +- .../components/JVxeCells/JVxeImageCell.vue | 332 +++++++++--------- jero-web/src/components/_util/Area.js | 10 +- jero-web/src/components/_util/StringUtil.js | 11 + jero-web/src/components/jero/JAreaLinkage.vue | 7 +- jero-web/src/components/jero/JCodeEditor.vue | 4 + .../src/components/jero/JEditableTable.vue | 149 ++++++-- jero-web/src/components/jero/JEditor.vue | 14 +- .../src/components/jero/JModal/JModal.vue | 242 +++++++++++++ .../src/components/jero/JModal/JPrompt.vue | 124 +++++++ jero-web/src/components/jero/JModal/index.js | 18 + jero-web/src/components/jero/JModal/index.vue | 5 +- jero-web/src/components/jero/JPopup.vue | 4 +- jero-web/src/components/jero/JSuperQuery.vue | 3 +- jero-web/src/components/jero/JUpload.vue | 12 +- .../jero/JVxeTable/components/JVxeTable.js | 6 +- .../components/cells/JVxeUploadCell.vue | 15 +- jero-web/src/components/jero/index.js | 20 +- .../components/jero/modal/JPopupOnlReport.vue | 8 +- .../src/components/jerobiz/JSelectDepart.vue | 280 ++++++++------- .../components/jerobiz/JSelectUserByDep.vue | 202 ++++++----- .../jerobiz/modal/JSelectDepartModal.vue | 130 +++++-- .../jerobiz/modal/JSelectUserByDepModal.vue | 33 +- jero-web/src/components/tools/Logo.vue | 9 +- jero-web/src/config/router.config.js | 16 +- jero-web/src/mixins/JeroListMixin.js | 12 +- jero-web/src/mixins/OnlineCommonUtil.js | 6 +- jero-web/src/permission.js | 21 +- jero-web/src/store/index.js | 4 - jero-web/src/store/modules/user.js | 1 + jero-web/src/store/mutation-types.js | 1 + jero-web/src/utils/request.js | 71 ++-- jero-web/src/utils/util.js | 32 +- .../views/account/settings/AvatarModal.vue | 2 +- jero-web/src/views/demo/SelectDemo.vue | 5 +- jero-web/src/views/system/QuartzJobList.vue | 7 +- .../src/views/system/SysDataSourceList.vue | 10 - jero-web/src/views/system/UserList.vue | 2 +- .../views/system/modules/SysCategoryModal.vue | 3 +- .../system/modules/SysDataSourceModal.vue | 60 +++- .../src/views/system/modules/UserModal.vue | 2 +- jero-web/src/views/user/LoginSelectTenant.vue | 37 +- .../src/views/user/oauth2/OAuth2Login.vue | 130 +++++++ 45 files changed, 1490 insertions(+), 597 deletions(-) create mode 100644 jero-web/src/components/jero/JModal/JModal.vue create mode 100644 jero-web/src/components/jero/JModal/JPrompt.vue create mode 100644 jero-web/src/components/jero/JModal/index.js create mode 100644 jero-web/src/views/user/oauth2/OAuth2Login.vue diff --git a/jero-web/README.md b/jero-web/README.md index 2a8d5709..fde4e574 100644 --- a/jero-web/README.md +++ b/jero-web/README.md @@ -1,7 +1,7 @@ Jero-Web ==== -当前最新版本: 2.4.3 +当前最新版本: 2.4.6 Overview ---- diff --git a/jero-web/package.json b/jero-web/package.json index 2c2e5c7c..ed4e1430 100644 --- a/jero-web/package.json +++ b/jero-web/package.json @@ -1,6 +1,6 @@ { "name": "jero-web", - "version": "2.4.3", + "version": "2.4.6", "private": true, "scripts": { "pre": "cnpm install || yarn --registry https://registry.npm.taobao.org || npm install --registry https://registry.npm.taobao.org ", @@ -14,7 +14,7 @@ "@tinymce/tinymce-vue": "^2.1.0", "@toast-ui/editor": "^2.1.2", "ant-design-vue": "^1.7.2", - "area-data": "^5.0.6", + "china-area-data": "^5.0.1", "axios": "^0.21.1", "clipboard": "^2.0.4", "codemirror": "^5.46.0", diff --git a/jero-web/src/components/JVxeCells/JVxeFileCell.vue b/jero-web/src/components/JVxeCells/JVxeFileCell.vue index e4144a79..775d04ee 100644 --- a/jero-web/src/components/JVxeCells/JVxeFileCell.vue +++ b/jero-web/src/components/JVxeCells/JVxeFileCell.vue @@ -12,9 +12,9 @@ {{ ellipsisFileName }} - - - {{ ellipsisFileName }} + + + {{ ellipsisFileName }} + + \ No newline at end of file diff --git a/jero-web/src/components/jero/JModal/JPrompt.vue b/jero-web/src/components/jero/JModal/JPrompt.vue new file mode 100644 index 00000000..9d7f8556 --- /dev/null +++ b/jero-web/src/components/jero/JModal/JPrompt.vue @@ -0,0 +1,124 @@ + + + + + \ No newline at end of file diff --git a/jero-web/src/components/jero/JModal/index.js b/jero-web/src/components/jero/JModal/index.js new file mode 100644 index 00000000..638538ea --- /dev/null +++ b/jero-web/src/components/jero/JModal/index.js @@ -0,0 +1,18 @@ +import JModal from './JModal' +import JPrompt from './JPrompt' + +export default { + install(Vue) { + Vue.component(JModal.name, JModal) + + const JPromptExtend = Vue.extend(JPrompt) + Vue.prototype.$JPrompt = function (options = {}) { + // 创建prompt实例 + const vm = new JPromptExtend().$mount() + vm.show(options) + // 关闭后销毁 + vm.$on('after-close', () => vm.$destroy()) + return vm + } + }, +} \ No newline at end of file diff --git a/jero-web/src/components/jero/JModal/index.vue b/jero-web/src/components/jero/JModal/index.vue index 203cdbdf..45165f0b 100644 --- a/jero-web/src/components/jero/JModal/index.vue +++ b/jero-web/src/components/jero/JModal/index.vue @@ -23,7 +23,7 @@ - + @@ -118,8 +118,17 @@ value['responseName'] = file.response[col.responseName] } if (file.status === 'done') { - value['path'] = file.response[col.responseName] - this.handleChangeCommon(value) + if (typeof file.response.success === 'boolean') { + if (file.response.success) { + value['path'] = file.response[col.responseName] + } else { + value['status'] = 'error' + value['message'] = file.response.message || '未知错误' + } + } else { + // 考虑到如果设置action上传路径为非jeecg-boot后台,可能不会返回 success 属性的情况,就默认为成功 + value['path'] = file.response[col.responseName] + } } else if (file.status === 'error') { value['message'] = file.response.message || '未知错误' } diff --git a/jero-web/src/components/jero/index.js b/jero-web/src/components/jero/index.js index e415d1fe..7a28c234 100644 --- a/jero-web/src/components/jero/index.js +++ b/jero-web/src/components/jero/index.js @@ -26,18 +26,23 @@ import JSlider from './JSlider.vue' import JSwitch from './JSwitch.vue' import JTime from './JTime.vue' import JTreeTable from './JTreeTable.vue' -import JEasyCron from "@/components/jeecg/JEasyCron"; - +import JEasyCron from "@/components/jeecg/JEasyCron" //jerobiz import JSelectDepart from '../jerobiz/JSelectDepart.vue' import JSelectMultiUser from '../jerobiz/JSelectMultiUser.vue' import JSelectRole from '../jerobiz/JSelectRole.vue' import JSelectUserByDep from '../jerobiz/JSelectUserByDep.vue' +//引入需要全局注册的js函数和变量 +import { Modal, notification,message } from 'ant-design-vue' +import lodash_object from 'lodash' +import debounce from 'lodash/debounce' +import pick from 'lodash.pick' +import data from 'china-area-data' export default { install(Vue) { + Vue.use(JModal) Vue.component('JMarkdownEditor', JMarkdownEditor) - Vue.component(JModal.name, JModal) Vue.component('JPopupOnlReport', JPopupOnlReport) Vue.component('JFilePop', JFilePop) Vue.component('JInputPop', JInputPop) @@ -71,5 +76,14 @@ export default { Vue.component('JSelectRole', JSelectRole) Vue.component('JSelectUserByDep', JSelectUserByDep) Vue.component(JEasyCron.name, JEasyCron) + + //注册全局js函数和变量 + Vue.prototype.$Jnotification = notification + Vue.prototype.$Jmodal = Modal + Vue.prototype.$Jmessage = message + Vue.prototype.$Jlodash = lodash_object + Vue.prototype.$Jdebounce= debounce + Vue.prototype.$Jpick = pick + Vue.prototype.$Jpcaa = data } } \ No newline at end of file diff --git a/jero-web/src/components/jero/modal/JPopupOnlReport.vue b/jero-web/src/components/jero/modal/JPopupOnlReport.vue index 034d6c7e..ba5e27c2 100644 --- a/jero-web/src/components/jero/modal/JPopupOnlReport.vue +++ b/jero-web/src/components/jero/modal/JPopupOnlReport.vue @@ -137,8 +137,12 @@ param:{ deep:true, handler(){ - this.dynamicParamHandler() - this.loadData(); + // update--begin--autor:liusq-----date:20210706------for:JPopup组件在modal中使用报错#2729------ + if(this.visible){ + this.dynamicParamHandler() + this.loadData(); + } + // update--begin--autor:liusq-----date:20210706------for:JPopup组件在modal中使用报错#2729------ }, }, sorter: { diff --git a/jero-web/src/components/jerobiz/JSelectDepart.vue b/jero-web/src/components/jerobiz/JSelectDepart.vue index be5272d7..ea6e9b5f 100644 --- a/jero-web/src/components/jerobiz/JSelectDepart.vue +++ b/jero-web/src/components/jerobiz/JSelectDepart.vue @@ -1,9 +1,9 @@ \ No newline at end of file diff --git a/jero-web/src/components/jerobiz/JSelectUserByDep.vue b/jero-web/src/components/jerobiz/JSelectUserByDep.vue index 705e96da..828dff9d 100644 --- a/jero-web/src/components/jerobiz/JSelectUserByDep.vue +++ b/jero-web/src/components/jerobiz/JSelectUserByDep.vue @@ -1,109 +1,143 @@ \ No newline at end of file diff --git a/jero-web/src/components/jerobiz/modal/JSelectUserByDepModal.vue b/jero-web/src/components/jerobiz/modal/JSelectUserByDepModal.vue index 2c435d64..30c1fac5 100644 --- a/jero-web/src/components/jerobiz/modal/JSelectUserByDepModal.vue +++ b/jero-web/src/components/jerobiz/modal/JSelectUserByDepModal.vue @@ -64,11 +64,12 @@ diff --git a/jero-web/src/config/router.config.js b/jero-web/src/config/router.config.js index 30d38365..c5238c69 100644 --- a/jero-web/src/config/router.config.js +++ b/jero-web/src/config/router.config.js @@ -346,7 +346,21 @@ export const constantRouterMap = [ // }, // ] // }, - + + { + // OAuth2 APP页面路由 + path: '/oauth2-app', + component: BlankLayout, + redirect: '/oauth2-app/login', + children: [ + { + // OAuth2 登录路由 + path: 'login', + name: 'login', + component: () => import(/* webpackChunkName: "oauth2-app.login" */ '@/views/user/oauth2/OAuth2Login') + }, + ] + }, { path: '/test', component: BlankLayout, diff --git a/jero-web/src/mixins/JeroListMixin.js b/jero-web/src/mixins/JeroListMixin.js index 36a6f10c..f04fd37c 100644 --- a/jero-web/src/mixins/JeroListMixin.js +++ b/jero-web/src/mixins/JeroListMixin.js @@ -8,7 +8,6 @@ import { deleteAction, getAction,downFile,getFileAccessHttpUrl } from '@/api/man import Vue from 'vue' import { ACCESS_TOKEN, TENANT_ID } from "@/store/mutation-types" import store from '@/store' -import {Modal} from 'ant-design-vue' export const JeroListMixin = { data(){ @@ -93,11 +92,11 @@ export const JeroListMixin = { this.ipagination.total = 0; } //update-end---author:zhangyafei Date:20201118 for:适配不分页的数据列表------------ - } - if(res.code===510){ + }else{ this.$message.warning(res.message) } - this.loading = false; + }).finally(() => { + this.loading = false }) }, initDictConfig(){ @@ -293,10 +292,12 @@ export const JeroListMixin = { }, /* 导入 */ handleImportExcel(info){ + this.loading = true; if (info.file.status !== 'uploading') { console.log(info.file, info.fileList); } if (info.file.status === 'done') { + this.loading = false; if (info.file.response.success) { // this.$message.success(`${info.file.name} 文件上传成功`); if (info.file.response.code === 201) { @@ -318,11 +319,12 @@ export const JeroListMixin = { this.$message.error(`${info.file.name} ${info.file.response.message}.`); } } else if (info.file.status === 'error') { + this.loading = false; if (info.file.response.status === 500) { let data = info.file.response const token = Vue.ls.get(ACCESS_TOKEN) if (token && data.message.includes("Token失效")) { - Modal.error({ + this.error({ title: '登录已过期', content: '很抱歉,登录已过期,请重新登录', okText: '重新登录', diff --git a/jero-web/src/mixins/OnlineCommonUtil.js b/jero-web/src/mixins/OnlineCommonUtil.js index 7de0b6df..5ec8004e 100644 --- a/jero-web/src/mixins/OnlineCommonUtil.js +++ b/jero-web/src/mixins/OnlineCommonUtil.js @@ -1,14 +1,16 @@ import { formatDate } from '@/utils/util' import Area from '@/components/_util/Area' +import { postAction } from '@/api/manage' const onlUtil = { data(){ return { - mixin_pca:'' + mixin_pca:'', + flowCodePre: 'onl_' } }, created(){ - this.mixin_pca = new Area() + this.mixin_pca = new Area(this.$Jpcaa) }, methods:{ simpleDateFormat(millisecond, format){ diff --git a/jero-web/src/permission.js b/jero-web/src/permission.js index e1d423f1..c1fd2fa9 100644 --- a/jero-web/src/permission.js +++ b/jero-web/src/permission.js @@ -4,19 +4,20 @@ import store from './store' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style import notification from 'ant-design-vue/es/notification' -import { ACCESS_TOKEN,INDEX_MAIN_PAGE_PATH } from '@/store/mutation-types' -import { generateIndexRouter } from "@/utils/util" +import { ACCESS_TOKEN,INDEX_MAIN_PAGE_PATH, OAUTH2_LOGIN_PAGE_PATH } from '@/store/mutation-types' +import { generateIndexRouter, isOAuth2AppEnv } from '@/utils/util' NProgress.configure({ showSpinner: false }) // NProgress Configuration const whiteList = ['/user/login', '/user/register', '/user/register-result','/user/alteration'] // no redirect whitelist +whiteList.push(OAUTH2_LOGIN_PAGE_PATH) router.beforeEach((to, from, next) => { NProgress.start() // start progress bar if (Vue.ls.get(ACCESS_TOKEN)) { /* has token */ - if (to.path === '/user/login') { + if (to.path === '/user/login' || to.path === OAUTH2_LOGIN_PAGE_PATH) { store.dispatch('GetPermissionList').then(res => { const menuData = res.result.menu; @@ -79,10 +80,18 @@ router.beforeEach((to, from, next) => { } } else { if (whiteList.indexOf(to.path) !== -1) { - // 在免登录白名单,直接进入 - next() + // 在免登录白名单,如果进入的页面是login页面并且当前是OAuth2app环境,就进入OAuth2登录页面 + if (to.path === '/user/login' && isOAuth2AppEnv()) { + next({path: OAUTH2_LOGIN_PAGE_PATH}) + } else { + // 在免登录白名单,直接进入 + next() + } + NProgress.done() } else { - next({ path: '/user/login', query: { redirect: to.fullPath } }) + // 如果当前是在OAuth2APP环境,就跳转到OAuth2登录页面 + let path = isOAuth2AppEnv() ? OAUTH2_LOGIN_PAGE_PATH : '/user/login' + next({ path: path, query: { redirect: to.fullPath } }) NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it } } diff --git a/jero-web/src/store/index.js b/jero-web/src/store/index.js index ee4e41ea..908ddec0 100644 --- a/jero-web/src/store/index.js +++ b/jero-web/src/store/index.js @@ -4,8 +4,6 @@ import Vuex from 'vuex' import app from './modules/app' import user from './modules/user' import permission from './modules/permission' -import enhance from './modules/enhance' -import online from './modules/online' import getters from './getters' Vue.use(Vuex) @@ -15,8 +13,6 @@ export default new Vuex.Store({ app, user, permission, - enhance, - online }, state: { diff --git a/jero-web/src/store/modules/user.js b/jero-web/src/store/modules/user.js index 7593389b..d3f2706b 100644 --- a/jero-web/src/store/modules/user.js +++ b/jero-web/src/store/modules/user.js @@ -159,6 +159,7 @@ const user = { Vue.ls.remove(USER_NAME) Vue.ls.remove(UI_CACHE_DB_DICT_DATA) Vue.ls.remove(CACHE_INCLUDED_ROUTES) + Vue.ls.remove(TENANT_ID) //console.log('logoutToken: '+ logoutToken) logout(logoutToken).then(() => { if (process.env.VUE_APP_SSO == 'true') { diff --git a/jero-web/src/store/mutation-types.js b/jero-web/src/store/mutation-types.js index f58bdd9f..fee0f7fa 100644 --- a/jero-web/src/store/mutation-types.js +++ b/jero-web/src/store/mutation-types.js @@ -17,6 +17,7 @@ export const ENCRYPTED_STRING = 'ENCRYPTED_STRING' export const ENHANCE_PRE = 'enhance_' export const UI_CACHE_DB_DICT_DATA = 'UI_CACHE_DB_DICT_DATA' export const INDEX_MAIN_PAGE_PATH = '/dashboard/analysis' +export const OAUTH2_LOGIN_PAGE_PATH = '/oauth2-app/login' export const TENANT_ID = 'TENANT_ID' export const ONL_AUTH_FIELDS = 'ONL_AUTH_FIELDS' //路由缓存问题,关闭了tab页时再打开就不刷新 #842 diff --git a/jero-web/src/utils/request.js b/jero-web/src/utils/request.js index 649e73de..d36f3cfb 100644 --- a/jero-web/src/utils/request.js +++ b/jero-web/src/utils/request.js @@ -2,7 +2,7 @@ import Vue from 'vue' import axios from 'axios' import store from '@/store' import { VueAxios } from './axios' -import {Modal, notification} from 'ant-design-vue' +import router from '@/router/index' import { ACCESS_TOKEN, TENANT_ID } from "@/store/mutation-types" /** @@ -28,7 +28,7 @@ const err = (error) => { console.log("------异常响应------",error.response.status) switch (error.response.status) { case 403: - notification.error({ message: '系统提示', description: '拒绝访问',duration: 4}) + Vue.prototype.$Jnotification.error({ message: '系统提示', description: '拒绝访问',duration: 4}) break case 500: console.log("------error.response------",error.response) @@ -39,40 +39,43 @@ const err = (error) => { break; } // update-end- --- author:liusq ------ date:20200910 ---- for:处理Blob情况---- - //notification.error({ message: '系统提示', description:'Token失效,请重新登录!',duration: 4}) if(token && data.message.includes("Token失效")){ // update-begin- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转---- - Modal.error({ - title: '登录已过期', - content: '很抱歉,登录已过期,请重新登录', - okText: '重新登录', - mask: false, - onOk: () => { - store.dispatch('Logout').then(() => { - Vue.ls.remove(ACCESS_TOKEN) - try { - let path = window.document.location.pathname - console.log("location pathname -> "+path) - if(path!="/" && path.indexOf('/user/login')==-1){ + if (/wxwork|dingtalk/i.test(navigator.userAgent)) { + Vue.prototype.$Jmessage.loading('登录已过期,正在重新登陆', 0) + } else { + Vue.prototype.$Jmodal.error({ + title: '登录已过期', + content: '很抱歉,登录已过期,请重新登录', + okText: '重新登录', + mask: false, + onOk: () => { + store.dispatch('Logout').then(() => { + Vue.ls.remove(ACCESS_TOKEN) + try { + let path = window.document.location.pathname + console.log('location pathname -> ' + path) + if (path != '/' && path.indexOf('/user/login') == -1) { + window.location.reload() + } + } catch (e) { window.location.reload() } - }catch (e) { - window.location.reload() - } - }) - } - }) + }) + } + }) + } // update-end- --- author:scott ------ date:20190225 ---- for:Token失效采用弹框模式,不直接跳转---- } break case 404: - notification.error({ message: '系统提示', description:'很抱歉,资源未找到!',duration: 4}) + Vue.prototype.$Jnotification.error({ message: '系统提示', description:'很抱歉,资源未找到!',duration: 4}) break case 504: - notification.error({ message: '系统提示', description: '网络超时'}) + Vue.prototype.$Jnotification.error({ message: '系统提示', description: '网络超时'}) break case 401: - notification.error({ message: '系统提示', description:'未授权,请重新登录',duration: 4}) + Vue.prototype.$Jnotification.error({ message: '系统提示', description:'未授权,请重新登录',duration: 4}) if (token) { store.dispatch('Logout').then(() => { setTimeout(() => { @@ -82,13 +85,19 @@ const err = (error) => { } break default: - notification.error({ + Vue.prototype.$Jnotification.error({ message: '系统提示', description: data.message, duration: 4 }) break } + } else if (error.message) { + if (error.message.includes('timeout')) { + Vue.prototype.$Jnotification.error({message: '系统提示', description: '网络超时'}) + } else { + Vue.prototype.$Jnotification.error({message: '系统提示', description: error.message}) + } } return Promise.reject(error) }; @@ -99,6 +108,14 @@ service.interceptors.request.use(config => { if (token) { config.headers[ 'X-Access-Token' ] = token // 让每个请求携带自定义 token 请根据实际情况自行修改 } + + // update-begin--author:sunjianlei---date:20200723---for 如果当前在low-app环境,并且携带了appId,就向Header里传递appId + const $route = router.currentRoute + if ($route && $route.name && $route.name.startsWith('low-app') && $route.params.appId) { + config.headers['X-Low-App-ID'] = $route.params.appId + } + // update-end--author:sunjianlei---date:20200723---for 如果当前在low-app环境,并且携带了appId,就向Header里传递appId + //update-begin-author:taoyan date:2020707 for:多租户 let tenantid = Vue.ls.get(TENANT_ID) if (!tenantid) { @@ -121,8 +138,8 @@ service.interceptors.request.use(config => { // response interceptor service.interceptors.response.use((response) => { - return response.data - }, err) + return response.data +}, err) const installer = { vm: {}, diff --git a/jero-web/src/utils/util.js b/jero-web/src/utils/util.js index 89b966a3..43cb650b 100644 --- a/jero-web/src/utils/util.js +++ b/jero-web/src/utils/util.js @@ -1,5 +1,7 @@ +import Vue from 'vue' import * as api from '@/api/api' import { isURL } from '@/utils/validate' +import { ACCESS_TOKEN } from '@/store/mutation-types' import onlineCommons from '@/components/onlineForm/onlineForm' // export function timeFix() { @@ -571,4 +573,32 @@ export function findFirstRoute(data){ } else { return '/' } -} \ No newline at end of file +} + +/** 判断是否是OAuth2APP环境 */ +export function isOAuth2AppEnv() { + return /wxwork|dingtalk/i.test(navigator.userAgent) +} + +/** + * 获取积木报表打印地址 + * @param url + * @param id + * @param open 是否自动打开 + * @returns {*} + */ +export function getReportPrintUrl(url, id, open) { + // URL支持{{ window.xxx }}占位符变量 + url = url.replace(/{{([^}]+)?}}/g, (s1, s2) => eval(s2)) + if (url.includes('?')) { + url += '&' + } else { + url += '?' + } + url += `id=${id}` + url += `&token=${Vue.ls.get(ACCESS_TOKEN)}` + if (open) { + window.open(url) + } + return url +} diff --git a/jero-web/src/views/account/settings/AvatarModal.vue b/jero-web/src/views/account/settings/AvatarModal.vue index 7eb3d815..9986088d 100644 --- a/jero-web/src/views/account/settings/AvatarModal.vue +++ b/jero-web/src/views/account/settings/AvatarModal.vue @@ -1,5 +1,5 @@