Skip to content

Commit

Permalink
v-bind, v-on, search , Creator, Video
Browse files Browse the repository at this point in the history
  • Loading branch information
szuprefix committed Dec 11, 2019
1 parent 19c624c commit 85ab821
Show file tree
Hide file tree
Showing 6 changed files with 230 additions and 8 deletions.
133 changes: 133 additions & 0 deletions src/components/creator/Creator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
/**
* Created by denishuang on 2019/12/9.
*/

import Model from '../model/Model'
import queueLimit from '../../utils/async_queue'
import {pick, uniqWith, isEqual, filter} from 'lodash'
function Creator(model, options) {
model = typeof model === 'string' ? Model(model) : model
let moptions = options[model.appModel] || {}
let defaults = moptions.defaults || {}
let extraFields = moptions.extraFields || []
let creator = {
model,
foreignKeys: {},
plainFields: {},
defaults,
loadUFKOptions () {
let m = this.model
return m.loadOptions().then(() => {
let ufns = m.options.unique_together
if (ufns) {
ufns[0].forEach(fn => {
if (fn in defaults) {
return
}
let f = m.fieldConfigs[fn]
if (!f) {
return
}
if (f.model) {
this.foreignKeys[fn] = {...f, creator: Creator(f.model, options)}
} else {
this.plainFields[fn] = {...f}
}
})
}
extraFields.forEach(fn => {
this.plainFields[fn] = m.fieldConfigs[fn]
})
}
).then(() => {
return queueLimit(Object.values(this.foreignKeys), 3, (fk) => {
return fk.creator.loadUFKOptions()
})
})
},
getItems () {
let rs = []
Object.keys(this.foreignKeys).forEach((fkn) => {
let fk = this.foreignKeys[fkn]
let fcreator = fk.creator
let mlabel = fcreator.model.config.verbose_name
fk.items = fcreator.getItems().map(a => {
let name = `${fkn}.${a.name}`
let originName = a.name
let label = name.split('.').length === 2 ? `${mlabel}${a.label}` : a.label
let d = {...a, name, originName, label}
return d
})
rs = rs.concat(fk.items)
})
Object.values(this.plainFields).forEach((pf) => {
rs.push(pf)
})
// if (rs.length <= 1) {
// rs = [{name:'name', label: this.model.verbose_name}]
// }
return rs

},
claim (df) {
let rs = {}
Object.keys(this.foreignKeys).forEach((fkn) => {
let fk = this.foreignKeys[fkn]
let fcreator = fk.creator
let pfs = fk.items.map(a => a.name)
let sdf = uniqWith(df.map(r => pick(r, pfs)), isEqual)
sdf = sdf.map(r => {
let d = {}
fk.items.forEach(a => {
d[a.originName] = r[a.name]
})
return d
})
Object.assign(rs, fcreator.claim(sdf))
})
rs[this.model.appModel] = df
return rs
},
create (claimedData) {
let cds = claimedData[this.model.appModel]
return queueLimit(Object.keys(this.foreignKeys), 1, (fkn) => {
let fk = this.foreignKeys[fkn]
let fcreator = fk.creator
return fcreator.create(claimedData).then((fmap) => {
fmap.forEach((id, d) => {
let nd = {}
fk.items.forEach(a => {
nd[a.name] = d[a.originName]
})
filter(cds, nd).forEach(r => {
r[fk.name] = id
})
})
})

}).then(() => {
let map = new Map()
return queueLimit(cds, 3, r => {
let rd = Object.assign({}, defaults)
Object.keys(r).forEach(fn => {
if(!fn.includes('.')){
rd[fn] = r[fn]
}
})
return this.model.selectOrCreate(rd).then(d => {
map.set(r, d.id)
})
}).then(() => map)
})


},
run (df) {
return this.create(this.claim(df))
}

}
return creator
}

export default Creator
2 changes: 1 addition & 1 deletion src/components/form/Widget.vue
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
:controls="field.type === 'integer'" @change="fieldValueChanged">
</el-input-number>
<el-date-picker v-model="value[field.name]" :type="field.widget" value-format="yyyy-MM-ddTHH:mm:ss"
:placeholder="field.placeholder || field.label"
:placeholder="field.placeholder || field.label" :readonly="field.read_only"
v-else-if="['date','datetime'].includes(field.widget)"
@change="fieldValueChanged" :disabled="field.disabled">
</el-date-picker>
Expand Down
65 changes: 65 additions & 0 deletions src/components/media/qcloud/Video.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<template>
<video class="player-size" preload="auto" playsinline webkit-playsinline>
</video>

</template>
<script>
import load from 'load.js'
export default{
props: {
fileID: String,
appID: String
},
data () {
return {
libLoaded: false,
player: null
}
},
components: {},
created () {
this.loadLib()
},
methods: {
async loadLib() {
if (!window.TCPlayer) {
await load.parallel([
'//imgcache.qq.com/open/qcloud/video/tcplayer/tcplayer.css',
'//imgcache.qq.com/open/qcloud/video/tcplayer/tcplayer.min.js',
])
this.libLoaded = true
}
this.player = window.TCPlayer(this.$el, {
fileID: this.fileID,
appID: this.appID
})
}
},
computed: {}
}
</script>
<style>
.tcplayer {
margin: 0 auto;
}
/* 通过 css 设置播放器尺寸 这时<video>中的宽高属性将被覆盖*/
.player-size {
width: 640px;
height: 360px;
}
@media screen and (max-width: 640px) {
.player-size {
width: 100%;
height: 270px;
}
}
/* 设置logo在高分屏的显示样式 */
@media only screen and (min-device-pixel-ratio: 2), only screen and (-webkit-min-device-pixel-ratio: 2) {
.tcp-logo-img {
width: 50%;
}
}
</style>
15 changes: 15 additions & 0 deletions src/components/model/Model.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
*/
import {Register} from '../../utils/app_model'
import axios from '../../configs/axios'
import Qs from 'qs'
// import store from '../store'
export function joinErrors(errors) {
let es = {}
Expand Down Expand Up @@ -97,6 +98,20 @@ export default function (appModel, defaults, eventor) {
return data
}) // .catch((error) => this.onErrors(error))
},
selectOrCreate (d) {
let url = this.getListUrl()
return axios.get(`${url}?${Qs.stringify(d)}`).then(({data}) => {
if(data.count === 1) {
return data.results[0]
} else if (data.count === 0 ) {
return axios.post(url, d). then(({data}) => {
return data
})
} else {
throw Error('记录不唯一')
}
})
},
removeRelateObject (rel, id) {
this.data[rel] = this.data[rel].filter(a => a !== id)
return this.save()
Expand Down
16 changes: 10 additions & 6 deletions src/components/model/Table.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template>
<div>
<search v-model="search" :model="model" :exclude="_baseQueries" ref="search"
<search v-model="search" :model="model" :items="searchItems" :exclude="_baseQueries" ref="search" v-if="showSearch"
@change="onSearch"></search>
<batch-actions :items="batchActionItems" :count="selection.length" @done="refresh" :context="{selection}"
v-if="batchActionItems.length>0"></batch-actions>
Expand All @@ -16,8 +16,8 @@
</slot>
</el-drawer>

<remote-table :items="tableItems" :url="model.getListUrl()" ref="table" @loaded="onLoaded" v-if="optionLoaded"
:baseQueries="_baseQueries" v-bind="rtAttrs" v-on="$listeners">
<remote-table :items="tableItems" :url="model.getListUrl()" ref="table" v-if="optionLoaded"
v-bind="rtAttrs" v-on="$listeners">

<template slot="left" v-if="$slots.left">
<slot name="left"></slot>
Expand Down Expand Up @@ -49,6 +49,8 @@
props: {
appModel: String,
items: Array,
searchItems: Array,
showSearch: true,
baseQueries: {
type: Object, default: () => {
return {}
Expand Down Expand Up @@ -129,12 +131,13 @@
methods: {
init () {
this.model.loadOptionsAndViewsConfig().then((data) => {
this.$refs.search.init()
if(this.$refs.search) {
this.$refs.search.init()
}
this.parentQueries = Object.assign({}, this.getParentQueries())
return this.normalizeItems()
}).then(() => {
this.parentQueries = Object.assign({}, this.getParentQueries())
this.optionLoaded = true
// this.$refs.table.updateQueries({})
}).catch(this.onServerResponseError)
},
refresh () {
Expand Down Expand Up @@ -346,6 +349,7 @@
'selection-change': this.onSelectionChange,
title: this.model.config.verbose_name,
...this.$attrs,
baseQueries: this._baseQueries,
avairableActions: this.avairableActions
}
},
Expand Down
7 changes: 6 additions & 1 deletion src/components/table/RemoteTable.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
</template>
</x-table>
<!--<div class="pager-container">-->
<el-pagination v-if="count>pageSize || showPagger"
<el-pagination v-if="showPagger && count>pageSize"
background
layout="total, sizes, prev, pager, next, jumper"
:page-size="pageSize"
Expand Down Expand Up @@ -38,6 +38,11 @@
}
},
url: String,
showPagger: {
type: Boolean, default: function () {
return true
}
},
pageSize: {type: Number, default: () => DEFAULT_PAGE_SIZE},
},
data () {
Expand Down

0 comments on commit 85ab821

Please sign in to comment.