Feat: [chrome]:完成页面向拓展传递数据

This commit is contained in:
fanxb 2019-11-26 00:02:30 +08:00
parent 8adba3bef9
commit c695cf1d2a
15 changed files with 188 additions and 57 deletions

View File

@ -0,0 +1,8 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true

View File

@ -21,6 +21,7 @@
}, },
"dependencies": { "dependencies": {
"axios": "^0.19.0", "axios": "^0.19.0",
"element-ui": "^2.12.0",
"vue": "^2.6.10", "vue": "^2.6.10",
"vue-router": "^3.0.1", "vue-router": "^3.0.1",
"vuex": "^3.0.1", "vuex": "^3.0.1",

View File

@ -12,20 +12,20 @@ const extractExtensionData = () => {
return { return {
name: extPackageJson.name, name: extPackageJson.name,
version: extPackageJson.version version: extPackageJson.version,
} };
}; };
const makeDestZipDirIfNotExists = () => { const makeDestZipDirIfNotExists = () => {
if(!fs.existsSync(DEST_ZIP_DIR)) { if (!fs.existsSync(DEST_ZIP_DIR)) {
fs.mkdirSync(DEST_ZIP_DIR); fs.mkdirSync(DEST_ZIP_DIR);
} }
} };
const buildZip = (src, dist, zipFilename) => { const buildZip = (src, dist, zipFilename) => {
console.info(`Building ${zipFilename}...`); console.info(`Building ${zipFilename}...`);
const archive = archiver('zip', { zlib: { level: 9 }}); const archive = archiver('zip', { zlib: { level: 9 } });
const stream = fs.createWriteStream(path.join(dist, zipFilename)); const stream = fs.createWriteStream(path.join(dist, zipFilename));
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -40,7 +40,7 @@ const buildZip = (src, dist, zipFilename) => {
}; };
const main = () => { const main = () => {
const {name, version} = extractExtensionData(); const { name, version } = extractExtensionData();
const zipFilename = `${name}-v${version}.zip`; const zipFilename = `${name}-v${version}.zip`;
makeDestZipDirIfNotExists(); makeDestZipDirIfNotExists();

View File

@ -1,4 +1,15 @@
import store from './store'; import store from './store';
global.browser = require('webextension-polyfill'); global.browser = require('webextension-polyfill');
alert(`Hello ${store.getters.foo}!`); chrome.extension.onConnect.addListener(port => {
console.log(port);
port.onMessage.addListener(msg => {
switch (msg.type) {
case 'sendToken':
localStorage.setItem('token', msg.data);
break;
default:
console.error('未知的数据', msg);
}
});
});

View File

@ -19,5 +19,11 @@
"options_ui": { "options_ui": {
"page": "options/options.html", "page": "options/options.html",
"chrome_style": true "chrome_style": true
} },
"content_scripts": [{
"matches": ["http://west.tapme.top/*", "http://bookmark.tapme.top/*","http://localhost:3000/*"],
"js": ["popup/static/sso.js"]
}
]
} }

View File

@ -1,12 +1,12 @@
<template> <template>
<div> <div>
<p>Hello world!</p> <p>Hello world!这是选项页</p>
</div> </div>
</template> </template>
<script> <script>
export default { export default {
name: "App", name: 'App',
}; };
</script> </script>

View File

@ -1,15 +1,20 @@
<template> <template>
<div> <div class="app">
<router-view></router-view> <router-view></router-view>
</div> </div>
</template> </template>
<script> <script>
export default { export default {
data () { data() {
return {} return {};
} },
} };
</script> </script>
<style>
.app {
width: 500px;
height: 500px;
}
</style>

View File

@ -1,15 +1,48 @@
import Vue from 'vue' import Vue from 'vue';
import App from './App' import App from './App';
import store from '../store' import store from '../store';
import router from './router' import router from './router';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import axios from 'axios';
global.browser = require('webextension-polyfill') global.browser = require('webextension-polyfill');
Vue.prototype.$browser = global.browser Vue.prototype.$browser = global.browser;
Vue.use(ElementUI);
/* eslint-disable no-new */ /* eslint-disable no-new */
new Vue({ window.vueInstance = new Vue({
el: '#app', el: '#app',
store, store,
router, router,
render: h => h(App) render: h => h(App),
}) });
/**
* 配置axios
*/
axios.defaults.timeout = 15000;
/**
* 请求拦截器
*/
axios.interceptors.request.use(
function(config) {
console.log(config);
return config;
},
function(error) {
console.error(error);
return Promise.reject(error);
}
);
axios.interceptors.response.use(
res => {
console.log(res);
return res.data;
},
error => {
return Promise.reject(error);
}
);

View File

@ -1,9 +1,9 @@
import Vue from 'vue' import Vue from 'vue';
import VueRouter from 'vue-router' import VueRouter from 'vue-router';
import routes from './routes' import routes from './routes';
Vue.use(VueRouter) Vue.use(VueRouter);
export default new VueRouter({ export default new VueRouter({
routes routes,
}) });

View File

@ -1,17 +1,20 @@
<template> <template>
<p>Hello world!</p> <div class="main">
<p>Hello world!</p>
</div>
</template> </template>
<script> <script>
export default { export default {
data () { data() {
return {} return {};
} },
} };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
p { .main {
font-size: 20px; width: 50%;
height: 50%;
} }
</style> </style>

View File

@ -0,0 +1,38 @@
<template>
<div class="main">您还未登陆授权<el-button type="primary" @click="go">前往授权页面</el-button></div>
</template>
<script>
export default {
name: 'login',
data() {
return {
// href: 'http://west.tapme.top:8083',
href: 'http://localhost:3000/userSpace/ssoAuth',
};
},
mounted() {
this.checkToken();
},
methods: {
go() {
window.open(this.href);
},
// token
checkToken() {
console.log('检测token是否获取到了');
let token = localStorage.getItem('token');
if (token == null || token.length === 0) {
setTimeout(this.checkToken.bind(this), 1000);
} else {
this.$router.replace('/');
}
},
},
};
</script>
<style scoped>
.main {
}
</style>

View File

@ -1,8 +1,13 @@
import PageIndex from './pages/Index' import PageIndex from './pages/Index';
import Login from './pages/public/Login';
export default [ export default [
{ {
path: '/', path: '/',
component: PageIndex component: PageIndex,
} },
] {
path: '/public/login',
component: Login,
},
];

View File

@ -0,0 +1,20 @@
/**
* web页面植入脚本用于授权等一系列操作
*/
console.log('注入了页面');
var port = chrome.extension.connect({ name: 'data' });
window.addEventListener('message', event => {
if (event.data.type === undefined) {
return;
}
console.log('接受到消息', event.data);
switch (event.data.type) {
case 'sendToken':
port.postMessage(event.data);
break;
default:
console.error('未知的事件', event);
}
});

View File

@ -1,17 +1,17 @@
import Vue from 'vue' import Vue from 'vue';
import Vuex from 'vuex' import Vuex from 'vuex';
import * as getters from './getters' import * as getters from './getters';
import mutations from './mutations' import mutations from './mutations';
import * as actions from './actions' import * as actions from './actions';
Vue.use(Vuex) Vue.use(Vuex);
export default new Vuex.Store({ export default new Vuex.Store({
state: { state: {
foo: 'bar' foo: 'bar',
}, },
getters, getters,
mutations, mutations,
actions actions,
}) });

View File

@ -10,7 +10,7 @@ const config = {
mode: process.env.NODE_ENV, mode: process.env.NODE_ENV,
context: __dirname + '/src', context: __dirname + '/src',
entry: { entry: {
'background': './background.js', background: './background.js',
'popup/popup': './popup/popup.js', 'popup/popup': './popup/popup.js',
'options/options': './options/options.js', 'options/options': './options/options.js',
}, },
@ -74,12 +74,13 @@ const config = {
}), }),
new CopyWebpackPlugin([ new CopyWebpackPlugin([
{ from: 'icons', to: 'icons', ignore: ['icon.xcf'] }, { from: 'icons', to: 'icons', ignore: ['icon.xcf'] },
{ from: 'static', to: 'popup/static' },
{ from: 'popup/popup.html', to: 'popup/popup.html', transform: transformHtml }, { from: 'popup/popup.html', to: 'popup/popup.html', transform: transformHtml },
{ from: 'options/options.html', to: 'options/options.html', transform: transformHtml }, { from: 'options/options.html', to: 'options/options.html', transform: transformHtml },
{ {
from: 'manifest.json', from: 'manifest.json',
to: 'manifest.json', to: 'manifest.json',
transform: (content) => { transform: content => {
const jsonContent = JSON.parse(content); const jsonContent = JSON.parse(content);
jsonContent.version = version; jsonContent.version = version;