first commit
This commit is contained in:
parent
2d7e98e307
commit
68deffd548
src
App.vue
api
components
install.jslayout/header-aside
menu
router
store/modules/d2admin/modules
views
dashboard/workbench/components
attachmentTotal.vuedatabaseTotal.vueloginRegion.vueloginTotal.vueregisteredUser.vueuserLogin.vueusersActive.vueusersTotal.vue
demo/page1
system
@ -5,9 +5,7 @@
|
||||
<div id="qiankun"></div>
|
||||
<!-- 授权后可以删除-->
|
||||
<div class="dvadmin-auth">
|
||||
<span>Powered by Django-Vue-Admin</span>
|
||||
<el-divider direction="vertical"></el-divider>
|
||||
<span>Copyright dvadmin团队</span>
|
||||
<span><a href="https://x-php.com" target="_blank">Powered by X-PHP-Admin</a></span>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@ -37,8 +35,8 @@ export default {
|
||||
.dvadmin-auth {
|
||||
font-size: 0.8em;
|
||||
position: fixed;
|
||||
top: 50vh;
|
||||
right: -163px;;
|
||||
bottom: 18vh;
|
||||
right: -72px;
|
||||
text-align: center;
|
||||
color: #888888;
|
||||
background-image: linear-gradient(to left, #d3d3d3, #989898, #888888, #363636, #888888, #989898, #d3d3d3);
|
||||
|
@ -70,14 +70,14 @@ function createService () {
|
||||
} else {
|
||||
// 有 code 代表这是一个后端接口 可以进行进一步的判断
|
||||
switch (code) {
|
||||
case 2000:
|
||||
// [ 示例 ] code === 2000 代表没有错误
|
||||
case 200:
|
||||
// [ 示例 ] code === 200 代表没有错误
|
||||
// TODO 可能结果还需要code和msg进行后续处理,所以去掉.data返回全部结果
|
||||
// return dataAxios.data
|
||||
return dataAxios
|
||||
case 401:
|
||||
if (response.config.url === 'api/login/') {
|
||||
errorCreate(`${getErrorMessage(dataAxios.msg)}`)
|
||||
errorCreate(`${getErrorMessage(dataAxios.message)}`)
|
||||
break
|
||||
}
|
||||
var res = await refreshTken()
|
||||
@ -97,18 +97,18 @@ function createService () {
|
||||
config.__retryCount += 1
|
||||
return service(config)
|
||||
case 404:
|
||||
dataNotFound(`${dataAxios.msg}`)
|
||||
dataNotFound(`${dataAxios.message}`)
|
||||
break
|
||||
case 4000:
|
||||
// 删除cookie
|
||||
errorCreate(`${getErrorMessage(dataAxios.msg)}`)
|
||||
errorCreate(`${getErrorMessage(dataAxios.message)}`)
|
||||
break
|
||||
case 400:
|
||||
errorCreate(`${dataAxios.msg}`)
|
||||
case 201:
|
||||
errorCreate(`${dataAxios.message}`)
|
||||
break
|
||||
default:
|
||||
// 不是正确的 code
|
||||
errorCreate(`${dataAxios.msg}: ${response.config.url}`)
|
||||
errorCreate(`${dataAxios.message}: ${response.config.url}`)
|
||||
break
|
||||
}
|
||||
}
|
||||
|
@ -19,7 +19,7 @@
|
||||
},
|
||||
type: 'table-selector',
|
||||
dict: {
|
||||
url: '/api/system/user/',
|
||||
url: '/system/user/',
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
label: 'name', // 数据字典中label字段的属性名
|
||||
getData: (url, dict, { form, component }) => {
|
||||
|
@ -11,7 +11,7 @@
|
||||
},
|
||||
type: 'table-selector',
|
||||
dict: {
|
||||
url: '/api/system/user/',
|
||||
url: '/system/user/',
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
label: 'name', // 数据字典中label字段的属性名
|
||||
getData: (url, dict, { form, component }) => {
|
||||
|
@ -310,7 +310,7 @@ Vue.prototype.commonEndColumns = function (param = {}) {
|
||||
type: 'tree-selector',
|
||||
dict: {
|
||||
cache: false,
|
||||
url: '/api/system/dept/all_dept/',
|
||||
url: '/system/dept/all_dept/',
|
||||
// isTree: true,
|
||||
// dept: true,
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
|
@ -56,7 +56,7 @@ export default {
|
||||
methods: {
|
||||
getList () {
|
||||
request({
|
||||
url: '/api/system/message_center/get_newest_msg/',
|
||||
url: '/system/message_center/get_newest_msg/',
|
||||
method: 'get',
|
||||
params: {}
|
||||
}).then(res => {
|
||||
|
@ -191,7 +191,7 @@ export default {
|
||||
getCurrentUserInfo () {
|
||||
const _self = this
|
||||
return request({
|
||||
url: '/api/system/user/user_info/',
|
||||
url: '/system/user/user_info',
|
||||
method: 'get',
|
||||
params: {}
|
||||
}).then((res) => {
|
||||
@ -209,7 +209,7 @@ export default {
|
||||
const userInfo = _self.userInfo
|
||||
delete userInfo.role
|
||||
request({
|
||||
url: '/api/system/user/update_user_info/',
|
||||
url: '/system/user/update_user_info/',
|
||||
method: 'put',
|
||||
data: userInfo
|
||||
}).then((res) => {
|
||||
@ -257,7 +257,7 @@ export default {
|
||||
params.newPassword = _self.$md5(params.newPassword)
|
||||
params.newPassword2 = _self.$md5(params.newPassword2)
|
||||
request({
|
||||
url: '/api/system/user/' + userId + '/change_password/',
|
||||
url: '/system/user/' + userId + '/change_password/',
|
||||
method: 'put',
|
||||
data: params
|
||||
}).then((res) => {
|
||||
|
@ -140,7 +140,7 @@ export default {
|
||||
data () {
|
||||
return {
|
||||
// [侧边栏宽度] 正常状态
|
||||
asideWidth: '200px',
|
||||
asideWidth: '180px',
|
||||
// [侧边栏宽度] 折叠状态
|
||||
asideWidthCollapse: '65px',
|
||||
showView: true // 用于点击当前页的router时,刷新当前页
|
||||
|
@ -34,7 +34,7 @@ export const menuAside = supplementPath([])
|
||||
// 请求菜单数据,用于解析路由和侧边栏菜单
|
||||
export const getMenu = function () {
|
||||
return request({
|
||||
url: '/api/system/menu/web_router/',
|
||||
url: '/system/menu/web_router/',
|
||||
method: 'get',
|
||||
params: {}
|
||||
}).then((res) => {
|
||||
|
@ -58,7 +58,7 @@ router.beforeEach(async (to, from, next) => {
|
||||
if (token && token !== 'undefined') {
|
||||
if (!store.state.d2admin.user.info.name) {
|
||||
var res = await request({
|
||||
url: '/api/system/user/user_info/',
|
||||
url: '/system/user/user_info',
|
||||
method: 'get',
|
||||
params: {}
|
||||
})
|
||||
|
@ -53,7 +53,7 @@ export default {
|
||||
// dept_info: res.dept_info
|
||||
// }, { root: true })
|
||||
var userInfoRes = await request({
|
||||
url: '/api/system/user/user_info/',
|
||||
url: '/system/user/user_info',
|
||||
method: 'get',
|
||||
params: {}
|
||||
})
|
||||
|
@ -29,7 +29,7 @@ export default {
|
||||
async load ({ state, dispatch }, info) {
|
||||
// 持久化
|
||||
const ret = await request({
|
||||
url: '/api/system/dept/all_dept/'
|
||||
url: '/system/dept/all_dept/'
|
||||
})
|
||||
const data = util.ArrayToTree(ret.data.data || ret.data, null, null, [])
|
||||
state.data = await dispatch('getDeptName', { data: data })
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/init/dictionary/'
|
||||
export const urlPrefix = '/init/dictionary'
|
||||
export const BUTTON_VALUE_TO_COLOR_MAPPING = {
|
||||
1: 'success',
|
||||
true: 'success',
|
||||
|
@ -28,7 +28,7 @@ export default {
|
||||
commit('set', number)
|
||||
} else {
|
||||
request({
|
||||
url: '/api/system/message_center/get_unread_msg/',
|
||||
url: '/system/message_center/get_unread_msg/',
|
||||
method: 'get',
|
||||
params: {}
|
||||
}).then(res => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/init/settings/'
|
||||
export const urlPrefix = '/init/settings'
|
||||
|
||||
// 系统配置
|
||||
export default {
|
||||
|
@ -70,7 +70,7 @@ export default {
|
||||
methods: {
|
||||
initGet () {
|
||||
request({
|
||||
url: '/api/system/datav/attachment_total/'
|
||||
url: '/system/datav/attachment_total/'
|
||||
}).then((res) => {
|
||||
this.count = res.data.count
|
||||
this.occupy_space = this.$util.formatBytes(res.data.occupy_space)
|
||||
|
@ -70,7 +70,7 @@ export default {
|
||||
methods: {
|
||||
initGet () {
|
||||
request({
|
||||
url: '/api/system/datav/database_total/'
|
||||
url: '/system/datav/database_total/'
|
||||
}).then((res) => {
|
||||
this.count = res.data.count
|
||||
this.space = this.$util.formatBytes(res.data.space)
|
||||
|
@ -50,7 +50,7 @@ export default {
|
||||
methods: {
|
||||
initGet () {
|
||||
request({
|
||||
url: '/api/system/datav/login_region/'
|
||||
url: '/system/datav/login_region/'
|
||||
}).then((res) => {
|
||||
this.data = res.data
|
||||
this.drawLine(this.data)
|
||||
|
@ -56,7 +56,7 @@ export default {
|
||||
methods: {
|
||||
initGet () {
|
||||
request({
|
||||
url: '/api/system/datav/users_login_total/'
|
||||
url: '/system/datav/users_login_total/'
|
||||
}).then((res) => {
|
||||
this.loginTotal = res.data.login_total
|
||||
})
|
||||
|
@ -50,7 +50,7 @@ export default {
|
||||
methods: {
|
||||
initGet () {
|
||||
request({
|
||||
url: '/api/system/datav/registered_user/'
|
||||
url: '/system/datav/registered_user/'
|
||||
}).then((res) => {
|
||||
this.data = res.data.registered_user_list
|
||||
this.drawLine(this.data)
|
||||
|
@ -52,7 +52,7 @@ export default {
|
||||
methods: {
|
||||
initGet () {
|
||||
request({
|
||||
url: '/api/system/datav/login_user/'
|
||||
url: '/system/datav/login_user/'
|
||||
}).then((res) => {
|
||||
this.data = res.data.login_user
|
||||
this.drawLine(this.data)
|
||||
|
@ -140,7 +140,7 @@ export default {
|
||||
methods: {
|
||||
initGet () {
|
||||
request({
|
||||
url: '/api/system/datav/users_active/'
|
||||
url: '/system/datav/users_active/'
|
||||
}).then((res) => {
|
||||
this.data = res.data
|
||||
})
|
||||
|
@ -56,7 +56,7 @@ export default {
|
||||
methods: {
|
||||
initGet () {
|
||||
request({
|
||||
url: '/api/system/datav/users_total/'
|
||||
url: '/system/datav/users_total/'
|
||||
}).then((res) => {
|
||||
this.usersTotal = res.data.users_total
|
||||
})
|
||||
|
@ -31,7 +31,7 @@ export const crudOptions = (vm) => {
|
||||
},
|
||||
type: 'table-selector',
|
||||
dict: {
|
||||
url: '/api/system/user/',
|
||||
url: '/system/user/',
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
label: 'name', // 数据字典中label字段的属性名
|
||||
getData: (url, dict, { form, component }) => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/area/'
|
||||
export const urlPrefix = '/system/area/'
|
||||
|
||||
export function GetList (query) {
|
||||
if ((!query.pcode || query.pcode.length === 0) && !query.name && !query.code) {
|
||||
|
@ -17,7 +17,7 @@ export const crudOptions = (vm) => {
|
||||
hasChild: 'hasChildren',
|
||||
loadMethod: ({ row }) => {
|
||||
return request({
|
||||
url: '/api/system/area/',
|
||||
url: '/system/area/',
|
||||
method: 'get',
|
||||
params: { pcode: row.code, limit: 999 }
|
||||
}).then(ret => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/system_config/'
|
||||
export const urlPrefix = '/system/system_config/'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
|
@ -146,7 +146,7 @@
|
||||
pagination: true,
|
||||
columns: item.setting.searchField}'
|
||||
:dict="{
|
||||
url:'/api/system/system_config/get_table_data/'+item.id+'/',
|
||||
url:'/system/system_config/get_table_data/'+item.id+'/',
|
||||
value: item.setting.primarykey,
|
||||
label: item.setting.field,
|
||||
}"
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { request } from '@/api/service'
|
||||
import XEUtils from 'xe-utils'
|
||||
export const urlPrefix = '/api/system/dept/'
|
||||
export const urlPrefix = '/system/dept/'
|
||||
/**
|
||||
* 列表查询
|
||||
*/
|
||||
@ -59,7 +59,7 @@ export function DelObj (id) {
|
||||
*/
|
||||
export function DeptLazy (query) {
|
||||
return request({
|
||||
url: '/api/system/dept_lazy_tree/',
|
||||
url: '/system/dept_lazy_tree/',
|
||||
method: 'get',
|
||||
params: query
|
||||
}).then(res => {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { request } from '@/api/service'
|
||||
import XEUtils from 'xe-utils'
|
||||
export const urlPrefix = '/api/system/dictionary/'
|
||||
export const urlPrefix = '/system/dictionary/'
|
||||
|
||||
/**
|
||||
* 列表查询
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { request } from '@/api/service'
|
||||
import XEUtils from 'xe-utils'
|
||||
export const urlPrefix = '/api/system/dictionary/'
|
||||
export const urlPrefix = '/system/dictionary/'
|
||||
|
||||
/**
|
||||
* 列表查询
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/file/'
|
||||
export const urlPrefix = '/system/file/'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
|
3
src/views/system/frame/index.vue
Normal file
3
src/views/system/frame/index.vue
Normal file
@ -0,0 +1,3 @@
|
||||
<template>
|
||||
<d2-container-frame :src="`${$baseUrl}html/demo.html`"/>
|
||||
</template>
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/login_log/'
|
||||
export const urlPrefix = '/system/login_log/'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/operation_log/'
|
||||
export const urlPrefix = '/system/operation_log/'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
|
@ -2,7 +2,7 @@ import { request } from '@/api/service'
|
||||
|
||||
export function SYS_USER_LOGIN (data) {
|
||||
return request({
|
||||
url: 'api/login/',
|
||||
url: 'api/login',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
@ -10,7 +10,7 @@ export function SYS_USER_LOGIN (data) {
|
||||
|
||||
export function SYS_USER_LOGOUT (data) {
|
||||
return request({
|
||||
url: 'api/logout/',
|
||||
url: 'api/logout',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
@ -18,14 +18,14 @@ export function SYS_USER_LOGOUT (data) {
|
||||
|
||||
export function getCaptcha () {
|
||||
return request({
|
||||
url: 'api/captcha/',
|
||||
url: 'api/captcha',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function getCaptchaStatus () {
|
||||
return request({
|
||||
url: 'api/captcha/status/',
|
||||
url: 'api/captcha/status',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/menu/'
|
||||
export const urlPrefix = '/system/menu/'
|
||||
|
||||
/**
|
||||
* 列表查询
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/menu_button/'
|
||||
export const urlPrefix = '/system/menu_button/'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { request } from '@/api/service'
|
||||
export const urlPrefix = '/api/system/message_center/'
|
||||
export const urlPrefix = '/system/message_center/'
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
url: urlPrefix,
|
||||
|
@ -126,7 +126,7 @@ export const crudOptions = (vm) => {
|
||||
disabled: true,
|
||||
dict: {
|
||||
cache: false,
|
||||
url: '/api/system/user/',
|
||||
url: '/system/user/',
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
label: 'name', // 数据字典中label字段的属性名
|
||||
getData: (url, dict, {
|
||||
@ -195,7 +195,7 @@ export const crudOptions = (vm) => {
|
||||
type: 'table-selector',
|
||||
dict: {
|
||||
cache: false,
|
||||
url: '/api/system/role/',
|
||||
url: '/system/role/',
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
label: 'name', // 数据字典中label字段的属性名
|
||||
getData: (url, dict, {
|
||||
@ -263,7 +263,7 @@ export const crudOptions = (vm) => {
|
||||
type: 'table-selector',
|
||||
dict: {
|
||||
cache: false,
|
||||
url: '/api/system/dept/all_dept/',
|
||||
url: '/system/dept/all_dept/',
|
||||
isTree: true,
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
label: 'name', // 数据字典中label字段的属性名
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/role/'
|
||||
export const urlPrefix = '/system/role/'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/role/'
|
||||
export const urlPrefix = '/system/role/'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
@ -47,7 +47,7 @@ export function DelObj (id) {
|
||||
// 通过角色id,获取菜单数据
|
||||
export function GetMenuData (obj) {
|
||||
return request({
|
||||
url: '/api/system/role/role_get_menu/',
|
||||
url: '/system/role/role_get_menu/',
|
||||
method: 'get',
|
||||
params: {}
|
||||
}).then(res => {
|
||||
@ -64,7 +64,7 @@ export function GetMenuData (obj) {
|
||||
*/
|
||||
export function GetDataScope () {
|
||||
return request({
|
||||
url: '/api/system/role/data_scope/',
|
||||
url: '/system/role/data_scope/',
|
||||
method: 'get',
|
||||
params: {}
|
||||
})
|
||||
@ -77,7 +77,7 @@ export function GetDataScope () {
|
||||
*/
|
||||
export function GetDataScopeDept () {
|
||||
return request({
|
||||
url: '/api/system/role/data_scope_dept/',
|
||||
url: '/system/role/data_scope_dept/',
|
||||
method: 'get',
|
||||
params: {}
|
||||
})
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { request, downloadFile } from '@/api/service'
|
||||
export const urlPrefix = '/api/system/user/'
|
||||
export const urlPrefix = '/system/user/'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
@ -19,7 +19,7 @@ export function AddObj (obj) {
|
||||
|
||||
export function UpdateObj (obj) {
|
||||
return request({
|
||||
url: urlPrefix + obj.id + '/',
|
||||
url: urlPrefix + obj.id ,
|
||||
method: 'put',
|
||||
data: obj
|
||||
})
|
||||
@ -27,7 +27,7 @@ export function UpdateObj (obj) {
|
||||
|
||||
export function DelObj (id) {
|
||||
return request({
|
||||
url: urlPrefix + id + '/',
|
||||
url: urlPrefix + id ,
|
||||
method: 'delete',
|
||||
data: { soft_delete: true }
|
||||
})
|
||||
@ -35,7 +35,7 @@ export function DelObj (id) {
|
||||
|
||||
export function BatchDel (keys) {
|
||||
return request({
|
||||
url: urlPrefix + 'multiple_delete/',
|
||||
url: urlPrefix + 'multiple_delete',
|
||||
method: 'delete',
|
||||
data: { keys }
|
||||
})
|
||||
@ -49,7 +49,7 @@ export function BatchDel (keys) {
|
||||
*/
|
||||
export function ResetPwd (obj) {
|
||||
return request({
|
||||
url: urlPrefix + obj.id + '/reset_password/',
|
||||
url: urlPrefix + obj.id + '/reset_password',
|
||||
method: 'put',
|
||||
data: obj
|
||||
})
|
||||
@ -61,7 +61,7 @@ export function ResetPwd (obj) {
|
||||
*/
|
||||
export function exportData (params) {
|
||||
return downloadFile({
|
||||
url: urlPrefix + 'export/',
|
||||
url: urlPrefix + 'export',
|
||||
params: params,
|
||||
method: 'post'
|
||||
})
|
||||
|
@ -171,7 +171,7 @@ export const crudOptions = (vm) => {
|
||||
}
|
||||
},
|
||||
{
|
||||
title: '部门',
|
||||
title: '用户组',
|
||||
key: 'dept',
|
||||
search: {
|
||||
disabled: true
|
||||
@ -181,7 +181,7 @@ export const crudOptions = (vm) => {
|
||||
dict: {
|
||||
cache: true,
|
||||
isTree: true,
|
||||
url: '/api/system/dept/all_dept/',
|
||||
url: '/system/dept/all_dept/',
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
label: 'name' // 数据字典中label字段的属性名
|
||||
},
|
||||
@ -216,7 +216,7 @@ export const crudOptions = (vm) => {
|
||||
type: 'table-selector',
|
||||
dict: {
|
||||
cache: false,
|
||||
url: '/api/system/role/',
|
||||
url: '/system/role/',
|
||||
value: 'id', // 数据字典中value字段的属性名
|
||||
label: 'name', // 数据字典中label字段的属性名
|
||||
getData: (url, dict, {
|
||||
|
@ -1,7 +1,7 @@
|
||||
|
||||
import { request } from '@/api/service'
|
||||
|
||||
export const urlPrefix = '/api/system/api_white_list/'
|
||||
export const urlPrefix = '/system/api_white_list'
|
||||
|
||||
export function GetList (query) {
|
||||
return request({
|
||||
|
Loading…
x
Reference in New Issue
Block a user