优化后台管理api

dependabot/npm_and_yarn/fir_admin/url-parse-1.5.10
MMXX 3 years ago
parent 7e15211fd2
commit 03a6202ee2
  1. 33
      fir_admin/src/api/app.js
  2. 22
      fir_admin/src/api/developer.js
  3. 9
      fir_admin/src/api/devices.js
  4. 20
      fir_admin/src/api/domain.js
  5. 20
      fir_admin/src/api/order.js
  6. 20
      fir_admin/src/api/report.js
  7. 13
      fir_admin/src/api/storage.js
  8. 20
      fir_admin/src/api/wxbind.js
  9. 15
      fir_admin/src/views/appinfos/AppDetail.vue
  10. 18
      fir_admin/src/views/appinfos/AppReleaseDetail.vue
  11. 20
      fir_admin/src/views/appinfos/AppReleaseList.vue
  12. 20
      fir_admin/src/views/appinfos/list.vue
  13. 15
      fir_admin/src/views/domain/Detail.vue
  14. 21
      fir_admin/src/views/domain/list.vue
  15. 15
      fir_admin/src/views/order/Detail.vue
  16. 18
      fir_admin/src/views/order/list.vue
  17. 15
      fir_admin/src/views/report/Detail.vue
  18. 14
      fir_admin/src/views/report/list.vue
  19. 15
      fir_admin/src/views/storage/Detail.vue
  20. 15
      fir_admin/src/views/storage/list.vue
  21. 17
      fir_admin/src/views/supersign/bill/list.vue
  22. 15
      fir_admin/src/views/supersign/developer/Detail.vue
  23. 26
      fir_admin/src/views/supersign/developer/list.vue
  24. 13
      fir_admin/src/views/supersign/devices/list.vue
  25. 8
      fir_admin/src/views/userinfos/UserDetail.vue
  26. 15
      fir_admin/src/views/wxbind/Detail.vue
  27. 14
      fir_admin/src/views/wxbind/list.vue
  28. 3
      fir_client/src/components/user/FirUserStorage.vue
  29. 29
      fir_ser/admin/urls.py
  30. 13
      fir_ser/admin/utils.py
  31. 5
      fir_ser/admin/utils/__init__.py
  32. 23
      fir_ser/admin/utils/exception.py
  33. 296
      fir_ser/admin/utils/serializer.py
  34. 52
      fir_ser/admin/utils/utils.py
  35. 157
      fir_ser/admin/views/app.py
  36. 97
      fir_ser/admin/views/domain.py
  37. 43
      fir_ser/admin/views/login.py
  38. 110
      fir_ser/admin/views/order.py
  39. 68
      fir_ser/admin/views/report.py
  40. 82
      fir_ser/admin/views/storage.py
  41. 216
      fir_ser/admin/views/supersign.py
  42. 121
      fir_ser/admin/views/user.py
  43. 2
      fir_ser/api/utils/modelutils.py
  44. 233
      fir_ser/api/utils/serializer.py
  45. 2
      fir_ser/api/views/storage.py
  46. 15
      fir_ser/common/cache/invalid.py
  47. 15
      fir_ser/fir_ser/settings.py
  48. 3
      fir_ser/requirements.txt

@ -1,6 +1,6 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getAppInfos(query) { export function getAppList(query) {
return request({ return request({
url: '/app/info', url: '/app/info',
method: 'get', method: 'get',
@ -8,23 +8,29 @@ export function getAppInfos(query) {
}) })
} }
export function updateAppInfo(data) { export function getAppInfos(pk) {
return request({ return request({
url: '/app/info', url: '/app/info/' + pk,
method: 'get'
})
}
export function updateAppInfo(pk, data) {
return request({
url: '/app/info/' + pk,
method: 'put', method: 'put',
data data
}) })
} }
export function deleteApp(data) { export function deleteApp(pk) {
return request({ return request({
url: '/app/info', url: '/app/info/' + pk,
method: 'delete', method: 'delete'
data
}) })
} }
export function getAppReleaseInfos(query) { export function getAppReleaseList(query) {
return request({ return request({
url: '/app/release/info', url: '/app/release/info',
method: 'get', method: 'get',
@ -32,9 +38,16 @@ export function getAppReleaseInfos(query) {
}) })
} }
export function updateReleaseAppInfo(data) { export function getAppReleaseInfos(pk) {
return request({ return request({
url: '/app/release/info', url: '/app/release/info/' + pk,
method: 'get'
})
}
export function updateReleaseAppInfo(pk, data) {
return request({
url: '/app/release/info/' + pk,
method: 'put', method: 'put',
data data
}) })

@ -1,6 +1,6 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getDeveloperInfo(query) { export function getDeveloperList(query) {
return request({ return request({
url: '/developer/info', url: '/developer/info',
method: 'get', method: 'get',
@ -8,15 +8,22 @@ export function getDeveloperInfo(query) {
}) })
} }
export function updatedeveloperInfo(data) { export function getDeveloperInfo(pk) {
return request({ return request({
url: '/developer/info', url: '/developer/info/' + pk,
method: 'get'
})
}
export function updatedeveloperInfo(pk, data) {
return request({
url: '/developer/info/' + pk,
method: 'put', method: 'put',
data data
}) })
} }
export function getBillInfo(query) { export function getBillList(query) {
return request({ return request({
url: '/bill/info', url: '/bill/info',
method: 'get', method: 'get',
@ -31,11 +38,10 @@ export function addBillInfo(data) {
data data
}) })
} }
export function delBillInfo(data) { export function delBillInfo(pk) {
return request({ return request({
url: '/bill/info', url: '/bill/info/' + pk,
method: 'delete', method: 'delete'
data
}) })
} }

@ -1,6 +1,6 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getDevicesInfo(query) { export function getDevicesList(query) {
return request({ return request({
url: '/devices/info', url: '/devices/info',
method: 'get', method: 'get',
@ -8,10 +8,3 @@ export function getDevicesInfo(query) {
}) })
} }
export function updatedevicesInfo(data) {
return request({
url: '/devices/info',
method: 'put',
data
})
}

@ -1,6 +1,6 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getDomainInfos(query) { export function getDomainList(query) {
return request({ return request({
url: '/domain/info', url: '/domain/info',
method: 'get', method: 'get',
@ -8,18 +8,24 @@ export function getDomainInfos(query) {
}) })
} }
export function updateDomainInfo(data) { export function getDomainInfos(pk) {
return request({ return request({
url: '/domain/info', url: '/domain/info/' + pk,
method: 'get'
})
}
export function updateDomainInfo(pk, data) {
return request({
url: '/domain/info/' + pk,
method: 'put', method: 'put',
data data
}) })
} }
export function deleteDomain(data) { export function deleteDomain(pk) {
return request({ return request({
url: '/domain/info', url: '/domain/info/' + pk,
method: 'delete', method: 'delete'
data
}) })
} }

@ -1,6 +1,6 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getOrderInfo(query) { export function getOrderList(query) {
return request({ return request({
url: '/order/info', url: '/order/info',
method: 'get', method: 'get',
@ -8,18 +8,24 @@ export function getOrderInfo(query) {
}) })
} }
export function updateOrderInfo(data) { export function getOrderInfo(pk) {
return request({ return request({
url: '/order/info', url: '/order/info/' + pk,
method: 'get'
})
}
export function updateOrderInfo(pk, data) {
return request({
url: '/order/info/' + pk,
method: 'put', method: 'put',
data data
}) })
} }
export function deleteOrderInfo(data) { export function deleteOrderInfo(pk) {
return request({ return request({
url: '/order/info', url: '/order/info/' + pk,
method: 'delete', method: 'delete'
data
}) })
} }
export function createOrderInfo(data) { export function createOrderInfo(data) {

@ -1,6 +1,6 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getAppReportIfo(query) { export function getAppReportList(query) {
return request({ return request({
url: '/report/info', url: '/report/info',
method: 'get', method: 'get',
@ -8,18 +8,24 @@ export function getAppReportIfo(query) {
}) })
} }
export function updateAppReportIfo(data) { export function getAppReportIfo(pk) {
return request({ return request({
url: '/report/info', url: '/report/info/' + pk,
method: 'get'
})
}
export function updateAppReportIfo(pk, data) {
return request({
url: '/report/info/' + pk,
method: 'put', method: 'put',
data data
}) })
} }
export function deleteAppReportIfo(data) { export function deleteAppReportIfo(pk) {
return request({ return request({
url: '/report/info', url: '/report/info/' + pk,
method: 'delete', method: 'delete'
data
}) })
} }

@ -1,6 +1,6 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getStorageInfo(query) { export function getStorageList(query) {
return request({ return request({
url: '/storage/info', url: '/storage/info',
method: 'get', method: 'get',
@ -8,9 +8,16 @@ export function getStorageInfo(query) {
}) })
} }
export function updateStorageInfo(data) { export function getStorageInfo(pk) {
return request({ return request({
url: '/storage/info', url: '/storage/info/' + pk,
method: 'get'
})
}
export function updateStorageInfo(pk, data) {
return request({
url: '/storage/info/' + pk,
method: 'put', method: 'put',
data data
}) })

@ -1,6 +1,6 @@
import request from '@/utils/request' import request from '@/utils/request'
export function getWxBindInfos(query) { export function getWxBindList(query) {
return request({ return request({
url: '/wxbind/info', url: '/wxbind/info',
method: 'get', method: 'get',
@ -8,18 +8,24 @@ export function getWxBindInfos(query) {
}) })
} }
export function updateWxBindInfo(data) { export function getWxBindInfos(pk) {
return request({ return request({
url: '/wxbind/info', url: '/wxbind/info/' + pk,
method: 'get'
})
}
export function updateWxBindInfo(pk,data) {
return request({
url: '/wxbind/info/' + pk,
method: 'put', method: 'put',
data data
}) })
} }
export function deleteWxBind(data) { export function deleteWxBind(pk) {
return request({ return request({
url: '/wxbind/info', url: '/wxbind/info/' + pk,
method: 'delete', method: 'delete'
data
}) })
} }

@ -264,29 +264,30 @@ export default {
return { return {
postForm: Object.assign({}, defaultForm), postForm: Object.assign({}, defaultForm),
loading: false, loading: false,
is_edit: false is_edit: false,
id: ''
} }
}, },
computed: { computed: {
}, },
created() { created() {
if (this.isEdit) { if (this.isEdit) {
const id = this.$route.params && this.$route.params.id this.id = this.$route.params && this.$route.params.id
this.fetchData(id) this.fetchData(this.id)
} }
}, },
methods: { methods: {
fetchData(id) { fetchData(id) {
getAppInfos({ id: id }).then(response => { getAppInfos(id).then(response => {
if (response.data.length === 1) { if (response.data) {
this.postForm = response.data[0] this.postForm = response.data
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)
}) })
}, },
updateData() { updateData() {
updateAppInfo(this.postForm).then(response => { updateAppInfo(this.id, this.postForm).then(response => {
this.$message.success('更新成功') this.$message.success('更新成功')
this.postForm = response.data this.postForm = response.data
}).catch(err => { }).catch(err => {

@ -161,28 +161,28 @@ export default {
return { return {
postForm: Object.assign({}, defaultForm), postForm: Object.assign({}, defaultForm),
loading: false, loading: false,
is_edit: false is_edit: false,
id: ''
} }
}, },
computed: { computed: {
}, },
created() { created() {
const id = this.$route.params && this.$route.params.id this.id = this.$route.params && this.$route.params.id
const app_id = this.$route.params && this.$route.params.app_id this.fetchData(this.id)
this.fetchData(id, app_id)
}, },
methods: { methods: {
fetchData(id, app_id) { fetchData(id) {
getAppReleaseInfos({ id: id, app_id: app_id }).then(response => { getAppReleaseInfos(id).then(response => {
if (response.data.length === 1) { if (response.data) {
this.postForm = response.data[0] this.postForm = response.data
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)
}) })
}, },
updateData() { updateData() {
updateReleaseAppInfo(this.postForm).then(response => { updateReleaseAppInfo(this.id, this.postForm).then(response => {
this.$message.success('更新成功') this.$message.success('更新成功')
this.postForm = response.data this.postForm = response.data
}).catch(err => { }).catch(err => {

@ -2,7 +2,7 @@
<div class="app-container"> <div class="app-container">
<div class="filter-container"> <div class="filter-container">
<el-input v-model="listQuery.release_id" placeholder="release_id" style="width: 250px;" class="filter-item" clearable @keyup.enter.native="handleFilter" /> <el-input v-model="listQuery.release_id" placeholder="release_id" style="width: 250px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -86,7 +86,7 @@
</template> </template>
<script> <script>
import { getAppReleaseInfos, downloadAppReleaseInfos } from '@/api/app' import { downloadAppReleaseInfos, getAppReleaseList } from '@/api/app'
import { baseFilter } from '@/utils' import { baseFilter } from '@/utils'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -135,11 +135,9 @@ export default {
app_id: undefined, app_id: undefined,
download_token: undefined, download_token: undefined,
release_id: undefined, release_id: undefined,
sort: '-created_time' ordering: '-created_time'
}, },
sortOptions, sortOptions
type_choices: [],
status_choices: []
} }
}, },
created() { created() {
@ -168,13 +166,9 @@ export default {
}, },
fetchData() { fetchData() {
this.listLoading = true this.listLoading = true
getAppReleaseInfos(this.listQuery).then(response => { getAppReleaseList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
if (this.list && this.list.length > 0) { this.total = response.data.count
this.type_choices = this.list[0].type_choices
this.status_choices = this.list[0].status_choices
}
this.total = response.total
this.listLoading = false this.listLoading = false
}) })
} }

@ -4,7 +4,7 @@
<el-input v-model="listQuery.bundle_id" placeholder="Bundle_Id" style="width: 250px;" class="filter-item" clearable @keyup.enter.native="handleFilter" /> <el-input v-model="listQuery.bundle_id" placeholder="Bundle_Id" style="width: 250px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />
<el-input v-model="listQuery.name" placeholder="应用名称" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" /> <el-input v-model="listQuery.name" placeholder="应用名称" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />
<el-input v-model="listQuery.short" placeholder="短连接" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" /> <el-input v-model="listQuery.short" placeholder="短连接" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />
<el-input v-model="listQuery.domain_name" placeholder="应用专属访问域名" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" /> <!-- <el-input v-model="listQuery.domain_name" placeholder="应用专属访问域名" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />-->
<el-select v-if="type_choices" v-model="listQuery.type" placeholder="应用类型" clearable class="filter-item" style="width: 120px" @change="handleFilter"> <el-select v-if="type_choices" v-model="listQuery.type" placeholder="应用类型" clearable class="filter-item" style="width: 120px" @change="handleFilter">
<el-option v-for="item in type_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in type_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
@ -12,7 +12,7 @@
<el-option v-for="item in status_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in status_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
<el-input v-model="listQuery.user_id" placeholder="用户ID" style="width: 140px;" class="filter-item" clearable @keyup.enter.native="handleFilter" /> <el-input v-model="listQuery.user_id" placeholder="用户ID" style="width: 140px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -126,13 +126,13 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="fetchData" /> <pagination v-show="count>0" :total="count" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="fetchData" />
</div> </div>
</template> </template>
<script> <script>
import { getAppInfos, deleteApp } from '@/api/app' import { deleteApp, getAppList } from '@/api/app'
import { baseFilter } from '@/utils' import { baseFilter } from '@/utils'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -180,13 +180,13 @@ export default {
return { return {
list: null, list: null,
listLoading: true, listLoading: true,
total: 0, count: 0,
listQuery: { listQuery: {
page: 1, page: 1,
limit: 10, limit: 10,
name: undefined, name: undefined,
bundle_id: undefined, bundle_id: undefined,
sort: '-count_hits', ordering: '-count_hits',
type: undefined, type: undefined,
domain_name: undefined, domain_name: undefined,
user_id: undefined user_id: undefined
@ -209,7 +209,7 @@ export default {
type: 'warning' type: 'warning'
}).then(() => { }).then(() => {
this.listLoading = true this.listLoading = true
deleteApp({ id: app_id }).then(response => { deleteApp(app_id).then(response => {
this.$message.success('删除成功') this.$message.success('删除成功')
this.fetchData() this.fetchData()
this.listLoading = false this.listLoading = false
@ -227,13 +227,13 @@ export default {
}, },
fetchData() { fetchData() {
this.listLoading = true this.listLoading = true
getAppInfos(this.listQuery).then(response => { getAppList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
if (this.list && this.list.length > 0) { if (this.list && this.list.length > 0) {
this.type_choices = this.list[0].type_choices this.type_choices = this.list[0].type_choices
this.status_choices = this.list[0].status_choices this.status_choices = this.list[0].status_choices
} }
this.total = response.total this.count = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -107,26 +107,27 @@ export default {
postForm: Object.assign({}, defaultForm), postForm: Object.assign({}, defaultForm),
loading: false, loading: false,
is_edit: false, is_edit: false,
domain_state_choices domain_state_choices,
id: ''
} }
}, },
computed: {}, computed: {},
created() { created() {
const id = this.$route.params && this.$route.params.id this.id = this.$route.params && this.$route.params.id
this.fetchData(id) this.fetchData(this.id)
}, },
methods: { methods: {
fetchData(id) { fetchData(id) {
getDomainInfos({ id: id }).then(response => { getDomainInfos(id).then(response => {
if (response.data.length === 1) { if (response.data) {
this.postForm = response.data[0] this.postForm = response.data
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)
}) })
}, },
updateData() { updateData() {
updateDomainInfo(this.postForm).then(response => { updateDomainInfo(this.id, this.postForm).then(response => {
this.$message.success('更新成功') this.$message.success('更新成功')
this.postForm = response.data this.postForm = response.data
}).catch(err => { }).catch(err => {

@ -10,7 +10,7 @@
<el-select v-model="listQuery.is_enable" placeholder="域名绑定状态" clearable class="filter-item" style="width: 140px" @change="handleFilter"> <el-select v-model="listQuery.is_enable" placeholder="域名绑定状态" clearable class="filter-item" style="width: 140px" @change="handleFilter">
<el-option v-for="item in domain_state_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in domain_state_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -85,7 +85,7 @@
</template> </template>
<script> <script>
import { getDomainInfos, deleteDomain } from '@/api/domain' import { deleteDomain, getDomainList } from '@/api/domain'
import { baseFilter } from '@/utils' import { baseFilter } from '@/utils'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -143,7 +143,7 @@ export default {
page: 1, page: 1,
limit: 10, limit: 10,
user_id: undefined, user_id: undefined,
sort: '-created_time', ordering: '-created_time',
domain_name: undefined, domain_name: undefined,
app_name: undefined, app_name: undefined,
domain_type: undefined, domain_type: undefined,
@ -164,13 +164,8 @@ export default {
}, },
methods: { methods: {
remove_domain(domain_id) { remove_domain(domain_id) {
deleteDomain({ id: domain_id }).then(response => { deleteDomain(domain_id).then(response => {
this.list = response.data this.fetchData()
if (this.list && this.list.length > 0) {
this.domain_type_choices = this.list[0].domain_type_choices
}
this.total = response.total
this.listLoading = false
}) })
}, },
handleFilter() { handleFilter() {
@ -179,12 +174,12 @@ export default {
}, },
fetchData() { fetchData() {
this.listLoading = true this.listLoading = true
getDomainInfos(this.listQuery).then(response => { getDomainList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
if (this.list && this.list.length > 0) { if (this.list && this.list.length > 0) {
this.domain_type_choices = this.list[0].domain_type_choices this.domain_type_choices = this.list[0].domain_type_choices
} }
this.total = response.total this.total = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -142,26 +142,27 @@ export default {
return { return {
postForm: Object.assign({}, defaultForm), postForm: Object.assign({}, defaultForm),
loading: false, loading: false,
is_edit: false is_edit: false,
id: ''
} }
}, },
computed: {}, computed: {},
created() { created() {
const id = this.$route.params && this.$route.params.id this.id = this.$route.params && this.$route.params.id
this.fetchData(id) this.fetchData(this.id)
}, },
methods: { methods: {
fetchData(id) { fetchData(id) {
getOrderInfo({ id: id }).then(response => { getOrderInfo(id).then(response => {
if (response.data.length === 1) { if (response.data) {
this.postForm = response.data[0] this.postForm = response.data
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)
}) })
}, },
updateData() { updateData() {
updateOrderInfo(this.postForm).then(response => { updateOrderInfo(this.id, this.postForm).then(response => {
this.$message.success('更新成功') this.$message.success('更新成功')
this.postForm = response.data this.postForm = response.data
}).catch(err => { }).catch(err => {

@ -14,7 +14,7 @@
<el-select v-model="listQuery.order_type" placeholder="订单类型" clearable class="filter-item" style="width: 140px" @change="handleFilter"> <el-select v-model="listQuery.order_type" placeholder="订单类型" clearable class="filter-item" style="width: 140px" @change="handleFilter">
<el-option v-for="item in order_type_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in order_type_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -117,7 +117,7 @@
</template> </template>
<script> <script>
import { getOrderInfo, deleteOrderInfo } from '@/api/order' import { deleteOrderInfo, getOrderList } from '@/api/order'
import { baseFilter } from '@/utils' import { baseFilter } from '@/utils'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -126,7 +126,9 @@ const sortOptions = [
{ label: '创建时间 Ascending', key: 'created_time' }, { label: '创建时间 Ascending', key: 'created_time' },
{ label: '创建时间 Descending', key: '-created_time' }, { label: '创建时间 Descending', key: '-created_time' },
{ label: '付款时间 Ascending', key: 'pay_time' }, { label: '付款时间 Ascending', key: 'pay_time' },
{ label: '付款时间 Descending', key: '-pay_time' } { label: '付款时间 Descending', key: '-pay_time' },
{ label: '付款金额 Ascending', key: 'actual_amount' },
{ label: '付款金额 Descending', key: '-actual_amount' }
] ]
export default { export default {
@ -190,7 +192,7 @@ export default {
page: 1, page: 1,
limit: 10, limit: 10,
user_id: undefined, user_id: undefined,
sort: '-created_time', ordering: '-created_time',
payment_type: undefined, payment_type: undefined,
payment_name: undefined, payment_name: undefined,
payment_number: undefined, payment_number: undefined,
@ -213,7 +215,7 @@ export default {
}, },
methods: { methods: {
remove_order_info(order_info) { remove_order_info(order_info) {
deleteOrderInfo({ id: order_info.id }).then(response => { deleteOrderInfo(order_info.id).then(response => {
this.list = response.data this.list = response.data
if (response.code === 1000) { if (response.code === 1000) {
this.fetchData() this.fetchData()
@ -228,14 +230,14 @@ export default {
}, },
fetchData() { fetchData() {
this.listLoading = true this.listLoading = true
getOrderInfo(this.listQuery).then(response => { getOrderList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
if (this.list && this.list.length > 0) { if (this.list && this.list.length > 0) {
this.payment_type_choices = this.list[0].payment_type_choices this.payment_type_choices = this.list[0].payment_type_choices
this.status_choices = this.list[0].status_choices this.status_choices = this.list[0].status_choices
this.order_type_choices = this.list[0].order_type_choices this.order_type_choices = this.list[0].order_type_choices
} }
this.total = response.total this.total = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -119,26 +119,27 @@ export default {
return { return {
postForm: Object.assign({}, defaultForm), postForm: Object.assign({}, defaultForm),
loading: false, loading: false,
is_edit: false is_edit: false,
id: ''
} }
}, },
computed: {}, computed: {},
created() { created() {
const id = this.$route.params && this.$route.params.id this.id = this.$route.params && this.$route.params.id
this.fetchData(id) this.fetchData(this.id)
}, },
methods: { methods: {
fetchData(id) { fetchData(id) {
getAppReportIfo({ id: id }).then(response => { getAppReportIfo(this.id).then(response => {
if (response.data.length === 1) { if (response.data) {
this.postForm = response.data[0] this.postForm = response.data
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)
}) })
}, },
updateData() { updateData() {
updateAppReportIfo(this.postForm).then(response => { updateAppReportIfo(this.id, this.postForm).then(response => {
this.$message.success('更新成功') this.$message.success('更新成功')
this.postForm = response.data this.postForm = response.data
}).catch(err => { }).catch(err => {

@ -13,7 +13,7 @@
<el-option v-for="item in status_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in status_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -103,7 +103,7 @@
</template> </template>
<script> <script>
import { getAppReportIfo, deleteAppReportIfo } from '@/api/report' import { deleteAppReportIfo, getAppReportList } from '@/api/report'
import { baseFilter } from '@/utils' import { baseFilter } from '@/utils'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -174,7 +174,7 @@ export default {
page: 1, page: 1,
limit: 10, limit: 10,
app_id: undefined, app_id: undefined,
sort: '-created_time', ordering: '-created_time',
report_type: undefined, report_type: undefined,
app_name: undefined, app_name: undefined,
bundle_id: undefined, bundle_id: undefined,
@ -197,7 +197,7 @@ export default {
}, },
methods: { methods: {
remove_order_info(order_info) { remove_order_info(order_info) {
deleteAppReportIfo({ id: order_info.id }).then(response => { deleteAppReportIfo(order_info.id).then(response => {
this.list = response.data this.list = response.data
if (response.code === 1000) { if (response.code === 1000) {
this.fetchData() this.fetchData()
@ -212,13 +212,13 @@ export default {
}, },
fetchData() { fetchData() {
this.listLoading = true this.listLoading = true
getAppReportIfo(this.listQuery).then(response => { getAppReportList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
if (this.list && this.list.length > 0) { if (this.list && this.list.length > 0) {
this.report_type_choices = this.list[0].report_type_choices this.report_type_choices = this.list[0].report_type_choices
this.status_choices = this.list[0].status_choices this.status_choices = this.list[0].status_choices
} }
this.total = response.total this.total = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -147,26 +147,27 @@ export default {
return { return {
postForm: Object.assign({}, defaultForm), postForm: Object.assign({}, defaultForm),
loading: false, loading: false,
is_edit: false is_edit: false,
id: ''
} }
}, },
computed: {}, computed: {},
created() { created() {
const id = this.$route.params && this.$route.params.id this.id = this.$route.params && this.$route.params.id
this.fetchData(id) this.fetchData(this.id)
}, },
methods: { methods: {
fetchData(id) { fetchData(id) {
getStorageInfo({ id: id }).then(response => { getStorageInfo(id).then(response => {
if (response.data.length === 1) { if (response.data) {
this.postForm = response.data[0] this.postForm = response.data
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)
}) })
}, },
updateData() { updateData() {
updateStorageInfo(this.postForm).then(response => { updateStorageInfo(this.id, this.postForm).then(response => {
this.$message.success('更新成功') this.$message.success('更新成功')
this.postForm = response.data this.postForm = response.data
}).catch(err => { }).catch(err => {

@ -9,7 +9,7 @@
<el-select v-model="listQuery.storage_type" placeholder="存储类型" clearable class="filter-item" style="width: 140px" @change="handleFilter"> <el-select v-model="listQuery.storage_type" placeholder="存储类型" clearable class="filter-item" style="width: 140px" @change="handleFilter">
<el-option v-for="item in storage_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in storage_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -93,7 +93,7 @@
</template> </template>
<script> <script>
import { getStorageInfo } from '@/api/storage' import { getStorageList } from '@/api/storage'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -160,12 +160,12 @@ export default {
page: 1, page: 1,
limit: 10, limit: 10,
name: undefined, name: undefined,
sort: '-created_time',
bucket_name: undefined, bucket_name: undefined,
access_key: undefined, access_key: undefined,
storage_type: undefined, storage_type: undefined,
domain_name: undefined, domain_name: undefined,
used_id: undefined user_id: undefined,
ordering: '-created_time'
}, },
sortOptions, sortOptions,
storage_choices: [] storage_choices: []
@ -186,12 +186,13 @@ export default {
}, },
fetchData() { fetchData() {
this.listLoading = true this.listLoading = true
getStorageInfo(this.listQuery).then(response => { getStorageList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
console.log(this.list)
if (this.list && this.list.length > 0) { if (this.list && this.list.length > 0) {
this.storage_choices = this.list[0].storage_choices this.storage_choices = this.list[0].storage_choices
} }
this.total = response.total this.total = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -8,7 +8,7 @@
<el-select v-model="listQuery.action" placeholder="充值类型" clearable class="filter-item" style="width: 140px" @change="handleFilter"> <el-select v-model="listQuery.action" placeholder="充值类型" clearable class="filter-item" style="width: 140px" @change="handleFilter">
<el-option v-for="item in action_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in action_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -96,7 +96,7 @@
<script> <script>
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' import waves from '@/directive/waves'
import { getBillInfo, delBillInfo } from '@/api/developer' import { delBillInfo, getBillList } from '@/api/developer'
const sortOptions = [ const sortOptions = [
{ label: '创建时间 Ascending', key: 'created_time' }, { label: '创建时间 Ascending', key: 'created_time' },
@ -158,7 +158,7 @@ export default {
listQuery: { listQuery: {
page: 1, page: 1,
limit: 10, limit: 10,
sort: '-created_time', ordering: '-created_time',
action: undefined, action: undefined,
app_id: undefined, app_id: undefined,
to_user_id: undefined, to_user_id: undefined,
@ -179,22 +179,21 @@ export default {
this.listQuery.page = 1 this.listQuery.page = 1
this.fetchData() this.fetchData()
}, },
delbill(app_id) { delbill(id) {
delBillInfo({ id: app_id }).then(response => { delBillInfo(id).then(response => {
this.$message.success('删除成功') this.$message.success('删除成功')
this.fetchData() this.fetchData()
this.listLoading = false this.listLoading = false
}) })
}, },
fetchData() { fetchData() {
console.log(this.listQuery)
this.listLoading = true this.listLoading = true
getBillInfo(this.listQuery).then(response => { getBillList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
if (this.list && this.list.length > 0) { if (this.list && this.list.length > 0) {
this.action_choices = this.list[0].action_choices this.action_choices = this.list[0].action_choices
} }
this.total = response.total this.total = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -154,26 +154,27 @@ export default {
return { return {
postForm: Object.assign({}, defaultForm), postForm: Object.assign({}, defaultForm),
loading: false, loading: false,
is_edit: false is_edit: false,
id: ''
} }
}, },
computed: {}, computed: {},
created() { created() {
const id = this.$route.params && this.$route.params.id this.id = this.$route.params && this.$route.params.id
this.fetchData(id) this.fetchData(this.id)
}, },
methods: { methods: {
fetchData(id) { fetchData(id) {
getDeveloperInfo({ id: id }).then(response => { getDeveloperInfo(id).then(response => {
if (response.data.length === 1) { if (response.data) {
this.postForm = response.data[0] this.postForm = response.data
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)
}) })
}, },
updateData() { updateData() {
updatedeveloperInfo(this.postForm).then(response => { updatedeveloperInfo(this.id, this.postForm).then(response => {
this.$message.success('更新成功') this.$message.success('更新成功')
this.postForm = response.data this.postForm = response.data
}).catch(err => { }).catch(err => {

@ -9,7 +9,7 @@
<el-select v-model="listQuery.auth_type" placeholder="账户类型" clearable class="filter-item" style="width: 140px" @change="handleFilter"> <el-select v-model="listQuery.auth_type" placeholder="账户类型" clearable class="filter-item" style="width: 140px" @change="handleFilter">
<el-option v-for="item in auth_type_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in auth_type_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -73,7 +73,7 @@
<el-table-column class-name="status-col" label="是否激活" width="80" align="center"> <el-table-column class-name="status-col" label="是否激活" width="80" align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag :type="scope.row.is_actived | statusFilter">{{ scope.row.is_actived }}</el-tag> <el-tag :type="scope.row.is_actived | statusFilter">{{ scope.row |StatusNameFilter }}</el-tag>
</template> </template>
</el-table-column> </el-table-column>
@ -100,9 +100,9 @@
查看编辑 查看编辑
</el-button> </el-button>
</router-link> </router-link>
<el-button type="danger" size="mini" @click="deleteApp(scope.row.id)"> <!-- <el-button type="danger" size="mini" @click="deleteApp(scope.row.id)">-->
删除 <!-- 删除-->
</el-button> <!-- </el-button>-->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -112,7 +112,7 @@
</template> </template>
<script> <script>
import { getDeveloperInfo } from '@/api/developer' import { getDeveloperList } from '@/api/developer'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -156,7 +156,7 @@ export default {
} }
return statusMap[status] return statusMap[status]
}, },
appStatusNameFilter(row) { StatusNameFilter(row) {
for (const r of row.status_choices) { for (const r of row.status_choices) {
if (r.id === row.status) { if (r.id === row.status) {
return r.name return r.name
@ -180,7 +180,7 @@ export default {
listQuery: { listQuery: {
page: 1, page: 1,
limit: 10, limit: 10,
sort: '-created_time', ordering: '-created_time',
issuer_id: undefined, issuer_id: undefined,
private_key_id: undefined, private_key_id: undefined,
certid: undefined, certid: undefined,
@ -189,7 +189,8 @@ export default {
auth_type: undefined auth_type: undefined
}, },
sortOptions, sortOptions,
auth_type_choices: [] auth_type_choices: [],
status_choices: []
} }
}, },
created() { created() {
@ -202,12 +203,13 @@ export default {
}, },
fetchData() { fetchData() {
this.listLoading = true this.listLoading = true
getDeveloperInfo(this.listQuery).then(response => { getDeveloperList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
if (this.list && this.list.length > 0) { if (this.list && this.list.length > 0) {
this.auth_type_choices = this.list[0].auth_type_choices this.auth_type_choices = this.list[0].auth_type_choices
this.status_choices = this.list[0].status_choices
} }
this.total = response.total this.total = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -8,7 +8,7 @@
<el-input v-model="listQuery.bundle_id" placeholder="BundleID" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" /> <el-input v-model="listQuery.bundle_id" placeholder="BundleID" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />
<el-input v-model="listQuery.short" placeholder="短连接" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" /> <el-input v-model="listQuery.short" placeholder="短连接" style="width: 200px;" class="filter-item" clearable @keyup.enter.native="handleFilter" />
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -94,7 +94,7 @@
</template> </template>
<script> <script>
import { getDevicesInfo } from '@/api/devices' import { getDevicesList } from '@/api/devices'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -158,7 +158,7 @@ export default {
listQuery: { listQuery: {
page: 1, page: 1,
limit: 10, limit: 10,
sort: '-created_time', ordering: '-created_time',
issuer_id: undefined, issuer_id: undefined,
short: undefined, short: undefined,
bundle_id: undefined, bundle_id: undefined,
@ -180,14 +180,13 @@ export default {
this.fetchData() this.fetchData()
}, },
fetchData() { fetchData() {
console.log(this.listQuery)
this.listLoading = true this.listLoading = true
getDevicesInfo(this.listQuery).then(response => { getDevicesList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
if (this.list && this.list.length > 0) { if (this.list && this.list.length > 0) {
this.auth_type_choices = this.list[0].auth_type_choices this.auth_type_choices = this.list[0].auth_type_choices
} }
this.total = response.total this.total = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -247,7 +247,7 @@
import { validURL } from '@/utils/validate' import { validURL } from '@/utils/validate'
import { getUserInfos, updateUserInfo } from '@/api/user' import { getUserInfos, updateUserInfo } from '@/api/user'
import { createOrderInfo } from '@/api/order' import { createOrderInfo } from '@/api/order'
import { getStorageInfo, changeStorageInfo } from '@/api/storage' import { changeStorageInfo, getStorageList } from '@/api/storage'
const defaultForm = { const defaultForm = {
email: undefined, email: undefined,
@ -378,9 +378,9 @@ export default {
}) })
}, },
fetchStorageData(user_id) { fetchStorageData(user_id) {
getStorageInfo({ user_id: user_id }).then(response => { getStorageList({ user_id: user_id }).then(response => {
if (response.storage_selection) { if (response.data.storage_selection) {
this.storage_selection = response.storage_selection this.storage_selection = response.data.storage_selection
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)

@ -117,26 +117,27 @@ export default {
loading: false, loading: false,
is_edit: false, is_edit: false,
wxbind_state_choices, wxbind_state_choices,
wxbind_sex_choices wxbind_sex_choices,
id: ''
} }
}, },
computed: {}, computed: {},
created() { created() {
const id = this.$route.params && this.$route.params.id this.id = this.$route.params && this.$route.params.id
this.fetchData(id) this.fetchData(this.id)
}, },
methods: { methods: {
fetchData(id) { fetchData(id) {
getWxBindInfos({ id: id }).then(response => { getWxBindInfos(id).then(response => {
if (response.data.length === 1) { if (response.data) {
this.postForm = response.data[0] this.postForm = response.data
} }
}).catch(err => { }).catch(err => {
console.log(err) console.log(err)
}) })
}, },
updateData() { updateData() {
updateWxBindInfo(this.postForm).then(response => { updateWxBindInfo(this.id, this.postForm).then(response => {
this.$message.success('更新成功') this.$message.success('更新成功')
this.postForm = response.data this.postForm = response.data
}).catch(err => { }).catch(err => {

@ -7,7 +7,7 @@
<el-select v-model="listQuery.subscribe" placeholder="玩家是否订阅" clearable class="filter-item" style="width: 140px" @change="handleFilter"> <el-select v-model="listQuery.subscribe" placeholder="玩家是否订阅" clearable class="filter-item" style="width: 140px" @change="handleFilter">
<el-option v-for="item in wxbind_state_choices" :key="item.id" :label="item.name" :value="item.id" /> <el-option v-for="item in wxbind_state_choices" :key="item.id" :label="item.name" :value="item.id" />
</el-select> </el-select>
<el-select v-model="listQuery.sort" style="width: 140px" class="filter-item" @change="handleFilter"> <el-select v-model="listQuery.ordering" style="width: 140px" class="filter-item" @change="handleFilter">
<el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" /> <el-option v-for="item in sortOptions" :key="item.key" :label="item.label" :value="item.key" />
</el-select> </el-select>
<el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter"> <el-button v-waves class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">
@ -92,7 +92,7 @@
</template> </template>
<script> <script>
import { getWxBindInfos, deleteWxBind } from '@/api/wxbind' import { getWxBindInfos, deleteWxBind, getWxBindList } from '@/api/wxbind'
import { baseFilter } from '@/utils' import { baseFilter } from '@/utils'
import Pagination from '@/components/Pagination' // secondary package based on el-pagination import Pagination from '@/components/Pagination' // secondary package based on el-pagination
import waves from '@/directive/waves' // waves directive import waves from '@/directive/waves' // waves directive
@ -159,7 +159,7 @@ export default {
page: 1, page: 1,
limit: 10, limit: 10,
user_id: undefined, user_id: undefined,
sort: '-created_time', ordering: '-created_time',
openid: undefined, openid: undefined,
nickname: undefined, nickname: undefined,
subscribe: undefined subscribe: undefined
@ -178,7 +178,7 @@ export default {
}, },
methods: { methods: {
remove_wxbind(wxbind_id) { remove_wxbind(wxbind_id) {
deleteWxBind({ id: wxbind_id }).then(response => { deleteWxBind(wxbind_id).then(response => {
this.list = response.data this.list = response.data
this.total = response.total this.total = response.total
this.listLoading = false this.listLoading = false
@ -190,9 +190,9 @@ export default {
}, },
fetchData() { fetchData() {
this.listLoading = true this.listLoading = true
getWxBindInfos(this.listQuery).then(response => { getWxBindList(this.listQuery).then(response => {
this.list = response.data this.list = response.data.results
this.total = response.total this.total = response.data.count
this.listLoading = false this.listLoading = false
}) })
} }

@ -1,6 +1,5 @@
<template> <template>
<el-main> <el-main>
<h2 v-if="is_admin_storage">管理员存储您配置的存储将决定其他用户配置的默认存储请谨慎修改</h2>
<el-dialog :close-on-click-modal="false" :destroy-on-close="true" :title="title" <el-dialog :close-on-click-modal="false" :destroy-on-close="true" :title="title"
:visible.sync="dialogstorageVisible"> :visible.sync="dialogstorageVisible">
@ -341,7 +340,6 @@ export default {
isaddflag: false, isaddflag: false,
activeName: 'change', activeName: 'change',
storage_info_lists: [], storage_info_lists: [],
is_admin_storage: false,
loading: false, loading: false,
} }
}, methods: { }, methods: {
@ -525,7 +523,6 @@ export default {
this.org_storage_id = this.use_storage_id = data.storage; this.org_storage_id = this.use_storage_id = data.storage;
this.storage_list = data.storage_list; this.storage_list = data.storage_list;
this.storage_info_lists = data.data; this.storage_info_lists = data.data;
this.is_admin_storage = data.is_admin_storage;
this.format_storage(data.data); this.format_storage(data.data);
this.disabled = true; this.disabled = true;
this.isaddflag = false; this.isaddflag = false;

@ -13,7 +13,8 @@ Including another URLconf
1. Import the include() function: from django.urls import include, path 1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
""" """
from django.urls import re_path from django.urls import re_path, include
from rest_framework.routers import SimpleRouter
from admin.views.app import AppInfoView, AppReleaseInfoView from admin.views.app import AppInfoView, AppReleaseInfoView
from admin.views.domain import DomainNameInfoView from admin.views.domain import DomainNameInfoView
@ -24,25 +25,23 @@ from admin.views.storage import StorageInfoView, StorageChangeView
from admin.views.supersign import DeveloperInfoView, DevicesInfoView, SuperSignBillView, SuperSignBillUserInfoView from admin.views.supersign import DeveloperInfoView, DevicesInfoView, SuperSignBillView, SuperSignBillUserInfoView
from admin.views.user import UserInfoView, UserCertificationInfoView, ThirdWxAccountView from admin.views.user import UserInfoView, UserCertificationInfoView, ThirdWxAccountView
router = SimpleRouter(False)
router.register('app/info', AppInfoView)
router.register('app/release/info', AppReleaseInfoView)
router.register('domain/info', DomainNameInfoView)
router.register('order/info', OrderInfoView)
router.register('report/info', AdminReportView)
router.register('storage/info', StorageInfoView)
router.register('developer/info', DeveloperInfoView)
router.register('devices/info', DevicesInfoView)
router.register('bill/info', SuperSignBillView)
router.register('wxbind/info', ThirdWxAccountView)
urlpatterns = [ urlpatterns = [
# path("",include(router.urls)),
# re_path("^users$", CertificationView.as_view()),
# re_path("^apps$", CertificationView.as_view()),
re_path("^login", LoginView.as_view()), re_path("^login", LoginView.as_view()),
re_path("^user/info", LoginUserView.as_view()), re_path("^user/info", LoginUserView.as_view()),
re_path("^userinfo", UserInfoView.as_view()), re_path("^userinfo", UserInfoView.as_view()),
re_path("^app/info", AppInfoView.as_view()),
re_path("^app/release/info", AppReleaseInfoView.as_view()),
re_path("^certification/info", UserCertificationInfoView.as_view()), re_path("^certification/info", UserCertificationInfoView.as_view()),
re_path("^storage/info", StorageInfoView.as_view()),
re_path("^storage/change", StorageChangeView.as_view()), re_path("^storage/change", StorageChangeView.as_view()),
re_path("^order/info", OrderInfoView.as_view()),
re_path("^developer/info", DeveloperInfoView.as_view()),
re_path("^devices/info", DevicesInfoView.as_view()),
re_path("^bill/info", SuperSignBillView.as_view()),
re_path("^bill/userinfo", SuperSignBillUserInfoView.as_view()), re_path("^bill/userinfo", SuperSignBillUserInfoView.as_view()),
re_path("^domain/info", DomainNameInfoView.as_view()), re_path('', include(router.urls))
re_path("^wxbind/info", ThirdWxAccountView.as_view()),
re_path("^report/info", AdminReportView.as_view()),
] ]

@ -1,13 +0,0 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 1月
# author: NinEveN
# date: 2022/1/6
from rest_framework.pagination import PageNumberPagination
class AppsPageNumber(PageNumberPagination):
page_size = 20 # 每页显示多少条
page_size_query_param = 'limit' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
max_page_size = None # 最大页码数限制

@ -0,0 +1,5 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 1月
# author: NinEveN
# date: 2022/1/13

@ -0,0 +1,23 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 1月
# author: NinEveN
# date: 2022/1/13
import logging
from rest_framework.views import exception_handler
from admin.utils.utils import ApiResponse
logger = logging.getLogger(__file__)
def common_exception_handler(exc, context):
logger.error(f'{context["view"].__class__.__name__} ERROR: {exc}')
# context['view'] 是TextView的对象,想拿出这个对象对应的类名
ret = exception_handler(exc, context) # 是Response对象,它内部有个data
if not ret: # drf内置处理不了,丢给django 的,我们自己来处理
return ApiResponse(msg='error', result=str(exc))
else:
return ApiResponse(msg='error', data=ret.data)

@ -0,0 +1,296 @@
import logging
import os
from rest_framework import serializers
from api import models
from api.utils.serializer import AppReleaseSerializer, UserInfoSerializer, AppsSerializer, StorageSerializer, \
DeveloperSerializer, SuperSignUsedSerializer, ThirdWxSerializer, DomainNameSerializer, BillInfoSerializer, \
AppReportSerializer
from api.utils.storage.storage import Storage
from common.base.baseutils import get_choices_dict, get_choices_name_from_key
logger = logging.getLogger(__name__)
def get_download_url_from_context(self, obj, key, url, force_new=False):
download_url = ""
if self.context.get("key", None) and self.context.get("key") != "undefined":
key = self.context.get("key", '')
if self.context.get("storage", None) and self.context.get("storage") != "undefined":
storage = self.context.get("storage", None)
else:
if isinstance(obj, models.Apps):
storage = Storage(obj.user_id)
elif isinstance(obj, models.AppReleaseInfo):
storage = Storage(obj.app_id.user_id)
elif isinstance(obj, models.UserAdDisplayInfo):
storage = Storage(obj.user_id)
elif isinstance(obj, models.UserInfo):
storage = Storage(obj)
elif isinstance(obj, models.UserCertificationInfo) or isinstance(obj, models.CertificationInfo):
storage = Storage(obj.user_id, None, True)
else:
storage = None
if storage:
download_url = storage.get_download_url(os.path.basename(url), 600, key, force_new)
logger.info(f'get {os.path.basename(url)} download_url {download_url} force_new:{force_new} key:{key}')
return download_url
def get_app_master_obj_from_context(self, obj):
master_release_obj = models.AppReleaseInfo.objects.filter(app_id=obj, is_master=True).first()
if self.context.get("release_id", None) and self.context.get("release_id") != "undefined":
master_release_obj = models.AppReleaseInfo.objects.filter(app_id=obj,
release_id=self.context.get("release_id")).first()
return master_release_obj
def get_screenshots_from_self(self, obj, force_new=False):
screenshots_list = []
for screenshot_obj in models.AppScreenShot.objects.filter(app_id=obj).all():
icon_url = get_download_url_from_context(self, obj, '', screenshot_obj.screenshot_url, force_new)
screenshots_list.append({'id': screenshot_obj.pk, 'url': icon_url})
return screenshots_list
class AdminUserInfoSerializer(UserInfoSerializer):
class Meta:
model = models.UserInfo
exclude = ["password", "api_token"]
read_only_fields = ["id", "head_img", "free_download_times", "last_login",
"is_superuser", "last_name", "is_staff", "uid",
"date_joined", "download_times", "all_download_times", "storage", "groups",
"user_permissions", "certification_id", " app_count"]
gender_choices = serializers.SerializerMethodField()
def get_gender_choices(self, obj):
return get_choices_dict(obj.gender_choices)
role_choices = serializers.SerializerMethodField()
def get_role_choices(self, obj):
return get_choices_dict(obj.role_choices)
storage_choices = serializers.SerializerMethodField()
def get_storage_choices(self, obj):
return get_choices_dict(models.AppStorage.storage_choices[1:])
certification_status_choices = serializers.SerializerMethodField()
def get_certification_status_choices(self, obj):
return get_choices_dict(models.UserCertificationInfo.status_choices)
certification_id = serializers.SerializerMethodField()
def get_certification_id(self, obj):
return models.UserCertificationInfo.objects.filter(user_id=obj).values('id').first()
app_count = serializers.SerializerMethodField()
def get_app_count(self, obj):
return models.Apps.objects.filter(user_id=obj).count()
def update(self, instance, validated_data):
return super(AdminUserInfoSerializer, self).update(instance, validated_data)
class AdminAppsSerializer(AppsSerializer):
class Meta:
model = models.Apps
fields = "__all__"
read_only_fields = ["id", "app_id", "user_id", "bundle_id", "count_hits", "updated_time", "created_time"]
status_choices = serializers.SerializerMethodField()
def get_status_choices(self, obj):
return get_choices_dict(obj.status_choices)
type_choices = serializers.SerializerMethodField()
def get_type_choices(self, obj):
return get_choices_dict(obj.type_choices)
supersign_type_choices = serializers.SerializerMethodField()
def get_supersign_type_choices(self, obj):
return get_choices_dict(obj.supersign_type_choices)
release_count = serializers.SerializerMethodField()
def get_release_count(self, obj):
return models.AppReleaseInfo.objects.filter(app_id=obj).count()
def update(self, instance, validated_data):
return super(AdminAppsSerializer, self).update(instance, validated_data)
class AdminAppReleaseSerializer(AppReleaseSerializer):
class Meta:
model = models.AppReleaseInfo
fields = '__all__'
read_only_fields = ["id", "app_id", "release_id", "binary_size", "udid", "icon_url"]
release_choices = serializers.SerializerMethodField()
app_aid = serializers.CharField(source='app_id.app_id', read_only=True)
def get_release_choices(self, obj):
return get_choices_dict(obj.release_choices)
def update(self, instance, validated_data):
print(validated_data)
if validated_data.get("is_master", False):
models.AppReleaseInfo.objects.filter(app_id=instance.app_id).update(**{"is_master": False})
else:
if "is_master" in validated_data and validated_data.get("is_master") != True:
del validated_data["is_master"]
return super(AdminAppReleaseSerializer, self).update(instance, validated_data)
class AdminStorageSerializer(StorageSerializer):
class Meta:
model = models.AppStorage
fields = "__all__"
read_only_fields = ["id", "user_id", "updated_time", "created_time", "storage_type"]
storage_choices = serializers.SerializerMethodField()
def get_storage_choices(self, obj):
return get_choices_dict(obj.storage_choices[1:])
used_id = serializers.IntegerField(source="user_id.pk")
class AdminDeveloperSerializer(DeveloperSerializer):
class Meta:
model = models.AppIOSDeveloperInfo
# depth = 1
exclude = ["p8key", ]
auth_type_choices = serializers.SerializerMethodField()
def get_auth_type_choices(self, obj):
return get_choices_dict(obj.auth_type_choices)
status_choices = serializers.SerializerMethodField()
def get_status_choices(self, obj):
return get_choices_dict(obj.status_choices)
class AdminSuperSignUsedSerializer(SuperSignUsedSerializer):
class Meta:
model = models.APPSuperSignUsedInfo
fields = ["created_time", "device_udid", "device_name", "developer_id", "bundle_id", "bundle_name", "app_id",
"id", "user_id", "short", "developer_pk"]
app_id = serializers.IntegerField(source="app_id.pk")
user_id = serializers.IntegerField(source="user_id.pk")
short = serializers.CharField(source="app_id.short")
developer_status = serializers.CharField(source="developerid.get_status_display")
developer_id = serializers.CharField(source="developerid.issuer_id")
developer_description = serializers.CharField(source="developerid.description")
developer_pk = serializers.IntegerField(source="developerid.pk")
class AdminOrdersSerializer(serializers.ModelSerializer):
class Meta:
model = models.Order
fields = "__all__"
read_only_fields = ["id", "user_id", "updated_time", "created_time", "payment_number", "order_number",
"payment_name", "actual_amount", "actual_download_times", "actual_download_gift_times"]
payment_type_choices = serializers.SerializerMethodField()
def get_payment_type_choices(self, obj):
return get_choices_dict(obj.payment_type_choices)
status_choices = serializers.SerializerMethodField()
def get_status_choices(self, obj):
return get_choices_dict(obj.status_choices)
order_type_choices = serializers.SerializerMethodField()
def get_order_type_choices(self, obj):
return get_choices_dict(obj.order_type_choices)
class AdminUserCertificationSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserCertificationInfo
fields = "__all__"
read_only_fields = ["id", "user_id", "reviewed_time", "created_time"]
certification_status_choices = serializers.SerializerMethodField()
def get_certification_status_choices(self, obj):
return get_choices_dict(obj.status_choices)
certification_infos = serializers.SerializerMethodField()
def get_certification_infos(self, obj):
result = []
for c_info in models.CertificationInfo.objects.filter(user_id=obj.user_id).all():
result.append({
'name': get_choices_name_from_key(models.CertificationInfo.type_choices, c_info.type),
'certification_url': get_download_url_from_context(self, obj, '', c_info.certification_url)
})
return result
def update(self, instance, validated_data):
return super(AdminUserCertificationSerializer, self).update(instance, validated_data)
class AdminThirdWxSerializer(ThirdWxSerializer):
class Meta:
model = models.ThirdWeChatUserInfo
fields = "__all__"
read_only_fields = ["id", "openid", "user_id", "head_img_url"]
class AdminDomainNameSerializer(DomainNameSerializer):
class Meta:
model = models.UserDomainInfo
fields = "__all__"
read_only_fields = ["id", "app_id", "domain_type", "created_time", "cname_id"]
domain_type_choices = serializers.SerializerMethodField()
def get_domain_type_choices(self, obj):
return get_choices_dict(obj.domain_type_choices)
class AdminBillInfoSerializer(BillInfoSerializer):
class Meta:
model = models.IosDeveloperPublicPoolBill
fields = '__all__'
read_only_fields = ["id", "user_id", "to_user_id", "action", "number", "app_info", "udid",
"udid_sync_info", "app_id", "remote_addr"]
action_choices = serializers.SerializerMethodField()
def get_action_choices(self, obj):
return get_choices_dict(obj.action_choices)
class AdminAppReportSerializer(AppReportSerializer):
class Meta:
model = models.AppReportInfo
fields = '__all__'
read_only_fields = ["id", "app_id", "username", "created_time", "email", "report_reason", "report_type",
"remote_addr", "bundle_id", "app_name"]
report_type_choices = serializers.SerializerMethodField()
def get_report_type_choices(self, obj):
return get_choices_dict(obj.report_type_choices)
status_choices = serializers.SerializerMethodField()
def get_status_choices(self, obj):
return get_choices_dict(obj.status_choices)

@ -0,0 +1,52 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 1月
# author: NinEveN
# date: 2022/1/6
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
class AppsPageNumber(PageNumberPagination):
page_size = 20 # 每页显示多少条
page_size_query_param = 'limit' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
max_page_size = 100 # 最大页码数限制
class BaseModelSet(ModelViewSet):
def retrieve(self, request, *args, **kwargs):
data = super().retrieve(request, *args, **kwargs).data
return ApiResponse(data=data)
def list(self, request, *args, **kwargs):
data = super().list(request, *args, **kwargs).data
return ApiResponse(data=data)
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
self.perform_destroy(instance)
return ApiResponse()
def update(self, request, *args, **kwargs):
data = super().update(request, *args, **kwargs).data
return ApiResponse(data=data)
class ApiResponse(Response):
def __init__(self, code=1000, msg='success', data=None, status=None, headers=None, content_type=None, **kwargs):
dic = {
'code': code,
'msg': msg
}
if data is not None:
dic['data'] = data
dic.update(kwargs)
self._data = data
# 对象来调用对象的绑定方法,会自动传值
super().__init__(data=dic, status=status, headers=headers, content_type=content_type)
# 类来调用对象的绑定方法,这个方法就是一个普通函数,有几个参数就要传几个参数
# Response.__init__(data=dic,status=status,headers=headers,content_type=content_type)

@ -6,126 +6,76 @@
import logging import logging
from rest_framework.response import Response from django_filters import rest_framework as filters
from rest_framework.views import APIView from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from admin.utils import AppsPageNumber from admin.utils.serializer import AdminAppsSerializer, AdminAppReleaseSerializer
from admin.utils.utils import AppsPageNumber, ApiResponse, BaseModelSet
from api.base_views import app_delete from api.base_views import app_delete
from api.models import AppReleaseInfo, Apps from api.models import AppReleaseInfo, Apps
from api.utils.TokenManager import verify_token from api.utils.TokenManager import verify_token
from api.utils.auth import AdminTokenAuthentication from api.utils.auth import AdminTokenAuthentication
from api.utils.response import BaseResponse
from api.utils.serializer import AdminAppsSerializer, AdminAppReleaseSerializer
from api.utils.storage.caches import del_cache_response_by_short, get_download_url_by_cache from api.utils.storage.caches import del_cache_response_by_short, get_download_url_by_cache
from common.base.baseutils import get_dict_from_filter_fields
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class AppInfoView(APIView): class AppsFilter(filters.FilterSet):
min_count_hits = filters.NumberFilter(field_name="count_hits", lookup_expr='gte')
max_count_hits = filters.NumberFilter(field_name="count_hits", lookup_expr='lte')
bundle_id_like = filters.CharFilter(field_name="bundle_id", lookup_expr='icontains')
class Meta:
model = Apps
fields = ["id", "type", "name", "short", "bundle_id", "user_id", "status"]
class AppInfoView(BaseModelSet):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
queryset = Apps.objects.all()
serializer_class = AdminAppsSerializer
pagination_class = AppsPageNumber
def get(self, request): filter_backends = [DjangoFilterBackend, OrderingFilter]
res = BaseResponse() ordering_fields = ['updated_time', 'count_hits', 'created_time']
filter_fields = ["id", "type", "name", "short", "bundle_id", "domain_name", "user_id", "status"] filterset_class = AppsFilter
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-updated_time") def update(self, request, *args, **kwargs):
page_obj = AppsPageNumber() data = super().update(request, *args, **kwargs).data
obj_list = Apps.objects.filter(**filter_data).order_by(sort) del_cache_response_by_short(data.get('app_id'))
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request, return ApiResponse(**data)
view=self)
serializer = AdminAppsSerializer(page_serializer, many=True)
res.data = serializer.data
res.total = obj_list.count()
return Response(res.dict)
def put(self, request):
res = BaseResponse()
data = request.data
pk = data.get("id", None)
if not pk:
res.code = 1003
res.msg = "参数错误"
return Response(res.dict)
app_obj = Apps.objects.filter(pk=pk).first()
if app_obj:
data['pk'] = pk
serializer_obj = AdminAppsSerializer(app_obj, data=data, partial=True)
if serializer_obj.is_valid():
serializer_obj.save()
res.data = serializer_obj.data
del_cache_response_by_short(app_obj.app_id)
return Response(res.dict)
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)
def delete(self, request):
res = BaseResponse()
data = request.data
pk = data.get("id", None)
if not pk:
res.code = 1003
res.msg = "参数错误"
else:
res = app_delete(Apps.objects.filter(pk=pk).first())
return Response(res.dict)
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
app_delete(instance)
return ApiResponse()
class AppReleaseInfoView(APIView):
class AppReleaseInfoView(BaseModelSet):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
def get(self, request): queryset = AppReleaseInfo.objects.all()
res = BaseResponse() serializer_class = AdminAppReleaseSerializer
filter_fields = ["id", "release_id", "app_id"] pagination_class = AppsPageNumber
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time") filter_backends = [DjangoFilterBackend, OrderingFilter]
if not filter_data.get('app_id', None): ordering_fields = ['created_time']
res.code = 1003 filterset_fields = ("id", "release_id", "app_id")
res.msg = "参数错误"
return Response(res.dict) def update(self, request, *args, **kwargs):
page_obj = AppsPageNumber() data = super().update(request, *args, **kwargs).data
obj_list = AppReleaseInfo.objects.filter(**filter_data).order_by(sort) del_cache_response_by_short(data.get('app_aid'))
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request, return ApiResponse(**data)
view=self)
serializer = AdminAppReleaseSerializer(page_serializer, many=True) def create(self, request, *args, **kwargs):
res.data = serializer.data
res.total = obj_list.count()
return Response(res.dict)
def put(self, request):
res = BaseResponse()
data = request.data
pk = data.get("id", None)
app_id = data.get("app_id", None)
if not pk or not app_id:
res.code = 1003
res.msg = "参数错误"
return Response(res.dict)
app_obj = AppReleaseInfo.objects.filter(pk=pk, app_id=app_id).first()
if app_obj:
data['pk'] = pk
serializer_obj = AdminAppReleaseSerializer(app_obj, data=data, partial=True)
if serializer_obj.is_valid():
serializer_obj.save()
res.data = serializer_obj.data
del_cache_response_by_short(app_obj.app_id.app_id)
return Response(res.dict)
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)
def post(self, request):
res = BaseResponse()
data = request.data data = request.data
downtoken = data.get("token", None) downtoken = data.get("token", None)
app_id = data.get("app_id", None) app_id = data.get("app_id", None)
release_id = data.get("release_id", None) release_id = data.get("release_id", None)
if not downtoken or not app_id or not release_id: if not downtoken or not app_id or not release_id:
res.code = 1004 return ApiResponse(code=1004, msg='参数丢失')
res.msg = "参数丢失"
return Response(res.dict)
if verify_token(downtoken, release_id): if verify_token(downtoken, release_id):
app_obj = Apps.objects.filter(pk=app_id).values("pk", 'user_id', 'type').first() app_obj = Apps.objects.filter(pk=app_id).values("pk", 'user_id', 'type').first()
@ -136,12 +86,7 @@ class AppReleaseInfoView(APIView):
else: else:
app_type = '.ipa' app_type = '.ipa'
download_url, extra_url = get_download_url_by_cache(app_obj, release_id + app_type, 600) download_url, extra_url = get_download_url_by_cache(app_obj, release_id + app_type, 600)
res.data = {"download_url": download_url, "extra_url": extra_url} return ApiResponse(data={"download_url": download_url, "extra_url": extra_url})
return Response(res.dict)
else: else:
res.code = 1004 return ApiResponse(code=1004, msg='token校验失败')
res.msg = "token校验失败" return ApiResponse(code=1006, msg='该应用不存在')
return Response(res.dict)
res.code = 1006
res.msg = "该应用不存在"
return Response(res.dict)

@ -6,79 +6,46 @@
import logging import logging
from rest_framework.pagination import PageNumberPagination from django_filters import rest_framework as filters
from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.views import APIView from rest_framework.filters import OrderingFilter
from admin.utils.serializer import AdminDomainNameSerializer
from admin.utils.utils import BaseModelSet, AppsPageNumber, ApiResponse
from api.models import UserDomainInfo from api.models import UserDomainInfo
from api.utils.auth import AdminTokenAuthentication from api.utils.auth import AdminTokenAuthentication
from api.utils.response import BaseResponse
from api.utils.serializer import AdminDomainNameSerializer
from api.utils.storage.caches import reset_app_wx_easy_type from api.utils.storage.caches import reset_app_wx_easy_type
from common.base.baseutils import get_dict_from_filter_fields
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class PageNumber(PageNumberPagination): class DomainNameFilter(filters.FilterSet):
page_size = 20 # 每页显示多少条 app_name = filters.CharFilter(field_name="app_id__name", lookup_expr='icontains')
page_size_query_param = 'limit' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
max_page_size = None # 最大页码数限制
class Meta:
model = UserDomainInfo
fields = ["id", "domain_name", "domain_type", "user_id", "is_enable"]
class DomainNameInfoView(APIView):
authentication_classes = [AdminTokenAuthentication, ]
def get(self, request):
res = BaseResponse()
filter_fields = ["id", "domain_name", "app_name", "domain_type", "user_id", "is_enable"]
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
app_name = filter_data.get('app_name', None)
if app_name:
filter_data["app_id__name__contains"] = filter_data['app_name']
del filter_data['app_name']
sort = request.query_params.get("sort", "-created_time")
page_obj = PageNumber()
obj_list = UserDomainInfo.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self)
serializer = AdminDomainNameSerializer(page_serializer, many=True)
res.data = serializer.data
res.total = obj_list.count()
return Response(res.dict)
def put(self, request): class DomainNameInfoView(BaseModelSet):
res = BaseResponse() authentication_classes = [AdminTokenAuthentication, ]
data = request.data queryset = UserDomainInfo.objects.all()
pk = data.get("id", None) serializer_class = AdminDomainNameSerializer
if not pk: pagination_class = AppsPageNumber
res.code = 1003
res.msg = "参数错误" filter_backends = [DjangoFilterBackend, OrderingFilter]
return Response(res.dict) ordering_fields = ['created_time']
obj = UserDomainInfo.objects.filter(pk=pk).first() filterset_class = DomainNameFilter
if obj:
data['pk'] = pk def update(self, request, *args, **kwargs):
serializer_obj = AdminDomainNameSerializer(obj, data=data, partial=True) data = super().update(request, *args, **kwargs).data
if serializer_obj.is_valid(): instance = self.queryset.filter(pk=data.get('id')).first()
serializer_obj.save() if instance:
res.data = serializer_obj.data reset_app_wx_easy_type(instance.user_id, instance.app_id)
reset_app_wx_easy_type(obj.user_id, obj.app_id) return ApiResponse(**data)
return Response(res.dict)
res.code = 1004 def destroy(self, request, *args, **kwargs):
res.msg = "数据校验失败" instance = self.get_object()
return Response(res.dict) reset_app_wx_easy_type(instance.user_id, instance.app_id)
self.perform_destroy(instance)
def delete(self, request): return ApiResponse()
res = BaseResponse()
data = request.data
pk = data.get("id", None)
if not pk:
res.code = 1003
res.msg = "参数错误"
else:
user_domain_obj = UserDomainInfo.objects.filter(pk=pk).first()
reset_app_wx_easy_type(user_domain_obj.user_id, user_domain_obj.app_id)
user_domain_obj.delete()
return self.get(request)
return Response(res.dict)

@ -7,11 +7,10 @@
import logging import logging
from django.contrib import auth from django.contrib import auth
from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from admin.utils.utils import ApiResponse
from api.utils.auth import ExpiringTokenAuthentication from api.utils.auth import ExpiringTokenAuthentication
from api.utils.response import BaseResponse
from api.utils.serializer import UserInfoSerializer from api.utils.serializer import UserInfoSerializer
from api.utils.storage.caches import login_auth_failed from api.utils.storage.caches import login_auth_failed
from api.utils.throttle import VisitRegister1Throttle, VisitRegister2Throttle from api.utils.throttle import VisitRegister1Throttle, VisitRegister2Throttle
@ -25,9 +24,11 @@ class LoginView(APIView):
throttle_classes = [VisitRegister1Throttle, VisitRegister2Throttle] throttle_classes = [VisitRegister1Throttle, VisitRegister2Throttle]
def post(self, request): def post(self, request):
response = BaseResponse()
receive = request.data receive = request.data
username = receive.get("username", None) username = receive.get("username", None)
code = 1000
msg = 'success'
data = None
if LOGIN.get("captcha"): if LOGIN.get("captcha"):
is_valid = valid_captcha(receive.get("captcha_key", None), receive.get("authcode", None), username) is_valid = valid_captcha(receive.get("captcha_key", None), receive.get("authcode", None), username)
else: else:
@ -42,36 +43,35 @@ class LoginView(APIView):
if user.role == 3: if user.role == 3:
login_auth_failed("del", username) login_auth_failed("del", username)
key, user_info = set_user_token(user, request) key, user_info = set_user_token(user, request)
response.data = { data = {
"username": user_info.username, "username": user_info.username,
"token": key "token": key
} }
else: else:
response.msg = "权限拒绝" msg = "权限拒绝"
response.code = 1003 code = 1003
else: else:
response.msg = "用户被禁用" msg = "用户被禁用"
response.code = 1005 code = 1005
else: else:
login_auth_failed("set", username) login_auth_failed("set", username)
response.msg = "密码或者账户有误" msg = "密码或者账户有误"
response.code = 1002 code = 1002
else: else:
response.code = 1006 code = 1006
logger.error(f"username:{username} failed too try , locked") logger.error(f"username:{username} failed too try , locked")
response.msg = "用户登录失败次数过多,已被锁定,请1小时之后再次尝试" msg = "用户登录失败次数过多,已被锁定,请1小时之后再次尝试"
else: else:
response.code = 1001 code = 1001
response.msg = "验证码有误" msg = "验证码有误"
return Response(response.dict) return ApiResponse(code=code, msg=msg, data=data)
def get(self, request): def get(self, request):
response = BaseResponse() data = {}
response.data = {}
if LOGIN.get("captcha"): if LOGIN.get("captcha"):
response.data = get_captcha() data = get_captcha()
return Response(response.dict) return ApiResponse(data=data)
class LoginUserView(APIView): class LoginUserView(APIView):
@ -79,8 +79,5 @@ class LoginUserView(APIView):
authentication_classes = [ExpiringTokenAuthentication, ] authentication_classes = [ExpiringTokenAuthentication, ]
def get(self, request): def get(self, request):
response = BaseResponse()
serializer = UserInfoSerializer(request.user, ) serializer = UserInfoSerializer(request.user, )
data = serializer.data return ApiResponse(data=serializer.data)
response.data = data
return Response(response.dict)

@ -6,99 +6,57 @@
import logging import logging
from rest_framework.pagination import PageNumberPagination from django_filters import rest_framework as filters
from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.views import APIView from rest_framework.filters import OrderingFilter
from admin.utils.serializer import AdminOrdersSerializer
from admin.utils.utils import BaseModelSet, AppsPageNumber, ApiResponse
from api.models import UserInfo, Order from api.models import UserInfo, Order
from api.utils.auth import AdminTokenAuthentication from api.utils.auth import AdminTokenAuthentication
from api.utils.response import BaseResponse
from api.utils.serializer import AdminOrdersSerializer
from api.utils.storage.caches import update_order_info, admin_change_user_download_times from api.utils.storage.caches import update_order_info, admin_change_user_download_times
from common.base.baseutils import get_dict_from_filter_fields
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class PageNumber(PageNumberPagination): class OrderFilter(filters.FilterSet):
page_size = 20 # 每页显示多少条 user_id = filters.NumberFilter(field_name="user_id__id")
page_size_query_param = 'limit' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
max_page_size = None # 最大页码数限制
class Meta:
model = Order
fields = ["id", "payment_type", "payment_name", "payment_number", "order_number", "status", "order_type"]
class OrderInfoView(APIView):
authentication_classes = [AdminTokenAuthentication, ]
def get(self, request):
res = BaseResponse()
filter_fields = ["id", "user_id", "payment_type", "payment_name", "payment_number", "order_number", "status",
"order_type"]
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time")
page_obj = PageNumber()
obj_list = Order.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self)
serializer = AdminOrdersSerializer(page_serializer, many=True)
res.data = serializer.data
res.total = obj_list.count()
return Response(res.dict)
def put(self, request): class OrderInfoView(BaseModelSet):
res = BaseResponse() authentication_classes = [AdminTokenAuthentication, ]
data = request.data queryset = Order.objects.all()
pk = data.get("id", None) serializer_class = AdminOrdersSerializer
if not pk: pagination_class = AppsPageNumber
res.code = 1003
res.msg = "参数错误" filter_backends = [DjangoFilterBackend, OrderingFilter]
return Response(res.dict) ordering_fields = ['created_time', 'pay_time', 'actual_amount']
obj = Order.objects.filter(pk=pk).first() filterset_class = OrderFilter
old_status = obj.status
new_status = data.get('status', -99) def update(self, request, *args, **kwargs):
if obj: instance = self.get_object()
data['pk'] = pk old_status = instance.status
serializer = AdminOrdersSerializer(obj, data=data, partial=True) data = super().update(request, *args, **kwargs).data
if serializer.is_valid(): new_status = request.data.get('status', -99)
if old_status != new_status and new_status == 0: if old_status != new_status and new_status == 0:
update_order_info(obj.user_id.pk, obj.order_number, obj.order_number, obj.payment_type) update_order_info(instance.user_id.pk, instance.order_number, instance.order_number, instance.payment_type)
else: return ApiResponse(**data)
serializer.save()
res.data = serializer.data def create(self, request, *args, **kwargs):
return Response(res.dict)
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)
def delete(self, request):
res = BaseResponse()
data = request.data
pk = data.get("id", None)
if not pk:
res.code = 1003
res.msg = "参数错误"
else:
order_obj = Order.objects.filter(pk=pk).first()
order_obj.delete()
return Response(res.dict)
def post(self, request):
res = BaseResponse()
data = request.data data = request.data
pk = data.get("id", None) pk = data.get("id", None)
amount = data.get("amount", 0) amount = data.get("amount", 0)
if not pk: if not pk:
res.code = 1003 return ApiResponse(code=1003, msg="参数错误")
res.msg = "参数错误"
return Response(res.dict)
obj = UserInfo.objects.filter(pk=pk).first() obj = UserInfo.objects.filter(pk=pk).first()
if obj: if obj:
if amount > 0: if amount > 0:
if admin_change_user_download_times(obj, amount): if admin_change_user_download_times(obj, amount):
return Response(res.dict) return ApiResponse()
else: else:
res.code = 1005 return ApiResponse(code=1005, msg="订单创建失败")
res.msg = "订单创建失败" return ApiResponse(code=1004, msg="数据校验失败")
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)

@ -6,64 +6,30 @@
import logging import logging
from rest_framework.response import Response from django_filters import rest_framework as filters
from rest_framework.views import APIView from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from admin.utils import AppsPageNumber from admin.utils.serializer import AdminAppReportSerializer
from admin.utils.utils import AppsPageNumber, BaseModelSet
from api.models import AppReportInfo from api.models import AppReportInfo
from api.utils.auth import AdminTokenAuthentication from api.utils.auth import AdminTokenAuthentication
from api.utils.response import BaseResponse
from api.utils.serializer import AdminAppReportSerializer
from common.base.baseutils import get_dict_from_filter_fields
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class AdminReportView(APIView): class ReportFilter(filters.FilterSet):
authentication_classes = [AdminTokenAuthentication, ] class Meta:
model = AppReportInfo
fields = ["id", "app_name", "bundle_id", "remote_addr", "report_type", "email", "status", "app_id"]
def get(self, request):
res = BaseResponse()
filter_fields = ["id", "app_name", "bundle_id", "remote_addr", "report_type", "email", "status", "app_id"]
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time")
page_obj = AppsPageNumber()
obj_list = AppReportInfo.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self)
serializer = AdminAppReportSerializer(page_serializer, many=True)
res.data = serializer.data
res.total = obj_list.count()
return Response(res.dict)
def put(self, request): class AdminReportView(BaseModelSet):
res = BaseResponse() authentication_classes = [AdminTokenAuthentication, ]
data = request.data queryset = AppReportInfo.objects.all()
pk = data.get("id", None) serializer_class = AdminAppReportSerializer
if not pk: pagination_class = AppsPageNumber
res.code = 1003
res.msg = "参数错误"
return Response(res.dict)
obj = AppReportInfo.objects.filter(id=pk).first()
if obj:
data['pk'] = pk
serializer = AdminAppReportSerializer(obj, data=data, partial=True)
if serializer.is_valid():
serializer.save()
res.data = serializer.data
return Response(res.dict)
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)
def delete(self, request): filter_backends = [DjangoFilterBackend, OrderingFilter]
res = BaseResponse() ordering_fields = ['created_time']
data = request.data filterset_class = ReportFilter
pk = data.get("id", None)
if not pk:
res.code = 1003
res.msg = "参数错误"
else:
AppReportInfo.objects.filter(pk=pk).delete()
return self.get(request)
return Response(res.dict)

@ -5,73 +5,58 @@
# date: 2021/4/11 # date: 2021/4/11
import logging import logging
from copy import deepcopy
from rest_framework.response import Response from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework.views import APIView from rest_framework.views import APIView
from admin.utils import AppsPageNumber from admin.utils.serializer import AdminStorageSerializer
from admin.utils.utils import AppsPageNumber, BaseModelSet, ApiResponse
from api.base_views import storage_change from api.base_views import storage_change
from api.models import UserInfo, AppStorage from api.models import UserInfo, AppStorage
from api.utils.auth import AdminTokenAuthentication from api.utils.auth import AdminTokenAuthentication
from api.utils.response import BaseResponse
from api.utils.serializer import AdminStorageSerializer
from common.base.baseutils import format_storage_selection from common.base.baseutils import format_storage_selection
from common.base.baseutils import get_dict_from_filter_fields
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class StorageInfoView(APIView): class StorageFilter(filters.FilterSet):
user_id = filters.NumberFilter(field_name="user_id__id")
class Meta:
model = AppStorage
fields = ["id", "name", "storage_type", "access_key", "bucket_name", "domain_name"]
class StorageInfoView(BaseModelSet):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
queryset = AppStorage.objects.all()
serializer_class = AdminStorageSerializer
pagination_class = AppsPageNumber
def get(self, request): filter_backends = [DjangoFilterBackend, OrderingFilter]
res = BaseResponse() ordering_fields = ['created_time', 'updated_time']
filter_fields = ["id", "user_id", "name", "storage_type", "access_key", "bucket_name"] filterset_class = StorageFilter
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time")
page_obj = AppsPageNumber()
obj_list = AppStorage.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self)
serializer = AdminStorageSerializer(page_serializer, many=True)
res.data = serializer.data
res.total = obj_list.count()
if res.total:
res.storage_selection = format_storage_selection(serializer.data, serializer.data[0].get('storage_choices'))
return Response(res.dict)
def put(self, request): def list(self, request, *args, **kwargs):
res = BaseResponse() data = super().list(request, *args, **kwargs)._data
data = request.data if data['results']:
pk = data.get("id", None) data['storage_selection'] = format_storage_selection(deepcopy(data['results']),
if not pk: data['results'][0].get('storage_choices'))
res.code = 1003 return ApiResponse(data=data)
res.msg = "参数错误"
return Response(res.dict)
obj = AppStorage.objects.filter(pk=pk).first()
if obj and obj.user_id_id != obj.pk:
data['pk'] = pk
serializer = AdminStorageSerializer(obj, data=data, partial=True)
if serializer.is_valid():
serializer.save()
res.data = serializer.data
return Response(res.dict)
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)
class StorageChangeView(APIView): class StorageChangeView(APIView):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
def put(self, request): def put(self, request):
res = BaseResponse()
data = request.data data = request.data
pk = data.get("id", None) pk = data.get("id", None)
if not pk: if not pk:
res.code = 1003 return ApiResponse(code=1003, msg="参数错误")
res.msg = "参数错误"
return Response(res.dict)
obj = UserInfo.objects.filter(pk=pk).first() obj = UserInfo.objects.filter(pk=pk).first()
if obj: if obj:
logger.info(f"user {obj} update storage data:{data}") logger.info(f"user {obj} update storage data:{data}")
@ -79,10 +64,7 @@ class StorageChangeView(APIView):
force = data.get("force", None) force = data.get("force", None)
if use_storage_id: if use_storage_id:
if not storage_change(use_storage_id, obj, force): if not storage_change(use_storage_id, obj, force):
res.code = 1006 ApiResponse(code=1006, msg="修改失败")
res.msg = '修改失败' return ApiResponse()
return Response(res.dict)
res.code = 1004 return ApiResponse(code=1004, msg="数据校验失败")
res.msg = "数据校验失败"
return Response(res.dict)

@ -6,144 +6,84 @@
import logging import logging
from rest_framework.pagination import PageNumberPagination from django_filters import rest_framework as filters
from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework.views import APIView from rest_framework.views import APIView
from admin.utils import AppsPageNumber from admin.utils.serializer import AdminDeveloperSerializer, AdminSuperSignUsedSerializer, AdminBillInfoSerializer
from admin.utils.utils import AppsPageNumber, BaseModelSet, ApiResponse
from api.models import APPSuperSignUsedInfo, AppIOSDeveloperInfo, IosDeveloperPublicPoolBill from api.models import APPSuperSignUsedInfo, AppIOSDeveloperInfo, IosDeveloperPublicPoolBill
from api.utils.auth import AdminTokenAuthentication from api.utils.auth import AdminTokenAuthentication
from api.utils.modelutils import get_user_public_used_sign_num, get_user_public_sign_num, get_user_obj_from_epu from api.utils.modelutils import get_user_public_used_sign_num, get_user_public_sign_num, get_user_obj_from_epu
from api.utils.response import BaseResponse
from api.utils.serializer import AdminDeveloperSerializer, AdminSuperSignUsedSerializer, AdminBillInfoSerializer
from api.utils.utils import get_developer_devices from api.utils.utils import get_developer_devices
from common.base.baseutils import get_dict_from_filter_fields, get_real_ip_address, get_order_num from common.base.baseutils import get_real_ip_address, get_order_num
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class DeveloperInfoView(APIView): class DeveloperFilter(filters.FilterSet):
user_id = filters.NumberFilter(field_name="user_id__id")
class Meta:
model = AppIOSDeveloperInfo
fields = ["id", "issuer_id", "private_key_id", "certid", "description", "auth_type"]
class DeveloperInfoView(BaseModelSet):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
queryset = AppIOSDeveloperInfo.objects.all()
serializer_class = AdminDeveloperSerializer
pagination_class = AppsPageNumber
def get(self, request): filter_backends = [DjangoFilterBackend, OrderingFilter]
res = BaseResponse() ordering_fields = ['created_time', 'cert_expire_time', 'updated_time']
filter_fields = ["id", "user_id", "issuer_id", "private_key_id", "certid", "description", "auth_type"] filterset_class = DeveloperFilter
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time")
page_obj = AppsPageNumber() class DevicesFilter(filters.FilterSet):
obj_list = AppIOSDeveloperInfo.objects.filter(**filter_data).order_by(sort) user_id = filters.NumberFilter(field_name="user_id__id")
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request, issuer_id = filters.CharFilter(field_name="developerid__issuer_id")
view=self) udid = filters.CharFilter(field_name="udid__udid__udid")
serializer = AdminDeveloperSerializer(page_serializer, many=True) name = filters.CharFilter(field_name="app_id__name")
res.data = serializer.data bundle_id = filters.CharFilter(field_name="app_id__bundle_id")
res.total = obj_list.count() short = filters.CharFilter(field_name="app_id__short")
return Response(res.dict)
class Meta:
def put(self, request): model = APPSuperSignUsedInfo
res = BaseResponse() fields = ["id", "user_id", "issuer_id", "udid", "name", "bundle_id", "short"]
data = request.data
pk = data.get("id", None)
if not pk: class DevicesInfoView(BaseModelSet):
res.code = 1003
res.msg = "参数错误"
return Response(res.dict)
obj = AppIOSDeveloperInfo.objects.filter(pk=pk).first()
if obj:
data['pk'] = pk
serializer = AdminDeveloperSerializer(obj, data=data, partial=True)
if serializer.is_valid():
serializer.save()
res.data = serializer.data
return Response(res.dict)
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)
class DevicesInfoView(APIView):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
queryset = APPSuperSignUsedInfo.objects.all()
serializer_class = AdminSuperSignUsedSerializer
pagination_class = AppsPageNumber
def get(self, request): filter_backends = [DjangoFilterBackend, OrderingFilter]
res = BaseResponse() ordering_fields = ['created_time', 'updated_time']
filter_fields = ["id", "user_id", "issuer_id", "udid", "name", "bundle_id", "short"] filterset_class = DevicesFilter
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time")
page_obj = AppsPageNumber() class SuperSignBillFilter(filters.FilterSet):
if 'udid' in filter_data: user_id = filters.NumberFilter(field_name="user_id__id")
filter_data["udid__udid__udid"] = filter_data['udid']
del filter_data['udid'] class Meta:
model = IosDeveloperPublicPoolBill
if 'name' in filter_data: fields = ["id", "user_id", "to_user_id", "action", "udid", "app_id"]
filter_data["app_id__name"] = filter_data['name']
del filter_data['name']
class SuperSignBillView(BaseModelSet):
if 'bundle_id' in filter_data:
filter_data["app_id__bundle_id"] = filter_data['bundle_id']
del filter_data['bundle_id']
if 'short' in filter_data:
filter_data["app_id__short"] = filter_data['short']
del filter_data['short']
if 'issuer_id' in filter_data:
filter_data["developerid__issuer_id"] = filter_data['issuer_id']
del filter_data['issuer_id']
obj_list = APPSuperSignUsedInfo.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self)
serializer = AdminSuperSignUsedSerializer(page_serializer, many=True)
res.data = serializer.data
res.total = obj_list.count()
return Response(res.dict)
def put(self, request):
res = BaseResponse()
data = request.data
pk = data.get("id", None)
if not pk:
res.code = 1003
res.msg = "参数错误"
return Response(res.dict)
obj = AppIOSDeveloperInfo.objects.filter(pk=pk).first()
if obj:
data['pk'] = pk
serializer = AdminDeveloperSerializer(obj, data=data, partial=True)
if serializer.is_valid():
serializer.save()
res.data = serializer.data
return Response(res.dict)
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)
class PageNumber(PageNumberPagination):
page_size = 20 # 每页显示多少条
page_size_query_param = 'limit' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
max_page_size = None # 最大页码数限制
class SuperSignBillView(APIView):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
queryset = IosDeveloperPublicPoolBill.objects.all()
serializer_class = AdminBillInfoSerializer
pagination_class = AppsPageNumber
def get(self, request): filter_backends = [DjangoFilterBackend, OrderingFilter]
res = BaseResponse() ordering_fields = ['created_time']
filter_fields = ["id", "user_id", "to_user_id", "action", "udid", "app_id"] filterset_class = SuperSignBillFilter
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time") def create(self, request, *args, **kwargs):
page_obj = PageNumber()
obj_list = IosDeveloperPublicPoolBill.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self)
serializer = AdminBillInfoSerializer(page_serializer, many=True)
res.data = serializer.data
res.total = obj_list.count()
return Response(res.dict)
def post(self, request):
res = BaseResponse()
data = request.data data = request.data
user_id = data.get('user_id') user_id = data.get('user_id')
to_user_id = data.get('to_user_id') to_user_id = data.get('to_user_id')
@ -160,46 +100,34 @@ class SuperSignBillView(APIView):
udid=f'oid:{get_order_num()}', udid=f'oid:{get_order_num()}',
version=f'{user_obj.first_name} 后台转账 {number} 设备数', version=f'{user_obj.first_name} 后台转账 {number} 设备数',
) )
return Response(res.dict) return ApiResponse()
except Exception as e: except Exception as e:
res.msg = str(e) msg = str(e)
else: else:
res.msg = '用户不合法' msg = '用户不合法'
else:
res.msg = '数量和用户不能为空'
res.code = 1001
return Response(res.dict)
def delete(self, request):
res = BaseResponse()
data = request.data
pk = data.get("id", None)
if not pk:
res.code = 1003
res.msg = "参数错误"
else: else:
order_obj = IosDeveloperPublicPoolBill.objects.filter(pk=pk).first() msg = '数量和用户不能为空'
order_obj.delete() return ApiResponse(code=1001, msg=msg)
return Response(res.dict)
class SuperSignBillUserInfoView(APIView): class SuperSignBillUserInfoView(APIView):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
def get(self, request): def get(self, request):
res = BaseResponse()
user_id = request.query_params.get('user_id') user_id = request.query_params.get('user_id')
public_balance_info = {}
private_balance_info = {}
if user_id: if user_id:
user_obj = get_user_obj_from_epu(user_id) user_obj = get_user_obj_from_epu(user_id)
if user_obj: if user_obj:
res.public_balance_info = { public_balance_info = {
'used_balance': get_user_public_used_sign_num(user_obj), 'used_balance': get_user_public_used_sign_num(user_obj),
'all_balance': get_user_public_sign_num(user_obj) 'all_balance': get_user_public_sign_num(user_obj)
} }
use_num = get_developer_devices(AppIOSDeveloperInfo.objects.filter(user_id=user_obj)) use_num = get_developer_devices(AppIOSDeveloperInfo.objects.filter(user_id=user_obj))
res.private_balance_info = { private_balance_info = {
'used_balance': use_num.get('flyapp_used_sum', 0) + use_num.get('other_used_sum', 0), 'used_balance': use_num.get('flyapp_used_sum', 0) + use_num.get('other_used_sum', 0),
'all_balance': use_num.get('max_total', 0) 'all_balance': use_num.get('max_total', 0)
} }
return Response(res.dict) return ApiResponse(public_balance_info=public_balance_info, private_balance_info=private_balance_info)

@ -6,14 +6,15 @@
import logging import logging
from rest_framework.pagination import PageNumberPagination from django_filters import rest_framework as filters
from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from rest_framework.views import APIView from rest_framework.views import APIView
from admin.utils.serializer import AdminUserInfoSerializer, AdminUserCertificationSerializer, AdminThirdWxSerializer
from admin.utils.utils import AppsPageNumber, BaseModelSet, ApiResponse
from api.models import UserInfo, UserCertificationInfo, ThirdWeChatUserInfo from api.models import UserInfo, UserCertificationInfo, ThirdWeChatUserInfo
from api.utils.auth import AdminTokenAuthentication from api.utils.auth import AdminTokenAuthentication
from api.utils.response import BaseResponse
from api.utils.serializer import AdminUserInfoSerializer, AdminUserCertificationSerializer, AdminThirdWxSerializer
from api.utils.storage.caches import auth_user_download_times_gift from api.utils.storage.caches import auth_user_download_times_gift
from common.base.baseutils import get_dict_from_filter_fields from common.base.baseutils import get_dict_from_filter_fields
from fir_ser.settings import AUTH_USER_GIVE_DOWNLOAD_TIMES from fir_ser.settings import AUTH_USER_GIVE_DOWNLOAD_TIMES
@ -21,18 +22,10 @@ from fir_ser.settings import AUTH_USER_GIVE_DOWNLOAD_TIMES
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class PageNumber(PageNumberPagination):
page_size = 20 # 每页显示多少条
page_size_query_param = 'limit' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数
max_page_size = None # 最大页码数限制
class UserInfoView(APIView): class UserInfoView(APIView):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
def get(self, request): def get(self, request):
res = BaseResponse()
filter_fields = ["id", "mobile", "username", "email", "first_name"] filter_fields = ["id", "mobile", "username", "email", "first_name"]
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params) filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-date_joined") sort = request.query_params.get("sort", "-date_joined")
@ -42,23 +35,20 @@ class UserInfoView(APIView):
filter_data["certification__status__isnull"] = True filter_data["certification__status__isnull"] = True
else: else:
filter_data["certification__status"] = certification filter_data["certification__status"] = certification
page_obj = PageNumber() page_obj = AppsPageNumber()
obj_list = UserInfo.objects.filter(**filter_data).order_by(sort) obj_list = UserInfo.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request, page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self) view=self)
serializer = AdminUserInfoSerializer(page_serializer, many=True) serializer = AdminUserInfoSerializer(page_serializer, many=True)
res.data = serializer.data data = serializer.data
res.total = obj_list.count() total = obj_list.count()
return Response(res.dict) return ApiResponse(data=data, total=total)
def put(self, request): def put(self, request):
res = BaseResponse()
data = request.data data = request.data
id = data.get("id", None) id = data.get("id", None)
if not id: if not id:
res.code = 1003 return ApiResponse(code=1003, msg="参数错误")
res.msg = "参数错误"
return Response(res.dict)
user_obj = UserInfo.objects.filter(id=id).first() user_obj = UserInfo.objects.filter(id=id).first()
if user_obj: if user_obj:
data['pk'] = id data['pk'] = id
@ -73,38 +63,32 @@ class UserInfoView(APIView):
UserCertificationInfo.objects.filter(user_id=user_obj).update(status=data["certification"]) UserCertificationInfo.objects.filter(user_id=user_obj).update(status=data["certification"])
if status != 1 and UserCertificationInfo.objects.filter(user_id=user_obj).first().status == 1: if status != 1 and UserCertificationInfo.objects.filter(user_id=user_obj).first().status == 1:
auth_user_download_times_gift(user_obj, AUTH_USER_GIVE_DOWNLOAD_TIMES) auth_user_download_times_gift(user_obj, AUTH_USER_GIVE_DOWNLOAD_TIMES)
res.data = users_serializer.data data = users_serializer.data
return Response(res.dict) return ApiResponse(data=data)
res.code = 1004 return ApiResponse(code=1004, msg='数据校验失败')
res.msg = "数据校验失败"
return Response(res.dict)
class UserCertificationInfoView(APIView): class UserCertificationInfoView(APIView):
authentication_classes = [AdminTokenAuthentication, ] authentication_classes = [AdminTokenAuthentication, ]
def get(self, request): def get(self, request):
res = BaseResponse()
filter_fields = ["id", "card", "name", "status"] filter_fields = ["id", "card", "name", "status"]
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params) filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time") sort = request.query_params.get("sort", "-created_time")
page_obj = PageNumber() page_obj = AppsPageNumber()
obj_list = UserCertificationInfo.objects.filter(**filter_data).order_by(sort) obj_list = UserCertificationInfo.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request, page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self) view=self)
serializer = AdminUserCertificationSerializer(page_serializer, many=True) serializer = AdminUserCertificationSerializer(page_serializer, many=True)
res.data = serializer.data data = serializer.data
res.total = obj_list.count() total = obj_list.count()
return Response(res.dict) return ApiResponse(data=data, total=total)
def put(self, request): def put(self, request):
res = BaseResponse()
data = request.data data = request.data
pk = data.get("id", None) pk = data.get("id", None)
if not pk: if not pk:
res.code = 1003 return ApiResponse(code=1003, msg='参数错误')
res.msg = "参数错误"
return Response(res.dict)
obj = UserCertificationInfo.objects.filter(id=pk).first() obj = UserCertificationInfo.objects.filter(id=pk).first()
if obj: if obj:
data['pk'] = pk data['pk'] = pk
@ -114,58 +98,25 @@ class UserCertificationInfoView(APIView):
users_serializer.save() users_serializer.save()
if status != 1 and users_serializer.data.get('status') == 1: if status != 1 and users_serializer.data.get('status') == 1:
auth_user_download_times_gift(obj.user_id, AUTH_USER_GIVE_DOWNLOAD_TIMES) auth_user_download_times_gift(obj.user_id, AUTH_USER_GIVE_DOWNLOAD_TIMES)
res.data = users_serializer.data data = users_serializer.data
return Response(res.dict) return ApiResponse(data=data)
res.code = 1004 return ApiResponse(code=1004, msg='数据校验失败')
res.msg = "数据校验失败"
return Response(res.dict)
class ThirdWxAccountView(APIView): class ThirdWxAccountFilter(filters.FilterSet):
authentication_classes = [AdminTokenAuthentication, ] user_id = filters.NumberFilter(field_name="user_id__id")
def get(self, request): class Meta:
res = BaseResponse() model = ThirdWeChatUserInfo
filter_fields = ["id", "openid", "nickname", "subscribe", "user_id"] fields = ["id", "openid", "nickname", "subscribe", "user_id"]
filter_data = get_dict_from_filter_fields(filter_fields, request.query_params)
sort = request.query_params.get("sort", "-created_time")
page_obj = PageNumber()
obj_list = ThirdWeChatUserInfo.objects.filter(**filter_data).order_by(sort)
page_serializer = page_obj.paginate_queryset(queryset=obj_list, request=request,
view=self)
serializer = AdminThirdWxSerializer(page_serializer, many=True)
res.data = serializer.data
res.total = obj_list.count()
return Response(res.dict)
def put(self, request):
res = BaseResponse() class ThirdWxAccountView(BaseModelSet):
data = request.data authentication_classes = [AdminTokenAuthentication, ]
pk = data.get("id", None) queryset = ThirdWeChatUserInfo.objects.all()
if not pk: serializer_class = AdminThirdWxSerializer
res.code = 1003 pagination_class = AppsPageNumber
res.msg = "参数错误"
return Response(res.dict) filter_backends = [DjangoFilterBackend, OrderingFilter]
obj = ThirdWeChatUserInfo.objects.filter(pk=pk).first() ordering_fields = ['created_time']
if obj: filterset_class = ThirdWxAccountFilter
data['pk'] = pk
serializer_obj = AdminThirdWxSerializer(obj, data=data, partial=True)
if serializer_obj.is_valid():
serializer_obj.save()
res.data = serializer_obj.data
return Response(res.dict)
res.code = 1004
res.msg = "数据校验失败"
return Response(res.dict)
def delete(self, request):
res = BaseResponse()
data = request.data
pk = data.get("id", None)
if not pk:
res.code = 1003
res.msg = "参数错误"
else:
ThirdWeChatUserInfo.objects.filter(pk=pk).delete()
return self.get(request)
return Response(res.dict)

@ -262,4 +262,4 @@ class PageNumber(PageNumberPagination):
page_size = 10 # 每页显示多少条 page_size = 10 # 每页显示多少条
page_size_query_param = 'size' # URL中每页显示条数的参数 page_size_query_param = 'size' # URL中每页显示条数的参数
page_query_param = 'page' # URL中页码的参数 page_query_param = 'page' # URL中页码的参数
max_page_size = None # 最大页码数限制 max_page_size = 100 # 最大页码数限制

@ -97,49 +97,6 @@ class UserInfoSerializer(serializers.ModelSerializer):
return get_user_domain_name(obj, 0) return get_user_domain_name(obj, 0)
class AdminUserInfoSerializer(UserInfoSerializer):
class Meta:
model = models.UserInfo
exclude = ["password", "api_token"]
read_only_fields = ["id", "head_img", "free_download_times", "last_login",
"is_superuser", "last_name", "is_staff", "uid",
"date_joined", "download_times", "all_download_times", "storage", "groups",
"user_permissions", "certification_id", " app_count"]
gender_choices = serializers.SerializerMethodField()
def get_gender_choices(self, obj):
return get_choices_dict(obj.gender_choices)
role_choices = serializers.SerializerMethodField()
def get_role_choices(self, obj):
return get_choices_dict(obj.role_choices)
storage_choices = serializers.SerializerMethodField()
def get_storage_choices(self, obj):
return get_choices_dict(models.AppStorage.storage_choices[1:])
certification_status_choices = serializers.SerializerMethodField()
def get_certification_status_choices(self, obj):
return get_choices_dict(models.UserCertificationInfo.status_choices)
certification_id = serializers.SerializerMethodField()
def get_certification_id(self, obj):
return models.UserCertificationInfo.objects.filter(user_id=obj).values('id').first()
app_count = serializers.SerializerMethodField()
def get_app_count(self, obj):
return models.Apps.objects.filter(user_id=obj).count()
def update(self, instance, validated_data):
return super(AdminUserInfoSerializer, self).update(instance, validated_data)
class AppsSerializer(serializers.ModelSerializer): class AppsSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.Apps model = models.Apps
@ -280,36 +237,6 @@ class AppsQrListSerializer(AppsListSerializer):
return {} return {}
class AdminAppsSerializer(AppsSerializer):
class Meta:
model = models.Apps
fields = "__all__"
read_only_fields = ["id", "app_id", "user_id", "bundle_id", "count_hits", "updated_time", "created_time"]
status_choices = serializers.SerializerMethodField()
def get_status_choices(self, obj):
return get_choices_dict(obj.status_choices)
type_choices = serializers.SerializerMethodField()
def get_type_choices(self, obj):
return get_choices_dict(obj.type_choices)
supersign_type_choices = serializers.SerializerMethodField()
def get_supersign_type_choices(self, obj):
return get_choices_dict(obj.supersign_type_choices)
release_count = serializers.SerializerMethodField()
def get_release_count(self, obj):
return models.AppReleaseInfo.objects.filter(app_id=obj).count()
def update(self, instance, validated_data):
return super(AdminAppsSerializer, self).update(instance, validated_data)
class AppsShortSerializer(serializers.ModelSerializer): class AppsShortSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.Apps model = models.Apps
@ -414,26 +341,6 @@ class AppReleaseSerializer(serializers.ModelSerializer):
return {"changelog": False, "binary_url": False} return {"changelog": False, "binary_url": False}
class AdminAppReleaseSerializer(AppReleaseSerializer):
class Meta:
model = models.AppReleaseInfo
fields = "__all__"
read_only_fields = ["id", "app_id", "release_id", "binary_size"]
release_choices = serializers.SerializerMethodField()
def get_release_choices(self, obj):
return get_choices_dict(obj.release_choices)
def update(self, instance, validated_data):
if validated_data.get("is_master", False):
models.AppReleaseInfo.objects.filter(app_id=instance.app_id).update(**{"is_master": False})
else:
if "is_master" in validated_data and validated_data.get("is_master") != True:
del validated_data["is_master"]
return super(AdminAppReleaseSerializer, self).update(instance, validated_data)
class StorageSerializer(serializers.ModelSerializer): class StorageSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.AppStorage model = models.AppStorage
@ -471,20 +378,6 @@ class StorageSerializer(serializers.ModelSerializer):
return super().update(instance, validated_data) return super().update(instance, validated_data)
class AdminStorageSerializer(StorageSerializer):
class Meta:
model = models.AppStorage
fields = "__all__"
read_only_fields = ["id", "user_id", "updated_time", "created_time", "storage_type"]
storage_choices = serializers.SerializerMethodField()
def get_storage_choices(self, obj):
return get_choices_dict(obj.storage_choices[1:])
used_id = serializers.IntegerField(source="user_id.pk")
class DeveloperSerializer(serializers.ModelSerializer): class DeveloperSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.AppIOSDeveloperInfo model = models.AppIOSDeveloperInfo
@ -561,18 +454,6 @@ class DeveloperSerializer(serializers.ModelSerializer):
return models.DeveloperAppID.objects.filter(developerid=obj).count() return models.DeveloperAppID.objects.filter(developerid=obj).count()
class AdminDeveloperSerializer(DeveloperSerializer):
class Meta:
model = models.AppIOSDeveloperInfo
# depth = 1
exclude = ["p8key", ]
auth_type_choices = serializers.SerializerMethodField()
def get_auth_type_choices(self, obj):
return get_choices_dict(obj.auth_type_choices)
class SuperSignUsedSerializer(serializers.ModelSerializer): class SuperSignUsedSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.APPSuperSignUsedInfo model = models.APPSuperSignUsedInfo
@ -616,21 +497,6 @@ class SuperSignUsedSerializer(serializers.ModelSerializer):
return obj.user_id.uid return obj.user_id.uid
class AdminSuperSignUsedSerializer(SuperSignUsedSerializer):
class Meta:
model = models.APPSuperSignUsedInfo
fields = ["created_time", "device_udid", "device_name", "developer_id", "bundle_id", "bundle_name", "app_id",
"id", "user_id", "short", "developer_pk"]
app_id = serializers.IntegerField(source="app_id.pk")
user_id = serializers.IntegerField(source="user_id.pk")
short = serializers.CharField(source="app_id.short")
developer_pk = serializers.IntegerField(source="developerid.pk")
class DeveloperDeviceSerializer(serializers.ModelSerializer): class DeveloperDeviceSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.UDIDsyncDeveloper model = models.UDIDsyncDeveloper
@ -706,29 +572,6 @@ class OrdersSerializer(serializers.ModelSerializer):
exclude = ["id"] exclude = ["id"]
class AdminOrdersSerializer(serializers.ModelSerializer):
class Meta:
model = models.Order
fields = "__all__"
read_only_fields = ["id", "user_id", "updated_time", "created_time", "payment_number", "order_number",
"payment_name", "actual_amount", "actual_download_times", "actual_download_gift_times"]
payment_type_choices = serializers.SerializerMethodField()
def get_payment_type_choices(self, obj):
return get_choices_dict(obj.payment_type_choices)
status_choices = serializers.SerializerMethodField()
def get_status_choices(self, obj):
return get_choices_dict(obj.status_choices)
order_type_choices = serializers.SerializerMethodField()
def get_order_type_choices(self, obj):
return get_choices_dict(obj.order_type_choices)
class CertificationSerializer(serializers.ModelSerializer): class CertificationSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.CertificationInfo model = models.CertificationInfo
@ -746,45 +589,12 @@ class UserCertificationSerializer(serializers.ModelSerializer):
exclude = ["id", "user_id", "created_time"] exclude = ["id", "user_id", "created_time"]
class AdminUserCertificationSerializer(serializers.ModelSerializer):
class Meta:
model = models.UserCertificationInfo
fields = "__all__"
read_only_fields = ["id", "user_id", "reviewed_time", "created_time"]
certification_status_choices = serializers.SerializerMethodField()
def get_certification_status_choices(self, obj):
return get_choices_dict(obj.status_choices)
certification_infos = serializers.SerializerMethodField()
def get_certification_infos(self, obj):
result = []
for c_info in models.CertificationInfo.objects.filter(user_id=obj.user_id).all():
result.append({
'name': get_choices_name_from_key(models.CertificationInfo.type_choices, c_info.type),
'certification_url': get_download_url_from_context(self, obj, '', c_info.certification_url)
})
return result
def update(self, instance, validated_data):
return super(AdminUserCertificationSerializer, self).update(instance, validated_data)
class ThirdWxSerializer(serializers.ModelSerializer): class ThirdWxSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.ThirdWeChatUserInfo model = models.ThirdWeChatUserInfo
exclude = ["id", "sex", "address", "user_id"] exclude = ["id", "sex", "address", "user_id"]
class AdminThirdWxSerializer(ThirdWxSerializer):
class Meta:
model = models.ThirdWeChatUserInfo
fields = "__all__"
read_only_fields = ["id", "openid", "user_id", "head_img_url"]
class DomainNameSerializer(serializers.ModelSerializer): class DomainNameSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.UserDomainInfo model = models.UserDomainInfo
@ -803,18 +613,6 @@ class DomainNameSerializer(serializers.ModelSerializer):
return {} return {}
class AdminDomainNameSerializer(DomainNameSerializer):
class Meta:
model = models.UserDomainInfo
fields = "__all__"
read_only_fields = ["id", "app_id", "domain_type", "created_time", "cname_id"]
domain_type_choices = serializers.SerializerMethodField()
def get_domain_type_choices(self, obj):
return get_choices_dict(obj.domain_type_choices)
class UserAdInfoSerializer(serializers.ModelSerializer): class UserAdInfoSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.UserAdDisplayInfo model = models.UserAdDisplayInfo
@ -896,43 +694,12 @@ class BillInfoSerializer(serializers.ModelSerializer):
return f"{obj.to_user_id.first_name} {self.get_action(obj)} -{obj.number} 设备数" return f"{obj.to_user_id.first_name} {self.get_action(obj)} -{obj.number} 设备数"
class AdminBillInfoSerializer(BillInfoSerializer):
class Meta:
model = models.IosDeveloperPublicPoolBill
fields = '__all__'
read_only_fields = ["id", "user_id", "to_user_id", "action", "number", "app_info", "udid",
"udid_sync_info", "app_id", "remote_addr"]
action_choices = serializers.SerializerMethodField()
def get_action_choices(self, obj):
return get_choices_dict(obj.action_choices)
class AppReportSerializer(serializers.ModelSerializer): class AppReportSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.AppReportInfo model = models.AppReportInfo
exclude = ["id"] exclude = ["id"]
class AdminAppReportSerializer(AppReportSerializer):
class Meta:
model = models.AppReportInfo
fields = '__all__'
read_only_fields = ["id", "app_id", "username", "created_time", "email", "report_reason", "report_type",
"remote_addr", "bundle_id", "app_name"]
report_type_choices = serializers.SerializerMethodField()
def get_report_type_choices(self, obj):
return get_choices_dict(obj.report_type_choices)
status_choices = serializers.SerializerMethodField()
def get_status_choices(self, obj):
return get_choices_dict(obj.status_choices)
class AppleDeveloperToAppUseSerializer(serializers.ModelSerializer): class AppleDeveloperToAppUseSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.AppleDeveloperToAppUse model = models.AppleDeveloperToAppUse

@ -10,7 +10,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from api.base_views import storage_change, app_delete from api.base_views import storage_change, app_delete
from api.models import AppStorage, UserInfo, Apps from api.models import AppStorage, Apps
from api.utils.app.apputils import clean_history_apps from api.utils.app.apputils import clean_history_apps
from api.utils.auth import ExpiringTokenAuthentication, StoragePermission from api.utils.auth import ExpiringTokenAuthentication, StoragePermission
from api.utils.response import BaseResponse from api.utils.response import BaseResponse

@ -50,13 +50,14 @@ def invalid_short_cache(app_obj, key='ShortDownloadView'.lower()):
return return
master_release_dict = AppReleaseInfo.objects.filter(app_id=app_obj, is_master=True).values('icon_url', master_release_dict = AppReleaseInfo.objects.filter(app_id=app_obj, is_master=True).values('icon_url',
'release_id').first() 'release_id').first()
# 1.清理图片缓存 if master_release_dict:
DownloadUrlCache(key, master_release_dict.get('icon_url')).del_storage_cache() # 1.清理图片缓存
DownloadUrlCache(key, master_release_dict.get('icon_url')).del_storage_cache()
release_id = master_release_dict.get('release_id')
# 2.清理下载token缓存 release_id = master_release_dict.get('release_id')
TokenManagerCache(key, release_id).del_storage_cache() # 2.清理下载token缓存
TokenManagerCache('', f"{release_id}.plist").del_storage_cache() TokenManagerCache(key, release_id).del_storage_cache()
TokenManagerCache('', f"{release_id}.plist").del_storage_cache()
# 3.清理广告缓存 # 3.清理广告缓存
invalid_ad_pic_cache(key, app_obj.short) invalid_ad_pic_cache(key, app_obj.short)

@ -45,6 +45,7 @@ INSTALLED_APPS = [
'django_celery_beat', 'django_celery_beat',
'django_celery_results', 'django_celery_results',
'corsheaders', 'corsheaders',
'django_filters',
] ]
MIDDLEWARE = [ MIDDLEWARE = [
@ -137,15 +138,17 @@ AUTH_PASSWORD_VALIDATORS = [
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
}, },
] ]
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( 'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer', 'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
), ),
'DEFAULT_THROTTLE_CLASSES': [ 'DEFAULT_THROTTLE_CLASSES': [
'api.utils.throttle.LoginUserThrottle', 'api.utils.throttle.LoginUserThrottle',
], ],
'DEFAULT_THROTTLE_RATES': BASECONF.DEFAULT_THROTTLE_RATES 'DEFAULT_THROTTLE_RATES': BASECONF.DEFAULT_THROTTLE_RATES,
'EXCEPTION_HANDLER': 'admin.utils.exception.common_exception_handler',
} }
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/ # https://docs.djangoproject.com/en/3.0/topics/i18n/
@ -165,9 +168,13 @@ DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/ # https://docs.djangoproject.com/en/3.0/howto/static-files/
STATIC_URL = '/static/' STATIC_URL = '/statics/'
# python manage.py collectstatic 收集到的静态文件
STATIC_ROOT = os.path.join(BASE_DIR, "api-static")
STATICFILES_DIRS = [ STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static") os.path.join(BASE_DIR, "statics")
] ]
# Media配置 # Media配置

@ -21,4 +21,5 @@ psutil==5.6.6
flower==1.0.0 flower==1.0.0
django-proxy==1.2.1 django-proxy==1.2.1
uWSGI==2.0.20 uWSGI==2.0.20
django-cors-headers==3.10.1 django-cors-headers==3.10.1
django-filter==21.1
Loading…
Cancel
Save