Merge remote-tracking branch 'dva-origin/v2.x' into to_merge
commit
60f795cb49
|
@ -30,6 +30,8 @@ from conf.env import *
|
||||||
SECRET_KEY = 'django-insecure--z8%exyzt7e_%i@1+#1mm=%lb5=^fx_57=1@a+_y7bg5-w%)sm'
|
SECRET_KEY = 'django-insecure--z8%exyzt7e_%i@1+#1mm=%lb5=^fx_57=1@a+_y7bg5-w%)sm'
|
||||||
# 初始化plugins插件路径到环境变量中
|
# 初始化plugins插件路径到环境变量中
|
||||||
PLUGINS_PATH = os.path.join(BASE_DIR, 'plugins')
|
PLUGINS_PATH = os.path.join(BASE_DIR, 'plugins')
|
||||||
|
sys.path.insert(0, os.path.join(PLUGINS_PATH))
|
||||||
|
|
||||||
[sys.path.insert(0, os.path.join(PLUGINS_PATH, ele)) for ele in os.listdir(PLUGINS_PATH) if
|
[sys.path.insert(0, os.path.join(PLUGINS_PATH, ele)) for ele in os.listdir(PLUGINS_PATH) if
|
||||||
os.path.isdir(os.path.join(PLUGINS_PATH, ele)) and not ele.startswith('__')]
|
os.path.isdir(os.path.join(PLUGINS_PATH, ele)) and not ele.startswith('__')]
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,3 @@
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
"""
|
|
||||||
@author: 猿小天
|
|
||||||
@contact: QQ:1638245306
|
|
||||||
@Created on: 2021/8/9 009 20:48
|
|
||||||
@Remark:
|
|
||||||
"""
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
from dvadmin.system.models import FileList
|
from dvadmin.system.models import FileList
|
||||||
|
@ -17,7 +9,7 @@ class FileSerializer(CustomModelSerializer):
|
||||||
url = serializers.SerializerMethodField(read_only=True)
|
url = serializers.SerializerMethodField(read_only=True)
|
||||||
|
|
||||||
def get_url(self, instance):
|
def get_url(self, instance):
|
||||||
return 'media/'+str(instance.url)
|
return 'media/' + str(instance.url)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FileList
|
model = FileList
|
||||||
|
|
|
@ -0,0 +1,103 @@
|
||||||
|
export default {
|
||||||
|
'image-uploader': {
|
||||||
|
form: { component: { name: 'd2p-file-uploader', props: { elProps: { listType: 'picture-card', accept: '.png,.jpeg,.jpg,.ico,.bmp,.gif' } } } },
|
||||||
|
component: { name: 'd2p-images-format' },
|
||||||
|
view: {
|
||||||
|
component: { props: { height: 100, width: 100 } }
|
||||||
|
},
|
||||||
|
align: 'center',
|
||||||
|
// 提交时,处理数据
|
||||||
|
valueResolve (row, col) {
|
||||||
|
const value = row[col.key]
|
||||||
|
if (value != null) {
|
||||||
|
if (value.length >= 0) {
|
||||||
|
if (value instanceof Array) {
|
||||||
|
row[col.key] = value.toString()
|
||||||
|
} else {
|
||||||
|
row[col.key] = value[0]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
row[col.key] = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 接收时,处理数据
|
||||||
|
valueBuilder (row, col) {
|
||||||
|
const value = row[col.key]
|
||||||
|
if (value != null) {
|
||||||
|
row[col.key] = value.split(',')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'avatar-uploader': {
|
||||||
|
form: { component: { name: 'd2p-file-uploader', props: { elProps: { limit: 1, listType: 'avatar', accept: '.png,.jpeg,.jpg,.ico,.bmp,.gif', showFileList: false } } } },
|
||||||
|
component: { name: 'd2p-images-format' },
|
||||||
|
view: {
|
||||||
|
component: { props: { height: 100, width: 100 } }
|
||||||
|
},
|
||||||
|
align: 'center',
|
||||||
|
// 提交时,处理数据
|
||||||
|
valueResolve (row, col) {
|
||||||
|
const value = row[col.key]
|
||||||
|
if (value != null) {
|
||||||
|
if (value.length >= 0) {
|
||||||
|
if (value instanceof Array) {
|
||||||
|
row[col.key] = value.toString()
|
||||||
|
} else {
|
||||||
|
row[col.key] = value[0]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
row[col.key] = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 接收时,处理数据
|
||||||
|
valueBuilder (row, col) {
|
||||||
|
const value = row[col.key]
|
||||||
|
if (value != null) {
|
||||||
|
row[col.key] = value.split(',')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'file-uploader': {
|
||||||
|
form: { component: { name: 'd2p-file-uploader', props: { elProps: { listType: 'text' } } } },
|
||||||
|
component: { name: 'd2p-files-format' },
|
||||||
|
// 提交时,处理数据
|
||||||
|
valueResolve (row, col) {
|
||||||
|
const value = row[col.key]
|
||||||
|
if (value != null) {
|
||||||
|
if (value.length >= 0) {
|
||||||
|
if (value instanceof Array) {
|
||||||
|
row[col.key] = value.toString()
|
||||||
|
} else {
|
||||||
|
row[col.key] = value[0]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
row[col.key] = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 接收时,处理数据
|
||||||
|
valueBuilder (row, col) {
|
||||||
|
const value = row[col.key]
|
||||||
|
if (value != null) {
|
||||||
|
row[col.key] = value.split(',')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'avatar-cropper': {
|
||||||
|
form: { component: { name: 'd2p-cropper-uploader', props: { accept: '.png,.jpeg,.jpg,.ico,.bmp,.gif', cropper: { viewMode: 1 } } } },
|
||||||
|
component: { name: 'd2p-images-format' },
|
||||||
|
align: 'center',
|
||||||
|
view: {
|
||||||
|
component: { props: { height: 100, width: 100 } }
|
||||||
|
},
|
||||||
|
// 接收时,处理数据
|
||||||
|
valueBuilder (row, col) {
|
||||||
|
const value = row[col.key]
|
||||||
|
if (value != null) {
|
||||||
|
row[col.key] = value.split(',')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -16,6 +16,8 @@ import { request } from '@/api/service'
|
||||||
import util from '@/libs/util'
|
import util from '@/libs/util'
|
||||||
import XEUtils from 'xe-utils'
|
import XEUtils from 'xe-utils'
|
||||||
import { urlPrefix as deptPrefix } from '@/views/system/dept/api'
|
import { urlPrefix as deptPrefix } from '@/views/system/dept/api'
|
||||||
|
import types from '@/config/d2p-extends/types'
|
||||||
|
const uploadUrl = util.baseURL() + 'api/system/file/'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
// vxe0
|
// vxe0
|
||||||
|
@ -105,7 +107,7 @@ Vue.use(D2pFullEditor, {
|
||||||
Vue.use(D2pDemoExtend)
|
Vue.use(D2pDemoExtend)
|
||||||
Vue.use(D2pFileUploader)
|
Vue.use(D2pFileUploader)
|
||||||
Vue.use(D2pUploader, {
|
Vue.use(D2pUploader, {
|
||||||
defaultType: 'cos',
|
defaultType: 'form',
|
||||||
cos: {
|
cos: {
|
||||||
domain: 'https://d2p-demo-1251260344.cos.ap-guangzhou.myqcloud.com',
|
domain: 'https://d2p-demo-1251260344.cos.ap-guangzhou.myqcloud.com',
|
||||||
bucket: 'd2p-demo-1251260344',
|
bucket: 'd2p-demo-1251260344',
|
||||||
|
@ -159,11 +161,25 @@ Vue.use(D2pUploader, {
|
||||||
domain: 'http://d2p.file.veryreader.com'
|
domain: 'http://d2p.file.veryreader.com'
|
||||||
},
|
},
|
||||||
form: {
|
form: {
|
||||||
action: util.baseURL() + 'upload/form/upload',
|
action: uploadUrl,
|
||||||
name: 'file'
|
name: 'file',
|
||||||
|
data: {}, // 上传附加参数
|
||||||
|
headers () {
|
||||||
|
return {
|
||||||
|
Authorization: 'JWT ' + util.cookies.get('token')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
type: 'form',
|
||||||
|
successHandle (ret, option) {
|
||||||
|
if (ret.data === null || ret.data === '') {
|
||||||
|
throw new Error('上传失败')
|
||||||
|
}
|
||||||
|
return { url: util.baseURL() + ret.data.url, key: option.data.key }
|
||||||
|
},
|
||||||
|
withCredentials: false // 是否带cookie
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
d2CrudPlus.util.columnResolve.addTypes(types)
|
||||||
// 修改官方字段类型
|
// 修改官方字段类型
|
||||||
const selectType = d2CrudPlus.util.columnResolve.getType('select')
|
const selectType = d2CrudPlus.util.columnResolve.getType('select')
|
||||||
selectType.component.props.color = 'auto' // 修改官方的字段类型,设置为支持自动染色
|
selectType.component.props.color = 'auto' // 修改官方的字段类型,设置为支持自动染色
|
||||||
|
@ -257,7 +273,7 @@ Vue.prototype.commonEndColumns = function (param = {}) {
|
||||||
type: 'table-selector',
|
type: 'table-selector',
|
||||||
dict: {
|
dict: {
|
||||||
cache: true,
|
cache: true,
|
||||||
url: '/api/system/dept/?limit=999&status=1',
|
url: deptPrefix + '?limit=999&status=1',
|
||||||
isTree: true,
|
isTree: true,
|
||||||
value: 'id', // 数据字典中value字段的属性名
|
value: 'id', // 数据字典中value字段的属性名
|
||||||
label: 'name', // 数据字典中label字段的属性名
|
label: 'name', // 数据字典中label字段的属性名
|
||||||
|
@ -267,7 +283,7 @@ Vue.prototype.commonEndColumns = function (param = {}) {
|
||||||
component
|
component
|
||||||
}) => {
|
}) => {
|
||||||
return request({
|
return request({
|
||||||
url: url,
|
url: url
|
||||||
}).then(ret => {
|
}).then(ret => {
|
||||||
return ret.data.data
|
return ret.data.data
|
||||||
})
|
})
|
||||||
|
|
|
@ -149,7 +149,7 @@ export default {
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: 'JWT ' + util.cookies.get('token')
|
Authorization: 'JWT ' + util.cookies.get('token')
|
||||||
},
|
},
|
||||||
fileList:[],
|
fileList: [],
|
||||||
userInfo: {
|
userInfo: {
|
||||||
name: '',
|
name: '',
|
||||||
gender: '',
|
gender: '',
|
||||||
|
@ -197,7 +197,7 @@ export default {
|
||||||
params: {}
|
params: {}
|
||||||
}).then((res) => {
|
}).then((res) => {
|
||||||
_self.userInfo = res.data
|
_self.userInfo = res.data
|
||||||
_self.fileList = [{name:'avatar.png',url:res.data.avatar}]
|
_self.fileList = [{ name: 'avatar.png', url: res.data.avatar }]
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
|
@ -278,10 +278,10 @@ export default {
|
||||||
* @param res
|
* @param res
|
||||||
* @param file
|
* @param file
|
||||||
*/
|
*/
|
||||||
handleAvatarSuccess(res, file) {
|
handleAvatarSuccess (res, file) {
|
||||||
console.log(11,res)
|
console.log(11, res)
|
||||||
this.fileList =[{ url: util.baseURL() + res.data.url, name:file.name }]
|
this.fileList = [{ url: util.baseURL() + res.data.url, name: file.name }]
|
||||||
this.userInfo.avatar = util.baseURL() + res.data.url;
|
this.userInfo.avatar = util.baseURL() + res.data.url
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,7 +42,7 @@ export default {
|
||||||
util.cookies.set('token', res.access)
|
util.cookies.set('token', res.access)
|
||||||
util.cookies.set('refresh', res.refresh)
|
util.cookies.set('refresh', res.refresh)
|
||||||
// 设置 vuex 用户信息
|
// 设置 vuex 用户信息
|
||||||
await dispatch('d2admin/user/set', { name: res.name, user_id: res.userId,avatar:res.avatar }, { root: true })
|
await dispatch('d2admin/user/set', { name: res.name, user_id: res.userId, avatar: res.avatar }, { root: true })
|
||||||
// 用户登录后从持久化数据加载一系列的设置
|
// 用户登录后从持久化数据加载一系列的设置
|
||||||
await dispatch('load')
|
await dispatch('load')
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
import { request } from '@/api/service'
|
import { request } from '@/api/service'
|
||||||
import util from '@/libs/util'
|
|
||||||
const uploadUrl = process.env.VUE_APP_API + '/api/system/img/'
|
|
||||||
export const crudOptions = (vm) => {
|
export const crudOptions = (vm) => {
|
||||||
return {
|
return {
|
||||||
pageOptions: {
|
pageOptions: {
|
||||||
|
@ -85,20 +83,6 @@ export const crudOptions = (vm) => {
|
||||||
form: {
|
form: {
|
||||||
component: {
|
component: {
|
||||||
props: {
|
props: {
|
||||||
uploader: {
|
|
||||||
action: uploadUrl,
|
|
||||||
name: 'file',
|
|
||||||
headers: {
|
|
||||||
Authorization: 'JWT ' + util.cookies.get('token')
|
|
||||||
},
|
|
||||||
type: 'form',
|
|
||||||
successHandle (ret, option) {
|
|
||||||
if (ret.data == null || ret.data === '') {
|
|
||||||
throw new Error('上传失败')
|
|
||||||
}
|
|
||||||
return { url: ret.data.data.url, key: option.data.key }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
elProps: { // 与el-uploader 配置一致
|
elProps: { // 与el-uploader 配置一致
|
||||||
multiple: false,
|
multiple: false,
|
||||||
limit: 5 // 限制5个文件
|
limit: 5 // 限制5个文件
|
||||||
|
@ -108,26 +92,6 @@ export const crudOptions = (vm) => {
|
||||||
span: 24
|
span: 24
|
||||||
},
|
},
|
||||||
helper: '限制文件大小不能超过50k'
|
helper: '限制文件大小不能超过50k'
|
||||||
},
|
|
||||||
valueResolve (row, col) {
|
|
||||||
const value = row[col.key]
|
|
||||||
if (value != null && value instanceof Array) {
|
|
||||||
if (value.length >= 0) {
|
|
||||||
row[col.key] = value[0]
|
|
||||||
} else {
|
|
||||||
row[col.key] = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
component: {
|
|
||||||
props: {
|
|
||||||
buildUrl (value, item) {
|
|
||||||
if (value && value.indexOf('http') !== 0) {
|
|
||||||
return '/api/upload/form/download?key=' + value
|
|
||||||
}
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -139,20 +103,6 @@ export const crudOptions = (vm) => {
|
||||||
form: {
|
form: {
|
||||||
component: {
|
component: {
|
||||||
props: {
|
props: {
|
||||||
uploader: {
|
|
||||||
action: uploadUrl,
|
|
||||||
name: 'file',
|
|
||||||
headers: {
|
|
||||||
Authorization: 'JWT ' + util.cookies.get('token')
|
|
||||||
},
|
|
||||||
type: 'form',
|
|
||||||
successHandle (ret, option) {
|
|
||||||
if (ret.data == null || ret.data === '') {
|
|
||||||
throw new Error('上传失败')
|
|
||||||
}
|
|
||||||
return { url: ret.data.data.url, key: option.data.key }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
elProps: { // 与el-uploader 配置一致
|
elProps: { // 与el-uploader 配置一致
|
||||||
multiple: false,
|
multiple: false,
|
||||||
limit: 5 // 限制5个文件
|
limit: 5 // 限制5个文件
|
||||||
|
@ -162,26 +112,6 @@ export const crudOptions = (vm) => {
|
||||||
span: 24
|
span: 24
|
||||||
},
|
},
|
||||||
helper: '限制文件大小不能超过50k'
|
helper: '限制文件大小不能超过50k'
|
||||||
},
|
|
||||||
valueResolve (row, col) {
|
|
||||||
const value = row[col.key]
|
|
||||||
if (value != null && value instanceof Array) {
|
|
||||||
if (value.length >= 0) {
|
|
||||||
row[col.key] = value[0]
|
|
||||||
} else {
|
|
||||||
row[col.key] = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
component: {
|
|
||||||
props: {
|
|
||||||
buildUrl (value, item) {
|
|
||||||
if (value && value.indexOf('http') !== 0) {
|
|
||||||
return '/api/upload/form/download?key=' + value
|
|
||||||
}
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
import util from '@/libs/util'
|
|
||||||
|
|
||||||
export const crudOptions = (vm) => {
|
export const crudOptions = (vm) => {
|
||||||
return {
|
return {
|
||||||
pageOptions: {
|
pageOptions: {
|
||||||
|
@ -92,11 +90,7 @@ export const crudOptions = (vm) => {
|
||||||
search: {
|
search: {
|
||||||
disabled: true
|
disabled: true
|
||||||
},
|
},
|
||||||
width: 220,
|
width: 220
|
||||||
valueBuilder (row, key) {
|
|
||||||
console.log(row, key)
|
|
||||||
row.url = `${util.baseURL()}media/${row.url}`
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '文件MD5',
|
title: '文件MD5',
|
||||||
|
@ -107,18 +101,7 @@ export const crudOptions = (vm) => {
|
||||||
},
|
},
|
||||||
form: {
|
form: {
|
||||||
disabled: false
|
disabled: false
|
||||||
},
|
|
||||||
valueResolve (row, col) {
|
|
||||||
const value = row[col.key]
|
|
||||||
if (value != null && value instanceof Array) {
|
|
||||||
if (value.length >= 0) {
|
|
||||||
row[col.key] = value[0]
|
|
||||||
} else {
|
|
||||||
row[col.key] = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '备注',
|
title: '备注',
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
import { request } from '@/api/service'
|
import { request } from '@/api/service'
|
||||||
import { BUTTON_STATUS_BOOL } from '@/config/button'
|
import { BUTTON_STATUS_BOOL } from '@/config/button'
|
||||||
import { urlPrefix as deptPrefix } from '../dept/api'
|
import { urlPrefix as deptPrefix } from '../dept/api'
|
||||||
import util from '@/libs/util'
|
|
||||||
|
|
||||||
const uploadUrl = util.baseURL() + 'api/system/file/'
|
|
||||||
export const crudOptions = (vm) => {
|
export const crudOptions = (vm) => {
|
||||||
return {
|
return {
|
||||||
pageOptions: {
|
pageOptions: {
|
||||||
|
@ -42,7 +40,7 @@ export const crudOptions = (vm) => {
|
||||||
text: '',
|
text: '',
|
||||||
size: 'small',
|
size: 'small',
|
||||||
type: 'warning',
|
type: 'warning',
|
||||||
icon: 'el-icon-refresh-left',
|
icon: 'el-icon-key',
|
||||||
show () {
|
show () {
|
||||||
return vm.hasPermissions('ResetPwd')
|
return vm.hasPermissions('ResetPwd')
|
||||||
},
|
},
|
||||||
|
@ -258,54 +256,21 @@ export const crudOptions = (vm) => {
|
||||||
{
|
{
|
||||||
title: '头像',
|
title: '头像',
|
||||||
key: 'avatar',
|
key: 'avatar',
|
||||||
type: 'avatar-uploader',
|
type: 'avatar-cropper',
|
||||||
width: 100,
|
width: 100,
|
||||||
align: 'left',
|
align: 'left',
|
||||||
form: {
|
form: {
|
||||||
component: {
|
component: {
|
||||||
props: {
|
props: {
|
||||||
uploader: {
|
|
||||||
action: uploadUrl,
|
|
||||||
headers: {
|
|
||||||
Authorization: 'JWT ' + util.cookies.get('token')
|
|
||||||
},
|
|
||||||
type: 'form',
|
|
||||||
successHandle (ret, option) {
|
|
||||||
if (ret.data === null || ret.data === '') {
|
|
||||||
throw new Error('上传失败')
|
|
||||||
}
|
|
||||||
return { url: util.baseURL() + ret.data.url, key: option.data.key }
|
|
||||||
}
|
|
||||||
},
|
|
||||||
elProps: { // 与el-uploader 配置一致
|
elProps: { // 与el-uploader 配置一致
|
||||||
multiple: true,
|
multiple: false,
|
||||||
limit: 5 // 限制5个文件
|
limit: 1 // 限制5个文件
|
||||||
},
|
},
|
||||||
sizeLimit: 100 * 1024 // 不能超过限制
|
sizeLimit: 500 * 1024 // 不能超过限制
|
||||||
},
|
},
|
||||||
span: 24
|
span: 24
|
||||||
},
|
},
|
||||||
helper: '限制文件大小不能超过50k'
|
helper: '限制文件大小不能超过500k'
|
||||||
},
|
|
||||||
valueResolve (row, col) {
|
|
||||||
const value = row[col.key]
|
|
||||||
if (value != null && value instanceof Array) {
|
|
||||||
if (value.length >= 0) {
|
|
||||||
row[col.key] = value[0]
|
|
||||||
} else {
|
|
||||||
row[col.key] = null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
component: {
|
|
||||||
props: {
|
|
||||||
buildUrl (value, item) {
|
|
||||||
if (value && value.indexOf('http') !== 0) {
|
|
||||||
return util.baseURL() + value
|
|
||||||
}
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue