mirror of https://github.com/dnomd343/sub-web
CareyWong
5 years ago
24 changed files with 9600 additions and 0 deletions
@ -0,0 +1,2 @@ |
|||
> 1% |
|||
last 2 versions |
@ -0,0 +1,18 @@ |
|||
module.exports = { |
|||
root: true, |
|||
env: { |
|||
node: true |
|||
}, |
|||
'extends': [ |
|||
'plugin:vue/essential', |
|||
'eslint:recommended' |
|||
], |
|||
rules: { |
|||
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', |
|||
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', |
|||
'semi': 0 |
|||
}, |
|||
parserOptions: { |
|||
parser: 'babel-eslint' |
|||
} |
|||
} |
@ -0,0 +1,21 @@ |
|||
.DS_Store |
|||
node_modules |
|||
/dist |
|||
|
|||
# local env files |
|||
.env.local |
|||
.env.*.local |
|||
|
|||
# Log files |
|||
npm-debug.log* |
|||
yarn-debug.log* |
|||
yarn-error.log* |
|||
|
|||
# Editor directories and files |
|||
.idea |
|||
.vscode |
|||
*.suo |
|||
*.ntvs* |
|||
*.njsproj |
|||
*.sln |
|||
*.sw? |
@ -0,0 +1,24 @@ |
|||
# sub-web |
|||
|
|||
## Project setup |
|||
``` |
|||
yarn install |
|||
``` |
|||
|
|||
### Compiles and hot-reloads for development |
|||
``` |
|||
yarn serve |
|||
``` |
|||
|
|||
### Compiles and minifies for production |
|||
``` |
|||
yarn build |
|||
``` |
|||
|
|||
### Lints and fixes files |
|||
``` |
|||
yarn lint |
|||
``` |
|||
|
|||
### Customize configuration |
|||
See [Configuration Reference](https://cli.vuejs.org/config/). |
@ -0,0 +1,14 @@ |
|||
module.exports = { |
|||
presets: [ |
|||
'@vue/cli-plugin-babel/preset' |
|||
], |
|||
plugins: [ |
|||
[ |
|||
"component", |
|||
{ |
|||
"libraryName": "element-ui", |
|||
"styleLibraryName": "theme-chalk" |
|||
} |
|||
] |
|||
] |
|||
} |
@ -0,0 +1,35 @@ |
|||
{ |
|||
"name": "sub-web", |
|||
"version": "0.1.0", |
|||
"private": true, |
|||
"scripts": { |
|||
"serve": "vue-cli-service serve", |
|||
"build": "vue-cli-service build", |
|||
"lint": "vue-cli-service lint" |
|||
}, |
|||
"dependencies": { |
|||
"atob": "^2.1.2", |
|||
"axios": "^0.19.1", |
|||
"btoa": "^1.2.1", |
|||
"core-js": "^3.4.4", |
|||
"element-ui": "^2.13.0", |
|||
"vue": "^2.6.10", |
|||
"vue-clipboard2": "^0.3.1", |
|||
"vue-router": "^3.1.3" |
|||
}, |
|||
"devDependencies": { |
|||
"@vue/cli-plugin-babel": "^4.1.0", |
|||
"@vue/cli-plugin-eslint": "^4.1.0", |
|||
"@vue/cli-plugin-router": "^4.1.0", |
|||
"@vue/cli-service": "^4.1.0", |
|||
"babel-eslint": "^10.0.3", |
|||
"babel-plugin-component": "^1.1.1", |
|||
"babel-plugin-import": "^1.13.0", |
|||
"eslint": "^5.16.0", |
|||
"eslint-plugin-vue": "^5.0.0", |
|||
"node-sass": "^4.13.0", |
|||
"sass-loader": "^8.0.0", |
|||
"vue-particles": "^1.0.9", |
|||
"vue-template-compiler": "^2.6.10" |
|||
} |
|||
} |
@ -0,0 +1,2 @@ |
|||
# 单页应用的 Netlify 设置 |
|||
/* /index.html 200 |
After Width: | Height: | Size: 17 KiB |
@ -0,0 +1,17 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="utf-8"> |
|||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
|||
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
|||
<link rel="icon" href="<%= BASE_URL %>favicon.ico"> |
|||
<title>sub-web</title> |
|||
</head> |
|||
<body> |
|||
<noscript> |
|||
<strong>We're sorry but sub-web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
|||
</noscript> |
|||
<div id="app"></div> |
|||
<!-- built files will be auto injected --> |
|||
</body> |
|||
</html> |
@ -0,0 +1,5 @@ |
|||
<template> |
|||
<div id="app"> |
|||
<router-view/> |
|||
</div> |
|||
</template> |
@ -0,0 +1,79 @@ |
|||
// cover some element-ui styles |
|||
|
|||
.el-breadcrumb__inner, |
|||
.el-breadcrumb__inner a { |
|||
font-weight: 400 !important; |
|||
} |
|||
|
|||
.el-upload { |
|||
input[type="file"] { |
|||
display: none !important; |
|||
} |
|||
} |
|||
|
|||
.el-upload__input { |
|||
display: none; |
|||
} |
|||
|
|||
.cell { |
|||
.el-tag { |
|||
margin-right: 0px; |
|||
} |
|||
} |
|||
|
|||
.small-padding { |
|||
.cell { |
|||
padding-left: 5px; |
|||
padding-right: 5px; |
|||
} |
|||
} |
|||
|
|||
.fixed-width { |
|||
.el-button--mini { |
|||
padding: 7px 10px; |
|||
width: 60px; |
|||
} |
|||
} |
|||
|
|||
.status-col { |
|||
.cell { |
|||
padding: 0 10px; |
|||
text-align: center; |
|||
|
|||
.el-tag { |
|||
margin-right: 0px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// to fixed https://github.com/ElemeFE/element/issues/2461 |
|||
.el-dialog { |
|||
transform: none; |
|||
left: 0; |
|||
position: relative; |
|||
margin: 0 auto; |
|||
} |
|||
|
|||
// refine element ui upload |
|||
.upload-container { |
|||
.el-upload { |
|||
width: 100%; |
|||
|
|||
.el-upload-dragger { |
|||
width: 100%; |
|||
height: 200px; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// dropdown |
|||
.el-dropdown-menu { |
|||
a { |
|||
display: block |
|||
} |
|||
} |
|||
|
|||
// fix date-picker ui bug in filter-item |
|||
.el-range-editor.el-input__inner { |
|||
display: inline-flex !important; |
|||
} |
@ -0,0 +1,31 @@ |
|||
/** |
|||
* I think element-ui's default theme color is too light for long-term use. |
|||
* So I modified the default color and you can modify it to your liking. |
|||
**/ |
|||
|
|||
/* theme color */ |
|||
$--color-primary: #304156; |
|||
$--color-success: #65C934; |
|||
$--color-warning: #E6A23C; |
|||
$--color-danger: #F56C6C; |
|||
// $--color-info: #1E1E1E; |
|||
|
|||
$--button-font-weight: 400; |
|||
|
|||
// $--color-text-regular: #1f2d3d; |
|||
|
|||
$--border-color-light: #dfe4ed; |
|||
$--border-color-lighter: #e6ebf5; |
|||
|
|||
$--table-border:1px solid#dfe6ec; |
|||
|
|||
/* icon font path, required */ |
|||
$--font-path: '~element-ui/lib/theme-chalk/fonts'; |
|||
|
|||
@import "~element-ui/packages/theme-chalk/src/index"; |
|||
|
|||
// the :export directive is the magic sauce for webpack |
|||
// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass |
|||
:export { |
|||
theme: $--color-primary; |
|||
} |
After Width: | Height: | Size: 6.7 KiB |
@ -0,0 +1,59 @@ |
|||
<template> |
|||
<div class="hello"> |
|||
<h1>{{ msg }}</h1> |
|||
<p> |
|||
For a guide and recipes on how to configure / customize this project,<br> |
|||
check out the |
|||
<a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>. |
|||
</p> |
|||
<h3>Installed CLI Plugins</h3> |
|||
<ul> |
|||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li> |
|||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li> |
|||
<li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-eslint" target="_blank" rel="noopener">eslint</a></li> |
|||
</ul> |
|||
<h3>Essential Links</h3> |
|||
<ul> |
|||
<li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li> |
|||
<li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li> |
|||
<li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li> |
|||
<li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li> |
|||
<li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li> |
|||
</ul> |
|||
<h3>Ecosystem</h3> |
|||
<ul> |
|||
<li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li> |
|||
<li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li> |
|||
<li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li> |
|||
<li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li> |
|||
<li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li> |
|||
</ul> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
export default { |
|||
name: 'HelloWorld', |
|||
props: { |
|||
msg: String |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<!-- Add "scoped" attribute to limit CSS to this component only --> |
|||
<style scoped> |
|||
h3 { |
|||
margin: 40px 0 0; |
|||
} |
|||
ul { |
|||
list-style-type: none; |
|||
padding: 0; |
|||
} |
|||
li { |
|||
display: inline-block; |
|||
margin: 0 10px; |
|||
} |
|||
a { |
|||
color: #42b983; |
|||
} |
|||
</style> |
@ -0,0 +1,15 @@ |
|||
import Vue from 'vue' |
|||
import App from './App.vue' |
|||
import router from './router' |
|||
require(`@/plugins/element-ui`) |
|||
require(`@/plugins/clipboard`) |
|||
require(`@/plugins/base64`) |
|||
require(`@/plugins/particles`) |
|||
require(`@/plugins/axios`) |
|||
|
|||
Vue.config.productionTip = false |
|||
|
|||
new Vue({ |
|||
router, |
|||
render: h => h(App) |
|||
}).$mount('#app') |
@ -0,0 +1,6 @@ |
|||
import Vue from 'vue' |
|||
import axios from "axios" |
|||
|
|||
axios.defaults.timeout = 5000 //请求超时的时间设定
|
|||
|
|||
Vue.prototype.$axios = axios |
@ -0,0 +1,6 @@ |
|||
import Vue from 'vue' |
|||
import btoa from 'btoa' |
|||
import atob from 'atob' |
|||
|
|||
Vue.prototype.$btoa = (string) => btoa(string) |
|||
Vue.prototype.$atob = (string) => atob(string) |
@ -0,0 +1,4 @@ |
|||
import Vue from 'vue' |
|||
import clipboard from 'vue-clipboard2' |
|||
|
|||
Vue.use(clipboard) |
@ -0,0 +1,20 @@ |
|||
import Vue from 'vue' |
|||
import Element from 'element-ui' |
|||
import locale from 'element-ui/lib/locale/lang/zh-CN' |
|||
// import '@/assets/css/element-ui.scss'
|
|||
// import '@/assets/css/element-element-variables.scss'
|
|||
|
|||
Vue.use(Element, { |
|||
locale, |
|||
size: 'small' |
|||
}) |
|||
|
|||
Vue.use(Element.Loading.directive); |
|||
|
|||
Vue.prototype.$loading = Element.Loading.service; |
|||
Vue.prototype.$msgbox = Element.MessageBox; |
|||
Vue.prototype.$alert = Element.MessageBox.alert; |
|||
Vue.prototype.$confirm = Element.MessageBox.confirm; |
|||
Vue.prototype.$prompt = Element.MessageBox.prompt; |
|||
Vue.prototype.$notify = Element.Notification; |
|||
Vue.prototype.$message = Element.Message; |
@ -0,0 +1,4 @@ |
|||
import Vue from 'vue' |
|||
import VueParticles from 'vue-particles' |
|||
|
|||
Vue.use(VueParticles) |
@ -0,0 +1,20 @@ |
|||
import Vue from "vue"; |
|||
import VueRouter from "vue-router"; |
|||
|
|||
Vue.use(VueRouter); |
|||
|
|||
const routes = [ |
|||
{ |
|||
path: "/", |
|||
name: "SubConverter", |
|||
component: () => import("../views/Subconverter.vue") |
|||
} |
|||
]; |
|||
|
|||
const router = new VueRouter({ |
|||
mode: "history", |
|||
base: process.env.BASE_URL, |
|||
routes |
|||
}); |
|||
|
|||
export default router; |
@ -0,0 +1,327 @@ |
|||
<template> |
|||
<div> |
|||
<el-row style="margin-top: 10px"> |
|||
<el-col> |
|||
<el-card> |
|||
<div slot="header">Subscription Converter</div> |
|||
<el-container> |
|||
<el-form |
|||
:model="form" |
|||
label-width="120px" |
|||
label-position="left" |
|||
style="width: 100%" |
|||
> |
|||
<el-form-item label="模式设置:"> |
|||
<el-radio v-model="advanced" label="1">基础模式</el-radio> |
|||
<el-radio v-model="advanced" label="2">进阶模式</el-radio> |
|||
</el-form-item> |
|||
<el-form-item label="订阅链接:"> |
|||
<el-input |
|||
v-model="form.sourceSubUrl" |
|||
type="textarea" |
|||
rows="3" |
|||
placeholder="支持订阅或ss/ssr/vmess单链接。多个链接请每行一个或用 | 分隔" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="客户端:"> |
|||
<el-select v-model="form.clientType" style="width: 100%"> |
|||
<el-option |
|||
v-for="(v, k) in options.clientTypes" |
|||
:key="k" |
|||
:label="k" |
|||
:value="v" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
|
|||
<div v-if="advanced === '2'"> |
|||
<el-form-item label="emoji:"> |
|||
<el-radio v-model="form.emoji" label="true">是</el-radio> |
|||
<el-radio v-model="form.emoji" label="false">否</el-radio> |
|||
</el-form-item> |
|||
<el-form-item label="后端地址:"> |
|||
<el-input |
|||
ref="backend" |
|||
v-model="form.customBackend" |
|||
placeholder="动动小手,(建议)自行搭建后端服务。例:http://127.0.0.1:25500?sub" |
|||
> |
|||
<el-button |
|||
slot="append" |
|||
@click="gotoGayhub" |
|||
icon="el-icon-link" |
|||
>前往项目仓库</el-button |
|||
> |
|||
</el-input> |
|||
</el-form-item> |
|||
<el-form-item label="远程配置:"> |
|||
<el-select |
|||
v-model="form.remoteConfig" |
|||
allow-create |
|||
filterable |
|||
placeholder="请选择" |
|||
style="width: 100%" |
|||
> |
|||
<el-option-group |
|||
v-for="group in options.remoteConfig" |
|||
:key="group.label" |
|||
:label="group.label" |
|||
> |
|||
<el-option |
|||
v-for="item in group.options" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
> |
|||
</el-option> |
|||
</el-option-group> |
|||
<el-button |
|||
slot="append" |
|||
@click="gotoRemoteConfig" |
|||
icon="el-icon-link" |
|||
>配置示例</el-button |
|||
> |
|||
</el-select> |
|||
</el-form-item> |
|||
<el-form-item label="IncludeRemarks:"> |
|||
<el-input |
|||
v-model="form.includeRemarks" |
|||
placeholder="节点名包含的关键字,支持正则" |
|||
/> |
|||
</el-form-item> |
|||
<el-form-item label="ExcludeRemarks:"> |
|||
<el-input |
|||
v-model="form.excludeRemarks" |
|||
placeholder="节点名不包含的关键字,支持正则" |
|||
/> |
|||
</el-form-item> |
|||
</div> |
|||
|
|||
<div style="margin-top: 50px"></div> |
|||
|
|||
<el-divider content-position="center"> |
|||
<i class="el-icon-magic-stick" /> |
|||
</el-divider> |
|||
|
|||
<el-form-item label="定制订阅:"> |
|||
<el-input class="copy-content" disabled v-model="customSubUrl"> |
|||
<el-button |
|||
slot="append" |
|||
v-clipboard:copy="customSubUrl" |
|||
v-clipboard:success="onCopy" |
|||
ref="copy-btn" |
|||
icon="el-icon-document-copy" |
|||
>复制</el-button |
|||
> |
|||
</el-input> |
|||
</el-form-item> |
|||
|
|||
<el-form-item |
|||
label-width="0px" |
|||
style="margin-top: 40px; text-align: center" |
|||
> |
|||
<el-button style="width: 120px" type="danger" @click="makeUrl" |
|||
>生成订阅链接</el-button |
|||
> |
|||
<el-button |
|||
style="width: 120px" |
|||
type="primary" |
|||
@click="clashInstall" |
|||
icon="el-icon-connection" |
|||
>一键导入Clash</el-button |
|||
> |
|||
<el-button |
|||
style="width: 120px" |
|||
type="primary" |
|||
@click="surgeInstall" |
|||
icon="el-icon-connection" |
|||
>一键导入Surge</el-button |
|||
> |
|||
</el-form-item> |
|||
</el-form> |
|||
</el-container> |
|||
</el-card> |
|||
</el-col> |
|||
</el-row> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
const remoteConfigSample = |
|||
"https://raw.githubusercontent.com/tindy2013/subconverter/master/base/example_external_config.ini"; |
|||
const gayhubRelease = "https://github.com/tindy2013/subconverter/releases"; |
|||
const defaultBackend = "https://api.wcc.best/sub?"; |
|||
|
|||
export default { |
|||
data() { |
|||
return { |
|||
advanced: "2", |
|||
|
|||
options: { |
|||
clientTypes: { |
|||
clash: "clash", |
|||
clashr: "clashr", |
|||
surge2: "surge&ver=2", |
|||
surge3: "surge&ver=3", |
|||
surge4: "surge&ver=4", |
|||
quantumult: "quan", |
|||
quantumultx: "quanx", |
|||
surfboard: "surfboard", |
|||
ss: "ss", |
|||
ssr: "ssr", |
|||
ssd: "ssd", |
|||
v2ray: "v2ray" |
|||
}, |
|||
customBaseRules: [ |
|||
"ClashBaseRule", |
|||
"SurgeBaseRule", |
|||
"SurfboardRuleBase" |
|||
], |
|||
remoteConfig: [ |
|||
{ |
|||
label: "universal", |
|||
options: [ |
|||
{ |
|||
label: "No-Urltest", |
|||
value: |
|||
"https://careywong-public-docs.oss-cn-shanghai.aliyuncs.com/subconverter/universal/no-urltest.ini" |
|||
}, |
|||
{ |
|||
label: "Urltest", |
|||
value: |
|||
"https://careywong-public-docs.oss-cn-shanghai.aliyuncs.com/subconverter/universal/urltest.ini" |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
label: "customized", |
|||
options: [ |
|||
{ |
|||
label: "Maying", |
|||
value: |
|||
"https://careywong-public-docs.oss-cn-shanghai.aliyuncs.com/subconverter/customized/maying.ini" |
|||
}, |
|||
{ |
|||
label: "Nexitally", |
|||
value: |
|||
"https://careywong-public-docs.oss-cn-shanghai.aliyuncs.com/subconverter/customized/nexitally.ini" |
|||
} |
|||
] |
|||
}, |
|||
{ |
|||
label: "Special", |
|||
options: [ |
|||
{ |
|||
label: "NeteaseUnblock", |
|||
value: |
|||
"https://careywong-public-docs.oss-cn-shanghai.aliyuncs.com/subconverter/special/netease.ini" |
|||
} |
|||
] |
|||
} |
|||
] |
|||
}, |
|||
form: { |
|||
sourceSubUrl: "", |
|||
clientType: "", |
|||
emoji: "true", |
|||
customBackend: "", |
|||
remoteConfig: "", |
|||
excludeRemarks: "", |
|||
includeRemarks: "", |
|||
ClashBaseRule: "", |
|||
SurgeBaseRule: "", |
|||
SurfboardRuleBase: "", |
|||
rename_node: "", |
|||
ruleset: "" |
|||
}, |
|||
|
|||
loading: false, |
|||
customSubUrl: "" |
|||
}; |
|||
}, |
|||
created() { |
|||
document.title = "Subscription Converter"; |
|||
}, |
|||
mounted() { |
|||
this.form.clientType = "clashr"; |
|||
}, |
|||
methods: { |
|||
onCopy() { |
|||
this.$message.success("Copied!"); |
|||
}, |
|||
gotoGayhub() { |
|||
window.open(gayhubRelease); |
|||
}, |
|||
gotoRemoteConfig() { |
|||
window.open(remoteConfigSample); |
|||
}, |
|||
createFilter(queryString) { |
|||
return restaurant => { |
|||
return ( |
|||
restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === |
|||
0 |
|||
); |
|||
}; |
|||
}, |
|||
clashInstall() { |
|||
if (this.customSubUrl === "") { |
|||
this.$message.error("请先填写必填项,生成订阅链接"); |
|||
return false; |
|||
} |
|||
|
|||
const url = "clash://install-config?url="; |
|||
window.open(url + encodeURIComponent(this.customSubUrl)); |
|||
}, |
|||
surgeInstall() { |
|||
if (this.customSubUrl === "") { |
|||
this.$message.error("请先填写必填项,生成订阅链接"); |
|||
return false; |
|||
} |
|||
|
|||
const url = "surge://install-config?url="; |
|||
window.open(url + this.customSubUrl); |
|||
}, |
|||
makeUrl() { |
|||
if (this.form.sourceSubUrl === "" || this.form.clientType === "") { |
|||
this.$message.error("订阅链接与客户端为必填项"); |
|||
return false; |
|||
} |
|||
|
|||
let backend = |
|||
this.form.customBackend === "" |
|||
? defaultBackend |
|||
: this.form.customBackend; |
|||
|
|||
let sourceSub = this.form.sourceSubUrl; |
|||
sourceSub = sourceSub.replace(/[\n|\r|\n\r]/g, "|"); |
|||
|
|||
this.customSubUrl = |
|||
backend + |
|||
"target=" + |
|||
this.form.clientType + |
|||
"&url=" + |
|||
encodeURIComponent(sourceSub); |
|||
|
|||
if (this.advanced === "2") { |
|||
if (this.form.remoteConfig !== "") { |
|||
this.customSubUrl += |
|||
"&config=" + encodeURIComponent(this.form.remoteConfig); |
|||
} |
|||
if (this.form.emoji === "false") { |
|||
this.customSubUrl += "&emoji=" + this.form.emoji; |
|||
} |
|||
if (this.form.excludeRemarks !== "") { |
|||
this.customSubUrl += |
|||
"&exclude=" + encodeURIComponent(this.form.excludeRemarks); |
|||
} |
|||
if (this.form.includeRemarks !== "") { |
|||
this.customSubUrl += |
|||
"&include=" + encodeURIComponent(this.form.includeRemarks); |
|||
} |
|||
} |
|||
|
|||
this.$copyText(this.customSubUrl); |
|||
this.$message.success("定制订阅已复制到剪切板"); |
|||
} |
|||
} |
|||
}; |
|||
</script> |
@ -0,0 +1,9 @@ |
|||
module.exports = { |
|||
css: { |
|||
loaderOptions: { |
|||
less: { |
|||
javascriptEnabled: true |
|||
} |
|||
} |
|||
} |
|||
}; |
File diff suppressed because it is too large
Loading…
Reference in new issue