parent
							
								
									d1a5d69ac8
								
							
						
					
					
						commit
						d8b124c1a7
					
				| @ -0,0 +1,470 @@ | ||||
| <template> | ||||
|   <el-main> | ||||
| 
 | ||||
|     <el-dialog | ||||
|         :close-on-click-modal="false" | ||||
|         :close-on-press-escape="false" | ||||
|         :visible.sync="configVisible" | ||||
|         center | ||||
|         title="下载页部署配置" | ||||
|         width="666px"> | ||||
| 
 | ||||
| 
 | ||||
|       <el-card v-for="info in config_lists" :key="info.key" class="box-card" shadow="hover" | ||||
|                style="margin-bottom: 20px"> | ||||
|         <div slot="header" class="clearfix"> | ||||
|           <span><el-tag size="medium" type="info">配置KEY</el-tag> <el-tag size="medium">{{ info.key }}</el-tag></span> | ||||
|           <div style="float: right"> | ||||
|             <el-switch | ||||
|                 v-model="info.value" | ||||
|                 active-color="#13ce66" | ||||
|                 active-text="启用" | ||||
|                 active-value="true" | ||||
|                 inactive-color="#ff4949" | ||||
|                 inactive-text="关闭" | ||||
|                 inactive-value="false" | ||||
|                 @change="changeConfig(info)"> | ||||
|             </el-switch> | ||||
|           </div> | ||||
|         </div> | ||||
|         <el-tag size="medium" type="info">描述信息</el-tag> | ||||
|         {{ info.title }} | ||||
|       </el-card> | ||||
|       <el-divider></el-divider> | ||||
|       <el-card style="margin-top: 20px"> | ||||
|         <div slot="header" class="clearfix"> | ||||
|           <el-tag size="medium" type="success">下载页源码及操作文档</el-tag> | ||||
|         </div> | ||||
|         <div v-if="short_download_list.length>0"> | ||||
|           <div style="margin: 10px" v-for="short_download_uri in short_download_list" :key="short_download_uri.key"> | ||||
|             <el-tag size="medium" type="info">{{short_download_uri.title}}</el-tag> | ||||
|             <el-link style="margin-left: 10px" :href="short_download_uri.value" target="_blank">点击下载</el-link> | ||||
|         </div> | ||||
|         </div> | ||||
|       </el-card> | ||||
| 
 | ||||
|       <div slot="footer" class="dialog-footer"> | ||||
|         <el-button @click="updateConfig">恢复默认值</el-button> | ||||
|         <el-button @click="configVisible=false">取消</el-button> | ||||
|       </div> | ||||
| 
 | ||||
|     </el-dialog> | ||||
| 
 | ||||
|     <el-dialog | ||||
|         :close-on-click-modal="false" | ||||
|         :close-on-press-escape="false" | ||||
|         :visible.sync="addCnameVisible" | ||||
|         center | ||||
|         title="添加下载页服务器域名" | ||||
|         width="800px"> | ||||
| 
 | ||||
|       <el-steps :active="p_active" finish-status="success" :align-center="true"> | ||||
|         <el-step title="添加服务器域名"></el-step> | ||||
|         <el-step title="验证服务器域名所有权"></el-step> | ||||
|         <el-step title="添加成功"></el-step> | ||||
|       </el-steps> | ||||
| 
 | ||||
|       <el-container> | ||||
| 
 | ||||
|         <div v-if="p_active===0" style="margin-top: 20px"> | ||||
|           <el-tag style="margin: 10px 5px">1.如果是cdn等含有CNAME,直接添加cdn的 CNAME 值</el-tag> | ||||
|           <el-tag style="margin: 10px 5px">2.如果是服务器,需要将域名解析到服务器,然后添加该解析的域名</el-tag> | ||||
|           <div style="width: 600px;text-align: center;margin: auto"> | ||||
| 
 | ||||
|             <el-form ref="form" :model="addSerInfo" label-width="120px"> | ||||
| 
 | ||||
|               <el-form-item label="下载服务器域名"> | ||||
|                 <el-input v-model="addSerInfo.domain_record" placeholder="cdn的cname或者服务器的域名,必填"></el-input> | ||||
|               </el-form-item> | ||||
| 
 | ||||
|               <el-form-item label="下载服务器地址"> | ||||
|                 <el-input v-model="addSerInfo.ip_address" placeholder="如果有服务器地址,添加服务器ip,否则填写服务器域名"></el-input> | ||||
|               </el-form-item> | ||||
|               <el-form-item label="备注"> | ||||
|                 <el-input type="textarea" v-model="addSerInfo.description"></el-input> | ||||
|               </el-form-item> | ||||
|             </el-form> | ||||
|             <div style="margin-top: 20px;"> | ||||
|               <el-button type="primary" @click="addCnameSer">下一步</el-button> | ||||
|             </div> | ||||
|           </div> | ||||
| 
 | ||||
|         </div> | ||||
| 
 | ||||
|         <div v-else-if="p_active===1" style="margin-top: 30px;text-align: center"> | ||||
| 
 | ||||
|           请联系域名管理员,前往 <strong>{{ cnameInfo.domain_record }}</strong> 域名 DNS 管理后台添加如下 {{ cnameInfo.r_type }} 记录。 | ||||
|           <el-table | ||||
|               :data="domain_tData" | ||||
|               border | ||||
|               stripe | ||||
|               v-loading="loading" | ||||
|               style="width: 100%;margin-top: 20px"> | ||||
|             <el-table-column | ||||
|                 align="center" | ||||
|                 label="记录类型" | ||||
|                 prop="r_type" | ||||
|                 width="100"> | ||||
|             </el-table-column> | ||||
|             <el-table-column | ||||
|                 align="center" | ||||
|                 label="主机记录" | ||||
|                 prop="host_r" | ||||
|             > | ||||
|               <template slot-scope="scope"> | ||||
|                 <el-tooltip content="点击复制到剪贴板"> | ||||
|                   <el-link v-if="scope.row.host_r" v-clipboard:copy="scope.row.host_r" | ||||
|                            v-clipboard:success="copy_success" | ||||
|                            :underline="false">{{ scope.row.host_r }} | ||||
|                   </el-link> | ||||
|                 </el-tooltip> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|             <el-table-column | ||||
|                 align="center" | ||||
|                 label="记录值" | ||||
|                 prop="cname_r" | ||||
|                 width="300"> | ||||
|               <template slot-scope="scope"> | ||||
|                 <el-tooltip content="点击复制到剪贴板"> | ||||
|                   <el-link v-if="scope.row.cname_r" v-clipboard:copy="scope.row.cname_r" | ||||
|                            v-clipboard:success="copy_success" | ||||
|                            :underline="false">{{ scope.row.cname_r }} | ||||
|                   </el-link> | ||||
|                 </el-tooltip> | ||||
|               </template> | ||||
|             </el-table-column> | ||||
|           </el-table> | ||||
|           <el-alert :closable="false" | ||||
|                     show-icon | ||||
|                     style="margin-top: 30px" | ||||
|                     title="请在域名DNS配置成功后,点击“下一步”按钮" | ||||
|                     type="warning"/> | ||||
| 
 | ||||
|           <div style="margin-top: 20px;text-align: center;"> | ||||
|             <el-button type="primary" @click="p_active=0">上一步</el-button> | ||||
|             <el-button type="primary" @click="checkCnameSer" :disabled="loading">下一步</el-button> | ||||
|           </div> | ||||
|         </div> | ||||
|       </el-container> | ||||
| 
 | ||||
| 
 | ||||
|     </el-dialog> | ||||
| 
 | ||||
| 
 | ||||
|     <div> | ||||
|       <el-input | ||||
|           v-model="search_key" | ||||
|           clearable | ||||
|           placeholder="输入下载服务器域名" | ||||
|           style="width: 30%;margin-right: 30px;margin-bottom: 5px"/> | ||||
|       <el-button icon="el-icon-search" type="primary" @click="handleCurrentChange(1)"> | ||||
|         搜索 | ||||
|       </el-button> | ||||
|       <div style="float: right"> | ||||
| 
 | ||||
| 
 | ||||
|         <el-tooltip content="下载页配置,可以定制部署私有下载页"> | ||||
|           <el-button plain type="primary" @click="configFun"> | ||||
|             下载页配置 | ||||
|           </el-button> | ||||
|         </el-tooltip> | ||||
|         <el-button plain type="primary" @click="addDownloadSer"> | ||||
|           添加下载页服务器 | ||||
|         </el-button> | ||||
|       </div> | ||||
| 
 | ||||
|       <el-table | ||||
|           v-loading="loading" | ||||
|           :data="cname_info_list" | ||||
|           border | ||||
|           stripe | ||||
|           style="width: 100%"> | ||||
| 
 | ||||
|         <el-table-column | ||||
|             align="center" | ||||
|             fixed | ||||
|             label="下载服务器域名" | ||||
|             prop="domain_name"> | ||||
|           <template slot-scope="scope"> | ||||
|             <el-tooltip content="点击复制到剪贴板"> | ||||
|               <el-link v-if="scope.row.domain_record" v-clipboard:copy="scope.row.domain_record" | ||||
|                        v-clipboard:success="copy_success" | ||||
|                        :underline="false">{{ scope.row.domain_record }} | ||||
|               </el-link> | ||||
|             </el-tooltip> | ||||
|           </template> | ||||
|         </el-table-column> | ||||
| 
 | ||||
|         <el-table-column | ||||
|             align="center" | ||||
|             label="下载服务器地址" | ||||
|             prop="ip_address"> | ||||
|         </el-table-column> | ||||
| 
 | ||||
|         <el-table-column | ||||
|             align="center" | ||||
|             label="状态" | ||||
|             prop="is_enable" | ||||
|             width="110"> | ||||
| 
 | ||||
|           <template slot-scope="scope"> | ||||
|             <el-tooltip v-if="scope.row.is_enable === true" content="已经绑定成功" placement="left-start"> | ||||
|               <el-button size="small" type="success">成功 | ||||
|               </el-button> | ||||
|             </el-tooltip> | ||||
|             <el-tooltip v-else content="点击激活服务器域名绑定信息" placement="left-start"> | ||||
|               <el-button size="small" type="warning" @click="continueBind(scope.row)">继续绑定 | ||||
|               </el-button> | ||||
|             </el-tooltip> | ||||
| 
 | ||||
|           </template> | ||||
| 
 | ||||
|         </el-table-column> | ||||
| 
 | ||||
|         <el-table-column | ||||
|             :formatter="format_create_time" | ||||
|             align="center" | ||||
|             label="域名绑定时间" | ||||
|             prop="created_time" | ||||
|             width="170" | ||||
|         > | ||||
|         </el-table-column> | ||||
|         <el-table-column | ||||
|             align="center" | ||||
|             label="备注" | ||||
|             prop="description"> | ||||
|         </el-table-column> | ||||
|         <el-table-column | ||||
|             align="center" | ||||
|             label="操作" | ||||
|             prop="is_enable" | ||||
|             width="100"> | ||||
| 
 | ||||
|           <template slot-scope="scope"> | ||||
|             <el-tooltip content="删除该下载页服务器" placement="left-start"> | ||||
|               <el-button size="small" type="danger" @click="delCnameSer(scope.row)">删除 | ||||
|               </el-button> | ||||
|             </el-tooltip> | ||||
| 
 | ||||
|           </template> | ||||
| 
 | ||||
|         </el-table-column> | ||||
|       </el-table> | ||||
| 
 | ||||
| 
 | ||||
|     </div> | ||||
|     <div style="margin-top: 20px;margin-bottom: 20px"> | ||||
|       <el-pagination | ||||
|           :current-page.sync="pagination.currentPage" | ||||
|           :page-size="pagination.pagesize" | ||||
|           :page-sizes="[10, 20, 50, 100]" | ||||
|           :total="pagination.total" | ||||
|           layout="total,sizes, prev, pager, next" | ||||
|           @size-change="handleSizeChange" | ||||
|           @current-change="handleCurrentChange"> | ||||
|       </el-pagination> | ||||
|     </div> | ||||
|   </el-main> | ||||
| </template> | ||||
| 
 | ||||
| <script> | ||||
| 
 | ||||
| import {dCnameInfoFun, personalConfigInfo} from "@/restful"; | ||||
| import {getUserInfoFun} from '@/utils' | ||||
| import {format_time} from "@/utils/base/utils"; | ||||
| 
 | ||||
| export default { | ||||
|   name: "FirUserDomain", | ||||
|   data() { | ||||
|     return { | ||||
|       addSerInfo: {}, | ||||
|       cnameInfo: {}, | ||||
|       domain_tData: [], | ||||
|       p_active: 0, | ||||
|       cname_info_list: [], | ||||
|       search_key: "", | ||||
|       pagination: {"currentPage": 1, "total": 0, "pagesize": 10}, | ||||
|       loading: false, | ||||
|       configVisible: false, | ||||
|       addCnameVisible: false, | ||||
|       config_lists: [], | ||||
|       short_download_list: [] | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     continueBind(cname_info) { | ||||
|       this.addSerInfo = cname_info | ||||
|       this.addCnameVisible = true | ||||
|       this.addCnameSer() | ||||
|     }, | ||||
|     delCnameSer(cname_info) { | ||||
|       this.$confirm('若下载域名绑定到该解析,同时也会删除绑定的下载域名,是否继续删除?', '警告', { | ||||
|         confirmButtonText: '确定', | ||||
|         cancelButtonText: '取消', | ||||
|         type: 'warning' | ||||
|       }).then(() => { | ||||
|         dCnameInfoFun(data => { | ||||
|           if (data.code === 1000) { | ||||
|             this.$message.success("删除成功") | ||||
|             this.get_data_from_tabname(); | ||||
|           } else { | ||||
|             this.$message.error("操作失败了 " + data.msg) | ||||
|           } | ||||
|         }, { | ||||
|           methods: 'DELETE', | ||||
|           data: {'domain_record': cname_info.domain_record} | ||||
|         }) | ||||
|       }) | ||||
|     }, | ||||
|     checkCnameSer() { | ||||
|       this.loading=true | ||||
|       dCnameInfoFun(data => { | ||||
|         this.loading=false | ||||
|         if (data.code === 1000) { | ||||
|           this.$message.success(this.addSerInfo.domain_record + " 添加成功") | ||||
|           this.get_data_from_tabname(); | ||||
|           this.addDownloadSer() | ||||
|           this.addCnameVisible = false | ||||
|         } else { | ||||
|           this.$message.error("操作失败了 " + data.msg) | ||||
|         } | ||||
|       }, { | ||||
|         methods: 'PUT', | ||||
|         data: {'act': 'check', 'domain_record': this.addSerInfo.domain_record} | ||||
|       }) | ||||
|     }, | ||||
|     addCnameSer() { | ||||
|       let domain_record = this.addSerInfo.domain_record | ||||
|       let ip_address = this.addSerInfo.ip_address | ||||
|       if (domain_record && domain_record.length > 6 && ip_address && ip_address.length > 6) { | ||||
|         dCnameInfoFun(data => { | ||||
|           if (data.code === 1000) { | ||||
|             this.p_active = 1 | ||||
|             this.cnameInfo = data.data | ||||
|             this.domain_tData = [this.cnameInfo] | ||||
|           } else { | ||||
|             this.$message.error("操作失败了 " + data.msg) | ||||
|           } | ||||
|         }, { | ||||
|           methods: 'POST', | ||||
|           data: this.addSerInfo | ||||
|         }) | ||||
|       } else { | ||||
|         this.$message.error("参数有误") | ||||
|       } | ||||
| 
 | ||||
|     }, | ||||
|     addDownloadSer() { | ||||
|       this.addSerInfo = {} | ||||
|       this.cnameInfo = {} | ||||
|       this.p_active = 0 | ||||
|       this.addCnameVisible = true | ||||
|     }, | ||||
|     configFun() { | ||||
|       personalConfigInfo(data => { | ||||
|         if (data.code === 1000) { | ||||
|           this.short_download_list = data.data | ||||
|         } else { | ||||
|           this.$message.error("获取数据失败了 " + data.msg) | ||||
|         } | ||||
|       }, { | ||||
|         methods: 'GET' | ||||
|       }, 'short_download_uri') | ||||
| 
 | ||||
| 
 | ||||
|       personalConfigInfo(data => { | ||||
|         if (data.code === 1000) { | ||||
|           this.config_lists = data.data | ||||
|           this.configVisible = true | ||||
|         } else { | ||||
|           this.$message.error("获取数据失败了 " + data.msg) | ||||
|         } | ||||
|       }, { | ||||
|         methods: 'GET' | ||||
|       }, 'preview_route') | ||||
|     }, | ||||
|     changeConfig(info) { | ||||
|       personalConfigInfo(data => { | ||||
|         if (data.code === 1000) { | ||||
|           this.$message.success("操作成功") | ||||
|           this.configFun() | ||||
|         } else { | ||||
|           this.$message.error("操作失败了 " + data.msg) | ||||
|         } | ||||
|       }, { | ||||
|         methods: 'PUT', data: {config_key: info.key, config_value: info.value} | ||||
|       }, 'preview_route') | ||||
|     }, | ||||
|     updateConfig() { | ||||
|       personalConfigInfo(data => { | ||||
|         if (data.code === 1000) { | ||||
|           this.$message.success("操作成功") | ||||
|           this.configFun() | ||||
|         } else { | ||||
|           this.$message.error("操作失败了 " + data.msg) | ||||
|         } | ||||
|       }, { | ||||
|         methods: 'DELETE' | ||||
|       }, 'preview_route') | ||||
|     }, | ||||
| 
 | ||||
|     copy_success() { | ||||
|       this.$message.success('复制剪切板成功'); | ||||
|     }, | ||||
|     handleSizeChange(val) { | ||||
|       this.pagination.pagesize = val; | ||||
|       this.get_data_from_tabname({ | ||||
|         "size": this.pagination.pagesize, | ||||
|         "page": 1 | ||||
|       }) | ||||
|     }, | ||||
|     handleCurrentChange(val) { | ||||
|       this.pagination.currentPage = val; | ||||
|       this.get_data_from_tabname({ | ||||
|         "size": this.pagination.pagesize, | ||||
|         "page": this.pagination.currentPage | ||||
|       }) | ||||
|     }, | ||||
| 
 | ||||
|     get_data_from_tabname(data = {}) { | ||||
|       data.search_key = this.search_key.replace(/^\s+|\s+$/g, ""); | ||||
|       this.UserCnameInfoFun(data) | ||||
|     }, | ||||
|     UserCnameInfoFun(params) { | ||||
|       this.loading = true; | ||||
|       dCnameInfoFun(data => { | ||||
|         if (data.code === 1000) { | ||||
|           this.cname_info_list = data.data; | ||||
|           this.pagination.total = data.count; | ||||
| 
 | ||||
|         } else { | ||||
|           this.$message.error("域名绑定信息获取失败") | ||||
|         } | ||||
|         this.loading = false; | ||||
|       }, {methods: 'GET', data: params}) | ||||
|     }, | ||||
| 
 | ||||
|     format_create_time(row) { | ||||
|       return format_time(row.created_time) | ||||
|     }, | ||||
| 
 | ||||
|   }, mounted() { | ||||
|     getUserInfoFun(this); | ||||
|     this.get_data_from_tabname(); | ||||
|   } | ||||
| } | ||||
| </script> | ||||
| 
 | ||||
| <style scoped> | ||||
| .el-main { | ||||
|   margin: 20px auto 100px; | ||||
|   width: 1166px; | ||||
|   position: relative; | ||||
|   padding-bottom: 1px; | ||||
|   color: #9b9b9b; | ||||
|   -webkit-font-smoothing: antialiased; | ||||
|   border-radius: 1%; | ||||
| } | ||||
| 
 | ||||
| </style> | ||||
| @ -0,0 +1,32 @@ | ||||
| # Generated by Django 3.2.3 on 2022-07-25 16:12 | ||||
| 
 | ||||
| from django.db import migrations, models | ||||
| 
 | ||||
| 
 | ||||
| class Migration(migrations.Migration): | ||||
| 
 | ||||
|     dependencies = [ | ||||
|         ('api', '0006_auto_20220513_0843'), | ||||
|     ] | ||||
| 
 | ||||
|     operations = [ | ||||
|         migrations.AlterField( | ||||
|             model_name='domaincnameinfo', | ||||
|             name='is_enable', | ||||
|             field=models.BooleanField(default=False, verbose_name='是否启用该解析'), | ||||
|         ), | ||||
|         migrations.AlterField( | ||||
|             model_name='domaincnameinfo', | ||||
|             name='domain_record', | ||||
|             field=models.CharField(max_length=128, verbose_name='记录值'), | ||||
|         ), | ||||
|         migrations.AddField( | ||||
|             model_name='domaincnameinfo', | ||||
|             name='user_ipk', | ||||
|             field=models.IntegerField(default=0, verbose_name='用户ipk'), | ||||
|         ), | ||||
|         migrations.AlterUniqueTogether( | ||||
|             name='domaincnameinfo', | ||||
|             unique_together={('user_ipk', 'domain_record')}, | ||||
|         ), | ||||
|     ] | ||||
					Loading…
					
					
				
		Reference in new issue